@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,359 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getDataDir } from "../store/paths.js";
|
|
5
|
+
const fileFor = (sessionId) => join(getDataDir(), "outcomes", `${encodeURIComponent(sessionId)}.json`);
|
|
6
|
+
/**
|
|
7
|
+
* Serialize snapshots for one session without serializing tool execution.
|
|
8
|
+
* A queue is necessary in addition to unique temp files: otherwise an older
|
|
9
|
+
* snapshot can win the final rename after a newer parallel completion.
|
|
10
|
+
*/
|
|
11
|
+
const outcomeSaveQueues = new Map();
|
|
12
|
+
function mergeOutcomeEnvelopes(existing, incoming) {
|
|
13
|
+
if (!existing || existing.outcome.id !== incoming.outcome.id) {
|
|
14
|
+
return incoming;
|
|
15
|
+
}
|
|
16
|
+
if (incoming.outcome.revision < existing.outcome.revision) {
|
|
17
|
+
return existing;
|
|
18
|
+
}
|
|
19
|
+
if (incoming.outcome.revision > existing.outcome.revision) {
|
|
20
|
+
return incoming;
|
|
21
|
+
}
|
|
22
|
+
const evidence = [
|
|
23
|
+
...new Map([...existing.evidence, ...incoming.evidence].map((record) => [record.id, record])).values(),
|
|
24
|
+
];
|
|
25
|
+
const failedHypotheses = [
|
|
26
|
+
...new Map([...existing.failedHypotheses, ...incoming.failedHypotheses].map((item) => [
|
|
27
|
+
`${item.signature}\u0000${item.premise}`,
|
|
28
|
+
item,
|
|
29
|
+
])).values(),
|
|
30
|
+
];
|
|
31
|
+
const criteria = [
|
|
32
|
+
...new Map([...existing.outcome.criteria, ...incoming.outcome.criteria].map((criterion) => [
|
|
33
|
+
criterion.id,
|
|
34
|
+
criterion,
|
|
35
|
+
])).values(),
|
|
36
|
+
].map((criterion) => {
|
|
37
|
+
const prior = existing.outcome.criteria.find((item) => item.id === criterion.id);
|
|
38
|
+
const evidenceIds = [...new Set([...(prior?.evidenceIds ?? []), ...criterion.evidenceIds])];
|
|
39
|
+
const linked = evidence.filter((record) => evidenceIds.includes(record.id) &&
|
|
40
|
+
record.criterionIds.includes(criterion.id) &&
|
|
41
|
+
record.freshness === "current");
|
|
42
|
+
let status = "unproven";
|
|
43
|
+
if (criterion.status === "waived" || prior?.status === "waived") {
|
|
44
|
+
status = "waived";
|
|
45
|
+
}
|
|
46
|
+
else if (linked.some((record) => record.result === "pass" && record.strength === "decisive")) {
|
|
47
|
+
status = "proven";
|
|
48
|
+
}
|
|
49
|
+
else if (linked.some((record) => record.result === "fail")) {
|
|
50
|
+
status = "refuted";
|
|
51
|
+
}
|
|
52
|
+
else if (linked.some((record) => record.result === "pass")) {
|
|
53
|
+
status = "supported";
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
...criterion,
|
|
57
|
+
status,
|
|
58
|
+
evidenceIds,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
const outcome = {
|
|
62
|
+
...existing.outcome,
|
|
63
|
+
...incoming.outcome,
|
|
64
|
+
criteria,
|
|
65
|
+
updatedAt: existing.outcome.updatedAt >= incoming.outcome.updatedAt
|
|
66
|
+
? existing.outcome.updatedAt
|
|
67
|
+
: incoming.outcome.updatedAt,
|
|
68
|
+
};
|
|
69
|
+
outcome.status = deriveOutcomeStatus(outcome, evidence);
|
|
70
|
+
return { schemaVersion: 1, outcome, evidence, failedHypotheses };
|
|
71
|
+
}
|
|
72
|
+
export function createOutcome(input) {
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
return {
|
|
75
|
+
schemaVersion: 1,
|
|
76
|
+
id: randomUUID(),
|
|
77
|
+
sessionId: input.sessionId,
|
|
78
|
+
userIntent: input.userIntent,
|
|
79
|
+
kind: input.kind,
|
|
80
|
+
criteria: input.criteria.map((criterion) => ({
|
|
81
|
+
id: criterion.id ?? randomUUID(),
|
|
82
|
+
statement: criterion.statement,
|
|
83
|
+
required: criterion.required,
|
|
84
|
+
status: "unproven",
|
|
85
|
+
evidenceIds: [],
|
|
86
|
+
revision: 1,
|
|
87
|
+
domain: criterion.domain,
|
|
88
|
+
})),
|
|
89
|
+
assumptions: [],
|
|
90
|
+
constraints: [],
|
|
91
|
+
status: "active",
|
|
92
|
+
revision: 1,
|
|
93
|
+
createdAt: now,
|
|
94
|
+
updatedAt: now,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function reviseOutcome(outcome, criteria) {
|
|
98
|
+
const revision = outcome.revision + 1;
|
|
99
|
+
return {
|
|
100
|
+
...outcome,
|
|
101
|
+
revision,
|
|
102
|
+
status: "active",
|
|
103
|
+
criteria: criteria.map((criterion) => ({ ...criterion, revision, status: criterion.status === "waived" ? "waived" : "unproven", evidenceIds: [] })),
|
|
104
|
+
updatedAt: new Date().toISOString(),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function linkEvidence(outcome, evidence) {
|
|
108
|
+
if (evidence.outcomeId !== outcome.id || evidence.outcomeRevision !== outcome.revision) {
|
|
109
|
+
throw new Error("evidence belongs to a different outcome or revision");
|
|
110
|
+
}
|
|
111
|
+
if (evidence.freshness !== "current")
|
|
112
|
+
throw new Error("stale evidence cannot prove a criterion");
|
|
113
|
+
for (const criterionId of evidence.criterionIds) {
|
|
114
|
+
const criterion = outcome.criteria.find((item) => item.id === criterionId);
|
|
115
|
+
if (!criterion)
|
|
116
|
+
throw new Error(`unknown criterion: ${criterionId}`);
|
|
117
|
+
if (!criterion.evidenceIds.includes(evidence.id))
|
|
118
|
+
criterion.evidenceIds.push(evidence.id);
|
|
119
|
+
if (evidence.result === "pass")
|
|
120
|
+
criterion.status = evidence.strength === "decisive" ? "proven" : "supported";
|
|
121
|
+
else if (evidence.result === "fail")
|
|
122
|
+
criterion.status = "refuted";
|
|
123
|
+
}
|
|
124
|
+
outcome.updatedAt = new Date().toISOString();
|
|
125
|
+
}
|
|
126
|
+
export function validateCriterionEvidence(criterion, records) {
|
|
127
|
+
const linked = records.filter((record) => criterion.evidenceIds.includes(record.id) && record.criterionIds.includes(criterion.id) && record.freshness === "current" && record.result === "pass");
|
|
128
|
+
if (criterion.status === "waived")
|
|
129
|
+
return { ok: true };
|
|
130
|
+
if (criterion.status !== "proven" || linked.length === 0)
|
|
131
|
+
return { ok: false, reason: "criterion lacks current decisive linked evidence" };
|
|
132
|
+
if (criterion.domain === "bugfix" && criterion.id === "reproduction") {
|
|
133
|
+
const allLinked = records.filter((record) => criterion.evidenceIds.includes(record.id) &&
|
|
134
|
+
record.criterionIds.includes(criterion.id) &&
|
|
135
|
+
record.freshness === "current");
|
|
136
|
+
if (!allLinked.some((record) => record.kind === "reproduction" && record.result === "fail")) {
|
|
137
|
+
return { ok: false, reason: "bug criterion lacks failing before/reproduction evidence" };
|
|
138
|
+
}
|
|
139
|
+
if (!allLinked.some((record) => record.kind === "reproduction" && record.result === "pass")) {
|
|
140
|
+
return { ok: false, reason: "bug criterion lacks passing after-fix reproduction evidence" };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (criterion.domain === "server") {
|
|
144
|
+
const kinds = new Set(linked.map((record) => record.kind));
|
|
145
|
+
for (const required of ["process-start", "readiness", "probe"]) {
|
|
146
|
+
if (!kinds.has(required))
|
|
147
|
+
return { ok: false, reason: `server criterion lacks ${required} evidence` };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (criterion.domain === "pentest-finding") {
|
|
151
|
+
const kinds = new Set(linked.map((record) => record.kind));
|
|
152
|
+
if (!kinds.has("reproduction") || !kinds.has("impact") || !kinds.has("artifact")) {
|
|
153
|
+
return { ok: false, reason: "pentest finding lacks reproduction, impact, or artifact evidence" };
|
|
154
|
+
}
|
|
155
|
+
if (linked.every((record) => record.kind === "scanner-lead"))
|
|
156
|
+
return { ok: false, reason: "scanner output is a lead, not a verified finding" };
|
|
157
|
+
}
|
|
158
|
+
return { ok: true };
|
|
159
|
+
}
|
|
160
|
+
export function deriveOutcomeStatus(outcome, records) {
|
|
161
|
+
const required = outcome.criteria.filter((criterion) => criterion.required);
|
|
162
|
+
return required.every((criterion) => validateCriterionEvidence(criterion, records).ok) ? "succeeded" : "partial";
|
|
163
|
+
}
|
|
164
|
+
export function saveOutcomeState(envelope) {
|
|
165
|
+
const sessionId = envelope.outcome.sessionId;
|
|
166
|
+
const previous = outcomeSaveQueues.get(sessionId) ?? Promise.resolve();
|
|
167
|
+
const queued = previous.catch(() => undefined).then(async () => {
|
|
168
|
+
const dir = join(getDataDir(), "outcomes");
|
|
169
|
+
const path = fileFor(sessionId);
|
|
170
|
+
const temp = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
171
|
+
await mkdir(dir, { recursive: true });
|
|
172
|
+
try {
|
|
173
|
+
// Merge the latest durable state with this caller's snapshot. Parallel
|
|
174
|
+
// tool calls can hold independent clones, so queueing alone would still
|
|
175
|
+
// make the last whole-file snapshot erase sibling receipts.
|
|
176
|
+
let existing;
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(await readFile(path, "utf8"));
|
|
179
|
+
if (parsed.schemaVersion === 1)
|
|
180
|
+
existing = parsed;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// First save or corrupt prior state: write the incoming valid envelope.
|
|
184
|
+
}
|
|
185
|
+
const merged = mergeOutcomeEnvelopes(existing, envelope);
|
|
186
|
+
const serialized = `${JSON.stringify(merged, null, 2)}\n`;
|
|
187
|
+
await writeFile(temp, serialized, { mode: 0o600 });
|
|
188
|
+
await rename(temp, path);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
// rename removes the temp on success; unlink is only for failed writes.
|
|
192
|
+
await unlink(temp).catch(() => undefined);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
outcomeSaveQueues.set(sessionId, queued);
|
|
196
|
+
void queued.finally(() => {
|
|
197
|
+
if (outcomeSaveQueues.get(sessionId) === queued) {
|
|
198
|
+
outcomeSaveQueues.delete(sessionId);
|
|
199
|
+
}
|
|
200
|
+
}).catch(() => undefined);
|
|
201
|
+
return queued;
|
|
202
|
+
}
|
|
203
|
+
export async function loadOutcomeState(sessionId) {
|
|
204
|
+
try {
|
|
205
|
+
const parsed = JSON.parse(await readFile(fileFor(sessionId), "utf8"));
|
|
206
|
+
if (parsed.schemaVersion !== 1 || !parsed.outcome || !Array.isArray(parsed.evidence))
|
|
207
|
+
return undefined;
|
|
208
|
+
// Conservative migration: old completion labels never become evidenced success.
|
|
209
|
+
const outcome = { ...parsed.outcome };
|
|
210
|
+
if (outcome.status === "succeeded" && deriveOutcomeStatus(outcome, parsed.evidence) !== "succeeded")
|
|
211
|
+
outcome.status = "partial";
|
|
212
|
+
return { schemaVersion: 1, outcome, evidence: parsed.evidence, failedHypotheses: parsed.failedHypotheses ?? [] };
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
export function createEvidence(input) {
|
|
219
|
+
return { schemaVersion: 1, id: randomUUID(), observedAt: new Date().toISOString(), ...input };
|
|
220
|
+
}
|
|
221
|
+
export function inferOutcomeKind(input) {
|
|
222
|
+
if (input.pentestLike)
|
|
223
|
+
return "pentest";
|
|
224
|
+
if (/\b(?:fix|bug|regression|broken|error|failure)\b/i.test(input.userIntent))
|
|
225
|
+
return "bugfix";
|
|
226
|
+
if (input.buildLike)
|
|
227
|
+
return "build";
|
|
228
|
+
if (/\b(?:start|serve|deploy|run|operate)\b/i.test(input.userIntent))
|
|
229
|
+
return "operation";
|
|
230
|
+
return "answer";
|
|
231
|
+
}
|
|
232
|
+
export function defaultOutcomeCriteria(kind, userIntent) {
|
|
233
|
+
if (kind === "build") {
|
|
234
|
+
const criteria = [
|
|
235
|
+
{ id: "implementation", statement: `Requested change is implemented: ${userIntent}`, required: true, domain: "feature" },
|
|
236
|
+
{ id: "verification", statement: "Changed behavior passes an automated or direct behavioral check", required: true, domain: "feature" },
|
|
237
|
+
];
|
|
238
|
+
if (/\b(?:server|website|web app|localhost|serve|dev server)\b/i.test(userIntent)) {
|
|
239
|
+
criteria.push({ id: "server", statement: "The requested server is started, ready, and independently probed", required: true, domain: "server" });
|
|
240
|
+
}
|
|
241
|
+
return criteria;
|
|
242
|
+
}
|
|
243
|
+
if (kind === "bugfix") {
|
|
244
|
+
return [
|
|
245
|
+
{ id: "reproduction", statement: "The reported failure is reproduced or characterized", required: true, domain: "bugfix" },
|
|
246
|
+
{ id: "implementation", statement: "A targeted fix is implemented", required: true, domain: "bugfix" },
|
|
247
|
+
{ id: "verification", statement: "A current check demonstrates the failure is resolved", required: true, domain: "bugfix" },
|
|
248
|
+
];
|
|
249
|
+
}
|
|
250
|
+
if (kind === "operation") {
|
|
251
|
+
return [{ id: "server", statement: "The requested operation is started, ready, and independently probed", required: true, domain: "server" }];
|
|
252
|
+
}
|
|
253
|
+
if (kind === "pentest") {
|
|
254
|
+
return [
|
|
255
|
+
{ id: "assessment", statement: "Authorized assessment activity completed with retained evidence", required: true, domain: "general" },
|
|
256
|
+
{ id: "finding", statement: "Any reported finding is reproduced with impact and artifact evidence", required: false, domain: "pentest-finding" },
|
|
257
|
+
];
|
|
258
|
+
}
|
|
259
|
+
return [{ id: "answer", statement: "The response directly addresses the current user intent", required: true, domain: "general" }];
|
|
260
|
+
}
|
|
261
|
+
export async function openOutcomeState(input) {
|
|
262
|
+
const existing = await loadOutcomeState(input.sessionId);
|
|
263
|
+
if (existing && input.continueExisting && existing.outcome.status !== "succeeded")
|
|
264
|
+
return existing;
|
|
265
|
+
return {
|
|
266
|
+
schemaVersion: 1,
|
|
267
|
+
outcome: createOutcome({
|
|
268
|
+
sessionId: input.sessionId,
|
|
269
|
+
userIntent: input.userIntent,
|
|
270
|
+
kind: input.kind,
|
|
271
|
+
criteria: defaultOutcomeCriteria(input.kind, input.userIntent),
|
|
272
|
+
}),
|
|
273
|
+
evidence: [],
|
|
274
|
+
failedHypotheses: existing?.failedHypotheses ?? [],
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
export function recordFailedHypothesis(envelope, input) {
|
|
278
|
+
const duplicate = envelope.failedHypotheses.some((item) => item.signature === input.signature && item.premise === input.premise);
|
|
279
|
+
if (!duplicate) {
|
|
280
|
+
envelope.failedHypotheses.push({ ...input, observedAt: new Date().toISOString() });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
export function recordToolEvidence(envelope, input) {
|
|
284
|
+
const ids = new Set(envelope.outcome.criteria.map((criterion) => criterion.id));
|
|
285
|
+
const command = typeof input.args?.command === "string" ? input.args.command : "";
|
|
286
|
+
const url = typeof input.args?.url === "string" ? input.args.url : "";
|
|
287
|
+
const records = [];
|
|
288
|
+
const add = (criterionIds, kind, strength) => {
|
|
289
|
+
const linked = criterionIds.filter((id) => ids.has(id));
|
|
290
|
+
if (linked.length === 0)
|
|
291
|
+
return;
|
|
292
|
+
const evidence = createEvidence({
|
|
293
|
+
outcomeId: envelope.outcome.id,
|
|
294
|
+
outcomeRevision: envelope.outcome.revision,
|
|
295
|
+
criterionIds: linked,
|
|
296
|
+
taskId: input.taskId,
|
|
297
|
+
source: { tool: input.tool, callId: input.callId, artifact: input.artifact },
|
|
298
|
+
kind,
|
|
299
|
+
freshness: "current",
|
|
300
|
+
strength,
|
|
301
|
+
observation: input.output.slice(0, 4_000),
|
|
302
|
+
result: input.ok ? "pass" : "fail",
|
|
303
|
+
});
|
|
304
|
+
envelope.evidence.push(evidence);
|
|
305
|
+
linkEvidence(envelope.outcome, evidence);
|
|
306
|
+
records.push(evidence);
|
|
307
|
+
};
|
|
308
|
+
const isWrite = /^(?:fs\.(?:write|writeMany|edit|replaceLines|append))$/.test(input.tool);
|
|
309
|
+
const isCheck = input.tool === "shell.exec" && /\b(?:test|vitest|jest|pytest|typecheck|lint|build|check)\b/i.test(command);
|
|
310
|
+
const isProbe = input.tool === "http.fetch" || (input.tool === "shell.exec" && /\bcurl\b/i.test(command));
|
|
311
|
+
const isStart = input.tool === "shell.start";
|
|
312
|
+
const isReady = input.tool === "shell.tail" && /\b(?:ready|listening|started|localhost|127\.0\.0\.1)\b/i.test(input.output);
|
|
313
|
+
const isScanner = input.tool === "net.scan" || input.tool === "pentest.recon" || /\b(?:nmap|nikto|nuclei|ffuf|gobuster)\b/i.test(command);
|
|
314
|
+
const isActiveSecurity = input.tool === "http.fetch" && !/^(?:GET|HEAD|OPTIONS)?$/i.test(String(input.args?.method ?? "GET"));
|
|
315
|
+
if (isWrite)
|
|
316
|
+
add(["implementation"], "artifact", "supporting");
|
|
317
|
+
if (isCheck)
|
|
318
|
+
add(["verification", "implementation"], "automated-check", "decisive");
|
|
319
|
+
if (isCheck && envelope.outcome.kind === "bugfix")
|
|
320
|
+
add(["reproduction"], "reproduction", "decisive");
|
|
321
|
+
if (isStart)
|
|
322
|
+
add(["server"], "process-start", "decisive");
|
|
323
|
+
if (isReady)
|
|
324
|
+
add(["server"], "readiness", "decisive");
|
|
325
|
+
if (isProbe)
|
|
326
|
+
add(["server"], "probe", "decisive");
|
|
327
|
+
if (isScanner)
|
|
328
|
+
add(["assessment", "finding"], "scanner-lead", "supporting");
|
|
329
|
+
if (isActiveSecurity)
|
|
330
|
+
add(["assessment"], "reproduction", "decisive");
|
|
331
|
+
if (envelope.outcome.kind === "pentest" && input.artifact && input.ok)
|
|
332
|
+
add(["assessment"], "artifact", "decisive");
|
|
333
|
+
if (input.tool === "web.search" || input.tool === "web.fetch" || input.tool === "fs.read") {
|
|
334
|
+
add(["answer", "reproduction"], "observation", "supporting");
|
|
335
|
+
}
|
|
336
|
+
envelope.outcome.status = deriveOutcomeStatus(envelope.outcome, envelope.evidence);
|
|
337
|
+
return records;
|
|
338
|
+
}
|
|
339
|
+
export function recordAnswerEvidence(envelope, answer) {
|
|
340
|
+
const criterion = envelope.outcome.criteria.find((item) => item.id === "answer");
|
|
341
|
+
if (!criterion || !answer.trim())
|
|
342
|
+
return undefined;
|
|
343
|
+
const evidence = createEvidence({
|
|
344
|
+
outcomeId: envelope.outcome.id,
|
|
345
|
+
outcomeRevision: envelope.outcome.revision,
|
|
346
|
+
criterionIds: [criterion.id],
|
|
347
|
+
source: { tool: "assistant.final", callId: `final-${envelope.outcome.revision}` },
|
|
348
|
+
kind: "observation",
|
|
349
|
+
freshness: "current",
|
|
350
|
+
strength: "decisive",
|
|
351
|
+
observation: answer.slice(0, 4_000),
|
|
352
|
+
result: "pass",
|
|
353
|
+
});
|
|
354
|
+
envelope.evidence.push(evidence);
|
|
355
|
+
linkEvidence(envelope.outcome, evidence);
|
|
356
|
+
envelope.outcome.status = deriveOutcomeStatus(envelope.outcome, envelope.evidence);
|
|
357
|
+
return evidence;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=outcomes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.js","sourceRoot":"","sources":["../../src/agent/outcomes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SessionPlan } from "../store/plan.js";
|
|
2
|
+
export type PlanDecision = "accept" | "discard" | "view" | "suggest";
|
|
3
|
+
export declare const IMPLEMENT_DIRECTIVE: string;
|
|
4
|
+
/** User feedback → plan mode revision turn (shared classic TUI + v2). */
|
|
5
|
+
export declare function buildPlanRevisionPrompt(feedback: string, opts?: {
|
|
6
|
+
planVersion?: number | undefined;
|
|
7
|
+
}): string;
|
|
8
|
+
/**
|
|
9
|
+
* Plan-mode gather-only should block project mutation only while the plan is
|
|
10
|
+
* still awaiting accept. Once approved, mutates must run even if mode string
|
|
11
|
+
* briefly lags behind (defense in depth for implement).
|
|
12
|
+
*/
|
|
13
|
+
export declare function shouldBlockPlanModeMutate(isPlanMode: boolean, planApproved: boolean): boolean;
|
|
14
|
+
export declare function promptPlanDecision(): Promise<PlanDecision>;
|
|
15
|
+
export declare function promptPlanSuggestion(): Promise<string>;
|
|
16
|
+
export declare function handleDraftPlanDecision(opts: {
|
|
17
|
+
plan: SessionPlan;
|
|
18
|
+
sessionId: string;
|
|
19
|
+
setModeAgent: () => void;
|
|
20
|
+
planApproved: {
|
|
21
|
+
value: boolean;
|
|
22
|
+
};
|
|
23
|
+
}): Promise<{
|
|
24
|
+
action: "implement";
|
|
25
|
+
line: string;
|
|
26
|
+
} | {
|
|
27
|
+
action: "suggest";
|
|
28
|
+
line: string;
|
|
29
|
+
} | {
|
|
30
|
+
action: "discard";
|
|
31
|
+
} | {
|
|
32
|
+
action: "none";
|
|
33
|
+
}>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { input, select } from "@inquirer/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { deletePlan, savePlan } from "../store/plan.js";
|
|
4
|
+
import { renderPlanDocument } from "../ui/plan-pane.js";
|
|
5
|
+
import { openPager } from "../ui/output-pane.js";
|
|
6
|
+
import { restoreInteractiveStdin } from "./confirm-port.js";
|
|
7
|
+
export const IMPLEMENT_DIRECTIVE = "Plan approved. Execute it. " +
|
|
8
|
+
"Work through pending tasks in dependency order. For each: mark in_progress → do real work → verify → mark done (or failed and recover). " +
|
|
9
|
+
"Skip tasks already done. Adapt if reality differs from the plan; update the plan if scope grows. " +
|
|
10
|
+
"Do not claim done without tool evidence. Deliver the user's success condition, not only the checklist. " +
|
|
11
|
+
"For local apps: shell.start, leave the server running, report URL + port + job id.";
|
|
12
|
+
/** User feedback → plan mode revision turn (shared classic TUI + v2). */
|
|
13
|
+
export function buildPlanRevisionPrompt(feedback, opts) {
|
|
14
|
+
const version = opts?.planVersion ?? 1;
|
|
15
|
+
const text = feedback.trim();
|
|
16
|
+
return (`Plan revision request from the user (plan mode). Current plan version: ${version}. ` +
|
|
17
|
+
"Treat task ids, dependencies, resource locks, and completed states as structured authority; preserve stable ids. " +
|
|
18
|
+
"If the feedback is clear and possible without ambiguity, apply the smallest add/edit/remove/supersede/split/merge/dependency change that satisfies it, then persist one revised plan.create snapshot and stop for the next user decision. " +
|
|
19
|
+
"If the feedback is unclear or has multiple valid interpretations, ask concise clarifying questions instead of guessing — do not implement yet. " +
|
|
20
|
+
`User feedback:\n${text}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Plan-mode gather-only should block project mutation only while the plan is
|
|
24
|
+
* still awaiting accept. Once approved, mutates must run even if mode string
|
|
25
|
+
* briefly lags behind (defense in depth for implement).
|
|
26
|
+
*/
|
|
27
|
+
export function shouldBlockPlanModeMutate(isPlanMode, planApproved) {
|
|
28
|
+
return isPlanMode && !planApproved;
|
|
29
|
+
}
|
|
30
|
+
export async function promptPlanDecision() {
|
|
31
|
+
try {
|
|
32
|
+
const choice = await select({
|
|
33
|
+
message: chalk.cyan(" plan ready — what next?"),
|
|
34
|
+
choices: [
|
|
35
|
+
{ name: "Accept — switch to agent and implement", value: "accept" },
|
|
36
|
+
{ name: "Suggest changes — type feedback to revise", value: "suggest" },
|
|
37
|
+
{ name: "View full plan", value: "view" },
|
|
38
|
+
{ name: "Discard plan", value: "discard" },
|
|
39
|
+
],
|
|
40
|
+
default: "accept",
|
|
41
|
+
});
|
|
42
|
+
return choice;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
restoreInteractiveStdin();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function promptPlanSuggestion() {
|
|
49
|
+
try {
|
|
50
|
+
return (await input({
|
|
51
|
+
message: chalk.cyan(" plan changes (what should change?):"),
|
|
52
|
+
})).trim();
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
restoreInteractiveStdin();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function handleDraftPlanDecision(opts) {
|
|
59
|
+
let plan = opts.plan;
|
|
60
|
+
while (true) {
|
|
61
|
+
const decision = await promptPlanDecision();
|
|
62
|
+
if (decision === "view") {
|
|
63
|
+
if (process.stdout.isTTY && process.stdin.isTTY) {
|
|
64
|
+
await openPager({
|
|
65
|
+
title: `plan · ${plan.goal}`,
|
|
66
|
+
body: renderPlanDocument(plan),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(renderPlanDocument(plan));
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (decision === "discard") {
|
|
75
|
+
await deletePlan(opts.sessionId).catch(() => undefined);
|
|
76
|
+
opts.planApproved.value = false;
|
|
77
|
+
console.log(chalk.yellow(` ✗ plan discarded — "${plan.goal}"`) +
|
|
78
|
+
chalk.dim("\n later messages are independent of it.\n"));
|
|
79
|
+
return { action: "discard" };
|
|
80
|
+
}
|
|
81
|
+
if (decision === "suggest") {
|
|
82
|
+
const feedback = await promptPlanSuggestion();
|
|
83
|
+
if (!feedback) {
|
|
84
|
+
console.log(chalk.dim(" no changes entered — plan unchanged"));
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
action: "suggest",
|
|
89
|
+
line: buildPlanRevisionPrompt(feedback, {
|
|
90
|
+
planVersion: plan.version,
|
|
91
|
+
}),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// accept
|
|
95
|
+
plan.status = "approved";
|
|
96
|
+
plan.version = (plan.version ?? 1) + 1;
|
|
97
|
+
await savePlan(plan).catch(() => undefined);
|
|
98
|
+
opts.planApproved.value = true;
|
|
99
|
+
opts.setModeAgent();
|
|
100
|
+
console.log(chalk.cyan(" ✦ plan accepted — switching to agent mode to execute\n"));
|
|
101
|
+
return { action: "implement", line: IMPLEMENT_DIRECTIVE };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=plan-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-decision.js","sourceRoot":"","sources":["../../src/agent/plan-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,39 @@ import { type SessionPlan } from "../store/plan.js";
|
|
|
2
2
|
import type { LoopGuard } from "./loop-guard.js";
|
|
3
3
|
import type { SessionPolicy } from "./session-policy.js";
|
|
4
4
|
import type { ToolCall } from "../types.js";
|
|
5
|
+
/** Titles match for plan merge (exact or mutual long substring). */
|
|
6
|
+
export declare function titlesMatchForPlan(a: string, b: string): boolean;
|
|
7
|
+
/** Final coding-plan task: start server / probe localhost / leave running. */
|
|
8
|
+
export declare function looksLikeRunServerTask(title: string): boolean;
|
|
9
|
+
export declare function looksLikeLocalAppScaffold(kind: string, goal: string, detail: string, tasks: string[]): boolean;
|
|
10
|
+
export declare function codingPlanNeedsRunVerifyTask(kind: string, goal: string, detail: string, tasks: string[]): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Ensure coding app plans have an explicit install step after scaffold.
|
|
13
|
+
* Avoids "implement blocked from npm install" + install attributed to wrong task.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureCodingPlanInstallTask(kind: string, goal: string, detail: string, tasks: string[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Ensure feature-app plans include an implement-feature task (not scaffold-only).
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureCodingPlanFeatureTask(kind: string, goal: string, detail: string, tasks: string[]): string[];
|
|
20
|
+
/** Ensure local app plans end with shell.start + probe + leave running. */
|
|
21
|
+
export declare function ensureCodingPlanRunVerifyTask(kind: string, goal: string, detail: string, tasks: string[]): string[];
|
|
22
|
+
/** Preserve the model/user-authored checklist exactly for fresh coding plans. */
|
|
23
|
+
export declare function normalizeCodingPlanTasks(_kind: string, _goal: string, _detail: string, tasks: string[]): string[];
|
|
24
|
+
/** Goal is only "run/start the existing app" — do not open a new plan. */
|
|
25
|
+
export declare function looksLikeRunOnlyGoal(goal: string, detail: string): boolean;
|
|
26
|
+
export declare function slugifyTaskId(text: string): string;
|
|
27
|
+
export interface NormalizedPlanTask {
|
|
28
|
+
title: string;
|
|
29
|
+
aliases: string[];
|
|
30
|
+
dependencies: string[];
|
|
31
|
+
dependenciesSpecified: boolean;
|
|
32
|
+
resourceLocks: string[];
|
|
33
|
+
}
|
|
34
|
+
/** Full entries including model-supplied id/name aliases (X3). */
|
|
35
|
+
export declare function normalizePlanTaskEntries(args: Record<string, unknown>): NormalizedPlanTask[];
|
|
36
|
+
/** Resolve model taskId (t1 or slug) to the canonical plan task id. */
|
|
37
|
+
export declare function resolvePlanTaskId(plan: SessionPlan, taskId: string): string | undefined;
|
|
5
38
|
/** Render the portable inline form; the Ink TUI owns its responsive sidebar. */
|
|
6
39
|
export declare function renderPlanForTerminal(plan: SessionPlan): string;
|
|
7
40
|
export interface PlanToolResult {
|
|
@@ -23,4 +56,5 @@ export declare function planContextMessage(plan: SessionPlan, approved: boolean)
|
|
|
23
56
|
export declare function handlePlanTool(call: ToolCall, session: SessionPolicy, ctx: {
|
|
24
57
|
loopGuard: LoopGuard;
|
|
25
58
|
step: number;
|
|
59
|
+
autoApprove?: boolean;
|
|
26
60
|
}): Promise<PlanToolResult>;
|