@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
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Offensive-security agent in your terminal** — recon, enumerate, exploit, and report with an approve-before-run plan workflow. Also a strong coding/sysadmin agent for shell and files. Free to build, free to run.
|
|
4
4
|
|
|
5
|
-
clai is an AI **agent CLI** built for people who break (and fix) systems: authorized pentests, red-team style workflows, CTFs, report verification, and day-to-day security engineering. It runs real tools (`nmap`, `ffuf`, `sqlmap`, `http` evidence capture, …), keeps a **durable engagement plan**, and never pretends a finding is real without tool output to back it up.
|
|
5
|
+
clai is an AI **agent CLI** built for people who break (and fix) systems: authorized pentests, red-team style workflows, CTFs, report verification, and day-to-day security engineering. It runs real tools (`nmap`, `ffuf`, `sqlmap`, `http` evidence capture, …), keeps a **durable engagement plan**, and never pretends a finding is real without tool output to back it up. Providers that support it use **native function/tool calling** (config `toolCalling: auto|native|text`); text-fence tools remain as fallback.
|
|
6
6
|
|
|
7
7
|
It also builds software and runs shell/file workflows when that is the job — same agent, same safety gate, same UI.
|
|
8
8
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts and helpers for LLM-based context compaction.
|
|
3
|
+
* The model produces structured continuation memory — not a raw transcript dump.
|
|
4
|
+
*/
|
|
5
|
+
export declare const COMPACTION_SYSTEM_PROMPT = "You are a session-memory compressor for an autonomous coding and security agent.\n\nWrite a dense, accurate CONTINUATION MEMORY for another assistant that will resume this work with no other history.\n\nRules:\n- Fidelity over style. Never invent tool results, file contents, findings, URLs, ports, or completions.\n- Prefer concrete artifacts: absolute paths, commands (short form), exit outcomes, HTTP status, plan task ids/states, job ids, open ports, confirmed vs unconfirmed findings.\n- Omit secrets, API keys, passwords, tokens, and full credential material. Say \"[redacted]\" if present.\n- Omit progress bars, repeated failures, and decorative chatter.\n- Do not wrap the whole answer in markdown code fences.\n- If something is unknown, omit it rather than guessing.";
|
|
6
|
+
export interface CompactionPromptParts {
|
|
7
|
+
visualTranscript?: string | undefined;
|
|
8
|
+
messageTranscript: string;
|
|
9
|
+
/** Optional live plan / session state to prioritize. */
|
|
10
|
+
durableState?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
/** User message fed to the summarizer model. */
|
|
13
|
+
export declare function buildCompactionUserPrompt(parts: CompactionPromptParts): string;
|
|
14
|
+
/** Soft cap for transcript fed to the summarizer (chars). */
|
|
15
|
+
export declare const COMPACTION_TRANSCRIPT_CHAR_BUDGET = 48000;
|
|
16
|
+
/** Prefer head goals + tail recency when the transcript is huge. */
|
|
17
|
+
export declare function trimTranscriptForCompaction(transcript: string, budget?: number): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompts and helpers for LLM-based context compaction.
|
|
3
|
+
* The model produces structured continuation memory — not a raw transcript dump.
|
|
4
|
+
*/
|
|
5
|
+
export const COMPACTION_SYSTEM_PROMPT = `You are a session-memory compressor for an autonomous coding and security agent.
|
|
6
|
+
|
|
7
|
+
Write a dense, accurate CONTINUATION MEMORY for another assistant that will resume this work with no other history.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
- Fidelity over style. Never invent tool results, file contents, findings, URLs, ports, or completions.
|
|
11
|
+
- Prefer concrete artifacts: absolute paths, commands (short form), exit outcomes, HTTP status, plan task ids/states, job ids, open ports, confirmed vs unconfirmed findings.
|
|
12
|
+
- Omit secrets, API keys, passwords, tokens, and full credential material. Say "[redacted]" if present.
|
|
13
|
+
- Omit progress bars, repeated failures, and decorative chatter.
|
|
14
|
+
- Do not wrap the whole answer in markdown code fences.
|
|
15
|
+
- If something is unknown, omit it rather than guessing.`;
|
|
16
|
+
/** User message fed to the summarizer model. */
|
|
17
|
+
export function buildCompactionUserPrompt(parts) {
|
|
18
|
+
const visual = parts.visualTranscript?.trim() ?? "";
|
|
19
|
+
const fromMessages = parts.messageTranscript.trim();
|
|
20
|
+
const durable = parts.durableState?.trim() ?? "";
|
|
21
|
+
let transcript = "";
|
|
22
|
+
if (visual && fromMessages) {
|
|
23
|
+
transcript = `${visual}\n\n---\n\nOLDER MODEL TURNS:\n\n${fromMessages}`;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
transcript = visual || fromMessages;
|
|
27
|
+
}
|
|
28
|
+
const sections = [
|
|
29
|
+
"Create a complete but compact continuation memory of the session below.",
|
|
30
|
+
"Treat resumed history and newer turns as one continuous conversation.",
|
|
31
|
+
"",
|
|
32
|
+
"Organize under these exact section headings (skip a section only if empty):",
|
|
33
|
+
"## User goals",
|
|
34
|
+
"## Decisions and constraints",
|
|
35
|
+
"## Work completed",
|
|
36
|
+
"## Commands/tools and results",
|
|
37
|
+
"## Current state",
|
|
38
|
+
"## Remaining work",
|
|
39
|
+
"## Open risks / failures",
|
|
40
|
+
"",
|
|
41
|
+
"Preserve: user intentions, decisions, constraints, paths, stack/package manager,",
|
|
42
|
+
"commands and key results, plan task states, errors and failed approaches,",
|
|
43
|
+
"servers/jobs still running, and exactly what remains.",
|
|
44
|
+
"Be concise but specific. No secrets. No fabricated successes.",
|
|
45
|
+
];
|
|
46
|
+
if (durable) {
|
|
47
|
+
sections.push("", "DURABLE STATE (trust this over older chatter):", durable);
|
|
48
|
+
}
|
|
49
|
+
sections.push("", "SESSION MATERIAL:", "", transcript);
|
|
50
|
+
return sections.join("\n");
|
|
51
|
+
}
|
|
52
|
+
/** Soft cap for transcript fed to the summarizer (chars). */
|
|
53
|
+
export const COMPACTION_TRANSCRIPT_CHAR_BUDGET = 48_000;
|
|
54
|
+
/** Prefer head goals + tail recency when the transcript is huge. */
|
|
55
|
+
export function trimTranscriptForCompaction(transcript, budget = COMPACTION_TRANSCRIPT_CHAR_BUDGET) {
|
|
56
|
+
if (transcript.length <= budget)
|
|
57
|
+
return transcript;
|
|
58
|
+
const head = Math.floor(budget * 0.35);
|
|
59
|
+
const tail = budget - head - 80;
|
|
60
|
+
return (transcript.slice(0, head) +
|
|
61
|
+
"\n\n[... middle of session omitted for length ...]\n\n" +
|
|
62
|
+
transcript.slice(-tail));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=compaction-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-summary.js","sourceRoot":"","sources":["../../src/agent/compaction-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;yDAUiB,CAAC;AAS1D,gDAAgD;AAChD,MAAM,UAAU,yBAAyB,CAAC,KAA4B;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEjD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;QAC3B,UAAU,GAAG,GAAG,MAAM,oCAAoC,YAAY,EAAE,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,MAAM,IAAI,YAAY,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,yEAAyE;QACzE,uEAAuE;QACvE,EAAE;QACF,6EAA6E;QAC7E,eAAe;QACf,8BAA8B;QAC9B,mBAAmB;QACnB,+BAA+B;QAC/B,kBAAkB;QAClB,mBAAmB;QACnB,0BAA0B;QAC1B,EAAE;QACF,kFAAkF;QAClF,2EAA2E;QAC3E,uDAAuD;QACvD,+DAA+D;KAChE,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,gDAAgD,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iCAAiC,GAAG,MAAM,CAAC;AAExD,oEAAoE;AACpE,MAAM,UAAU,2BAA2B,CACzC,UAAkB,EAClB,MAAM,GAAG,iCAAiC;IAE1C,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,UAAU,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IAChC,OAAO,CACL,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QACzB,wDAAwD;QACxD,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -27,4 +27,6 @@ export interface ConfirmPort {
|
|
|
27
27
|
export declare function restoreInteractiveStdin(): void;
|
|
28
28
|
export declare const inquirerConfirmPort: ConfirmPort;
|
|
29
29
|
export declare function ensurePentestAuthorization(call: ToolCall, autoConfirm: boolean, session: SessionPolicy, confirmPort: ConfirmPort): Promise<boolean>;
|
|
30
|
-
export declare function confirmToolExecution(call: ToolCall, autoConfirm: boolean, session: SessionPolicy, confirmPort: ConfirmPort
|
|
30
|
+
export declare function confirmToolExecution(call: ToolCall, autoConfirm: boolean, session: SessionPolicy, confirmPort: ConfirmPort, options?: {
|
|
31
|
+
forceConfirm?: boolean | undefined;
|
|
32
|
+
}): Promise<boolean>;
|
|
@@ -76,7 +76,11 @@ export async function ensurePentestAuthorization(call, autoConfirm, session, con
|
|
|
76
76
|
session.pentestAuthorized.value = true;
|
|
77
77
|
return true;
|
|
78
78
|
}
|
|
79
|
-
export async function confirmToolExecution(call, autoConfirm, session, confirmPort) {
|
|
79
|
+
export async function confirmToolExecution(call, autoConfirm, session, confirmPort, options) {
|
|
80
|
+
// Outside-cwd writes / deletes always prompt — even under allow-all / -y.
|
|
81
|
+
if (options?.forceConfirm) {
|
|
82
|
+
return confirmPort.confirmTool(call);
|
|
83
|
+
}
|
|
80
84
|
const config = getConfig();
|
|
81
85
|
if (config.permissions === "allow-all")
|
|
82
86
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { redactSecrets } from "../llm/provider.js";
|
|
2
2
|
import { stripThinking } from "../ui/thinking.js";
|
|
3
|
+
import { expandKeepStartForToolPairs } from "./tool-history.js";
|
|
4
|
+
import { buildCompactionUserPrompt, trimTranscriptForCompaction, } from "./compaction-summary.js";
|
|
3
5
|
/**
|
|
4
6
|
* Per-char token estimator. Real tokenization varies by provider, but for
|
|
5
7
|
* budgeting a chars/3.3 heuristic is close enough for mixed text/code/JSON
|
|
@@ -66,8 +68,10 @@ export function compactMessages(messages, options = {}) {
|
|
|
66
68
|
head.push(messages[0]);
|
|
67
69
|
start = 1;
|
|
68
70
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
+
let tailStart = Math.max(start, messages.length - keepRecent);
|
|
72
|
+
tailStart = expandKeepStartForToolPairs(messages, tailStart);
|
|
73
|
+
const tail = messages.slice(tailStart);
|
|
74
|
+
const middle = messages.slice(start, tailStart);
|
|
71
75
|
if (middle.length === 0)
|
|
72
76
|
return messages;
|
|
73
77
|
const bullets = [];
|
|
@@ -79,6 +83,9 @@ export function compactMessages(messages, options = {}) {
|
|
|
79
83
|
const line = oneLine(msg.content, 200);
|
|
80
84
|
if (line)
|
|
81
85
|
bullets.push(`- assistant: ${line}`);
|
|
86
|
+
if (msg.toolCalls?.length) {
|
|
87
|
+
bullets.push(`- assistant tools: ${msg.toolCalls.map((t) => t.name).join(", ")}`);
|
|
88
|
+
}
|
|
82
89
|
}
|
|
83
90
|
else if (msg.role === "tool") {
|
|
84
91
|
bullets.push(`- tool result: ${oneLine(msg.content, 200)}`);
|
|
@@ -106,12 +113,14 @@ export async function compactMessagesWithSummary(messages, summarize, options =
|
|
|
106
113
|
let keepRecent = Math.max(2, options.keepRecent ?? DEFAULT_KEEP_RECENT);
|
|
107
114
|
const start = messages[0]?.role === "system" ? 1 : 0;
|
|
108
115
|
let tailStart = Math.max(start, messages.length - keepRecent);
|
|
116
|
+
tailStart = expandKeepStartForToolPairs(messages, tailStart);
|
|
109
117
|
let older = messages.slice(start, tailStart);
|
|
110
118
|
// If forced and the older slice would be empty, try keeping fewer recent
|
|
111
119
|
// messages (minimum 1) so we have something to compact (e.g. the first user prompt).
|
|
112
120
|
if (older.length === 0 && isForced && messages.length >= start + 2) {
|
|
113
121
|
keepRecent = 1;
|
|
114
122
|
tailStart = messages.length - 1;
|
|
123
|
+
tailStart = expandKeepStartForToolPairs(messages, tailStart);
|
|
115
124
|
older = messages.slice(start, tailStart);
|
|
116
125
|
}
|
|
117
126
|
if (older.length === 0 && !sessionTranscript?.trim()) {
|
|
@@ -128,40 +137,60 @@ export async function compactMessagesWithSummary(messages, summarize, options =
|
|
|
128
137
|
const messageTranscript = older
|
|
129
138
|
.map((message) => {
|
|
130
139
|
let content = redactSecrets(message.content);
|
|
131
|
-
// Strip <think> tags from assistant messages so thinking content
|
|
132
|
-
// never leaks into the compaction summary or model context.
|
|
133
140
|
if (message.role === "assistant") {
|
|
134
141
|
content = stripThinking(content).visible;
|
|
135
142
|
}
|
|
143
|
+
if (message.toolCalls?.length) {
|
|
144
|
+
content +=
|
|
145
|
+
"\n[tools: " +
|
|
146
|
+
message.toolCalls.map((t) => t.name).join(", ") +
|
|
147
|
+
"]";
|
|
148
|
+
}
|
|
136
149
|
return `${message.role.toUpperCase()}: ${content}`;
|
|
137
150
|
})
|
|
138
151
|
.join("\n\n");
|
|
139
|
-
// Prefer combining visual session material (tools/prompts) with older model
|
|
140
|
-
// turns so /compact after /history + new messages never loses either side.
|
|
141
152
|
const visual = sessionTranscript?.trim()
|
|
142
153
|
? redactSecrets(sessionTranscript.trim())
|
|
143
154
|
: "";
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
"
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
155
|
+
const isDurableSystem = (content) => content.startsWith("ACTIVE PLAN") ||
|
|
156
|
+
content.startsWith("SESSION STATE") ||
|
|
157
|
+
content.startsWith("ENGAGEMENT SCOPE") ||
|
|
158
|
+
content.startsWith("TASK ANALYSIS") ||
|
|
159
|
+
content.includes("\nACTIVE PLAN") ||
|
|
160
|
+
content.includes("SESSION STATE / WORKING MEMORY");
|
|
161
|
+
const durableBits = messages
|
|
162
|
+
.filter((m) => m.role === "system" && isDurableSystem(m.content))
|
|
163
|
+
.map((m) => {
|
|
164
|
+
// Large system prompts: extract only durable subsections when present.
|
|
165
|
+
if (m.content.length > 4_000) {
|
|
166
|
+
const chunks = [];
|
|
167
|
+
for (const marker of [
|
|
168
|
+
"ACTIVE PLAN",
|
|
169
|
+
"SESSION STATE / WORKING MEMORY",
|
|
170
|
+
"ENGAGEMENT SCOPE",
|
|
171
|
+
"TASK ANALYSIS",
|
|
172
|
+
]) {
|
|
173
|
+
const idx = m.content.indexOf(marker);
|
|
174
|
+
if (idx >= 0)
|
|
175
|
+
chunks.push(m.content.slice(idx, idx + 2_500));
|
|
176
|
+
}
|
|
177
|
+
return chunks.join("\n\n") || m.content.slice(0, 2_000);
|
|
178
|
+
}
|
|
179
|
+
return m.content;
|
|
180
|
+
})
|
|
181
|
+
.filter(Boolean)
|
|
182
|
+
.join("\n\n");
|
|
183
|
+
const rawCombined = buildCompactionUserPrompt({
|
|
184
|
+
visualTranscript: visual || undefined,
|
|
185
|
+
messageTranscript,
|
|
186
|
+
durableState: durableBits || undefined,
|
|
187
|
+
});
|
|
188
|
+
const prompt = trimTranscriptForCompaction(rawCombined);
|
|
161
189
|
const rawSummary = redactSecrets((await summarize(prompt)).trim());
|
|
162
190
|
const summary = stripThinking(rawSummary).visible.trim();
|
|
163
|
-
if (!summary)
|
|
191
|
+
if (!summary) {
|
|
164
192
|
throw new Error("compaction failed: model returned an empty summary");
|
|
193
|
+
}
|
|
165
194
|
const head = start === 1 ? [messages[0]] : [];
|
|
166
195
|
// Strip <think> tags from tail messages so thinking content never
|
|
167
196
|
// survives compaction into the model's context.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/agent/context-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/agent/context-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/events.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { SessionPlan } from "../store/plan.js";
|
|
2
|
+
import type { TurnOutcome } from "./turn-outcome.js";
|
|
2
3
|
export type AgentEvent = {
|
|
3
4
|
type: "turn-start";
|
|
4
5
|
prompt: string;
|
|
6
|
+
/** Chat YOU bubble text; null/empty = hide system choreography from transcript. */
|
|
7
|
+
displayPrompt?: string | null;
|
|
5
8
|
} | {
|
|
6
9
|
type: "status";
|
|
7
10
|
text: string;
|
|
@@ -45,6 +48,8 @@ export type AgentEvent = {
|
|
|
45
48
|
exitCode?: number;
|
|
46
49
|
summary: string;
|
|
47
50
|
artifactPath?: string;
|
|
51
|
+
/** Cursor-style file diffs for fs.* mutation tools. */
|
|
52
|
+
fileChanges?: import("../tools/file-diff.js").FileChange[] | undefined;
|
|
48
53
|
} | {
|
|
49
54
|
type: "tool-blocked";
|
|
50
55
|
id: string;
|
|
@@ -60,6 +65,7 @@ export type AgentEvent = {
|
|
|
60
65
|
prompt: string;
|
|
61
66
|
} | {
|
|
62
67
|
type: "turn-end";
|
|
68
|
+
outcome: TurnOutcome;
|
|
63
69
|
finalAnswer: string;
|
|
64
70
|
steps: number;
|
|
65
71
|
} | {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type ProgressSignal = "none" | "activity" | "evidence" | "completion";
|
|
2
|
+
export type GovernorRecommendation = "continue" | "reflect" | "paused_budget" | "succeeded";
|
|
3
|
+
export interface GovernorState {
|
|
4
|
+
readonly schemaVersion: 2;
|
|
5
|
+
readonly steps: number;
|
|
6
|
+
readonly evidenceTotal: number;
|
|
7
|
+
readonly hypothesisTotal: number;
|
|
8
|
+
readonly consecutiveNoDelta: number;
|
|
9
|
+
readonly resourcesUsed: number;
|
|
10
|
+
}
|
|
11
|
+
export interface GovernorPolicy {
|
|
12
|
+
/** Normal operating envelope. Crossing it prompts reflection, not success or an automatic stop. */
|
|
13
|
+
readonly resourceEnvelope: number;
|
|
14
|
+
/** Absolute resource limit. Reaching it pauses the turn. */
|
|
15
|
+
readonly emergencyCeiling: number;
|
|
16
|
+
readonly reflectionAfterNoDelta: number;
|
|
17
|
+
readonly pauseAfterNoDelta: number;
|
|
18
|
+
readonly repetitionThreshold: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ProgressMetrics {
|
|
21
|
+
readonly evidenceDelta?: number;
|
|
22
|
+
readonly hypothesisDelta?: number;
|
|
23
|
+
/** Normalized score from 0 (novel) to 1 (identical repetition). */
|
|
24
|
+
readonly repetitionScore?: number;
|
|
25
|
+
readonly resourceCost?: number;
|
|
26
|
+
readonly policy?: GovernorPolicy;
|
|
27
|
+
}
|
|
28
|
+
export interface GovernorDecision {
|
|
29
|
+
readonly state: GovernorState;
|
|
30
|
+
readonly shouldContinue: boolean;
|
|
31
|
+
readonly requireEvidence: boolean;
|
|
32
|
+
readonly recommendation: GovernorRecommendation;
|
|
33
|
+
readonly reason: string;
|
|
34
|
+
}
|
|
35
|
+
export declare const DEFAULT_GOVERNOR_POLICY: GovernorPolicy;
|
|
36
|
+
export declare function createGovernorState(): GovernorState;
|
|
37
|
+
export declare function governProgress(state: GovernorState, signal: ProgressSignal, metrics?: ProgressMetrics): GovernorDecision;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export const DEFAULT_GOVERNOR_POLICY = {
|
|
2
|
+
resourceEnvelope: 12,
|
|
3
|
+
emergencyCeiling: 20,
|
|
4
|
+
reflectionAfterNoDelta: 2,
|
|
5
|
+
pauseAfterNoDelta: 4,
|
|
6
|
+
repetitionThreshold: 0.8,
|
|
7
|
+
};
|
|
8
|
+
export function createGovernorState() {
|
|
9
|
+
return {
|
|
10
|
+
schemaVersion: 2,
|
|
11
|
+
steps: 0,
|
|
12
|
+
evidenceTotal: 0,
|
|
13
|
+
hypothesisTotal: 0,
|
|
14
|
+
consecutiveNoDelta: 0,
|
|
15
|
+
resourcesUsed: 0,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function validatePolicy(policy) {
|
|
19
|
+
const integers = [policy.resourceEnvelope, policy.emergencyCeiling, policy.reflectionAfterNoDelta, policy.pauseAfterNoDelta];
|
|
20
|
+
if (integers.some((value) => !Number.isInteger(value) || value < 1))
|
|
21
|
+
throw new Error("governor limits must be positive integers");
|
|
22
|
+
if (policy.emergencyCeiling < policy.resourceEnvelope)
|
|
23
|
+
throw new Error("emergencyCeiling must be at least resourceEnvelope");
|
|
24
|
+
if (policy.pauseAfterNoDelta < policy.reflectionAfterNoDelta)
|
|
25
|
+
throw new Error("pauseAfterNoDelta must be at least reflectionAfterNoDelta");
|
|
26
|
+
if (policy.repetitionThreshold < 0 || policy.repetitionThreshold > 1)
|
|
27
|
+
throw new Error("repetitionThreshold must be between 0 and 1");
|
|
28
|
+
}
|
|
29
|
+
export function governProgress(state, signal, metrics = {}) {
|
|
30
|
+
const policy = metrics.policy ?? DEFAULT_GOVERNOR_POLICY;
|
|
31
|
+
validatePolicy(policy);
|
|
32
|
+
const evidenceDelta = metrics.evidenceDelta ?? (signal === "evidence" ? 1 : 0);
|
|
33
|
+
const hypothesisDelta = metrics.hypothesisDelta ?? 0;
|
|
34
|
+
const repetitionScore = metrics.repetitionScore ?? 0;
|
|
35
|
+
const resourceCost = metrics.resourceCost ?? 1;
|
|
36
|
+
if (evidenceDelta < 0 || hypothesisDelta < 0 || resourceCost < 0)
|
|
37
|
+
throw new Error("progress deltas and resourceCost must be non-negative");
|
|
38
|
+
if (repetitionScore < 0 || repetitionScore > 1)
|
|
39
|
+
throw new Error("repetitionScore must be between 0 and 1");
|
|
40
|
+
const productive = evidenceDelta > 0 || hypothesisDelta > 0;
|
|
41
|
+
const repetitiveNoDelta = !productive && repetitionScore >= policy.repetitionThreshold;
|
|
42
|
+
const next = {
|
|
43
|
+
schemaVersion: 2,
|
|
44
|
+
steps: state.steps + 1,
|
|
45
|
+
evidenceTotal: state.evidenceTotal + evidenceDelta,
|
|
46
|
+
hypothesisTotal: state.hypothesisTotal + hypothesisDelta,
|
|
47
|
+
consecutiveNoDelta: productive ? 0 : state.consecutiveNoDelta + 1,
|
|
48
|
+
resourcesUsed: state.resourcesUsed + resourceCost,
|
|
49
|
+
};
|
|
50
|
+
if (next.resourcesUsed >= policy.emergencyCeiling) {
|
|
51
|
+
return { state: next, shouldContinue: false, requireEvidence: true, recommendation: "paused_budget", reason: "emergency resource ceiling reached" };
|
|
52
|
+
}
|
|
53
|
+
if (signal === "completion" && evidenceDelta > 0) {
|
|
54
|
+
return { state: next, shouldContinue: false, requireEvidence: false, recommendation: "succeeded", reason: "completion supported by new evidence" };
|
|
55
|
+
}
|
|
56
|
+
if (signal === "completion") {
|
|
57
|
+
return { state: next, shouldContinue: true, requireEvidence: true, recommendation: "reflect", reason: "completion requires new evidence" };
|
|
58
|
+
}
|
|
59
|
+
if (repetitiveNoDelta && next.consecutiveNoDelta >= policy.pauseAfterNoDelta) {
|
|
60
|
+
return { state: next, shouldContinue: false, requireEvidence: true, recommendation: "paused_budget", reason: "repetitive work produced no evidence or hypothesis progress" };
|
|
61
|
+
}
|
|
62
|
+
if (repetitiveNoDelta && next.consecutiveNoDelta >= policy.reflectionAfterNoDelta) {
|
|
63
|
+
return { state: next, shouldContinue: true, requireEvidence: true, recommendation: "reflect", reason: "repetitive work requires reflection" };
|
|
64
|
+
}
|
|
65
|
+
if (next.resourcesUsed >= policy.resourceEnvelope) {
|
|
66
|
+
return { state: next, shouldContinue: true, requireEvidence: !productive, recommendation: "reflect", reason: "resource envelope reached; reassess before continuing" };
|
|
67
|
+
}
|
|
68
|
+
return { state: next, shouldContinue: true, requireEvidence: false, recommendation: "continue", reason: productive ? "productive progress recorded" : "within resource envelope" };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=evidence-governor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-governor.js","sourceRoot":"","sources":["../../src/agent/evidence-governor.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,31 @@ export interface ToolAttempt {
|
|
|
9
9
|
* Track and detect tool-call repetition patterns so the agent doesn't
|
|
10
10
|
* waste steps in loops.
|
|
11
11
|
*/
|
|
12
|
+
export interface LoopGuardOptions {
|
|
13
|
+
/** @deprecated Retry authorization belongs in RetryContext passed to shouldBlock. */
|
|
14
|
+
allowUnlimitedFailedRetries?: boolean;
|
|
15
|
+
/** @deprecated Unchanged failed retries are blocked immediately. */
|
|
16
|
+
failedRetryLimit?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface RetryContext {
|
|
19
|
+
/** A dependency changed since the failed attempt. */
|
|
20
|
+
dependenciesChanged?: boolean;
|
|
21
|
+
/** The execution environment changed since the failed attempt. */
|
|
22
|
+
environmentChanged?: boolean;
|
|
23
|
+
/** Structured justification for retrying without an external change. */
|
|
24
|
+
retryReason?: {
|
|
25
|
+
code: string;
|
|
26
|
+
detail: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
12
29
|
export declare class LoopGuard {
|
|
13
30
|
private attempts;
|
|
14
31
|
private signatureCount;
|
|
15
32
|
private signatureSuccess;
|
|
33
|
+
/** Failed read-only signatures that already used their one free env-change retry. */
|
|
34
|
+
private failedReadRetryUsed;
|
|
35
|
+
private lastSuccessfulNonMetaStep;
|
|
36
|
+
constructor(_options?: LoopGuardOptions);
|
|
16
37
|
/**
|
|
17
38
|
* Produce a canonical string for a (name, args) pair so that calls
|
|
18
39
|
* with identical semantics match even if arg order differs or
|
|
@@ -20,6 +41,9 @@ export declare class LoopGuard {
|
|
|
20
41
|
*/
|
|
21
42
|
canonicalize(name: string, args: Record<string, unknown>): string;
|
|
22
43
|
recordAttempt(step: number, name: string, args: Record<string, unknown>, ok: boolean, exitCode?: number | undefined): void;
|
|
44
|
+
private isPathMutatingTool;
|
|
45
|
+
/** Drop list/read signatures that touch paths a successful tool may have created. */
|
|
46
|
+
private invalidateReadsAfterSuccess;
|
|
23
47
|
/**
|
|
24
48
|
* Check whether the proposed call should be blocked as a repeat.
|
|
25
49
|
*
|
|
@@ -27,16 +51,12 @@ export declare class LoopGuard {
|
|
|
27
51
|
* `{ block: false, reason: "..." }` for a warning (first repeat), or
|
|
28
52
|
* `{ block: true, reason: "..." }` to force summary (second+ repeat).
|
|
29
53
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* Read-only tools (web.fetch, fs.read, etc.) get a higher threshold (3)
|
|
36
|
-
* because they may legitimately need re-calling after context compaction
|
|
37
|
-
* removes their results.
|
|
54
|
+
* Failed read-only tools may retry once after any successful intervening
|
|
55
|
+
* non-meta work (e.g. list missing dir → scaffold → list again). Failed
|
|
56
|
+
* mutates still need structured retry context or a changed path.
|
|
57
|
+
* Successful identical mutates are still deduped.
|
|
38
58
|
*/
|
|
39
|
-
shouldBlock(name: string, args: Record<string, unknown
|
|
59
|
+
shouldBlock(name: string, args: Record<string, unknown>, retryContext?: RetryContext): {
|
|
40
60
|
block: boolean;
|
|
41
61
|
reason?: string | undefined;
|
|
42
62
|
};
|