@prestyj/cli 5.12.0 → 5.16.0
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 +51 -36
- package/assets/skills/bulletproof/SKILL.md +158 -0
- package/assets/skills/bulletproof/references/agent-surface.md +82 -0
- package/assets/skills/bulletproof/references/audit-protocol.md +147 -0
- package/assets/skills/bulletproof/references/platform-playbooks.md +176 -0
- package/assets/skills/bulletproof/references/provenance.md +45 -0
- package/assets/skills/bulletproof/references/secure-defaults.md +108 -0
- package/assets/skills/bulletproof/references/supply-chain.md +76 -0
- package/assets/skills/bulletproof/references/threat-landscape.md +74 -0
- package/assets/skills/bulletproof/references/verification.md +65 -0
- package/assets/skills/clarify/SKILL.md +30 -0
- package/assets/skills/code-review/SKILL.md +30 -0
- package/assets/skills/durable/SKILL.md +111 -0
- package/assets/skills/durable/references/backups-and-runtime.md +86 -0
- package/assets/skills/durable/references/migrations-and-schema.md +79 -0
- package/assets/skills/lean/SKILL.md +110 -0
- package/assets/skills/lean/references/memory-and-processes.md +98 -0
- package/assets/skills/lean/references/playbooks.md +107 -0
- package/assets/skills/root-cause/SKILL.md +36 -0
- package/assets/skills/shared-language/SKILL.md +30 -0
- package/assets/skills/tdd/SKILL.md +30 -0
- package/dist/app-sidecar.js +486 -95
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/research.d.ts +1 -1
- package/dist/chat-agents/research.d.ts.map +1 -1
- package/dist/chat-agents/research.js +1 -1
- package/dist/chat-agents/research.js.map +1 -1
- package/dist/cli/mcp.js +30 -10
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/shared.d.ts.map +1 -1
- package/dist/cli/shared.js +2 -0
- package/dist/cli/shared.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +65 -4
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +281 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +2 -3
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +4 -5
- package/dist/core/agents.js.map +1 -1
- package/dist/core/api-benchmark.d.ts +1 -1
- package/dist/core/api-benchmark.js +2 -2
- package/dist/core/ask-user.d.ts +63 -0
- package/dist/core/ask-user.d.ts.map +1 -0
- package/dist/core/ask-user.js +40 -0
- package/dist/core/ask-user.js.map +1 -0
- package/dist/core/auth-providers.d.ts +6 -0
- package/dist/core/auth-providers.d.ts.map +1 -1
- package/dist/core/auth-providers.js +30 -24
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/bundled-agents.d.ts.map +1 -1
- package/dist/core/bundled-agents.js +17 -5
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/context-limits.d.ts +35 -0
- package/dist/core/context-limits.d.ts.map +1 -0
- package/dist/core/context-limits.js +35 -0
- package/dist/core/context-limits.js.map +1 -0
- package/dist/core/env-delta.d.ts +27 -0
- package/dist/core/env-delta.d.ts.map +1 -0
- package/dist/core/env-delta.js +65 -0
- package/dist/core/env-delta.js.map +1 -0
- package/dist/core/event-bus.d.ts +12 -2
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +1 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-worker.js +1 -1
- package/dist/core/goal-worker.js.map +1 -1
- package/dist/core/hashline-edit-benchmark.d.ts +2 -0
- package/dist/core/hashline-edit-benchmark.d.ts.map +1 -1
- package/dist/core/hashline-edit-benchmark.js +5 -1
- package/dist/core/hashline-edit-benchmark.js.map +1 -1
- package/dist/core/lsp/edit-telemetry.d.ts +27 -0
- package/dist/core/lsp/edit-telemetry.d.ts.map +1 -0
- package/dist/core/lsp/edit-telemetry.js +50 -0
- package/dist/core/lsp/edit-telemetry.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +24 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +53 -2
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/mcp/client.js +1 -1
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/content.d.ts +5 -0
- package/dist/core/mcp/content.d.ts.map +1 -1
- package/dist/core/mcp/content.js +20 -2
- package/dist/core/mcp/content.js.map +1 -1
- package/dist/core/mcp/defaults.d.ts +7 -3
- package/dist/core/mcp/defaults.d.ts.map +1 -1
- package/dist/core/mcp/defaults.js +19 -14
- package/dist/core/mcp/defaults.js.map +1 -1
- package/dist/core/mcp/deferred-catalog.d.ts +9 -0
- package/dist/core/mcp/deferred-catalog.d.ts.map +1 -1
- package/dist/core/mcp/deferred-catalog.js +15 -1
- package/dist/core/mcp/deferred-catalog.js.map +1 -1
- package/dist/core/mcp/elicitation-bridge.d.ts.map +1 -1
- package/dist/core/mcp/elicitation-bridge.js +12 -28
- package/dist/core/mcp/elicitation-bridge.js.map +1 -1
- package/dist/core/mcp/shared-pool.d.ts +2 -2
- package/dist/core/mcp/shared-pool.js +2 -2
- package/dist/core/nolan-prompt.d.ts +1 -1
- package/dist/core/nolan-prompt.js +16 -8
- package/dist/core/nolan-prompt.js.map +1 -1
- package/dist/core/parked-requests.d.ts +44 -0
- package/dist/core/parked-requests.d.ts.map +1 -0
- package/dist/core/parked-requests.js +34 -0
- package/dist/core/parked-requests.js.map +1 -0
- package/dist/core/platform-clis.d.ts +16 -0
- package/dist/core/platform-clis.d.ts.map +1 -0
- package/dist/core/platform-clis.js +299 -0
- package/dist/core/platform-clis.js.map +1 -0
- package/dist/core/process-manager.d.ts +50 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +155 -4
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +75 -37
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/sandbox.d.ts +17 -1
- package/dist/core/sandbox.d.ts.map +1 -1
- package/dist/core/sandbox.js +140 -9
- package/dist/core/sandbox.js.map +1 -1
- package/dist/core/session-manager.d.ts +18 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +62 -23
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +22 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +64 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +16 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +38 -6
- package/dist/core/skills.js.map +1 -1
- package/dist/core/steroids.d.ts +59 -0
- package/dist/core/steroids.d.ts.map +1 -0
- package/dist/core/steroids.js +227 -0
- package/dist/core/steroids.js.map +1 -0
- package/dist/core/subagent-manager.d.ts +17 -0
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +92 -1
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-turn-record.d.ts +17 -0
- package/dist/core/subagent-turn-record.d.ts.map +1 -0
- package/dist/core/subagent-turn-record.js +82 -0
- package/dist/core/subagent-turn-record.js.map +1 -0
- package/dist/core/verification-gate.d.ts +123 -0
- package/dist/core/verification-gate.d.ts.map +1 -0
- package/dist/core/verification-gate.js +446 -0
- package/dist/core/verification-gate.js.map +1 -0
- package/dist/core/workspace-guard.d.ts +6 -0
- package/dist/core/workspace-guard.d.ts.map +1 -1
- package/dist/core/workspace-guard.js +58 -7
- package/dist/core/workspace-guard.js.map +1 -1
- package/dist/hf-pull.d.ts +102 -0
- package/dist/hf-pull.d.ts.map +1 -0
- package/dist/hf-pull.js +225 -0
- package/dist/hf-pull.js.map +1 -0
- package/dist/modes/json-mode.d.ts +2 -2
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +2 -8
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +66 -18
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +5 -2
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +136 -36
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/ask-user.d.ts +35 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +157 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/bash.d.ts +4 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +63 -4
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +2 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +58 -9
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/operations.d.ts +48 -0
- package/dist/tools/operations.d.ts.map +1 -1
- package/dist/tools/operations.js +92 -2
- package/dist/tools/operations.js.map +1 -1
- package/dist/tools/path-utils.d.ts +28 -1
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js +44 -2
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +8 -6
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read-only-bash.d.ts +6 -0
- package/dist/tools/read-only-bash.d.ts.map +1 -1
- package/dist/tools/read-only-bash.js +168 -9
- package/dist/tools/read-only-bash.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +35 -3
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/skill.d.ts +3 -2
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +11 -7
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/steroids.d.ts +46 -0
- package/dist/tools/steroids.d.ts.map +1 -0
- package/dist/tools/steroids.js +233 -0
- package/dist/tools/steroids.js.map +1 -0
- package/dist/tools/subagent-shared.d.ts +1 -1
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +1 -4
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent.js +1 -1
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/tool-search.d.ts +2 -1
- package/dist/tools/tool-search.d.ts.map +1 -1
- package/dist/tools/tool-search.js +28 -3
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts.map +1 -1
- package/dist/tools/tool-tiers.js +5 -0
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +7 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +308 -20
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/write.d.ts +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +1 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/App.d.ts +3 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +56 -30
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +5 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +5 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/Footer.js +1 -1
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/ModelSelector.d.ts.map +1 -1
- package/dist/ui/components/ModelSelector.js +1 -0
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +10 -3
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/login.d.ts.map +1 -1
- package/dist/ui/login.js +5 -33
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/prompt-routing.d.ts +2 -2
- package/dist/ui/prompt-routing.d.ts.map +1 -1
- package/dist/ui/prompt-routing.js +20 -8
- package/dist/ui/prompt-routing.js.map +1 -1
- package/dist/ui/submit-prompt-command.d.ts.map +1 -1
- package/dist/ui/submit-prompt-command.js +1 -1
- package/dist/ui/submit-prompt-command.js.map +1 -1
- package/dist/ui/terminal-history.js +4 -2
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/tool-group-summary.d.ts +2 -0
- package/dist/ui/tool-group-summary.d.ts.map +1 -1
- package/dist/ui/tool-group-summary.js +11 -25
- package/dist/ui/tool-group-summary.js.map +1 -1
- package/dist/ui/tool-line-summary.d.ts.map +1 -1
- package/dist/ui/tool-line-summary.js +12 -9
- package/dist/ui/tool-line-summary.js.map +1 -1
- package/dist/ui/transcript/tool-presentation.d.ts.map +1 -1
- package/dist/ui/transcript/tool-presentation.js +2 -7
- package/dist/ui/transcript/tool-presentation.js.map +1 -1
- package/dist/ui/utils/text-utils.d.ts +0 -6
- package/dist/ui/utils/text-utils.d.ts.map +1 -1
- package/dist/ui/utils/text-utils.js +8 -3
- package/dist/ui/utils/text-utils.js.map +1 -1
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/text.d.ts +41 -0
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +46 -0
- package/dist/utils/text.js.map +1 -1
- package/package.json +7 -8
- package/dist/app-sidecar-auth-broadcast.test.d.ts +0 -2
- package/dist/app-sidecar-auth-broadcast.test.d.ts.map +0 -1
- package/dist/app-sidecar-auth-broadcast.test.js +0 -348
- package/dist/app-sidecar-auth-broadcast.test.js.map +0 -1
- package/dist/app-sidecar-sessions.test.d.ts +0 -2
- package/dist/app-sidecar-sessions.test.d.ts.map +0 -1
- package/dist/app-sidecar-sessions.test.js +0 -178
- package/dist/app-sidecar-sessions.test.js.map +0 -1
- package/dist/chat-agents/general.test.d.ts +0 -2
- package/dist/chat-agents/general.test.d.ts.map +0 -1
- package/dist/chat-agents/general.test.js +0 -52
- package/dist/chat-agents/general.test.js.map +0 -1
- package/dist/chat-agents/jiwa.test.d.ts +0 -2
- package/dist/chat-agents/jiwa.test.d.ts.map +0 -1
- package/dist/chat-agents/jiwa.test.js +0 -66
- package/dist/chat-agents/jiwa.test.js.map +0 -1
- package/dist/chat-agents/memory.test.d.ts +0 -2
- package/dist/chat-agents/memory.test.d.ts.map +0 -1
- package/dist/chat-agents/memory.test.js +0 -165
- package/dist/chat-agents/memory.test.js.map +0 -1
- package/dist/chat-agents/specialists.test.d.ts +0 -2
- package/dist/chat-agents/specialists.test.d.ts.map +0 -1
- package/dist/chat-agents/specialists.test.js +0 -98
- package/dist/chat-agents/specialists.test.js.map +0 -1
- package/dist/cli/command-routing.test.d.ts +0 -2
- package/dist/cli/command-routing.test.d.ts.map +0 -1
- package/dist/cli/command-routing.test.js +0 -61
- package/dist/cli/command-routing.test.js.map +0 -1
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -123
- package/dist/config.test.js.map +0 -1
- package/dist/core/agent-mcp-passthrough.test.d.ts +0 -2
- package/dist/core/agent-mcp-passthrough.test.d.ts.map +0 -1
- package/dist/core/agent-mcp-passthrough.test.js +0 -61
- package/dist/core/agent-mcp-passthrough.test.js.map +0 -1
- package/dist/core/agent-notifications.test.d.ts +0 -2
- package/dist/core/agent-notifications.test.d.ts.map +0 -1
- package/dist/core/agent-notifications.test.js +0 -97
- package/dist/core/agent-notifications.test.js.map +0 -1
- package/dist/core/agent-session-add-dir.test.d.ts +0 -2
- package/dist/core/agent-session-add-dir.test.d.ts.map +0 -1
- package/dist/core/agent-session-add-dir.test.js +0 -110
- package/dist/core/agent-session-add-dir.test.js.map +0 -1
- package/dist/core/agent-session-checkpoint-flush.test.d.ts +0 -2
- package/dist/core/agent-session-checkpoint-flush.test.d.ts.map +0 -1
- package/dist/core/agent-session-checkpoint-flush.test.js +0 -201
- package/dist/core/agent-session-checkpoint-flush.test.js.map +0 -1
- package/dist/core/agent-session-compaction.test.d.ts +0 -2
- package/dist/core/agent-session-compaction.test.d.ts.map +0 -1
- package/dist/core/agent-session-compaction.test.js +0 -1096
- package/dist/core/agent-session-compaction.test.js.map +0 -1
- package/dist/core/agent-session-crash-durability.test.d.ts +0 -2
- package/dist/core/agent-session-crash-durability.test.d.ts.map +0 -1
- package/dist/core/agent-session-crash-durability.test.js +0 -102
- package/dist/core/agent-session-crash-durability.test.js.map +0 -1
- package/dist/core/agent-session-marker-anchors.test.d.ts +0 -2
- package/dist/core/agent-session-marker-anchors.test.d.ts.map +0 -1
- package/dist/core/agent-session-marker-anchors.test.js +0 -326
- package/dist/core/agent-session-marker-anchors.test.js.map +0 -1
- package/dist/core/agent-session-memory-tail.test.d.ts +0 -2
- package/dist/core/agent-session-memory-tail.test.d.ts.map +0 -1
- package/dist/core/agent-session-memory-tail.test.js +0 -119
- package/dist/core/agent-session-memory-tail.test.js.map +0 -1
- package/dist/core/agent-session-model-switch.test.d.ts +0 -2
- package/dist/core/agent-session-model-switch.test.d.ts.map +0 -1
- package/dist/core/agent-session-model-switch.test.js +0 -161
- package/dist/core/agent-session-model-switch.test.js.map +0 -1
- package/dist/core/agent-session-notifications.test.d.ts +0 -2
- package/dist/core/agent-session-notifications.test.d.ts.map +0 -1
- package/dist/core/agent-session-notifications.test.js +0 -114
- package/dist/core/agent-session-notifications.test.js.map +0 -1
- package/dist/core/agent-session-process-gate.test.d.ts +0 -2
- package/dist/core/agent-session-process-gate.test.d.ts.map +0 -1
- package/dist/core/agent-session-process-gate.test.js +0 -98
- package/dist/core/agent-session-process-gate.test.js.map +0 -1
- package/dist/core/agent-session-queue.test.d.ts +0 -2
- package/dist/core/agent-session-queue.test.d.ts.map +0 -1
- package/dist/core/agent-session-queue.test.js +0 -184
- package/dist/core/agent-session-queue.test.js.map +0 -1
- package/dist/core/agent-session-review-coverage.test.d.ts +0 -2
- package/dist/core/agent-session-review-coverage.test.d.ts.map +0 -1
- package/dist/core/agent-session-review-coverage.test.js +0 -140
- package/dist/core/agent-session-review-coverage.test.js.map +0 -1
- package/dist/core/agent-session-slash-restore.test.d.ts +0 -2
- package/dist/core/agent-session-slash-restore.test.d.ts.map +0 -1
- package/dist/core/agent-session-slash-restore.test.js +0 -121
- package/dist/core/agent-session-slash-restore.test.js.map +0 -1
- package/dist/core/agent-session-subagent-policy.test.d.ts +0 -2
- package/dist/core/agent-session-subagent-policy.test.d.ts.map +0 -1
- package/dist/core/agent-session-subagent-policy.test.js +0 -40
- package/dist/core/agent-session-subagent-policy.test.js.map +0 -1
- package/dist/core/agent-session-tool-result-policy.test.d.ts +0 -2
- package/dist/core/agent-session-tool-result-policy.test.d.ts.map +0 -1
- package/dist/core/agent-session-tool-result-policy.test.js +0 -25
- package/dist/core/agent-session-tool-result-policy.test.js.map +0 -1
- package/dist/core/agent-session-tool-tiers.test.d.ts +0 -2
- package/dist/core/agent-session-tool-tiers.test.d.ts.map +0 -1
- package/dist/core/agent-session-tool-tiers.test.js +0 -138
- package/dist/core/agent-session-tool-tiers.test.js.map +0 -1
- package/dist/core/agent-tools-allowlist.test.d.ts +0 -2
- package/dist/core/agent-tools-allowlist.test.d.ts.map +0 -1
- package/dist/core/agent-tools-allowlist.test.js +0 -74
- package/dist/core/agent-tools-allowlist.test.js.map +0 -1
- package/dist/core/agents.test.d.ts +0 -2
- package/dist/core/agents.test.d.ts.map +0 -1
- package/dist/core/agents.test.js +0 -147
- package/dist/core/agents.test.js.map +0 -1
- package/dist/core/auto-update.test.d.ts +0 -2
- package/dist/core/auto-update.test.d.ts.map +0 -1
- package/dist/core/auto-update.test.js +0 -204
- package/dist/core/auto-update.test.js.map +0 -1
- package/dist/core/autopilot-cycle.test.d.ts +0 -2
- package/dist/core/autopilot-cycle.test.d.ts.map +0 -1
- package/dist/core/autopilot-cycle.test.js +0 -375
- package/dist/core/autopilot-cycle.test.js.map +0 -1
- package/dist/core/autopilot-gate.test.d.ts +0 -2
- package/dist/core/autopilot-gate.test.d.ts.map +0 -1
- package/dist/core/autopilot-gate.test.js +0 -295
- package/dist/core/autopilot-gate.test.js.map +0 -1
- package/dist/core/autopilot-verdict.test.d.ts +0 -2
- package/dist/core/autopilot-verdict.test.d.ts.map +0 -1
- package/dist/core/autopilot-verdict.test.js +0 -153
- package/dist/core/autopilot-verdict.test.js.map +0 -1
- package/dist/core/checkpoint-store.test.d.ts +0 -2
- package/dist/core/checkpoint-store.test.d.ts.map +0 -1
- package/dist/core/checkpoint-store.test.js +0 -111
- package/dist/core/checkpoint-store.test.js.map +0 -1
- package/dist/core/code-retrieval-chunkers.test.d.ts +0 -2
- package/dist/core/code-retrieval-chunkers.test.d.ts.map +0 -1
- package/dist/core/code-retrieval-chunkers.test.js +0 -203
- package/dist/core/code-retrieval-chunkers.test.js.map +0 -1
- package/dist/core/compaction/active-context.test.d.ts +0 -2
- package/dist/core/compaction/active-context.test.d.ts.map +0 -1
- package/dist/core/compaction/active-context.test.js +0 -57
- package/dist/core/compaction/active-context.test.js.map +0 -1
- package/dist/core/compaction/compactor.test.d.ts +0 -2
- package/dist/core/compaction/compactor.test.d.ts.map +0 -1
- package/dist/core/compaction/compactor.test.js +0 -1072
- package/dist/core/compaction/compactor.test.js.map +0 -1
- package/dist/core/compaction/policy.test.d.ts +0 -2
- package/dist/core/compaction/policy.test.d.ts.map +0 -1
- package/dist/core/compaction/policy.test.js +0 -35
- package/dist/core/compaction/policy.test.js.map +0 -1
- package/dist/core/compaction/query-aware-selector.test.d.ts +0 -2
- package/dist/core/compaction/query-aware-selector.test.d.ts.map +0 -1
- package/dist/core/compaction/query-aware-selector.test.js +0 -96
- package/dist/core/compaction/query-aware-selector.test.js.map +0 -1
- package/dist/core/compaction/token-estimator.test.d.ts +0 -2
- package/dist/core/compaction/token-estimator.test.d.ts.map +0 -1
- package/dist/core/compaction/token-estimator.test.js +0 -283
- package/dist/core/compaction/token-estimator.test.js.map +0 -1
- package/dist/core/compaction/tool-result-pruner.test.d.ts +0 -2
- package/dist/core/compaction/tool-result-pruner.test.d.ts.map +0 -1
- package/dist/core/compaction/tool-result-pruner.test.js +0 -320
- package/dist/core/compaction/tool-result-pruner.test.js.map +0 -1
- package/dist/core/continue-replay-inventory.test.d.ts +0 -2
- package/dist/core/continue-replay-inventory.test.d.ts.map +0 -1
- package/dist/core/continue-replay-inventory.test.js +0 -42
- package/dist/core/continue-replay-inventory.test.js.map +0 -1
- package/dist/core/encode-cwd.test.d.ts +0 -2
- package/dist/core/encode-cwd.test.d.ts.map +0 -1
- package/dist/core/encode-cwd.test.js +0 -80
- package/dist/core/encode-cwd.test.js.map +0 -1
- package/dist/core/extensions/plugin-bundles.test.d.ts +0 -2
- package/dist/core/extensions/plugin-bundles.test.d.ts.map +0 -1
- package/dist/core/extensions/plugin-bundles.test.js +0 -110
- package/dist/core/extensions/plugin-bundles.test.js.map +0 -1
- package/dist/core/foreign-session-import.test.d.ts +0 -2
- package/dist/core/foreign-session-import.test.d.ts.map +0 -1
- package/dist/core/foreign-session-import.test.js +0 -220
- package/dist/core/foreign-session-import.test.js.map +0 -1
- package/dist/core/goal-controller.test.d.ts +0 -2
- package/dist/core/goal-controller.test.d.ts.map +0 -1
- package/dist/core/goal-controller.test.js +0 -784
- package/dist/core/goal-controller.test.js.map +0 -1
- package/dist/core/goal-lifecycle-smoke.test.d.ts +0 -2
- package/dist/core/goal-lifecycle-smoke.test.d.ts.map +0 -1
- package/dist/core/goal-lifecycle-smoke.test.js +0 -248
- package/dist/core/goal-lifecycle-smoke.test.js.map +0 -1
- package/dist/core/goal-prerequisites.test.d.ts +0 -2
- package/dist/core/goal-prerequisites.test.d.ts.map +0 -1
- package/dist/core/goal-prerequisites.test.js +0 -118
- package/dist/core/goal-prerequisites.test.js.map +0 -1
- package/dist/core/goal-store.test.d.ts +0 -2
- package/dist/core/goal-store.test.d.ts.map +0 -1
- package/dist/core/goal-store.test.js +0 -398
- package/dist/core/goal-store.test.js.map +0 -1
- package/dist/core/goal-verifier.test.d.ts +0 -2
- package/dist/core/goal-verifier.test.d.ts.map +0 -1
- package/dist/core/goal-verifier.test.js +0 -131
- package/dist/core/goal-verifier.test.js.map +0 -1
- package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts +0 -2
- package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts.map +0 -1
- package/dist/core/goal-worker-dev-server-lifecycle.test.js +0 -68
- package/dist/core/goal-worker-dev-server-lifecycle.test.js.map +0 -1
- package/dist/core/goal-worker.test.d.ts +0 -2
- package/dist/core/goal-worker.test.d.ts.map +0 -1
- package/dist/core/goal-worker.test.js +0 -269
- package/dist/core/goal-worker.test.js.map +0 -1
- package/dist/core/hashline-edit-benchmark.test.d.ts +0 -2
- package/dist/core/hashline-edit-benchmark.test.d.ts.map +0 -1
- package/dist/core/hashline-edit-benchmark.test.js +0 -190
- package/dist/core/hashline-edit-benchmark.test.js.map +0 -1
- package/dist/core/ideal-review.test.d.ts +0 -2
- package/dist/core/ideal-review.test.d.ts.map +0 -1
- package/dist/core/ideal-review.test.js +0 -242
- package/dist/core/ideal-review.test.js.map +0 -1
- package/dist/core/input-normalization.test.d.ts +0 -2
- package/dist/core/input-normalization.test.d.ts.map +0 -1
- package/dist/core/input-normalization.test.js +0 -75
- package/dist/core/input-normalization.test.js.map +0 -1
- package/dist/core/json-mode-flag-parity.test.d.ts +0 -2
- package/dist/core/json-mode-flag-parity.test.d.ts.map +0 -1
- package/dist/core/json-mode-flag-parity.test.js +0 -66
- package/dist/core/json-mode-flag-parity.test.js.map +0 -1
- package/dist/core/language-detector.test.d.ts +0 -2
- package/dist/core/language-detector.test.d.ts.map +0 -1
- package/dist/core/language-detector.test.js +0 -109
- package/dist/core/language-detector.test.js.map +0 -1
- package/dist/core/local-endpoint-store.test.d.ts +0 -2
- package/dist/core/local-endpoint-store.test.d.ts.map +0 -1
- package/dist/core/local-endpoint-store.test.js +0 -131
- package/dist/core/local-endpoint-store.test.js.map +0 -1
- package/dist/core/loop-breaker.test.d.ts +0 -2
- package/dist/core/loop-breaker.test.d.ts.map +0 -1
- package/dist/core/loop-breaker.test.js +0 -238
- package/dist/core/loop-breaker.test.js.map +0 -1
- package/dist/core/lsp/client-navigation.test.d.ts +0 -2
- package/dist/core/lsp/client-navigation.test.d.ts.map +0 -1
- package/dist/core/lsp/client-navigation.test.js +0 -135
- package/dist/core/lsp/client-navigation.test.js.map +0 -1
- package/dist/core/lsp/format.test.d.ts +0 -2
- package/dist/core/lsp/format.test.d.ts.map +0 -1
- package/dist/core/lsp/format.test.js +0 -56
- package/dist/core/lsp/format.test.js.map +0 -1
- package/dist/core/lsp/integration.test.d.ts +0 -2
- package/dist/core/lsp/integration.test.d.ts.map +0 -1
- package/dist/core/lsp/integration.test.js +0 -60
- package/dist/core/lsp/integration.test.js.map +0 -1
- package/dist/core/lsp/jsonrpc.test.d.ts +0 -2
- package/dist/core/lsp/jsonrpc.test.d.ts.map +0 -1
- package/dist/core/lsp/jsonrpc.test.js +0 -127
- package/dist/core/lsp/jsonrpc.test.js.map +0 -1
- package/dist/core/lsp/manager-navigation.test.d.ts +0 -2
- package/dist/core/lsp/manager-navigation.test.d.ts.map +0 -1
- package/dist/core/lsp/manager-navigation.test.js +0 -121
- package/dist/core/lsp/manager-navigation.test.js.map +0 -1
- package/dist/core/lsp/manager.test.d.ts +0 -2
- package/dist/core/lsp/manager.test.d.ts.map +0 -1
- package/dist/core/lsp/manager.test.js +0 -220
- package/dist/core/lsp/manager.test.js.map +0 -1
- package/dist/core/lsp/pool.test.d.ts +0 -2
- package/dist/core/lsp/pool.test.d.ts.map +0 -1
- package/dist/core/lsp/pool.test.js +0 -286
- package/dist/core/lsp/pool.test.js.map +0 -1
- package/dist/core/lsp/servers.test.d.ts +0 -2
- package/dist/core/lsp/servers.test.d.ts.map +0 -1
- package/dist/core/lsp/servers.test.js +0 -67
- package/dist/core/lsp/servers.test.js.map +0 -1
- package/dist/core/lsp/uri.test.d.ts +0 -2
- package/dist/core/lsp/uri.test.d.ts.map +0 -1
- package/dist/core/lsp/uri.test.js +0 -56
- package/dist/core/lsp/uri.test.js.map +0 -1
- package/dist/core/lsp/windows.test.d.ts +0 -2
- package/dist/core/lsp/windows.test.d.ts.map +0 -1
- package/dist/core/lsp/windows.test.js +0 -239
- package/dist/core/lsp/windows.test.js.map +0 -1
- package/dist/core/mcp/catalog-cache.test.d.ts +0 -2
- package/dist/core/mcp/catalog-cache.test.d.ts.map +0 -1
- package/dist/core/mcp/catalog-cache.test.js +0 -99
- package/dist/core/mcp/catalog-cache.test.js.map +0 -1
- package/dist/core/mcp/client-session-recovery.test.d.ts +0 -2
- package/dist/core/mcp/client-session-recovery.test.d.ts.map +0 -1
- package/dist/core/mcp/client-session-recovery.test.js +0 -231
- package/dist/core/mcp/client-session-recovery.test.js.map +0 -1
- package/dist/core/mcp/content.test.d.ts +0 -2
- package/dist/core/mcp/content.test.d.ts.map +0 -1
- package/dist/core/mcp/content.test.js +0 -135
- package/dist/core/mcp/content.test.js.map +0 -1
- package/dist/core/mcp/elicitation.test.d.ts +0 -2
- package/dist/core/mcp/elicitation.test.d.ts.map +0 -1
- package/dist/core/mcp/elicitation.test.js +0 -158
- package/dist/core/mcp/elicitation.test.js.map +0 -1
- package/dist/core/mcp/legacy-negotiation.test.d.ts +0 -2
- package/dist/core/mcp/legacy-negotiation.test.d.ts.map +0 -1
- package/dist/core/mcp/legacy-negotiation.test.js +0 -80
- package/dist/core/mcp/legacy-negotiation.test.js.map +0 -1
- package/dist/core/mcp/loopback.test.d.ts +0 -2
- package/dist/core/mcp/loopback.test.d.ts.map +0 -1
- package/dist/core/mcp/loopback.test.js +0 -87
- package/dist/core/mcp/loopback.test.js.map +0 -1
- package/dist/core/mcp/oauth-store.test.d.ts +0 -2
- package/dist/core/mcp/oauth-store.test.d.ts.map +0 -1
- package/dist/core/mcp/oauth-store.test.js +0 -94
- package/dist/core/mcp/oauth-store.test.js.map +0 -1
- package/dist/core/mcp/parse-add-command.test.d.ts +0 -2
- package/dist/core/mcp/parse-add-command.test.d.ts.map +0 -1
- package/dist/core/mcp/parse-add-command.test.js +0 -81
- package/dist/core/mcp/parse-add-command.test.js.map +0 -1
- package/dist/core/mcp/resolve-stdio.test.d.ts +0 -2
- package/dist/core/mcp/resolve-stdio.test.d.ts.map +0 -1
- package/dist/core/mcp/resolve-stdio.test.js +0 -239
- package/dist/core/mcp/resolve-stdio.test.js.map +0 -1
- package/dist/core/mcp/session-elicitation-wiring.test.d.ts +0 -2
- package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +0 -1
- package/dist/core/mcp/session-elicitation-wiring.test.js +0 -138
- package/dist/core/mcp/session-elicitation-wiring.test.js.map +0 -1
- package/dist/core/mcp/shared-pool.test.d.ts +0 -2
- package/dist/core/mcp/shared-pool.test.d.ts.map +0 -1
- package/dist/core/mcp/shared-pool.test.js +0 -425
- package/dist/core/mcp/shared-pool.test.js.map +0 -1
- package/dist/core/mcp/store.test.d.ts +0 -2
- package/dist/core/mcp/store.test.d.ts.map +0 -1
- package/dist/core/mcp/store.test.js +0 -110
- package/dist/core/mcp/store.test.js.map +0 -1
- package/dist/core/mcp/when-connected.test.d.ts +0 -2
- package/dist/core/mcp/when-connected.test.d.ts.map +0 -1
- package/dist/core/mcp/when-connected.test.js +0 -46
- package/dist/core/mcp/when-connected.test.js.map +0 -1
- package/dist/core/message-images.test.d.ts +0 -2
- package/dist/core/message-images.test.d.ts.map +0 -1
- package/dist/core/message-images.test.js +0 -62
- package/dist/core/message-images.test.js.map +0 -1
- package/dist/core/network-guard.test.d.ts +0 -2
- package/dist/core/network-guard.test.d.ts.map +0 -1
- package/dist/core/network-guard.test.js +0 -72
- package/dist/core/network-guard.test.js.map +0 -1
- package/dist/core/nolan-context.test.d.ts +0 -2
- package/dist/core/nolan-context.test.d.ts.map +0 -1
- package/dist/core/nolan-context.test.js +0 -342
- package/dist/core/nolan-context.test.js.map +0 -1
- package/dist/core/nolan-model.test.d.ts +0 -2
- package/dist/core/nolan-model.test.d.ts.map +0 -1
- package/dist/core/nolan-model.test.js +0 -51
- package/dist/core/nolan-model.test.js.map +0 -1
- package/dist/core/nolan-prompt.test.d.ts +0 -2
- package/dist/core/nolan-prompt.test.d.ts.map +0 -1
- package/dist/core/nolan-prompt.test.js +0 -160
- package/dist/core/nolan-prompt.test.js.map +0 -1
- package/dist/core/persistent-shell.test.d.ts +0 -2
- package/dist/core/persistent-shell.test.d.ts.map +0 -1
- package/dist/core/persistent-shell.test.js +0 -84
- package/dist/core/persistent-shell.test.js.map +0 -1
- package/dist/core/pixel-fix.test.d.ts +0 -2
- package/dist/core/pixel-fix.test.d.ts.map +0 -1
- package/dist/core/pixel-fix.test.js +0 -310
- package/dist/core/pixel-fix.test.js.map +0 -1
- package/dist/core/pixel.test.d.ts +0 -2
- package/dist/core/pixel.test.d.ts.map +0 -1
- package/dist/core/pixel.test.js +0 -269
- package/dist/core/pixel.test.js.map +0 -1
- package/dist/core/process-gate.test.d.ts +0 -2
- package/dist/core/process-gate.test.d.ts.map +0 -1
- package/dist/core/process-gate.test.js +0 -87
- package/dist/core/process-gate.test.js.map +0 -1
- package/dist/core/process-manager-dev-server-repro.test.d.ts +0 -2
- package/dist/core/process-manager-dev-server-repro.test.d.ts.map +0 -1
- package/dist/core/process-manager-dev-server-repro.test.js +0 -225
- package/dist/core/process-manager-dev-server-repro.test.js.map +0 -1
- package/dist/core/process-manager-notifications.test.d.ts +0 -2
- package/dist/core/process-manager-notifications.test.d.ts.map +0 -1
- package/dist/core/process-manager-notifications.test.js +0 -227
- package/dist/core/process-manager-notifications.test.js.map +0 -1
- package/dist/core/progress/engine.test.d.ts +0 -2
- package/dist/core/progress/engine.test.d.ts.map +0 -1
- package/dist/core/progress/engine.test.js +0 -136
- package/dist/core/progress/engine.test.js.map +0 -1
- package/dist/core/progress/git-xp.test.d.ts +0 -2
- package/dist/core/progress/git-xp.test.d.ts.map +0 -1
- package/dist/core/progress/git-xp.test.js +0 -88
- package/dist/core/progress/git-xp.test.js.map +0 -1
- package/dist/core/progress/ranks.test.d.ts +0 -2
- package/dist/core/progress/ranks.test.d.ts.map +0 -1
- package/dist/core/progress/ranks.test.js +0 -100
- package/dist/core/progress/ranks.test.js.map +0 -1
- package/dist/core/progress/rebuild.test.d.ts +0 -2
- package/dist/core/progress/rebuild.test.d.ts.map +0 -1
- package/dist/core/progress/rebuild.test.js +0 -103
- package/dist/core/progress/rebuild.test.js.map +0 -1
- package/dist/core/progress/store.test.d.ts +0 -2
- package/dist/core/progress/store.test.d.ts.map +0 -1
- package/dist/core/progress/store.test.js +0 -108
- package/dist/core/progress/store.test.js.map +0 -1
- package/dist/core/project-discovery.test.d.ts +0 -2
- package/dist/core/project-discovery.test.d.ts.map +0 -1
- package/dist/core/project-discovery.test.js +0 -519
- package/dist/core/project-discovery.test.js.map +0 -1
- package/dist/core/prompt-commands.test.d.ts +0 -2
- package/dist/core/prompt-commands.test.d.ts.map +0 -1
- package/dist/core/prompt-commands.test.js +0 -175
- package/dist/core/prompt-commands.test.js.map +0 -1
- package/dist/core/radio.test.d.ts +0 -2
- package/dist/core/radio.test.d.ts.map +0 -1
- package/dist/core/radio.test.js +0 -117
- package/dist/core/radio.test.js.map +0 -1
- package/dist/core/regrounding.test.d.ts +0 -2
- package/dist/core/regrounding.test.d.ts.map +0 -1
- package/dist/core/regrounding.test.js +0 -38
- package/dist/core/regrounding.test.js.map +0 -1
- package/dist/core/resolve-start.test.d.ts +0 -2
- package/dist/core/resolve-start.test.d.ts.map +0 -1
- package/dist/core/resolve-start.test.js +0 -68
- package/dist/core/resolve-start.test.js.map +0 -1
- package/dist/core/run-claim.test.d.ts +0 -2
- package/dist/core/run-claim.test.d.ts.map +0 -1
- package/dist/core/run-claim.test.js +0 -107
- package/dist/core/run-claim.test.js.map +0 -1
- package/dist/core/run-journal.test.d.ts +0 -2
- package/dist/core/run-journal.test.d.ts.map +0 -1
- package/dist/core/run-journal.test.js +0 -195
- package/dist/core/run-journal.test.js.map +0 -1
- package/dist/core/run-lifecycle.test.d.ts +0 -2
- package/dist/core/run-lifecycle.test.d.ts.map +0 -1
- package/dist/core/run-lifecycle.test.js +0 -64
- package/dist/core/run-lifecycle.test.js.map +0 -1
- package/dist/core/sandbox-feedback.test.d.ts +0 -2
- package/dist/core/sandbox-feedback.test.d.ts.map +0 -1
- package/dist/core/sandbox-feedback.test.js +0 -32
- package/dist/core/sandbox-feedback.test.js.map +0 -1
- package/dist/core/sandbox.test.d.ts +0 -2
- package/dist/core/sandbox.test.d.ts.map +0 -1
- package/dist/core/sandbox.test.js +0 -157
- package/dist/core/sandbox.test.js.map +0 -1
- package/dist/core/semantic-search-benchmark.test.d.ts +0 -2
- package/dist/core/semantic-search-benchmark.test.d.ts.map +0 -1
- package/dist/core/semantic-search-benchmark.test.js +0 -89
- package/dist/core/semantic-search-benchmark.test.js.map +0 -1
- package/dist/core/session-compaction.test.d.ts +0 -2
- package/dist/core/session-compaction.test.d.ts.map +0 -1
- package/dist/core/session-compaction.test.js +0 -92
- package/dist/core/session-compaction.test.js.map +0 -1
- package/dist/core/session-export.test.d.ts +0 -2
- package/dist/core/session-export.test.d.ts.map +0 -1
- package/dist/core/session-export.test.js +0 -353
- package/dist/core/session-export.test.js.map +0 -1
- package/dist/core/session-history.test.d.ts +0 -2
- package/dist/core/session-history.test.d.ts.map +0 -1
- package/dist/core/session-history.test.js +0 -272
- package/dist/core/session-history.test.js.map +0 -1
- package/dist/core/session-manager.test.d.ts +0 -2
- package/dist/core/session-manager.test.d.ts.map +0 -1
- package/dist/core/session-manager.test.js +0 -573
- package/dist/core/session-manager.test.js.map +0 -1
- package/dist/core/session-notification-visibility.test.d.ts +0 -2
- package/dist/core/session-notification-visibility.test.d.ts.map +0 -1
- package/dist/core/session-notification-visibility.test.js +0 -113
- package/dist/core/session-notification-visibility.test.js.map +0 -1
- package/dist/core/session-restore-display.test.d.ts +0 -2
- package/dist/core/session-restore-display.test.d.ts.map +0 -1
- package/dist/core/session-restore-display.test.js +0 -103
- package/dist/core/session-restore-display.test.js.map +0 -1
- package/dist/core/session-storage-fd-leak.test.d.ts +0 -2
- package/dist/core/session-storage-fd-leak.test.d.ts.map +0 -1
- package/dist/core/session-storage-fd-leak.test.js +0 -116
- package/dist/core/session-storage-fd-leak.test.js.map +0 -1
- package/dist/core/session-storage.test.d.ts +0 -2
- package/dist/core/session-storage.test.d.ts.map +0 -1
- package/dist/core/session-storage.test.js +0 -277
- package/dist/core/session-storage.test.js.map +0 -1
- package/dist/core/setup-history.test.d.ts +0 -2
- package/dist/core/setup-history.test.d.ts.map +0 -1
- package/dist/core/setup-history.test.js +0 -59
- package/dist/core/setup-history.test.js.map +0 -1
- package/dist/core/shell.test.d.ts +0 -2
- package/dist/core/shell.test.d.ts.map +0 -1
- package/dist/core/shell.test.js +0 -87
- package/dist/core/shell.test.js.map +0 -1
- package/dist/core/shutdown.test.d.ts +0 -2
- package/dist/core/shutdown.test.d.ts.map +0 -1
- package/dist/core/shutdown.test.js +0 -160
- package/dist/core/shutdown.test.js.map +0 -1
- package/dist/core/sidecar-error-reporter.d.ts +0 -12
- package/dist/core/sidecar-error-reporter.d.ts.map +0 -1
- package/dist/core/sidecar-error-reporter.js +0 -57
- package/dist/core/sidecar-error-reporter.js.map +0 -1
- package/dist/core/sidecar-error-reporter.test.d.ts +0 -2
- package/dist/core/sidecar-error-reporter.test.d.ts.map +0 -1
- package/dist/core/sidecar-error-reporter.test.js +0 -61
- package/dist/core/sidecar-error-reporter.test.js.map +0 -1
- package/dist/core/skills-routing.test.d.ts +0 -2
- package/dist/core/skills-routing.test.d.ts.map +0 -1
- package/dist/core/skills-routing.test.js +0 -168
- package/dist/core/skills-routing.test.js.map +0 -1
- package/dist/core/slash-commands.test.d.ts +0 -2
- package/dist/core/slash-commands.test.d.ts.map +0 -1
- package/dist/core/slash-commands.test.js +0 -59
- package/dist/core/slash-commands.test.js.map +0 -1
- package/dist/core/source-maps.test.d.ts +0 -2
- package/dist/core/source-maps.test.d.ts.map +0 -1
- package/dist/core/source-maps.test.js +0 -175
- package/dist/core/source-maps.test.js.map +0 -1
- package/dist/core/speed-benchmark.test.d.ts +0 -2
- package/dist/core/speed-benchmark.test.d.ts.map +0 -1
- package/dist/core/speed-benchmark.test.js +0 -102
- package/dist/core/speed-benchmark.test.js.map +0 -1
- package/dist/core/subagent-manager.test.d.ts +0 -2
- package/dist/core/subagent-manager.test.d.ts.map +0 -1
- package/dist/core/subagent-manager.test.js +0 -375
- package/dist/core/subagent-manager.test.js.map +0 -1
- package/dist/core/subagent-store.test.d.ts +0 -2
- package/dist/core/subagent-store.test.d.ts.map +0 -1
- package/dist/core/subagent-store.test.js +0 -106
- package/dist/core/subagent-store.test.js.map +0 -1
- package/dist/core/verification-evidence.test.d.ts +0 -2
- package/dist/core/verification-evidence.test.d.ts.map +0 -1
- package/dist/core/verification-evidence.test.js +0 -103
- package/dist/core/verification-evidence.test.js.map +0 -1
- package/dist/core/verify-commands.test.d.ts +0 -2
- package/dist/core/verify-commands.test.d.ts.map +0 -1
- package/dist/core/verify-commands.test.js +0 -81
- package/dist/core/verify-commands.test.js.map +0 -1
- package/dist/core/workspace-guard.test.d.ts +0 -2
- package/dist/core/workspace-guard.test.d.ts.map +0 -1
- package/dist/core/workspace-guard.test.js +0 -107
- package/dist/core/workspace-guard.test.js.map +0 -1
- package/dist/modes/acp-mode.test.d.ts +0 -2
- package/dist/modes/acp-mode.test.d.ts.map +0 -1
- package/dist/modes/acp-mode.test.js +0 -1065
- package/dist/modes/acp-mode.test.js.map +0 -1
- package/dist/modes/json-mode.test.d.ts +0 -2
- package/dist/modes/json-mode.test.d.ts.map +0 -1
- package/dist/modes/json-mode.test.js +0 -84
- package/dist/modes/json-mode.test.js.map +0 -1
- package/dist/modes/subagent-worker-mode.test.d.ts +0 -2
- package/dist/modes/subagent-worker-mode.test.d.ts.map +0 -1
- package/dist/modes/subagent-worker-mode.test.js +0 -52
- package/dist/modes/subagent-worker-mode.test.js.map +0 -1
- package/dist/session.test.d.ts +0 -2
- package/dist/session.test.d.ts.map +0 -1
- package/dist/session.test.js +0 -35
- package/dist/session.test.js.map +0 -1
- package/dist/system-prompt.test.d.ts +0 -2
- package/dist/system-prompt.test.d.ts.map +0 -1
- package/dist/system-prompt.test.js +0 -536
- package/dist/system-prompt.test.js.map +0 -1
- package/dist/system-prompt.tiering.test.d.ts +0 -2
- package/dist/system-prompt.tiering.test.d.ts.map +0 -1
- package/dist/system-prompt.tiering.test.js +0 -105
- package/dist/system-prompt.tiering.test.js.map +0 -1
- package/dist/tools/bash.test.d.ts +0 -2
- package/dist/tools/bash.test.d.ts.map +0 -1
- package/dist/tools/bash.test.js +0 -204
- package/dist/tools/bash.test.js.map +0 -1
- package/dist/tools/checkpoint-hook.test.d.ts +0 -2
- package/dist/tools/checkpoint-hook.test.d.ts.map +0 -1
- package/dist/tools/checkpoint-hook.test.js +0 -65
- package/dist/tools/checkpoint-hook.test.js.map +0 -1
- package/dist/tools/code-nav.test.d.ts +0 -2
- package/dist/tools/code-nav.test.d.ts.map +0 -1
- package/dist/tools/code-nav.test.js +0 -136
- package/dist/tools/code-nav.test.js.map +0 -1
- package/dist/tools/code-skeleton.test.d.ts +0 -2
- package/dist/tools/code-skeleton.test.d.ts.map +0 -1
- package/dist/tools/code-skeleton.test.js +0 -115
- package/dist/tools/code-skeleton.test.js.map +0 -1
- package/dist/tools/compress-integration.test.d.ts +0 -2
- package/dist/tools/compress-integration.test.d.ts.map +0 -1
- package/dist/tools/compress-integration.test.js +0 -59
- package/dist/tools/compress-integration.test.js.map +0 -1
- package/dist/tools/compress.test.d.ts +0 -2
- package/dist/tools/compress.test.d.ts.map +0 -1
- package/dist/tools/compress.test.js +0 -60
- package/dist/tools/compress.test.js.map +0 -1
- package/dist/tools/edit-diff.test.d.ts +0 -2
- package/dist/tools/edit-diff.test.d.ts.map +0 -1
- package/dist/tools/edit-diff.test.js +0 -329
- package/dist/tools/edit-diff.test.js.map +0 -1
- package/dist/tools/edit-robustness.test.d.ts +0 -2
- package/dist/tools/edit-robustness.test.d.ts.map +0 -1
- package/dist/tools/edit-robustness.test.js +0 -417
- package/dist/tools/edit-robustness.test.js.map +0 -1
- package/dist/tools/edit.test.d.ts +0 -2
- package/dist/tools/edit.test.d.ts.map +0 -1
- package/dist/tools/edit.test.js +0 -940
- package/dist/tools/edit.test.js.map +0 -1
- package/dist/tools/exit-plan.test.d.ts +0 -2
- package/dist/tools/exit-plan.test.d.ts.map +0 -1
- package/dist/tools/exit-plan.test.js +0 -72
- package/dist/tools/exit-plan.test.js.map +0 -1
- package/dist/tools/generate-image.test.d.ts +0 -2
- package/dist/tools/generate-image.test.d.ts.map +0 -1
- package/dist/tools/generate-image.test.js +0 -240
- package/dist/tools/generate-image.test.js.map +0 -1
- package/dist/tools/goal-mode.test.d.ts +0 -2
- package/dist/tools/goal-mode.test.d.ts.map +0 -1
- package/dist/tools/goal-mode.test.js +0 -121
- package/dist/tools/goal-mode.test.js.map +0 -1
- package/dist/tools/goals.test.d.ts +0 -2
- package/dist/tools/goals.test.d.ts.map +0 -1
- package/dist/tools/goals.test.js +0 -795
- package/dist/tools/goals.test.js.map +0 -1
- package/dist/tools/grep-parity.test.d.ts +0 -2
- package/dist/tools/grep-parity.test.d.ts.map +0 -1
- package/dist/tools/grep-parity.test.js +0 -92
- package/dist/tools/grep-parity.test.js.map +0 -1
- package/dist/tools/grep-recall.test.d.ts +0 -2
- package/dist/tools/grep-recall.test.d.ts.map +0 -1
- package/dist/tools/grep-recall.test.js +0 -114
- package/dist/tools/grep-recall.test.js.map +0 -1
- package/dist/tools/grep-spawn.test.d.ts +0 -2
- package/dist/tools/grep-spawn.test.d.ts.map +0 -1
- package/dist/tools/grep-spawn.test.js +0 -66
- package/dist/tools/grep-spawn.test.js.map +0 -1
- package/dist/tools/grep.test.d.ts +0 -2
- package/dist/tools/grep.test.d.ts.map +0 -1
- package/dist/tools/grep.test.js +0 -82
- package/dist/tools/grep.test.js.map +0 -1
- package/dist/tools/html-extract.test.d.ts +0 -2
- package/dist/tools/html-extract.test.d.ts.map +0 -1
- package/dist/tools/html-extract.test.js +0 -60
- package/dist/tools/html-extract.test.js.map +0 -1
- package/dist/tools/index.test.d.ts +0 -2
- package/dist/tools/index.test.d.ts.map +0 -1
- package/dist/tools/index.test.js +0 -55
- package/dist/tools/index.test.js.map +0 -1
- package/dist/tools/overflow.test.d.ts +0 -2
- package/dist/tools/overflow.test.d.ts.map +0 -1
- package/dist/tools/overflow.test.js +0 -59
- package/dist/tools/overflow.test.js.map +0 -1
- package/dist/tools/path-utils.test.d.ts +0 -2
- package/dist/tools/path-utils.test.d.ts.map +0 -1
- package/dist/tools/path-utils.test.js +0 -54
- package/dist/tools/path-utils.test.js.map +0 -1
- package/dist/tools/pdf-extract.test.d.ts +0 -2
- package/dist/tools/pdf-extract.test.d.ts.map +0 -1
- package/dist/tools/pdf-extract.test.js +0 -15
- package/dist/tools/pdf-extract.test.js.map +0 -1
- package/dist/tools/plan-mode.test.d.ts +0 -2
- package/dist/tools/plan-mode.test.d.ts.map +0 -1
- package/dist/tools/plan-mode.test.js +0 -116
- package/dist/tools/plan-mode.test.js.map +0 -1
- package/dist/tools/read-only-bash.test.d.ts +0 -2
- package/dist/tools/read-only-bash.test.d.ts.map +0 -1
- package/dist/tools/read-only-bash.test.js +0 -47
- package/dist/tools/read-only-bash.test.js.map +0 -1
- package/dist/tools/read.test.d.ts +0 -2
- package/dist/tools/read.test.d.ts.map +0 -1
- package/dist/tools/read.test.js +0 -146
- package/dist/tools/read.test.js.map +0 -1
- package/dist/tools/screenshot.test.d.ts +0 -2
- package/dist/tools/screenshot.test.d.ts.map +0 -1
- package/dist/tools/screenshot.test.js +0 -145
- package/dist/tools/screenshot.test.js.map +0 -1
- package/dist/tools/search-code.test.d.ts +0 -2
- package/dist/tools/search-code.test.d.ts.map +0 -1
- package/dist/tools/search-code.test.js +0 -83
- package/dist/tools/search-code.test.js.map +0 -1
- package/dist/tools/source-path.test.d.ts +0 -2
- package/dist/tools/source-path.test.d.ts.map +0 -1
- package/dist/tools/source-path.test.js +0 -80
- package/dist/tools/source-path.test.js.map +0 -1
- package/dist/tools/subagent-control.test.d.ts +0 -2
- package/dist/tools/subagent-control.test.d.ts.map +0 -1
- package/dist/tools/subagent-control.test.js +0 -73
- package/dist/tools/subagent-control.test.js.map +0 -1
- package/dist/tools/subagent-shared.test.d.ts +0 -2
- package/dist/tools/subagent-shared.test.d.ts.map +0 -1
- package/dist/tools/subagent-shared.test.js +0 -83
- package/dist/tools/subagent-shared.test.js.map +0 -1
- package/dist/tools/subagent.test.d.ts +0 -2
- package/dist/tools/subagent.test.d.ts.map +0 -1
- package/dist/tools/subagent.test.js +0 -180
- package/dist/tools/subagent.test.js.map +0 -1
- package/dist/tools/task-send.test.d.ts +0 -2
- package/dist/tools/task-send.test.d.ts.map +0 -1
- package/dist/tools/task-send.test.js +0 -104
- package/dist/tools/task-send.test.js.map +0 -1
- package/dist/tools/tasks.test.d.ts +0 -2
- package/dist/tools/tasks.test.d.ts.map +0 -1
- package/dist/tools/tasks.test.js +0 -62
- package/dist/tools/tasks.test.js.map +0 -1
- package/dist/tools/tool-search.test.d.ts +0 -2
- package/dist/tools/tool-search.test.d.ts.map +0 -1
- package/dist/tools/tool-search.test.js +0 -69
- package/dist/tools/tool-search.test.js.map +0 -1
- package/dist/tools/tool-tiers.test.d.ts +0 -2
- package/dist/tools/tool-tiers.test.d.ts.map +0 -1
- package/dist/tools/tool-tiers.test.js +0 -48
- package/dist/tools/tool-tiers.test.js.map +0 -1
- package/dist/tools/truncate-utils.test.d.ts +0 -2
- package/dist/tools/truncate-utils.test.d.ts.map +0 -1
- package/dist/tools/truncate-utils.test.js +0 -93
- package/dist/tools/truncate-utils.test.js.map +0 -1
- package/dist/tools/truncate.test.d.ts +0 -2
- package/dist/tools/truncate.test.d.ts.map +0 -1
- package/dist/tools/truncate.test.js +0 -100
- package/dist/tools/truncate.test.js.map +0 -1
- package/dist/tools/web-fetch.test.d.ts +0 -2
- package/dist/tools/web-fetch.test.d.ts.map +0 -1
- package/dist/tools/web-fetch.test.js +0 -539
- package/dist/tools/web-fetch.test.js.map +0 -1
- package/dist/tools/web-search.test.d.ts +0 -2
- package/dist/tools/web-search.test.d.ts.map +0 -1
- package/dist/tools/web-search.test.js +0 -333
- package/dist/tools/web-search.test.js.map +0 -1
- package/dist/tools/write.test.d.ts +0 -2
- package/dist/tools/write.test.d.ts.map +0 -1
- package/dist/tools/write.test.js +0 -176
- package/dist/tools/write.test.js.map +0 -1
- package/dist/ui/anchor-pad-reclaim.test.d.ts +0 -2
- package/dist/ui/anchor-pad-reclaim.test.d.ts.map +0 -1
- package/dist/ui/anchor-pad-reclaim.test.js +0 -146
- package/dist/ui/anchor-pad-reclaim.test.js.map +0 -1
- package/dist/ui/app-items.test.d.ts +0 -2
- package/dist/ui/app-items.test.d.ts.map +0 -1
- package/dist/ui/app-items.test.js +0 -54
- package/dist/ui/app-items.test.js.map +0 -1
- package/dist/ui/app-state-persistence.test.d.ts +0 -2
- package/dist/ui/app-state-persistence.test.d.ts.map +0 -1
- package/dist/ui/app-state-persistence.test.js +0 -71
- package/dist/ui/app-state-persistence.test.js.map +0 -1
- package/dist/ui/assistant-stream-flush-parity.test.d.ts +0 -2
- package/dist/ui/assistant-stream-flush-parity.test.d.ts.map +0 -1
- package/dist/ui/assistant-stream-flush-parity.test.js +0 -85
- package/dist/ui/assistant-stream-flush-parity.test.js.map +0 -1
- package/dist/ui/atomic-flush-regression.test.d.ts +0 -2
- package/dist/ui/atomic-flush-regression.test.d.ts.map +0 -1
- package/dist/ui/atomic-flush-regression.test.js +0 -218
- package/dist/ui/atomic-flush-regression.test.js.map +0 -1
- package/dist/ui/chat-layout-pinning.test.d.ts +0 -2
- package/dist/ui/chat-layout-pinning.test.d.ts.map +0 -1
- package/dist/ui/chat-layout-pinning.test.js +0 -525
- package/dist/ui/chat-layout-pinning.test.js.map +0 -1
- package/dist/ui/components/ActivityIndicator.test.d.ts +0 -2
- package/dist/ui/components/ActivityIndicator.test.d.ts.map +0 -1
- package/dist/ui/components/ActivityIndicator.test.js +0 -40
- package/dist/ui/components/ActivityIndicator.test.js.map +0 -1
- package/dist/ui/components/AssistantMessage.test.d.ts +0 -2
- package/dist/ui/components/AssistantMessage.test.d.ts.map +0 -1
- package/dist/ui/components/AssistantMessage.test.js +0 -418
- package/dist/ui/components/AssistantMessage.test.js.map +0 -1
- package/dist/ui/components/Footer.test.d.ts +0 -2
- package/dist/ui/components/Footer.test.d.ts.map +0 -1
- package/dist/ui/components/Footer.test.js +0 -16
- package/dist/ui/components/Footer.test.js.map +0 -1
- package/dist/ui/components/InputArea.test.d.ts +0 -2
- package/dist/ui/components/InputArea.test.d.ts.map +0 -1
- package/dist/ui/components/InputArea.test.js +0 -95
- package/dist/ui/components/InputArea.test.js.map +0 -1
- package/dist/ui/components/PlanOverlay.test.d.ts +0 -2
- package/dist/ui/components/PlanOverlay.test.d.ts.map +0 -1
- package/dist/ui/components/PlanOverlay.test.js +0 -24
- package/dist/ui/components/PlanOverlay.test.js.map +0 -1
- package/dist/ui/components/StreamingArea.test.d.ts +0 -2
- package/dist/ui/components/StreamingArea.test.d.ts.map +0 -1
- package/dist/ui/components/StreamingArea.test.js +0 -18
- package/dist/ui/components/StreamingArea.test.js.map +0 -1
- package/dist/ui/components/UserMessage.test.d.ts +0 -2
- package/dist/ui/components/UserMessage.test.d.ts.map +0 -1
- package/dist/ui/components/UserMessage.test.js +0 -39
- package/dist/ui/components/UserMessage.test.js.map +0 -1
- package/dist/ui/components/themed-output.test.d.ts +0 -2
- package/dist/ui/components/themed-output.test.d.ts.map +0 -1
- package/dist/ui/components/themed-output.test.js +0 -111
- package/dist/ui/components/themed-output.test.js.map +0 -1
- package/dist/ui/footer-jump-regression.test.d.ts +0 -2
- package/dist/ui/footer-jump-regression.test.d.ts.map +0 -1
- package/dist/ui/footer-jump-regression.test.js +0 -224
- package/dist/ui/footer-jump-regression.test.js.map +0 -1
- package/dist/ui/footer-status-layout.test.d.ts +0 -2
- package/dist/ui/footer-status-layout.test.d.ts.map +0 -1
- package/dist/ui/footer-status-layout.test.js +0 -71
- package/dist/ui/footer-status-layout.test.js.map +0 -1
- package/dist/ui/frame-clip-regression.test.d.ts +0 -2
- package/dist/ui/frame-clip-regression.test.d.ts.map +0 -1
- package/dist/ui/frame-clip-regression.test.js +0 -215
- package/dist/ui/frame-clip-regression.test.js.map +0 -1
- package/dist/ui/goal-events.test.d.ts +0 -2
- package/dist/ui/goal-events.test.d.ts.map +0 -1
- package/dist/ui/goal-events.test.js +0 -350
- package/dist/ui/goal-events.test.js.map +0 -1
- package/dist/ui/goal-lifecycle-orchestration.test.d.ts +0 -2
- package/dist/ui/goal-lifecycle-orchestration.test.d.ts.map +0 -1
- package/dist/ui/goal-lifecycle-orchestration.test.js +0 -512
- package/dist/ui/goal-lifecycle-orchestration.test.js.map +0 -1
- package/dist/ui/goal-overlay.test.d.ts +0 -2
- package/dist/ui/goal-overlay.test.d.ts.map +0 -1
- package/dist/ui/goal-overlay.test.js +0 -384
- package/dist/ui/goal-overlay.test.js.map +0 -1
- package/dist/ui/goal-status-bar.test.d.ts +0 -2
- package/dist/ui/goal-status-bar.test.d.ts.map +0 -1
- package/dist/ui/goal-status-bar.test.js +0 -172
- package/dist/ui/goal-status-bar.test.js.map +0 -1
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +0 -2
- package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +0 -1
- package/dist/ui/hooks/stall-retry-duplicate.test.js +0 -94
- package/dist/ui/hooks/stall-retry-duplicate.test.js.map +0 -1
- package/dist/ui/hooks/useAgentLoop.test.d.ts +0 -2
- package/dist/ui/hooks/useAgentLoop.test.d.ts.map +0 -1
- package/dist/ui/hooks/useAgentLoop.test.js +0 -66
- package/dist/ui/hooks/useAgentLoop.test.js.map +0 -1
- package/dist/ui/hooks/useContextCompaction.test.d.ts +0 -2
- package/dist/ui/hooks/useContextCompaction.test.d.ts.map +0 -1
- package/dist/ui/hooks/useContextCompaction.test.js +0 -135
- package/dist/ui/hooks/useContextCompaction.test.js.map +0 -1
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts +0 -2
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts.map +0 -1
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js +0 -81
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js.map +0 -1
- package/dist/ui/hooks/useTranscriptHistory.test.d.ts +0 -2
- package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +0 -1
- package/dist/ui/hooks/useTranscriptHistory.test.js +0 -61
- package/dist/ui/hooks/useTranscriptHistory.test.js.map +0 -1
- package/dist/ui/hooks/useTranscriptScroll.test.d.ts +0 -2
- package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +0 -1
- package/dist/ui/hooks/useTranscriptScroll.test.js +0 -119
- package/dist/ui/hooks/useTranscriptScroll.test.js.map +0 -1
- package/dist/ui/live-area-clamp.test.d.ts +0 -2
- package/dist/ui/live-area-clamp.test.d.ts.map +0 -1
- package/dist/ui/live-area-clamp.test.js +0 -125
- package/dist/ui/live-area-clamp.test.js.map +0 -1
- package/dist/ui/live-area-height.test.d.ts +0 -2
- package/dist/ui/live-area-height.test.d.ts.map +0 -1
- package/dist/ui/live-area-height.test.js +0 -76
- package/dist/ui/live-area-height.test.js.map +0 -1
- package/dist/ui/live-frame-height.test.d.ts +0 -2
- package/dist/ui/live-frame-height.test.d.ts.map +0 -1
- package/dist/ui/live-frame-height.test.js +0 -116
- package/dist/ui/live-frame-height.test.js.map +0 -1
- package/dist/ui/live-item-flush.test.d.ts +0 -2
- package/dist/ui/live-item-flush.test.d.ts.map +0 -1
- package/dist/ui/live-item-flush.test.js +0 -437
- package/dist/ui/live-item-flush.test.js.map +0 -1
- package/dist/ui/long-prompt-regression-harness.test.d.ts +0 -2
- package/dist/ui/long-prompt-regression-harness.test.d.ts.map +0 -1
- package/dist/ui/long-prompt-regression-harness.test.js +0 -195
- package/dist/ui/long-prompt-regression-harness.test.js.map +0 -1
- package/dist/ui/pixel.test.d.ts +0 -2
- package/dist/ui/pixel.test.d.ts.map +0 -1
- package/dist/ui/pixel.test.js +0 -138
- package/dist/ui/pixel.test.js.map +0 -1
- package/dist/ui/plan-overlay.test.d.ts +0 -2
- package/dist/ui/plan-overlay.test.d.ts.map +0 -1
- package/dist/ui/plan-overlay.test.js +0 -305
- package/dist/ui/plan-overlay.test.js.map +0 -1
- package/dist/ui/queued-message.test.d.ts +0 -2
- package/dist/ui/queued-message.test.d.ts.map +0 -1
- package/dist/ui/queued-message.test.js +0 -172
- package/dist/ui/queued-message.test.js.map +0 -1
- package/dist/ui/render.test.d.ts +0 -2
- package/dist/ui/render.test.d.ts.map +0 -1
- package/dist/ui/render.test.js +0 -42
- package/dist/ui/render.test.js.map +0 -1
- package/dist/ui/scroll-stabilization.test.d.ts +0 -2
- package/dist/ui/scroll-stabilization.test.d.ts.map +0 -1
- package/dist/ui/scroll-stabilization.test.js +0 -64
- package/dist/ui/scroll-stabilization.test.js.map +0 -1
- package/dist/ui/slash-command-images.test.d.ts +0 -2
- package/dist/ui/slash-command-images.test.d.ts.map +0 -1
- package/dist/ui/slash-command-images.test.js +0 -110
- package/dist/ui/slash-command-images.test.js.map +0 -1
- package/dist/ui/startup-banner-order.test.d.ts +0 -2
- package/dist/ui/startup-banner-order.test.d.ts.map +0 -1
- package/dist/ui/startup-banner-order.test.js +0 -105
- package/dist/ui/startup-banner-order.test.js.map +0 -1
- package/dist/ui/stores/transcript-scroll-store.test.d.ts +0 -2
- package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +0 -1
- package/dist/ui/stores/transcript-scroll-store.test.js +0 -73
- package/dist/ui/stores/transcript-scroll-store.test.js.map +0 -1
- package/dist/ui/streaming-flush-bounce.test.d.ts +0 -2
- package/dist/ui/streaming-flush-bounce.test.d.ts.map +0 -1
- package/dist/ui/streaming-flush-bounce.test.js +0 -177
- package/dist/ui/streaming-flush-bounce.test.js.map +0 -1
- package/dist/ui/submit-boundary-gap.test.d.ts +0 -2
- package/dist/ui/submit-boundary-gap.test.d.ts.map +0 -1
- package/dist/ui/submit-boundary-gap.test.js +0 -180
- package/dist/ui/submit-boundary-gap.test.js.map +0 -1
- package/dist/ui/terminal-history-repaint.test.d.ts +0 -2
- package/dist/ui/terminal-history-repaint.test.d.ts.map +0 -1
- package/dist/ui/terminal-history-repaint.test.js +0 -73
- package/dist/ui/terminal-history-repaint.test.js.map +0 -1
- package/dist/ui/terminal-history-retry-dedup.test.d.ts +0 -2
- package/dist/ui/terminal-history-retry-dedup.test.d.ts.map +0 -1
- package/dist/ui/terminal-history-retry-dedup.test.js +0 -61
- package/dist/ui/terminal-history-retry-dedup.test.js.map +0 -1
- package/dist/ui/terminal-history.test.d.ts +0 -2
- package/dist/ui/terminal-history.test.d.ts.map +0 -1
- package/dist/ui/terminal-history.test.js +0 -557
- package/dist/ui/terminal-history.test.js.map +0 -1
- package/dist/ui/thinking-level-cycle.test.d.ts +0 -2
- package/dist/ui/thinking-level-cycle.test.d.ts.map +0 -1
- package/dist/ui/thinking-level-cycle.test.js +0 -45
- package/dist/ui/thinking-level-cycle.test.js.map +0 -1
- package/dist/ui/tool-group-summary.test.d.ts +0 -2
- package/dist/ui/tool-group-summary.test.d.ts.map +0 -1
- package/dist/ui/tool-group-summary.test.js +0 -79
- package/dist/ui/tool-group-summary.test.js.map +0 -1
- package/dist/ui/transcript/spacing.test.d.ts +0 -2
- package/dist/ui/transcript/spacing.test.d.ts.map +0 -1
- package/dist/ui/transcript/spacing.test.js +0 -191
- package/dist/ui/transcript/spacing.test.js.map +0 -1
- package/dist/ui/transcript/transcript-lines.test.d.ts +0 -2
- package/dist/ui/transcript/transcript-lines.test.d.ts.map +0 -1
- package/dist/ui/transcript/transcript-lines.test.js +0 -76
- package/dist/ui/transcript/transcript-lines.test.js.map +0 -1
- package/dist/ui/transcript-viewport-pinning.test.d.ts +0 -2
- package/dist/ui/transcript-viewport-pinning.test.d.ts.map +0 -1
- package/dist/ui/transcript-viewport-pinning.test.js +0 -148
- package/dist/ui/transcript-viewport-pinning.test.js.map +0 -1
- package/dist/ui/tui-history-parity.test.d.ts +0 -2
- package/dist/ui/tui-history-parity.test.d.ts.map +0 -1
- package/dist/ui/tui-history-parity.test.js +0 -388
- package/dist/ui/tui-history-parity.test.js.map +0 -1
- package/dist/ui/tui-simulation.test.d.ts +0 -2
- package/dist/ui/tui-simulation.test.d.ts.map +0 -1
- package/dist/ui/tui-simulation.test.js +0 -145
- package/dist/ui/tui-simulation.test.js.map +0 -1
- package/dist/ui/tui-terminal-recorder.test.d.ts +0 -2
- package/dist/ui/tui-terminal-recorder.test.d.ts.map +0 -1
- package/dist/ui/tui-terminal-recorder.test.js +0 -134
- package/dist/ui/tui-terminal-recorder.test.js.map +0 -1
- package/dist/ui/utils/assistant-stream-split.test.d.ts +0 -2
- package/dist/ui/utils/assistant-stream-split.test.d.ts.map +0 -1
- package/dist/ui/utils/assistant-stream-split.test.js +0 -74
- package/dist/ui/utils/assistant-stream-split.test.js.map +0 -1
- package/dist/ui/utils/markdown-renderer.test.d.ts +0 -2
- package/dist/ui/utils/markdown-renderer.test.d.ts.map +0 -1
- package/dist/ui/utils/markdown-renderer.test.js +0 -63
- package/dist/ui/utils/markdown-renderer.test.js.map +0 -1
- package/dist/ui/utils/table-text.test.d.ts +0 -2
- package/dist/ui/utils/table-text.test.d.ts.map +0 -1
- package/dist/ui/utils/table-text.test.js +0 -202
- package/dist/ui/utils/table-text.test.js.map +0 -1
- package/dist/ui/utils/terminal-graphics.test.d.ts +0 -2
- package/dist/ui/utils/terminal-graphics.test.d.ts.map +0 -1
- package/dist/ui/utils/terminal-graphics.test.js +0 -100
- package/dist/ui/utils/terminal-graphics.test.js.map +0 -1
- package/dist/ui/utils/terminal-input.test.d.ts +0 -2
- package/dist/ui/utils/terminal-input.test.d.ts.map +0 -1
- package/dist/ui/utils/terminal-input.test.js +0 -15
- package/dist/ui/utils/terminal-input.test.js.map +0 -1
- package/dist/utils/git.test.d.ts +0 -2
- package/dist/utils/git.test.d.ts.map +0 -1
- package/dist/utils/git.test.js +0 -36
- package/dist/utils/git.test.js.map +0 -1
- package/dist/utils/github.test.d.ts +0 -2
- package/dist/utils/github.test.d.ts.map +0 -1
- package/dist/utils/github.test.js +0 -23
- package/dist/utils/github.test.js.map +0 -1
- package/dist/utils/http-body.test.d.ts +0 -2
- package/dist/utils/http-body.test.d.ts.map +0 -1
- package/dist/utils/http-body.test.js +0 -68
- package/dist/utils/http-body.test.js.map +0 -1
- package/dist/utils/image.test.d.ts +0 -2
- package/dist/utils/image.test.d.ts.map +0 -1
- package/dist/utils/image.test.js +0 -139
- package/dist/utils/image.test.js.map +0 -1
- package/dist/utils/plan-steps.test.d.ts +0 -2
- package/dist/utils/plan-steps.test.d.ts.map +0 -1
- package/dist/utils/plan-steps.test.js +0 -159
- package/dist/utils/plan-steps.test.js.map +0 -1
- package/dist/utils/process.test.d.ts +0 -2
- package/dist/utils/process.test.d.ts.map +0 -1
- package/dist/utils/process.test.js +0 -42
- package/dist/utils/process.test.js.map +0 -1
package/dist/app-sidecar.js
CHANGED
|
@@ -18,6 +18,7 @@ import os from "node:os";
|
|
|
18
18
|
import path from "node:path";
|
|
19
19
|
import { randomUUID } from "node:crypto";
|
|
20
20
|
import { parseArgs } from "node:util";
|
|
21
|
+
import { spawn } from "node:child_process";
|
|
21
22
|
import { environmentSecrets, formatError, redactValue } from "@prestyj/ai";
|
|
22
23
|
import { runJsonMode } from "./modes/json-mode.js";
|
|
23
24
|
import { runSubagentWorkerMode } from "./modes/subagent-worker-mode.js";
|
|
@@ -37,6 +38,7 @@ import { validateNolanModelPref, effectiveNolanModel, } from "./core/nolan-model
|
|
|
37
38
|
import { normalizeAutopilotMarkersForHistory, normalizeAppMarkersForHistory, normalizeNolanTurnsForHistory, getHistoryMessageVisibility, replayMessagesInOrder, restoreUserRow, restoreAssistantTexts, resolveRestoredCommand, autopilotMarkerCopySeed, } from "./core/session-history.js";
|
|
38
39
|
import { sessionToMarkdown, defaultExportFilename, } from "./core/session-export.js";
|
|
39
40
|
import { AuthStorage } from "./core/auth-storage.js";
|
|
41
|
+
import { advancesPhase, explainPullFailure, isGgufShard, isValidHfRepoId, parseOllamaPullLine, pickGgufQuant, SHARDED_MESSAGE, toHfSearchRow, } from "./hf-pull.js";
|
|
40
42
|
import { cleanupToolOutputs } from "./tools/overflow.js";
|
|
41
43
|
import { readCappedBody } from "./utils/http-body.js";
|
|
42
44
|
import { fetchSubscriptionUsage, SubscriptionUsageError, XIAOMI_CREDITS_KEY, dualAuthProvider, oauthStorageKey, discoverLocalModels, findProbedModel, formatLocalModelId, parseLocalModelId, probeEndpoint, toModelInfo as localModelInfo, } from "@prestyj/core";
|
|
@@ -47,7 +49,7 @@ import { loginGemini } from "./core/oauth/gemini.js";
|
|
|
47
49
|
import { loginKimi } from "./core/oauth/kimi.js";
|
|
48
50
|
import { loginXai } from "./core/oauth/xai.js";
|
|
49
51
|
import { AUTH_PROVIDERS, authPriorityNote, describeAuthMethods, } from "./core/auth-providers.js";
|
|
50
|
-
import { ensureAppDirs, loadSavedSettings } from "./config.js";
|
|
52
|
+
import { ensureAppDirs, loadSavedSettings, projectScopeAllowed } from "./config.js";
|
|
51
53
|
import { SettingsManager } from "./core/settings-manager.js";
|
|
52
54
|
import { installPlugin, listInstalledPlugins, removePlugin, } from "./core/extensions/plugin-bundles.js";
|
|
53
55
|
import { getModel, getDefaultThinkingLevel, getContextWindow, getAllModels, clearRuntimeModels, registerRuntimeModels, } from "./core/model-registry.js";
|
|
@@ -67,14 +69,16 @@ import { RADIO_STATIONS, getCurrentStation, getRadioVolume, playRadio, setRadioV
|
|
|
67
69
|
import { enrichProcessPath } from "./core/shell-path.js";
|
|
68
70
|
import { downscaleForPreview, shrinkToFit, validateVisionImage } from "./utils/image.js";
|
|
69
71
|
import { startServeMode } from "./modes/serve-mode.js";
|
|
72
|
+
import { installSteroids, probeSteroids } from "./core/steroids.js";
|
|
70
73
|
import { loadTelegramConfig, saveTelegramConfig, verifyBotToken } from "./core/telegram-config.js";
|
|
71
74
|
import { loadServers, addServer, removeServer, getServer, parseMcpAddCommand, MCPClientManager, McpOAuthStore, createElicitationBridge, } from "./core/mcp/index.js";
|
|
75
|
+
import { createAskUserBridge } from "./core/ask-user.js";
|
|
76
|
+
import { createAskUserTool } from "./tools/ask-user.js";
|
|
72
77
|
import { buildSnapshot, levelForXp, rankForLevel } from "./core/progress/ranks.js";
|
|
73
78
|
import { loadProgress, peekProgress, updateProgress } from "./core/progress/store.js";
|
|
74
79
|
import { awardPrompt, awardCommits } from "./core/progress/engine.js";
|
|
75
80
|
import { detectNewCommits, repoKey } from "./core/progress/git-xp.js";
|
|
76
81
|
import { rebuildFromSessions } from "./core/progress/rebuild.js";
|
|
77
|
-
import { captureSidecarError, flushSidecarErrors, shouldCaptureToolFailure, shouldCaptureUsagePollingError, wrapSidecarHandler, } from "./core/sidecar-error-reporter.js";
|
|
78
82
|
const AUTOMATION_PROVENANCE = {
|
|
79
83
|
source: "runtime",
|
|
80
84
|
kind: "automation",
|
|
@@ -92,6 +96,8 @@ const ALL_PROVIDERS = [
|
|
|
92
96
|
"minimax",
|
|
93
97
|
"xiaomi",
|
|
94
98
|
"deepseek",
|
|
99
|
+
// Open-community gateway, before the provider-agnostic one
|
|
100
|
+
"huggingface",
|
|
95
101
|
// Japan, then provider-agnostic gateway last
|
|
96
102
|
"sakana",
|
|
97
103
|
"openrouter",
|
|
@@ -193,7 +199,6 @@ async function persistModelSelection(settingsFile, provider, model) {
|
|
|
193
199
|
await sm.set("defaultModel", model);
|
|
194
200
|
}
|
|
195
201
|
catch (err) {
|
|
196
|
-
captureSidecarError(err, "app-sidecar.settings.persist-model");
|
|
197
202
|
log("WARN", "app-sidecar", "failed to persist model selection", { err: String(err) });
|
|
198
203
|
}
|
|
199
204
|
}
|
|
@@ -210,7 +215,6 @@ async function persistThinkingLevel(settingsFile, level) {
|
|
|
210
215
|
await sm.set("thinkingLevel", level);
|
|
211
216
|
}
|
|
212
217
|
catch (err) {
|
|
213
|
-
captureSidecarError(err, "app-sidecar.settings.persist-thinking");
|
|
214
218
|
log("WARN", "app-sidecar", "failed to persist thinking level", { err: String(err) });
|
|
215
219
|
}
|
|
216
220
|
}
|
|
@@ -388,27 +392,49 @@ function mcpRowSummary(config) {
|
|
|
388
392
|
}
|
|
389
393
|
/** Load + connect every server, returning one wire row per server. Mirrors the
|
|
390
394
|
* CLI dashboard's buildRows (connectAllDetailed, then dispose). Empty list
|
|
391
|
-
* short-circuits before spawning any stdio process / opening any HTTP conn.
|
|
392
|
-
|
|
395
|
+
* short-circuits before spawning any stdio process / opening any HTTP conn.
|
|
396
|
+
* Project-scope servers run repo-controlled commands, so unless the user
|
|
397
|
+
* trusts them (trustProjectMcpServers) they are reported blocked WITHOUT
|
|
398
|
+
* being connected — even a status probe would spawn the process. */
|
|
399
|
+
async function buildMcpRows(cwd, settingsFile) {
|
|
393
400
|
const scoped = await loadServers(cwd);
|
|
394
401
|
if (scoped.length === 0)
|
|
395
402
|
return [];
|
|
403
|
+
const settings = loadSavedSettings(settingsFile);
|
|
404
|
+
const allowProject = projectScopeAllowed(settings.trustProjectMcpServers, settings.trustedProjects, cwd);
|
|
405
|
+
const connectable = scoped.filter((s) => allowProject || s.scope !== "project");
|
|
406
|
+
const blocked = scoped.filter((s) => !allowProject && s.scope === "project");
|
|
396
407
|
const manager = new MCPClientManager();
|
|
397
408
|
try {
|
|
398
|
-
const results =
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
409
|
+
const results = connectable.length > 0
|
|
410
|
+
? await manager.connectAllDetailed(connectable.map((s) => s.config))
|
|
411
|
+
: [];
|
|
412
|
+
return [
|
|
413
|
+
...connectable.map((s) => {
|
|
414
|
+
const result = results.find((r) => r.name === s.config.name);
|
|
415
|
+
return {
|
|
416
|
+
name: s.config.name,
|
|
417
|
+
scope: s.scope,
|
|
418
|
+
ok: result?.ok ?? false,
|
|
419
|
+
toolCount: result?.toolCount ?? 0,
|
|
420
|
+
error: result?.error,
|
|
421
|
+
kind: s.config.url ? "http" : "stdio",
|
|
422
|
+
summary: mcpRowSummary(s.config),
|
|
423
|
+
requiresAuth: result?.requiresAuth,
|
|
424
|
+
};
|
|
425
|
+
}),
|
|
426
|
+
...blocked.map((s) => ({
|
|
402
427
|
name: s.config.name,
|
|
403
428
|
scope: s.scope,
|
|
404
|
-
ok:
|
|
405
|
-
toolCount:
|
|
406
|
-
error:
|
|
407
|
-
|
|
429
|
+
ok: false,
|
|
430
|
+
toolCount: 0,
|
|
431
|
+
error: "Project-scope server not connected — this repo's .ezcoder/mcp.json runs " +
|
|
432
|
+
"repo-controlled commands. Add or re-add a server in this project via " +
|
|
433
|
+
"the MCP modal to trust it.",
|
|
434
|
+
kind: (s.config.url ? "http" : "stdio"),
|
|
408
435
|
summary: mcpRowSummary(s.config),
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
});
|
|
436
|
+
})),
|
|
437
|
+
];
|
|
412
438
|
}
|
|
413
439
|
finally {
|
|
414
440
|
await manager.dispose();
|
|
@@ -494,10 +520,6 @@ async function runJsonModeIfRequested() {
|
|
|
494
520
|
allowedMcpServers,
|
|
495
521
|
promptCacheKey: values["prompt-cache-key"],
|
|
496
522
|
}).catch(async (err) => {
|
|
497
|
-
captureSidecarError(err, "app-sidecar.json-mode", {
|
|
498
|
-
provider: String(values.provider ?? "anthropic"),
|
|
499
|
-
});
|
|
500
|
-
await flushSidecarErrors();
|
|
501
523
|
process.stderr.write((err instanceof Error ? err.message : String(err)) + "\n");
|
|
502
524
|
process.exit(1);
|
|
503
525
|
});
|
|
@@ -510,9 +532,10 @@ function daemonReadBody(req, res) {
|
|
|
510
532
|
return readCappedBody(req, res);
|
|
511
533
|
}
|
|
512
534
|
function daemonJson(res, status, body) {
|
|
535
|
+
// No CORS headers: only the Rust proxy (no Origin) should call this daemon.
|
|
536
|
+
// Granting origins would let any web page read responses from loopback.
|
|
513
537
|
res.writeHead(status, {
|
|
514
538
|
"content-type": "application/json",
|
|
515
|
-
"access-control-allow-origin": "*",
|
|
516
539
|
});
|
|
517
540
|
res.end(JSON.stringify(body));
|
|
518
541
|
}
|
|
@@ -530,6 +553,13 @@ async function main() {
|
|
|
530
553
|
// GG_APP_LISTENING handshake and consumed by the shell.
|
|
531
554
|
const port = Number(process.env.GG_APP_PORT ?? 0);
|
|
532
555
|
const host = "127.0.0.1";
|
|
556
|
+
// Per-launch bearer token. The Rust shell generates one and passes it via
|
|
557
|
+
// GG_APP_TOKEN; spawned any other way (dev, tests, smoke) we mint our own
|
|
558
|
+
// and report it on the GG_APP_LISTENING line. Every request must carry it
|
|
559
|
+
// as x-ez-token: this daemon creates sessions for arbitrary cwds, runs
|
|
560
|
+
// prompts, and installs plugins, so an unauthenticated loopback port lets
|
|
561
|
+
// any local process drive the agent as the user.
|
|
562
|
+
const authToken = process.env.GG_APP_TOKEN ?? randomUUID();
|
|
533
563
|
const paths = await ensureAppDirs();
|
|
534
564
|
// Own log file so the app sidecar never clobbers the interactive CLI's
|
|
535
565
|
// ~/.ezcoder/debug.log (initLogger truncates on each start).
|
|
@@ -543,7 +573,9 @@ async function main() {
|
|
|
543
573
|
const includeRuntime = phase === "idle_timeout_fired" ||
|
|
544
574
|
phase === "hard_timeout_fired" ||
|
|
545
575
|
phase === "stall_exhausted";
|
|
546
|
-
|
|
576
|
+
// A session stuck on the non-streaming fallback costs real money and real
|
|
577
|
+
// latency; it does not belong in the INFO noise floor.
|
|
578
|
+
log(phase === "non_streaming_session" ? "WARN" : "INFO", "stream", phase, {
|
|
547
579
|
...(data ?? {}),
|
|
548
580
|
...(includeRuntime
|
|
549
581
|
? {
|
|
@@ -692,9 +724,6 @@ async function main() {
|
|
|
692
724
|
}
|
|
693
725
|
catch (error) {
|
|
694
726
|
const message = error instanceof Error ? error.message : String(error);
|
|
695
|
-
if (shouldCaptureUsagePollingError(error)) {
|
|
696
|
-
captureSidecarError(error, "app-sidecar.usage.fetch", { provider });
|
|
697
|
-
}
|
|
698
727
|
let backoffMs;
|
|
699
728
|
if (error instanceof SubscriptionUsageError && error.status === 429) {
|
|
700
729
|
backoffMs = Math.min(USAGE_RATE_LIMIT_MAX_BACKOFF_MS, Math.max(USAGE_RATE_LIMIT_MIN_BACKOFF_MS, error.retryAfterMs ?? USAGE_RATE_LIMIT_FALLBACK_BACKOFF_MS));
|
|
@@ -777,19 +806,29 @@ async function main() {
|
|
|
777
806
|
return null;
|
|
778
807
|
}
|
|
779
808
|
}
|
|
780
|
-
const server = http.createServer(
|
|
809
|
+
const server = http.createServer((req, res) => {
|
|
781
810
|
const url = req.url ?? "/";
|
|
782
811
|
const method = req.method ?? "GET";
|
|
783
|
-
//
|
|
812
|
+
// Answer preflights with a bare 204 but grant NO origins — the webview
|
|
813
|
+
// reaches the daemon through the Rust proxy, never cross-origin, so any
|
|
814
|
+
// browser page's preflight must fail here.
|
|
784
815
|
if (method === "OPTIONS") {
|
|
785
|
-
res.writeHead(204
|
|
786
|
-
"access-control-allow-origin": "*",
|
|
787
|
-
"access-control-allow-methods": "GET, POST, DELETE, OPTIONS",
|
|
788
|
-
"access-control-allow-headers": "content-type, x-ez-session",
|
|
789
|
-
});
|
|
816
|
+
res.writeHead(204);
|
|
790
817
|
res.end();
|
|
791
818
|
return;
|
|
792
819
|
}
|
|
820
|
+
// Host allowlist. The daemon binds 127.0.0.1 only; rejecting any other
|
|
821
|
+
// Host blocks DNS rebinding, where a web page's request arrives with
|
|
822
|
+
// the attacker's hostname (browsers cannot spoof Host).
|
|
823
|
+
const reqHost = req.headers.host ?? "";
|
|
824
|
+
if (!/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(reqHost)) {
|
|
825
|
+
daemonJson(res, 403, { error: "forbidden host" });
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
if (req.headers["x-ez-token"] !== authToken) {
|
|
829
|
+
daemonJson(res, 401, { error: "unauthorized" });
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
793
832
|
// ── Daemon-level routes (session lifecycle) ──────────────────────────
|
|
794
833
|
// Create a session for a window: { mode?, cwd, sessionPath? } → { sessionId }.
|
|
795
834
|
if (method === "POST" && url === "/session") {
|
|
@@ -831,7 +870,6 @@ async function main() {
|
|
|
831
870
|
}
|
|
832
871
|
catch (err) {
|
|
833
872
|
const message = err instanceof Error ? err.message : String(err);
|
|
834
|
-
captureSidecarError(err, "app-sidecar.session.create");
|
|
835
873
|
log("ERROR", "app-sidecar", "session create failed", { message });
|
|
836
874
|
daemonJson(res, 500, { error: message });
|
|
837
875
|
}
|
|
@@ -868,7 +906,6 @@ async function main() {
|
|
|
868
906
|
}
|
|
869
907
|
daemonJson(res, 200, await subscriptionUsage(provider));
|
|
870
908
|
})().catch((error) => {
|
|
871
|
-
captureSidecarError(error, "app-sidecar.usage.request");
|
|
872
909
|
log("ERROR", "app-sidecar", "subscription usage request failed", {
|
|
873
910
|
message: error instanceof Error ? error.message : String(error),
|
|
874
911
|
});
|
|
@@ -884,11 +921,12 @@ async function main() {
|
|
|
884
921
|
return;
|
|
885
922
|
}
|
|
886
923
|
ctx.handle(req, res, url, method);
|
|
887
|
-
}
|
|
924
|
+
});
|
|
888
925
|
server.listen(port, host, () => {
|
|
889
926
|
const addr = server.address();
|
|
890
|
-
// The Rust shell reads this line to learn the daemon port
|
|
891
|
-
|
|
927
|
+
// The Rust shell reads this line to learn the daemon port (it already
|
|
928
|
+
// knows the token — it set GG_APP_TOKEN; the field serves other spawners).
|
|
929
|
+
process.stdout.write(`GG_APP_LISTENING ${addr.port} ${authToken}\n`);
|
|
892
930
|
log("INFO", "app-sidecar", "daemon listening", { port: String(addr.port), host });
|
|
893
931
|
});
|
|
894
932
|
const shellPid = process.ppid;
|
|
@@ -945,11 +983,10 @@ const NOLAN_ALLOWED_TOOLS = [
|
|
|
945
983
|
"web_fetch",
|
|
946
984
|
"web_search",
|
|
947
985
|
"screenshot",
|
|
986
|
+
// Local corpus of real repos: lets Nolan verify against code that ships
|
|
987
|
+
// instead of assuming — core to how he's meant to work. Read-only.
|
|
988
|
+
"steroids",
|
|
948
989
|
];
|
|
949
|
-
/** MCP servers Nolan is allowed to use. kencode-search lets him look into real
|
|
950
|
-
* public repos / verify against actual code instead of assuming — core to how
|
|
951
|
-
* he's meant to work. Read-only research; no other MCP server is connected. */
|
|
952
|
-
const NOLAN_ALLOWED_MCP_SERVERS = ["kencode-search"];
|
|
953
990
|
/** Extract the plain text of the most recent assistant message (Nolan's reply).
|
|
954
991
|
* Strips tool-call / image blocks, returning just the prose Nolan streamed. */
|
|
955
992
|
function lastAssistantText(messages) {
|
|
@@ -1036,7 +1073,6 @@ async function createProgressManager(agentDir, broadcastAll) {
|
|
|
1036
1073
|
broadcastAll(buildSnapshot(updated), originId);
|
|
1037
1074
|
}
|
|
1038
1075
|
catch (err) {
|
|
1039
|
-
captureSidecarError(err, "app-sidecar.progress.award");
|
|
1040
1076
|
log("DEBUG", "app-sidecar", "progress award failed", {
|
|
1041
1077
|
message: err instanceof Error ? err.message : String(err),
|
|
1042
1078
|
});
|
|
@@ -1070,7 +1106,6 @@ async function createProgressManager(agentDir, broadcastAll) {
|
|
|
1070
1106
|
progressWatcher = watcher;
|
|
1071
1107
|
}
|
|
1072
1108
|
catch (err) {
|
|
1073
|
-
captureSidecarError(err, "app-sidecar.progress.watch");
|
|
1074
1109
|
log("DEBUG", "app-sidecar", "progress watch unavailable", {
|
|
1075
1110
|
message: err instanceof Error ? err.message : String(err),
|
|
1076
1111
|
});
|
|
@@ -1168,7 +1203,7 @@ async function createSession(deps, opts) {
|
|
|
1168
1203
|
// command that doesn't exist in the app.
|
|
1169
1204
|
.replaceAll(/Run \/compact to shrink history, or start a new session\./gi, "Start a new session to reset the context.")
|
|
1170
1205
|
// /model: handle each phrasing pattern
|
|
1171
|
-
.replaceAll(/switch to
|
|
1206
|
+
.replaceAll(/switch to (\S+) with \/model/gi, "switch to $1 using the model selector")
|
|
1172
1207
|
.replaceAll(/Switch with \/model\./gi, "Switch using the model selector.")
|
|
1173
1208
|
.replaceAll(/try a different model with \/model\./gi, "try a different model using the model selector.")
|
|
1174
1209
|
.replaceAll(/Use \/model to switch/gi, "Use the model selector to switch")
|
|
@@ -1204,11 +1239,6 @@ async function createSession(deps, opts) {
|
|
|
1204
1239
|
const f = formatError(err);
|
|
1205
1240
|
const message = f.message ? desktopGuidance(f.message) : undefined;
|
|
1206
1241
|
const guidance = localNetworkGuidance(f.source) ?? desktopGuidance(f.guidance);
|
|
1207
|
-
captureSidecarError(err, `app-sidecar.${logLabel.replaceAll(" ", "-")}`, {
|
|
1208
|
-
scope: type,
|
|
1209
|
-
...(f.provider ? { provider: f.provider } : {}),
|
|
1210
|
-
...(f.statusCode != null ? { status: String(f.statusCode) } : {}),
|
|
1211
|
-
});
|
|
1212
1242
|
log("ERROR", "app-sidecar", logLabel, {
|
|
1213
1243
|
headline: f.headline,
|
|
1214
1244
|
source: f.source,
|
|
@@ -1247,6 +1277,16 @@ async function createSession(deps, opts) {
|
|
|
1247
1277
|
server: prompt.server,
|
|
1248
1278
|
}),
|
|
1249
1279
|
});
|
|
1280
|
+
// ── ask_user bridge ────────────────────────────────────────
|
|
1281
|
+
// The `ask_user` tool parks the turn on a human answer. Same shape as the
|
|
1282
|
+
// MCP bridge above: broadcast over SSE, resolved when the webview POSTs
|
|
1283
|
+
// /ask/:id. Registered ONLY here — a TUI/headless/subagent run has nobody to
|
|
1284
|
+
// answer, so the tool is absent there rather than hanging on a dead channel.
|
|
1285
|
+
const asks = createAskUserBridge({
|
|
1286
|
+
broadcast: (prompt) => broadcast("ask_user", prompt),
|
|
1287
|
+
onTimeout: (prompt) => log("WARN", "app-sidecar", "ask_user timed out", { id: prompt.id }),
|
|
1288
|
+
});
|
|
1289
|
+
const askUserTool = createAskUserTool(asks.park);
|
|
1250
1290
|
// The session file path to resume (passed by the daemon's POST /session);
|
|
1251
1291
|
// empty/unset starts a fresh session.
|
|
1252
1292
|
const resumeSessionPath = opts.sessionPath;
|
|
@@ -1272,13 +1312,16 @@ async function createSession(deps, opts) {
|
|
|
1272
1312
|
session = createChatAgent(chatAgent, {
|
|
1273
1313
|
...baseSessionOptions,
|
|
1274
1314
|
sessionsDir: paths.sessionsDir,
|
|
1275
|
-
additionalTools: [
|
|
1315
|
+
additionalTools: [
|
|
1316
|
+
askUserTool,
|
|
1317
|
+
...buildMemoryTools(memoryStore),
|
|
1318
|
+
...buildJiwaTools(jiwaStore),
|
|
1319
|
+
],
|
|
1276
1320
|
getSystemPromptTail: () => `${memoryStore.renderForPrompt()}\n\n${jiwaStore.renderForPrompt()}`,
|
|
1277
1321
|
onAgentChange: async (nextAgent) => {
|
|
1278
1322
|
chatAgent = nextAgent;
|
|
1279
1323
|
broadcast("chat_agent_change", { chatAgent: nextAgent });
|
|
1280
1324
|
await session.persistAppMarker("agent_handoff", { chatAgent: nextAgent }).catch((error) => {
|
|
1281
|
-
captureSidecarError(error, "app-sidecar.chat-agent.persist-handoff");
|
|
1282
1325
|
log("WARN", "app-sidecar", "agent handoff marker persist failed", {
|
|
1283
1326
|
message: error instanceof Error ? error.message : String(error),
|
|
1284
1327
|
});
|
|
@@ -1289,6 +1332,7 @@ async function createSession(deps, opts) {
|
|
|
1289
1332
|
else {
|
|
1290
1333
|
session = new AgentSession({
|
|
1291
1334
|
...baseSessionOptions,
|
|
1335
|
+
additionalTools: [askUserTool],
|
|
1292
1336
|
// Plan mode belongs only to the coding agent.
|
|
1293
1337
|
onEnterPlan: async (reason) => {
|
|
1294
1338
|
// Unattended task runs cannot approve plans; implement directly instead.
|
|
@@ -1331,8 +1375,8 @@ async function createSession(deps, opts) {
|
|
|
1331
1375
|
}
|
|
1332
1376
|
}
|
|
1333
1377
|
log("INFO", "app-sidecar", "session ready", { provider, model, mode, chatAgent, cwd });
|
|
1334
|
-
// ── Local models (Ollama
|
|
1335
|
-
// Probing
|
|
1378
|
+
// ── Local models (Ollama, plus user-added custom endpoints) ──
|
|
1379
|
+
// Probing endpoints must never delay readiness, so this runs in the
|
|
1336
1380
|
// background (same shape as backgroundMcpConnect) and pushes a models_change
|
|
1337
1381
|
// frame when it lands.
|
|
1338
1382
|
let localProbes = [];
|
|
@@ -1375,6 +1419,204 @@ async function createSession(deps, opts) {
|
|
|
1375
1419
|
})),
|
|
1376
1420
|
};
|
|
1377
1421
|
}
|
|
1422
|
+
let hfPull = null;
|
|
1423
|
+
const hfPullPayload = (s) => ({
|
|
1424
|
+
repo: s.repo,
|
|
1425
|
+
model: s.model,
|
|
1426
|
+
tag: s.tag,
|
|
1427
|
+
file: s.file,
|
|
1428
|
+
sizeBytes: s.sizeBytes,
|
|
1429
|
+
phase: s.phase,
|
|
1430
|
+
percent: s.percent,
|
|
1431
|
+
...(s.detail ? { detail: s.detail } : {}),
|
|
1432
|
+
...(s.error ? { error: s.error } : {}),
|
|
1433
|
+
});
|
|
1434
|
+
/** Stored HF token, if the user connected the huggingface provider. */
|
|
1435
|
+
async function hfToken() {
|
|
1436
|
+
try {
|
|
1437
|
+
const auth = new AuthStorage(paths.authFile);
|
|
1438
|
+
const creds = await auth.resolveCredentials("huggingface");
|
|
1439
|
+
return creds.accessToken || undefined;
|
|
1440
|
+
}
|
|
1441
|
+
catch {
|
|
1442
|
+
return undefined;
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
async function hfHubJson(pathname) {
|
|
1446
|
+
const token = await hfToken();
|
|
1447
|
+
const res = await fetch(`https://huggingface.co${pathname}`, {
|
|
1448
|
+
headers: token ? { authorization: `Bearer ${token}` } : {},
|
|
1449
|
+
signal: AbortSignal.timeout(10_000),
|
|
1450
|
+
});
|
|
1451
|
+
if (!res.ok)
|
|
1452
|
+
throw new Error(`Hugging Face responded ${res.status}`);
|
|
1453
|
+
return res.json();
|
|
1454
|
+
}
|
|
1455
|
+
/** Search the Hub for GGUF repos (what Ollama can pull). */
|
|
1456
|
+
async function hfSearch(query) {
|
|
1457
|
+
// `filter=gguf` (the tag the Hub applies to repos that actually contain
|
|
1458
|
+
// GGUF files) — `library=gguf` also matches safetensors-only base repos,
|
|
1459
|
+
// which then fail at pull time. `expand[]=gguf` confirms per row.
|
|
1460
|
+
const params = new URLSearchParams({
|
|
1461
|
+
search: query,
|
|
1462
|
+
filter: "gguf",
|
|
1463
|
+
sort: "downloads",
|
|
1464
|
+
direction: "-1",
|
|
1465
|
+
limit: "12",
|
|
1466
|
+
});
|
|
1467
|
+
for (const field of ["gguf", "downloads", "likes", "lastModified"]) {
|
|
1468
|
+
params.append("expand[]", field);
|
|
1469
|
+
}
|
|
1470
|
+
const data = (await hfHubJson(`/api/models?${params.toString()}`));
|
|
1471
|
+
return (Array.isArray(data) ? data : [])
|
|
1472
|
+
.map(toHfSearchRow)
|
|
1473
|
+
.filter((r) => r !== null);
|
|
1474
|
+
}
|
|
1475
|
+
/**
|
|
1476
|
+
* Start `ollama pull hf.co/<repo>[:quant]`. Resolves once the child is
|
|
1477
|
+
* spawned; progress streams as `hf_pull` events. The chosen quant comes from
|
|
1478
|
+
* the repo's real file list — the client only ever sends a repo id, so there
|
|
1479
|
+
* is no injection surface into argv.
|
|
1480
|
+
*/
|
|
1481
|
+
async function startHfPull(repo) {
|
|
1482
|
+
if (hfPull?.child) {
|
|
1483
|
+
throw Object.assign(new Error("A download is already running."), { status: 409 });
|
|
1484
|
+
}
|
|
1485
|
+
// `recursive=true`: many repos (unsloth, mradermacher) keep quants in
|
|
1486
|
+
// per-quant subfolders, and a flat listing reports them as GGUF-less.
|
|
1487
|
+
const tree = (await hfHubJson(`/api/models/${repo}/tree/main?recursive=true`));
|
|
1488
|
+
const files = (Array.isArray(tree) ? tree : []).flatMap((entry) => {
|
|
1489
|
+
const e = entry;
|
|
1490
|
+
// `type` guards a directory entry (size 0) from beating real files in the
|
|
1491
|
+
// size fallback; the Hub marks folders as "directory".
|
|
1492
|
+
if (e.type !== undefined && e.type !== "file")
|
|
1493
|
+
return [];
|
|
1494
|
+
if (typeof e.path !== "string" || !e.path.toLowerCase().endsWith(".gguf"))
|
|
1495
|
+
return [];
|
|
1496
|
+
const size = Number(e.lfs?.size ?? e.size ?? 0);
|
|
1497
|
+
return [{ path: e.path, sizeBytes: Number.isFinite(size) ? size : 0 }];
|
|
1498
|
+
});
|
|
1499
|
+
const choice = pickGgufQuant(files);
|
|
1500
|
+
if (!choice) {
|
|
1501
|
+
const sharded = files.some((f) => isGgufShard(f.path));
|
|
1502
|
+
throw Object.assign(new Error(sharded ? SHARDED_MESSAGE : "That repo has no GGUF file for Ollama to pull."), { status: 400 });
|
|
1503
|
+
}
|
|
1504
|
+
const model = `hf.co/${repo}${choice.tag ? `:${choice.tag}` : ""}`;
|
|
1505
|
+
const token = await hfToken();
|
|
1506
|
+
const state = {
|
|
1507
|
+
repo,
|
|
1508
|
+
model,
|
|
1509
|
+
tag: choice.tag,
|
|
1510
|
+
file: choice.file.path,
|
|
1511
|
+
sizeBytes: choice.file.sizeBytes,
|
|
1512
|
+
phase: "preparing",
|
|
1513
|
+
percent: 0,
|
|
1514
|
+
child: null,
|
|
1515
|
+
};
|
|
1516
|
+
hfPull = state;
|
|
1517
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1518
|
+
// ollama prints progress to stderr (stdout on some builds); parse both.
|
|
1519
|
+
let stderrTail = "";
|
|
1520
|
+
let lastBroadcast = "";
|
|
1521
|
+
const feed = (chunk) => {
|
|
1522
|
+
// Once the pull is terminal (success, failure, or user cancel) stop
|
|
1523
|
+
// parsing: a killed ollama dumps a burst of stderr that would otherwise
|
|
1524
|
+
// spam the modal with garbage frames after the outcome is already shown.
|
|
1525
|
+
if (state.phase === "success" || state.phase === "error")
|
|
1526
|
+
return;
|
|
1527
|
+
for (const line of chunk.split(/\r\n|\r|\n/)) {
|
|
1528
|
+
const parsed = parseOllamaPullLine(line);
|
|
1529
|
+
if (!parsed)
|
|
1530
|
+
continue;
|
|
1531
|
+
// A redrawn frame repeats `pulling manifest` next to live progress; it
|
|
1532
|
+
// must not drag the modal back to "Contacting Ollama…".
|
|
1533
|
+
if (!advancesPhase(state.phase, parsed.phase))
|
|
1534
|
+
continue;
|
|
1535
|
+
if (parsed.phase !== "error") {
|
|
1536
|
+
state.phase = parsed.phase;
|
|
1537
|
+
if (parsed.percent !== undefined)
|
|
1538
|
+
state.percent = parsed.percent;
|
|
1539
|
+
state.detail = parsed.detail;
|
|
1540
|
+
}
|
|
1541
|
+
// ollama redraws its TUI frame several times a second, mostly with
|
|
1542
|
+
// identical numbers. Broadcasting each one re-rendered the modal for no
|
|
1543
|
+
// visible change; only a frame that actually reads differently ships.
|
|
1544
|
+
const next = JSON.stringify(hfPullPayload(state));
|
|
1545
|
+
if (next === lastBroadcast)
|
|
1546
|
+
continue;
|
|
1547
|
+
lastBroadcast = next;
|
|
1548
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1549
|
+
}
|
|
1550
|
+
};
|
|
1551
|
+
try {
|
|
1552
|
+
const child = spawn("ollama", ["pull", model], {
|
|
1553
|
+
env: { ...process.env, ...(token ? { HF_TOKEN: token } : {}) },
|
|
1554
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1555
|
+
});
|
|
1556
|
+
state.child = child;
|
|
1557
|
+
child.stdout?.setEncoding("utf8");
|
|
1558
|
+
child.stderr?.setEncoding("utf8");
|
|
1559
|
+
child.stdout?.on("data", feed);
|
|
1560
|
+
child.stderr?.on("data", (d) => {
|
|
1561
|
+
stderrTail = (stderrTail + d).slice(-2000);
|
|
1562
|
+
feed(d);
|
|
1563
|
+
});
|
|
1564
|
+
child.on("error", (err) => {
|
|
1565
|
+
state.child = null;
|
|
1566
|
+
state.phase = "error";
|
|
1567
|
+
state.error =
|
|
1568
|
+
err.code === "ENOENT"
|
|
1569
|
+
? "Ollama isn't installed (or isn't on PATH). Install it from ollama.com, then retry."
|
|
1570
|
+
: `Could not start Ollama: ${err.message}`;
|
|
1571
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1572
|
+
});
|
|
1573
|
+
child.on("close", (code) => {
|
|
1574
|
+
state.child = null;
|
|
1575
|
+
if (state.phase === "success" || state.phase === "error")
|
|
1576
|
+
return; // cancelled
|
|
1577
|
+
if (code === 0) {
|
|
1578
|
+
state.phase = "success";
|
|
1579
|
+
state.percent = 100;
|
|
1580
|
+
state.detail = undefined;
|
|
1581
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1582
|
+
// The new model only exists to the app once Ollama lists it. Ollama's
|
|
1583
|
+
// library is machine-wide, like the shared auth file, so every window
|
|
1584
|
+
// gets the refresh — not just the one that ran the download.
|
|
1585
|
+
void scanLocalModels(true)
|
|
1586
|
+
.then(() => broadcastAll("models_change", { local: localStatePayload() }))
|
|
1587
|
+
.catch(() => undefined);
|
|
1588
|
+
}
|
|
1589
|
+
else {
|
|
1590
|
+
state.phase = "error";
|
|
1591
|
+
state.error = state.error ?? explainPullFailure(stderrTail);
|
|
1592
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1593
|
+
}
|
|
1594
|
+
});
|
|
1595
|
+
}
|
|
1596
|
+
catch (err) {
|
|
1597
|
+
state.child = null;
|
|
1598
|
+
state.phase = "error";
|
|
1599
|
+
state.error = `Could not start Ollama: ${err instanceof Error ? err.message : String(err)}`;
|
|
1600
|
+
broadcast("hf_pull", hfPullPayload(state));
|
|
1601
|
+
}
|
|
1602
|
+
return hfPullPayload(state);
|
|
1603
|
+
}
|
|
1604
|
+
function cancelHfPull() {
|
|
1605
|
+
const child = hfPull?.child;
|
|
1606
|
+
if (!child)
|
|
1607
|
+
return false;
|
|
1608
|
+
// Terminal state FIRST, then the kill: the child's death rattle must not
|
|
1609
|
+
// overwrite the clean "cancelled" outcome with raw stderr.
|
|
1610
|
+
if (hfPull) {
|
|
1611
|
+
hfPull.phase = "error";
|
|
1612
|
+
hfPull.error = "Download cancelled.";
|
|
1613
|
+
hfPull.detail = undefined;
|
|
1614
|
+
hfPull.child = null;
|
|
1615
|
+
broadcast("hf_pull", hfPullPayload(hfPull));
|
|
1616
|
+
}
|
|
1617
|
+
child.kill("SIGTERM");
|
|
1618
|
+
return true;
|
|
1619
|
+
}
|
|
1378
1620
|
/**
|
|
1379
1621
|
* Why `modelId` can't be selected right now, or `undefined` when it can.
|
|
1380
1622
|
* Two real footguns get a clear answer instead of a mid-run provider error:
|
|
@@ -1536,7 +1778,6 @@ async function createSession(deps, opts) {
|
|
|
1536
1778
|
.catch(() => false)
|
|
1537
1779
|
.then(() => syncApprovedPlanProgress(generation))
|
|
1538
1780
|
.catch((error) => {
|
|
1539
|
-
captureSidecarError(error, "app-sidecar.plan.refresh-progress");
|
|
1540
1781
|
log("WARN", "app-sidecar", "plan progress refresh failed", {
|
|
1541
1782
|
message: error instanceof Error ? error.message : String(error),
|
|
1542
1783
|
});
|
|
@@ -1595,16 +1836,17 @@ async function createSession(deps, opts) {
|
|
|
1595
1836
|
session.eventBus.on("tool_call_end", (d) => {
|
|
1596
1837
|
const name = toolCallNames.get(d.toolCallId) ?? "unknown";
|
|
1597
1838
|
toolCallNames.delete(d.toolCallId);
|
|
1598
|
-
if (d.isError && shouldCaptureToolFailure(name, d.result)) {
|
|
1599
|
-
// Expected model-correctable validation failures stay in the local log and
|
|
1600
|
-
// conversation. Unexpected failures are reported without private result data.
|
|
1601
|
-
captureSidecarError(new Error(`Tool ${name} failed`), `tool.${name}`, { tool: name });
|
|
1602
|
-
}
|
|
1603
1839
|
log(d.isError ? "ERROR" : "INFO", "tool", `Tool call ended: ${name}`, {
|
|
1604
1840
|
id: d.toolCallId,
|
|
1605
1841
|
durationMs: String(d.durationMs),
|
|
1606
1842
|
isError: String(d.isError),
|
|
1607
1843
|
...(d.isError ? { result: d.result.slice(0, 500) } : {}),
|
|
1844
|
+
// Consecutive-failure count for schema rejections. Attempt 1 followed by
|
|
1845
|
+
// a success means the model self-corrected; reaching 3 means it looped
|
|
1846
|
+
// and the turn was ended. Grep this to tell the two apart.
|
|
1847
|
+
...(d.invalidArgAttempt === undefined
|
|
1848
|
+
? {}
|
|
1849
|
+
: { invalidArgAttempt: String(d.invalidArgAttempt) }),
|
|
1608
1850
|
});
|
|
1609
1851
|
broadcast("tool_call_end", d);
|
|
1610
1852
|
// The agent can add/done/remove project tasks via the `tasks` tool during a
|
|
@@ -1628,12 +1870,25 @@ async function createSession(deps, opts) {
|
|
|
1628
1870
|
session.eventBus.on("agent_done", (d) => broadcast("agent_done", d));
|
|
1629
1871
|
// Non-clean stop (max_tokens/refusal/provider error) — info-style frame so
|
|
1630
1872
|
// the webview can warn instead of presenting truncated output as complete.
|
|
1631
|
-
|
|
1873
|
+
// empty_response is a hard failure (no output at all): route it through
|
|
1874
|
+
// broadcastError so the app renders an error row — the webview does not
|
|
1875
|
+
// render bare "truncated" frames.
|
|
1876
|
+
session.eventBus.on("truncated", (d) => {
|
|
1877
|
+
if (d.reason === "empty_response") {
|
|
1878
|
+
broadcastError("error", "empty response", new Error("The model returned an empty response after retries — try sending again."));
|
|
1879
|
+
return;
|
|
1880
|
+
}
|
|
1881
|
+
broadcast("truncated", d);
|
|
1882
|
+
});
|
|
1632
1883
|
session.eventBus.on("error", (d) => {
|
|
1633
1884
|
broadcastError("error", "agent error", d.error);
|
|
1634
1885
|
});
|
|
1635
1886
|
session.eventBus.on("model_change", (d) => broadcast("model_change", d));
|
|
1636
1887
|
session.eventBus.on("hook", (d) => broadcast("hook", d));
|
|
1888
|
+
// Fires BEFORE the candidate final answer streams. The webview holds assistant
|
|
1889
|
+
// text back while armed, so an Ideal review supersedes a draft that was never
|
|
1890
|
+
// painted instead of deleting one the user already started reading.
|
|
1891
|
+
session.eventBus.on("hook_armed", (d) => broadcast("hook_armed", d));
|
|
1637
1892
|
session.eventBus.on("subagent_state", (d) => broadcast("subagent_state", d));
|
|
1638
1893
|
session.eventBus.on("compaction_start", (d) => broadcast("compaction_start", d));
|
|
1639
1894
|
session.eventBus.on("compaction_end", (d) => broadcast("compaction_end", d));
|
|
@@ -1794,7 +2049,6 @@ async function createSession(deps, opts) {
|
|
|
1794
2049
|
cwd,
|
|
1795
2050
|
systemPrompt: await buildNolanSystemPrompt(cwd),
|
|
1796
2051
|
allowedTools: NOLAN_ALLOWED_TOOLS,
|
|
1797
|
-
allowedMcpServers: NOLAN_ALLOWED_MCP_SERVERS,
|
|
1798
2052
|
transient: true,
|
|
1799
2053
|
signal: nolanAbort.signal,
|
|
1800
2054
|
// Nolan belongs to this window, so route MCP elicitation prompts there.
|
|
@@ -1866,7 +2120,6 @@ async function createSession(deps, opts) {
|
|
|
1866
2120
|
cwd,
|
|
1867
2121
|
systemPrompt: await buildNolanAutopilotSystemPrompt(cwd),
|
|
1868
2122
|
allowedTools: NOLAN_ALLOWED_TOOLS,
|
|
1869
|
-
allowedMcpServers: NOLAN_ALLOWED_MCP_SERVERS,
|
|
1870
2123
|
transient: true,
|
|
1871
2124
|
signal: nolanAutoAbort.signal,
|
|
1872
2125
|
// Route this window's MCP elicitation prompts through the shared bridge.
|
|
@@ -1893,8 +2146,9 @@ async function createSession(deps, opts) {
|
|
|
1893
2146
|
abort.abort();
|
|
1894
2147
|
// An MCP tool call parked on user input is not cancelled by the signal —
|
|
1895
2148
|
// the promise lives in the bridge. Release it, or the aborted turn's tool
|
|
1896
|
-
// call never returns.
|
|
2149
|
+
// call never returns. Same for a question parked on the user.
|
|
1897
2150
|
elicitations.cancelAll();
|
|
2151
|
+
asks.cancelAll();
|
|
1898
2152
|
// Stop a run-all sweep and every async child through AgentSession's signal.
|
|
1899
2153
|
taskRunAll = false;
|
|
1900
2154
|
autopilotCancelled = true;
|
|
@@ -1980,7 +2234,6 @@ async function createSession(deps, opts) {
|
|
|
1980
2234
|
catch (error) {
|
|
1981
2235
|
// Keep tracking when prompt cleanup fails; hiding the widget here
|
|
1982
2236
|
// would claim completion while the approved-plan contract remained.
|
|
1983
|
-
captureSidecarError(error, "app-sidecar.plan.cleanup");
|
|
1984
2237
|
log("WARN", "app-sidecar", "completed plan cleanup failed", {
|
|
1985
2238
|
message: error instanceof Error ? error.message : String(error),
|
|
1986
2239
|
});
|
|
@@ -2508,7 +2761,6 @@ async function createSession(deps, opts) {
|
|
|
2508
2761
|
const payload = JSON.stringify(redactValue(body, { secrets: environmentSecrets(process.env) }));
|
|
2509
2762
|
res.writeHead(status, {
|
|
2510
2763
|
"content-type": "application/json",
|
|
2511
|
-
"access-control-allow-origin": "*",
|
|
2512
2764
|
});
|
|
2513
2765
|
res.end(payload);
|
|
2514
2766
|
}
|
|
@@ -2541,7 +2793,6 @@ async function createSession(deps, opts) {
|
|
|
2541
2793
|
.snapshot()
|
|
2542
2794
|
.then((snapshot) => json(res, 200, snapshot))
|
|
2543
2795
|
.catch((error) => {
|
|
2544
|
-
captureSidecarError(error, "app-sidecar.memory.snapshot");
|
|
2545
2796
|
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
2546
2797
|
});
|
|
2547
2798
|
return;
|
|
@@ -2557,7 +2808,6 @@ async function createSession(deps, opts) {
|
|
|
2557
2808
|
.then(() => memoryStore.snapshot())
|
|
2558
2809
|
.then((snapshot) => json(res, 200, snapshot))
|
|
2559
2810
|
.catch((error) => {
|
|
2560
|
-
captureSidecarError(error, "app-sidecar.memory.forget");
|
|
2561
2811
|
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
2562
2812
|
});
|
|
2563
2813
|
return;
|
|
@@ -2567,7 +2817,6 @@ async function createSession(deps, opts) {
|
|
|
2567
2817
|
.snapshot()
|
|
2568
2818
|
.then((snapshot) => json(res, 200, snapshot))
|
|
2569
2819
|
.catch((error) => {
|
|
2570
|
-
captureSidecarError(error, "app-sidecar.jiwa.snapshot");
|
|
2571
2820
|
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
2572
2821
|
});
|
|
2573
2822
|
return;
|
|
@@ -2583,7 +2832,6 @@ async function createSession(deps, opts) {
|
|
|
2583
2832
|
.then(() => jiwaStore.snapshot())
|
|
2584
2833
|
.then((snapshot) => json(res, 200, snapshot))
|
|
2585
2834
|
.catch((error) => {
|
|
2586
|
-
captureSidecarError(error, "app-sidecar.jiwa.forget");
|
|
2587
2835
|
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
2588
2836
|
});
|
|
2589
2837
|
return;
|
|
@@ -2593,7 +2841,6 @@ async function createSession(deps, opts) {
|
|
|
2593
2841
|
"content-type": "text/event-stream",
|
|
2594
2842
|
"cache-control": "no-cache",
|
|
2595
2843
|
connection: "keep-alive",
|
|
2596
|
-
"access-control-allow-origin": "*",
|
|
2597
2844
|
});
|
|
2598
2845
|
res.write(`retry: 1000\n\n`);
|
|
2599
2846
|
const client = { id: ++clientSeq, res };
|
|
@@ -2626,7 +2873,6 @@ async function createSession(deps, opts) {
|
|
|
2626
2873
|
void listInstalledPlugins(paths.extensionsDir)
|
|
2627
2874
|
.then((plugins) => json(res, 200, { plugins }))
|
|
2628
2875
|
.catch((error) => {
|
|
2629
|
-
captureSidecarError(error, "app-sidecar.plugins.list");
|
|
2630
2876
|
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
2631
2877
|
});
|
|
2632
2878
|
return;
|
|
@@ -2645,7 +2891,6 @@ async function createSession(deps, opts) {
|
|
|
2645
2891
|
json(res, 200, { plugin, restartRequired: true });
|
|
2646
2892
|
}
|
|
2647
2893
|
catch (error) {
|
|
2648
|
-
captureSidecarError(error, "app-sidecar.plugins.install");
|
|
2649
2894
|
json(res, 400, { error: error instanceof Error ? error.message : String(error) });
|
|
2650
2895
|
}
|
|
2651
2896
|
});
|
|
@@ -2656,7 +2901,6 @@ async function createSession(deps, opts) {
|
|
|
2656
2901
|
void removePlugin(pluginId, paths.extensionsDir)
|
|
2657
2902
|
.then(() => json(res, 200, { removed: pluginId, restartRequired: true }))
|
|
2658
2903
|
.catch((error) => {
|
|
2659
|
-
captureSidecarError(error, "app-sidecar.plugins.remove");
|
|
2660
2904
|
json(res, 400, { error: error instanceof Error ? error.message : String(error) });
|
|
2661
2905
|
});
|
|
2662
2906
|
return;
|
|
@@ -2741,7 +2985,6 @@ async function createSession(deps, opts) {
|
|
|
2741
2985
|
json(res, 200, { path: dir });
|
|
2742
2986
|
}
|
|
2743
2987
|
catch (err) {
|
|
2744
|
-
captureSidecarError(err, "app-sidecar.project.create");
|
|
2745
2988
|
json(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
2746
2989
|
}
|
|
2747
2990
|
});
|
|
@@ -2780,7 +3023,6 @@ async function createSession(deps, opts) {
|
|
|
2780
3023
|
json(res, 200, { hidden: Array.from(current) });
|
|
2781
3024
|
}
|
|
2782
3025
|
catch (err) {
|
|
2783
|
-
captureSidecarError(err, "app-sidecar.projects.hidden");
|
|
2784
3026
|
json(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
2785
3027
|
}
|
|
2786
3028
|
});
|
|
@@ -2796,7 +3038,6 @@ async function createSession(deps, opts) {
|
|
|
2796
3038
|
}))
|
|
2797
3039
|
.then((projects) => json(res, 200, { projects }))
|
|
2798
3040
|
.catch((err) => {
|
|
2799
|
-
captureSidecarError(err, "app-sidecar.projects.discover");
|
|
2800
3041
|
log("ERROR", "app-sidecar", "discoverProjects failed", {
|
|
2801
3042
|
message: err instanceof Error ? err.message : String(err),
|
|
2802
3043
|
});
|
|
@@ -2815,10 +3056,7 @@ async function createSession(deps, opts) {
|
|
|
2815
3056
|
// agent or request the combined, recency-sorted "all" listing.
|
|
2816
3057
|
void listSidecarSessions(target, requestedAgent, paths.sessionsDir)
|
|
2817
3058
|
.then((sessions) => json(res, 200, { sessions }))
|
|
2818
|
-
.catch((
|
|
2819
|
-
captureSidecarError(error, "app-sidecar.sessions.list");
|
|
2820
|
-
json(res, 200, { sessions: [] });
|
|
2821
|
-
});
|
|
3059
|
+
.catch(() => json(res, 200, { sessions: [] }));
|
|
2822
3060
|
return;
|
|
2823
3061
|
}
|
|
2824
3062
|
if (method === "GET" && url.startsWith("/files")) {
|
|
@@ -2826,7 +3064,6 @@ async function createSession(deps, opts) {
|
|
|
2826
3064
|
void searchProjectFiles(cwd, q)
|
|
2827
3065
|
.then((files) => json(res, 200, { files }))
|
|
2828
3066
|
.catch((err) => {
|
|
2829
|
-
captureSidecarError(err, "app-sidecar.files.search");
|
|
2830
3067
|
log("ERROR", "app-sidecar", "searchProjectFiles failed", {
|
|
2831
3068
|
message: err instanceof Error ? err.message : String(err),
|
|
2832
3069
|
});
|
|
@@ -3270,6 +3507,13 @@ async function createSession(deps, opts) {
|
|
|
3270
3507
|
json(res, 400, { error: "empty prompt" });
|
|
3271
3508
|
return;
|
|
3272
3509
|
}
|
|
3510
|
+
// A typed prompt supersedes any question parked on the user: they
|
|
3511
|
+
// answered with a message of their own. Release the blocked tool call
|
|
3512
|
+
// NOW — otherwise it waits out its ten-minute timeout while this very
|
|
3513
|
+
// message sits behind it as steering that only drains once the tool
|
|
3514
|
+
// returns, so the turn looks frozen. The webview closes the band on
|
|
3515
|
+
// send; a racing /ask POST just 409s.
|
|
3516
|
+
asks.cancelAll({ action: "cancel", superseded: true });
|
|
3273
3517
|
if (runLifecycle.running &&
|
|
3274
3518
|
runLifecycle.isCancellationRequested(runLifecycle.generation)) {
|
|
3275
3519
|
json(res, 409, {
|
|
@@ -3359,7 +3603,7 @@ async function createSession(deps, opts) {
|
|
|
3359
3603
|
});
|
|
3360
3604
|
// After the user's run settles, kick off Nolan's auto-review loop — but
|
|
3361
3605
|
// only when the turn is actually reviewable (shouldStartAutopilotCycle):
|
|
3362
|
-
// workflow commands (/compare, /
|
|
3606
|
+
// workflow commands (/compare, /expand, …) end with reports or
|
|
3363
3607
|
// A/B/C choices reserved for the USER; registry commands (/help) and
|
|
3364
3608
|
// failed runs add no assistant work to judge; a turn that ended in plan
|
|
3365
3609
|
// mode has a pending Accept/Reject modal Nolan must not preempt. This is
|
|
@@ -3514,7 +3758,6 @@ async function createSession(deps, opts) {
|
|
|
3514
3758
|
}
|
|
3515
3759
|
catch (err) {
|
|
3516
3760
|
const message = err instanceof Error ? err.message : String(err);
|
|
3517
|
-
captureSidecarError(err, "app-sidecar.prompt-enhancer");
|
|
3518
3761
|
log("ERROR", "app-sidecar", "enhance failed", { message });
|
|
3519
3762
|
json(res, 500, { error: message });
|
|
3520
3763
|
}
|
|
@@ -3854,6 +4097,14 @@ async function createSession(deps, opts) {
|
|
|
3854
4097
|
json(res, 400, { error: "invalid JSON body" });
|
|
3855
4098
|
return;
|
|
3856
4099
|
}
|
|
4100
|
+
// Same lock as POST /model, for the same reason: this retargets Nolan's
|
|
4101
|
+
// chat session AND the autopilot reviewer, and `switchModel` on a
|
|
4102
|
+
// session mid-turn races the stream it is already consuming. The
|
|
4103
|
+
// footer picker is disabled to match; this is the enforcement.
|
|
4104
|
+
if (running || nolanRunning || autopilotReviewing) {
|
|
4105
|
+
json(res, 409, { error: "cannot switch Nolan's model while running" });
|
|
4106
|
+
return;
|
|
4107
|
+
}
|
|
3857
4108
|
if (modelId === null) {
|
|
3858
4109
|
// Clear the pin → follow EZ Coder again, syncing both sessions back.
|
|
3859
4110
|
nolanModelOverride = null;
|
|
@@ -3970,6 +4221,14 @@ async function createSession(deps, opts) {
|
|
|
3970
4221
|
return;
|
|
3971
4222
|
}
|
|
3972
4223
|
if (method === "POST" && url === "/thinking") {
|
|
4224
|
+
// The in-flight request already carries its reasoning config, so a
|
|
4225
|
+
// mid-run cycle cannot affect the turn the user is watching — it just
|
|
4226
|
+
// persists a level the footer then reports for a run that never used it.
|
|
4227
|
+
// Locked like POST /model; the footer button is disabled to match.
|
|
4228
|
+
if (running) {
|
|
4229
|
+
json(res, 409, { error: "cannot change reasoning level while running" });
|
|
4230
|
+
return;
|
|
4231
|
+
}
|
|
3973
4232
|
const st = session.getState();
|
|
3974
4233
|
const next = getNextThinkingLevel(st.provider, st.model, session.getThinkingLevel());
|
|
3975
4234
|
session.setThinkingLevel(next);
|
|
@@ -4027,7 +4286,6 @@ async function createSession(deps, opts) {
|
|
|
4027
4286
|
drained,
|
|
4028
4287
|
});
|
|
4029
4288
|
})().catch((error) => {
|
|
4030
|
-
captureSidecarError(error, "app-sidecar.run.cancel");
|
|
4031
4289
|
broadcast("cancel_failed", { error: "cancel_failed", runState: runLifecycle.state });
|
|
4032
4290
|
json(res, 500, {
|
|
4033
4291
|
error: "cancel_failed",
|
|
@@ -4055,7 +4313,6 @@ async function createSession(deps, opts) {
|
|
|
4055
4313
|
json(res, 200, { ok: true });
|
|
4056
4314
|
})
|
|
4057
4315
|
.catch((err) => {
|
|
4058
|
-
captureSidecarError(err, "app-sidecar.session.new");
|
|
4059
4316
|
json(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
4060
4317
|
});
|
|
4061
4318
|
return;
|
|
@@ -4112,7 +4369,6 @@ async function createSession(deps, opts) {
|
|
|
4112
4369
|
json(res, 200, { ok: true, planTotal });
|
|
4113
4370
|
}
|
|
4114
4371
|
catch (err) {
|
|
4115
|
-
captureSidecarError(err, "app-sidecar.plan.accept");
|
|
4116
4372
|
json(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
4117
4373
|
}
|
|
4118
4374
|
});
|
|
@@ -4242,7 +4498,6 @@ async function createSession(deps, opts) {
|
|
|
4242
4498
|
broadcastAll("models_change", {});
|
|
4243
4499
|
}
|
|
4244
4500
|
catch (err) {
|
|
4245
|
-
captureSidecarError(err, "app-sidecar.auth.oauth", { provider });
|
|
4246
4501
|
// Deliberately session-scoped: this is the outcome of ONE window's
|
|
4247
4502
|
// attempt. Another window that never pressed Connect has nothing to
|
|
4248
4503
|
// show an error about, and its modal correctly still offers login.
|
|
@@ -4315,6 +4570,50 @@ async function createSession(deps, opts) {
|
|
|
4315
4570
|
});
|
|
4316
4571
|
return;
|
|
4317
4572
|
}
|
|
4573
|
+
// Answer (or dismiss) an `ask_user` question band. The turn is blocked on
|
|
4574
|
+
// this, so both paths must land: "answer" carries the picked values,
|
|
4575
|
+
// "cancel" releases the tool call with no answer.
|
|
4576
|
+
if (method === "POST" && url.startsWith("/ask/")) {
|
|
4577
|
+
const id = decodeURIComponent(url.slice("/ask/".length));
|
|
4578
|
+
void readBody(req, res).then((raw) => {
|
|
4579
|
+
if (raw === null)
|
|
4580
|
+
return;
|
|
4581
|
+
let result;
|
|
4582
|
+
try {
|
|
4583
|
+
const parsed = JSON.parse(raw);
|
|
4584
|
+
if (parsed.action !== "answer" && parsed.action !== "cancel") {
|
|
4585
|
+
json(res, 400, { error: "action must be answer or cancel" });
|
|
4586
|
+
return;
|
|
4587
|
+
}
|
|
4588
|
+
if (parsed.action === "cancel") {
|
|
4589
|
+
result = { action: "cancel" };
|
|
4590
|
+
}
|
|
4591
|
+
else {
|
|
4592
|
+
// Only strings and string arrays are answers; anything else is a
|
|
4593
|
+
// malformed client, not a value to hand the model.
|
|
4594
|
+
const answers = {};
|
|
4595
|
+
for (const [key, value] of Object.entries(parsed.answers ?? {})) {
|
|
4596
|
+
if (typeof value === "string")
|
|
4597
|
+
answers[key] = value;
|
|
4598
|
+
else if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
|
|
4599
|
+
answers[key] = value;
|
|
4600
|
+
}
|
|
4601
|
+
}
|
|
4602
|
+
result = { action: "answer", answers };
|
|
4603
|
+
}
|
|
4604
|
+
}
|
|
4605
|
+
catch {
|
|
4606
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
4607
|
+
return;
|
|
4608
|
+
}
|
|
4609
|
+
if (!asks.settle(id, result)) {
|
|
4610
|
+
json(res, 409, { error: "no question is awaiting an answer" });
|
|
4611
|
+
return;
|
|
4612
|
+
}
|
|
4613
|
+
json(res, 200, { ok: true });
|
|
4614
|
+
});
|
|
4615
|
+
return;
|
|
4616
|
+
}
|
|
4318
4617
|
if (method === "POST" && url === "/auth/logout") {
|
|
4319
4618
|
void readBody(req, res).then(async (raw) => {
|
|
4320
4619
|
if (raw === null)
|
|
@@ -4431,6 +4730,80 @@ async function createSession(deps, opts) {
|
|
|
4431
4730
|
})();
|
|
4432
4731
|
return;
|
|
4433
4732
|
}
|
|
4733
|
+
// ── Hugging Face search & pull (the "Add from Hugging Face" modal) ──
|
|
4734
|
+
if (method === "GET" && url === "/hf/pull") {
|
|
4735
|
+
json(res, 200, hfPull ? { active: hfPullPayload(hfPull) } : { active: null });
|
|
4736
|
+
return;
|
|
4737
|
+
}
|
|
4738
|
+
if (method === "POST" && url === "/hf/search") {
|
|
4739
|
+
void readBody(req, res).then(async (raw) => {
|
|
4740
|
+
if (raw === null)
|
|
4741
|
+
return;
|
|
4742
|
+
let body;
|
|
4743
|
+
try {
|
|
4744
|
+
body = JSON.parse(raw);
|
|
4745
|
+
}
|
|
4746
|
+
catch {
|
|
4747
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
4748
|
+
return;
|
|
4749
|
+
}
|
|
4750
|
+
// Strip control characters and cap length — this goes into a URL query.
|
|
4751
|
+
const query = String(body.query ?? "")
|
|
4752
|
+
// eslint-disable-next-line no-control-regex -- stripping control characters is the point
|
|
4753
|
+
.replace(/[\u0000-\u001f]/g, "")
|
|
4754
|
+
.trim()
|
|
4755
|
+
.slice(0, 100);
|
|
4756
|
+
if (!query) {
|
|
4757
|
+
json(res, 400, { error: "Type something to search for." });
|
|
4758
|
+
return;
|
|
4759
|
+
}
|
|
4760
|
+
try {
|
|
4761
|
+
json(res, 200, { models: await hfSearch(query) });
|
|
4762
|
+
}
|
|
4763
|
+
catch (err) {
|
|
4764
|
+
broadcastError("error", "hugging face search failed", err);
|
|
4765
|
+
json(res, 502, {
|
|
4766
|
+
error: `Hugging Face search failed — ${err instanceof Error ? err.message : "network error"}.`,
|
|
4767
|
+
});
|
|
4768
|
+
}
|
|
4769
|
+
});
|
|
4770
|
+
return;
|
|
4771
|
+
}
|
|
4772
|
+
if (method === "POST" && url === "/hf/pull") {
|
|
4773
|
+
void readBody(req, res).then(async (raw) => {
|
|
4774
|
+
if (raw === null)
|
|
4775
|
+
return;
|
|
4776
|
+
let body;
|
|
4777
|
+
try {
|
|
4778
|
+
body = JSON.parse(raw);
|
|
4779
|
+
}
|
|
4780
|
+
catch {
|
|
4781
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
4782
|
+
return;
|
|
4783
|
+
}
|
|
4784
|
+
const repo = String(body.repo ?? "").trim();
|
|
4785
|
+
if (!isValidHfRepoId(repo)) {
|
|
4786
|
+
json(res, 400, { error: 'Expected a Hugging Face repo like "org/model".' });
|
|
4787
|
+
return;
|
|
4788
|
+
}
|
|
4789
|
+
try {
|
|
4790
|
+
json(res, 200, await startHfPull(repo));
|
|
4791
|
+
}
|
|
4792
|
+
catch (err) {
|
|
4793
|
+
const status = err instanceof Error && "status" in err && typeof err.status === "number"
|
|
4794
|
+
? err.status
|
|
4795
|
+
: 502;
|
|
4796
|
+
if (status >= 500)
|
|
4797
|
+
broadcastError("error", "hugging face pull failed", err);
|
|
4798
|
+
json(res, status, { error: err instanceof Error ? err.message : "Pull failed." });
|
|
4799
|
+
}
|
|
4800
|
+
});
|
|
4801
|
+
return;
|
|
4802
|
+
}
|
|
4803
|
+
if (method === "POST" && url === "/hf/pull/cancel") {
|
|
4804
|
+
json(res, 200, { ok: cancelHfPull() });
|
|
4805
|
+
return;
|
|
4806
|
+
}
|
|
4434
4807
|
// ── Telegram config (mirrors `ezcoder telegram`) ─────────
|
|
4435
4808
|
if (method === "GET" && url === "/telegram") {
|
|
4436
4809
|
void loadTelegramConfig().then((cfg) => {
|
|
@@ -4517,7 +4890,6 @@ async function createSession(deps, opts) {
|
|
|
4517
4890
|
}
|
|
4518
4891
|
catch (err) {
|
|
4519
4892
|
serveController = null;
|
|
4520
|
-
captureSidecarError(err, "app-sidecar.serve.start", { provider: st.provider });
|
|
4521
4893
|
json(res, 400, { error: err instanceof Error ? err.message : String(err) });
|
|
4522
4894
|
}
|
|
4523
4895
|
})();
|
|
@@ -4535,16 +4907,32 @@ async function createSession(deps, opts) {
|
|
|
4535
4907
|
})();
|
|
4536
4908
|
return;
|
|
4537
4909
|
}
|
|
4910
|
+
// ── Agent Steroids (local code corpus) ───────────────────────────────
|
|
4911
|
+
if (method === "GET" && url === "/steroids") {
|
|
4912
|
+
void probeSteroids().then((status) => json(res, 200, status));
|
|
4913
|
+
return;
|
|
4914
|
+
}
|
|
4915
|
+
if (method === "POST" && url === "/steroids/install") {
|
|
4916
|
+
void installSteroids()
|
|
4917
|
+
.then((status) => {
|
|
4918
|
+
broadcast("steroids_change", status);
|
|
4919
|
+
log("INFO", "app-sidecar", "steroids installed", { version: status.version });
|
|
4920
|
+
json(res, 200, status);
|
|
4921
|
+
})
|
|
4922
|
+
.catch((err) => {
|
|
4923
|
+
json(res, 400, { error: err instanceof Error ? err.message : String(err) });
|
|
4924
|
+
});
|
|
4925
|
+
return;
|
|
4926
|
+
}
|
|
4538
4927
|
// ── MCP server management (mirrors `ezcoder mcp`) ──────────────────
|
|
4539
4928
|
// `targetCwd` (project scope) overrides the window cwd so a server can be
|
|
4540
4929
|
// added/removed for ANY discovered project, not just this window's. Global
|
|
4541
4930
|
// scope ignores it (always ~/.ezcoder/mcp.json).
|
|
4542
4931
|
if (method === "GET" && (url === "/mcp" || url.startsWith("/mcp?"))) {
|
|
4543
4932
|
const targetCwd = new URL(url, `http://${host}`).searchParams.get("cwd") ?? cwd;
|
|
4544
|
-
void buildMcpRows(targetCwd)
|
|
4933
|
+
void buildMcpRows(targetCwd, paths.settingsFile)
|
|
4545
4934
|
.then((servers) => json(res, 200, { servers }))
|
|
4546
4935
|
.catch((err) => {
|
|
4547
|
-
captureSidecarError(err, "app-sidecar.mcp.list");
|
|
4548
4936
|
log("ERROR", "app-sidecar", "buildMcpRows failed", {
|
|
4549
4937
|
message: err instanceof Error ? err.message : String(err),
|
|
4550
4938
|
});
|
|
@@ -4593,6 +4981,12 @@ async function createSession(deps, opts) {
|
|
|
4593
4981
|
json(res, 400, { error: saved.error });
|
|
4594
4982
|
return;
|
|
4595
4983
|
}
|
|
4984
|
+
// Adding a project-scope server is an explicit trust signal — the
|
|
4985
|
+
// user chose to put a server in this repo's .ezcoder/mcp.json. Auto-trust
|
|
4986
|
+
// the project so all project-scope servers connect on next load.
|
|
4987
|
+
if (scope === "project") {
|
|
4988
|
+
await session.trustProject(targetCwd);
|
|
4989
|
+
}
|
|
4596
4990
|
json(res, 200, {
|
|
4597
4991
|
ok: true,
|
|
4598
4992
|
name: config.name,
|
|
@@ -4603,7 +4997,6 @@ async function createSession(deps, opts) {
|
|
|
4603
4997
|
});
|
|
4604
4998
|
}
|
|
4605
4999
|
catch (err) {
|
|
4606
|
-
captureSidecarError(err, "app-sidecar.mcp.add", { server: config.name });
|
|
4607
5000
|
json(res, 500, {
|
|
4608
5001
|
error: err instanceof Error ? err.message : String(err),
|
|
4609
5002
|
});
|
|
@@ -4697,7 +5090,6 @@ async function createSession(deps, opts) {
|
|
|
4697
5090
|
}
|
|
4698
5091
|
}
|
|
4699
5092
|
catch (err) {
|
|
4700
|
-
captureSidecarError(err, "app-sidecar.mcp.login", { server: name });
|
|
4701
5093
|
broadcast("mcp_auth_error", {
|
|
4702
5094
|
name,
|
|
4703
5095
|
message: err instanceof Error ? err.message : String(err),
|
|
@@ -4713,6 +5105,7 @@ async function createSession(deps, opts) {
|
|
|
4713
5105
|
}
|
|
4714
5106
|
async function dispose() {
|
|
4715
5107
|
elicitations.cancelAll();
|
|
5108
|
+
asks.cancelAll();
|
|
4716
5109
|
tasksPollStopped = true;
|
|
4717
5110
|
if (tasksPoll)
|
|
4718
5111
|
clearTimeout(tasksPoll);
|
|
@@ -4749,8 +5142,6 @@ async function createSession(deps, opts) {
|
|
|
4749
5142
|
};
|
|
4750
5143
|
}
|
|
4751
5144
|
main().catch(async (err) => {
|
|
4752
|
-
captureSidecarError(err, "app-sidecar.main", { severity: "fatal" });
|
|
4753
|
-
await flushSidecarErrors();
|
|
4754
5145
|
const message = err instanceof Error ? err.message : String(err);
|
|
4755
5146
|
process.stderr.write(`GG_APP_FATAL ${message}\n`);
|
|
4756
5147
|
process.exit(1);
|