João Salavisa 159f98efe6 feat(web): File browser with syntax-highlighted viewer (#13)
* feat(web): add file browser with syntax-highlighted viewer

- Add file browser component in right panel to browse workspace files
- Open files in left panel tabs alongside Notes/Changes/Chat
- Color-coded dots for file types (TS, JS, Go, Python, etc.)
- Visual separator between main tabs and file tabs
- Folders sorted to top in file tree view
- LRU eviction for max 4 open file tabs
- Backend handlers for workspace file tree and content via WebSocket

* fix(web): refresh file tree on filesystem changes via fsnotify

- Subscribe to file change notifications from agentctl's fsnotify watcher
- Backend lifecycle manager now connects to file changes stream
- Publishes FileChangeNotified events to event bus
- WebSocket broadcasts workspace.file.changes to task subscribers
- Frontend file browser refreshes tree when changes detected

* perf(agentctl): use fsnotify instead of polling for git status

- Replace 2-second polling with fsnotify-triggered updates
- Add debouncing (300ms) to batch rapid file changes
- Git status updates now triggered by actual filesystem changes
- More efficient and responsive than periodic polling

* refactor(agentctl): consolidate fs events into single debounced trigger

- Single fsChangeTrigger channel for all filesystem events
- After 300ms debounce: update git status, files, and notify subscribers
- Removed per-file notifications in favor of single 'refresh' event
- Simpler and more efficient than separate triggers

* refactor(agentctl): simplify file API - use HTTP for tree/content

- Remove unused filesConn, fileTreeConn, fileContentConn from Client struct
- Convert RequestFileTree and RequestFileContent from WebSocket to HTTP GET
- Remove StreamFiles and CloseFilesStream (redundant with file changes stream)
- Keep only fileChangesConn for the debounced refresh notification

HTTP is simpler than WebSocket for request/response patterns.

* feat(web): switch to CodeMirror for file viewer

- Replace react-syntax-highlighter with @uiw/react-codemirror
- Add language extensions for JS/TS, Python, Go, Rust, Java, C++, CSS, HTML, JSON, Markdown, YAML
- Use VS Code dark theme for consistent look
- Enable code folding and read-only mode
- Better performance and features than syntax highlighter

* refactor: consolidate duplicated types and extract shared constants

- Re-export file types from process package in agentctl/client.go instead of duplicating
- Move OpenFileTab type to lib/types/backend.ts (shared by file-browser and page-client)
- Extract FILE_EXTENSION_COLORS constant for file type color indicators
- Remove console.log statement and unused imports in file-browser.tsx
- Add 'refresh' operation to FileChangeNotificationPayload type

* refactor(agentctl): move Close() method from acp.go to client.go

Close() is a general client cleanup method that closes all streams
(ACP, permissions, git status, file changes). It belongs in client.go
since acp.go should only contain ACP-specific communication logic.

* fix(web): remove unused cn import in file-browser

* refactor(agentctl): consolidate duplicated types into process/types.go

- Create process/types.go with all workspace-related types
- Remove duplicate GitStatusUpdate, FileInfo from workspace_tracker.go
- Remove duplicate GitStatusUpdate, FileInfo from api/workspace.go
- Re-export all types from agent/agentctl/client.go for convenience

Types are now defined once and imported everywhere.

* chore: remove package-lock.json, add to .gitignore

Project uses pnpm (pnpm-lock.yaml), not npm.

* fix(orchestrator): probe agent before returning stale execution state

When checking task.execution, the backend now probes the actual agent:
- For tracked instances: health check via agentctl
- For Docker: verify container is running

If the agent is not running but DB says 'running', the session is
marked as stopped and false is returned. This fixes the UI showing
agents as running after backend restart when they're actually dead.

Changes:
- Add IsAgentRunningForTask to AgentManagerClient interface
- Add IsContainerRunning to docker client
- Update GetExecution to verify agent is actually running
- Clean up stale sessions in database when agent not found

* fix(orchestrator): use agentctl status to verify agent is running

Simplified approach - probe agentctl's /api/v1/status endpoint to check
if agent process is running. Same check for both Docker and standalone.

- Add IsAgentRunning() helper to StatusResponse
- Simplify IsAgentRunningForTask to just use agentctl.GetStatus()

* fix(orchestrator): also verify agent running for in-memory executions

The previous fix only checked agent status when loading from DB. But if
an execution is cached in memory and the agent process stops (while
agentctl stays running), the stale state was still returned.

Now both paths verify the agent is actually running by probing agentctl.
If agent stopped, clean up in-memory state and update DB session.

* chore(web): remove unused react-syntax-highlighter

Switched to CodeMirror for code viewing, no longer needed.

* fix(tests): add IsAgentRunningForTask to mock agent managers

Add the new interface method to test mocks:
- mockAgentManager in scheduler_test.go
- SimulatedAgentManagerClient in orchestrator_test.go

---------

Co-authored-by: Kandev Agent <kandev@example.com>
2026-01-14 01:24:05 +00:00
2026-01-13 00:45:10 +00:00
2026-01-13 00:45:10 +00:00
2026-01-13 00:40:23 +00:00

Kandev - Kanban Board with AI Agent Orchestration

A Kanban board system that integrates AI agent orchestration capabilities with real-time Agent Communication Protocol (ACP) streaming, allowing tasks to be automatically executed by AI agents running in isolated Docker containers.

Overview

Kandev combines traditional Kanban task management with automated AI agent execution and real-time feedback streaming. Users create tasks on a Kanban board, and when configured with an AI agent type, the system automatically launches Docker containers to execute those tasks against specified code repositories. Real-time progress, logs, and results are streamed from agents to the frontend via WebSocket connections.

Key Features

  • Kanban Board Management: Create and manage tasks across multiple boards with columns
  • AI Agent Orchestration: Launch AI agents (Augment Agent) to execute tasks
  • Real-Time ACP Streaming: Live progress updates, logs, and results streamed from agents
  • Session Resumption: Agents can resume previous conversations using session IDs
  • Docker Isolation: Each agent runs in an isolated Docker container with resource limits
  • Repository Integration: Agents can work on code repositories with host credentials
  • Host Credential Mounting: Secure read-only mounting of SSH keys and Git credentials
  • SQLite Persistence: Lightweight file-based database for task and board storage
  • Local Deployment: Designed for client machines with minimal dependencies

Architecture

The system runs as a unified Go binary that includes:

  • Task Service: Manages tasks, boards, and columns with SQLite persistence
  • Agent Manager: Manages Docker container lifecycle and ACP message streaming
  • Orchestrator: Coordinates agent launches and monitors execution
  • WebSocket API: Real-time bidirectional communication for all operations (Port 8080)

Agent Communication Protocol (ACP)

ACP is a JSON-based streaming protocol that enables real-time communication between AI agents and the backend:

Agent Container (stdout) → Agent Manager → Event Bus → API

Message Types: progress, log, result, error, status, heartbeat

See docs/ARCHITECTURE.md for detailed architecture documentation.

Supported Agent Types

  1. Augment Agent (augment-agent)
    • Uses Auggie CLI for code analysis, generation, debugging, refactoring
    • Native ACP support via stdout JSON streaming
    • Session resumption for multi-turn conversations

Technology Stack

  • Backend: Go 1.21+
  • Database: SQLite (with WAL mode)
  • Container Runtime: Docker
  • Web Framework: Gin
  • Logging: Zap (structured logging)
  • Deployment: Single binary for client machines

Quick Start

Prerequisites

  • Go 1.21 or higher
  • Docker
  • Augment CLI credentials (~/.augment/session.json)

Build and Run

cd apps/backend

# Build the binary
make build

# Run the server (creates kandev.db in current directory)
./bin/kandev

# Or specify a custom database path
KANDEV_DB_PATH=/path/to/kandev.db ./bin/kandev

WebSocket API Usage

Connection: ws://localhost:8080/ws

Message Envelope

{
  "id": "correlation-uuid",
  "type": "request|response|notification|error",
  "action": "action.name",
  "payload": {},
  "timestamp": "2026-01-10T10:30:00Z"
}

Key Message Actions

  • board.create - Create board
  • board.list - List boards
  • column.create - Create column
  • task.create - Create task
  • agent.launch - Launch agent
  • agent.status - Get agent status
  • orchestrator.start - Start task execution

Example Usage (JavaScript)

const ws = new WebSocket('ws://localhost:8080/ws');

// Create a board
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'board.create',
  payload: { name: 'My Project', description: 'Project tasks' }
}));

// Create a task
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'task.create',
  payload: {
    board_id: '{board_id}',
    column_id: '{column_id}',
    title: 'Fix login bug',
    description: 'Users cannot login'
  }
}));

// Launch an agent
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'agent.launch',
  payload: {
    task_id: '{task_id}',
    agent_type: 'augment-agent',
    workspace_path: '/path/to/project',
    env: {
      AUGMENT_SESSION_AUTH: '...',
      TASK_DESCRIPTION: 'What is 2+2?'
    }
  }
}));

// Handle responses and notifications
ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === 'response') {
    console.log('Response:', msg.payload);
  } else if (msg.type === 'notification') {
    // Real-time updates: acp.progress, acp.log, task.updated, etc.
    console.log('Notification:', msg.action, msg.payload);
  }
};

See apps/backend/NEXT_STEPS.md for detailed API reference and next steps.

Project Structure

kandev/
├── apps/
│   ├── backend/              # Go backend services
│   │   ├── cmd/kandev/       # Unified binary entry point
│   │   ├── internal/
│   │   │   ├── agent/        # Agent manager (docker, lifecycle, registry, api)
│   │   │   ├── task/         # Task service (models, repository, service, api)
│   │   │   ├── orchestrator/ # Orchestrator service
│   │   │   ├── events/       # In-memory event bus
│   │   │   └── common/       # Shared utilities (logger, config)
│   │   ├── pkg/acp/          # ACP protocol types
│   │   ├── dockerfiles/      # Agent container Dockerfiles
│   │   └── Makefile
│   └── web/                  # Frontend application
├── docs/                     # Architecture and planning docs
├── migrations/               # Database migrations (future)
├── deployments/              # Deployment configs
└── scripts/                  # Utility scripts (including e2e-test.sh)

Configuration

Environment Variable Default Description
KANDEV_DB_PATH ./kandev.db SQLite database file path
PORT 8080 HTTP server port

Development

cd apps/backend

# Build
make build

# Run tests
make test

# Format code
go fmt ./...

# Lint
go vet ./...

Pre-commit Hooks

We use pre-commit to run the backend tests, web tests, and web lint before commits.

Install

# Install pre-commit (https://pre-commit.com/#install)
pipx install pre-commit

# Install git hooks
pre-commit install

Run Manually

# Run all hooks once
pre-commit run --all-files

Hooks Config

The hooks are defined in .pre-commit-config.yaml and run these Makefile targets:

  • make test-backend
  • make test-web
  • make lint-web

Project Status

✅ Core Features Working

  • SQLite persistence for boards, columns, and tasks
  • Agent lifecycle management with Docker
  • ACP message streaming from containers
  • Session resumption for multi-turn agent conversations
  • WebSocket-first API for all operations
  • Real-time bidirectional communication

🚧 In Progress

  • Authentication and authorization
  • Frontend UI

See apps/backend/NEXT_STEPS.md for the complete roadmap.

License

[To be determined]

Acknowledgments

Built with Go and inspired by modern DevOps practices and AI-assisted development workflows.

S
Description
Upstream mirror of https://github.com/kdlbs/kandev (main). Internal development and testing.
Readme 371 MiB
Languages
Go 58.3%
TypeScript 37.6%
HTML 1.9%
JavaScript 0.8%
Python 0.7%
Other 0.5%