gsd-pi 2.80.0-dev.c5f2443b3 → 2.80.0-dev.d4fc28e6b
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 +4 -2
- package/dist/cli.js +0 -19
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/templates.js +39 -8
- package/dist/resources/extensions/gsd/auto/loop.js +119 -18
- package/dist/resources/extensions/gsd/auto/phases.js +212 -135
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +41 -45
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +51 -15
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +27 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
- package/dist/resources/extensions/gsd/auto-start.js +199 -9
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +111 -1
- package/dist/resources/extensions/gsd/auto.js +95 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +49 -36
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +33 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +7 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +9 -3
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +8 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
- package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +22 -2
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
- package/dist/resources/extensions/gsd/detection.js +106 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +36 -4
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +146 -13
- package/dist/resources/extensions/gsd/guided-flow.js +129 -44
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pr-evidence.js +57 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-resolver.js +68 -21
- 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 +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +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/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +12 -8
- package/packages/contracts/package.json +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
- package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/fake-model.js +27 -0
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/index.js +8 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
- package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/fake.js +319 -0
- package/packages/pi-ai/dist/providers/fake.js.map +1 -0
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/index.ts +9 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +76 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +39 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +24 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +33 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +54 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +109 -17
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +69 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +93 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +89 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
- package/packages/pi-coding-agent/src/core/extensions/types.ts +42 -1
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/settings-manager.ts +51 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +78 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +122 -17
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +99 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +92 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -0
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/style.d.ts +41 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +158 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts +0 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +21 -16
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
- package/packages/pi-tui/src/index.ts +9 -0
- package/packages/pi-tui/src/style.ts +225 -0
- package/packages/pi-tui/src/tui.ts +23 -16
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +18 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/templates.ts +38 -8
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +151 -26
- package/src/resources/extensions/gsd/auto/phases.ts +289 -196
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +52 -44
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +57 -8
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +28 -14
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
- package/src/resources/extensions/gsd/auto-start.ts +237 -15
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +123 -0
- package/src/resources/extensions/gsd/auto.ts +110 -22
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +119 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +50 -36
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +16 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +34 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +8 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +10 -3
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +9 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
- package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +24 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
- package/src/resources/extensions/gsd/detection.ts +128 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +46 -8
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +168 -13
- package/src/resources/extensions/gsd/guided-flow.ts +150 -51
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pr-evidence.ts +63 -5
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +516 -15
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +56 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +168 -6
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +117 -7
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +40 -2
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +38 -17
- package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +37 -6
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +167 -4
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +85 -19
- package/packages/contracts/tsconfig.tsbuildinfo +0 -1
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -97
- /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
import { Type } from "@sinclair/typebox";
|
|
7
7
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
8
8
|
import { executeGsdGraph, executeMemoryCapture, executeMemoryQuery, } from "../tools/memory-tools.js";
|
|
9
|
+
function toolWorkspaceRoot(ctx) {
|
|
10
|
+
if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
|
|
11
|
+
return ctx.cwd;
|
|
12
|
+
}
|
|
13
|
+
return process.cwd();
|
|
14
|
+
}
|
|
9
15
|
export function registerMemoryTools(pi) {
|
|
10
16
|
// ─── capture_thought ────────────────────────────────────────────────────
|
|
11
17
|
pi.registerTool({
|
|
@@ -39,7 +45,7 @@ export function registerMemoryTools(pi) {
|
|
|
39
45
|
})),
|
|
40
46
|
}),
|
|
41
47
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
42
|
-
const ok = await ensureDbOpen();
|
|
48
|
+
const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
|
|
43
49
|
if (!ok) {
|
|
44
50
|
return {
|
|
45
51
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot capture memory." }],
|
|
@@ -79,7 +85,7 @@ export function registerMemoryTools(pi) {
|
|
|
79
85
|
reinforce_hits: Type.Optional(Type.Boolean({ description: "Increment hit_count on returned memories (default false)" })),
|
|
80
86
|
}),
|
|
81
87
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
82
|
-
const ok = await ensureDbOpen();
|
|
88
|
+
const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
|
|
83
89
|
if (!ok) {
|
|
84
90
|
return {
|
|
85
91
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot query memory." }],
|
|
@@ -117,7 +123,7 @@ export function registerMemoryTools(pi) {
|
|
|
117
123
|
], { description: "Only include edges with this relation type" })),
|
|
118
124
|
}),
|
|
119
125
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
120
|
-
const ok = await ensureDbOpen();
|
|
126
|
+
const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
|
|
121
127
|
if (!ok) {
|
|
122
128
|
return {
|
|
123
129
|
content: [{ type: "text", text: "Error: GSD database is not available." }],
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
// GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
|
|
2
2
|
import { Type } from "@sinclair/typebox";
|
|
3
3
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
4
|
+
function toolWorkspaceRoot(ctx) {
|
|
5
|
+
if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
|
|
6
|
+
return ctx.cwd;
|
|
7
|
+
}
|
|
8
|
+
return process.cwd();
|
|
9
|
+
}
|
|
4
10
|
export function registerQueryTools(pi) {
|
|
5
11
|
pi.registerTool({
|
|
6
12
|
name: "gsd_milestone_status",
|
|
@@ -16,7 +22,7 @@ export function registerQueryTools(pi) {
|
|
|
16
22
|
milestoneId: Type.String({ description: "Milestone ID to query (e.g. M001)" }),
|
|
17
23
|
}),
|
|
18
24
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
19
|
-
const dbAvailable = await ensureDbOpen();
|
|
25
|
+
const dbAvailable = await ensureDbOpen(toolWorkspaceRoot(_ctx));
|
|
20
26
|
if (!dbAvailable) {
|
|
21
27
|
return {
|
|
22
28
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot read milestone status." }],
|
|
@@ -41,7 +47,7 @@ export function registerQueryTools(pi) {
|
|
|
41
47
|
],
|
|
42
48
|
parameters: Type.Object({}),
|
|
43
49
|
async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
|
|
44
|
-
const dbAvailable = await ensureDbOpen();
|
|
50
|
+
const dbAvailable = await ensureDbOpen(toolWorkspaceRoot(_ctx));
|
|
45
51
|
if (!dbAvailable) {
|
|
46
52
|
return {
|
|
47
53
|
content: [{ type: "text", text: "Error: GSD database is not available. Cannot checkpoint." }],
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Registers GSD extension runtime hooks and token-saving tool policies.
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
2
6
|
import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
3
7
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
4
8
|
import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
5
|
-
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
9
|
+
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
6
10
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
7
11
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
8
12
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -19,10 +23,202 @@ import { initNotificationWidget } from "../notification-widget.js";
|
|
|
19
23
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
20
24
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
21
25
|
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
22
|
-
|
|
23
|
-
// printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
|
|
24
|
-
let isFirstSession = true;
|
|
26
|
+
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
25
27
|
let approvalQuestionAbortInFlight = false;
|
|
28
|
+
async function loadWelcomeScreenModule() {
|
|
29
|
+
const candidates = [];
|
|
30
|
+
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
31
|
+
if (gsdBinPath) {
|
|
32
|
+
candidates.push(join(dirname(gsdBinPath), "welcome-screen.js"));
|
|
33
|
+
}
|
|
34
|
+
const packageRoot = process.env.GSD_PKG_ROOT;
|
|
35
|
+
if (packageRoot) {
|
|
36
|
+
candidates.push(join(packageRoot, "dist", "welcome-screen.js"));
|
|
37
|
+
candidates.push(join(packageRoot, "src", "welcome-screen.ts"));
|
|
38
|
+
}
|
|
39
|
+
for (const candidate of candidates) {
|
|
40
|
+
try {
|
|
41
|
+
if (!existsSync(candidate))
|
|
42
|
+
continue;
|
|
43
|
+
const mod = await import(pathToFileURL(candidate).href);
|
|
44
|
+
if (typeof mod.buildWelcomeScreenLines === "function") {
|
|
45
|
+
return mod;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Try the next package layout.
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
async function installWelcomeHeader(ctx) {
|
|
55
|
+
if (!ctx.hasUI || typeof ctx.ui?.setHeader !== "function")
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
const welcome = await loadWelcomeScreenModule();
|
|
59
|
+
if (!welcome)
|
|
60
|
+
return;
|
|
61
|
+
let remoteChannel;
|
|
62
|
+
try {
|
|
63
|
+
const { resolveRemoteConfig } = await import("../../remote-questions/config.js");
|
|
64
|
+
const rc = resolveRemoteConfig();
|
|
65
|
+
if (rc)
|
|
66
|
+
remoteChannel = rc.channel;
|
|
67
|
+
}
|
|
68
|
+
catch { /* non-fatal */ }
|
|
69
|
+
ctx.ui.setHeader(() => ({
|
|
70
|
+
render(width) {
|
|
71
|
+
return welcome.buildWelcomeScreenLines({
|
|
72
|
+
version: process.env.GSD_VERSION || "0.0.0",
|
|
73
|
+
remoteChannel,
|
|
74
|
+
width,
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
invalidate() { },
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* non-fatal */
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
let deferredApprovalGate = null;
|
|
85
|
+
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
86
|
+
"gsd_exec",
|
|
87
|
+
"gsd_exec_search",
|
|
88
|
+
"gsd_resume",
|
|
89
|
+
"gsd_milestone_status",
|
|
90
|
+
"gsd_checkpoint_db",
|
|
91
|
+
"memory_query",
|
|
92
|
+
"capture_thought",
|
|
93
|
+
];
|
|
94
|
+
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
95
|
+
"ask_user_questions",
|
|
96
|
+
"bash",
|
|
97
|
+
"bg_shell",
|
|
98
|
+
"edit",
|
|
99
|
+
"glob",
|
|
100
|
+
"grep",
|
|
101
|
+
"ls",
|
|
102
|
+
"read",
|
|
103
|
+
"write",
|
|
104
|
+
];
|
|
105
|
+
const AUTO_UNIT_SCOPED_TOOLS = {
|
|
106
|
+
"research-milestone": ["gsd_summary_save", "gsd_decision_save"],
|
|
107
|
+
"plan-milestone": ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
|
|
108
|
+
"discuss-milestone": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
109
|
+
"validate-milestone": ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
|
|
110
|
+
"complete-milestone": ["gsd_complete_milestone", "subagent"],
|
|
111
|
+
"research-slice": ["gsd_summary_save", "gsd_decision_save"],
|
|
112
|
+
"plan-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
113
|
+
"refine-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
114
|
+
"replan-slice": ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
115
|
+
"complete-slice": ["gsd_slice_complete", "gsd_decision_save", "gsd_requirement_update", "subagent"],
|
|
116
|
+
"reassess-roadmap": ["gsd_reassess_roadmap"],
|
|
117
|
+
"execute-task": ["gsd_task_complete", "gsd_decision_save"],
|
|
118
|
+
"execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
|
|
119
|
+
"reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
|
|
120
|
+
"run-uat": ["gsd_summary_save"],
|
|
121
|
+
"gate-evaluate": ["gsd_save_gate_result"],
|
|
122
|
+
"rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
|
|
123
|
+
"workflow-preferences": ["gsd_summary_save"],
|
|
124
|
+
"discuss-project": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
125
|
+
"discuss-requirements": ["gsd_requirement_save", "gsd_summary_save"],
|
|
126
|
+
"research-decision": ["gsd_summary_save"],
|
|
127
|
+
"research-project": ["gsd_summary_save", "gsd_decision_save"],
|
|
128
|
+
};
|
|
129
|
+
const WORKFLOW_GSD_TOOL_NAMES = [
|
|
130
|
+
...MINIMAL_GSD_TOOL_NAMES,
|
|
131
|
+
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
132
|
+
].filter(isGsdManagedTool);
|
|
133
|
+
function isGsdManagedTool(name) {
|
|
134
|
+
return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
|
|
135
|
+
}
|
|
136
|
+
export function buildMinimalGsdToolSet(activeToolNames) {
|
|
137
|
+
const active = new Set(activeToolNames);
|
|
138
|
+
const preserved = activeToolNames.filter((name) => !isGsdManagedTool(name));
|
|
139
|
+
const minimal = MINIMAL_GSD_TOOL_NAMES.filter((name) => active.has(name));
|
|
140
|
+
return [...new Set([...preserved, ...minimal])];
|
|
141
|
+
}
|
|
142
|
+
export function buildMinimalAutoGsdToolSet(activeToolNames, unitType) {
|
|
143
|
+
const active = new Set(activeToolNames);
|
|
144
|
+
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
145
|
+
const autoBaseTools = new Set(MINIMAL_AUTO_BASE_TOOL_NAMES);
|
|
146
|
+
const preserved = activeToolNames.filter((name) => autoBaseTools.has(name));
|
|
147
|
+
const scoped = [...MINIMAL_GSD_TOOL_NAMES, ...unitTools].filter((name) => active.has(name));
|
|
148
|
+
return [...new Set([...preserved, ...scoped])];
|
|
149
|
+
}
|
|
150
|
+
export function buildMinimalGsdWorkflowToolSet(activeToolNames) {
|
|
151
|
+
const active = new Set(activeToolNames);
|
|
152
|
+
const autoBaseTools = new Set(MINIMAL_AUTO_BASE_TOOL_NAMES);
|
|
153
|
+
const preserved = activeToolNames.filter((name) => autoBaseTools.has(name));
|
|
154
|
+
const scoped = WORKFLOW_GSD_TOOL_NAMES.filter((name) => active.has(name));
|
|
155
|
+
return [...new Set([...preserved, ...scoped])];
|
|
156
|
+
}
|
|
157
|
+
export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages) {
|
|
158
|
+
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
159
|
+
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
160
|
+
if (currentCustomType === "gsd-run" ||
|
|
161
|
+
currentCustomType === "gsd-discuss" ||
|
|
162
|
+
currentCustomType === "gsd-doctor-heal" ||
|
|
163
|
+
currentCustomType === "gsd-triage") {
|
|
164
|
+
return buildMinimalGsdWorkflowToolSet(activeToolNames);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
export function isFullGsdToolSurfaceRequested() {
|
|
170
|
+
return process.env.PI_GSD_FULL_TOOLS === "1";
|
|
171
|
+
}
|
|
172
|
+
function isGeneralGsdToolScopingRequested() {
|
|
173
|
+
return process.env.PI_GSD_MINIMAL_TOOLS === "1";
|
|
174
|
+
}
|
|
175
|
+
function applyMinimalGsdToolSurface(pi) {
|
|
176
|
+
if (isFullGsdToolSurfaceRequested())
|
|
177
|
+
return;
|
|
178
|
+
const dash = getAutoRuntimeSnapshot();
|
|
179
|
+
if (dash.active && dash.currentUnit) {
|
|
180
|
+
pi.setActiveTools(buildMinimalAutoGsdToolSet(pi.getActiveTools(), dash.currentUnit.type));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!isGeneralGsdToolScopingRequested())
|
|
184
|
+
return;
|
|
185
|
+
pi.setActiveTools(buildMinimalGsdToolSet(pi.getActiveTools()));
|
|
186
|
+
}
|
|
187
|
+
export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
|
|
188
|
+
if (isFullGsdToolSurfaceRequested())
|
|
189
|
+
return null;
|
|
190
|
+
const current = pi.getActiveTools();
|
|
191
|
+
const scoped = unitType
|
|
192
|
+
? buildMinimalAutoGsdToolSet(current, unitType)
|
|
193
|
+
: buildMinimalGsdWorkflowToolSet(current);
|
|
194
|
+
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
195
|
+
const skillManifest = resolveSkillManifest(unitType);
|
|
196
|
+
const canScopeSkills = skillManifest !== null && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
197
|
+
if (!toolsChanged && !canScopeSkills) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
if (toolsChanged) {
|
|
201
|
+
pi.setActiveTools(scoped);
|
|
202
|
+
}
|
|
203
|
+
const visibleSkills = canScopeSkills ? pi.getVisibleSkills() : undefined;
|
|
204
|
+
if (canScopeSkills) {
|
|
205
|
+
pi.setVisibleSkills(skillManifest);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
tools: toolsChanged ? current : null,
|
|
209
|
+
visibleSkills,
|
|
210
|
+
restoreVisibleSkills: Boolean(canScopeSkills),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export function restoreGsdWorkflowTools(pi, savedState) {
|
|
214
|
+
if (!savedState)
|
|
215
|
+
return;
|
|
216
|
+
if (savedState.tools)
|
|
217
|
+
pi.setActiveTools(savedState.tools);
|
|
218
|
+
if (savedState.restoreVisibleSkills && pi.setVisibleSkills) {
|
|
219
|
+
pi.setVisibleSkills(savedState.visibleSkills);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
26
222
|
async function deriveGsdState(basePath) {
|
|
27
223
|
const { deriveState } = await import("../state.js");
|
|
28
224
|
return deriveState(basePath);
|
|
@@ -52,11 +248,70 @@ async function applyDisabledModelProviderPolicy(ctx) {
|
|
|
52
248
|
// Non-fatal: keep default provider visibility if preferences cannot be loaded.
|
|
53
249
|
}
|
|
54
250
|
}
|
|
55
|
-
|
|
56
|
-
|
|
251
|
+
/**
|
|
252
|
+
* Bridge `context_management.compaction_threshold_percent` from GSD preferences
|
|
253
|
+
* into the agent's runtime compaction settings (#5475). The preference is
|
|
254
|
+
* validated to (0.5, 0.95) at load time, but defense-in-depth normalization
|
|
255
|
+
* here protects against a stale or hand-edited prefs file. Calling with
|
|
256
|
+
* `undefined` clears any prior override so a removed preference does not leak.
|
|
257
|
+
*/
|
|
258
|
+
async function applyCompactionThresholdOverride(ctx) {
|
|
259
|
+
try {
|
|
260
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
261
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
262
|
+
const raw = prefs?.preferences.context_management?.compaction_threshold_percent;
|
|
263
|
+
const value = typeof raw === "number" && Number.isFinite(raw) && raw > 0 && raw < 1 ? raw : undefined;
|
|
264
|
+
ctx.setCompactionThresholdOverride(value);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Non-fatal: leave any existing override in place.
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function clearDeferredApprovalGate(basePath) {
|
|
271
|
+
if (!basePath || deferredApprovalGate?.basePath === basePath) {
|
|
272
|
+
deferredApprovalGate = null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function deferApprovalGate(gateId, basePath) {
|
|
276
|
+
deferredApprovalGate = { gateId, basePath };
|
|
277
|
+
}
|
|
278
|
+
function contextBasePath(ctx) {
|
|
279
|
+
return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
|
|
280
|
+
}
|
|
281
|
+
function activateDeferredApprovalGate(basePath) {
|
|
282
|
+
if (deferredApprovalGate?.basePath !== basePath)
|
|
283
|
+
return;
|
|
284
|
+
setPendingGate(deferredApprovalGate.gateId, basePath);
|
|
285
|
+
deferredApprovalGate = null;
|
|
286
|
+
}
|
|
287
|
+
function isContextDraftSummarySave(toolName, input) {
|
|
288
|
+
if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
|
|
289
|
+
return false;
|
|
290
|
+
if (!input || typeof input !== "object")
|
|
291
|
+
return false;
|
|
292
|
+
return input.artifact_type === "CONTEXT-DRAFT";
|
|
293
|
+
}
|
|
294
|
+
function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
|
|
295
|
+
if (deferredApprovalGate?.basePath !== basePath)
|
|
296
|
+
return { block: false };
|
|
297
|
+
if (toolName === "ask_user_questions")
|
|
298
|
+
return { block: false };
|
|
299
|
+
if (isContextDraftSummarySave(toolName, input))
|
|
300
|
+
return { block: false };
|
|
301
|
+
return {
|
|
302
|
+
block: true,
|
|
303
|
+
reason: [
|
|
304
|
+
`HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
|
|
305
|
+
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
306
|
+
`Wait for the user's answer before calling additional tools.`,
|
|
307
|
+
].join(" "),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
export function resolveNotificationStoreBasePath(basePath) {
|
|
311
|
+
return resolveWorktreeProjectRoot(basePath);
|
|
57
312
|
}
|
|
58
313
|
function initSessionNotifications(ctx) {
|
|
59
|
-
initNotificationStore(resolveNotificationStoreBasePath());
|
|
314
|
+
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
60
315
|
installNotifyInterceptor(ctx);
|
|
61
316
|
initNotificationWidget(ctx);
|
|
62
317
|
}
|
|
@@ -90,73 +345,58 @@ async function writeContextModeCompactionSnapshot(basePath) {
|
|
|
90
345
|
}
|
|
91
346
|
export function registerHooks(pi, ecosystemHandlers) {
|
|
92
347
|
pi.on("session_start", async (_event, ctx) => {
|
|
348
|
+
const basePath = contextBasePath(ctx);
|
|
93
349
|
initSessionNotifications(ctx);
|
|
94
350
|
if (!isAutoActive()) {
|
|
95
351
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
96
352
|
initHealthWidget(ctx);
|
|
97
353
|
}
|
|
98
|
-
resetWriteGateState(
|
|
354
|
+
resetWriteGateState(basePath);
|
|
99
355
|
resetToolCallLoopGuard();
|
|
100
356
|
approvalQuestionAbortInFlight = false;
|
|
357
|
+
clearDeferredApprovalGate();
|
|
101
358
|
await resetAskUserQuestionsTurnCache();
|
|
102
359
|
await syncServiceTierStatus(ctx);
|
|
103
360
|
await applyDisabledModelProviderPolicy(ctx);
|
|
361
|
+
await applyCompactionThresholdOverride(ctx);
|
|
104
362
|
// Skip MCP auto-prep when running inside an auto-worktree (see session_switch below).
|
|
105
363
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
106
|
-
if (!isInAutoWorktree(
|
|
364
|
+
if (!isInAutoWorktree(basePath)) {
|
|
107
365
|
const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
|
|
108
|
-
prepareWorkflowMcpForProject(ctx,
|
|
366
|
+
prepareWorkflowMcpForProject(ctx, basePath);
|
|
109
367
|
}
|
|
110
368
|
// Apply show_token_cost preference (#1515)
|
|
111
369
|
try {
|
|
112
370
|
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
113
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
371
|
+
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
114
372
|
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
115
373
|
}
|
|
116
374
|
catch { /* non-fatal */ }
|
|
117
|
-
|
|
118
|
-
isFirstSession = false;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
try {
|
|
122
|
-
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
123
|
-
if (gsdBinPath) {
|
|
124
|
-
const { dirname } = await import("node:path");
|
|
125
|
-
const { printWelcomeScreen } = await import(join(dirname(gsdBinPath), "welcome-screen.js"));
|
|
126
|
-
let remoteChannel;
|
|
127
|
-
try {
|
|
128
|
-
const { resolveRemoteConfig } = await import("../../remote-questions/config.js");
|
|
129
|
-
const rc = resolveRemoteConfig();
|
|
130
|
-
if (rc)
|
|
131
|
-
remoteChannel = rc.channel;
|
|
132
|
-
}
|
|
133
|
-
catch { /* non-fatal */ }
|
|
134
|
-
printWelcomeScreen({ version: process.env.GSD_VERSION || "0.0.0", remoteChannel });
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch { /* non-fatal */ }
|
|
138
|
-
}
|
|
375
|
+
await installWelcomeHeader(ctx);
|
|
139
376
|
await loadToolApiKeysForSession();
|
|
140
377
|
if (isAutoActive()) {
|
|
141
378
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
142
379
|
}
|
|
143
380
|
});
|
|
144
381
|
pi.on("session_switch", async (_event, ctx) => {
|
|
382
|
+
const basePath = contextBasePath(ctx);
|
|
145
383
|
initSessionNotifications(ctx);
|
|
146
|
-
resetWriteGateState(
|
|
384
|
+
resetWriteGateState(basePath);
|
|
147
385
|
resetToolCallLoopGuard();
|
|
386
|
+
clearDeferredApprovalGate();
|
|
148
387
|
await resetAskUserQuestionsTurnCache();
|
|
149
|
-
clearDiscussionFlowState(
|
|
388
|
+
clearDiscussionFlowState(basePath);
|
|
150
389
|
await syncServiceTierStatus(ctx);
|
|
151
390
|
await applyDisabledModelProviderPolicy(ctx);
|
|
391
|
+
await applyCompactionThresholdOverride(ctx);
|
|
152
392
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
153
393
|
// already has .mcp.json from createAutoWorktree, and re-running the writer
|
|
154
394
|
// post-chdir rewrites the file mid-run (non-idempotent due to cwd-relative
|
|
155
395
|
// CLI path resolution), dirtying the tree and breaking the milestone merge.
|
|
156
396
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
157
|
-
if (!isInAutoWorktree(
|
|
397
|
+
if (!isInAutoWorktree(basePath)) {
|
|
158
398
|
const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
|
|
159
|
-
prepareWorkflowMcpForProject(ctx,
|
|
399
|
+
prepareWorkflowMcpForProject(ctx, basePath);
|
|
160
400
|
}
|
|
161
401
|
await loadToolApiKeysForSession();
|
|
162
402
|
if (!isAutoActive()) {
|
|
@@ -168,10 +408,11 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
168
408
|
}
|
|
169
409
|
});
|
|
170
410
|
pi.on("before_agent_start", async (event, ctx) => {
|
|
411
|
+
applyMinimalGsdToolSurface(pi);
|
|
171
412
|
// Wait for ecosystem loader to finish (no-op after first turn).
|
|
172
413
|
const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
|
|
173
414
|
await getEcosystemReadyPromise();
|
|
174
|
-
const beforeAgentBasePath =
|
|
415
|
+
const beforeAgentBasePath = contextBasePath(ctx);
|
|
175
416
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
176
417
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
177
418
|
markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
@@ -180,13 +421,14 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
180
421
|
markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
181
422
|
clearPendingGate(beforeAgentBasePath);
|
|
182
423
|
}
|
|
424
|
+
clearDeferredApprovalGate(beforeAgentBasePath);
|
|
183
425
|
// GSD's own context injection (existing behavior — unchanged).
|
|
184
426
|
const { buildBeforeAgentStartResult } = await import("./system-context.js");
|
|
185
427
|
const gsdResult = await buildBeforeAgentStartResult(event, ctx);
|
|
186
428
|
// Refresh the snapshot used by ecosystem getPhase()/getActiveUnit().
|
|
187
429
|
// deriveState has its own ~100ms cache so this is cheap on repeat calls.
|
|
188
430
|
try {
|
|
189
|
-
const state = await deriveGsdState(
|
|
431
|
+
const state = await deriveGsdState(beforeAgentBasePath);
|
|
190
432
|
updateSnapshot(state);
|
|
191
433
|
}
|
|
192
434
|
catch {
|
|
@@ -223,7 +465,12 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
223
465
|
resetToolCallLoopGuard();
|
|
224
466
|
await resetAskUserQuestionsTurnCache();
|
|
225
467
|
const { handleAgentEnd } = await import("./agent-end-recovery.js");
|
|
226
|
-
|
|
468
|
+
try {
|
|
469
|
+
await handleAgentEnd(pi, event, ctx);
|
|
470
|
+
}
|
|
471
|
+
finally {
|
|
472
|
+
activateDeferredApprovalGate(contextBasePath(ctx));
|
|
473
|
+
}
|
|
227
474
|
});
|
|
228
475
|
// Squash-merge quick-task branch back to the original branch after the
|
|
229
476
|
// agent turn completes (#2668). cleanupQuickBranch is a no-op when no
|
|
@@ -237,8 +484,8 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
237
484
|
// Best-effort: don't break the turn lifecycle if cleanup fails.
|
|
238
485
|
}
|
|
239
486
|
});
|
|
240
|
-
pi.on("session_before_compact", async () => {
|
|
241
|
-
const basePath =
|
|
487
|
+
pi.on("session_before_compact", async (_event, ctx) => {
|
|
488
|
+
const basePath = contextBasePath(ctx);
|
|
242
489
|
// Context Mode is default-on. Write the resumable snapshot before any
|
|
243
490
|
// active-auto cancel return so auto sessions still leave re-entry context.
|
|
244
491
|
await writeContextModeCompactionSnapshot(basePath);
|
|
@@ -302,7 +549,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
302
549
|
if (!unitType) {
|
|
303
550
|
try {
|
|
304
551
|
const { getPendingDeepProjectSetupUnitForContext } = await import("../guided-flow.js");
|
|
305
|
-
const pending = getPendingDeepProjectSetupUnitForContext(ctx,
|
|
552
|
+
const pending = getPendingDeepProjectSetupUnitForContext(ctx, contextBasePath(ctx));
|
|
306
553
|
unitType = pending?.unitType;
|
|
307
554
|
unitId = pending?.unitId;
|
|
308
555
|
}
|
|
@@ -311,7 +558,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
311
558
|
}
|
|
312
559
|
}
|
|
313
560
|
if (!unitType) {
|
|
314
|
-
const milestoneId = await getDiscussionMilestoneIdFor(
|
|
561
|
+
const milestoneId = await getDiscussionMilestoneIdFor(contextBasePath(ctx));
|
|
315
562
|
if (milestoneId) {
|
|
316
563
|
unitType = "discuss-milestone";
|
|
317
564
|
unitId = milestoneId;
|
|
@@ -321,11 +568,12 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
321
568
|
return;
|
|
322
569
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
323
570
|
if (gateId)
|
|
324
|
-
|
|
571
|
+
deferApprovalGate(gateId, contextBasePath(ctx));
|
|
325
572
|
approvalQuestionAbortInFlight = true;
|
|
326
573
|
ctx.ui.notify(`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`, "info");
|
|
327
|
-
// The pending gate
|
|
328
|
-
//
|
|
574
|
+
// The durable pending gate is activated at agent_end so same-turn
|
|
575
|
+
// CONTEXT-DRAFT persistence can finish after the text boundary streams.
|
|
576
|
+
// The tool_call hook below still blocks non-draft tools in this turn.
|
|
329
577
|
// Aborting mid-stream eats the model's question text on external CLI
|
|
330
578
|
// providers (Claude Code SDK) because lastTextContent isn't populated
|
|
331
579
|
// from in-flight builder state — the user only ever sees "Claude Code
|
|
@@ -335,7 +583,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
335
583
|
const { isParallelActive, shutdownParallel } = await import("../parallel-orchestrator.js");
|
|
336
584
|
if (isParallelActive()) {
|
|
337
585
|
try {
|
|
338
|
-
await shutdownParallel(
|
|
586
|
+
await shutdownParallel(contextBasePath(ctx));
|
|
339
587
|
}
|
|
340
588
|
catch {
|
|
341
589
|
// best-effort
|
|
@@ -348,14 +596,17 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
348
596
|
saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
|
|
349
597
|
}
|
|
350
598
|
});
|
|
351
|
-
pi.on("tool_call", async (event) => {
|
|
352
|
-
const discussionBasePath =
|
|
599
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
600
|
+
const discussionBasePath = contextBasePath(ctx);
|
|
353
601
|
const toolName = canonicalToolName(event.toolName);
|
|
354
602
|
// ── Loop guard: block repeated identical tool calls ──
|
|
355
603
|
const loopCheck = checkToolCallLoop(toolName, event.input);
|
|
356
604
|
if (loopCheck.block) {
|
|
357
605
|
return { block: true, reason: loopCheck.reason };
|
|
358
606
|
}
|
|
607
|
+
const deferredGateGuard = shouldBlockDeferredApprovalTool(toolName, event.input, discussionBasePath);
|
|
608
|
+
if (deferredGateGuard.block)
|
|
609
|
+
return deferredGateGuard;
|
|
359
610
|
// ── Discussion gate enforcement: track pending gate questions ─────────
|
|
360
611
|
// Only gate-shaped ask_user_questions calls should block execution.
|
|
361
612
|
// The gate stays pending until the user selects the approval option.
|
|
@@ -432,6 +683,16 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
432
683
|
return planningGuard;
|
|
433
684
|
}
|
|
434
685
|
}
|
|
686
|
+
// ── Worktree-isolation write gate (#5199) ────────────────────────────
|
|
687
|
+
// Block planning-write tools from landing code at the project root when
|
|
688
|
+
// git.isolation=worktree but auto-mode hasn't created the milestone
|
|
689
|
+
// worktree yet. Without this, writes silently orphan outside git history.
|
|
690
|
+
if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
|
|
691
|
+
const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
|
|
692
|
+
const wtGuard = shouldBlockWorktreeWrite(event.toolName, event.input.path, wtBasePath, isAutoActive(), dash.currentUnit?.type);
|
|
693
|
+
if (wtGuard.block)
|
|
694
|
+
return wtGuard;
|
|
695
|
+
}
|
|
435
696
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
436
697
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
437
698
|
if (isToolCallEventType("write", event)) {
|
|
@@ -484,7 +745,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
484
745
|
}
|
|
485
746
|
}
|
|
486
747
|
});
|
|
487
|
-
pi.on("tool_result", async (event) => {
|
|
748
|
+
pi.on("tool_result", async (event, ctx) => {
|
|
488
749
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
489
750
|
markToolEnd(event.toolCallId);
|
|
490
751
|
}
|
|
@@ -504,7 +765,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
504
765
|
const toolName = canonicalToolName(event.toolName);
|
|
505
766
|
if (toolName !== "ask_user_questions")
|
|
506
767
|
return;
|
|
507
|
-
const basePath =
|
|
768
|
+
const basePath = contextBasePath(ctx);
|
|
508
769
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
509
770
|
const queueActive = isQueuePhaseActive(basePath);
|
|
510
771
|
const details = event.details;
|
|
@@ -706,8 +967,22 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
706
967
|
// Tool set adaptation hook (ADR-005 Phase 4)
|
|
707
968
|
// Extensions can override tool set after model selection by returning { toolNames: [...] }
|
|
708
969
|
// Return undefined to let the built-in provider compatibility filtering proceed.
|
|
709
|
-
pi.on("adjust_tool_set", async (
|
|
710
|
-
|
|
970
|
+
pi.on("adjust_tool_set", async (event) => {
|
|
971
|
+
if (isFullGsdToolSurfaceRequested())
|
|
972
|
+
return undefined;
|
|
973
|
+
const removed = new Set(event.filteredTools);
|
|
974
|
+
const providerCompatible = event.activeToolNames.filter((name) => !removed.has(name));
|
|
975
|
+
const requestScoped = buildRequestScopedGsdToolSet(providerCompatible, event.requestCustomMessages);
|
|
976
|
+
if (requestScoped) {
|
|
977
|
+
return { toolNames: requestScoped };
|
|
978
|
+
}
|
|
979
|
+
const dash = getAutoRuntimeSnapshot();
|
|
980
|
+
if (dash.active && dash.currentUnit) {
|
|
981
|
+
return { toolNames: buildMinimalAutoGsdToolSet(providerCompatible, dash.currentUnit.type) };
|
|
982
|
+
}
|
|
983
|
+
if (isGeneralGsdToolScopingRequested()) {
|
|
984
|
+
return { toolNames: buildMinimalGsdToolSet(providerCompatible) };
|
|
985
|
+
}
|
|
711
986
|
return undefined;
|
|
712
987
|
});
|
|
713
988
|
}
|