gsd-pi 2.78.0 → 2.78.1-dev.82bcf6b71
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 +60 -23
- package/dist/bundled-resource-path.d.ts +7 -0
- package/dist/bundled-resource-path.js +34 -2
- package/dist/claude-cli-check.js +104 -33
- package/dist/cli-policy.d.ts +13 -0
- package/dist/cli-policy.js +17 -0
- package/dist/cli.js +95 -55
- package/dist/headless-query.d.ts +22 -0
- package/dist/headless-query.js +43 -8
- package/dist/headless.d.ts +10 -0
- package/dist/headless.js +16 -1
- package/dist/loader.js +9 -13
- package/dist/onboarding.d.ts +10 -0
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +5 -2
- package/dist/resource-loader.d.ts +5 -2
- package/dist/resource-loader.js +30 -13
- package/dist/resources/.managed-resources-content-hash +1 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
- package/dist/resources/extensions/google-search/index.js +2 -6
- package/dist/resources/extensions/gsd/auto/loop.js +23 -0
- package/dist/resources/extensions/gsd/auto/phases.js +5 -13
- package/dist/resources/extensions/gsd/auto/run-unit.js +26 -12
- package/dist/resources/extensions/gsd/auto/session.js +5 -6
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +55 -21
- package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +69 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
- package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
- 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 +75 -13
- package/dist/resources/extensions/gsd/auto.js +39 -14
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +112 -31
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +45 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
- package/dist/resources/extensions/gsd/commands/catalog.js +76 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +8 -0
- package/dist/resources/extensions/gsd/commands-config.js +3 -2
- package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +309 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +10 -8
- package/dist/resources/extensions/gsd/git-service.js +12 -5
- package/dist/resources/extensions/gsd/gsd-db.js +11 -2
- package/dist/resources/extensions/gsd/guided-flow.js +25 -24
- package/dist/resources/extensions/gsd/home-dir.js +16 -0
- package/dist/resources/extensions/gsd/key-manager.js +2 -1
- package/dist/resources/extensions/gsd/memory-store.js +66 -31
- package/dist/resources/extensions/gsd/migrate/command.js +3 -2
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
- package/dist/resources/extensions/gsd/model-router.js +114 -9
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
- package/dist/resources/extensions/gsd/preferences-models.js +91 -15
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
- package/dist/resources/extensions/gsd/preferences.js +5 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +2 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
- package/dist/resources/extensions/gsd/state.js +42 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
- package/dist/resources/extensions/gsd/worktree-command.js +26 -46
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +28 -13
- package/dist/resources/extensions/gsd/worktree-root.js +124 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
- package/dist/resources/extensions/gsd/worktree.js +4 -115
- package/dist/resources/extensions/mcp-client/index.js +6 -9
- package/dist/resources/extensions/ollama/index.js +15 -2
- package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
- package/dist/resources/extensions/ollama/ollama-client.js +40 -4
- package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
- package/dist/resources/extensions/subagent/index.js +324 -178
- package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
- 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 +32 -12
- package/dist/resources/skills/lint/SKILL.md +4 -0
- package/dist/resources/skills/review/SKILL.md +4 -0
- package/dist/resources/skills/test/SKILL.md +3 -0
- package/dist/rtk-shared.d.ts +3 -0
- package/dist/rtk-shared.js +17 -0
- package/dist/rtk.d.ts +2 -5
- package/dist/rtk.js +3 -20
- package/dist/runtime-checks.d.ts +27 -0
- package/dist/runtime-checks.js +38 -0
- 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 +19 -19
- 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 +44 -4
- 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 +4 -2
- 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 +19 -19
- 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/2556.0527fea66e123b7f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.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 +2 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +27 -1
- package/dist/worktree-cli.d.ts +1 -0
- package/dist/worktree-cli.js +9 -3
- package/dist/worktree-status-banner.d.ts +1 -0
- package/dist/worktree-status-banner.js +132 -0
- package/package.json +1 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
- package/packages/mcp-server/dist/alias-telemetry.js +30 -0
- package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +74 -46
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
- package/packages/mcp-server/src/alias-telemetry.ts +30 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
- package/packages/mcp-server/src/workflow-tools.ts +93 -58
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +13 -0
- 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 +24 -3
- 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 +26 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
- package/packages/pi-ai/src/types.ts +13 -0
- package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
- 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 +6 -0
- 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 +4 -0
- 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 +19 -2
- 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 +10 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
- 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 +14 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
- package/packages/pi-coding-agent/src/core/messages.ts +4 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
- package/src/resources/extensions/google-search/index.ts +2 -9
- package/src/resources/extensions/gsd/auto/loop.ts +24 -2
- package/src/resources/extensions/gsd/auto/phases.ts +6 -14
- package/src/resources/extensions/gsd/auto/run-unit.ts +26 -12
- package/src/resources/extensions/gsd/auto/session.ts +5 -6
- package/src/resources/extensions/gsd/auto/types.ts +1 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +60 -24
- package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +66 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +97 -12
- package/src/resources/extensions/gsd/auto.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +121 -31
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +82 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands-config.ts +3 -2
- package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
- package/src/resources/extensions/gsd/doctor-types.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +12 -7
- package/src/resources/extensions/gsd/git-service.ts +13 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -2
- package/src/resources/extensions/gsd/guided-flow.ts +27 -26
- package/src/resources/extensions/gsd/home-dir.ts +19 -0
- package/src/resources/extensions/gsd/journal.ts +4 -1
- package/src/resources/extensions/gsd/key-manager.ts +2 -1
- package/src/resources/extensions/gsd/memory-store.ts +81 -28
- package/src/resources/extensions/gsd/migrate/command.ts +3 -2
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
- package/src/resources/extensions/gsd/model-router.ts +172 -9
- package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
- package/src/resources/extensions/gsd/preferences-models.ts +101 -15
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +2 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
- package/src/resources/extensions/gsd/state.ts +42 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +179 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
- 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 +138 -211
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +50 -27
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +25 -65
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
- package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +235 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
- package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
- package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
- package/src/resources/extensions/gsd/worktree-command.ts +31 -44
- package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
- package/src/resources/extensions/gsd/worktree-resolver.ts +28 -14
- package/src/resources/extensions/gsd/worktree-root.ts +144 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
- package/src/resources/extensions/gsd/worktree.ts +8 -119
- package/src/resources/extensions/mcp-client/index.ts +6 -10
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
- package/src/resources/extensions/ollama/index.ts +16 -2
- package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
- package/src/resources/extensions/ollama/ollama-client.ts +41 -4
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
- package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
- package/src/resources/extensions/subagent/index.ts +165 -7
- package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
- 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/templates/templates.test.ts +58 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/src/resources/skills/lint/SKILL.md +4 -0
- package/src/resources/skills/review/SKILL.md +4 -0
- package/src/resources/skills/test/SKILL.md +3 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- 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 +0 -608
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → hcvW7f3yv1JHzlWe7tIc6}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → hcvW7f3yv1JHzlWe7tIc6}/_ssgManifest.js +0 -0
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from "./interrupted-session.js";
|
|
26
26
|
import { listUnitRuntimeRecords, clearUnitRuntimeRecord } from "./unit-runtime.js";
|
|
27
27
|
import { resolveExpectedArtifactPath } from "./auto.js";
|
|
28
|
+
import { getHomeDir } from "./home-dir.js";
|
|
28
29
|
import {
|
|
29
30
|
gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath,
|
|
30
31
|
resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
|
|
@@ -44,7 +45,9 @@ import { showProjectInit, offerMigration } from "./init-wizard.js";
|
|
|
44
45
|
import { validateDirectory } from "./validate-directory.js";
|
|
45
46
|
import { showConfirm } from "../shared/tui.js";
|
|
46
47
|
import { debugLog } from "./debug-logger.js";
|
|
47
|
-
import { findMilestoneIds,
|
|
48
|
+
import { findMilestoneIds, clearReservedMilestoneIds } from "./milestone-ids.js";
|
|
49
|
+
import { nextMilestoneIdReserved } from "./milestone-id-reservation.js";
|
|
50
|
+
export { nextMilestoneIdReserved } from "./milestone-id-reservation.js";
|
|
48
51
|
import { parkMilestone, discardMilestone } from "./milestone-actions.js";
|
|
49
52
|
import { selectAndApplyModel } from "./auto-model-selection.js";
|
|
50
53
|
import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
|
|
@@ -72,20 +75,6 @@ export {
|
|
|
72
75
|
} from "./guided-flow-queue.js";
|
|
73
76
|
import { logWarning } from "./workflow-logger.js";
|
|
74
77
|
|
|
75
|
-
// ─── ID Generation with Reservation ─────────────────────────────────────────
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Generate the next milestone ID, accounting for reserved IDs, and reserve it.
|
|
79
|
-
* Ensures any preview ID shown in the UI matches what `gsd_milestone_generate_id`
|
|
80
|
-
* will later return.
|
|
81
|
-
*/
|
|
82
|
-
function nextMilestoneIdReserved(existingIds: string[], uniqueEnabled: boolean): string {
|
|
83
|
-
const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
|
|
84
|
-
const id = nextMilestoneId(allIds, uniqueEnabled);
|
|
85
|
-
reserveMilestoneId(id);
|
|
86
|
-
return id;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
78
|
function needsPlanV2Gate(state: GSDState): boolean {
|
|
90
79
|
return state.phase === "executing"
|
|
91
80
|
|| state.phase === "summarizing"
|
|
@@ -619,7 +608,7 @@ async function dispatchWorkflow(
|
|
|
619
608
|
});
|
|
620
609
|
}
|
|
621
610
|
|
|
622
|
-
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(
|
|
611
|
+
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(getHomeDir(), ".gsd", "agent", "GSD-WORKFLOW.md");
|
|
623
612
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
624
613
|
|
|
625
614
|
pi.sendMessage(
|
|
@@ -832,14 +821,19 @@ export async function showHeadlessMilestoneCreation(
|
|
|
832
821
|
// Ensure .gsd/ is bootstrapped
|
|
833
822
|
bootstrapGsdProject(basePath);
|
|
834
823
|
|
|
824
|
+
const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
|
|
825
|
+
await ensureDbOpen(basePath);
|
|
826
|
+
|
|
835
827
|
// Generate next milestone ID
|
|
836
828
|
const existingIds = findMilestoneIds(basePath);
|
|
837
829
|
const prefs = loadEffectiveGSDPreferences();
|
|
838
|
-
const nextId = nextMilestoneIdReserved(existingIds, prefs?.preferences?.unique_milestone_ids ?? false);
|
|
830
|
+
const nextId = nextMilestoneIdReserved(existingIds, prefs?.preferences?.unique_milestone_ids ?? false, basePath);
|
|
839
831
|
|
|
840
|
-
//
|
|
841
|
-
|
|
842
|
-
|
|
832
|
+
// Fix #4996: Do NOT pre-create the milestone directory here.
|
|
833
|
+
// atomicWriteAsync (used by all artifact writers) calls mkdir lazily before
|
|
834
|
+
// each write, so every path through saveArtifactToDb / saveFile is already
|
|
835
|
+
// lazy-mkdir-safe. Pre-creating the dir before the discuss flow runs leaves
|
|
836
|
+
// an orphan stub if discuss is abandoned — that stub later skews nextMilestoneId.
|
|
843
837
|
|
|
844
838
|
// Build and dispatch the headless discuss prompt
|
|
845
839
|
const prompt = buildHeadlessDiscussPrompt(nextId, seedContext, basePath);
|
|
@@ -1054,9 +1048,11 @@ export async function showDiscuss(
|
|
|
1054
1048
|
fastPathInstruction: "",
|
|
1055
1049
|
}), "gsd-discuss", ctx, "discuss-milestone");
|
|
1056
1050
|
} else if (choice === "skip_milestone") {
|
|
1051
|
+
const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
|
|
1052
|
+
await ensureDbOpen(basePath);
|
|
1057
1053
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1058
1054
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1059
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1055
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1060
1056
|
pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: false, createdAt: Date.now() });
|
|
1061
1057
|
await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
|
|
1062
1058
|
}
|
|
@@ -1461,7 +1457,7 @@ async function handleMilestoneActions(
|
|
|
1461
1457
|
if (choice === "skip") {
|
|
1462
1458
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1463
1459
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1464
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1460
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1465
1461
|
pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode, createdAt: Date.now() });
|
|
1466
1462
|
await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
|
|
1467
1463
|
`New milestone ${nextId}.`,
|
|
@@ -1546,6 +1542,11 @@ export async function showSmartEntry(
|
|
|
1546
1542
|
ensureGitignore(basePath);
|
|
1547
1543
|
untrackRuntimeFiles(basePath);
|
|
1548
1544
|
|
|
1545
|
+
{
|
|
1546
|
+
const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
|
|
1547
|
+
await ensureDbOpen(basePath);
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1549
1550
|
// ── Self-heal stale runtime records from crashed auto-mode sessions ──
|
|
1550
1551
|
selfHealRuntimeRecords(basePath, ctx);
|
|
1551
1552
|
|
|
@@ -1648,7 +1649,7 @@ export async function showSmartEntry(
|
|
|
1648
1649
|
}
|
|
1649
1650
|
|
|
1650
1651
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1651
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1652
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1652
1653
|
const isFirst = milestoneIds.length === 0;
|
|
1653
1654
|
|
|
1654
1655
|
if (isFirst) {
|
|
@@ -1728,7 +1729,7 @@ export async function showSmartEntry(
|
|
|
1728
1729
|
if (choice === "new_milestone") {
|
|
1729
1730
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1730
1731
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1731
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1732
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1732
1733
|
|
|
1733
1734
|
pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode, createdAt: Date.now() });
|
|
1734
1735
|
await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
|
|
@@ -1796,7 +1797,7 @@ export async function showSmartEntry(
|
|
|
1796
1797
|
} else if (choice === "skip_milestone") {
|
|
1797
1798
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1798
1799
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1799
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1800
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1800
1801
|
pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode, createdAt: Date.now() });
|
|
1801
1802
|
await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
|
|
1802
1803
|
`New milestone ${nextId}.`,
|
|
@@ -1893,7 +1894,7 @@ export async function showSmartEntry(
|
|
|
1893
1894
|
} else if (choice === "skip_milestone") {
|
|
1894
1895
|
const milestoneIds = findMilestoneIds(basePath);
|
|
1895
1896
|
const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
1896
|
-
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
|
|
1897
|
+
const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
|
|
1897
1898
|
pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode, createdAt: Date.now() });
|
|
1898
1899
|
await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
|
|
1899
1900
|
`New milestone ${nextId}.`,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform home directory resolution.
|
|
3
|
+
*
|
|
4
|
+
* `process.env.HOME` is not set on Windows (CMD/PowerShell).
|
|
5
|
+
* Falls back to USERPROFILE, then os.homedir(), then throws.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/gsd-build/gsd-2/issues/5015
|
|
8
|
+
*/
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
|
|
11
|
+
export function getHomeDir(): string {
|
|
12
|
+
const home = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
13
|
+
if (!home) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
"Cannot resolve home directory. Set HOME or USERPROFILE environment variable.",
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return home;
|
|
19
|
+
}
|
|
@@ -60,7 +60,10 @@ export type JournalEventType =
|
|
|
60
60
|
| "canonical-root-redirect"
|
|
61
61
|
// #4765 — slice-cadence collapse
|
|
62
62
|
| "slice-merged"
|
|
63
|
-
| "milestone-resquash"
|
|
63
|
+
| "milestone-resquash"
|
|
64
|
+
// dispatch telemetry — measure agent/subagent invocation frequency and shape
|
|
65
|
+
| "subagent-invoked"
|
|
66
|
+
| "subagent-completed";
|
|
64
67
|
|
|
65
68
|
/** A single structured event in the journal. */
|
|
66
69
|
export interface JournalEntry {
|
|
@@ -17,6 +17,7 @@ import { existsSync, statSync, chmodSync } from "node:fs";
|
|
|
17
17
|
import { join, dirname } from "node:path";
|
|
18
18
|
import { mkdirSync } from "node:fs";
|
|
19
19
|
import { getErrorMessage } from "./error-utils.js";
|
|
20
|
+
import { getHomeDir } from "./home-dir.js";
|
|
20
21
|
|
|
21
22
|
// ─── Provider Registry ─────────────────────────────────────────────────────────
|
|
22
23
|
|
|
@@ -122,7 +123,7 @@ export function describeCredential(cred: AuthCredential): string {
|
|
|
122
123
|
* Get the auth.json path.
|
|
123
124
|
*/
|
|
124
125
|
export function getAuthPath(): string {
|
|
125
|
-
return join(
|
|
126
|
+
return join(getHomeDir(), ".gsd", "agent", "auth.json");
|
|
126
127
|
}
|
|
127
128
|
|
|
128
129
|
/**
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
isDbAvailable,
|
|
8
8
|
_getAdapter,
|
|
9
9
|
transaction,
|
|
10
|
+
isInTransaction,
|
|
10
11
|
insertMemoryRow,
|
|
11
12
|
rewriteMemoryId,
|
|
12
13
|
updateMemoryContentRow,
|
|
@@ -19,6 +20,7 @@ import {
|
|
|
19
20
|
deleteMemoryRelationsFor,
|
|
20
21
|
} from './gsd-db.js';
|
|
21
22
|
import { createMemoryRelation, isValidRelation } from './memory-relations.js';
|
|
23
|
+
import { logWarning } from './workflow-logger.js';
|
|
22
24
|
|
|
23
25
|
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
24
26
|
|
|
@@ -487,7 +489,13 @@ export function nextMemoryId(): string {
|
|
|
487
489
|
* Insert a new memory with a race-safe auto-assigned ID.
|
|
488
490
|
* Uses AUTOINCREMENT seq to derive the ID after insert, avoiding
|
|
489
491
|
* the read-then-write race in concurrent scenarios (e.g. worktrees).
|
|
490
|
-
* Returns the assigned ID, or null
|
|
492
|
+
* Returns the assigned ID, or null when the DB is unavailable.
|
|
493
|
+
*
|
|
494
|
+
* Throws on genuine SQL errors (corruption, missing tables, constraint
|
|
495
|
+
* violations) so callers can surface the underlying message instead of
|
|
496
|
+
* collapsing the failure to a generic "create_failed". See issue #4967 —
|
|
497
|
+
* the previous bare-catch swallowed "database disk image is malformed"
|
|
498
|
+
* errors, leaving the memory subsystem broken without any signal.
|
|
491
499
|
*/
|
|
492
500
|
export function createMemory(fields: {
|
|
493
501
|
category: string;
|
|
@@ -504,34 +512,70 @@ export function createMemory(fields: {
|
|
|
504
512
|
if (!adapter) return null;
|
|
505
513
|
|
|
506
514
|
try {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
const
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
} catch {
|
|
531
|
-
return null;
|
|
515
|
+
return transaction(() => doCreateMemory(adapter, fields));
|
|
516
|
+
} catch (err) {
|
|
517
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
518
|
+
|
|
519
|
+
// Targeted recovery: a malformed memory store can sometimes be rebuilt
|
|
520
|
+
// by VACUUM. Skip when inside a transaction — SQLite refuses VACUUM
|
|
521
|
+
// there and a secondary throw would mask the real fault.
|
|
522
|
+
if (message.toLowerCase().includes('malformed') && !isInTransaction()) {
|
|
523
|
+
try {
|
|
524
|
+
adapter.prepare('VACUUM').run();
|
|
525
|
+
const recoveryMessage = 'recovered malformed memory store via VACUUM';
|
|
526
|
+
process.stderr.write(`memory-store: ${recoveryMessage}\n`);
|
|
527
|
+
logWarning('memory-store', recoveryMessage);
|
|
528
|
+
return transaction(() => doCreateMemory(adapter, fields));
|
|
529
|
+
} catch (retryErr) {
|
|
530
|
+
const retryMsg = retryErr instanceof Error ? retryErr.message : String(retryErr);
|
|
531
|
+
logWarning('memory-store', `VACUUM recovery for memory store failed: ${retryMsg}`);
|
|
532
|
+
// Surface the *original* malformed error — it's the actionable signal.
|
|
533
|
+
throw err;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
throw err;
|
|
532
538
|
}
|
|
533
539
|
}
|
|
534
540
|
|
|
541
|
+
function doCreateMemory(
|
|
542
|
+
adapter: NonNullable<ReturnType<typeof _getAdapter>>,
|
|
543
|
+
fields: {
|
|
544
|
+
category: string;
|
|
545
|
+
content: string;
|
|
546
|
+
confidence?: number;
|
|
547
|
+
source_unit_type?: string;
|
|
548
|
+
source_unit_id?: string;
|
|
549
|
+
scope?: string;
|
|
550
|
+
tags?: string[];
|
|
551
|
+
structuredFields?: Record<string, unknown> | null;
|
|
552
|
+
},
|
|
553
|
+
): string {
|
|
554
|
+
const now = new Date().toISOString();
|
|
555
|
+
// Insert with a temporary placeholder ID — seq is auto-assigned
|
|
556
|
+
const placeholder = `_TMP_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
557
|
+
insertMemoryRow({
|
|
558
|
+
id: placeholder,
|
|
559
|
+
category: fields.category,
|
|
560
|
+
content: fields.content,
|
|
561
|
+
confidence: fields.confidence ?? 0.8,
|
|
562
|
+
sourceUnitType: fields.source_unit_type ?? null,
|
|
563
|
+
sourceUnitId: fields.source_unit_id ?? null,
|
|
564
|
+
createdAt: now,
|
|
565
|
+
updatedAt: now,
|
|
566
|
+
scope: fields.scope ?? 'project',
|
|
567
|
+
tags: fields.tags ?? [],
|
|
568
|
+
structuredFields: fields.structuredFields ?? null,
|
|
569
|
+
});
|
|
570
|
+
// Derive the real ID from the assigned seq (SELECT is still fine via adapter)
|
|
571
|
+
const row = adapter.prepare('SELECT seq FROM memories WHERE id = :id').get({ ':id': placeholder });
|
|
572
|
+
if (!row) return placeholder; // fallback — should not happen
|
|
573
|
+
const seq = row['seq'] as number;
|
|
574
|
+
const realId = `MEM${String(seq).padStart(3, '0')}`;
|
|
575
|
+
rewriteMemoryId(placeholder, realId);
|
|
576
|
+
return realId;
|
|
577
|
+
}
|
|
578
|
+
|
|
535
579
|
/**
|
|
536
580
|
* Update a memory's content and optionally its confidence.
|
|
537
581
|
*/
|
|
@@ -728,8 +772,17 @@ export function applyMemoryActions(
|
|
|
728
772
|
}
|
|
729
773
|
enforceMemoryCap();
|
|
730
774
|
});
|
|
731
|
-
} catch {
|
|
732
|
-
//
|
|
775
|
+
} catch (err) {
|
|
776
|
+
// Non-fatal — the transaction has rolled back. We log a warning so a
|
|
777
|
+
// degraded memory subsystem (e.g. malformed store, missing tables) is
|
|
778
|
+
// visible to forensics instead of silently dropping every CREATE — see
|
|
779
|
+
// issue #4967, where this swallow combined with createMemory's bare
|
|
780
|
+
// catch hid SQLite corruption from the auto-mode flow entirely.
|
|
781
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
782
|
+
logWarning(
|
|
783
|
+
'memory-store',
|
|
784
|
+
`applyMemoryActions failed (memory subsystem degraded): ${message}`,
|
|
785
|
+
);
|
|
733
786
|
}
|
|
734
787
|
}
|
|
735
788
|
|
|
@@ -15,6 +15,7 @@ import { resolve, join, dirname } from "node:path";
|
|
|
15
15
|
import { gsdRoot } from "../paths.js";
|
|
16
16
|
import { fileURLToPath } from "node:url";
|
|
17
17
|
import { showNextAction } from "../../shared/tui.js";
|
|
18
|
+
import { getHomeDir } from "../home-dir.js";
|
|
18
19
|
import {
|
|
19
20
|
validatePlanningDirectory,
|
|
20
21
|
parsePlanningDirectory,
|
|
@@ -85,9 +86,9 @@ export async function handleMigrate(
|
|
|
85
86
|
// Default to cwd when no args given; expand ~ to HOME
|
|
86
87
|
let rawPath = args.trim() || ".";
|
|
87
88
|
if (rawPath.startsWith("~/")) {
|
|
88
|
-
rawPath = join(
|
|
89
|
+
rawPath = join(getHomeDir(), rawPath.slice(2));
|
|
89
90
|
} else if (rawPath === "~") {
|
|
90
|
-
rawPath =
|
|
91
|
+
rawPath = getHomeDir();
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
let sourcePath = resolve(process.cwd(), rawPath);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { isDbAvailable, getAllMilestones } from "./gsd-db.js";
|
|
2
|
+
import {
|
|
3
|
+
getReservedMilestoneIds,
|
|
4
|
+
milestoneIdSort,
|
|
5
|
+
nextMilestoneId,
|
|
6
|
+
reserveMilestoneId,
|
|
7
|
+
} from "./milestone-ids.js";
|
|
8
|
+
import { isReusableGhostMilestone } from "./state.js";
|
|
9
|
+
|
|
10
|
+
function getDatabaseMilestoneIds(): string[] {
|
|
11
|
+
if (!isDbAvailable()) return [];
|
|
12
|
+
return getAllMilestones().map((milestone) => milestone.id);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate the next milestone ID, accounting for DB rows and in-process
|
|
17
|
+
* reservations, and reserve it.
|
|
18
|
+
*/
|
|
19
|
+
export function nextMilestoneIdReserved(
|
|
20
|
+
existingIds: string[],
|
|
21
|
+
uniqueEnabled: boolean,
|
|
22
|
+
basePath?: string,
|
|
23
|
+
): string {
|
|
24
|
+
const reservedIds = getReservedMilestoneIds();
|
|
25
|
+
const allIds = [
|
|
26
|
+
...new Set([
|
|
27
|
+
...existingIds,
|
|
28
|
+
...reservedIds,
|
|
29
|
+
...getDatabaseMilestoneIds(),
|
|
30
|
+
]),
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
if (basePath) {
|
|
34
|
+
const sorted = [...allIds].sort(milestoneIdSort);
|
|
35
|
+
for (const candidate of sorted) {
|
|
36
|
+
if (reservedIds.has(candidate)) continue;
|
|
37
|
+
if (isReusableGhostMilestone(basePath, candidate)) {
|
|
38
|
+
reserveMilestoneId(candidate);
|
|
39
|
+
return candidate;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const id = nextMilestoneId(allIds, uniqueEnabled);
|
|
45
|
+
reserveMilestoneId(id);
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
@@ -320,11 +320,8 @@ export function getEligibleModels(
|
|
|
320
320
|
// Exact match
|
|
321
321
|
if (availableModelIds.includes(explicitModel)) return [explicitModel];
|
|
322
322
|
// Provider-prefix-stripped match
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
const bareExplicit = explicitModel.includes("/") ? explicitModel.split("/").pop()! : explicitModel;
|
|
326
|
-
return bareAvail === bareExplicit;
|
|
327
|
-
});
|
|
323
|
+
const bareExplicit = bareModelId(explicitModel);
|
|
324
|
+
const match = availableModelIds.find(id => bareModelId(id) === bareExplicit);
|
|
328
325
|
if (match) return [match];
|
|
329
326
|
}
|
|
330
327
|
|
|
@@ -430,12 +427,38 @@ export function resolveModelForComplexity(
|
|
|
430
427
|
|
|
431
428
|
// Downgrade-only: if requested tier >= configured tier, no change
|
|
432
429
|
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
|
+
|
|
433
452
|
return {
|
|
434
|
-
modelId: configuredPrimary,
|
|
435
|
-
fallbacks:
|
|
453
|
+
modelId: crossProviderEquivalent ?? configuredPrimary,
|
|
454
|
+
fallbacks: crossProviderEquivalent
|
|
455
|
+
? [...phaseConfig.fallbacks.filter(f => f !== crossProviderEquivalent), configuredPrimary]
|
|
456
|
+
: phaseConfig.fallbacks,
|
|
436
457
|
tier: requestedTier,
|
|
437
458
|
wasDowngraded: false,
|
|
438
|
-
reason:
|
|
459
|
+
reason: crossProviderEquivalent
|
|
460
|
+
? `cross-provider ${configuredTier}-tier equivalent`
|
|
461
|
+
: `tier ${requestedTier} >= configured ${configuredTier}`,
|
|
439
462
|
selectionMethod: "tier-only",
|
|
440
463
|
};
|
|
441
464
|
}
|
|
@@ -519,8 +542,131 @@ export function defaultRoutingConfig(): DynamicRoutingConfig {
|
|
|
519
542
|
};
|
|
520
543
|
}
|
|
521
544
|
|
|
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
|
+
|
|
522
654
|
// ─── Internal ────────────────────────────────────────────────────────────────
|
|
523
655
|
|
|
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
|
+
|
|
524
670
|
function getModelTier(modelId: string): ComplexityTier {
|
|
525
671
|
// Strip provider prefix if present
|
|
526
672
|
const bareId = bareModelId(modelId);
|
|
@@ -563,8 +709,25 @@ function getModelCost(modelId: string): number {
|
|
|
563
709
|
return 999;
|
|
564
710
|
}
|
|
565
711
|
|
|
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
|
+
|
|
566
726
|
function bareModelId(modelId: string): string {
|
|
567
|
-
|
|
727
|
+
if (!modelId.includes("/")) return modelId;
|
|
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;
|
|
568
731
|
}
|
|
569
732
|
|
|
570
733
|
// ─── Provider-specific Tool Limits ─────────────────────────────────────────
|
|
@@ -11,6 +11,7 @@ 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";
|
|
14
15
|
|
|
15
16
|
// Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
|
|
16
17
|
// caller explicitly opts into the native helper.
|
|
@@ -846,6 +847,10 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
|
|
|
846
847
|
});
|
|
847
848
|
} catch (err: unknown) {
|
|
848
849
|
const stderr = (err as { stderr?: string })?.stderr ?? "";
|
|
850
|
+
const infraCode = isInfrastructureError(err) ?? isInfrastructureError(stderr);
|
|
851
|
+
if (infraCode) {
|
|
852
|
+
throw err;
|
|
853
|
+
}
|
|
849
854
|
// git exits 1 when pathspec exclusions reference paths already covered
|
|
850
855
|
// by .gitignore. The staging itself succeeds — only suppress that case.
|
|
851
856
|
if (stderr.includes("ignored by one of your .gitignore files")) {
|
|
@@ -860,7 +865,8 @@ export function nativeAddAllWithExclusions(basePath: string, exclusions: readonl
|
|
|
860
865
|
fallbackStageWithSymlinkedDotGsd(basePath);
|
|
861
866
|
return;
|
|
862
867
|
}
|
|
863
|
-
|
|
868
|
+
const stderrDetail = stderr.trim() ? `; stderr: ${stderr.trim()}` : "";
|
|
869
|
+
throw new GSDError(GSD_GIT_ERROR, `git add -A with exclusions failed in ${basePath}: ${getErrorMessage(err)}${stderrDetail}`);
|
|
864
870
|
}
|
|
865
871
|
}
|
|
866
872
|
|