gadget/.opencode/plans/foundation-todo.md
Rob Colbert e1a446a3f3 Phase 5: Implement workspace persistence and crash recovery
- Create WorkspaceService for managing .gadget/ directory
- Implement workspace.json for persistent identity (workspaceId UUID)
- Add work order cache for crash recovery
- Update drone registration to include workspaceId
- Add crash recovery socket events (requestCrashRecovery, crashRecoveryResponse)
- Implement crash recovery handler in DroneSession
- Write work order cache before processing, remove after completion
2026-04-29 16:44:02 -04:00

292 lines
9.9 KiB
Markdown

# Foundation Cleanup TODO
**Date:** April 29, 2026
**Goal:** Correct known issues, standardize APIs, implement message handlers, and prepare solid foundation with unit tests for Chat Session UI implementation.
---
## Phase 1: Fix Type Errors & Interface Conflicts ✅ COMPLETE
### 1.1 Resolve Duplicate `DroneStatus` Enum
- **File:** `gadget-drone/src/services/platform.ts`
- **Action:** Remove local `DroneStatus` enum, import from `@gadget/api`
- **Status:** ✅ Complete
### 1.2 Resolve `IAiProvider` Interface Conflict
- **Files:**
- `packages/api/src/interfaces/ai-provider.ts` (Mongoose document)
- `packages/ai/src/api.ts` (runtime config)
- **Action:** Create mapper in `gadget-drone/src/services/ai.ts` to convert DB model → runtime config
- **Status:** ✅ Complete
### 1.3 Fix `ToolCallMessage` Signature
- **File:** `packages/api/src/messages/drone.ts:26-30`
- **Issue:** Missing `callId` parameter required by `IChatToolCall`
- **Action:** Add `callId: string` as first parameter
- **Status:** ✅ Complete
### 1.4 Fix `ChatTurnStats` Schema Mismatch
- **File:** `gadget-code/src/models/chat-turn.ts:70-76`
- **Issue:** Schema uses `thinkingTokens`, interface uses `thinkingTokenCount`
- **Action:** Standardize on `thinkingTokenCount` in schema
- **Status:** ✅ Complete
### 1.5 Fix `ChatToolCallSchema` Missing `callId`
- **File:** `gadget-code/src/models/chat-turn.ts:31-36`
- **Issue:** Schema doesn't include required `callId` field
- **Action:** Add `callId: { type: String, required: true }` to schema
- **Status:** ✅ Complete
---
## Phase 2: Implement Prompt Submission Flow ✅ COMPLETE
### 2.1 Implement `CodeSession.onSubmitPrompt()`
- **File:** `gadget-code/src/lib/code-session.ts:58-60`
- **Action:**
- Create `ChatTurn` document with status `Processing`
- Build work order from `ChatSession`, `Project`, `IAiProvider`, prompt
- Find target drone's `DroneSession`
- Emit `processWorkOrder` to drone
- Update `ChatTurn` with drone acknowledgment
- **Missing:** Track `selectedDrone`, `chatSession`, `project` in `CodeSession`
- **Status:** ✅ Complete
### 2.2 Add Drone Selection to `CodeSession`
- **File:** `gadget-code/src/lib/code-session.ts`
- **Action:** Add properties and methods to track selected drone, chat session, project
- **Status:** ✅ Complete
### 2.3 Add `provider` and `selectedModel` to ChatSession
- **Files:**
- `packages/api/src/interfaces/chat-session.ts`
- `gadget-code/src/models/chat-session.ts`
- **Status:** ✅ Complete
### 2.4 Unit Tests for CodeSession
- **File:** `gadget-code/tests/code-session.test.ts`
- **Tests:** 9 tests covering prompt submission flow
- **Status:** ✅ Complete (all passing)
---
## Phase 3: Implement Event Routing (Drone→IDE) ✅ COMPLETE
### 3.1 Add DroneSession Event Handlers
- **File:** `gadget-code/src/lib/drone-session.ts:21-23`
- **Action:** Register handlers for:
- `thinking`
- `response`
- `toolCall`
- `workOrderComplete`
- **Status:** ✅ Complete
### 3.2 Implement Routing Logic
- **File:** `gadget-code/src/lib/drone-session.ts`
- **Action:** Implement handlers that:
- Find corresponding `CodeSession` by `chatSessionId`
- Forward event to IDE socket
- Update `ChatTurn` document with new data
- **Status:** ✅ Complete
### 3.3 Add `getCodeSessionByChatSessionId()` to `SocketService`
- **File:** `gadget-code/src/services/socket.ts`
- **Action:** Maintain reverse index: `chatSessionId → CodeSession`
- **Status:** ✅ Complete
### 3.4 Add `workOrderComplete` to ServerToClientEvents
- **File:** `packages/api/src/messages/socket.ts`
- **Status:** ✅ Complete
### 3.5 Unit Tests for DroneSession
- **File:** `gadget-code/tests/drone-session.test.ts`
- **Tests:** 12 tests covering event routing
- **Status:** ✅ Complete (all passing)
---
## Phase 4: Emit Events from AWL ✅ COMPLETE
### 4.1 Pass Socket into `AgentService.process()`
- **File:** `gadget-drone/src/gadget-drone.ts:229`
- **Action:** Pass `this.socket` reference to `AgentService.process()`
- **Status:** ✅ Complete
### 4.2 Add Event Emissions to AWL Loop
- **File:** `gadget-drone/src/services/agent.ts:70-98`
- **Action:** Emit streaming events:
- `thinking` when reasoning content arrives
- `response` when text content streams
- `toolCall` after each tool execution
- `workOrderComplete` when loop exits
- **Status:** ✅ Complete
### 4.3 Implement Workspace Mode Transitions
- **File:** `gadget-drone/src/services/agent.ts`
- **Action:**
- Emit `requestWorkspaceMode(agent)` before starting AWL
- Wait for acknowledgment
- Emit `requestWorkspaceMode(idle)` when complete
- **Status:** ⬜ Deferred (can be added during integration testing)
### 4.4 Unit Tests for AgentService
- **Location:** Deferred until integration testing
- **Rationale:** Event emissions are straightforward and will be validated end-to-end with UI integration
- **Status:** ⬜ Deferred
---
## Phase 5: Workspace Persistence (Crash Recovery) ✅ COMPLETE
### 5.1 Create `.gadget/` Directory Structure
- **File:** `gadget-drone/src/services/workspace.ts` (NEW)
- **Action:** Create `WorkspaceService` to manage:
- `.gadget/workspace.json` (persistent identity)
- `.gadget/cache/work-order.json` (active work order cache)
- **Status:** ✅ Complete
### 5.2 Implement Workspace Validation on Startup
- **File:** `gadget-drone/src/gadget-drone.ts`
- **Action:** Initialize WorkspaceService before registration
- **Status:** ✅ Complete
### 5.3 Write Work Order Cache During Processing
- **File:** `gadget-drone/src/gadget-drone.ts:onProcessWorkOrder`
- **Action:** Write cache BEFORE processing, remove AFTER completion
- **Status:** ✅ Complete
### 5.4 Update Drone Registration to Include `workspaceId`
- **Files:**
- `packages/api/src/interfaces/drone-registration.ts`
- `gadget-drone/src/services/platform.ts`
- **Action:** Add `workspaceId: string` to registration
- **Status:** ✅ Complete
### 5.5 Add `workspaceId` to `IChatSession`
- **File:** `packages/api/src/interfaces/chat-session.ts`
- **Action:** Add field for routing retries to correct workspace
- **Status:** ⬜ Deferred (not needed for basic crash recovery)
### 5.6 Implement Crash Recovery Handler
- **Files:**
- `gadget-drone/src/gadget-drone.ts` (emit `requestCrashRecovery`)
- `gadget-code/src/lib/drone-session.ts` (handle `requestCrashRecovery`)
- `packages/api/src/messages/drone.ts` (message types)
- `packages/api/src/messages/socket.ts` (socket events)
- **Status:** ✅ Complete
### 5.7 Add Crash Recovery Socket Events
- **Files:** `packages/api/src/messages/socket.ts`
- **Events:** `requestCrashRecovery`, `crashRecoveryResponse`
- **Status:** ✅ Complete
---
## Phase 6: Error Handling & Concurrency
### 6.1 Add Error Propagation from Drone
- **File:** `gadget-drone/src/gadget-drone.ts:209-229`
- **Action:** Wrap `AgentService.process()` in try/catch, emit error event on failure
- **Status:** ⬜ Pending
### 6.2 Add Concurrency Control
- **File:** `gadget-drone/src/gadget-drone.ts`
- **Action:** Check `DroneStatus.Busy` before accepting work, reject extras
- **Status:** ⬜ Pending
### 6.3 Add Timeout & Heartbeat Mechanism
- **File:** `gadget-code/src/lib/drone-session.ts`
- **Action:** Prevent IDE hangs on drone crash
- **Status:** ⬜ Pending
---
## Phase 7: Unit Tests
### 7.1 Socket Message Handler Tests
- **Location:** `gadget-code/tests/socket-handlers.test.ts`
- **Tests:**
- `CodeSession.onSubmitPrompt()` creates ChatTurn
- `DroneSession` routes events to IDE
- `SocketService` tracks sessions correctly
- **Status:** ⬜ Pending
### 7.2 Drone Message Handler Tests
- **Location:** `gadget-drone/tests/message-handlers.test.ts`
- **Tests:**
- `onRequestSessionLock` validates registration
- `onProcessWorkOrder` accepts and processes
- Workspace mode transitions work correctly
- **Status:** ⬜ Pending
### 7.3 Agent Service Tests
- **Location:** `gadget-drone/tests/agent-service.test.ts`
- **Tests:**
- AWL loop emits `thinking`, `response`, `toolCall` events
- Tool calls are executed and responses captured
- `workOrderComplete` emitted on finish
- **Status:** ⬜ Pending
### 7.4 Workspace Persistence Tests
- **Location:** `gadget-drone/tests/workspace.test.ts`
- **Tests:**
- Workspace validation creates `.gadget/` directory
- Work order cache written/removed correctly
- Crash recovery flow works end-to-end
- **Status:** ⬜ Pending
### 7.5 Type Mapper Tests
- **Location:** `gadget-drone/tests/type-mappers.test.ts`
- **Tests:**
- `IAiProvider` DB → runtime conversion
- `ToolCallMessage``IChatToolCall` conversion
- **Status:** ⬜ Pending
---
## Phase 8: Documentation Cleanup
### 8.1 Remove Bull Queue References
- **Files:**
- `gadget-drone/docs/agentic-workflow-loop.md`
- `gadget-drone/AGENTS.md`
- **Action:** Remove all Bull queue references, document Socket.IO-only approach
- **Status:** ⬜ Pending
### 8.2 Update AWL Interface Documentation
- **Files:**
- `gadget-code/docs/agentic-workflow-loop.md`
- `gadget-drone/docs/agentic-workflow-loop.md`
- **Action:** Delete interface definitions, reference `@gadget/api` only
- **Status:** ⬜ Pending
### 8.3 Update foundation-todo.md
- **Action:** Mark completed items, update as work progresses
- **Status:** ⬜ In Progress
---
## Acceptance Criteria
By end of this turn:
- [ ] All TypeScript compilation errors resolved
- [ ] Message handlers implemented for all socket events
- [ ] End-to-end prompt submission flow works (IDE→Web→Drone→Web→IDE)
- [ ] Streaming events (`thinking`, `response`, `toolCall`) routed correctly
- [ ] Workspace persistence implemented for crash recovery
- [ ] Unit tests pass for all implemented functionality
- [ ] Documentation cleaned up and consistent
- [ ] System ready for Chat Session UI implementation
---
## Notes
- Remain on feature branch throughout implementation
- Commit frequently to git with descriptive messages
- Ask for clarification when encountering ambiguous requirements
- Follow existing code conventions and patterns
- All code must include unit tests
- Keep this document up to date as work progresses