gsd-pi 2.78.1-dev.84a383f51 → 2.78.1
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 +7 -7
- package/dist/cli.js +55 -95
- package/dist/headless-query.d.ts +0 -22
- package/dist/headless-query.js +4 -24
- package/dist/headless.d.ts +0 -10
- package/dist/headless.js +1 -16
- package/dist/loader.js +10 -7
- package/dist/onboarding.d.ts +0 -10
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +2 -5
- package/dist/resource-loader.d.ts +2 -5
- package/dist/resource-loader.js +5 -28
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
- package/dist/resources/extensions/gsd/auto/loop.js +0 -23
- package/dist/resources/extensions/gsd/auto/phases.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
- package/dist/resources/extensions/gsd/auto.js +5 -14
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
- package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
- package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +5 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -11
- package/dist/resources/extensions/gsd/guided-flow.js +23 -23
- package/dist/resources/extensions/gsd/memory-store.js +31 -66
- package/dist/resources/extensions/gsd/model-router.js +9 -114
- package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
- package/dist/resources/extensions/gsd/preferences-models.js +15 -91
- package/dist/resources/extensions/gsd/preferences-types.js +0 -2
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
- package/dist/resources/extensions/gsd/preferences.js +3 -5
- package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
- package/dist/resources/extensions/gsd/state.js +0 -42
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
- package/dist/resources/extensions/gsd/worktree-command.js +46 -26
- package/dist/resources/extensions/mcp-client/index.js +3 -6
- package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
- package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
- package/dist/rtk-shared.d.ts +0 -3
- package/dist/rtk-shared.js +0 -17
- package/dist/rtk.d.ts +5 -2
- package/dist/rtk.js +20 -3
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/package.json +1 -2
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -74
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
- package/packages/mcp-server/src/workflow-tools.ts +58 -93
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +0 -13
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
- package/packages/pi-ai/src/types.ts +0 -13
- package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +0 -4
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
- package/packages/pi-coding-agent/src/core/messages.ts +0 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
- package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
- package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +2 -24
- package/src/resources/extensions/gsd/auto/phases.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -3
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
- package/src/resources/extensions/gsd/auto.ts +4 -14
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
- package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
- package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
- package/src/resources/extensions/gsd/doctor-types.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +5 -13
- package/src/resources/extensions/gsd/gsd-db.ts +2 -12
- package/src/resources/extensions/gsd/guided-flow.ts +25 -25
- package/src/resources/extensions/gsd/memory-store.ts +28 -81
- package/src/resources/extensions/gsd/model-router.ts +9 -172
- package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
- package/src/resources/extensions/gsd/preferences-models.ts +15 -101
- package/src/resources/extensions/gsd/preferences-types.ts +0 -6
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
- package/src/resources/extensions/gsd/preferences.ts +2 -16
- package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
- package/src/resources/extensions/gsd/state.ts +0 -42
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
- package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
- package/src/resources/extensions/gsd/worktree-command.ts +44 -31
- package/src/resources/extensions/mcp-client/index.ts +3 -6
- package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
- package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
- package/dist/cli-policy.d.ts +0 -13
- package/dist/cli-policy.js +0 -17
- package/dist/resources/.managed-resources-content-hash +0 -1
- package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
- package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
- package/dist/runtime-checks.d.ts +0 -27
- package/dist/runtime-checks.js +0 -38
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
- package/dist/worktree-status-banner.d.ts +0 -1
- package/dist/worktree-status-banner.js +0 -132
- package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
- package/packages/mcp-server/dist/alias-telemetry.js +0 -30
- package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
- package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
- package/packages/mcp-server/src/alias-telemetry.ts +0 -30
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
- package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
- package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
- /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
|
@@ -320,8 +320,11 @@ export function getEligibleModels(
|
|
|
320
320
|
// Exact match
|
|
321
321
|
if (availableModelIds.includes(explicitModel)) return [explicitModel];
|
|
322
322
|
// Provider-prefix-stripped match
|
|
323
|
-
const
|
|
324
|
-
|
|
323
|
+
const match = availableModelIds.find(id => {
|
|
324
|
+
const bareAvail = id.includes("/") ? id.split("/").pop()! : id;
|
|
325
|
+
const bareExplicit = explicitModel.includes("/") ? explicitModel.split("/").pop()! : explicitModel;
|
|
326
|
+
return bareAvail === bareExplicit;
|
|
327
|
+
});
|
|
325
328
|
if (match) return [match];
|
|
326
329
|
}
|
|
327
330
|
|
|
@@ -427,38 +430,12 @@ export function resolveModelForComplexity(
|
|
|
427
430
|
|
|
428
431
|
// Downgrade-only: if requested tier >= configured tier, no change
|
|
429
432
|
if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
|
|
430
|
-
// If the configured primary is directly available, use it
|
|
431
|
-
if (isModelAvailable(configuredPrimary, availableModelIds)) {
|
|
432
|
-
return {
|
|
433
|
-
modelId: configuredPrimary,
|
|
434
|
-
fallbacks: phaseConfig.fallbacks,
|
|
435
|
-
tier: requestedTier,
|
|
436
|
-
wasDowngraded: false,
|
|
437
|
-
reason: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
438
|
-
selectionMethod: "tier-only",
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Configured primary is unavailable (e.g. Anthropic model configured but
|
|
443
|
-
// running on a non-Anthropic provider). Find the best available model at
|
|
444
|
-
// the same capability tier so routing still works cross-provider.
|
|
445
|
-
const crossProviderEquivalent = findModelForTier(
|
|
446
|
-
configuredTier,
|
|
447
|
-
routingConfig,
|
|
448
|
-
availableModelIds,
|
|
449
|
-
routingConfig.cross_provider !== false,
|
|
450
|
-
);
|
|
451
|
-
|
|
452
433
|
return {
|
|
453
|
-
modelId:
|
|
454
|
-
fallbacks:
|
|
455
|
-
? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
|
|
456
|
-
: phaseConfig.fallbacks,
|
|
434
|
+
modelId: configuredPrimary,
|
|
435
|
+
fallbacks: phaseConfig.fallbacks,
|
|
457
436
|
tier: requestedTier,
|
|
458
437
|
wasDowngraded: false,
|
|
459
|
-
reason:
|
|
460
|
-
? `cross-provider ${configuredTier}-tier equivalent`
|
|
461
|
-
: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
438
|
+
reason: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
462
439
|
selectionMethod: "tier-only",
|
|
463
440
|
};
|
|
464
441
|
}
|
|
@@ -542,131 +519,8 @@ export function defaultRoutingConfig(): DynamicRoutingConfig {
|
|
|
542
519
|
};
|
|
543
520
|
}
|
|
544
521
|
|
|
545
|
-
// ─── Tier-Based Model Resolution (for profile defaults) ─────────────────────
|
|
546
|
-
|
|
547
|
-
/**
|
|
548
|
-
* Fallback-only canonical model IDs per tier. Returned when the
|
|
549
|
-
* available-model list is empty (e.g., preferences are loaded before the
|
|
550
|
-
* model registry is populated at bootstrap), or when a non-empty registry has
|
|
551
|
-
* no model at the requested tier.
|
|
552
|
-
*
|
|
553
|
-
* Precedence (resolveModelForTier):
|
|
554
|
-
* 1. configured `tier_models[tier]` (via getEligibleModels) — exact/bare match
|
|
555
|
-
* 2. cheapest available model whose tier matches `tier`
|
|
556
|
-
* 3. CANONICAL_TIER_MODELS[tier] as last-resort fallback
|
|
557
|
-
*/
|
|
558
|
-
const CANONICAL_TIER_MODELS: Record<ComplexityTier, string> = {
|
|
559
|
-
light: "claude-haiku-4-5",
|
|
560
|
-
standard: "claude-sonnet-4-6",
|
|
561
|
-
heavy: "claude-opus-4-6",
|
|
562
|
-
};
|
|
563
|
-
|
|
564
|
-
export function canonicalModelForTier(tier: ComplexityTier): string {
|
|
565
|
-
return CANONICAL_TIER_MODELS[tier];
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
/**
|
|
569
|
-
* Single source of truth for tier-based model selection.
|
|
570
|
-
* Returns the cheapest available model whose capability tier matches `tier`,
|
|
571
|
-
* honoring `routingConfig.tier_models[tier]` when set. Returns undefined when
|
|
572
|
-
* no available model matches the tier.
|
|
573
|
-
*
|
|
574
|
-
* `crossProvider`: when false, restricts the search to models that share the
|
|
575
|
-
* canonical (Anthropic) provider for the tier. When true, any provider is
|
|
576
|
-
* eligible.
|
|
577
|
-
*/
|
|
578
|
-
function findModelForTier(
|
|
579
|
-
tier: ComplexityTier,
|
|
580
|
-
routingConfig: DynamicRoutingConfig,
|
|
581
|
-
availableModelIds: string[],
|
|
582
|
-
crossProvider: boolean,
|
|
583
|
-
): string | undefined {
|
|
584
|
-
const eligible = getEligibleModels(tier, availableModelIds, routingConfig);
|
|
585
|
-
if (eligible.length === 0) return undefined;
|
|
586
|
-
|
|
587
|
-
if (crossProvider) {
|
|
588
|
-
return eligible[0];
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
// Same-provider only: keep models whose bare ID matches a canonical
|
|
592
|
-
// Anthropic ID at this tier (i.e., a claude-* model in the tier map).
|
|
593
|
-
const sameProvider = eligible.filter(id => {
|
|
594
|
-
const bare = bareModelId(id);
|
|
595
|
-
return MODEL_CAPABILITY_TIER[bare] === tier && bare.startsWith("claude-");
|
|
596
|
-
});
|
|
597
|
-
return sameProvider[0];
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
/**
|
|
601
|
-
* Resolve a concrete model ID for a given capability tier using the
|
|
602
|
-
* available model list. Provider-agnostic: picks the best available
|
|
603
|
-
* model at the requested tier.
|
|
604
|
-
*
|
|
605
|
-
* Precedence:
|
|
606
|
-
* 1. configured `tier_models[tier]`, if provided and available
|
|
607
|
-
* 2. tier-matching model from any provider in `availableModelIds`
|
|
608
|
-
* 3. canonical Anthropic ID as a fallback only when nothing else matches
|
|
609
|
-
* (or `availableModelIds` is empty, e.g., during early bootstrap)
|
|
610
|
-
*
|
|
611
|
-
* @param tier The capability tier to resolve
|
|
612
|
-
* @param availableModelIds List of available model IDs (REQUIRED for
|
|
613
|
-
* provider-agnostic resolution; pass [] only when
|
|
614
|
-
* the model registry is genuinely unavailable)
|
|
615
|
-
* @param routingConfig Optional routing config, or legacy crossProvider boolean
|
|
616
|
-
* @param crossProvider Whether to consider models from other providers
|
|
617
|
-
*/
|
|
618
|
-
export function resolveModelForTier(
|
|
619
|
-
tier: ComplexityTier,
|
|
620
|
-
availableModelIds: string[],
|
|
621
|
-
crossProvider?: boolean,
|
|
622
|
-
): string;
|
|
623
|
-
export function resolveModelForTier(
|
|
624
|
-
tier: ComplexityTier,
|
|
625
|
-
availableModelIds: string[],
|
|
626
|
-
routingConfig?: DynamicRoutingConfig,
|
|
627
|
-
crossProvider?: boolean,
|
|
628
|
-
): string;
|
|
629
|
-
export function resolveModelForTier(
|
|
630
|
-
tier: ComplexityTier,
|
|
631
|
-
availableModelIds: string[],
|
|
632
|
-
routingConfigOrCrossProvider: DynamicRoutingConfig | boolean = defaultRoutingConfig(),
|
|
633
|
-
crossProvider?: boolean,
|
|
634
|
-
): string {
|
|
635
|
-
const routingConfig = typeof routingConfigOrCrossProvider === "boolean"
|
|
636
|
-
? defaultRoutingConfig()
|
|
637
|
-
: { ...defaultRoutingConfig(), ...routingConfigOrCrossProvider };
|
|
638
|
-
const allowCrossProvider = typeof routingConfigOrCrossProvider === "boolean"
|
|
639
|
-
? routingConfigOrCrossProvider
|
|
640
|
-
: crossProvider ?? routingConfig.cross_provider !== false;
|
|
641
|
-
|
|
642
|
-
// No available models known — return canonical fallback
|
|
643
|
-
if (availableModelIds.length === 0) {
|
|
644
|
-
return canonicalModelForTier(tier);
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// Cross-provider tier search
|
|
648
|
-
const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
|
|
649
|
-
return resolved
|
|
650
|
-
? normalizeResolvedTierModelId(resolved, tier, routingConfig)
|
|
651
|
-
: canonicalModelForTier(tier);
|
|
652
|
-
}
|
|
653
|
-
|
|
654
522
|
// ─── Internal ────────────────────────────────────────────────────────────────
|
|
655
523
|
|
|
656
|
-
/**
|
|
657
|
-
* Check whether a model ID is present in the available models list.
|
|
658
|
-
* Handles bare IDs ("claude-opus-4-6") and provider-prefixed IDs ("anthropic/claude-opus-4-6").
|
|
659
|
-
*/
|
|
660
|
-
function isModelAvailable(modelId: string, availableModelIds: string[]): boolean {
|
|
661
|
-
if (availableModelIds.includes(modelId)) return true;
|
|
662
|
-
// Strip provider prefix for comparison. Treat trailing-slash IDs ("provider/")
|
|
663
|
-
// as no-bare-ID rather than empty-string match (which would erroneously match
|
|
664
|
-
// any other "provider/" ID).
|
|
665
|
-
const bare = bareModelId(modelId);
|
|
666
|
-
if (!bare) return false;
|
|
667
|
-
return availableModelIds.some(id => bareModelId(id) === bare);
|
|
668
|
-
}
|
|
669
|
-
|
|
670
524
|
function getModelTier(modelId: string): ComplexityTier {
|
|
671
525
|
// Strip provider prefix if present
|
|
672
526
|
const bareId = bareModelId(modelId);
|
|
@@ -709,25 +563,8 @@ function getModelCost(modelId: string): number {
|
|
|
709
563
|
return 999;
|
|
710
564
|
}
|
|
711
565
|
|
|
712
|
-
function normalizeResolvedTierModelId(
|
|
713
|
-
modelId: string,
|
|
714
|
-
tier: ComplexityTier,
|
|
715
|
-
routingConfig: DynamicRoutingConfig,
|
|
716
|
-
): string {
|
|
717
|
-
const explicitModel = routingConfig.tier_models?.[tier];
|
|
718
|
-
if (explicitModel?.includes("/")) {
|
|
719
|
-
return modelId;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
const bareId = bareModelId(modelId);
|
|
723
|
-
return MODEL_CAPABILITY_TIER[bareId] ? bareId : modelId;
|
|
724
|
-
}
|
|
725
|
-
|
|
726
566
|
function bareModelId(modelId: string): string {
|
|
727
|
-
|
|
728
|
-
// .pop() never returns undefined on a non-empty string but ?? guards future
|
|
729
|
-
// refactors and avoids the misleading non-null assertion.
|
|
730
|
-
return modelId.split("/").pop() ?? modelId;
|
|
567
|
+
return modelId.includes("/") ? modelId.split("/").pop()! : modelId;
|
|
731
568
|
}
|
|
732
569
|
|
|
733
570
|
// ─── Provider-specific Tool Limits ─────────────────────────────────────────
|
|
@@ -11,7 +11,6 @@ import { join } from "node:path";
|
|
|
11
11
|
import { GSDError, GSD_GIT_ERROR } from "./errors.js";
|
|
12
12
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
13
13
|
import { getErrorMessage } from "./error-utils.js";
|
|
14
|
-
import { isInfrastructureError } from "./auto/infra-errors.js";
|
|
15
14
|
|
|
16
15
|
// Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
|
|
17
16
|
// caller explicitly opts into the native helper.
|
|
@@ -847,10 +846,6 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
|
|
|
847
846
|
});
|
|
848
847
|
} catch (err: unknown) {
|
|
849
848
|
const stderr = (err as { stderr?: string })?.stderr ?? "";
|
|
850
|
-
const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
|
|
851
|
-
if (infraCode) {
|
|
852
|
-
throw err;
|
|
853
|
-
}
|
|
854
849
|
// git exits 1 when pathspec exclusions reference paths already covered
|
|
855
850
|
// by .gitignore. The staging itself succeeds — only suppress that case.
|
|
856
851
|
if (stderr.includes("ignored by one of your .gitignore files")) {
|
|
@@ -865,8 +860,7 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
|
|
|
865
860
|
fallbackStageWithSymlinkedDotGsd(basePath);
|
|
866
861
|
return;
|
|
867
862
|
}
|
|
868
|
-
|
|
869
|
-
throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}${stderrDetail}`);
|
|
863
|
+
throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}`);
|
|
870
864
|
}
|
|
871
865
|
}
|
|
872
866
|
|
|
@@ -10,8 +10,7 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
10
10
|
import { homedir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import type { DynamicRoutingConfig } from "./model-router.js";
|
|
13
|
-
import {
|
|
14
|
-
import type { ComplexityTier } from "./complexity-classifier.js";
|
|
13
|
+
import { defaultRoutingConfig } from "./model-router.js";
|
|
15
14
|
import type { TokenProfile, InlineLevel } from "./types.js";
|
|
16
15
|
|
|
17
16
|
import type {
|
|
@@ -44,7 +43,7 @@ export function resolveModelForUnit(unitType: string): string | undefined {
|
|
|
44
43
|
* - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
|
|
45
44
|
*/
|
|
46
45
|
export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedModelConfig | undefined {
|
|
47
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
46
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
48
47
|
if (!prefs?.preferences.models) return undefined;
|
|
49
48
|
const m = prefs.preferences.models as GSDModelConfigV2;
|
|
50
49
|
|
|
@@ -133,7 +132,7 @@ export function resolveModelWithFallbacksForUnit(unitType: string): ResolvedMode
|
|
|
133
132
|
export function resolveDefaultSessionModel(
|
|
134
133
|
sessionProvider?: string,
|
|
135
134
|
): { provider: string; id: string } | undefined {
|
|
136
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
135
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
137
136
|
if (!prefs?.preferences.models) return undefined;
|
|
138
137
|
|
|
139
138
|
const m = prefs.preferences.models as GSDModelConfigV2;
|
|
@@ -359,86 +358,22 @@ export function resolveAutoSupervisorConfig(): AutoSupervisorConfig {
|
|
|
359
358
|
|
|
360
359
|
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
|
|
361
360
|
|
|
362
|
-
/**
|
|
363
|
-
* Per-phase tier intentions for each token profile.
|
|
364
|
-
* Profiles express capability tiers, not model IDs. Concrete model
|
|
365
|
-
* resolution happens at runtime via resolveModelForTier() which is
|
|
366
|
-
* provider-agnostic — it picks the best available model at each tier.
|
|
367
|
-
*/
|
|
368
|
-
const PROFILE_TIER_MAP: Record<TokenProfile, Record<string, ComplexityTier>> = {
|
|
369
|
-
budget: {
|
|
370
|
-
planning: "standard",
|
|
371
|
-
research: "light",
|
|
372
|
-
execution: "standard",
|
|
373
|
-
execution_simple: "light",
|
|
374
|
-
completion: "light",
|
|
375
|
-
subagent: "light",
|
|
376
|
-
},
|
|
377
|
-
balanced: {
|
|
378
|
-
planning: "standard",
|
|
379
|
-
research: "standard",
|
|
380
|
-
execution: "standard",
|
|
381
|
-
execution_simple: "light",
|
|
382
|
-
completion: "light",
|
|
383
|
-
subagent: "light",
|
|
384
|
-
},
|
|
385
|
-
quality: {
|
|
386
|
-
planning: "heavy",
|
|
387
|
-
research: "standard",
|
|
388
|
-
execution: "standard",
|
|
389
|
-
execution_simple: "light",
|
|
390
|
-
completion: "light",
|
|
391
|
-
subagent: "standard",
|
|
392
|
-
},
|
|
393
|
-
// burn-max intentionally omits a tier map: it never writes model defaults
|
|
394
|
-
// (it preserves the user's explicit model selection), so resolveProfileDefaults
|
|
395
|
-
// skips model resolution for this profile.
|
|
396
|
-
"burn-max": {},
|
|
397
|
-
};
|
|
398
|
-
|
|
399
361
|
/**
|
|
400
362
|
* Resolve profile defaults for a given token profile tier.
|
|
401
363
|
* Returns a partial GSDPreferences that is used as the base layer --
|
|
402
364
|
* explicit user preferences always override these defaults.
|
|
403
|
-
*
|
|
404
|
-
* Model IDs are resolved from capability tiers, not hardcoded to any
|
|
405
|
-
* provider. When available models are known (runtime), the resolver picks
|
|
406
|
-
* the best match across all configured providers. When not known (e.g.,
|
|
407
|
-
* early startup), falls back to canonical Anthropic model IDs.
|
|
408
|
-
*
|
|
409
|
-
* @param profile The token profile to resolve
|
|
410
|
-
* @param availableModelIds Optional list of available model IDs for cross-provider resolution.
|
|
411
|
-
* Undefined means the registry is unavailable.
|
|
412
|
-
* @param routingConfig Optional routing config for tier model pins.
|
|
413
365
|
*/
|
|
414
|
-
export function resolveProfileDefaults(
|
|
415
|
-
profile: TokenProfile,
|
|
416
|
-
availableModelIds?: string[],
|
|
417
|
-
routingConfig: DynamicRoutingConfig = defaultRoutingConfig(),
|
|
418
|
-
): Partial<GSDPreferences> {
|
|
419
|
-
// burn-max never writes model defaults — preserve user-selected models.
|
|
420
|
-
// For the other three profiles, derive concrete model IDs from the tier map
|
|
421
|
-
// against the available-model list when the registry is provided. If callers
|
|
422
|
-
// omit the registry entirely, use canonical fallbacks explicitly.
|
|
423
|
-
const tierMap = PROFILE_TIER_MAP[profile];
|
|
424
|
-
const resolveTierModel = (tier: ComplexityTier): string => Array.isArray(availableModelIds)
|
|
425
|
-
? resolveModelForTier(tier, availableModelIds, routingConfig)
|
|
426
|
-
: canonicalModelForTier(tier);
|
|
427
|
-
const models: GSDModelConfigV2 | undefined = profile === "burn-max"
|
|
428
|
-
? undefined
|
|
429
|
-
: {
|
|
430
|
-
planning: resolveTierModel(tierMap.planning),
|
|
431
|
-
research: resolveTierModel(tierMap.research),
|
|
432
|
-
execution: resolveTierModel(tierMap.execution),
|
|
433
|
-
execution_simple: resolveTierModel(tierMap.execution_simple),
|
|
434
|
-
completion: resolveTierModel(tierMap.completion),
|
|
435
|
-
subagent: resolveTierModel(tierMap.subagent),
|
|
436
|
-
};
|
|
437
|
-
|
|
366
|
+
export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPreferences> {
|
|
438
367
|
switch (profile) {
|
|
439
368
|
case "budget":
|
|
440
369
|
return {
|
|
441
|
-
models
|
|
370
|
+
models: {
|
|
371
|
+
planning: "claude-sonnet-4-5-20250514",
|
|
372
|
+
execution: "claude-sonnet-4-5-20250514",
|
|
373
|
+
execution_simple: "claude-haiku-4-5-20250414",
|
|
374
|
+
completion: "claude-haiku-4-5-20250414",
|
|
375
|
+
subagent: "claude-haiku-4-5-20250414",
|
|
376
|
+
},
|
|
442
377
|
phases: {
|
|
443
378
|
skip_research: true,
|
|
444
379
|
skip_reassess: true,
|
|
@@ -448,7 +383,9 @@ export function resolveProfileDefaults(
|
|
|
448
383
|
};
|
|
449
384
|
case "balanced":
|
|
450
385
|
return {
|
|
451
|
-
models
|
|
386
|
+
models: {
|
|
387
|
+
subagent: "claude-sonnet-4-5-20250514",
|
|
388
|
+
},
|
|
452
389
|
phases: {
|
|
453
390
|
skip_research: true,
|
|
454
391
|
skip_reassess: true,
|
|
@@ -457,7 +394,7 @@ export function resolveProfileDefaults(
|
|
|
457
394
|
};
|
|
458
395
|
case "quality":
|
|
459
396
|
return {
|
|
460
|
-
models,
|
|
397
|
+
models: {},
|
|
461
398
|
phases: {
|
|
462
399
|
skip_research: true,
|
|
463
400
|
skip_slice_research: true,
|
|
@@ -483,14 +420,6 @@ export function resolveProfileDefaults(
|
|
|
483
420
|
}
|
|
484
421
|
}
|
|
485
422
|
|
|
486
|
-
/**
|
|
487
|
-
* Get the tier intentions for a profile without resolving to model IDs.
|
|
488
|
-
* Useful for display, debugging, and testing.
|
|
489
|
-
*/
|
|
490
|
-
export function getProfileTierMap(profile: TokenProfile): Record<string, ComplexityTier> {
|
|
491
|
-
return { ...PROFILE_TIER_MAP[profile] };
|
|
492
|
-
}
|
|
493
|
-
|
|
494
423
|
/**
|
|
495
424
|
* Resolve the effective token profile from preferences.
|
|
496
425
|
* Returns "balanced" when no profile is set (D046).
|
|
@@ -536,18 +465,3 @@ export function resolveSearchProviderFromPreferences(): GSDPreferences["search_p
|
|
|
536
465
|
const prefs = loadEffectiveGSDPreferences();
|
|
537
466
|
return prefs?.preferences.search_provider;
|
|
538
467
|
}
|
|
539
|
-
|
|
540
|
-
/**
|
|
541
|
-
* Resolve provider IDs excluded from model selection/routing.
|
|
542
|
-
* Returns a normalized, de-duplicated list.
|
|
543
|
-
*/
|
|
544
|
-
export function resolveDisabledModelProvidersFromPreferences(): string[] {
|
|
545
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
546
|
-
const raw = prefs?.preferences.disabled_model_providers;
|
|
547
|
-
if (!Array.isArray(raw)) return [];
|
|
548
|
-
return Array.from(new Set(
|
|
549
|
-
raw
|
|
550
|
-
.map((provider) => provider.trim())
|
|
551
|
-
.filter((provider) => provider.length > 0),
|
|
552
|
-
));
|
|
553
|
-
}
|
|
@@ -114,7 +114,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
114
114
|
"post_unit_hooks",
|
|
115
115
|
"pre_dispatch_hooks",
|
|
116
116
|
"dynamic_routing",
|
|
117
|
-
"disabled_model_providers",
|
|
118
117
|
"uok",
|
|
119
118
|
"token_profile",
|
|
120
119
|
"phases",
|
|
@@ -133,7 +132,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
133
132
|
"service_tier",
|
|
134
133
|
"forensics_dedup",
|
|
135
134
|
"show_token_cost",
|
|
136
|
-
"min_request_interval_ms",
|
|
137
135
|
"stale_commit_threshold_minutes",
|
|
138
136
|
"context_management",
|
|
139
137
|
"experimental",
|
|
@@ -322,8 +320,6 @@ export interface GSDPreferences {
|
|
|
322
320
|
post_unit_hooks?: PostUnitHookConfig[];
|
|
323
321
|
pre_dispatch_hooks?: PreDispatchHookConfig[];
|
|
324
322
|
dynamic_routing?: DynamicRoutingConfig;
|
|
325
|
-
/** Provider IDs to exclude from /model and automatic model routing while leaving tool auth intact. */
|
|
326
|
-
disabled_model_providers?: string[];
|
|
327
323
|
/** Unified Orchestration Kernel controls (default-on, with opt-out and emergency legacy fallback). */
|
|
328
324
|
uok?: UokPreferences;
|
|
329
325
|
/** Per-model capability overrides. Deep-merged with built-in profiles for capability-aware routing (ADR-004). */
|
|
@@ -369,8 +365,6 @@ export interface GSDPreferences {
|
|
|
369
365
|
forensics_dedup?: boolean;
|
|
370
366
|
/** Opt-in: show per-prompt and cumulative session token cost in the footer. Default: false. */
|
|
371
367
|
show_token_cost?: boolean;
|
|
372
|
-
/** Proactive rate limiting: minimum milliseconds between auto-mode LLM requests. Prevents 429s on rate-limited providers. 0 = disabled (default). */
|
|
373
|
-
min_request_interval_ms?: number;
|
|
374
368
|
/**
|
|
375
369
|
* Minutes without a commit before flagging uncommitted changes as stale.
|
|
376
370
|
* When the threshold is exceeded and the working tree is dirty, doctor will
|
|
@@ -610,27 +610,6 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
610
610
|
}
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
-
// ─── Disabled Model Providers ───────────────────────────────────────
|
|
614
|
-
if (preferences.disabled_model_providers !== undefined) {
|
|
615
|
-
if (Array.isArray(preferences.disabled_model_providers)) {
|
|
616
|
-
const allStrings = preferences.disabled_model_providers.every(
|
|
617
|
-
(provider: unknown) => typeof provider === "string",
|
|
618
|
-
);
|
|
619
|
-
if (!allStrings) {
|
|
620
|
-
errors.push("disabled_model_providers must be an array of strings");
|
|
621
|
-
} else {
|
|
622
|
-
const normalized = preferences.disabled_model_providers
|
|
623
|
-
.map((provider) => provider.trim())
|
|
624
|
-
.filter((provider) => provider.length > 0);
|
|
625
|
-
if (normalized.length > 0) {
|
|
626
|
-
validated.disabled_model_providers = Array.from(new Set(normalized));
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
} else {
|
|
630
|
-
errors.push("disabled_model_providers must be an array of strings");
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
|
|
634
613
|
// ─── Context Management ──────────────────────────────────────────────
|
|
635
614
|
if (preferences.context_management !== undefined) {
|
|
636
615
|
if (typeof preferences.context_management === "object" && preferences.context_management !== null) {
|
|
@@ -1122,20 +1101,6 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
1122
1101
|
}
|
|
1123
1102
|
}
|
|
1124
1103
|
|
|
1125
|
-
// ─── Auto-Mode Request Interval ───────────────────────────────────
|
|
1126
|
-
if (preferences.min_request_interval_ms !== undefined) {
|
|
1127
|
-
if (
|
|
1128
|
-
typeof preferences.min_request_interval_ms === "number" &&
|
|
1129
|
-
Number.isFinite(preferences.min_request_interval_ms) &&
|
|
1130
|
-
preferences.min_request_interval_ms >= 0 &&
|
|
1131
|
-
preferences.min_request_interval_ms <= 2_147_483_647
|
|
1132
|
-
) {
|
|
1133
|
-
validated.min_request_interval_ms = Math.floor(preferences.min_request_interval_ms);
|
|
1134
|
-
} else {
|
|
1135
|
-
errors.push("min_request_interval_ms must be a non-negative number <= 2147483647");
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
1104
|
// ─── Experimental Features ────────────────────────────────────────
|
|
1140
1105
|
if (preferences.experimental !== undefined) {
|
|
1141
1106
|
if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
|
|
@@ -89,12 +89,10 @@ export {
|
|
|
89
89
|
resolveDynamicRoutingConfig,
|
|
90
90
|
resolveAutoSupervisorConfig,
|
|
91
91
|
resolveProfileDefaults,
|
|
92
|
-
getProfileTierMap,
|
|
93
92
|
resolveEffectiveProfile,
|
|
94
93
|
resolveInlineLevel,
|
|
95
94
|
resolveContextSelection,
|
|
96
95
|
resolveSearchProviderFromPreferences,
|
|
97
|
-
resolveDisabledModelProvidersFromPreferences,
|
|
98
96
|
} from "./preferences-models.js";
|
|
99
97
|
|
|
100
98
|
// ─── Path Constants & Getters ───────────────────────────────────────────────
|
|
@@ -148,10 +146,7 @@ export function loadProjectGSDPreferences(basePath?: string): LoadedGSDPreferenc
|
|
|
148
146
|
?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
|
|
149
147
|
}
|
|
150
148
|
|
|
151
|
-
export function loadEffectiveGSDPreferences(
|
|
152
|
-
basePath?: string,
|
|
153
|
-
opts?: { availableModelIds?: string[] },
|
|
154
|
-
): LoadedGSDPreferences | null {
|
|
149
|
+
export function loadEffectiveGSDPreferences(basePath?: string): LoadedGSDPreferences | null {
|
|
155
150
|
const globalPreferences = loadGlobalGSDPreferences();
|
|
156
151
|
const projectPreferences = loadProjectGSDPreferences(basePath);
|
|
157
152
|
|
|
@@ -180,11 +175,7 @@ export function loadEffectiveGSDPreferences(
|
|
|
180
175
|
// Explicit user preferences always override profile defaults.
|
|
181
176
|
const profile = result.preferences.token_profile as TokenProfile | undefined;
|
|
182
177
|
if (profile) {
|
|
183
|
-
const profileDefaults = _resolveProfileDefaults(
|
|
184
|
-
profile,
|
|
185
|
-
opts?.availableModelIds,
|
|
186
|
-
result.preferences.dynamic_routing,
|
|
187
|
-
);
|
|
178
|
+
const profileDefaults = _resolveProfileDefaults(profile);
|
|
188
179
|
result = {
|
|
189
180
|
...result,
|
|
190
181
|
preferences: mergePreferences(profileDefaults as GSDPreferences, result.preferences),
|
|
@@ -389,10 +380,6 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
|
|
|
389
380
|
dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
|
|
390
381
|
? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) } as DynamicRoutingConfig
|
|
391
382
|
: undefined,
|
|
392
|
-
disabled_model_providers: mergeStringLists(
|
|
393
|
-
base.disabled_model_providers,
|
|
394
|
-
override.disabled_model_providers,
|
|
395
|
-
),
|
|
396
383
|
uok: (base.uok || override.uok)
|
|
397
384
|
? {
|
|
398
385
|
enabled: override.uok?.enabled ?? base.uok?.enabled,
|
|
@@ -446,7 +433,6 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
|
|
|
446
433
|
service_tier: override.service_tier ?? base.service_tier,
|
|
447
434
|
forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
|
|
448
435
|
show_token_cost: override.show_token_cost ?? base.show_token_cost,
|
|
449
|
-
min_request_interval_ms: override.min_request_interval_ms ?? base.min_request_interval_ms,
|
|
450
436
|
codebase: (base.codebase || override.codebase)
|
|
451
437
|
? {
|
|
452
438
|
...(base.codebase ?? {}),
|
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
* Templates live at prompts/ relative to this module's directory.
|
|
8
8
|
* They use {{variableName}} syntax for substitution.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* This
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* template
|
|
16
|
-
*
|
|
10
|
+
* All templates are eagerly loaded into cache at module init via warmCache().
|
|
11
|
+
* This prevents a running session from being invalidated when another `gsd`
|
|
12
|
+
* launch overwrites ~/.gsd/agent/ with newer templates via initResources().
|
|
13
|
+
* Without eager caching, the in-memory extension code (which knows variable
|
|
14
|
+
* set A) can read a newer template from disk (which expects variable set B),
|
|
15
|
+
* causing a "template declares {{X}} but no value was provided" crash
|
|
16
|
+
* mid-session — especially for late-loading templates like complete-milestone
|
|
17
|
+
* that aren't read until the end of a long auto-mode run.
|
|
17
18
|
*/
|
|
18
19
|
|
|
19
20
|
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
@@ -81,8 +82,8 @@ export function getTemplatesDir(): string {
|
|
|
81
82
|
return templatesDir;
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
// Cache all templates
|
|
85
|
-
// template versions that were on disk
|
|
85
|
+
// Cache all templates eagerly at module load — a running session uses the
|
|
86
|
+
// template versions that were on disk at startup, immune to later overwrites.
|
|
86
87
|
const templateCache = new Map<string, string>();
|
|
87
88
|
|
|
88
89
|
/**
|
|
@@ -123,23 +124,8 @@ function warmCache(): void {
|
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
function scheduleWarmCache(): void {
|
|
129
|
-
if (warmCacheScheduled) return;
|
|
130
|
-
warmCacheScheduled = true;
|
|
131
|
-
|
|
132
|
-
const run = () => {
|
|
133
|
-
warmCache();
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const timer = setTimeout(run, 1000);
|
|
137
|
-
timer.unref?.();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Snapshot the full prompt/template tree after import so extension startup only
|
|
141
|
-
// pays for prompts that are actually needed immediately.
|
|
142
|
-
scheduleWarmCache();
|
|
127
|
+
// Snapshot all templates at module load time
|
|
128
|
+
warmCache();
|
|
143
129
|
|
|
144
130
|
/**
|
|
145
131
|
* Load a prompt template and substitute variables.
|
|
@@ -82,7 +82,6 @@ let sliceState: SliceOrchestratorState | null = null;
|
|
|
82
82
|
|
|
83
83
|
const SLICE_ORCHESTRATOR_STATE_FILE = "slice-orchestrator.json";
|
|
84
84
|
const TMP_SUFFIX = ".tmp";
|
|
85
|
-
export const SLICE_WORKER_AUTO_ARGS = ["headless", "--json", "auto"] as const;
|
|
86
85
|
|
|
87
86
|
interface PersistedSliceWorker {
|
|
88
87
|
milestoneId: string;
|
|
@@ -357,7 +356,7 @@ export function getSliceOrchestratorState(): SliceOrchestratorState | null {
|
|
|
357
356
|
/**
|
|
358
357
|
* Start parallel execution for eligible slices within a milestone.
|
|
359
358
|
*
|
|
360
|
-
* For each eligible slice: create a worktree, spawn `gsd
|
|
359
|
+
* For each eligible slice: create a worktree, spawn `gsd --mode json --print "/gsd auto"`
|
|
361
360
|
* with env GSD_SLICE_LOCK=<SID> + GSD_MILESTONE_LOCK=<MID> + GSD_PARALLEL_WORKER=1.
|
|
362
361
|
*/
|
|
363
362
|
export async function startSliceParallel(
|
|
@@ -599,13 +598,8 @@ function resolveGsdBin(): string | null {
|
|
|
599
598
|
|
|
600
599
|
/**
|
|
601
600
|
* Spawn a worker process for a slice.
|
|
602
|
-
* The worker runs `gsd
|
|
601
|
+
* The worker runs `gsd --mode json --print "/gsd auto"` in the slice's worktree
|
|
603
602
|
* with GSD_SLICE_LOCK, GSD_MILESTONE_LOCK, and GSD_PARALLEL_WORKER set.
|
|
604
|
-
*
|
|
605
|
-
* Print-mode slash commands return after the command handler schedules
|
|
606
|
-
* auto-mode, so the worker process can exit before doing any LLM work. The
|
|
607
|
-
* headless auto entrypoint keeps the process alive until auto-mode reaches a
|
|
608
|
-
* terminal notification, matching milestone-level parallel workers.
|
|
609
603
|
*/
|
|
610
604
|
function spawnSliceWorker(
|
|
611
605
|
basePath: string,
|
|
@@ -622,7 +616,7 @@ function spawnSliceWorker(
|
|
|
622
616
|
|
|
623
617
|
let child: ChildProcess;
|
|
624
618
|
try {
|
|
625
|
-
child = spawn(process.execPath, [binPath,
|
|
619
|
+
child = spawn(process.execPath, [binPath, "--mode", "json", "--print", "/gsd auto"], {
|
|
626
620
|
cwd: worker.worktreePath,
|
|
627
621
|
env: {
|
|
628
622
|
...process.env,
|