3.6 KiB
3.6 KiB
id, title, status, wave, depends_on, plan, spec
| id | title | status | wave | depends_on | plan | spec | |
|---|---|---|---|---|---|---|---|
| 02-parse-correlate-cursor-task | Parse and correlate cursor/task onto the subagent payload | done | 2 |
|
plan.md | ../../specs/agents/cursor-subagent-metadata.md |
Task 02: Parse and correlate cursor/task onto the subagent payload
Parse cursor/task, correlate it to the standard subagent tool_call by
toolCallId, and merge its metadata (description, prompt, model,
agentId) onto the existing SubagentTaskPayload. Also map the completion
rawOutput.isBackground onto IsAsync.
Acceptance
- A subagent
tool_callplus a matchingcursor/task(in either arrival order) produces oneSubagentTaskPayloadcarrying Cursor's description, prompt, model, and agent id. - An object-shaped
subagentTypeis ignored (never coerced to the stringSubagentType); missing fields leave their targets zero-valued. - An already-set field is not blanked by a later empty Cursor value.
- A
cursor/taskwith no matchingtool_callis dropped at session teardown. - Completion
rawOutput.isBackground:truesetsIsAsync;false/absent does not.
Verification
cd apps/backend && go test ./internal/agentctl/server/adapter/transport/acp/...
Files likely touched
apps/backend/internal/agentctl/server/adapter/transport/acp/dialect_cursor.go(new) — parse params,applyCursorTaskMeta.apps/backend/internal/agentctl/server/adapter/transport/acp/adapter_cursor.go(new) — store pending Cursor metadata, merge it in either arrival order, and clear it on teardown.apps/backend/internal/agentctl/server/adapter/transport/acp/adapter.go— set theWithCursorTaskHandlercallback; per-sessionmap[toolCallId]cursorTaskMeta; clear on teardown.apps/backend/internal/agentctl/server/adapter/transport/acp/adapter_tools.go— merge pending metadata onto the first matchingtool_callpayload.apps/backend/internal/agentctl/server/adapter/transport/acp/adapter_session.go— clear unmatched pending metadata on session reset/teardown.apps/backend/internal/agentctl/server/adapter/transport/acp/subagent.go— extendcursorSubagentResultto readisBackground→IsAsync.apps/backend/internal/agentctl/server/adapter/transport/acp/dialect_cursor_test.go(new)apps/backend/internal/agentctl/server/adapter/transport/acp/subagent_test.go— isBackground + correlation cases.
Dependencies
Task 01 (needs the CursorTaskHandler seam).
Parallelism
sequential.
Inputs
- Spec: "API surface" (exact param shape), "Failure modes", "Scenarios".
- Plan: "Area 2", "Area 3".
- Code refs:
subagent.go:224,349,371(extractSubagentResult,cursorSubagentResult,applySubagentResult);tool_payload.goSubagentTaskPayload;adapter.go:449connection wiring. - Wire fixture:
acp-debug/cursor-acp-linger-20260820-145213.jsonl.
Output contract
Summary, files changed, tests run + counts, blockers, risks; update this task's
status and plan.md Wave 2 checkbox and Verification Results.
Results
- Added defensive Cursor param parsing for
toolCallId,agentId,description,model, andprompt, ignoring object-shapedsubagentType. - Added per-session correlation state so
cursor/taskand the subagenttool_callmerge into oneSubagentTaskPayloadin either arrival order, and unmatched pending state is dropped on teardown. - Extended Cursor result enrichment so
rawOutput.isBackground:truesetsIsAsync, which reuses the existing background-chip UI. cd apps/backend && go test ./internal/agentctl/server/adapter/transport/acp/...passed.