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
|
@@ -228,8 +228,11 @@ export function getEligibleModels(tier, availableModelIds, routingConfig) {
|
|
|
228
228
|
if (availableModelIds.includes(explicitModel))
|
|
229
229
|
return [explicitModel];
|
|
230
230
|
// Provider-prefix-stripped match
|
|
231
|
-
const
|
|
232
|
-
|
|
231
|
+
const match = availableModelIds.find(id => {
|
|
232
|
+
const bareAvail = id.includes("/") ? id.split("/").pop() : id;
|
|
233
|
+
const bareExplicit = explicitModel.includes("/") ? explicitModel.split("/").pop() : explicitModel;
|
|
234
|
+
return bareAvail === bareExplicit;
|
|
235
|
+
});
|
|
233
236
|
if (match)
|
|
234
237
|
return [match];
|
|
235
238
|
}
|
|
@@ -320,31 +323,12 @@ export function resolveModelForComplexity(classification, phaseConfig, routingCo
|
|
|
320
323
|
}
|
|
321
324
|
// Downgrade-only: if requested tier >= configured tier, no change
|
|
322
325
|
if (tierOrdinal(requestedTier) >= tierOrdinal(configuredTier)) {
|
|
323
|
-
// If the configured primary is directly available, use it
|
|
324
|
-
if (isModelAvailable(configuredPrimary, availableModelIds)) {
|
|
325
|
-
return {
|
|
326
|
-
modelId: configuredPrimary,
|
|
327
|
-
fallbacks: phaseConfig.fallbacks,
|
|
328
|
-
tier: requestedTier,
|
|
329
|
-
wasDowngraded: false,
|
|
330
|
-
reason: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
331
|
-
selectionMethod: "tier-only",
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
// Configured primary is unavailable (e.g. Anthropic model configured but
|
|
335
|
-
// running on a non-Anthropic provider). Find the best available model at
|
|
336
|
-
// the same capability tier so routing still works cross-provider.
|
|
337
|
-
const crossProviderEquivalent = findModelForTier(configuredTier, routingConfig, availableModelIds, routingConfig.cross_provider !== false);
|
|
338
326
|
return {
|
|
339
|
-
modelId:
|
|
340
|
-
fallbacks:
|
|
341
|
-
? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
|
|
342
|
-
: phaseConfig.fallbacks,
|
|
327
|
+
modelId: configuredPrimary,
|
|
328
|
+
fallbacks: phaseConfig.fallbacks,
|
|
343
329
|
tier: requestedTier,
|
|
344
330
|
wasDowngraded: false,
|
|
345
|
-
reason:
|
|
346
|
-
? `cross-provider ${configuredTier}-tier equivalent`
|
|
347
|
-
: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
331
|
+
reason: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
348
332
|
selectionMethod: "tier-only",
|
|
349
333
|
};
|
|
350
334
|
}
|
|
@@ -420,84 +404,7 @@ export function defaultRoutingConfig() {
|
|
|
420
404
|
hooks: true,
|
|
421
405
|
};
|
|
422
406
|
}
|
|
423
|
-
// ─── Tier-Based Model Resolution (for profile defaults) ─────────────────────
|
|
424
|
-
/**
|
|
425
|
-
* Fallback-only canonical model IDs per tier. Returned when the
|
|
426
|
-
* available-model list is empty (e.g., preferences are loaded before the
|
|
427
|
-
* model registry is populated at bootstrap), or when a non-empty registry has
|
|
428
|
-
* no model at the requested tier.
|
|
429
|
-
*
|
|
430
|
-
* Precedence (resolveModelForTier):
|
|
431
|
-
* 1. configured `tier_models[tier]` (via getEligibleModels) — exact/bare match
|
|
432
|
-
* 2. cheapest available model whose tier matches `tier`
|
|
433
|
-
* 3. CANONICAL_TIER_MODELS[tier] as last-resort fallback
|
|
434
|
-
*/
|
|
435
|
-
const CANONICAL_TIER_MODELS = {
|
|
436
|
-
light: "claude-haiku-4-5",
|
|
437
|
-
standard: "claude-sonnet-4-6",
|
|
438
|
-
heavy: "claude-opus-4-6",
|
|
439
|
-
};
|
|
440
|
-
export function canonicalModelForTier(tier) {
|
|
441
|
-
return CANONICAL_TIER_MODELS[tier];
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* Single source of truth for tier-based model selection.
|
|
445
|
-
* Returns the cheapest available model whose capability tier matches `tier`,
|
|
446
|
-
* honoring `routingConfig.tier_models[tier]` when set. Returns undefined when
|
|
447
|
-
* no available model matches the tier.
|
|
448
|
-
*
|
|
449
|
-
* `crossProvider`: when false, restricts the search to models that share the
|
|
450
|
-
* canonical (Anthropic) provider for the tier. When true, any provider is
|
|
451
|
-
* eligible.
|
|
452
|
-
*/
|
|
453
|
-
function findModelForTier(tier, routingConfig, availableModelIds, crossProvider) {
|
|
454
|
-
const eligible = getEligibleModels(tier, availableModelIds, routingConfig);
|
|
455
|
-
if (eligible.length === 0)
|
|
456
|
-
return undefined;
|
|
457
|
-
if (crossProvider) {
|
|
458
|
-
return eligible[0];
|
|
459
|
-
}
|
|
460
|
-
// Same-provider only: keep models whose bare ID matches a canonical
|
|
461
|
-
// Anthropic ID at this tier (i.e., a claude-* model in the tier map).
|
|
462
|
-
const sameProvider = eligible.filter(id => {
|
|
463
|
-
const bare = bareModelId(id);
|
|
464
|
-
return MODEL_CAPABILITY_TIER[bare] === tier && bare.startsWith("claude-");
|
|
465
|
-
});
|
|
466
|
-
return sameProvider[0];
|
|
467
|
-
}
|
|
468
|
-
export function resolveModelForTier(tier, availableModelIds, routingConfigOrCrossProvider = defaultRoutingConfig(), crossProvider) {
|
|
469
|
-
const routingConfig = typeof routingConfigOrCrossProvider === "boolean"
|
|
470
|
-
? defaultRoutingConfig()
|
|
471
|
-
: { ...defaultRoutingConfig(), ...routingConfigOrCrossProvider };
|
|
472
|
-
const allowCrossProvider = typeof routingConfigOrCrossProvider === "boolean"
|
|
473
|
-
? routingConfigOrCrossProvider
|
|
474
|
-
: crossProvider ?? routingConfig.cross_provider !== false;
|
|
475
|
-
// No available models known — return canonical fallback
|
|
476
|
-
if (availableModelIds.length === 0) {
|
|
477
|
-
return canonicalModelForTier(tier);
|
|
478
|
-
}
|
|
479
|
-
// Cross-provider tier search
|
|
480
|
-
const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
|
|
481
|
-
return resolved
|
|
482
|
-
? normalizeResolvedTierModelId(resolved, tier, routingConfig)
|
|
483
|
-
: canonicalModelForTier(tier);
|
|
484
|
-
}
|
|
485
407
|
// ─── Internal ────────────────────────────────────────────────────────────────
|
|
486
|
-
/**
|
|
487
|
-
* Check whether a model ID is present in the available models list.
|
|
488
|
-
* Handles bare IDs ("claude-opus-4-6") and provider-prefixed IDs ("anthropic/claude-opus-4-6").
|
|
489
|
-
*/
|
|
490
|
-
function isModelAvailable(modelId, availableModelIds) {
|
|
491
|
-
if (availableModelIds.includes(modelId))
|
|
492
|
-
return true;
|
|
493
|
-
// Strip provider prefix for comparison. Treat trailing-slash IDs ("provider/")
|
|
494
|
-
// as no-bare-ID rather than empty-string match (which would erroneously match
|
|
495
|
-
// any other "provider/" ID).
|
|
496
|
-
const bare = bareModelId(modelId);
|
|
497
|
-
if (!bare)
|
|
498
|
-
return false;
|
|
499
|
-
return availableModelIds.some(id => bareModelId(id) === bare);
|
|
500
|
-
}
|
|
501
408
|
function getModelTier(modelId) {
|
|
502
409
|
// Strip provider prefix if present
|
|
503
410
|
const bareId = bareModelId(modelId);
|
|
@@ -536,20 +443,8 @@ function getModelCost(modelId) {
|
|
|
536
443
|
// Unknown cost — assume expensive to avoid routing to unknown cheap models
|
|
537
444
|
return 999;
|
|
538
445
|
}
|
|
539
|
-
function normalizeResolvedTierModelId(modelId, tier, routingConfig) {
|
|
540
|
-
const explicitModel = routingConfig.tier_models?.[tier];
|
|
541
|
-
if (explicitModel?.includes("/")) {
|
|
542
|
-
return modelId;
|
|
543
|
-
}
|
|
544
|
-
const bareId = bareModelId(modelId);
|
|
545
|
-
return MODEL_CAPABILITY_TIER[bareId] ? bareId : modelId;
|
|
546
|
-
}
|
|
547
446
|
function bareModelId(modelId) {
|
|
548
|
-
|
|
549
|
-
return modelId;
|
|
550
|
-
// .pop() never returns undefined on a non-empty string but ?? guards future
|
|
551
|
-
// refactors and avoids the misleading non-null assertion.
|
|
552
|
-
return modelId.split("/").pop() ?? modelId;
|
|
447
|
+
return modelId.includes("/") ? modelId.split("/").pop() : modelId;
|
|
553
448
|
}
|
|
554
449
|
// ─── Provider-specific Tool Limits ─────────────────────────────────────────
|
|
555
450
|
/**
|
|
@@ -10,7 +10,6 @@ import { join } from "node:path";
|
|
|
10
10
|
import { GSDError, GSD_GIT_ERROR } from "./errors.js";
|
|
11
11
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
12
12
|
import { getErrorMessage } from "./error-utils.js";
|
|
13
|
-
import { isInfrastructureError } from "./auto/infra-errors.js";
|
|
14
13
|
// Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
|
|
15
14
|
// caller explicitly opts into the native helper.
|
|
16
15
|
const NATIVE_GSD_GIT_ENABLED = process.env.GSD_ENABLE_NATIVE_GSD_GIT === "1";
|
|
@@ -696,10 +695,6 @@ export function nativeAddAllWithExclusions(basePath, exclusions) {
|
|
|
696
695
|
}
|
|
697
696
|
catch (err) {
|
|
698
697
|
const stderr = err?.stderr ?? "";
|
|
699
|
-
const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
|
|
700
|
-
if (infraCode) {
|
|
701
|
-
throw err;
|
|
702
|
-
}
|
|
703
698
|
// git exits 1 when pathspec exclusions reference paths already covered
|
|
704
699
|
// by .gitignore. The staging itself succeeds — only suppress that case.
|
|
705
700
|
if (stderr.includes("ignored by one of your .gitignore files")) {
|
|
@@ -714,8 +709,7 @@ export function nativeAddAllWithExclusions(basePath, exclusions) {
|
|
|
714
709
|
fallbackStageWithSymlinkedDotGsd(basePath);
|
|
715
710
|
return;
|
|
716
711
|
}
|
|
717
|
-
|
|
718
|
-
throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}${stderrDetail}`);
|
|
712
|
+
throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}`);
|
|
719
713
|
}
|
|
720
714
|
}
|
|
721
715
|
/**
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
-
import {
|
|
11
|
+
import { defaultRoutingConfig } from "./model-router.js";
|
|
12
12
|
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
13
13
|
/**
|
|
14
14
|
* Resolve which model ID to use for a given auto-mode unit type.
|
|
@@ -27,7 +27,7 @@ export function resolveModelForUnit(unitType) {
|
|
|
27
27
|
* - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
|
|
28
28
|
*/
|
|
29
29
|
export function resolveModelWithFallbacksForUnit(unitType) {
|
|
30
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
30
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
31
31
|
if (!prefs?.preferences.models)
|
|
32
32
|
return undefined;
|
|
33
33
|
const m = prefs.preferences.models;
|
|
@@ -110,7 +110,7 @@ export function resolveModelWithFallbacksForUnit(unitType) {
|
|
|
110
110
|
* configured.
|
|
111
111
|
*/
|
|
112
112
|
export function resolveDefaultSessionModel(sessionProvider) {
|
|
113
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
113
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
114
114
|
if (!prefs?.preferences.models)
|
|
115
115
|
return undefined;
|
|
116
116
|
const m = prefs.preferences.models;
|
|
@@ -323,80 +323,22 @@ export function resolveAutoSupervisorConfig() {
|
|
|
323
323
|
}
|
|
324
324
|
// ─── Token Profile Resolution ─────────────────────────────────────────────
|
|
325
325
|
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
|
|
326
|
-
/**
|
|
327
|
-
* Per-phase tier intentions for each token profile.
|
|
328
|
-
* Profiles express capability tiers, not model IDs. Concrete model
|
|
329
|
-
* resolution happens at runtime via resolveModelForTier() which is
|
|
330
|
-
* provider-agnostic — it picks the best available model at each tier.
|
|
331
|
-
*/
|
|
332
|
-
const PROFILE_TIER_MAP = {
|
|
333
|
-
budget: {
|
|
334
|
-
planning: "standard",
|
|
335
|
-
research: "light",
|
|
336
|
-
execution: "standard",
|
|
337
|
-
execution_simple: "light",
|
|
338
|
-
completion: "light",
|
|
339
|
-
subagent: "light",
|
|
340
|
-
},
|
|
341
|
-
balanced: {
|
|
342
|
-
planning: "standard",
|
|
343
|
-
research: "standard",
|
|
344
|
-
execution: "standard",
|
|
345
|
-
execution_simple: "light",
|
|
346
|
-
completion: "light",
|
|
347
|
-
subagent: "light",
|
|
348
|
-
},
|
|
349
|
-
quality: {
|
|
350
|
-
planning: "heavy",
|
|
351
|
-
research: "standard",
|
|
352
|
-
execution: "standard",
|
|
353
|
-
execution_simple: "light",
|
|
354
|
-
completion: "light",
|
|
355
|
-
subagent: "standard",
|
|
356
|
-
},
|
|
357
|
-
// burn-max intentionally omits a tier map: it never writes model defaults
|
|
358
|
-
// (it preserves the user's explicit model selection), so resolveProfileDefaults
|
|
359
|
-
// skips model resolution for this profile.
|
|
360
|
-
"burn-max": {},
|
|
361
|
-
};
|
|
362
326
|
/**
|
|
363
327
|
* Resolve profile defaults for a given token profile tier.
|
|
364
328
|
* Returns a partial GSDPreferences that is used as the base layer --
|
|
365
329
|
* explicit user preferences always override these defaults.
|
|
366
|
-
*
|
|
367
|
-
* Model IDs are resolved from capability tiers, not hardcoded to any
|
|
368
|
-
* provider. When available models are known (runtime), the resolver picks
|
|
369
|
-
* the best match across all configured providers. When not known (e.g.,
|
|
370
|
-
* early startup), falls back to canonical Anthropic model IDs.
|
|
371
|
-
*
|
|
372
|
-
* @param profile The token profile to resolve
|
|
373
|
-
* @param availableModelIds Optional list of available model IDs for cross-provider resolution.
|
|
374
|
-
* Undefined means the registry is unavailable.
|
|
375
|
-
* @param routingConfig Optional routing config for tier model pins.
|
|
376
330
|
*/
|
|
377
|
-
export function resolveProfileDefaults(profile
|
|
378
|
-
// burn-max never writes model defaults — preserve user-selected models.
|
|
379
|
-
// For the other three profiles, derive concrete model IDs from the tier map
|
|
380
|
-
// against the available-model list when the registry is provided. If callers
|
|
381
|
-
// omit the registry entirely, use canonical fallbacks explicitly.
|
|
382
|
-
const tierMap = PROFILE_TIER_MAP[profile];
|
|
383
|
-
const resolveTierModel = (tier) => Array.isArray(availableModelIds)
|
|
384
|
-
? resolveModelForTier(tier, availableModelIds, routingConfig)
|
|
385
|
-
: canonicalModelForTier(tier);
|
|
386
|
-
const models = profile === "burn-max"
|
|
387
|
-
? undefined
|
|
388
|
-
: {
|
|
389
|
-
planning: resolveTierModel(tierMap.planning),
|
|
390
|
-
research: resolveTierModel(tierMap.research),
|
|
391
|
-
execution: resolveTierModel(tierMap.execution),
|
|
392
|
-
execution_simple: resolveTierModel(tierMap.execution_simple),
|
|
393
|
-
completion: resolveTierModel(tierMap.completion),
|
|
394
|
-
subagent: resolveTierModel(tierMap.subagent),
|
|
395
|
-
};
|
|
331
|
+
export function resolveProfileDefaults(profile) {
|
|
396
332
|
switch (profile) {
|
|
397
333
|
case "budget":
|
|
398
334
|
return {
|
|
399
|
-
models
|
|
335
|
+
models: {
|
|
336
|
+
planning: "claude-sonnet-4-5-20250514",
|
|
337
|
+
execution: "claude-sonnet-4-5-20250514",
|
|
338
|
+
execution_simple: "claude-haiku-4-5-20250414",
|
|
339
|
+
completion: "claude-haiku-4-5-20250414",
|
|
340
|
+
subagent: "claude-haiku-4-5-20250414",
|
|
341
|
+
},
|
|
400
342
|
phases: {
|
|
401
343
|
skip_research: true,
|
|
402
344
|
skip_reassess: true,
|
|
@@ -406,7 +348,9 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
|
|
|
406
348
|
};
|
|
407
349
|
case "balanced":
|
|
408
350
|
return {
|
|
409
|
-
models
|
|
351
|
+
models: {
|
|
352
|
+
subagent: "claude-sonnet-4-5-20250514",
|
|
353
|
+
},
|
|
410
354
|
phases: {
|
|
411
355
|
skip_research: true,
|
|
412
356
|
skip_reassess: true,
|
|
@@ -415,7 +359,7 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
|
|
|
415
359
|
};
|
|
416
360
|
case "quality":
|
|
417
361
|
return {
|
|
418
|
-
models,
|
|
362
|
+
models: {},
|
|
419
363
|
phases: {
|
|
420
364
|
skip_research: true,
|
|
421
365
|
skip_slice_research: true,
|
|
@@ -440,13 +384,6 @@ export function resolveProfileDefaults(profile, availableModelIds, routingConfig
|
|
|
440
384
|
};
|
|
441
385
|
}
|
|
442
386
|
}
|
|
443
|
-
/**
|
|
444
|
-
* Get the tier intentions for a profile without resolving to model IDs.
|
|
445
|
-
* Useful for display, debugging, and testing.
|
|
446
|
-
*/
|
|
447
|
-
export function getProfileTierMap(profile) {
|
|
448
|
-
return { ...PROFILE_TIER_MAP[profile] };
|
|
449
|
-
}
|
|
450
387
|
/**
|
|
451
388
|
* Resolve the effective token profile from preferences.
|
|
452
389
|
* Returns "balanced" when no profile is set (D046).
|
|
@@ -491,16 +428,3 @@ export function resolveSearchProviderFromPreferences() {
|
|
|
491
428
|
const prefs = loadEffectiveGSDPreferences();
|
|
492
429
|
return prefs?.preferences.search_provider;
|
|
493
430
|
}
|
|
494
|
-
/**
|
|
495
|
-
* Resolve provider IDs excluded from model selection/routing.
|
|
496
|
-
* Returns a normalized, de-duplicated list.
|
|
497
|
-
*/
|
|
498
|
-
export function resolveDisabledModelProvidersFromPreferences() {
|
|
499
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
500
|
-
const raw = prefs?.preferences.disabled_model_providers;
|
|
501
|
-
if (!Array.isArray(raw))
|
|
502
|
-
return [];
|
|
503
|
-
return Array.from(new Set(raw
|
|
504
|
-
.map((provider) => provider.trim())
|
|
505
|
-
.filter((provider) => provider.length > 0)));
|
|
506
|
-
}
|
|
@@ -61,7 +61,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
61
61
|
"post_unit_hooks",
|
|
62
62
|
"pre_dispatch_hooks",
|
|
63
63
|
"dynamic_routing",
|
|
64
|
-
"disabled_model_providers",
|
|
65
64
|
"uok",
|
|
66
65
|
"token_profile",
|
|
67
66
|
"phases",
|
|
@@ -80,7 +79,6 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
80
79
|
"service_tier",
|
|
81
80
|
"forensics_dedup",
|
|
82
81
|
"show_token_cost",
|
|
83
|
-
"min_request_interval_ms",
|
|
84
82
|
"stale_commit_threshold_minutes",
|
|
85
83
|
"context_management",
|
|
86
84
|
"experimental",
|
|
@@ -620,26 +620,6 @@ export function validatePreferences(preferences) {
|
|
|
620
620
|
errors.push("dynamic_routing must be an object");
|
|
621
621
|
}
|
|
622
622
|
}
|
|
623
|
-
// ─── Disabled Model Providers ───────────────────────────────────────
|
|
624
|
-
if (preferences.disabled_model_providers !== undefined) {
|
|
625
|
-
if (Array.isArray(preferences.disabled_model_providers)) {
|
|
626
|
-
const allStrings = preferences.disabled_model_providers.every((provider) => typeof provider === "string");
|
|
627
|
-
if (!allStrings) {
|
|
628
|
-
errors.push("disabled_model_providers must be an array of strings");
|
|
629
|
-
}
|
|
630
|
-
else {
|
|
631
|
-
const normalized = preferences.disabled_model_providers
|
|
632
|
-
.map((provider) => provider.trim())
|
|
633
|
-
.filter((provider) => provider.length > 0);
|
|
634
|
-
if (normalized.length > 0) {
|
|
635
|
-
validated.disabled_model_providers = Array.from(new Set(normalized));
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
else {
|
|
640
|
-
errors.push("disabled_model_providers must be an array of strings");
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
623
|
// ─── Context Management ──────────────────────────────────────────────
|
|
644
624
|
if (preferences.context_management !== undefined) {
|
|
645
625
|
if (typeof preferences.context_management === "object" && preferences.context_management !== null) {
|
|
@@ -1173,18 +1153,6 @@ export function validatePreferences(preferences) {
|
|
|
1173
1153
|
errors.push("show_token_cost must be a boolean");
|
|
1174
1154
|
}
|
|
1175
1155
|
}
|
|
1176
|
-
// ─── Auto-Mode Request Interval ───────────────────────────────────
|
|
1177
|
-
if (preferences.min_request_interval_ms !== undefined) {
|
|
1178
|
-
if (typeof preferences.min_request_interval_ms === "number" &&
|
|
1179
|
-
Number.isFinite(preferences.min_request_interval_ms) &&
|
|
1180
|
-
preferences.min_request_interval_ms >= 0 &&
|
|
1181
|
-
preferences.min_request_interval_ms <= 2_147_483_647) {
|
|
1182
|
-
validated.min_request_interval_ms = Math.floor(preferences.min_request_interval_ms);
|
|
1183
|
-
}
|
|
1184
|
-
else {
|
|
1185
|
-
errors.push("min_request_interval_ms must be a non-negative number <= 2147483647");
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
1156
|
// ─── Experimental Features ────────────────────────────────────────
|
|
1189
1157
|
if (preferences.experimental !== undefined) {
|
|
1190
1158
|
if (typeof preferences.experimental === "object" && preferences.experimental !== null) {
|
|
@@ -35,7 +35,7 @@ export function resolveSkillStalenessDays(basePath) {
|
|
|
35
35
|
return prefs?.preferences.skill_staleness_days ?? 60;
|
|
36
36
|
}
|
|
37
37
|
// ─── Re-exports: models ─────────────────────────────────────────────────────
|
|
38
|
-
export { resolveModelForUnit, resolveModelWithFallbacksForUnit, getNextFallbackModel, isTransientNetworkError, validateModelId, updatePreferencesModels, resolveDynamicRoutingConfig, resolveAutoSupervisorConfig, resolveProfileDefaults,
|
|
38
|
+
export { resolveModelForUnit, resolveModelWithFallbacksForUnit, getNextFallbackModel, isTransientNetworkError, validateModelId, updatePreferencesModels, resolveDynamicRoutingConfig, resolveAutoSupervisorConfig, resolveProfileDefaults, resolveEffectiveProfile, resolveInlineLevel, resolveContextSelection, resolveSearchProviderFromPreferences, } from "./preferences-models.js";
|
|
39
39
|
// ─── Path Constants & Getters ───────────────────────────────────────────────
|
|
40
40
|
function gsdHome() {
|
|
41
41
|
return process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
@@ -76,7 +76,7 @@ export function loadProjectGSDPreferences(basePath) {
|
|
|
76
76
|
return loadPreferencesFile(projectPreferencesPath(basePath), "project")
|
|
77
77
|
?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(basePath), "project");
|
|
78
78
|
}
|
|
79
|
-
export function loadEffectiveGSDPreferences(basePath
|
|
79
|
+
export function loadEffectiveGSDPreferences(basePath) {
|
|
80
80
|
const globalPreferences = loadGlobalGSDPreferences();
|
|
81
81
|
const projectPreferences = loadProjectGSDPreferences(basePath);
|
|
82
82
|
if (!globalPreferences && !projectPreferences)
|
|
@@ -105,7 +105,7 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
|
|
|
105
105
|
// Explicit user preferences always override profile defaults.
|
|
106
106
|
const profile = result.preferences.token_profile;
|
|
107
107
|
if (profile) {
|
|
108
|
-
const profileDefaults = _resolveProfileDefaults(profile
|
|
108
|
+
const profileDefaults = _resolveProfileDefaults(profile);
|
|
109
109
|
result = {
|
|
110
110
|
...result,
|
|
111
111
|
preferences: mergePreferences(profileDefaults, result.preferences),
|
|
@@ -293,7 +293,6 @@ function mergePreferences(base, override) {
|
|
|
293
293
|
dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
|
|
294
294
|
? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
|
|
295
295
|
: undefined,
|
|
296
|
-
disabled_model_providers: mergeStringLists(base.disabled_model_providers, override.disabled_model_providers),
|
|
297
296
|
uok: (base.uok || override.uok)
|
|
298
297
|
? {
|
|
299
298
|
enabled: override.uok?.enabled ?? base.uok?.enabled,
|
|
@@ -347,7 +346,6 @@ function mergePreferences(base, override) {
|
|
|
347
346
|
service_tier: override.service_tier ?? base.service_tier,
|
|
348
347
|
forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
|
|
349
348
|
show_token_cost: override.show_token_cost ?? base.show_token_cost,
|
|
350
|
-
min_request_interval_ms: override.min_request_interval_ms ?? base.min_request_interval_ms,
|
|
351
349
|
codebase: (base.codebase || override.codebase)
|
|
352
350
|
? {
|
|
353
351
|
...(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
|
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
19
20
|
import { GSDError, GSD_PARSE_ERROR } from "./errors.js";
|
|
@@ -68,8 +69,8 @@ const templatesDir = join(__extensionDir, "templates");
|
|
|
68
69
|
export function getTemplatesDir() {
|
|
69
70
|
return templatesDir;
|
|
70
71
|
}
|
|
71
|
-
// Cache all templates
|
|
72
|
-
// template versions that were on disk
|
|
72
|
+
// Cache all templates eagerly at module load — a running session uses the
|
|
73
|
+
// template versions that were on disk at startup, immune to later overwrites.
|
|
73
74
|
const templateCache = new Map();
|
|
74
75
|
/**
|
|
75
76
|
* Eagerly read all .md files from prompts/ and templates/ into cache.
|
|
@@ -111,20 +112,8 @@ function warmCache() {
|
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (warmCacheScheduled)
|
|
117
|
-
return;
|
|
118
|
-
warmCacheScheduled = true;
|
|
119
|
-
const run = () => {
|
|
120
|
-
warmCache();
|
|
121
|
-
};
|
|
122
|
-
const timer = setTimeout(run, 1000);
|
|
123
|
-
timer.unref?.();
|
|
124
|
-
}
|
|
125
|
-
// Snapshot the full prompt/template tree after import so extension startup only
|
|
126
|
-
// pays for prompts that are actually needed immediately.
|
|
127
|
-
scheduleWarmCache();
|
|
115
|
+
// Snapshot all templates at module load time
|
|
116
|
+
warmCache();
|
|
128
117
|
/**
|
|
129
118
|
* Load a prompt template and substitute variables.
|
|
130
119
|
*
|
|
@@ -32,7 +32,6 @@ let sliceState = null;
|
|
|
32
32
|
// on next session start. (Issue #4980 HIGH-8)
|
|
33
33
|
const SLICE_ORCHESTRATOR_STATE_FILE = "slice-orchestrator.json";
|
|
34
34
|
const TMP_SUFFIX = ".tmp";
|
|
35
|
-
export const SLICE_WORKER_AUTO_ARGS = ["headless", "--json", "auto"];
|
|
36
35
|
function sliceStateFilePath(basePath) {
|
|
37
36
|
return join(gsdRoot(basePath), SLICE_ORCHESTRATOR_STATE_FILE);
|
|
38
37
|
}
|
|
@@ -273,7 +272,7 @@ export function getSliceOrchestratorState() {
|
|
|
273
272
|
/**
|
|
274
273
|
* Start parallel execution for eligible slices within a milestone.
|
|
275
274
|
*
|
|
276
|
-
* For each eligible slice: create a worktree, spawn `gsd
|
|
275
|
+
* For each eligible slice: create a worktree, spawn `gsd --mode json --print "/gsd auto"`
|
|
277
276
|
* with env GSD_SLICE_LOCK=<SID> + GSD_MILESTONE_LOCK=<MID> + GSD_PARALLEL_WORKER=1.
|
|
278
277
|
*/
|
|
279
278
|
export async function startSliceParallel(basePath, milestoneId, eligibleSlices, opts = {}) {
|
|
@@ -483,13 +482,8 @@ function resolveGsdBin() {
|
|
|
483
482
|
}
|
|
484
483
|
/**
|
|
485
484
|
* Spawn a worker process for a slice.
|
|
486
|
-
* The worker runs `gsd
|
|
485
|
+
* The worker runs `gsd --mode json --print "/gsd auto"` in the slice's worktree
|
|
487
486
|
* with GSD_SLICE_LOCK, GSD_MILESTONE_LOCK, and GSD_PARALLEL_WORKER set.
|
|
488
|
-
*
|
|
489
|
-
* Print-mode slash commands return after the command handler schedules
|
|
490
|
-
* auto-mode, so the worker process can exit before doing any LLM work. The
|
|
491
|
-
* headless auto entrypoint keeps the process alive until auto-mode reaches a
|
|
492
|
-
* terminal notification, matching milestone-level parallel workers.
|
|
493
487
|
*/
|
|
494
488
|
function spawnSliceWorker(basePath, milestoneId, sliceId) {
|
|
495
489
|
if (!sliceState)
|
|
@@ -504,7 +498,7 @@ function spawnSliceWorker(basePath, milestoneId, sliceId) {
|
|
|
504
498
|
return false;
|
|
505
499
|
let child;
|
|
506
500
|
try {
|
|
507
|
-
child = spawn(process.execPath, [binPath,
|
|
501
|
+
child = spawn(process.execPath, [binPath, "--mode", "json", "--print", "/gsd auto"], {
|
|
508
502
|
cwd: worker.worktreePath,
|
|
509
503
|
env: {
|
|
510
504
|
...process.env,
|
|
@@ -60,48 +60,6 @@ export function isGhostMilestone(basePath, mid) {
|
|
|
60
60
|
const summary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
61
61
|
return !context && !draft && !roadmap && !summary;
|
|
62
62
|
}
|
|
63
|
-
/**
|
|
64
|
-
* A "reusable ghost" milestone is an orphaned filesystem stub that is safe
|
|
65
|
-
* to reclaim as the next milestone ID.
|
|
66
|
-
*
|
|
67
|
-
* Stricter than `isGhostMilestone`: returns true ONLY when ALL of the
|
|
68
|
-
* following hold:
|
|
69
|
-
* 1. No DB row exists for `mid` (any status, including "queued") — a DB row
|
|
70
|
-
* means the milestone was intentionally registered by
|
|
71
|
-
* `gsd_milestone_generate_id` and may have an in-flight discuss flow.
|
|
72
|
-
* Reusing it would collide with that flow. (#4996 race window)
|
|
73
|
-
* 2. No worktree directory exists at `gsdRoot/worktrees/{mid}` — a worktree
|
|
74
|
-
* means the milestone is legitimately in-flight.
|
|
75
|
-
* 3. No content files exist (CONTEXT, CONTEXT-DRAFT, ROADMAP, SUMMARY) —
|
|
76
|
-
* any content means the discuss flow already ran.
|
|
77
|
-
*
|
|
78
|
-
* The looser `isGhostMilestone` also classifies queued-row-without-content as
|
|
79
|
-
* a ghost to help state queries filter phantoms. `isReusableGhostMilestone`
|
|
80
|
-
* intentionally does NOT reclaim those — a queued row is sufficient proof of
|
|
81
|
-
* a live in-flight ID reservation.
|
|
82
|
-
*
|
|
83
|
-
* Used by `nextMilestoneIdReserved` and both MCP ID-generator tools to fill
|
|
84
|
-
* gaps left by phantom directories before resorting to max+1.
|
|
85
|
-
*/
|
|
86
|
-
export function isReusableGhostMilestone(basePath, mid) {
|
|
87
|
-
// Condition 1: no DB row (any status).
|
|
88
|
-
if (!isDbAvailable())
|
|
89
|
-
return false;
|
|
90
|
-
const dbRow = getMilestone(mid);
|
|
91
|
-
if (dbRow != null)
|
|
92
|
-
return false;
|
|
93
|
-
// Condition 2: no worktree.
|
|
94
|
-
const root = gsdRoot(basePath);
|
|
95
|
-
const wtPath = join(root, 'worktrees', mid);
|
|
96
|
-
if (existsSync(wtPath))
|
|
97
|
-
return false;
|
|
98
|
-
// Condition 3: no content files.
|
|
99
|
-
const context = resolveMilestoneFile(basePath, mid, "CONTEXT");
|
|
100
|
-
const draft = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
|
|
101
|
-
const roadmap = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
102
|
-
const summary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
103
|
-
return !context && !draft && !roadmap && !summary;
|
|
104
|
-
}
|
|
105
63
|
// ─── Query Functions ───────────────────────────────────────────────────────
|
|
106
64
|
/**
|
|
107
65
|
* Check if all tasks in a slice plan are done.
|