feat: phase 3-5 — workflow engine, background subagents, multi-modal, cache shape, inline diff
Phase 3: Dynamic Workflow Engine - VM sandbox (node:vm) with agent/parallel/pipeline API, Claude Code compatible - Workflow file discovery (.boocode/workflows/*.js + ~/.boocode/workflows/*.js) - Workflow manager with session/chat creation and inference dispatch - Built-in catalog: deep-research, review-code, find-issues - Resumability cache: SHA-256 hash of agent spec, in-memory Map Phase 4: Background Subagents - background-task.ts service: spawn/poll/cancel lifecycle - spawn_subagent, subagent_status, subagent_result tools in ALL_TOOLS Phase 5: Multi-modal + Cache Shape - Multi-modal stub with type defs and hook point in payload.ts - CacheShapeBadge component in trace viewer (colored bar + %)
This commit is contained in:
@@ -19,6 +19,7 @@ import { formatUnknownToolError } from './tool-suggestions.js';
|
||||
import { resolveGrantRoot } from '../grant_resolver.js';
|
||||
import { stripToolMarkup } from './tool-call-parser.js';
|
||||
import { repairToolInput } from './tool-input-repair.js';
|
||||
import { diffFromToolArgs, isWriteTool } from './compute-diff.js';
|
||||
import type { FailureKind } from './mistake-tracker.js';
|
||||
import { insertToolTrace, updateToolTrace } from '../tool-traces.js';
|
||||
import type {
|
||||
@@ -445,6 +446,16 @@ export async function executeToolPhase(
|
||||
if (SYNTHESIS_TOOLS.has(tc.name)) {
|
||||
synthEntries.push({ tc, output: tres.output, ...(tres.error ? { error: tres.error } : {}) });
|
||||
}
|
||||
// v2.8: compute a compact unified diff for successful write-tool results.
|
||||
// The diff is derived from tool call args (old_string/new_string for
|
||||
// edit_file, content for create_file) and included in the WS frame so
|
||||
// the frontend can render a DiffSnippet inline. Not persisted to message_parts
|
||||
// (the args alone are enough to reproduce it on reload if needed).
|
||||
const toolDiff =
|
||||
!tres.error && tres.outcome === 'success' && isWriteTool(tc.name)
|
||||
? diffFromToolArgs(tc.name, tc.args as Record<string, unknown>)
|
||||
: undefined;
|
||||
|
||||
const stored = {
|
||||
tool_call_id: tc.id,
|
||||
output: tres.output,
|
||||
@@ -467,6 +478,7 @@ export async function executeToolPhase(
|
||||
output: tres.output,
|
||||
truncated: tres.truncated,
|
||||
...(tres.error ? { error: tres.error } : {}),
|
||||
...(toolDiff ? { diff: toolDiff } : {}),
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user