gsd-pi 2.78.0 → 2.78.1-dev.9d08d820b
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 +59 -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/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 +3 -1
- 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-dispatch.js +18 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +63 -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 +60 -13
- package/dist/resources/extensions/gsd/auto.js +14 -5
- 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 +100 -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 +34 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
- package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
- 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/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/plan-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -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 +4 -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 -3
- 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/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 +11 -11
- 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 +11 -11
- 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/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/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 +3 -1
- 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-dispatch.ts +18 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +60 -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 +82 -12
- package/src/resources/extensions/gsd/auto.ts +14 -4
- 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 +108 -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 +39 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
- 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/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/plan-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -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 +178 -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/commands-extensions-version-compare.test.ts +58 -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/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/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/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-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 +4 -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 -3
- 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/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 → -Ukk6_YxRd4GY4iUOnRUE}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_ssgManifest.js +0 -0
|
@@ -1524,6 +1524,18 @@ async function configureAdvanced(ctx: ExtensionCommandContext, prefs: Record<str
|
|
|
1524
1524
|
const tokenCost = await promptBoolean(ctx, "Show token cost in footer", prefs.show_token_cost, false);
|
|
1525
1525
|
if (tokenCost !== undefined) prefs.show_token_cost = tokenCost;
|
|
1526
1526
|
|
|
1527
|
+
const minRequestInterval = await promptInteger(
|
|
1528
|
+
ctx,
|
|
1529
|
+
"Minimum interval between auto-mode LLM requests (ms, 0 to disable)",
|
|
1530
|
+
prefs.min_request_interval_ms,
|
|
1531
|
+
"0",
|
|
1532
|
+
);
|
|
1533
|
+
if (minRequestInterval === "clear") {
|
|
1534
|
+
delete prefs.min_request_interval_ms;
|
|
1535
|
+
} else if (minRequestInterval !== undefined) {
|
|
1536
|
+
prefs.min_request_interval_ms = minRequestInterval;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1527
1539
|
const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode, ["full", "small", "min", "off"], "full");
|
|
1528
1540
|
if (widget !== undefined) prefs.widget_mode = widget;
|
|
1529
1541
|
|
|
@@ -1715,8 +1727,10 @@ export function serializePreferencesToFrontmatter(prefs: Record<string, unknown>
|
|
|
1715
1727
|
"budget_ceiling", "budget_enforcement", "context_pause_threshold",
|
|
1716
1728
|
"notifications", "cmux", "remote_questions", "git",
|
|
1717
1729
|
"stale_commit_threshold_minutes",
|
|
1730
|
+
"min_request_interval_ms",
|
|
1718
1731
|
"post_unit_hooks", "pre_dispatch_hooks",
|
|
1719
|
-
"dynamic_routing", "
|
|
1732
|
+
"dynamic_routing", "disabled_model_providers", "uok", "token_profile",
|
|
1733
|
+
"service_tier", "flat_rate_providers",
|
|
1720
1734
|
"phases", "parallel", "slice_parallel",
|
|
1721
1735
|
"reactive_execution", "gate_evaluation",
|
|
1722
1736
|
"auto_visualize", "auto_report",
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
type UnitMetrics,
|
|
22
22
|
} from "./metrics.js";
|
|
23
23
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
24
|
-
import { getActiveWorktreeName } from "./worktree-
|
|
24
|
+
import { getActiveWorktreeName } from "./worktree-session-state.js";
|
|
25
25
|
import { getWorkerBatches, hasActiveWorkers, type WorkerEntry } from "../subagent/worker-registry.js";
|
|
26
26
|
import { formatDuration, padRight, joinColumns, centerLine, fitColumns, STATUS_GLYPH, STATUS_COLOR } from "../shared/mod.js";
|
|
27
27
|
import { estimateTimeRemaining } from "./auto-dashboard.js";
|
|
@@ -126,6 +126,8 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
126
126
|
- `idle_timeout_minutes`: minutes of inactivity before the supervisor intervenes (default: 10).
|
|
127
127
|
- `hard_timeout_minutes`: minutes before the supervisor forces termination (default: 30).
|
|
128
128
|
|
|
129
|
+
- `min_request_interval_ms`: number — minimum integer milliseconds between auto-mode LLM request dispatches. Non-integer values are rounded down (e.g., `1000.9 → 1000`). Use this to proactively slow auto-mode on rate-limited providers and reduce 429 errors. Set to `0` to disable. Default: `0` (disabled).
|
|
130
|
+
|
|
129
131
|
- `git`: configures GSD's git behavior. All fields are optional — omit any to use defaults. Keys:
|
|
130
132
|
- `auto_push`: boolean — automatically push commits to the remote after committing. Default: `false`.
|
|
131
133
|
- `push_branches`: boolean — push the milestone branch to the remote after commits. Default: `false`.
|
|
@@ -163,6 +165,12 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
163
165
|
- `skip_reassess`: boolean — force-disable roadmap reassessment even if `reassess_after_slice` is enabled. Default: `false`.
|
|
164
166
|
- `skip_slice_research`: boolean — skip per-slice research. Default: `false`.
|
|
165
167
|
|
|
168
|
+
- `reactive_execution`: controls automatic parallel task dispatch inside a slice. Reactive execution is enabled by default when omitted; set `enabled: false` to opt out. With default-on behavior, GSD only attempts a reactive batch when at least three ready tasks are available and the task-plan IO graph is non-ambiguous. If you set `enabled: true` explicitly, GSD uses the earlier opt-in threshold of two ready tasks. Keys:
|
|
169
|
+
- `enabled`: boolean — set `false` to force sequential task execution. Default: `true`.
|
|
170
|
+
- `max_parallel`: number — maximum tasks to dispatch in one batch, range `1`-`8`. Default: `2`.
|
|
171
|
+
- `isolation_mode`: `"same-tree"` — currently the only supported value.
|
|
172
|
+
- `subagent_model`: string — optional model override for reactive task subagents. Falls back to the `models.subagent` routing when omitted.
|
|
173
|
+
|
|
166
174
|
- `remote_questions`: route interactive questions to Slack/Discord for headless auto-mode. Keys:
|
|
167
175
|
- `channel`: `"slack"` or `"discord"` — channel type.
|
|
168
176
|
- `channel_id`: string or number — channel ID.
|
|
@@ -193,6 +201,8 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
193
201
|
- `hooks`: boolean — enable routing hooks. Default: `true`.
|
|
194
202
|
- `capability_routing`: boolean — enable capability-profile scoring for model selection within a tier. Requires `enabled: true`. Default: `false`.
|
|
195
203
|
|
|
204
|
+
- `disabled_model_providers`: string[] — provider IDs to hide from model selection and routing (for example `["google-gemini-cli"]`). This only affects model availability (`/model`, auto-model selection, routing); it does not disable tool auth flows like `google_search`.
|
|
205
|
+
|
|
196
206
|
- `uok`: Unified Orchestration Kernel controls. Keys:
|
|
197
207
|
- `enabled`: boolean — enable kernel wrappers and contract observers. Default: `true`.
|
|
198
208
|
- `legacy_fallback.enabled`: boolean — emergency release fallback that forces legacy orchestration behavior even when `uok.enabled` is `true`. Default: `false`.
|
|
@@ -17,6 +17,7 @@ import { AuthStorage } from "@gsd/pi-coding-agent";
|
|
|
17
17
|
import { getEnvApiKey } from "@gsd/pi-ai";
|
|
18
18
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
19
19
|
import { getAuthPath, PROVIDER_REGISTRY, type ProviderCategory } from "./key-manager.js";
|
|
20
|
+
import { getHomeDir } from "./home-dir.js";
|
|
20
21
|
|
|
21
22
|
// ── Types ──────────────────────────────────────────────────────────────────────
|
|
22
23
|
|
|
@@ -194,7 +195,7 @@ function isCliBinaryInPath(providerId: string): boolean {
|
|
|
194
195
|
}
|
|
195
196
|
|
|
196
197
|
function modelsJsonPaths(): string[] {
|
|
197
|
-
const home =
|
|
198
|
+
const home = getHomeDir();
|
|
198
199
|
return [
|
|
199
200
|
join(home, ".gsd", "agent", "models.json"),
|
|
200
201
|
// Keep parity with custom-provider discovery during auto bootstrap.
|
|
@@ -4,7 +4,7 @@ import { basename, dirname, join } from "node:path";
|
|
|
4
4
|
import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
5
5
|
import { cleanNumberedGsdVariants } from "./repo-identity.js";
|
|
6
6
|
import { milestonesDir, gsdRoot, resolveGsdRootFile } from "./paths.js";
|
|
7
|
-
import { deriveState } from "./state.js";
|
|
7
|
+
import { deriveState, isGhostMilestone, isReusableGhostMilestone } from "./state.js";
|
|
8
8
|
import { saveFile } from "./files.js";
|
|
9
9
|
import { nativeIsRepo, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
10
10
|
import { readCrashLock, isLockProcessAlive, clearLock } from "./crash-recovery.js";
|
|
@@ -12,6 +12,7 @@ import { ensureGitignore, isGsdGitignored } from "./gitignore.js";
|
|
|
12
12
|
import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
|
|
13
13
|
import { recoverFailedMigration } from "./migrate-external.js";
|
|
14
14
|
import { splitCompletedKey } from "./forensics.js";
|
|
15
|
+
import { findMilestoneIds } from "./milestone-ids.js";
|
|
15
16
|
|
|
16
17
|
export async function checkRuntimeHealth(
|
|
17
18
|
basePath: string,
|
|
@@ -593,6 +594,43 @@ export async function checkRuntimeHealth(
|
|
|
593
594
|
} catch {
|
|
594
595
|
// Non-fatal — snapshot ref check failed
|
|
595
596
|
}
|
|
597
|
+
|
|
598
|
+
// ── Orphan milestone directories (#4996) ──────────────────────────────
|
|
599
|
+
// Walk every milestone ID on disk. Any dir that has no DB row, no worktree,
|
|
600
|
+
// and no content files is an orphaned stub — it skews nextMilestoneId and
|
|
601
|
+
// was likely created by ensurePreconditions or showHeadlessMilestoneCreation
|
|
602
|
+
// for a phantom forward-reference. Surface as a fixable warning.
|
|
603
|
+
try {
|
|
604
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
605
|
+
const hasDbFile = existsSync(join(root, "gsd.db"));
|
|
606
|
+
for (const mid of milestoneIds) {
|
|
607
|
+
const isOrphan = isReusableGhostMilestone(basePath, mid)
|
|
608
|
+
|| (!hasDbFile && isGhostMilestone(basePath, mid));
|
|
609
|
+
if (isOrphan) {
|
|
610
|
+
issues.push({
|
|
611
|
+
severity: "warning",
|
|
612
|
+
code: "orphan_milestone_dir",
|
|
613
|
+
scope: "milestone",
|
|
614
|
+
unitId: mid,
|
|
615
|
+
message: `Orphan milestone directory: ${mid} — directory exists on disk with no DB row, no worktree, and no content files. This stub skews milestone ID generation and should be removed.`,
|
|
616
|
+
file: `.gsd/milestones/${mid}`,
|
|
617
|
+
fixable: true,
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
if (shouldFix("orphan_milestone_dir")) {
|
|
621
|
+
try {
|
|
622
|
+
const orphanPath = join(milestonesDir(basePath), mid);
|
|
623
|
+
rmSync(orphanPath, { recursive: true, force: true });
|
|
624
|
+
fixesApplied.push(`removed orphan milestone directory: ${mid}`);
|
|
625
|
+
} catch {
|
|
626
|
+
// Non-fatal — leave for manual cleanup
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
} catch {
|
|
632
|
+
// Non-fatal — orphan milestone directory check failed
|
|
633
|
+
}
|
|
596
634
|
}
|
|
597
635
|
|
|
598
636
|
/**
|
|
@@ -80,7 +80,9 @@ export type DoctorIssueCode =
|
|
|
80
80
|
| "db_done_task_no_summary"
|
|
81
81
|
| "db_duplicate_id"
|
|
82
82
|
| "db_unavailable"
|
|
83
|
-
| "projection_drift"
|
|
83
|
+
| "projection_drift"
|
|
84
|
+
// Milestone filesystem/DB drift (#4996)
|
|
85
|
+
| "orphan_milestone_dir";
|
|
84
86
|
|
|
85
87
|
/**
|
|
86
88
|
* Issue codes that represent global or completion-critical state.
|
|
@@ -59,7 +59,7 @@ const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|fet
|
|
|
59
59
|
// Context overflow errors (context window/length exceeded) should be treated as server-class
|
|
60
60
|
// transient errors so auto-mode can retry with reduced budget or fall back to a larger-context model.
|
|
61
61
|
// See: https://github.com/gsd-build/gsd-2/issues/4528
|
|
62
|
-
const SERVER_RE = /internal server error|500|502|503|overloaded|server_error|api_error|service.?unavailable|context (?:window|length) exceed|context window exceed/i;
|
|
62
|
+
const SERVER_RE = /internal(?: server)?[ _-]?error|500|502|503|overloaded|server_error|api_error|service.?unavailable|context (?:window|length) exceed|context window exceed/i;
|
|
63
63
|
// ECONNRESET/ECONNREFUSED are in NETWORK_RE (same-model retry first).
|
|
64
64
|
const CONNECTION_RE = /terminated|connection.?(?:refused|error)|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
|
|
65
65
|
// Catch-all for V8 JSON.parse errors: all modern variants end with "in JSON at position \d+".
|
|
@@ -12,7 +12,7 @@ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent
|
|
|
12
12
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { join, dirname, relative } from "node:path";
|
|
14
14
|
import { fileURLToPath } from "node:url";
|
|
15
|
-
import {
|
|
15
|
+
import { getHomeDir } from "./home-dir.js";
|
|
16
16
|
|
|
17
17
|
import { extractTrace, type ExecutionTrace } from "./session-forensics.js";
|
|
18
18
|
import { nativeParseJsonlTail } from "./native-parser-bridge.js";
|
|
@@ -244,7 +244,7 @@ export async function handleForensics(
|
|
|
244
244
|
// when import.meta.url resolves to the npm-global install path (Windows).
|
|
245
245
|
let gsdSourceDir = dirname(fileURLToPath(import.meta.url));
|
|
246
246
|
if (!existsSync(join(gsdSourceDir, "prompts"))) {
|
|
247
|
-
const gsdHome = process.env.GSD_HOME || join(
|
|
247
|
+
const gsdHome = process.env.GSD_HOME || join(getHomeDir(), ".gsd");
|
|
248
248
|
const fallback = join(gsdHome, "agent", "extensions", "gsd");
|
|
249
249
|
if (existsSync(join(fallback, "prompts"))) gsdSourceDir = fallback;
|
|
250
250
|
}
|
|
@@ -804,7 +804,7 @@ function detectMissingArtifacts(completedKeys: string[], basePath: string, activ
|
|
|
804
804
|
* the forensics memory-bloat guard in forensics-journal.test.ts — per-event
|
|
805
805
|
* detail stays in the journal itself where the LLM can query it on demand.
|
|
806
806
|
*/
|
|
807
|
-
function detectWorktreeOrphans(
|
|
807
|
+
export function detectWorktreeOrphans(
|
|
808
808
|
summary: WorktreeTelemetrySummary,
|
|
809
809
|
anomalies: ForensicAnomaly[],
|
|
810
810
|
): void {
|
|
@@ -822,7 +822,7 @@ function detectWorktreeOrphans(
|
|
|
822
822
|
reason === "in-progress-unmerged"
|
|
823
823
|
? "Auto-mode exited without completing a milestone; live work sits on an unmerged milestone branch. Run `/gsd auto` to resume, or merge manually."
|
|
824
824
|
: reason === "complete-unmerged"
|
|
825
|
-
? "A completed milestone's branch was never merged back to main. Run `/gsd
|
|
825
|
+
? "A completed milestone's branch was never merged back to main. Run `/gsd doctor fix` to resolve."
|
|
826
826
|
: `Reason: ${reason}.`,
|
|
827
827
|
});
|
|
828
828
|
}
|
|
@@ -1299,10 +1299,15 @@ function formatReportForPrompt(report: ForensicReport): string {
|
|
|
1299
1299
|
function redactForGitHub(text: string, basePath: string): string {
|
|
1300
1300
|
let result = text;
|
|
1301
1301
|
|
|
1302
|
+
// Build regex that matches both / and \ separator variants (Windows)
|
|
1303
|
+
// Normalize to / first, escape for regex, then replace each / with [/\\]
|
|
1304
|
+
const esc = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1305
|
+
const pathRe = (p: string) =>
|
|
1306
|
+
new RegExp(esc(p.replace(/\\/g, "/")).replace(/\//g, "[/\\\\]"), "gi");
|
|
1307
|
+
|
|
1302
1308
|
// Replace absolute paths
|
|
1303
|
-
result = result.
|
|
1304
|
-
|
|
1305
|
-
if (home) result = result.replaceAll(home, "~");
|
|
1309
|
+
result = result.replace(pathRe(basePath), ".");
|
|
1310
|
+
result = result.replace(pathRe(getHomeDir()), "~");
|
|
1306
1311
|
|
|
1307
1312
|
// Strip API key patterns
|
|
1308
1313
|
result = result.replace(/sk-[a-zA-Z0-9]{20,}/g, "sk-***");
|
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
} from "./native-git-bridge.js";
|
|
39
39
|
import { GSDError, GSD_MERGE_CONFLICT, GSD_GIT_ERROR } from "./errors.js";
|
|
40
40
|
import { getErrorMessage } from "./error-utils.js";
|
|
41
|
+
import { isInfrastructureError } from "./auto/infra-errors.js";
|
|
41
42
|
|
|
42
43
|
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
43
44
|
|
|
@@ -991,6 +992,17 @@ function buildTurnSnapshotLabel(unitType: string, unitId: string): string {
|
|
|
991
992
|
.replace(/^[-/]+|[-/]+$/g, "") || "turn";
|
|
992
993
|
}
|
|
993
994
|
|
|
995
|
+
export function handleTurnGitActionError(action: TurnGitActionMode, err: unknown): TurnGitActionResult {
|
|
996
|
+
if (isInfrastructureError(err)) {
|
|
997
|
+
throw err;
|
|
998
|
+
}
|
|
999
|
+
return {
|
|
1000
|
+
action,
|
|
1001
|
+
status: "failed",
|
|
1002
|
+
error: getErrorMessage(err),
|
|
1003
|
+
};
|
|
1004
|
+
}
|
|
1005
|
+
|
|
994
1006
|
export function runTurnGitAction(args: {
|
|
995
1007
|
basePath: string;
|
|
996
1008
|
action: TurnGitActionMode;
|
|
@@ -1029,11 +1041,7 @@ export function runTurnGitAction(args: {
|
|
|
1029
1041
|
dirty: nativeHasChanges(args.basePath),
|
|
1030
1042
|
};
|
|
1031
1043
|
} catch (err) {
|
|
1032
|
-
return
|
|
1033
|
-
action: args.action,
|
|
1034
|
-
status: "failed",
|
|
1035
|
-
error: getErrorMessage(err),
|
|
1036
|
-
};
|
|
1044
|
+
return handleTurnGitActionError(args.action, err);
|
|
1037
1045
|
}
|
|
1038
1046
|
}
|
|
1039
1047
|
|
|
@@ -1405,6 +1405,16 @@ export function checkpointDatabase(): void {
|
|
|
1405
1405
|
|
|
1406
1406
|
let _txDepth = 0;
|
|
1407
1407
|
|
|
1408
|
+
/**
|
|
1409
|
+
* Whether the current call is running inside an active SQLite transaction.
|
|
1410
|
+
* Statement-time recovery paths (e.g. VACUUM retry on a malformed memory
|
|
1411
|
+
* store) MUST gate on this — SQLite refuses VACUUM inside a transaction
|
|
1412
|
+
* and would mask the original error with a secondary "cannot VACUUM" throw.
|
|
1413
|
+
*/
|
|
1414
|
+
export function isInTransaction(): boolean {
|
|
1415
|
+
return _txDepth > 0;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1408
1418
|
export function transaction<T>(fn: () => T): T {
|
|
1409
1419
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1410
1420
|
|
|
@@ -1419,8 +1429,8 @@ export function transaction<T>(fn: () => T): T {
|
|
|
1419
1429
|
}
|
|
1420
1430
|
}
|
|
1421
1431
|
|
|
1422
|
-
_txDepth++;
|
|
1423
1432
|
currentDb.exec("BEGIN");
|
|
1433
|
+
_txDepth++;
|
|
1424
1434
|
try {
|
|
1425
1435
|
const result = fn();
|
|
1426
1436
|
currentDb.exec("COMMIT");
|
|
@@ -1452,8 +1462,8 @@ export function readTransaction<T>(fn: () => T): T {
|
|
|
1452
1462
|
}
|
|
1453
1463
|
}
|
|
1454
1464
|
|
|
1455
|
-
_txDepth++;
|
|
1456
1465
|
currentDb.exec("BEGIN DEFERRED");
|
|
1466
|
+
_txDepth++;
|
|
1457
1467
|
try {
|
|
1458
1468
|
const result = fn();
|
|
1459
1469
|
currentDb.exec("COMMIT");
|
|
@@ -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
|
|