@prestyj/cli 5.8.0 → 5.10.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 +1 -1
- package/assets/skills/evidence-led-ui/LICENSES.md +12 -0
- package/assets/skills/evidence-led-ui/SKILL.md +15 -7
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
- package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
- package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
- package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
- package/dist/app-sidecar-sessions.d.ts +8 -0
- package/dist/app-sidecar-sessions.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.js +31 -0
- package/dist/app-sidecar-sessions.js.map +1 -0
- package/dist/app-sidecar-sessions.test.d.ts +2 -0
- package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.test.js +83 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -0
- package/dist/app-sidecar.js +623 -120
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/general.test.js +5 -3
- package/dist/chat-agents/general.test.js.map +1 -1
- package/dist/chat-agents/memory.d.ts.map +1 -1
- package/dist/chat-agents/memory.js +14 -5
- package/dist/chat-agents/memory.js.map +1 -1
- package/dist/chat-agents/memory.test.js +11 -1
- package/dist/chat-agents/memory.test.js.map +1 -1
- package/dist/chat-agents/shared.js +1 -1
- package/dist/chat-agents/shared.js.map +1 -1
- package/dist/chat-agents/specialists.test.js +3 -2
- package/dist/chat-agents/specialists.test.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -30
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -2
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +61 -1
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-mcp-passthrough.test.d.ts +2 -0
- package/dist/core/agent-mcp-passthrough.test.d.ts.map +1 -0
- package/dist/core/agent-mcp-passthrough.test.js +61 -0
- package/dist/core/agent-mcp-passthrough.test.js.map +1 -0
- package/dist/core/agent-session-add-dir.test.d.ts +2 -0
- package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
- package/dist/core/agent-session-add-dir.test.js +110 -0
- package/dist/core/agent-session-add-dir.test.js.map +1 -0
- package/dist/core/agent-session-compaction.test.js +23 -7
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-marker-anchors.test.d.ts +2 -0
- package/dist/core/agent-session-marker-anchors.test.d.ts.map +1 -0
- package/dist/core/agent-session-marker-anchors.test.js +147 -0
- package/dist/core/agent-session-marker-anchors.test.js.map +1 -0
- package/dist/core/agent-session-memory-tail.test.js +4 -7
- package/dist/core/agent-session-memory-tail.test.js.map +1 -1
- package/dist/core/agent-session-queue.test.js +4 -7
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-session-subagent-policy.test.js +7 -3
- package/dist/core/agent-session-subagent-policy.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +46 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +177 -19
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-tools-allowlist.test.js +5 -3
- package/dist/core/agent-tools-allowlist.test.js.map +1 -1
- package/dist/core/agents.d.ts +12 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +25 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/agents.test.d.ts +2 -0
- package/dist/core/agents.test.d.ts.map +1 -0
- package/dist/core/agents.test.js +67 -0
- package/dist/core/agents.test.js.map +1 -0
- package/dist/core/auth-providers.js +1 -1
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +20 -11
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +17 -4
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +1 -1
- package/dist/core/compaction/token-estimator.test.js.map +1 -1
- package/dist/core/encode-cwd.d.ts +17 -0
- package/dist/core/encode-cwd.d.ts.map +1 -1
- package/dist/core/encode-cwd.js +20 -7
- package/dist/core/encode-cwd.js.map +1 -1
- package/dist/core/encode-cwd.test.js +20 -1
- package/dist/core/encode-cwd.test.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +6 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-controller.test.js +3 -3
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/ideal-review.d.ts.map +1 -1
- package/dist/core/ideal-review.js +6 -1
- package/dist/core/ideal-review.js.map +1 -1
- package/dist/core/ideal-review.test.js +7 -2
- package/dist/core/ideal-review.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/input-normalization.test.d.ts +2 -0
- package/dist/core/input-normalization.test.d.ts.map +1 -0
- package/dist/core/input-normalization.test.js +75 -0
- package/dist/core/input-normalization.test.js.map +1 -0
- package/dist/core/local-endpoint-store.d.ts +50 -0
- package/dist/core/local-endpoint-store.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.js +201 -0
- package/dist/core/local-endpoint-store.js.map +1 -0
- package/dist/core/local-endpoint-store.test.d.ts +2 -0
- package/dist/core/local-endpoint-store.test.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.test.js +131 -0
- package/dist/core/local-endpoint-store.test.js.map +1 -0
- package/dist/core/loop-breaker.d.ts +38 -1
- package/dist/core/loop-breaker.d.ts.map +1 -1
- package/dist/core/loop-breaker.js +84 -2
- package/dist/core/loop-breaker.js.map +1 -1
- package/dist/core/loop-breaker.test.js +108 -1
- package/dist/core/loop-breaker.test.js.map +1 -1
- package/dist/core/lsp/client.d.ts +50 -0
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +158 -13
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/jsonrpc.d.ts +38 -1
- package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
- package/dist/core/lsp/jsonrpc.js +13 -1
- package/dist/core/lsp/jsonrpc.js.map +1 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +23 -2
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/manager.test.js +32 -1
- package/dist/core/lsp/manager.test.js.map +1 -1
- package/dist/core/lsp/test-support.d.ts +18 -0
- package/dist/core/lsp/test-support.d.ts.map +1 -0
- package/dist/core/lsp/test-support.js +27 -0
- package/dist/core/lsp/test-support.js.map +1 -0
- package/dist/core/lsp/uri.test.d.ts +2 -0
- package/dist/core/lsp/uri.test.d.ts.map +1 -0
- package/dist/core/lsp/uri.test.js +56 -0
- package/dist/core/lsp/uri.test.js.map +1 -0
- package/dist/core/lsp/windows.test.d.ts +2 -0
- package/dist/core/lsp/windows.test.d.ts.map +1 -0
- package/dist/core/lsp/windows.test.js +251 -0
- package/dist/core/lsp/windows.test.js.map +1 -0
- package/dist/core/mcp/resolve-stdio.d.ts +35 -0
- package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
- package/dist/core/mcp/resolve-stdio.js +80 -1
- package/dist/core/mcp/resolve-stdio.js.map +1 -1
- package/dist/core/mcp/resolve-stdio.test.js +99 -4
- package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
- package/dist/core/message-images.d.ts +12 -0
- package/dist/core/message-images.d.ts.map +1 -0
- package/dist/core/message-images.js +52 -0
- package/dist/core/message-images.js.map +1 -0
- package/dist/core/message-images.test.d.ts +2 -0
- package/dist/core/message-images.test.d.ts.map +1 -0
- package/dist/core/message-images.test.js +62 -0
- package/dist/core/message-images.test.js.map +1 -0
- package/dist/core/network-guard.d.ts +47 -0
- package/dist/core/network-guard.d.ts.map +1 -0
- package/dist/core/network-guard.js +208 -0
- package/dist/core/network-guard.js.map +1 -0
- package/dist/core/network-guard.test.d.ts +2 -0
- package/dist/core/network-guard.test.d.ts.map +1 -0
- package/dist/core/network-guard.test.js +72 -0
- package/dist/core/network-guard.test.js.map +1 -0
- package/dist/core/persistent-shell.d.ts +3 -1
- package/dist/core/persistent-shell.d.ts.map +1 -1
- package/dist/core/persistent-shell.js +13 -3
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager-dev-server-repro.test.js +34 -12
- package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
- package/dist/core/process-manager.d.ts +1 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +23 -13
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts +8 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +145 -62
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +131 -1
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +89 -156
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +4 -10
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/radio.test.js +4 -1
- package/dist/core/radio.test.js.map +1 -1
- package/dist/core/runtime-mode.d.ts +2 -0
- package/dist/core/runtime-mode.d.ts.map +1 -1
- package/dist/core/runtime-mode.js +4 -0
- package/dist/core/runtime-mode.js.map +1 -1
- package/dist/core/session-export.d.ts +98 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +356 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-export.test.d.ts +2 -0
- package/dist/core/session-export.test.d.ts.map +1 -0
- package/dist/core/session-export.test.js +353 -0
- package/dist/core/session-export.test.js.map +1 -0
- package/dist/core/session-manager.d.ts +27 -7
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +257 -124
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +57 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +592 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/session-storage.test.d.ts +2 -0
- package/dist/core/session-storage.test.d.ts.map +1 -0
- package/dist/core/session-storage.test.js +272 -0
- package/dist/core/session-storage.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +7 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +17 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/setup-history.d.ts +0 -6
- package/dist/core/setup-history.d.ts.map +1 -1
- package/dist/core/setup-history.js +2 -18
- package/dist/core/setup-history.js.map +1 -1
- package/dist/core/setup-history.test.js +11 -26
- package/dist/core/setup-history.test.js.map +1 -1
- package/dist/core/sidecar-error-reporter.d.ts +12 -0
- package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.js +57 -0
- package/dist/core/sidecar-error-reporter.js.map +1 -0
- package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
- package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.test.js +61 -0
- package/dist/core/sidecar-error-reporter.test.js.map +1 -0
- package/dist/core/skills-routing.test.js +3 -1
- package/dist/core/skills-routing.test.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +18 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +42 -10
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/slash-commands.test.d.ts +2 -0
- package/dist/core/slash-commands.test.d.ts.map +1 -0
- package/dist/core/slash-commands.test.js +59 -0
- package/dist/core/slash-commands.test.js.map +1 -0
- package/dist/core/speed-benchmark.test.js +9 -3
- package/dist/core/speed-benchmark.test.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +8 -1
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +35 -2
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +34 -0
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/subagent-store.test.js +14 -2
- package/dist/core/subagent-store.test.js.map +1 -1
- package/dist/core/verify-commands.d.ts.map +1 -1
- package/dist/core/verify-commands.js +1 -6
- package/dist/core/verify-commands.js.map +1 -1
- package/dist/core/verify-commands.test.js +1 -5
- package/dist/core/verify-commands.test.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +40 -0
- package/dist/core/workspace-guard.d.ts.map +1 -0
- package/dist/core/workspace-guard.js +115 -0
- package/dist/core/workspace-guard.js.map +1 -0
- package/dist/core/workspace-guard.test.d.ts +2 -0
- package/dist/core/workspace-guard.test.d.ts.map +1 -0
- package/dist/core/workspace-guard.test.js +107 -0
- package/dist/core/workspace-guard.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/json-mode.d.ts +7 -0
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +10 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +2 -0
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +11 -0
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -101
- package/dist/session.js.map +1 -1
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +35 -0
- package/dist/session.test.js.map +1 -0
- package/dist/system-prompt.d.ts +23 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +119 -31
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +154 -14
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/test-support/fake-home.d.ts +20 -0
- package/dist/test-support/fake-home.d.ts.map +1 -0
- package/dist/test-support/fake-home.js +37 -0
- package/dist/test-support/fake-home.js.map +1 -0
- package/dist/tools/bash.d.ts +4 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +57 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +156 -8
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/edit-robustness.test.js +3 -1
- package/dist/tools/edit-robustness.test.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 +7 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +7 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/exit-plan.d.ts.map +1 -1
- package/dist/tools/exit-plan.js +15 -4
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/exit-plan.test.d.ts +2 -0
- package/dist/tools/exit-plan.test.d.ts.map +1 -0
- package/dist/tools/exit-plan.test.js +72 -0
- package/dist/tools/exit-plan.test.js.map +1 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +4 -1
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.d.ts +3 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +143 -14
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +59 -0
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/overflow.test.js +4 -7
- package/dist/tools/overflow.test.js.map +1 -1
- package/dist/tools/path-utils.d.ts +15 -0
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js +17 -0
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/path-utils.test.js +7 -2
- package/dist/tools/path-utils.test.js.map +1 -1
- package/dist/tools/prompt-hints.js +1 -1
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/search-code.d.ts.map +1 -1
- package/dist/tools/search-code.js +6 -4
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +4 -2
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/source-path.d.ts.map +1 -1
- package/dist/tools/source-path.js +9 -0
- package/dist/tools/source-path.js.map +1 -1
- 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 +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent-shared.test.js +21 -1
- package/dist/tools/subagent-shared.test.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +8 -0
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +2 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +17 -6
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +34 -0
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +2 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +34 -7
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write.d.ts +2 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +7 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +12 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +22 -85
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +11 -12
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +10 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/Footer.d.ts +1 -1
- package/dist/ui/components/Footer.js +2 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/Footer.test.js +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +5 -2
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +49 -8
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -2
- package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js +2 -5
- package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +2 -30
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/ui/login.js +1 -1
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/terminal-history-status-renderers.d.ts +1 -2
- package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -1
- package/dist/ui/terminal-history-status-renderers.js +2 -15
- package/dist/ui/terminal-history-status-renderers.js.map +1 -1
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +2 -4
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/thinking-level-cycle.test.js +8 -8
- package/dist/ui/thinking-level-cycle.test.js.map +1 -1
- package/dist/ui/transcript/MiscRows.d.ts +1 -4
- package/dist/ui/transcript/MiscRows.d.ts.map +1 -1
- package/dist/ui/transcript/MiscRows.js +2 -7
- package/dist/ui/transcript/MiscRows.js.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js +1 -3
- package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
- package/dist/ui/transcript/presentation.d.ts +1 -9
- package/dist/ui/transcript/presentation.d.ts.map +1 -1
- package/dist/ui/transcript/presentation.js +0 -9
- package/dist/ui/transcript/presentation.js.map +1 -1
- package/dist/ui/transcript/spacing.d.ts +2 -2
- package/dist/ui/transcript/spacing.d.ts.map +1 -1
- package/dist/ui/transcript/spacing.js +0 -1
- package/dist/ui/transcript/spacing.js.map +1 -1
- package/dist/ui/transcript/spacing.test.js +1 -3
- package/dist/ui/transcript/spacing.test.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +2 -9
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/utils/github.d.ts +20 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +65 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/github.test.d.ts +2 -0
- package/dist/utils/github.test.d.ts.map +1 -0
- package/dist/utils/github.test.js +23 -0
- package/dist/utils/github.test.js.map +1 -0
- package/dist/utils/http-body.d.ts +19 -0
- package/dist/utils/http-body.d.ts.map +1 -0
- package/dist/utils/http-body.js +58 -0
- package/dist/utils/http-body.js.map +1 -0
- package/dist/utils/http-body.test.d.ts +2 -0
- package/dist/utils/http-body.test.d.ts.map +1 -0
- package/dist/utils/http-body.test.js +68 -0
- package/dist/utils/http-body.test.js.map +1 -0
- package/dist/utils/process.d.ts +26 -3
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +68 -10
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/process.test.d.ts +2 -0
- package/dist/utils/process.test.d.ts.map +1 -0
- package/dist/utils/process.test.js +42 -0
- package/dist/utils/process.test.js.map +1 -0
- package/dist/utils/text.d.ts +9 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +11 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence for user-added local model endpoints.
|
|
3
|
+
*
|
|
4
|
+
* The four well-known servers (Ollama, LM Studio, llama.cpp, vLLM) are probed
|
|
5
|
+
* without configuration; this store holds only the extra endpoints a user typed
|
|
6
|
+
* in — a moved port, a remote self-hosted box, an OpenAI-compatible gateway.
|
|
7
|
+
*
|
|
8
|
+
* Endpoints live in `~/.ezcoder/ezcoder-app.json` under `localEndpoints`; each one's key
|
|
9
|
+
* (and, for keyed servers, its token) lives in `~/.ezcoder/auth.json` as a
|
|
10
|
+
* `local:<id>` credential, which is also what carries the baseUrl into the
|
|
11
|
+
* stream call. The two are kept in sync here so the UI never has to.
|
|
12
|
+
*/
|
|
13
|
+
import fs from "node:fs/promises";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { AuthStorage, DEFAULT_LOCAL_ENDPOINTS, clearLocalDiscoveryCache, } from "@prestyj/core";
|
|
17
|
+
export class LocalEndpointError extends Error {
|
|
18
|
+
}
|
|
19
|
+
const RESERVED_IDS = new Set(DEFAULT_LOCAL_ENDPOINTS.map((e) => e.id));
|
|
20
|
+
const MAX_CUSTOM_ENDPOINTS = 20;
|
|
21
|
+
function appSettingsFile(override) {
|
|
22
|
+
return override ?? path.join(os.homedir(), ".ezcoder", "ezcoder-app.json");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Normalize a user-typed URL into the OpenAI-compatible base we call.
|
|
26
|
+
* Accepts `host:port`, a bare root, or a full `/v1` URL, and tolerates a pasted
|
|
27
|
+
* `/v1/chat/completions` or `/v1/models` (people copy from docs).
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeLocalBaseUrl(input) {
|
|
30
|
+
const trimmed = input.trim();
|
|
31
|
+
if (!trimmed)
|
|
32
|
+
throw new LocalEndpointError("Endpoint URL is required.");
|
|
33
|
+
const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(trimmed)?.[1]?.toLowerCase();
|
|
34
|
+
if (scheme && scheme !== "http" && scheme !== "https") {
|
|
35
|
+
throw new LocalEndpointError("Endpoint URL must use http or https.");
|
|
36
|
+
}
|
|
37
|
+
// Bare `host:port` is the common case — assume plain http, like the servers do.
|
|
38
|
+
const withScheme = scheme ? trimmed : `http://${trimmed}`;
|
|
39
|
+
let url;
|
|
40
|
+
try {
|
|
41
|
+
url = new URL(withScheme);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new LocalEndpointError(`"${input}" is not a valid URL.`);
|
|
45
|
+
}
|
|
46
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
47
|
+
throw new LocalEndpointError("Endpoint URL must use http or https.");
|
|
48
|
+
}
|
|
49
|
+
if (!url.hostname)
|
|
50
|
+
throw new LocalEndpointError("Endpoint URL is missing a host.");
|
|
51
|
+
let pathname = url.pathname.replace(/\/+$/, "");
|
|
52
|
+
pathname = pathname.replace(/\/(?:chat\/completions|completions|models)$/, "");
|
|
53
|
+
if (!/\/v\d+$/.test(pathname))
|
|
54
|
+
pathname = `${pathname}/v1`;
|
|
55
|
+
return `${url.protocol}//${url.host}${pathname}`;
|
|
56
|
+
}
|
|
57
|
+
/** Slug derived from the URL, e.g. `custom-192-168-1-4-8000`. Stable per host:port. */
|
|
58
|
+
function endpointIdFor(baseUrl) {
|
|
59
|
+
const { host } = new URL(baseUrl);
|
|
60
|
+
const slug = host
|
|
61
|
+
.replace(/[^a-z0-9]+/gi, "-")
|
|
62
|
+
.replace(/^-|-$/g, "")
|
|
63
|
+
.toLowerCase();
|
|
64
|
+
return `custom-${slug || "endpoint"}`;
|
|
65
|
+
}
|
|
66
|
+
function labelFor(baseUrl, label) {
|
|
67
|
+
const trimmed = label?.trim();
|
|
68
|
+
if (trimmed)
|
|
69
|
+
return trimmed;
|
|
70
|
+
return new URL(baseUrl).host;
|
|
71
|
+
}
|
|
72
|
+
// ── settings file I/O ──────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Read/modify/write the whole settings object rather than a typed subset, so a
|
|
75
|
+
* key written by another part of the app (or a newer version) survives.
|
|
76
|
+
*/
|
|
77
|
+
async function readSettings(file) {
|
|
78
|
+
try {
|
|
79
|
+
const raw = JSON.parse(await fs.readFile(appSettingsFile(file), "utf-8"));
|
|
80
|
+
return raw && typeof raw === "object" ? raw : {};
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function writeSettings(settings, file) {
|
|
87
|
+
const target = appSettingsFile(file);
|
|
88
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
89
|
+
await fs.writeFile(target, JSON.stringify(settings, null, 2), "utf-8");
|
|
90
|
+
}
|
|
91
|
+
function parseStored(value) {
|
|
92
|
+
if (!Array.isArray(value))
|
|
93
|
+
return [];
|
|
94
|
+
const endpoints = [];
|
|
95
|
+
for (const entry of value) {
|
|
96
|
+
if (!entry || typeof entry !== "object")
|
|
97
|
+
continue;
|
|
98
|
+
const { id, label, baseUrl, apiKey } = entry;
|
|
99
|
+
if (typeof id !== "string" || typeof baseUrl !== "string")
|
|
100
|
+
continue;
|
|
101
|
+
endpoints.push({
|
|
102
|
+
id,
|
|
103
|
+
label: typeof label === "string" && label ? label : baseUrl,
|
|
104
|
+
baseUrl,
|
|
105
|
+
kind: "custom",
|
|
106
|
+
custom: true,
|
|
107
|
+
...(typeof apiKey === "string" && apiKey ? { apiKey } : {}),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return endpoints;
|
|
111
|
+
}
|
|
112
|
+
/** User-added endpoints, in insertion order. Never throws on a corrupt file. */
|
|
113
|
+
export async function listCustomEndpoints(options = {}) {
|
|
114
|
+
return parseStored((await readSettings(options.settingsFile))["localEndpoints"]);
|
|
115
|
+
}
|
|
116
|
+
/** Well-known endpoints first, then the user's own — the probe/scan order. */
|
|
117
|
+
export async function listAllEndpoints(options = {}) {
|
|
118
|
+
return [...DEFAULT_LOCAL_ENDPOINTS, ...(await listCustomEndpoints(options))];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add a custom endpoint and write its `local:<id>` credential. Re-adding the
|
|
122
|
+
* same host updates it (that's how a user fixes a mistyped key) instead of
|
|
123
|
+
* creating a second row for the same server.
|
|
124
|
+
*/
|
|
125
|
+
export async function addCustomEndpoint(input, options = {}) {
|
|
126
|
+
const auth = options.auth ?? new AuthStorage();
|
|
127
|
+
const baseUrl = normalizeLocalBaseUrl(input.baseUrl);
|
|
128
|
+
const id = endpointIdFor(baseUrl);
|
|
129
|
+
if (RESERVED_IDS.has(id)) {
|
|
130
|
+
throw new LocalEndpointError(`"${id}" is a built-in endpoint id.`);
|
|
131
|
+
}
|
|
132
|
+
const existing = await listCustomEndpoints(options);
|
|
133
|
+
const builtIn = DEFAULT_LOCAL_ENDPOINTS.find((e) => e.baseUrl === baseUrl);
|
|
134
|
+
if (builtIn) {
|
|
135
|
+
throw new LocalEndpointError(`${baseUrl} is already probed automatically as ${builtIn.label}.`);
|
|
136
|
+
}
|
|
137
|
+
if (!existing.some((e) => e.id === id) && existing.length >= MAX_CUSTOM_ENDPOINTS) {
|
|
138
|
+
throw new LocalEndpointError(`At most ${MAX_CUSTOM_ENDPOINTS} custom endpoints.`);
|
|
139
|
+
}
|
|
140
|
+
const endpoint = {
|
|
141
|
+
id,
|
|
142
|
+
label: labelFor(baseUrl, input.label),
|
|
143
|
+
baseUrl,
|
|
144
|
+
kind: "custom",
|
|
145
|
+
custom: true,
|
|
146
|
+
...(input.apiKey?.trim() ? { apiKey: input.apiKey.trim() } : {}),
|
|
147
|
+
};
|
|
148
|
+
const next = existing.some((e) => e.id === id)
|
|
149
|
+
? existing.map((e) => (e.id === id ? endpoint : e))
|
|
150
|
+
: [...existing, endpoint];
|
|
151
|
+
const settings = await readSettings(options.settingsFile);
|
|
152
|
+
settings["localEndpoints"] = next.map(({ id: eid, label, baseUrl: url, apiKey }) => ({
|
|
153
|
+
id: eid,
|
|
154
|
+
label,
|
|
155
|
+
baseUrl: url,
|
|
156
|
+
...(apiKey ? { apiKey } : {}),
|
|
157
|
+
}));
|
|
158
|
+
await writeSettings(settings, options.settingsFile);
|
|
159
|
+
await auth.setLocalEndpoint(id, baseUrl, endpoint.apiKey);
|
|
160
|
+
clearLocalDiscoveryCache();
|
|
161
|
+
return endpoint;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Remove a custom endpoint and its credential. Built-in endpoints can't be
|
|
165
|
+
* removed (they're discovered, not configured) — that's an error, not a no-op,
|
|
166
|
+
* so a UI bug doesn't silently do nothing.
|
|
167
|
+
*/
|
|
168
|
+
export async function removeCustomEndpoint(id, options = {}) {
|
|
169
|
+
const auth = options.auth ?? new AuthStorage();
|
|
170
|
+
if (RESERVED_IDS.has(id)) {
|
|
171
|
+
throw new LocalEndpointError(`${id} is a built-in endpoint and can't be removed.`);
|
|
172
|
+
}
|
|
173
|
+
const existing = await listCustomEndpoints(options);
|
|
174
|
+
if (!existing.some((e) => e.id === id)) {
|
|
175
|
+
throw new LocalEndpointError(`Unknown local endpoint "${id}".`);
|
|
176
|
+
}
|
|
177
|
+
const settings = await readSettings(options.settingsFile);
|
|
178
|
+
settings["localEndpoints"] = existing
|
|
179
|
+
.filter((e) => e.id !== id)
|
|
180
|
+
.map(({ id: eid, label, baseUrl, apiKey }) => ({
|
|
181
|
+
id: eid,
|
|
182
|
+
label,
|
|
183
|
+
baseUrl,
|
|
184
|
+
...(apiKey ? { apiKey } : {}),
|
|
185
|
+
}));
|
|
186
|
+
await writeSettings(settings, options.settingsFile);
|
|
187
|
+
await auth.removeLocalEndpoint(id);
|
|
188
|
+
clearLocalDiscoveryCache();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Make sure every endpoint we're about to serve models from has a credential
|
|
192
|
+
* carrying its baseUrl — otherwise `stream()` has no endpoint to talk to.
|
|
193
|
+
* Called after each scan, so a fresh install works with zero setup.
|
|
194
|
+
*/
|
|
195
|
+
export async function syncEndpointCredentials(endpoints, options = {}) {
|
|
196
|
+
const auth = options.auth ?? new AuthStorage();
|
|
197
|
+
for (const endpoint of endpoints) {
|
|
198
|
+
await auth.setLocalEndpoint(endpoint.id, endpoint.baseUrl, endpoint.apiKey);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=local-endpoint-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.test.d.ts","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { AuthStorage } from "@prestyj/core";
|
|
6
|
+
import { LocalEndpointError, addCustomEndpoint, listAllEndpoints, listCustomEndpoints, normalizeLocalBaseUrl, removeCustomEndpoint, syncEndpointCredentials, } from "./local-endpoint-store.js";
|
|
7
|
+
let dir;
|
|
8
|
+
let opts;
|
|
9
|
+
let auth;
|
|
10
|
+
// Both file paths are injected rather than redirected via $HOME: os.homedir()
|
|
11
|
+
// reads USERPROFILE on Windows, so a HOME override silently writes to the real
|
|
12
|
+
// ~/.ezcoder there — which leaks state between tests and pollutes the user's files.
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-local-endpoints-"));
|
|
15
|
+
auth = new AuthStorage(path.join(dir, "auth.json"));
|
|
16
|
+
opts = { settingsFile: path.join(dir, "ezcoder-app.json"), auth };
|
|
17
|
+
});
|
|
18
|
+
afterEach(async () => {
|
|
19
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
async function settings() {
|
|
22
|
+
return JSON.parse(await fs.readFile(opts.settingsFile, "utf-8"));
|
|
23
|
+
}
|
|
24
|
+
describe("normalizeLocalBaseUrl", () => {
|
|
25
|
+
it("accepts the shapes users actually paste", () => {
|
|
26
|
+
expect(normalizeLocalBaseUrl("127.0.0.1:1234")).toBe("http://127.0.0.1:1234/v1");
|
|
27
|
+
expect(normalizeLocalBaseUrl("http://localhost:8000")).toBe("http://localhost:8000/v1");
|
|
28
|
+
expect(normalizeLocalBaseUrl("http://localhost:8000/v1")).toBe("http://localhost:8000/v1");
|
|
29
|
+
expect(normalizeLocalBaseUrl(" http://localhost:8000/v1/ ")).toBe("http://localhost:8000/v1");
|
|
30
|
+
expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/chat/completions")).toBe("http://box.lan:8080/v1");
|
|
31
|
+
expect(normalizeLocalBaseUrl("http://box.lan:8080/v1/models")).toBe("http://box.lan:8080/v1");
|
|
32
|
+
// A gateway on a sub-path keeps the path.
|
|
33
|
+
expect(normalizeLocalBaseUrl("https://gw.example.com/openai")).toBe("https://gw.example.com/openai/v1");
|
|
34
|
+
});
|
|
35
|
+
it("rejects empty, malformed, and non-http URLs", () => {
|
|
36
|
+
expect(() => normalizeLocalBaseUrl(" ")).toThrow(LocalEndpointError);
|
|
37
|
+
expect(() => normalizeLocalBaseUrl("http://")).toThrow(LocalEndpointError);
|
|
38
|
+
expect(() => normalizeLocalBaseUrl("ftp://host/v1")).toThrow(LocalEndpointError);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("custom endpoints", () => {
|
|
42
|
+
it("adds an endpoint, persists it, and writes its auth credential", async () => {
|
|
43
|
+
const endpoint = await addCustomEndpoint({ label: "Workstation", baseUrl: "192.168.1.4:8000", apiKey: "secret" }, opts);
|
|
44
|
+
expect(endpoint).toMatchObject({
|
|
45
|
+
id: "custom-192-168-1-4-8000",
|
|
46
|
+
label: "Workstation",
|
|
47
|
+
baseUrl: "http://192.168.1.4:8000/v1",
|
|
48
|
+
kind: "custom",
|
|
49
|
+
custom: true,
|
|
50
|
+
apiKey: "secret",
|
|
51
|
+
});
|
|
52
|
+
expect(await listCustomEndpoints(opts)).toEqual([endpoint]);
|
|
53
|
+
const creds = await auth.getCredentials("local:custom-192-168-1-4-8000");
|
|
54
|
+
expect(creds).toMatchObject({ accessToken: "secret", baseUrl: "http://192.168.1.4:8000/v1" });
|
|
55
|
+
expect(creds.expiresAt).toBeGreaterThan(Date.now());
|
|
56
|
+
expect(await auth.hasProviderAuth("local")).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it("defaults the label to the host and the key to a placeholder", async () => {
|
|
59
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
60
|
+
const stored = (await listCustomEndpoints(opts))[0];
|
|
61
|
+
expect(stored.label).toBe("localhost:9999");
|
|
62
|
+
expect(stored.apiKey).toBeUndefined();
|
|
63
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
|
|
64
|
+
accessToken: "local",
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it("updates in place when the same host is re-added", async () => {
|
|
68
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999", apiKey: "wrong" }, opts);
|
|
69
|
+
await addCustomEndpoint({ label: "Fixed", baseUrl: "http://localhost:9999/v1", apiKey: "right" }, opts);
|
|
70
|
+
const stored = await listCustomEndpoints(opts);
|
|
71
|
+
expect(stored).toHaveLength(1);
|
|
72
|
+
expect(stored[0]).toMatchObject({ label: "Fixed", apiKey: "right" });
|
|
73
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toMatchObject({
|
|
74
|
+
accessToken: "right",
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it("refuses a URL already covered by a built-in endpoint", async () => {
|
|
78
|
+
await expect(addCustomEndpoint({ baseUrl: "http://127.0.0.1:11434/v1" }, opts)).rejects.toThrow(/already probed automatically as Ollama/);
|
|
79
|
+
});
|
|
80
|
+
it("removes an endpoint and its credential", async () => {
|
|
81
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
82
|
+
await removeCustomEndpoint("custom-localhost-9999", opts);
|
|
83
|
+
expect(await listCustomEndpoints(opts)).toEqual([]);
|
|
84
|
+
expect(await auth.getCredentials("local:custom-localhost-9999")).toBeUndefined();
|
|
85
|
+
expect(await auth.hasProviderAuth("local")).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
it("refuses to remove a built-in or unknown endpoint", async () => {
|
|
88
|
+
await expect(removeCustomEndpoint("ollama", opts)).rejects.toThrow(/built-in/);
|
|
89
|
+
await expect(removeCustomEndpoint("custom-nope", opts)).rejects.toThrow(/Unknown local/);
|
|
90
|
+
});
|
|
91
|
+
it("preserves unrelated ezcoder-app.json keys", async () => {
|
|
92
|
+
await fs.writeFile(opts.settingsFile, JSON.stringify({ projectsRoot: "/tmp/projects", autopilot: { "/a": true } }), "utf-8");
|
|
93
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
94
|
+
expect(await settings()).toMatchObject({
|
|
95
|
+
projectsRoot: "/tmp/projects",
|
|
96
|
+
autopilot: { "/a": true },
|
|
97
|
+
});
|
|
98
|
+
await removeCustomEndpoint("custom-localhost-9999", opts);
|
|
99
|
+
expect(await settings()).toMatchObject({ projectsRoot: "/tmp/projects" });
|
|
100
|
+
});
|
|
101
|
+
it("ignores a corrupt settings file instead of throwing", async () => {
|
|
102
|
+
await fs.writeFile(opts.settingsFile, "{not json", "utf-8");
|
|
103
|
+
expect(await listCustomEndpoints(opts)).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
it("lists built-in endpoints before custom ones", async () => {
|
|
106
|
+
await addCustomEndpoint({ baseUrl: "http://localhost:9999" }, opts);
|
|
107
|
+
expect((await listAllEndpoints(opts)).map((e) => e.id)).toEqual([
|
|
108
|
+
"ollama",
|
|
109
|
+
"lmstudio",
|
|
110
|
+
"llamacpp",
|
|
111
|
+
"vllm",
|
|
112
|
+
"custom-localhost-9999",
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("syncEndpointCredentials", () => {
|
|
117
|
+
it("writes a baseUrl-carrying credential for every endpoint", async () => {
|
|
118
|
+
await syncEndpointCredentials(await listAllEndpoints(opts), opts);
|
|
119
|
+
expect((await auth.listLocalEndpointIds()).sort()).toEqual([
|
|
120
|
+
"llamacpp",
|
|
121
|
+
"lmstudio",
|
|
122
|
+
"ollama",
|
|
123
|
+
"vllm",
|
|
124
|
+
]);
|
|
125
|
+
expect(await auth.getCredentials("local:ollama")).toMatchObject({
|
|
126
|
+
baseUrl: "http://127.0.0.1:11434/v1",
|
|
127
|
+
accessToken: "local",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=local-endpoint-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-endpoint-store.test.js","sourceRoot":"","sources":["../../src/core/local-endpoint-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,12 +19,19 @@ export interface LoopBreakStats {
|
|
|
19
19
|
repeatedNoProgressCalls: number;
|
|
20
20
|
/** Whether streamed assistant text degenerated into repetition. */
|
|
21
21
|
textRepetitionDetected: boolean;
|
|
22
|
+
/** Detected cyclic tool-call pattern (A/B/A/B…) with no new results. */
|
|
23
|
+
cyclicPattern?: CycleDetection;
|
|
22
24
|
}
|
|
23
25
|
export interface LoopBreakDecision {
|
|
24
26
|
shouldBreak: boolean;
|
|
25
27
|
reasons: string[];
|
|
26
28
|
}
|
|
27
29
|
export declare const LOOP_BREAK_PROMPT: string;
|
|
30
|
+
/**
|
|
31
|
+
* Second-stage break — injected when the agent is STILL looping after the
|
|
32
|
+
* first LOOP_BREAK_PROMPT nudge. No more retries: report and hand back.
|
|
33
|
+
*/
|
|
34
|
+
export declare const LOOP_BREAK_FINAL_PROMPT: string;
|
|
28
35
|
/** Stable signature for a tool call: name + canonicalized args. */
|
|
29
36
|
export declare function toolCallSignature(name: string, args: unknown): string;
|
|
30
37
|
/**
|
|
@@ -41,6 +48,36 @@ export declare class ToolCallProgressTracker {
|
|
|
41
48
|
reset(): void;
|
|
42
49
|
private resetRepetition;
|
|
43
50
|
}
|
|
51
|
+
export interface CycleDetection {
|
|
52
|
+
/** Cycle length k (1–5): the repeating unit is the last k distinct calls. */
|
|
53
|
+
length: number;
|
|
54
|
+
/** How many full consecutive repetitions of the unit were observed. */
|
|
55
|
+
repeats: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Detects the agent alternating through a short cycle of tool calls
|
|
59
|
+
* (A/B/A/B… up to length 5) that produce no new results — the multi-call
|
|
60
|
+
* generalization of ToolCallProgressTracker's single-call repeat streak
|
|
61
|
+
* (Gemini CLI's cycle detector, hardened with an unchanged-result guard: a
|
|
62
|
+
* call whose result changed between visits is progress, not a loop).
|
|
63
|
+
*
|
|
64
|
+
* One instance per agent run; `reset()` after a loop-break injection so the
|
|
65
|
+
* second stage measures fresh evidence.
|
|
66
|
+
*/
|
|
67
|
+
export declare class CycleDetector {
|
|
68
|
+
/** Bounded FIFO of recent call signatures (most recent last). */
|
|
69
|
+
private history;
|
|
70
|
+
/** Whether each historical call's result was unchanged from that
|
|
71
|
+
* signature's previous occurrence. Parallel to `history`. */
|
|
72
|
+
private unchanged;
|
|
73
|
+
/** Last observed result per signature. */
|
|
74
|
+
private lastResults;
|
|
75
|
+
record(name: string, args: unknown, result: string, _isError: boolean): CycleDetection | null;
|
|
76
|
+
reset(): void;
|
|
77
|
+
/** True when the last k*THRESHOLD calls repeat the same k-cycle and every
|
|
78
|
+
* one of them returned the same result as its previous occurrence. */
|
|
79
|
+
private matchesCycle;
|
|
80
|
+
}
|
|
44
81
|
/**
|
|
45
82
|
* Detects verbatim repetition at the tail of streamed text — the model
|
|
46
83
|
* looping on a phrase/block. Scans candidate block lengths and checks how
|
|
@@ -49,5 +86,5 @@ export declare class ToolCallProgressTracker {
|
|
|
49
86
|
*/
|
|
50
87
|
export declare function detectTextRepetition(text: string): boolean;
|
|
51
88
|
export declare function evaluateLoopBreak(stats: LoopBreakStats): LoopBreakDecision;
|
|
52
|
-
export declare function buildLoopBreakMessage(reasons: readonly string[]): Message;
|
|
89
|
+
export declare function buildLoopBreakMessage(reasons: readonly string[], final?: boolean): Message;
|
|
53
90
|
//# sourceMappingURL=loop-breaker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-breaker.d.ts","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,uBAAuB,EAAE,MAAM,CAAC;IAChC,mEAAmE;IACnE,sBAAsB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"loop-breaker.d.ts","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,uBAAuB,EAAE,MAAM,CAAC;IAChC,mEAAmE;IACnE,sBAAsB,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,eAAO,MAAM,iBAAiB,QAOuC,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAKb,CAAC;AAExB,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAErE;AAwBD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;IAsB7E,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,eAAe;CAMxB;AAID,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,iEAAiE;IACjE,OAAO,CAAC,OAAO,CAAgB;IAC/B;kEAC8D;IAC9D,OAAO,CAAC,SAAS,CAAiB;IAClC,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAA6B;IAEhD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI;IAwB7F,KAAK,IAAI,IAAI;IAMb;2EACuE;IACvE,OAAO,CAAC,YAAY;CAgBrB;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAiB1D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAmB1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,UAAQ,GAAG,OAAO,CAMxF"}
|
|
@@ -7,6 +7,15 @@ export const LOOP_BREAK_PROMPT = "Stuck? You've repeated essentially the same ac
|
|
|
7
7
|
"fundamentally different approach or, if you genuinely cannot make progress, stop and tell " +
|
|
8
8
|
"the user what's blocking you and what you need. Do NOT repeat the previous attempt with minor " +
|
|
9
9
|
"tweaks. Do not mention this note unless it changed your approach.";
|
|
10
|
+
/**
|
|
11
|
+
* Second-stage break — injected when the agent is STILL looping after the
|
|
12
|
+
* first LOOP_BREAK_PROMPT nudge. No more retries: report and hand back.
|
|
13
|
+
*/
|
|
14
|
+
export const LOOP_BREAK_FINAL_PROMPT = "STOP. You are still repeating the same actions after being asked to break the pattern. " +
|
|
15
|
+
"Do NOT attempt the action again in any form. Instead, stop working now and reply with: " +
|
|
16
|
+
"(1) what is blocking you, stated plainly; (2) what you already tried and what each attempt " +
|
|
17
|
+
"returned; (3) the specific decision or information you need from the user to proceed. " +
|
|
18
|
+
"Then end your turn.";
|
|
10
19
|
/** Stable signature for a tool call: name + canonicalized args. */
|
|
11
20
|
export function toolCallSignature(name, args) {
|
|
12
21
|
return `${name}\u0000${canonicalize(args)}`;
|
|
@@ -69,6 +78,76 @@ export class ToolCallProgressTracker {
|
|
|
69
78
|
this.repeatCount = 0;
|
|
70
79
|
}
|
|
71
80
|
}
|
|
81
|
+
const CYCLE_MAX_LENGTH = 5;
|
|
82
|
+
const CYCLE_REPEAT_THRESHOLD = 5;
|
|
83
|
+
const CYCLE_HISTORY_LIMIT = CYCLE_MAX_LENGTH * CYCLE_REPEAT_THRESHOLD;
|
|
84
|
+
/**
|
|
85
|
+
* Detects the agent alternating through a short cycle of tool calls
|
|
86
|
+
* (A/B/A/B… up to length 5) that produce no new results — the multi-call
|
|
87
|
+
* generalization of ToolCallProgressTracker's single-call repeat streak
|
|
88
|
+
* (Gemini CLI's cycle detector, hardened with an unchanged-result guard: a
|
|
89
|
+
* call whose result changed between visits is progress, not a loop).
|
|
90
|
+
*
|
|
91
|
+
* One instance per agent run; `reset()` after a loop-break injection so the
|
|
92
|
+
* second stage measures fresh evidence.
|
|
93
|
+
*/
|
|
94
|
+
export class CycleDetector {
|
|
95
|
+
/** Bounded FIFO of recent call signatures (most recent last). */
|
|
96
|
+
history = [];
|
|
97
|
+
/** Whether each historical call's result was unchanged from that
|
|
98
|
+
* signature's previous occurrence. Parallel to `history`. */
|
|
99
|
+
unchanged = [];
|
|
100
|
+
/** Last observed result per signature. */
|
|
101
|
+
lastResults = new Map();
|
|
102
|
+
record(name, args, result, _isError) {
|
|
103
|
+
if (isExpectedRepeat(name, args)) {
|
|
104
|
+
this.reset();
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const signature = toolCallSignature(name, args);
|
|
108
|
+
const previous = this.lastResults.get(signature);
|
|
109
|
+
this.history.push(signature);
|
|
110
|
+
this.unchanged.push(previous !== undefined && previous === result);
|
|
111
|
+
this.lastResults.set(signature, result);
|
|
112
|
+
if (this.history.length > CYCLE_HISTORY_LIMIT) {
|
|
113
|
+
this.history.shift();
|
|
114
|
+
this.unchanged.shift();
|
|
115
|
+
}
|
|
116
|
+
for (let k = 1; k <= CYCLE_MAX_LENGTH; k++) {
|
|
117
|
+
if (this.matchesCycle(k)) {
|
|
118
|
+
return { length: k, repeats: CYCLE_REPEAT_THRESHOLD };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
reset() {
|
|
124
|
+
this.history = [];
|
|
125
|
+
this.unchanged = [];
|
|
126
|
+
this.lastResults.clear();
|
|
127
|
+
}
|
|
128
|
+
/** True when the last k*THRESHOLD calls repeat the same k-cycle and every
|
|
129
|
+
* one of them returned the same result as its previous occurrence. */
|
|
130
|
+
matchesCycle(k) {
|
|
131
|
+
const span = k * CYCLE_REPEAT_THRESHOLD;
|
|
132
|
+
if (this.history.length < span)
|
|
133
|
+
return false;
|
|
134
|
+
const start = this.history.length - span;
|
|
135
|
+
const unit = this.history.slice(start, start + k);
|
|
136
|
+
// A degenerate "cycle" whose unit repeats an inner signature is really a
|
|
137
|
+
// shorter cycle — only report the minimal length.
|
|
138
|
+
if (new Set(unit).size !== k)
|
|
139
|
+
return false;
|
|
140
|
+
for (let i = 0; i < span; i++) {
|
|
141
|
+
if (this.history[start + i] !== unit[i % k])
|
|
142
|
+
return false;
|
|
143
|
+
// The first repetition legitimately introduces new signatures; every
|
|
144
|
+
// later visit must have produced an unchanged result to count as a loop.
|
|
145
|
+
if (i >= k && !this.unchanged[start + i])
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
72
151
|
const TEXT_REPETITION_MIN_LENGTH = 40;
|
|
73
152
|
const TEXT_REPETITION_MIN_REPEATS = 3;
|
|
74
153
|
const TEXT_REPETITION_TAIL = 4096;
|
|
@@ -108,13 +187,16 @@ export function evaluateLoopBreak(stats) {
|
|
|
108
187
|
if (stats.textRepetitionDetected) {
|
|
109
188
|
reasons.push("repeated output detected");
|
|
110
189
|
}
|
|
190
|
+
if (stats.cyclicPattern) {
|
|
191
|
+
reasons.push(`tool calls repeating in a cycle of ${stats.cyclicPattern.length} with no new results`);
|
|
192
|
+
}
|
|
111
193
|
return { shouldBreak: reasons.length > 0, reasons };
|
|
112
194
|
}
|
|
113
|
-
export function buildLoopBreakMessage(reasons) {
|
|
195
|
+
export function buildLoopBreakMessage(reasons, final = false) {
|
|
114
196
|
const reasonText = reasons.length > 0 ? ` Triggered because: ${reasons.join(", ")}.` : "";
|
|
115
197
|
return {
|
|
116
198
|
role: "user",
|
|
117
|
-
content: `${LOOP_BREAK_PROMPT}${reasonText}`,
|
|
199
|
+
content: `${final ? LOOP_BREAK_FINAL_PROMPT : LOOP_BREAK_PROMPT}${reasonText}`,
|
|
118
200
|
};
|
|
119
201
|
}
|
|
120
202
|
//# sourceMappingURL=loop-breaker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-breaker.js","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loop-breaker.js","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"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"}
|