gsd-pi 2.78.0 → 2.78.1-dev.8a893322c
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 +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 +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/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 -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/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 +15 -15
- 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 +15 -15
- 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 +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 +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/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/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/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 -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/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 → QK8fABiGPmonfTgboN0Y9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_ssgManifest.js +0 -0
|
@@ -232,7 +232,6 @@ import { reorderForCaching } from "./prompt-ordering.js";
|
|
|
232
232
|
// ─── Session State ─────────────────────────────────────────────────────────
|
|
233
233
|
|
|
234
234
|
import {
|
|
235
|
-
AutoSession,
|
|
236
235
|
STUB_RECOVERY_THRESHOLD,
|
|
237
236
|
NEW_SESSION_TIMEOUT_MS,
|
|
238
237
|
} from "./auto/session.js";
|
|
@@ -250,11 +249,12 @@ export type {
|
|
|
250
249
|
UnitRouting,
|
|
251
250
|
StartModel,
|
|
252
251
|
} from "./auto/session.js";
|
|
252
|
+
import { autoSession as s } from "./auto-runtime-state.js";
|
|
253
253
|
|
|
254
254
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
255
255
|
// ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
|
|
256
256
|
// This file must NOT declare module-level `let` or `var` variables for state.
|
|
257
|
-
// The single `s` instance below is the only mutable
|
|
257
|
+
// The single shared `s` instance below is the only mutable AutoSession binding.
|
|
258
258
|
//
|
|
259
259
|
// When adding features or fixing bugs:
|
|
260
260
|
// - New mutable state → add a property to AutoSession, not a module-level variable
|
|
@@ -263,7 +263,6 @@ export type {
|
|
|
263
263
|
//
|
|
264
264
|
// Tests in auto-session-encapsulation.test.ts enforce this invariant.
|
|
265
265
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
266
|
-
const s = new AutoSession();
|
|
267
266
|
|
|
268
267
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
269
268
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
@@ -1812,7 +1811,7 @@ const widgetStateAccessors: WidgetStateAccessors = {
|
|
|
1812
1811
|
* Ensure directories, branches, and other prerequisites exist before
|
|
1813
1812
|
* dispatching a unit. The LLM should never need to mkdir or git checkout.
|
|
1814
1813
|
*/
|
|
1815
|
-
function ensurePreconditions(
|
|
1814
|
+
export function ensurePreconditions(
|
|
1816
1815
|
unitType: string,
|
|
1817
1816
|
unitId: string,
|
|
1818
1817
|
base: string,
|
|
@@ -1822,6 +1821,17 @@ function ensurePreconditions(
|
|
|
1822
1821
|
|
|
1823
1822
|
const mDir = resolveMilestonePath(base, mid);
|
|
1824
1823
|
if (!mDir) {
|
|
1824
|
+
// Fix #4996: When dispatching a slice unit against an unrecognised milestone,
|
|
1825
|
+
// only create the directory if the milestone has a DB row.
|
|
1826
|
+
// Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
|
|
1827
|
+
// silently scaffold empty stub directories that later skew nextMilestoneId.
|
|
1828
|
+
if (sid !== undefined) {
|
|
1829
|
+
const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
|
|
1830
|
+
if (!hasDbRow) {
|
|
1831
|
+
logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
|
|
1832
|
+
return;
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1825
1835
|
const newDir = join(milestonesDir(base), mid);
|
|
1826
1836
|
mkdirSync(join(newDir, "slices"), { recursive: true });
|
|
1827
1837
|
}
|
|
@@ -2,24 +2,15 @@ import { Type } from "@sinclair/typebox";
|
|
|
2
2
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
3
3
|
import { Text } from "@gsd/pi-tui";
|
|
4
4
|
|
|
5
|
-
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
6
5
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
7
6
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
8
7
|
import { StringEnum } from "@gsd/pi-ai";
|
|
9
8
|
import { logError } from "../workflow-logger.js";
|
|
10
9
|
import { getErrorMessage } from "../error-utils.js";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
executeReplanSlice,
|
|
16
|
-
executeReassessRoadmap,
|
|
17
|
-
executeSaveGateResult,
|
|
18
|
-
executeSliceComplete,
|
|
19
|
-
executeSummarySave,
|
|
20
|
-
executeTaskComplete,
|
|
21
|
-
executeValidateMilestone,
|
|
22
|
-
} from "../tools/workflow-tool-executors.js";
|
|
10
|
+
|
|
11
|
+
async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
|
|
12
|
+
return import("../tools/workflow-tool-executors.js");
|
|
13
|
+
}
|
|
23
14
|
|
|
24
15
|
/**
|
|
25
16
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
@@ -302,6 +293,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
302
293
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
303
294
|
|
|
304
295
|
const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
296
|
+
const { executeSummarySave } = await loadWorkflowExecutors();
|
|
305
297
|
return executeSummarySave(params, process.cwd());
|
|
306
298
|
};
|
|
307
299
|
|
|
@@ -354,6 +346,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
354
346
|
try {
|
|
355
347
|
// Claim a reserved ID if the guided-flow already previewed one to the user.
|
|
356
348
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
349
|
+
const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
|
|
357
350
|
const reserved = claimReservedId();
|
|
358
351
|
if (reserved) {
|
|
359
352
|
await ensureMilestoneDbRow(reserved);
|
|
@@ -435,6 +428,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
435
428
|
// ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
|
|
436
429
|
|
|
437
430
|
const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
431
|
+
const { executePlanMilestone } = await loadWorkflowExecutors();
|
|
438
432
|
return executePlanMilestone(params, process.cwd());
|
|
439
433
|
};
|
|
440
434
|
|
|
@@ -504,6 +498,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
504
498
|
// ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
|
|
505
499
|
|
|
506
500
|
const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
501
|
+
const { executePlanSlice } = await loadWorkflowExecutors();
|
|
507
502
|
return executePlanSlice(params, process.cwd());
|
|
508
503
|
};
|
|
509
504
|
|
|
@@ -626,6 +621,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
626
621
|
// ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
|
|
627
622
|
|
|
628
623
|
const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
624
|
+
const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
629
625
|
return executeTaskComplete(params, process.cwd());
|
|
630
626
|
};
|
|
631
627
|
|
|
@@ -696,6 +692,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
696
692
|
// ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
|
|
697
693
|
|
|
698
694
|
const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
695
|
+
const { executeSliceComplete } = await loadWorkflowExecutors();
|
|
699
696
|
return executeSliceComplete(params, process.cwd());
|
|
700
697
|
};
|
|
701
698
|
|
|
@@ -888,6 +885,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
888
885
|
// ─── gsd_complete_milestone ────────────────────────────────────────────
|
|
889
886
|
|
|
890
887
|
const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
888
|
+
const { executeCompleteMilestone } = await loadWorkflowExecutors();
|
|
891
889
|
return executeCompleteMilestone(params, process.cwd());
|
|
892
890
|
};
|
|
893
891
|
|
|
@@ -933,6 +931,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
933
931
|
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
934
932
|
|
|
935
933
|
const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
934
|
+
const { executeValidateMilestone } = await loadWorkflowExecutors();
|
|
936
935
|
return executeValidateMilestone(params, process.cwd());
|
|
937
936
|
};
|
|
938
937
|
|
|
@@ -970,6 +969,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
970
969
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
971
970
|
|
|
972
971
|
const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
972
|
+
const { executeReplanSlice } = await loadWorkflowExecutors();
|
|
973
973
|
return executeReplanSlice(params, process.cwd());
|
|
974
974
|
};
|
|
975
975
|
|
|
@@ -1020,6 +1020,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1020
1020
|
// ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
|
|
1021
1021
|
|
|
1022
1022
|
const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1023
|
+
const { executeReassessRoadmap } = await loadWorkflowExecutors();
|
|
1023
1024
|
return executeReassessRoadmap(params, process.cwd());
|
|
1024
1025
|
};
|
|
1025
1026
|
|
|
@@ -1275,6 +1276,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1275
1276
|
// ─── gsd_save_gate_result ──────────────────────────────────────────────
|
|
1276
1277
|
|
|
1277
1278
|
const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
1279
|
+
const { executeSaveGateResult } = await loadWorkflowExecutors();
|
|
1278
1280
|
return executeSaveGateResult(params, process.cwd());
|
|
1279
1281
|
};
|
|
1280
1282
|
|
|
@@ -6,12 +6,6 @@
|
|
|
6
6
|
import { Type } from "@sinclair/typebox";
|
|
7
7
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
8
8
|
|
|
9
|
-
import { executeGsdExec } from "../tools/exec-tool.js";
|
|
10
|
-
import { executeExecSearch } from "../tools/exec-search-tool.js";
|
|
11
|
-
import { executeResume } from "../tools/resume-tool.js";
|
|
12
|
-
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
13
|
-
import { logWarning } from "../workflow-logger.js";
|
|
14
|
-
|
|
15
9
|
export function registerExecTools(pi: ExtensionAPI): void {
|
|
16
10
|
pi.registerTool({
|
|
17
11
|
name: "gsd_exec",
|
|
@@ -46,7 +40,12 @@ export function registerExecTools(pi: ExtensionAPI): void {
|
|
|
46
40
|
),
|
|
47
41
|
}),
|
|
48
42
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
49
|
-
|
|
43
|
+
const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
|
|
44
|
+
import("../tools/exec-tool.js"),
|
|
45
|
+
import("../preferences.js"),
|
|
46
|
+
import("../workflow-logger.js"),
|
|
47
|
+
]);
|
|
48
|
+
let prefs: ReturnType<typeof loadEffectiveGSDPreferences> | null = null;
|
|
50
49
|
try {
|
|
51
50
|
prefs = loadEffectiveGSDPreferences();
|
|
52
51
|
} catch (err) {
|
|
@@ -81,6 +80,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
|
|
|
81
80
|
limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
|
|
82
81
|
}),
|
|
83
82
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
83
|
+
const { executeExecSearch } = await import("../tools/exec-search-tool.js");
|
|
84
84
|
return executeExecSearch(params as Parameters<typeof executeExecSearch>[0], {
|
|
85
85
|
baseDir: process.cwd(),
|
|
86
86
|
});
|
|
@@ -101,6 +101,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
|
|
|
101
101
|
],
|
|
102
102
|
parameters: Type.Object({}),
|
|
103
103
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
104
|
+
const { executeResume } = await import("../tools/resume-tool.js");
|
|
104
105
|
return executeResume(params as Parameters<typeof executeResume>[0], {
|
|
105
106
|
baseDir: process.cwd(),
|
|
106
107
|
});
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
import { Type } from "@sinclair/typebox";
|
|
4
4
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
5
5
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
6
|
-
import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
|
|
7
|
-
import { checkpointDatabase } from "../gsd-db.js";
|
|
8
6
|
|
|
9
7
|
export function registerQueryTools(pi: ExtensionAPI): void {
|
|
10
8
|
pi.registerTool({
|
|
@@ -29,6 +27,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
|
|
|
29
27
|
details: { operation: "milestone_status", error: "db_unavailable" },
|
|
30
28
|
};
|
|
31
29
|
}
|
|
30
|
+
const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
|
|
32
31
|
return executeMilestoneStatus(params);
|
|
33
32
|
},
|
|
34
33
|
});
|
|
@@ -55,6 +54,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
|
|
|
55
54
|
details: { operation: "checkpoint_db", error: "db_unavailable" },
|
|
56
55
|
};
|
|
57
56
|
}
|
|
57
|
+
const { checkpointDatabase } = await import("../gsd-db.js");
|
|
58
58
|
checkpointDatabase();
|
|
59
59
|
return {
|
|
60
60
|
content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
4
4
|
|
|
5
5
|
import { registerExitCommand } from "../exit-command.js";
|
|
6
|
-
import {
|
|
6
|
+
import { registerLazyWorktreeCommands } from "../worktree-command-bootstrap.js";
|
|
7
7
|
import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-extension-api.js";
|
|
8
|
-
import { loadEcosystemExtensions } from "../ecosystem/loader.js";
|
|
9
8
|
import { registerDbTools } from "./db-tools.js";
|
|
10
9
|
import { registerDynamicTools } from "./dynamic-tools.js";
|
|
11
10
|
import { registerExecTools } from "./exec-tools.js";
|
|
@@ -71,7 +70,7 @@ function installEpipeGuard(): void {
|
|
|
71
70
|
export function registerGsdExtension(pi: ExtensionAPI): void {
|
|
72
71
|
// Note: registerGSDCommand is called by index.ts before this function,
|
|
73
72
|
// so we intentionally skip it here to avoid double-registration.
|
|
74
|
-
|
|
73
|
+
registerLazyWorktreeCommands(pi);
|
|
75
74
|
registerExitCommand(pi);
|
|
76
75
|
|
|
77
76
|
// Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
|
|
@@ -116,12 +115,14 @@ export function registerGsdExtension(pi: ExtensionAPI): void {
|
|
|
116
115
|
["cmux-events", () => initCmuxEventListeners(pi.events)],
|
|
117
116
|
["hooks", () => registerHooks(pi, ecosystemHandlers)],
|
|
118
117
|
["ecosystem", () => {
|
|
119
|
-
void
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
118
|
+
void import("../ecosystem/loader.js")
|
|
119
|
+
.then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
|
|
120
|
+
.catch((err) => {
|
|
121
|
+
logWarning(
|
|
122
|
+
"ecosystem",
|
|
123
|
+
`loader failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
124
|
+
);
|
|
125
|
+
});
|
|
125
126
|
}],
|
|
126
127
|
];
|
|
127
128
|
|
|
@@ -5,24 +5,16 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
|
5
5
|
|
|
6
6
|
import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-extension-api.js";
|
|
7
7
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
8
|
-
import { getEcosystemReadyPromise } from "../ecosystem/loader.js";
|
|
9
8
|
|
|
10
9
|
import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
10
|
+
import { clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
11
|
+
import { resolveManifest } from "../unit-context-manifest.js";
|
|
14
12
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
15
|
-
import { cleanupQuickBranch } from "../quick.js";
|
|
16
|
-
import { getDiscussionMilestoneId } from "../guided-flow.js";
|
|
17
|
-
import { loadToolApiKeys } from "../commands-config.js";
|
|
18
13
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
19
|
-
import {
|
|
20
|
-
import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto.js";
|
|
14
|
+
import { getAutoRuntimeSnapshot, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
|
|
21
15
|
|
|
22
|
-
import { isParallelActive, shutdownParallel } from "../parallel-orchestrator.js";
|
|
23
16
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
24
17
|
import { saveActivityLog } from "../activity-log.js";
|
|
25
|
-
import { resetAskUserQuestionsCache } from "../../ask-user-questions.js";
|
|
26
18
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
27
19
|
import { parseUnitId } from "../unit-id.js";
|
|
28
20
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
@@ -30,17 +22,46 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
30
22
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
31
23
|
import { initNotificationStore } from "../notification-store.js";
|
|
32
24
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
33
|
-
import {
|
|
25
|
+
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
34
26
|
|
|
35
27
|
// Skip the welcome screen on the very first session_start — cli.ts already
|
|
36
28
|
// printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
|
|
37
29
|
let isFirstSession = true;
|
|
38
30
|
|
|
31
|
+
async function deriveGsdState(basePath: string) {
|
|
32
|
+
const { deriveState } = await import("../state.js");
|
|
33
|
+
return deriveState(basePath);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function getDiscussionMilestoneIdFor(basePath: string): Promise<string | null> {
|
|
37
|
+
const { getDiscussionMilestoneId } = await import("../guided-flow.js");
|
|
38
|
+
return getDiscussionMilestoneId(basePath);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function loadToolApiKeysForSession(): Promise<void> {
|
|
42
|
+
const { loadToolApiKeys } = await import("../commands-config.js");
|
|
43
|
+
loadToolApiKeys();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function resetAskUserQuestionsTurnCache(): Promise<void> {
|
|
47
|
+
const { resetAskUserQuestionsCache } = await import("../../ask-user-questions.js");
|
|
48
|
+
resetAskUserQuestionsCache();
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
async function syncServiceTierStatus(ctx: ExtensionContext): Promise<void> {
|
|
40
52
|
const { getEffectiveServiceTier, formatServiceTierFooterStatus } = await import("../service-tier.js");
|
|
41
53
|
ctx.ui.setStatus("gsd-fast", formatServiceTierFooterStatus(getEffectiveServiceTier(), ctx.model?.id));
|
|
42
54
|
}
|
|
43
55
|
|
|
56
|
+
async function applyDisabledModelProviderPolicy(ctx: ExtensionContext): Promise<void> {
|
|
57
|
+
try {
|
|
58
|
+
const { resolveDisabledModelProvidersFromPreferences } = await import("../preferences.js");
|
|
59
|
+
ctx.modelRegistry.setDisabledModelProviders(resolveDisabledModelProvidersFromPreferences());
|
|
60
|
+
} catch {
|
|
61
|
+
// Non-fatal: keep default provider visibility if preferences cannot be loaded.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
44
65
|
export function registerHooks(
|
|
45
66
|
pi: ExtensionAPI,
|
|
46
67
|
ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
|
|
@@ -50,12 +71,14 @@ export function registerHooks(
|
|
|
50
71
|
installNotifyInterceptor(ctx);
|
|
51
72
|
initNotificationWidget(ctx);
|
|
52
73
|
if (!isAutoActive()) {
|
|
74
|
+
const { initHealthWidget } = await import("../health-widget.js");
|
|
53
75
|
initHealthWidget(ctx);
|
|
54
76
|
}
|
|
55
77
|
resetWriteGateState();
|
|
56
78
|
resetToolCallLoopGuard();
|
|
57
|
-
|
|
79
|
+
await resetAskUserQuestionsTurnCache();
|
|
58
80
|
await syncServiceTierStatus(ctx);
|
|
81
|
+
await applyDisabledModelProviderPolicy(ctx);
|
|
59
82
|
// Skip MCP auto-prep when running inside an auto-worktree (see session_switch below).
|
|
60
83
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
61
84
|
if (!isInAutoWorktree(process.cwd())) {
|
|
@@ -91,7 +114,7 @@ export function registerHooks(
|
|
|
91
114
|
}
|
|
92
115
|
} catch { /* non-fatal */ }
|
|
93
116
|
}
|
|
94
|
-
|
|
117
|
+
await loadToolApiKeysForSession();
|
|
95
118
|
if (isAutoActive()) {
|
|
96
119
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
97
120
|
}
|
|
@@ -102,9 +125,10 @@ export function registerHooks(
|
|
|
102
125
|
installNotifyInterceptor(ctx);
|
|
103
126
|
resetWriteGateState();
|
|
104
127
|
resetToolCallLoopGuard();
|
|
105
|
-
|
|
128
|
+
await resetAskUserQuestionsTurnCache();
|
|
106
129
|
clearDiscussionFlowState();
|
|
107
130
|
await syncServiceTierStatus(ctx);
|
|
131
|
+
await applyDisabledModelProviderPolicy(ctx);
|
|
108
132
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
109
133
|
// already has .mcp.json from createAutoWorktree, and re-running the writer
|
|
110
134
|
// post-chdir rewrites the file mid-run (non-idempotent due to cwd-relative
|
|
@@ -114,23 +138,28 @@ export function registerHooks(
|
|
|
114
138
|
const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
|
|
115
139
|
prepareWorkflowMcpForProject(ctx, process.cwd());
|
|
116
140
|
}
|
|
117
|
-
|
|
118
|
-
if (isAutoActive()) {
|
|
141
|
+
await loadToolApiKeysForSession();
|
|
142
|
+
if (!isAutoActive()) {
|
|
143
|
+
const { initHealthWidget } = await import("../health-widget.js");
|
|
144
|
+
initHealthWidget(ctx);
|
|
145
|
+
} else {
|
|
119
146
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
120
147
|
}
|
|
121
148
|
});
|
|
122
149
|
|
|
123
150
|
pi.on("before_agent_start", async (event, ctx: ExtensionContext) => {
|
|
124
151
|
// Wait for ecosystem loader to finish (no-op after first turn).
|
|
152
|
+
const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
|
|
125
153
|
await getEcosystemReadyPromise();
|
|
126
154
|
|
|
127
155
|
// GSD's own context injection (existing behavior — unchanged).
|
|
156
|
+
const { buildBeforeAgentStartResult } = await import("./system-context.js");
|
|
128
157
|
const gsdResult = await buildBeforeAgentStartResult(event, ctx);
|
|
129
158
|
|
|
130
159
|
// Refresh the snapshot used by ecosystem getPhase()/getActiveUnit().
|
|
131
160
|
// deriveState has its own ~100ms cache so this is cheap on repeat calls.
|
|
132
161
|
try {
|
|
133
|
-
const state = await
|
|
162
|
+
const state = await deriveGsdState(process.cwd());
|
|
134
163
|
updateSnapshot(state);
|
|
135
164
|
} catch {
|
|
136
165
|
updateSnapshot(null);
|
|
@@ -169,7 +198,8 @@ export function registerHooks(
|
|
|
169
198
|
|
|
170
199
|
pi.on("agent_end", async (event, ctx: ExtensionContext) => {
|
|
171
200
|
resetToolCallLoopGuard();
|
|
172
|
-
|
|
201
|
+
await resetAskUserQuestionsTurnCache();
|
|
202
|
+
const { handleAgentEnd } = await import("./agent-end-recovery.js");
|
|
173
203
|
await handleAgentEnd(pi, event, ctx);
|
|
174
204
|
});
|
|
175
205
|
|
|
@@ -178,6 +208,7 @@ export function registerHooks(
|
|
|
178
208
|
// quick-return state is pending, so this is safe to call on every turn.
|
|
179
209
|
pi.on("turn_end", async () => {
|
|
180
210
|
try {
|
|
211
|
+
const { cleanupQuickBranch } = await import("../quick.js");
|
|
181
212
|
cleanupQuickBranch();
|
|
182
213
|
} catch {
|
|
183
214
|
// Best-effort: don't break the turn lifecycle if cleanup fails.
|
|
@@ -194,8 +225,8 @@ export function registerHooks(
|
|
|
194
225
|
const basePath = process.cwd();
|
|
195
226
|
const { ensureDbOpen } = await import("./dynamic-tools.js");
|
|
196
227
|
await ensureDbOpen();
|
|
197
|
-
const state = await
|
|
198
|
-
if (!state.activeMilestone || !state.activeSlice
|
|
228
|
+
const state = await deriveGsdState(basePath);
|
|
229
|
+
if (!state.activeMilestone || !state.activeSlice) return;
|
|
199
230
|
// Write checkpoint for ALL phases, not just "executing" — discuss, research,
|
|
200
231
|
// and planning also carry in-memory state (user answers, gate verification)
|
|
201
232
|
// that would be lost on compaction (#4258).
|
|
@@ -210,21 +241,31 @@ export function registerHooks(
|
|
|
210
241
|
if (await loadFile(legacyContinue)) return;
|
|
211
242
|
|
|
212
243
|
const continuePath = join(sliceDir, `${state.activeSlice.id}-CONTINUE.md`);
|
|
244
|
+
const taskId = state.activeTask?.id ?? "none";
|
|
245
|
+
const taskTitle = state.activeTask?.title ?? "";
|
|
246
|
+
const phaseLabel = state.phase.replace(/-/g, " ");
|
|
247
|
+
|
|
213
248
|
await saveFile(continuePath, formatContinue({
|
|
214
249
|
frontmatter: {
|
|
215
250
|
milestone: state.activeMilestone.id,
|
|
216
251
|
slice: state.activeSlice.id,
|
|
217
|
-
task:
|
|
252
|
+
task: taskId,
|
|
218
253
|
step: 0,
|
|
219
254
|
totalSteps: 0,
|
|
220
255
|
status: "compacted" as const,
|
|
221
256
|
savedAt: new Date().toISOString(),
|
|
222
257
|
},
|
|
223
|
-
completedWork:
|
|
224
|
-
|
|
258
|
+
completedWork: state.activeTask
|
|
259
|
+
? `Task ${taskId} (${taskTitle}) was in progress when compaction occurred.`
|
|
260
|
+
: `Slice ${state.activeSlice.id} was in ${phaseLabel} phase when compaction occurred.`,
|
|
261
|
+
remainingWork: state.activeTask
|
|
262
|
+
? "Check the task plan for remaining steps."
|
|
263
|
+
: "Continue this slice from the latest planning/research/discussion artifacts.",
|
|
225
264
|
decisions: "Check task summary files for prior decisions.",
|
|
226
265
|
context: "Session was auto-compacted by Pi. Resume with /gsd.",
|
|
227
|
-
nextAction:
|
|
266
|
+
nextAction: state.activeTask
|
|
267
|
+
? `Resume task ${taskId}: ${taskTitle}.`
|
|
268
|
+
: `Resume ${phaseLabel} work for slice ${state.activeSlice.id}.`,
|
|
228
269
|
}));
|
|
229
270
|
});
|
|
230
271
|
|
|
@@ -246,7 +287,7 @@ export function registerHooks(
|
|
|
246
287
|
const basePath = process.cwd();
|
|
247
288
|
let activeContext: string | null = null;
|
|
248
289
|
try {
|
|
249
|
-
const state = await
|
|
290
|
+
const state = await deriveGsdState(basePath);
|
|
250
291
|
if (state.activeMilestone && state.activeSlice && state.activeTask) {
|
|
251
292
|
activeContext =
|
|
252
293
|
`Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
|
|
@@ -265,6 +306,7 @@ export function registerHooks(
|
|
|
265
306
|
});
|
|
266
307
|
|
|
267
308
|
pi.on("session_shutdown", async (_event, ctx: ExtensionContext) => {
|
|
309
|
+
const { isParallelActive, shutdownParallel } = await import("../parallel-orchestrator.js");
|
|
268
310
|
if (isParallelActive()) {
|
|
269
311
|
try {
|
|
270
312
|
await shutdownParallel(process.cwd());
|
|
@@ -273,7 +315,7 @@ export function registerHooks(
|
|
|
273
315
|
}
|
|
274
316
|
}
|
|
275
317
|
if (!isAutoActive() && !isAutoPaused()) return;
|
|
276
|
-
const dash =
|
|
318
|
+
const dash = getAutoRuntimeSnapshot();
|
|
277
319
|
if (dash.currentUnit) {
|
|
278
320
|
saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
|
|
279
321
|
}
|
|
@@ -302,7 +344,7 @@ export function registerHooks(
|
|
|
302
344
|
// If ask_user_questions was called with a gate ID but hasn't been confirmed,
|
|
303
345
|
// block all non-read-only tool calls to prevent the model from skipping gates.
|
|
304
346
|
if (getPendingGate()) {
|
|
305
|
-
const milestoneId =
|
|
347
|
+
const milestoneId = await getDiscussionMilestoneIdFor(discussionBasePath);
|
|
306
348
|
if (isToolCallEventType("bash", event)) {
|
|
307
349
|
const bashGuard = shouldBlockPendingGateBash(
|
|
308
350
|
event.input.command,
|
|
@@ -337,6 +379,41 @@ export function registerHooks(
|
|
|
337
379
|
if (queueGuard.block) return queueGuard;
|
|
338
380
|
}
|
|
339
381
|
|
|
382
|
+
// ── Planning-unit tools-policy enforcement (#4934): runtime half ─────
|
|
383
|
+
// The active auto-mode unit's manifest declares a ToolsPolicy. For
|
|
384
|
+
// planning/docs/read-only modes, deny writes outside .gsd/ (or the
|
|
385
|
+
// manifest's allowedPathGlobs), bash that isn't read-only, and
|
|
386
|
+
// subagent dispatch. Closes the b23 bug class where a discuss-milestone
|
|
387
|
+
// turn used the host Edit tool to modify user source files.
|
|
388
|
+
const dash = getAutoRuntimeSnapshot();
|
|
389
|
+
const activeUnitType = dash.currentUnit?.type;
|
|
390
|
+
if (activeUnitType) {
|
|
391
|
+
const manifest = resolveManifest(activeUnitType);
|
|
392
|
+
if (manifest) {
|
|
393
|
+
let planningInput = "";
|
|
394
|
+
let agentClasses: string[] | undefined;
|
|
395
|
+
if (isToolCallEventType("write", event)) {
|
|
396
|
+
planningInput = event.input.path;
|
|
397
|
+
} else if (isToolCallEventType("edit", event)) {
|
|
398
|
+
planningInput = event.input.path;
|
|
399
|
+
} else if (isToolCallEventType("bash", event)) {
|
|
400
|
+
planningInput = event.input.command;
|
|
401
|
+
} else if (event.toolName === "subagent" || event.toolName === "task") {
|
|
402
|
+
// Subagent inputs use { agent }, { tasks: [{ agent }] }, or { chain: [{ agent }] }.
|
|
403
|
+
agentClasses = extractSubagentAgentClasses((event as { input?: unknown }).input);
|
|
404
|
+
}
|
|
405
|
+
const planningGuard = shouldBlockPlanningUnit(
|
|
406
|
+
event.toolName,
|
|
407
|
+
planningInput,
|
|
408
|
+
dash.basePath || discussionBasePath,
|
|
409
|
+
activeUnitType,
|
|
410
|
+
manifest.tools,
|
|
411
|
+
agentClasses,
|
|
412
|
+
);
|
|
413
|
+
if (planningGuard.block) return planningGuard;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
340
417
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
341
418
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
342
419
|
if (isToolCallEventType("write", event)) {
|
|
@@ -362,7 +439,7 @@ export function registerHooks(
|
|
|
362
439
|
const result = shouldBlockContextWrite(
|
|
363
440
|
event.toolName,
|
|
364
441
|
event.input.path,
|
|
365
|
-
|
|
442
|
+
await getDiscussionMilestoneIdFor(discussionBasePath),
|
|
366
443
|
isQueuePhaseActive(),
|
|
367
444
|
);
|
|
368
445
|
if (result.block) return result;
|
|
@@ -374,6 +451,19 @@ export function registerHooks(
|
|
|
374
451
|
markToolStart(event.toolCallId, event.toolName);
|
|
375
452
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
|
|
376
453
|
|
|
454
|
+
// Persist immediately at dispatch so a mid-unit re-dispatch — which calls
|
|
455
|
+
// resetEvidence() + loadEvidenceFromDisk() in runUnitPhase — cannot wipe
|
|
456
|
+
// the entry between tool_call and tool_execution_end. Without this, the
|
|
457
|
+
// race window equals the tool's runtime, producing the "no bash calls"
|
|
458
|
+
// false positive when the LLM clearly ran a verification command.
|
|
459
|
+
const callDash = getAutoRuntimeSnapshot();
|
|
460
|
+
if (callDash.basePath && callDash.currentUnit?.type === "execute-task") {
|
|
461
|
+
const { milestone: cMid, slice: cSid, task: cTid } = parseUnitId(callDash.currentUnit.id);
|
|
462
|
+
if (cMid && cSid && cTid) {
|
|
463
|
+
saveEvidenceToDisk(callDash.basePath, cMid, cSid, cTid);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
377
467
|
// Destructive command classification (warn only, never block)
|
|
378
468
|
if (isToolCallEventType("bash", event)) {
|
|
379
469
|
const classification = classifyCommand(event.input.command);
|
|
@@ -407,7 +497,7 @@ export function registerHooks(
|
|
|
407
497
|
recordToolInvocationError(event.toolName, errorText);
|
|
408
498
|
}
|
|
409
499
|
if (event.toolName !== "ask_user_questions") return;
|
|
410
|
-
const milestoneId =
|
|
500
|
+
const milestoneId = await getDiscussionMilestoneIdFor(process.cwd());
|
|
411
501
|
const queueActive = isQueuePhaseActive();
|
|
412
502
|
|
|
413
503
|
const details = event.details as any;
|
|
@@ -506,7 +596,7 @@ export function registerHooks(
|
|
|
506
596
|
safetyRecordToolResult(event.toolCallId, event.toolName, event.result, event.isError);
|
|
507
597
|
// Persist evidence to disk after each tool result so it survives a session
|
|
508
598
|
// restart mid-unit (Bug #4385 — non-persisted evidence false positives).
|
|
509
|
-
const dash =
|
|
599
|
+
const dash = getAutoRuntimeSnapshot();
|
|
510
600
|
if (dash.basePath && dash.currentUnit?.type === "execute-task") {
|
|
511
601
|
const { milestone: pMid, slice: pSid, task: pTid } = parseUnitId(dash.currentUnit.id);
|
|
512
602
|
if (pMid && pSid && pTid) {
|
|
@@ -4,13 +4,14 @@ import { join } from "node:path";
|
|
|
4
4
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
5
5
|
import { Key } from "@gsd/pi-tui";
|
|
6
6
|
|
|
7
|
-
import { GSDDashboardOverlay } from "../dashboard-overlay.js";
|
|
8
|
-
import { GSDNotificationOverlay } from "../notification-overlay.js";
|
|
9
|
-
import { ParallelMonitorOverlay } from "../parallel-monitor-overlay.js";
|
|
10
7
|
import { GSD_SHORTCUTS } from "../shortcut-defs.js";
|
|
11
|
-
import { projectRoot } from "../commands/context.js";
|
|
12
8
|
import { shortcutDesc } from "../../shared/mod.js";
|
|
13
9
|
|
|
10
|
+
async function getProjectRoot(): Promise<string> {
|
|
11
|
+
const { projectRoot } = await import("../commands/context.js");
|
|
12
|
+
return projectRoot();
|
|
13
|
+
}
|
|
14
|
+
|
|
14
15
|
export function registerShortcuts(pi: ExtensionAPI): void {
|
|
15
16
|
const overlayOptions = {
|
|
16
17
|
width: "90%",
|
|
@@ -20,7 +21,10 @@ export function registerShortcuts(pi: ExtensionAPI): void {
|
|
|
20
21
|
} as const;
|
|
21
22
|
|
|
22
23
|
const openDashboardOverlay = async (ctx: ExtensionContext) => {
|
|
23
|
-
const basePath =
|
|
24
|
+
const [{ GSDDashboardOverlay }, basePath] = await Promise.all([
|
|
25
|
+
import("../dashboard-overlay.js"),
|
|
26
|
+
getProjectRoot(),
|
|
27
|
+
]);
|
|
24
28
|
if (!existsSync(join(basePath, ".gsd"))) {
|
|
25
29
|
ctx.ui.notify("No .gsd/ directory found. Run /gsd to start.", "info");
|
|
26
30
|
return;
|
|
@@ -35,6 +39,7 @@ export function registerShortcuts(pi: ExtensionAPI): void {
|
|
|
35
39
|
};
|
|
36
40
|
|
|
37
41
|
const openNotificationsOverlay = async (ctx: ExtensionContext) => {
|
|
42
|
+
const { GSDNotificationOverlay } = await import("../notification-overlay.js");
|
|
38
43
|
await ctx.ui.custom<boolean>(
|
|
39
44
|
(tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done(true)),
|
|
40
45
|
{
|
|
@@ -51,12 +56,13 @@ export function registerShortcuts(pi: ExtensionAPI): void {
|
|
|
51
56
|
};
|
|
52
57
|
|
|
53
58
|
const openParallelOverlay = async (ctx: ExtensionContext) => {
|
|
54
|
-
const basePath =
|
|
59
|
+
const basePath = await getProjectRoot();
|
|
55
60
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
56
61
|
if (!existsSync(parallelDir)) {
|
|
57
62
|
ctx.ui.notify("No parallel workers found. Run /gsd parallel start first.", "info");
|
|
58
63
|
return;
|
|
59
64
|
}
|
|
65
|
+
const { ParallelMonitorOverlay } = await import("../parallel-monitor-overlay.js");
|
|
60
66
|
await ctx.ui.custom<boolean>(
|
|
61
67
|
(tui, theme, _kb, done) => new ParallelMonitorOverlay(tui, theme, () => done(true), basePath),
|
|
62
68
|
{
|