@pentoshi/clai 3.5.1 → 3.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent/compaction-summary.d.ts +17 -0
- package/dist/agent/compaction-summary.js +64 -0
- package/dist/agent/compaction-summary.js.map +1 -0
- package/dist/agent/confirm-port.d.ts +3 -1
- package/dist/agent/confirm-port.js +5 -1
- package/dist/agent/confirm-port.js.map +1 -1
- package/dist/agent/context-manager.js +53 -24
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/events.d.ts +6 -0
- package/dist/agent/evidence-governor.d.ts +37 -0
- package/dist/agent/evidence-governor.js +70 -0
- package/dist/agent/evidence-governor.js.map +1 -0
- package/dist/agent/loop-guard.d.ts +29 -9
- package/dist/agent/loop-guard.js +117 -26
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/must-continue.d.ts +56 -0
- package/dist/agent/must-continue.js +240 -0
- package/dist/agent/must-continue.js.map +1 -0
- package/dist/agent/outcomes.d.ts +101 -0
- package/dist/agent/outcomes.js +359 -0
- package/dist/agent/outcomes.js.map +1 -0
- package/dist/agent/plan-decision.d.ts +33 -0
- package/dist/agent/plan-decision.js +104 -0
- package/dist/agent/plan-decision.js.map +1 -0
- package/dist/agent/plan-tool.d.ts +34 -0
- package/dist/agent/plan-tool.js +594 -76
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/project-root.d.ts +33 -0
- package/dist/agent/project-root.js +161 -0
- package/dist/agent/project-root.js.map +1 -0
- package/dist/agent/prompt-composer.d.ts +21 -0
- package/dist/agent/prompt-composer.js +46 -0
- package/dist/agent/prompt-composer.js.map +1 -0
- package/dist/agent/runner.d.ts +11 -1
- package/dist/agent/runner.js +1915 -886
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/scope-context.d.ts +3 -0
- package/dist/agent/scope-context.js +24 -0
- package/dist/agent/scope-context.js.map +1 -0
- package/dist/agent/scratch-write.d.ts +4 -0
- package/dist/agent/scratch-write.js +54 -0
- package/dist/agent/scratch-write.js.map +1 -0
- package/dist/agent/session-policy.d.ts +7 -0
- package/dist/agent/session-policy.js +61 -0
- package/dist/agent/session-policy.js.map +1 -1
- package/dist/agent/session-state.d.ts +41 -0
- package/dist/agent/session-state.js +107 -0
- package/dist/agent/session-state.js.map +1 -0
- package/dist/agent/step-budget.d.ts +14 -0
- package/dist/agent/step-budget.js +26 -0
- package/dist/agent/step-budget.js.map +1 -0
- package/dist/agent/task-analyzer.d.ts +12 -3
- package/dist/agent/task-analyzer.js +263 -23
- package/dist/agent/task-analyzer.js.map +1 -1
- package/dist/agent/task-evidence.d.ts +173 -0
- package/dist/agent/task-evidence.js +802 -0
- package/dist/agent/task-evidence.js.map +1 -0
- package/dist/agent/task-plan.d.ts +57 -0
- package/dist/agent/task-plan.js +147 -1
- package/dist/agent/task-plan.js.map +1 -1
- package/dist/agent/tool-call-parser.d.ts +19 -11
- package/dist/agent/tool-call-parser.js +96 -71
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/agent/tool-history.d.ts +34 -0
- package/dist/agent/tool-history.js +200 -0
- package/dist/agent/tool-history.js.map +1 -0
- package/dist/agent/tool-output-formatting.d.ts +13 -1
- package/dist/agent/tool-output-formatting.js +75 -22
- package/dist/agent/tool-output-formatting.js.map +1 -1
- package/dist/agent/turn-outcome.d.ts +11 -0
- package/dist/agent/turn-outcome.js +17 -0
- package/dist/agent/turn-outcome.js.map +1 -0
- package/dist/agent/turn-state.d.ts +11 -0
- package/dist/agent/turn-state.js +28 -0
- package/dist/agent/turn-state.js.map +1 -0
- package/dist/agent/workspace-orient.d.ts +75 -0
- package/dist/agent/workspace-orient.js +509 -0
- package/dist/agent/workspace-orient.js.map +1 -0
- package/dist/app/adapters/agent-event-adapter.d.ts +2 -13
- package/dist/app/adapters/agent-event-adapter.js +63 -25
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.d.ts +0 -5
- package/dist/app/adapters/current-agent-adapter.js +4 -7
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/adapters/current-jobs-adapter.js +1 -0
- package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
- package/dist/app/adapters/current-terminal-adapter.d.ts +0 -7
- package/dist/app/adapters/current-terminal-adapter.js +0 -7
- package/dist/app/adapters/current-terminal-adapter.js.map +1 -1
- package/dist/app/adapters/current-updates-adapter.d.ts +0 -5
- package/dist/app/adapters/current-updates-adapter.js +0 -5
- package/dist/app/adapters/current-updates-adapter.js.map +1 -1
- package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +0 -5
- package/dist/app/adapters/in-memory-clipboard-adapter.js +0 -5
- package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -1
- package/dist/app/commands/command.d.ts +0 -5
- package/dist/app/commands/command.js.map +1 -1
- package/dist/app/commands/registry.d.ts +0 -14
- package/dist/app/commands/registry.js +0 -20
- package/dist/app/commands/registry.js.map +1 -1
- package/dist/app/controllers/disposable.d.ts +0 -5
- package/dist/app/controllers/disposable.js +0 -5
- package/dist/app/controllers/disposable.js.map +1 -1
- package/dist/app/controllers/job-controller.d.ts +1 -5
- package/dist/app/controllers/job-controller.js +0 -4
- package/dist/app/controllers/job-controller.js.map +1 -1
- package/dist/app/controllers/plan-controller.d.ts +5 -8
- package/dist/app/controllers/plan-controller.js +30 -12
- package/dist/app/controllers/plan-controller.js.map +1 -1
- package/dist/app/controllers/session-controller.d.ts +17 -32
- package/dist/app/controllers/session-controller.js +60 -35
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/turn-controller.d.ts +2 -6
- package/dist/app/controllers/turn-controller.js +8 -8
- package/dist/app/controllers/turn-controller.js.map +1 -1
- package/dist/app/events/app-event.d.ts +4 -7
- package/dist/app/events/app-event.js +0 -6
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/app/events/event-buffer.d.ts +6 -17
- package/dist/app/events/event-buffer.js +27 -24
- package/dist/app/events/event-buffer.js.map +1 -1
- package/dist/app/events/sequencer.d.ts +0 -9
- package/dist/app/events/sequencer.js +0 -4
- package/dist/app/events/sequencer.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +13 -3
- package/dist/app/ports/clipboard-port.d.ts +0 -5
- package/dist/app/ports/confirm-port.d.ts +0 -7
- package/dist/app/ports/jobs-port.d.ts +2 -5
- package/dist/app/ports/persistence-port.d.ts +0 -4
- package/dist/app/ports/secret-port.d.ts +0 -5
- package/dist/app/ports/terminal-port.d.ts +0 -6
- package/dist/app/ports/updates-port.d.ts +0 -4
- package/dist/attachments/service.d.ts +29 -0
- package/dist/attachments/service.js +47 -0
- package/dist/attachments/service.js.map +1 -0
- package/dist/commands/doctor.js +3 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/providers.js +0 -3
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/search-providers.d.ts +0 -33
- package/dist/commands/search-providers.js +0 -33
- package/dist/commands/search-providers.js.map +1 -1
- package/dist/commands/update.js +1 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +22 -42
- package/dist/index.js.map +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +99 -0
- package/dist/llm/adapters/anthropic-tools.js +225 -0
- package/dist/llm/adapters/anthropic-tools.js.map +1 -0
- package/dist/llm/adapters/gemini-tools.d.ts +54 -0
- package/dist/llm/adapters/gemini-tools.js +139 -0
- package/dist/llm/adapters/gemini-tools.js.map +1 -0
- package/dist/llm/adapters/ollama-tools.d.ts +18 -0
- package/dist/llm/adapters/ollama-tools.js +58 -0
- package/dist/llm/adapters/ollama-tools.js.map +1 -0
- package/dist/llm/adapters/openai-tools.d.ts +39 -0
- package/dist/llm/adapters/openai-tools.js +71 -0
- package/dist/llm/adapters/openai-tools.js.map +1 -0
- package/dist/llm/agentrouter.js +23 -4
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.js +93 -92
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +93 -56
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +23 -4
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +13 -6
- package/dist/llm/capabilities.js +113 -13
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/gemini.js +63 -48
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +23 -10
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/http.d.ts +22 -34
- package/dist/llm/http.js +97 -69
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +23 -4
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/nvidia.js +23 -4
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +49 -31
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +23 -4
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +23 -4
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/qwen-cloud.js +23 -4
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/router.d.ts +0 -6
- package/dist/llm/router.js +48 -21
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/tool-protocol.d.ts +67 -0
- package/dist/llm/tool-protocol.js +278 -0
- package/dist/llm/tool-protocol.js.map +1 -0
- package/dist/modes/agent.d.ts +2 -1
- package/dist/modes/agent.js +4 -2
- package/dist/modes/agent.js.map +1 -1
- package/dist/modes/ask.d.ts +0 -18
- package/dist/modes/ask.js +71 -66
- package/dist/modes/ask.js.map +1 -1
- package/dist/os/cwd.d.ts +0 -21
- package/dist/os/cwd.js +0 -24
- package/dist/os/cwd.js.map +1 -1
- package/dist/os/pkgmgr.js +0 -6
- package/dist/os/pkgmgr.js.map +1 -1
- package/dist/prompts/index.d.ts +17 -21
- package/dist/prompts/index.js +131 -259
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/system.agent.md +242 -0
- package/dist/prompts/system.ask.md +56 -0
- package/dist/repl/prompt-line.js +0 -36
- package/dist/repl/prompt-line.js.map +1 -1
- package/dist/repl/slash-commands.d.ts +0 -9
- package/dist/repl/slash-commands.js +2 -23
- package/dist/repl/slash-commands.js.map +1 -1
- package/dist/repl.d.ts +5 -0
- package/dist/repl.js +176 -55
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.js +17 -9
- package/dist/safety/classifier.js.map +1 -1
- package/dist/safety/engagement-policy.d.ts +46 -0
- package/dist/safety/engagement-policy.js +198 -0
- package/dist/safety/engagement-policy.js.map +1 -0
- package/dist/store/config.d.ts +7 -0
- package/dist/store/config.js +1 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/engagement.d.ts +115 -0
- package/dist/store/engagement.js +278 -0
- package/dist/store/engagement.js.map +1 -0
- package/dist/store/logs.d.ts +5 -0
- package/dist/store/logs.js +52 -2
- package/dist/store/logs.js.map +1 -1
- package/dist/store/plan.d.ts +59 -5
- package/dist/store/plan.js +182 -8
- package/dist/store/plan.js.map +1 -1
- package/dist/store/scope.d.ts +4 -1
- package/dist/store/scope.js +2 -2
- package/dist/store/scope.js.map +1 -1
- package/dist/tools/capabilities.d.ts +2 -0
- package/dist/tools/capabilities.js +101 -6
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/command-intent.d.ts +1 -0
- package/dist/tools/command-intent.js +31 -0
- package/dist/tools/command-intent.js.map +1 -1
- package/dist/tools/definitions.d.ts +20 -0
- package/dist/tools/definitions.js +578 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/elevated-shell.d.ts +60 -0
- package/dist/tools/elevated-shell.js +233 -0
- package/dist/tools/elevated-shell.js.map +1 -0
- package/dist/tools/file-diff.d.ts +125 -0
- package/dist/tools/file-diff.js +495 -0
- package/dist/tools/file-diff.js.map +1 -0
- package/dist/tools/fs.d.ts +11 -13
- package/dist/tools/fs.js +280 -80
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/http.d.ts +15 -0
- package/dist/tools/http.js +202 -61
- package/dist/tools/http.js.map +1 -1
- package/dist/tools/jobs.d.ts +71 -10
- package/dist/tools/jobs.js +403 -124
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/net-ping-sweep.js +69 -16
- package/dist/tools/net-ping-sweep.js.map +1 -1
- package/dist/tools/nmap-runner.d.ts +19 -7
- package/dist/tools/nmap-runner.js +182 -80
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/pentest-workflows.d.ts +8 -0
- package/dist/tools/pentest-workflows.js +71 -0
- package/dist/tools/pentest-workflows.js.map +1 -0
- package/dist/tools/registry.d.ts +9 -0
- package/dist/tools/registry.js +272 -63
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.d.ts +3 -0
- package/dist/tools/shell.js +35 -13
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/tool-types.d.ts +11 -0
- package/dist/tools/validate.d.ts +11 -0
- package/dist/tools/validate.js +53 -0
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/web/search.js +48 -4
- package/dist/tools/web/search.js.map +1 -1
- package/dist/tui-v2/app/App.js +25 -39
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/app/command-handlers.js +20 -1
- package/dist/tui-v2/app/command-handlers.js.map +1 -1
- package/dist/tui-v2/app/commands/picker-commands.js +3 -0
- package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
- package/dist/tui-v2/app/commands/session-commands.js +5 -0
- package/dist/tui-v2/app/commands/session-commands.js.map +1 -1
- package/dist/tui-v2/app/plan-lifecycle.d.ts +25 -3
- package/dist/tui-v2/app/plan-lifecycle.js +87 -24
- package/dist/tui-v2/app/plan-lifecycle.js.map +1 -1
- package/dist/tui-v2/bootstrap/patch-opentui-text.d.ts +6 -0
- package/dist/tui-v2/bootstrap/patch-opentui-text.js +53 -0
- package/dist/tui-v2/bootstrap/patch-opentui-text.js.map +1 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js +7 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/jobs/jobs-panel.js +23 -14
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
- package/dist/tui-v2/components/modal/confirm-modal.d.ts +1 -1
- package/dist/tui-v2/components/modal/confirm-modal.js +18 -7
- package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
- package/dist/tui-v2/components/pager/pager.d.ts +6 -0
- package/dist/tui-v2/components/pager/pager.js +313 -67
- package/dist/tui-v2/components/pager/pager.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.d.ts +9 -0
- package/dist/tui-v2/components/status/status-line.js +17 -3
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/transcript/assistant-message.js +1 -1
- package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.js +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.d.ts +9 -1
- package/dist/tui-v2/components/transcript/tool-card.js +115 -10
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js +2 -2
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +16 -0
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/tui-v2/controllers/overlay-controller.d.ts +16 -2
- package/dist/tui-v2/controllers/overlay-controller.js +92 -12
- package/dist/tui-v2/controllers/overlay-controller.js.map +1 -1
- package/dist/tui-v2/rendering/artifact-pager-source.d.ts +19 -0
- package/dist/tui-v2/rendering/artifact-pager-source.js +103 -0
- package/dist/tui-v2/rendering/artifact-pager-source.js.map +1 -0
- package/dist/tui-v2/rendering/file-diff-view.d.ts +63 -0
- package/dist/tui-v2/rendering/file-diff-view.js +263 -0
- package/dist/tui-v2/rendering/file-diff-view.js.map +1 -0
- package/dist/tui-v2/rendering/open-tool-output.d.ts +9 -1
- package/dist/tui-v2/rendering/open-tool-output.js +65 -12
- package/dist/tui-v2/rendering/open-tool-output.js.map +1 -1
- package/dist/tui-v2/rendering/pager-chrome.d.ts +12 -0
- package/dist/tui-v2/rendering/pager-chrome.js +56 -0
- package/dist/tui-v2/rendering/pager-chrome.js.map +1 -0
- package/dist/tui-v2/rendering/plan-view.js +1 -1
- package/dist/tui-v2/rendering/plan-view.js.map +1 -1
- package/dist/tui-v2/rendering/syntax-highlight.d.ts +37 -0
- package/dist/tui-v2/rendering/syntax-highlight.js +1303 -0
- package/dist/tui-v2/rendering/syntax-highlight.js.map +1 -0
- package/dist/tui-v2/rendering/theme.d.ts +28 -0
- package/dist/tui-v2/rendering/theme.js +28 -0
- package/dist/tui-v2/rendering/theme.js.map +1 -1
- package/dist/tui-v2/rendering/tool-presenter.d.ts +11 -1
- package/dist/tui-v2/rendering/tool-presenter.js +101 -5
- package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
- package/dist/tui-v2/state/transcript-hydrate.js +5 -0
- package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
- package/dist/tui-v2/state/transcript-reducer.js +12 -2
- package/dist/tui-v2/state/transcript-reducer.js.map +1 -1
- package/dist/tui-v2/state/transcript-store.d.ts +7 -0
- package/dist/tui-v2/state/transcript-store.js +46 -0
- package/dist/tui-v2/state/transcript-store.js.map +1 -1
- package/dist/tui-v2/state/transcript-types.d.ts +12 -0
- package/dist/tui-v2/state/transcript-types.js +9 -0
- package/dist/tui-v2/state/transcript-types.js.map +1 -1
- package/dist/types.d.ts +75 -1
- package/dist/ui/ansi-box.d.ts +2 -0
- package/dist/ui/ansi-box.js +8 -1
- package/dist/ui/ansi-box.js.map +1 -1
- package/dist/ui/mentions.d.ts +6 -0
- package/dist/ui/mentions.js +50 -12
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui/plan-pane.js +1 -1
- package/dist/ui/plan-pane.js.map +1 -1
- package/package.json +16 -11
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/** Append assistant turn that requested tools (must precede tool results). */
|
|
2
|
+
export function appendAssistantWithTools(messages, text, toolCalls) {
|
|
3
|
+
messages.push({
|
|
4
|
+
role: "assistant",
|
|
5
|
+
content: text ?? "",
|
|
6
|
+
...(toolCalls.length ? { toolCalls } : {}),
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
/** Append a single tool result linked by tool_call_id. */
|
|
10
|
+
export function appendToolResult(messages, toolCallId, content, name, ok) {
|
|
11
|
+
messages.push({
|
|
12
|
+
role: "tool",
|
|
13
|
+
content,
|
|
14
|
+
toolCallId,
|
|
15
|
+
...(name ? { name } : {}),
|
|
16
|
+
...(typeof ok === "boolean" ? { ok } : {}),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Whether the message list would orphan a tool result (result without a
|
|
21
|
+
* preceding assistant toolCalls entry that owns the id).
|
|
22
|
+
*/
|
|
23
|
+
export function hasOrphanToolMessages(messages) {
|
|
24
|
+
const openIds = new Set();
|
|
25
|
+
for (const msg of messages) {
|
|
26
|
+
if (msg.role === "assistant" && msg.toolCalls?.length) {
|
|
27
|
+
for (const tc of msg.toolCalls)
|
|
28
|
+
openIds.add(tc.id);
|
|
29
|
+
}
|
|
30
|
+
if (msg.role === "tool") {
|
|
31
|
+
const id = msg.toolCallId ?? "";
|
|
32
|
+
if (!id || !openIds.has(id))
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/** Ids on the last assistant toolCalls message that lack a following tool result. */
|
|
39
|
+
export function missingToolResultIds(messages) {
|
|
40
|
+
let lastAssistant;
|
|
41
|
+
for (let i = messages.length - 1; i >= 0; i -= 1) {
|
|
42
|
+
const m = messages[i];
|
|
43
|
+
if (m.role === "assistant" && m.toolCalls?.length) {
|
|
44
|
+
lastAssistant = m;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!lastAssistant?.toolCalls?.length)
|
|
49
|
+
return [];
|
|
50
|
+
const needed = new Set(lastAssistant.toolCalls.map((tc) => tc.id));
|
|
51
|
+
// Only scan results after that assistant message.
|
|
52
|
+
const start = messages.lastIndexOf(lastAssistant);
|
|
53
|
+
for (let i = start + 1; i < messages.length; i += 1) {
|
|
54
|
+
const m = messages[i];
|
|
55
|
+
if (m.role === "tool" && m.toolCallId)
|
|
56
|
+
needed.delete(m.toolCallId);
|
|
57
|
+
// Stop at next non-tool (next turn).
|
|
58
|
+
if (m.role !== "tool")
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
return [...needed];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Append synthetic failed tool results for any assistant toolCalls ids that
|
|
65
|
+
* still lack a role:tool reply (deferred, cancelled, sliced, abort).
|
|
66
|
+
*/
|
|
67
|
+
export function fillMissingToolResults(messages, toolCalls, reason = "Cancelled — not executed this turn.") {
|
|
68
|
+
if (!toolCalls.length)
|
|
69
|
+
return 0;
|
|
70
|
+
const have = new Set();
|
|
71
|
+
// Collect existing tool results after the last matching assistant.
|
|
72
|
+
let start = -1;
|
|
73
|
+
for (let i = messages.length - 1; i >= 0; i -= 1) {
|
|
74
|
+
const m = messages[i];
|
|
75
|
+
if (m.role === "assistant" &&
|
|
76
|
+
m.toolCalls?.some((tc) => toolCalls.some((t) => t.id === tc.id))) {
|
|
77
|
+
start = i;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (start < 0)
|
|
82
|
+
return 0;
|
|
83
|
+
for (let i = start + 1; i < messages.length; i += 1) {
|
|
84
|
+
const m = messages[i];
|
|
85
|
+
if (m.role === "tool" && m.toolCallId)
|
|
86
|
+
have.add(m.toolCallId);
|
|
87
|
+
else if (m.role !== "tool")
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
let filled = 0;
|
|
91
|
+
for (const tc of toolCalls) {
|
|
92
|
+
if (have.has(tc.id))
|
|
93
|
+
continue;
|
|
94
|
+
appendToolResult(messages, tc.id, `Tool ${tc.name} result (exit=130, ok=false):\n${reason}`, tc.name, false);
|
|
95
|
+
have.add(tc.id);
|
|
96
|
+
filled += 1;
|
|
97
|
+
}
|
|
98
|
+
return filled;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* True when every id on every assistant toolCalls has a matching tool result
|
|
102
|
+
* later in the list (no missing pairs). Used by tests and diagnostics.
|
|
103
|
+
*/
|
|
104
|
+
export function allToolCallsHaveResults(messages) {
|
|
105
|
+
const pending = new Set();
|
|
106
|
+
for (const msg of messages) {
|
|
107
|
+
if (msg.role === "assistant" && msg.toolCalls?.length) {
|
|
108
|
+
for (const tc of msg.toolCalls)
|
|
109
|
+
pending.add(tc.id);
|
|
110
|
+
}
|
|
111
|
+
if (msg.role === "tool" && msg.toolCallId) {
|
|
112
|
+
pending.delete(msg.toolCallId);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return pending.size === 0;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* When compacting, never leave role:tool without its assistant toolCalls.
|
|
119
|
+
* Expand a keep-window start so tool pairs stay intact.
|
|
120
|
+
*/
|
|
121
|
+
export function expandKeepStartForToolPairs(messages, keepStart) {
|
|
122
|
+
let start = keepStart;
|
|
123
|
+
while (start > 0 && messages[start]?.role === "tool") {
|
|
124
|
+
start -= 1;
|
|
125
|
+
}
|
|
126
|
+
// If we landed mid-assistant-with-tools, include that assistant.
|
|
127
|
+
if (start > 0 &&
|
|
128
|
+
messages[start]?.role === "assistant" &&
|
|
129
|
+
messages[start].toolCalls?.length) {
|
|
130
|
+
// already includes assistant
|
|
131
|
+
}
|
|
132
|
+
else if (start > 0) {
|
|
133
|
+
// If first kept message is tool, walk back to assistant
|
|
134
|
+
while (start > 0 &&
|
|
135
|
+
messages[start - 1]?.role !== "system" &&
|
|
136
|
+
(messages[start]?.role === "tool" ||
|
|
137
|
+
(messages[start - 1]?.role === "assistant" &&
|
|
138
|
+
messages[start - 1].toolCalls?.length &&
|
|
139
|
+
messages[start]?.role === "tool"))) {
|
|
140
|
+
if (messages[start - 1]?.role === "assistant" &&
|
|
141
|
+
messages[start - 1].toolCalls?.length) {
|
|
142
|
+
start -= 1;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
start -= 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return Math.max(0, start);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Validate native assistant/tool groups immediately before provider dispatch.
|
|
152
|
+
* Every tool result must belong to the currently open assistant group, ids are
|
|
153
|
+
* unique, and no non-tool message may begin until the whole group is closed.
|
|
154
|
+
*/
|
|
155
|
+
export function validateToolProtocol(messages) {
|
|
156
|
+
const issues = [];
|
|
157
|
+
const seenIds = new Set();
|
|
158
|
+
let pending = new Set();
|
|
159
|
+
for (let index = 0; index < messages.length; index += 1) {
|
|
160
|
+
const message = messages[index];
|
|
161
|
+
if (message.role === "assistant" && message.toolCalls?.length) {
|
|
162
|
+
if (pending.size > 0) {
|
|
163
|
+
issues.push(`message ${index}: new assistant tool group before results for ${[...pending].join(", ")}`);
|
|
164
|
+
}
|
|
165
|
+
pending = new Set();
|
|
166
|
+
for (const call of message.toolCalls) {
|
|
167
|
+
if (!call.id)
|
|
168
|
+
issues.push(`message ${index}: tool call has no id`);
|
|
169
|
+
if (seenIds.has(call.id))
|
|
170
|
+
issues.push(`message ${index}: duplicate tool call id ${call.id}`);
|
|
171
|
+
seenIds.add(call.id);
|
|
172
|
+
pending.add(call.id);
|
|
173
|
+
}
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (message.role === "tool") {
|
|
177
|
+
const id = message.toolCallId ?? "";
|
|
178
|
+
if (!id || !pending.has(id)) {
|
|
179
|
+
issues.push(`message ${index}: orphan tool result${id ? ` ${id}` : ""}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
pending.delete(id);
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (pending.size > 0) {
|
|
187
|
+
issues.push(`message ${index}: non-tool message before results for ${[...pending].join(", ")}`);
|
|
188
|
+
pending.clear();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (pending.size > 0)
|
|
192
|
+
issues.push(`end of history: missing results for ${[...pending].join(", ")}`);
|
|
193
|
+
return issues;
|
|
194
|
+
}
|
|
195
|
+
export function assertValidToolProtocol(messages) {
|
|
196
|
+
const issues = validateToolProtocol(messages);
|
|
197
|
+
if (issues.length > 0)
|
|
198
|
+
throw new Error(`invalid native tool protocol: ${issues.join("; ")}`);
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=tool-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-history.js","sourceRoot":"","sources":["../../src/agent/tool-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import type { ToolCall, ToolResult } from "../types.js";
|
|
2
2
|
export declare function saveToolOutput(call: ToolCall, output: string): Promise<string | undefined>;
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Truncate long tool output for the model. When `preferErrors` is set (failed
|
|
5
|
+
* commands), keep error-bearing lines and a heavy tail so stack traces survive.
|
|
6
|
+
*/
|
|
7
|
+
export declare function summarizeOutput(output: string, maxChars?: number, opts?: {
|
|
8
|
+
preferErrors?: boolean;
|
|
9
|
+
}): {
|
|
4
10
|
text: string;
|
|
5
11
|
truncated: boolean;
|
|
6
12
|
};
|
|
13
|
+
/** One-line failure cue prepended when a tool returns ok=false. */
|
|
14
|
+
export declare function failureSummaryLine(result: {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
exitCode?: number | undefined;
|
|
17
|
+
output?: string | undefined;
|
|
18
|
+
}): string | undefined;
|
|
7
19
|
export declare function formatToolContext(call: ToolCall, result: ToolResult): string;
|
|
@@ -24,10 +24,47 @@ export async function saveToolOutput(call, output) {
|
|
|
24
24
|
handlePermissionError(err);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
const ERROR_LINE_RE = /\b(?:error|exception|failed|failure|fatal|traceback|panic|ECONNREFUSED|ENOENT|TypeError|SyntaxError|ReferenceError|Cannot find|not found|exit code)\b/i;
|
|
28
|
+
/**
|
|
29
|
+
* Truncate long tool output for the model. When `preferErrors` is set (failed
|
|
30
|
+
* commands), keep error-bearing lines and a heavy tail so stack traces survive.
|
|
31
|
+
*/
|
|
32
|
+
export function summarizeOutput(output, maxChars = 8_000, opts) {
|
|
28
33
|
if (output.length <= maxChars)
|
|
29
34
|
return { text: output, truncated: false };
|
|
30
35
|
const lines = output.split(/\r?\n/);
|
|
36
|
+
if (opts?.preferErrors) {
|
|
37
|
+
const errorLines = lines.filter((l) => ERROR_LINE_RE.test(l));
|
|
38
|
+
const tailBudget = Math.floor(maxChars * 0.55);
|
|
39
|
+
const errBudget = maxChars - tailBudget - 80;
|
|
40
|
+
const errBlock = [];
|
|
41
|
+
let used = 0;
|
|
42
|
+
for (const line of errorLines.slice(-80)) {
|
|
43
|
+
const cost = line.length + 1;
|
|
44
|
+
if (used + cost > errBudget)
|
|
45
|
+
break;
|
|
46
|
+
errBlock.push(line);
|
|
47
|
+
used += cost;
|
|
48
|
+
}
|
|
49
|
+
const tail = [];
|
|
50
|
+
used = 0;
|
|
51
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
52
|
+
const line = lines[i];
|
|
53
|
+
const cost = line.length + 1;
|
|
54
|
+
if (used + cost > tailBudget)
|
|
55
|
+
break;
|
|
56
|
+
tail.unshift(line);
|
|
57
|
+
used += cost;
|
|
58
|
+
}
|
|
59
|
+
const body = [
|
|
60
|
+
...(errBlock.length
|
|
61
|
+
? ["[error-relevant lines]", ...errBlock, ""]
|
|
62
|
+
: []),
|
|
63
|
+
`... (${lines.length.toLocaleString()} lines truncated; tail kept) ...`,
|
|
64
|
+
...tail,
|
|
65
|
+
].join("\n");
|
|
66
|
+
return { text: body.slice(0, maxChars + 200), truncated: true };
|
|
67
|
+
}
|
|
31
68
|
const head = [];
|
|
32
69
|
const tail = [];
|
|
33
70
|
let used = 0;
|
|
@@ -57,6 +94,17 @@ export function summarizeOutput(output, maxChars = 8_000) {
|
|
|
57
94
|
truncated: true,
|
|
58
95
|
};
|
|
59
96
|
}
|
|
97
|
+
/** One-line failure cue prepended when a tool returns ok=false. */
|
|
98
|
+
export function failureSummaryLine(result) {
|
|
99
|
+
if (result.ok)
|
|
100
|
+
return undefined;
|
|
101
|
+
const exit = typeof result.exitCode === "number" ? `exit=${result.exitCode}` : "failed";
|
|
102
|
+
const head = (result.output ?? "").split(/\r?\n/).find((l) => l.trim()) ?? "";
|
|
103
|
+
const snippet = head.replace(/\s+/g, " ").trim().slice(0, 120);
|
|
104
|
+
return snippet
|
|
105
|
+
? `FAILURE SUMMARY: ${exit}; ${snippet}`
|
|
106
|
+
: `FAILURE SUMMARY: ${exit}`;
|
|
107
|
+
}
|
|
60
108
|
// Tools whose output is the actual content the model needs verbatim (file
|
|
61
109
|
// bodies, listings, search hits). Running these through the security-signal
|
|
62
110
|
// `genericReducer` was wrong: it ranks lines by pentest keywords and drops
|
|
@@ -83,26 +131,33 @@ const PASSTHROUGH_CAP_CHARS = 400_000;
|
|
|
83
131
|
const WEB_FETCH_CAP_CHARS = 20_000;
|
|
84
132
|
export function formatToolContext(call, result) {
|
|
85
133
|
const output = result.output.trim();
|
|
86
|
-
if (!output)
|
|
87
|
-
|
|
134
|
+
if (!output) {
|
|
135
|
+
const fail = failureSummaryLine(result);
|
|
136
|
+
return fail ?? "";
|
|
137
|
+
}
|
|
138
|
+
const preferErrors = !result.ok;
|
|
139
|
+
const failLine = failureSummaryLine(result);
|
|
88
140
|
if (call.name === "web.fetch" || call.name === "http.fetch") {
|
|
89
|
-
const { text, truncated } = summarizeOutput(output, WEB_FETCH_CAP_CHARS
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
?
|
|
94
|
-
|
|
95
|
-
|
|
141
|
+
const { text, truncated } = summarizeOutput(output, WEB_FETCH_CAP_CHARS, {
|
|
142
|
+
preferErrors,
|
|
143
|
+
});
|
|
144
|
+
const body = truncated
|
|
145
|
+
? `${text}${result.outputPath
|
|
146
|
+
? `\n\n[Response exceeds ${WEB_FETCH_CAP_CHARS.toLocaleString()} chars; head/tail shown. Full: ${result.outputPath}]`
|
|
147
|
+
: `\n\n[Response exceeds ${WEB_FETCH_CAP_CHARS.toLocaleString()} chars; only head and tail shown.]`}`
|
|
148
|
+
: text;
|
|
149
|
+
return [failLine, body].filter(Boolean).join("\n").trim();
|
|
96
150
|
}
|
|
97
|
-
// Pass-through tools: never reduce — the model needs the real content.
|
|
98
151
|
if (PASSTHROUGH_TOOLS.has(call.name)) {
|
|
99
|
-
const { text, truncated } = summarizeOutput(output, PASSTHROUGH_CAP_CHARS
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
?
|
|
104
|
-
|
|
105
|
-
|
|
152
|
+
const { text, truncated } = summarizeOutput(output, PASSTHROUGH_CAP_CHARS, {
|
|
153
|
+
preferErrors,
|
|
154
|
+
});
|
|
155
|
+
const body = truncated
|
|
156
|
+
? `${text}${result.outputPath
|
|
157
|
+
? `\n\n[File content exceeds ${PASSTHROUGH_CAP_CHARS.toLocaleString()} chars; head/tail shown. Full: ${result.outputPath}]`
|
|
158
|
+
: `\n\n[File content exceeds ${PASSTHROUGH_CAP_CHARS.toLocaleString()} chars; only head and tail shown.]`}`
|
|
159
|
+
: text;
|
|
160
|
+
return [failLine, body].filter(Boolean).join("\n").trim();
|
|
106
161
|
}
|
|
107
162
|
let reduced;
|
|
108
163
|
try {
|
|
@@ -116,13 +171,11 @@ export function formatToolContext(call, result) {
|
|
|
116
171
|
catch {
|
|
117
172
|
reduced = undefined;
|
|
118
173
|
}
|
|
119
|
-
// Hard cap on the reduced text — reducers should already be small, but
|
|
120
|
-
// never let one accidentally explode model context.
|
|
121
174
|
const base = reduced && reduced.length > 0 ? reduced : output;
|
|
122
|
-
const summary = summarizeOutput(base, 8_000);
|
|
175
|
+
const summary = summarizeOutput(base, 8_000, { preferErrors });
|
|
123
176
|
const saved = result.outputPath
|
|
124
177
|
? `\nFull output saved to: ${result.outputPath}`
|
|
125
178
|
: "";
|
|
126
|
-
return `${summary.text}${saved}
|
|
179
|
+
return [failLine, `${summary.text}${saved}`].filter(Boolean).join("\n").trim();
|
|
127
180
|
}
|
|
128
181
|
//# sourceMappingURL=tool-output-formatting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-output-formatting.js","sourceRoot":"","sources":["../../src/agent/tool-output-formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,CACL,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAC5D,aAAa,CACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,QAAQ,GAAG,KAAK;
|
|
1
|
+
{"version":3,"file":"tool-output-formatting.js","sourceRoot":"","sources":["../../src/agent/tool-output-formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TurnOutcomeStatus = "succeeded" | "partial" | "blocked" | "failed" | "aborted" | "paused_budget";
|
|
2
|
+
export interface TurnOutcome {
|
|
3
|
+
readonly schemaVersion: 1;
|
|
4
|
+
readonly status: TurnOutcomeStatus;
|
|
5
|
+
readonly answer: string;
|
|
6
|
+
readonly steps: number;
|
|
7
|
+
readonly remainingCriteria: readonly string[];
|
|
8
|
+
readonly reason?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function createTurnOutcome(input: Omit<TurnOutcome, "schemaVersion">): TurnOutcome;
|
|
11
|
+
export declare function renderTurnOutcome(outcome: TurnOutcome): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function createTurnOutcome(input) {
|
|
2
|
+
if (input.status === "succeeded" && input.remainingCriteria.length > 0) {
|
|
3
|
+
throw new Error("a succeeded turn cannot have remaining criteria");
|
|
4
|
+
}
|
|
5
|
+
return { schemaVersion: 1, ...input };
|
|
6
|
+
}
|
|
7
|
+
export function renderTurnOutcome(outcome) {
|
|
8
|
+
if (outcome.status === "succeeded" || outcome.status === "aborted")
|
|
9
|
+
return outcome.answer;
|
|
10
|
+
const status = outcome.status === "paused_budget" ? "paused" : outcome.status;
|
|
11
|
+
const remaining = outcome.remainingCriteria.length
|
|
12
|
+
? `\n\nRemaining:\n${outcome.remainingCriteria.map((item) => `- ${item}`).join("\n")}`
|
|
13
|
+
: "";
|
|
14
|
+
const reason = outcome.reason ? `\n\nReason: ${outcome.reason}` : "";
|
|
15
|
+
return `${outcome.answer}${outcome.answer ? "\n\n" : ""}Status: ${status}${reason}${remaining}`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=turn-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-outcome.js","sourceRoot":"","sources":["../../src/agent/turn-outcome.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,iBAAiB,CAAC,KAAyC;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM;QAChD,CAAC,CAAC,mBAAmB,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TurnState = "understanding" | "exploring" | "acting" | "verifying" | "succeeded" | "partial" | "blocked" | "failed" | "aborted" | "paused_budget";
|
|
2
|
+
export interface TurnStateSnapshot {
|
|
3
|
+
readonly schemaVersion: 1;
|
|
4
|
+
readonly state: TurnState;
|
|
5
|
+
readonly revision: number;
|
|
6
|
+
readonly reason?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function createTurnState(initial?: TurnState): TurnStateSnapshot;
|
|
9
|
+
export declare function canTransitionTurn(from: TurnState, to: TurnState): boolean;
|
|
10
|
+
export declare function transitionTurn(snapshot: TurnStateSnapshot, to: TurnState, reason?: string): TurnStateSnapshot;
|
|
11
|
+
export declare function isTerminalTurnState(state: TurnState): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const LEGAL_TRANSITIONS = {
|
|
2
|
+
understanding: ["exploring", "acting", "blocked", "failed", "aborted", "paused_budget"],
|
|
3
|
+
exploring: ["understanding", "acting", "verifying", "blocked", "failed", "aborted", "paused_budget"],
|
|
4
|
+
acting: ["exploring", "verifying", "blocked", "failed", "aborted", "paused_budget"],
|
|
5
|
+
verifying: ["exploring", "acting", "succeeded", "partial", "blocked", "failed", "aborted", "paused_budget"],
|
|
6
|
+
paused_budget: ["understanding", "exploring", "acting", "verifying", "aborted"],
|
|
7
|
+
succeeded: [],
|
|
8
|
+
partial: [],
|
|
9
|
+
blocked: [],
|
|
10
|
+
failed: [],
|
|
11
|
+
aborted: [],
|
|
12
|
+
};
|
|
13
|
+
export function createTurnState(initial = "understanding") {
|
|
14
|
+
return { schemaVersion: 1, state: initial, revision: 0 };
|
|
15
|
+
}
|
|
16
|
+
export function canTransitionTurn(from, to) {
|
|
17
|
+
return LEGAL_TRANSITIONS[from].includes(to);
|
|
18
|
+
}
|
|
19
|
+
export function transitionTurn(snapshot, to, reason) {
|
|
20
|
+
if (!canTransitionTurn(snapshot.state, to)) {
|
|
21
|
+
throw new Error(`illegal turn transition: ${snapshot.state} -> ${to}`);
|
|
22
|
+
}
|
|
23
|
+
return { schemaVersion: 1, state: to, revision: snapshot.revision + 1, reason };
|
|
24
|
+
}
|
|
25
|
+
export function isTerminalTurnState(state) {
|
|
26
|
+
return LEGAL_TRANSITIONS[state].length === 0;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=turn-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-state.js","sourceRoot":"","sources":["../../src/agent/turn-state.ts"],"names":[],"mappings":"AAmBA,MAAM,iBAAiB,GAAsD;IAC3E,aAAa,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC;IACvF,SAAS,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC;IACpG,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC;IACnF,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC;IAC3G,aAAa,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC;IAC/E,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,UAAqB,eAAe;IAClE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAe,EAAE,EAAa;IAC9D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,EAAa,EACb,MAAe;IAEf,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack-agnostic workspace orientation for build turns.
|
|
3
|
+
*
|
|
4
|
+
* Weak models often skip fs.list/fs.read and plan against an imaginary empty
|
|
5
|
+
* destination — then re-scaffold into a non-empty folder ("Operation cancelled")
|
|
6
|
+
* or write into the agent package. This module snapshots the real cwd /
|
|
7
|
+
* destination / candidate project paths so the model always sees ground truth
|
|
8
|
+
* before plan.create or implement.
|
|
9
|
+
*/
|
|
10
|
+
/** Filenames that strongly suggest "this directory is already a software project". */
|
|
11
|
+
export declare const PROJECT_MARKERS: readonly ["package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bun.lockb", "Cargo.toml", "go.mod", "pyproject.toml", "requirements.txt", "Pipfile", "composer.json", "Gemfile", "pom.xml", "build.gradle", "build.gradle.kts", "CMakeLists.txt", "Makefile", "mix.exs", "pubspec.yaml", "Package.swift", "deno.json", "deno.jsonc", "tsconfig.json", "index.html", "setup.py", "manage.py", "Cargo.lock", ".git"];
|
|
12
|
+
export declare function isBareParentDirectory(path: string): boolean;
|
|
13
|
+
export declare function detectProjectMarkers(dir: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Infer package manager from lockfiles / markers present in a project dir.
|
|
16
|
+
* Prefer lockfile over bare package.json.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectPackageManager(dir: string): "npm" | "pnpm" | "yarn" | "bun" | "pip" | "poetry" | "cargo" | "go" | undefined;
|
|
19
|
+
export declare function isExistingProjectDir(dir: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Discover marker-bearing immediate children under a user-named destination.
|
|
22
|
+
* This is intentionally bounded and non-recursive: enough to resume an
|
|
23
|
+
* arbitrary existing Desktop project without crawling the user's filesystem.
|
|
24
|
+
*/
|
|
25
|
+
export declare function discoverImmediateProjectRoots(parent: string, maxEntries?: number): string[];
|
|
26
|
+
export interface DirSnapshot {
|
|
27
|
+
path: string;
|
|
28
|
+
exists: boolean;
|
|
29
|
+
isDir: boolean;
|
|
30
|
+
entryCount: number;
|
|
31
|
+
/** Up to maxNames entry basenames. */
|
|
32
|
+
entries: string[];
|
|
33
|
+
markers: string[];
|
|
34
|
+
isProject: boolean;
|
|
35
|
+
emptyOrMissing: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function snapshotDir(path: string, maxNames?: number): DirSnapshot;
|
|
38
|
+
export interface WorkspaceOrientationInput {
|
|
39
|
+
cwd?: string;
|
|
40
|
+
/** User-named parent destination (e.g. Desktop). */
|
|
41
|
+
destinationHint?: string;
|
|
42
|
+
/** Candidate project path from plan/prompt (may not exist yet). */
|
|
43
|
+
candidateProject?: string;
|
|
44
|
+
/** Extra absolute paths to snapshot (e.g. Desktop/todo-app guessed from prompt). */
|
|
45
|
+
extraPaths?: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Guess a likely project subfolder name from free text (todo-app, my-api, …).
|
|
49
|
+
* Stack-agnostic: any reasonable folder token after create/scaffold/in/on.
|
|
50
|
+
*/
|
|
51
|
+
export declare function guessProjectFolderName(text: string): string | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Human + model-facing block injected into the system prompt for build turns.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildWorkspaceOrientation(input: WorkspaceOrientationInput): string;
|
|
56
|
+
/**
|
|
57
|
+
* Extract the directory name a scaffolder would create (stack-agnostic).
|
|
58
|
+
* Returns undefined when the command is not a one-shot create into a named path.
|
|
59
|
+
*/
|
|
60
|
+
export declare function extractScaffoldTargetName(command: string): string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve absolute path a scaffolder would write into.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveScaffoldTargetPath(command: string, shellCwd?: string): string | undefined;
|
|
65
|
+
/** Scaffold cancelled / refused without creating a usable tree. */
|
|
66
|
+
export declare function isScaffoldCancelledOutput(output: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* True when the target path looks like a materialized project after scaffold.
|
|
69
|
+
*/
|
|
70
|
+
export declare function scaffoldLooksMaterialized(targetPath: string | undefined): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Soft preflight: block scaffold into an existing non-empty project path.
|
|
73
|
+
* Returns an error message for the model, or undefined if OK to proceed.
|
|
74
|
+
*/
|
|
75
|
+
export declare function scaffoldTargetConflictMessage(command: string, shellCwd?: string): string | undefined;
|