feat(FN-1272): add task document tools for triage and executor

- Add task_document_write and task_document_read factories with schemas, revision-aware responses, and error handling in agent-tools
- Wire document tools into executor and triage sessions and update prompts to persist and reuse planning artifacts across runs
- Export document tool factories and parameter schemas from engine public entrypoints while keeping executor re-export compatibility
- Add comprehensive tests covering write/read success paths, empty/not-found cases, and store failure handling
This commit is contained in:
gsxdsm
2026-04-08 12:27:11 -07:00
parent 0cdc163a67
commit d271b42840
5 changed files with 409 additions and 2 deletions

View File

@@ -27,6 +27,8 @@ import type { AgentReflectionService } from "./agent-reflection.js";
import {
createReflectOnPerformanceTool,
createTaskCreateTool as sharedCreateTaskCreateTool,
createTaskDocumentReadTool as sharedCreateTaskDocumentReadTool,
createTaskDocumentWriteTool as sharedCreateTaskDocumentWriteTool,
createTaskLogTool as sharedCreateTaskLogTool,
taskCreateParams,
taskLogParams,
@@ -34,7 +36,14 @@ import {
// Re-export for backward compatibility (tests import from executor.ts)
export { summarizeToolArgs } from "./agent-logger.js";
export { createTaskCreateTool, createTaskLogTool, taskCreateParams, taskLogParams } from "./agent-tools.js";
export {
createTaskCreateTool,
createTaskDocumentReadTool,
createTaskDocumentWriteTool,
createTaskLogTool,
taskCreateParams,
taskLogParams,
} from "./agent-tools.js";
const STEP_STATUSES: StepStatus[] = ["pending", "in-progress", "done", "skipped"];
@@ -155,6 +164,16 @@ model, read-only access) to independently assess your work.
- **RETHINK (code review)** → your code changes have been reverted and conversation rewound. Read the feedback carefully and take a fundamentally different approach. Do NOT repeat the rejected strategy.
- **RETHINK (plan review)** → conversation rewound to before the step (no git reset since no code was written). Read the feedback and take a fundamentally different approach to planning this step.
## Task Documents
You can save and retrieve named documents for this task. Use these to store planning notes, research findings, or any persistent data that should survive across sessions.
- **Save a document:** \`task_document_write(key="plan", content="...")\`
- **Read a document:** \`task_document_read(key="plan")\`
- **List all documents:** \`task_document_read()\` (no key)
Documents are versioned — each write creates a new revision. Use meaningful keys like "plan", "notes", "research", "architecture".
## Git discipline
- Commit after completing each step (not after every file change)
- Use conventional commit messages prefixed with the task ID
@@ -1047,6 +1066,8 @@ export class TaskExecutor {
this.createTaskDoneTool(task.id, () => { taskDone = true; }),
this.createReviewStepTool(task.id, worktreePath, detail.prompt, codeReviewVerdicts, sessionRef, stepCheckpoints, detail, stuckDetector),
this.createSpawnAgentTool(task.id, worktreePath, settings),
this.createTaskDocumentWriteTool(task.id),
this.createTaskDocumentReadTool(task.id),
// Conditionally add agent self-reflection when enabled and task has an assigned agent.
...reflectionTools,
];
@@ -1649,6 +1670,14 @@ export class TaskExecutor {
return sharedCreateTaskCreateTool(this.store);
}
private createTaskDocumentWriteTool(taskId: string): ToolDefinition {
return sharedCreateTaskDocumentWriteTool(this.store, taskId);
}
private createTaskDocumentReadTool(taskId: string): ToolDefinition {
return sharedCreateTaskDocumentReadTool(this.store, taskId);
}
private createTaskAddDepTool(taskId: string): ToolDefinition {
const store = this.store;
return {