@opengsd/gsd-pi 1.0.2-dev.867e002 → 1.0.2-dev.88c4dc5
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/dist/onboarding.js +22 -3
- package/dist/resource-loader.js +3 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/context7/index.js +12 -2
- package/dist/resources/extensions/get-secrets-from-user.js +16 -16
- package/dist/resources/extensions/google-cli/index.js +30 -0
- package/dist/resources/extensions/google-cli/models.js +55 -0
- package/dist/resources/extensions/google-cli/package.json +11 -0
- package/dist/resources/extensions/google-cli/readiness.js +12 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
- package/dist/resources/extensions/gsd/auto/loop.js +62 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +37 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +21 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/auto.js +6 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
- package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
- package/dist/resources/extensions/gsd/commands-usage.js +105 -1
- package/dist/resources/extensions/gsd/config-overlay.js +20 -14
- package/dist/resources/extensions/gsd/context-overlay.js +22 -16
- package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
- package/dist/resources/extensions/gsd/doctor.js +6 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +5 -6
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
- package/dist/resources/extensions/gsd/preferences.js +14 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -3
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/repository-registry.js +3 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +11 -4
- package/dist/resources/extensions/gsd/skill-activation.js +233 -0
- package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
- package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
- package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
- package/dist/resources/extensions/gsd/skill-scope.js +52 -0
- package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
- package/dist/resources/extensions/gsd/skills.js +60 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
- package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
- package/dist/resources/extensions/gsd/vision-ask.js +22 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
- package/dist/resources/extensions/search-the-web/native-search.js +57 -8
- package/dist/resources/extensions/shared/confirm-ui.js +9 -6
- package/dist/resources/extensions/shared/dialog-frame.js +42 -0
- package/dist/resources/extensions/shared/interview-ui.js +42 -30
- package/dist/resources/extensions/shared/next-action-ui.js +6 -6
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/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 +4 -4
- package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-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/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.test.js +5 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +7 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +8 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/dist/workflow.test.js +1 -0
- package/packages/contracts/dist/workflow.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +28 -5
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.js +6 -0
- package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -59
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +21 -72
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +50 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
- package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -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/package.json +1 -1
- package/packages/pi-coding-agent/README.md +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/context7/index.ts +15 -2
- package/src/resources/extensions/get-secrets-from-user.ts +17 -16
- package/src/resources/extensions/google-cli/index.ts +34 -0
- package/src/resources/extensions/google-cli/models.ts +57 -0
- package/src/resources/extensions/google-cli/package.json +11 -0
- package/src/resources/extensions/google-cli/readiness.ts +15 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
- package/src/resources/extensions/gsd/auto/loop.ts +74 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +46 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +43 -14
- package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/auto.ts +6 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
- package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
- package/src/resources/extensions/gsd/commands-usage.ts +110 -5
- package/src/resources/extensions/gsd/config-overlay.ts +19 -16
- package/src/resources/extensions/gsd/context-overlay.ts +24 -19
- package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +6 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +5 -6
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
- package/src/resources/extensions/gsd/preferences.ts +17 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -3
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/repository-registry.ts +3 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -4
- package/src/resources/extensions/gsd/skill-activation.ts +292 -0
- package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
- package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
- package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
- package/src/resources/extensions/gsd/skill-scope.ts +63 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
- package/src/resources/extensions/gsd/skills.ts +75 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
- package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
- package/src/resources/extensions/gsd/vision-ask.ts +28 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
- package/src/resources/extensions/search-the-web/native-search.ts +60 -8
- package/src/resources/extensions/shared/confirm-ui.ts +8 -12
- package/src/resources/extensions/shared/dialog-frame.ts +71 -0
- package/src/resources/extensions/shared/interview-ui.ts +43 -42
- package/src/resources/extensions/shared/next-action-ui.ts +6 -6
- package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → PkhJfy4kKo4yUHj1wY7_q}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → PkhJfy4kKo4yUHj1wY7_q}/_ssgManifest.js +0 -0
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
//
|
|
14
14
|
// Phased rollout tracking:
|
|
15
15
|
// - Phase 1 (this PR): schema + manifests + coverage test.
|
|
16
|
+
// - Phase 1b (skill token savings): skills policy wired via skill-scope.ts
|
|
17
|
+
// and setVisibleSkills(); allowlists derived from skill-manifest.ts.
|
|
16
18
|
// - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
|
|
17
19
|
// unit type (e.g. reassess-roadmap) as the pilot.
|
|
18
20
|
// - Phase 3: migrate remaining unit types, tighten manifests per
|
|
@@ -60,11 +62,18 @@ export const ARTIFACT_KEYS = [
|
|
|
60
62
|
"templates",
|
|
61
63
|
];
|
|
62
64
|
// ─── Manifests ────────────────────────────────────────────────────────────
|
|
63
|
-
// Phase 1 policy:
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
// Phase 1 policy: skills policy is derived from skill-manifest.ts allowlists
|
|
66
|
+
// via `skillPolicyForUnit()`; units without an allowlist keep mode "all".
|
|
67
|
+
// Explicit mode "none" remains for lightweight config units.
|
|
68
|
+
import { resolveSkillManifest } from "./skill-manifest.js";
|
|
69
|
+
/** Derive skills policy from skill-manifest allowlists; default to full catalog. */
|
|
70
|
+
function skillPolicyForUnit(unitType) {
|
|
71
|
+
const allowlist = resolveSkillManifest(unitType);
|
|
72
|
+
if (allowlist) {
|
|
73
|
+
return { mode: "allowlist", skills: allowlist };
|
|
74
|
+
}
|
|
75
|
+
return { mode: "all" };
|
|
76
|
+
}
|
|
68
77
|
const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
|
|
69
78
|
const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
|
|
70
79
|
const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
|
|
@@ -136,7 +145,7 @@ export const KNOWN_UNIT_TYPES = [
|
|
|
136
145
|
export const UNIT_MANIFESTS = {
|
|
137
146
|
// ─── Milestone-scoped ────────────────────────────────────────────────
|
|
138
147
|
"research-milestone": {
|
|
139
|
-
skills:
|
|
148
|
+
skills: skillPolicyForUnit("research-milestone"),
|
|
140
149
|
knowledge: "full",
|
|
141
150
|
memory: "prompt-relevant",
|
|
142
151
|
codebaseMap: true,
|
|
@@ -153,7 +162,7 @@ export const UNIT_MANIFESTS = {
|
|
|
153
162
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
154
163
|
},
|
|
155
164
|
"plan-milestone": {
|
|
156
|
-
skills:
|
|
165
|
+
skills: skillPolicyForUnit("plan-milestone"),
|
|
157
166
|
knowledge: "full",
|
|
158
167
|
memory: "prompt-relevant",
|
|
159
168
|
codebaseMap: true,
|
|
@@ -168,7 +177,7 @@ export const UNIT_MANIFESTS = {
|
|
|
168
177
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
169
178
|
},
|
|
170
179
|
"discuss-milestone": {
|
|
171
|
-
skills:
|
|
180
|
+
skills: skillPolicyForUnit("discuss-milestone"),
|
|
172
181
|
knowledge: "full",
|
|
173
182
|
memory: "prompt-relevant",
|
|
174
183
|
codebaseMap: true,
|
|
@@ -183,7 +192,7 @@ export const UNIT_MANIFESTS = {
|
|
|
183
192
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
184
193
|
},
|
|
185
194
|
"validate-milestone": {
|
|
186
|
-
skills:
|
|
195
|
+
skills: skillPolicyForUnit("validate-milestone"),
|
|
187
196
|
knowledge: "scoped",
|
|
188
197
|
memory: "prompt-relevant",
|
|
189
198
|
codebaseMap: false,
|
|
@@ -200,7 +209,7 @@ export const UNIT_MANIFESTS = {
|
|
|
200
209
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
201
210
|
},
|
|
202
211
|
"complete-milestone": {
|
|
203
|
-
skills:
|
|
212
|
+
skills: skillPolicyForUnit("complete-milestone"),
|
|
204
213
|
knowledge: "scoped",
|
|
205
214
|
memory: "prompt-relevant",
|
|
206
215
|
codebaseMap: false,
|
|
@@ -221,7 +230,7 @@ export const UNIT_MANIFESTS = {
|
|
|
221
230
|
},
|
|
222
231
|
// ─── Slice-scoped ────────────────────────────────────────────────────
|
|
223
232
|
"research-slice": {
|
|
224
|
-
skills:
|
|
233
|
+
skills: skillPolicyForUnit("research-slice"),
|
|
225
234
|
knowledge: "full",
|
|
226
235
|
memory: "prompt-relevant",
|
|
227
236
|
codebaseMap: true,
|
|
@@ -238,7 +247,7 @@ export const UNIT_MANIFESTS = {
|
|
|
238
247
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
239
248
|
},
|
|
240
249
|
"plan-slice": {
|
|
241
|
-
skills:
|
|
250
|
+
skills: skillPolicyForUnit("plan-slice"),
|
|
242
251
|
knowledge: "full",
|
|
243
252
|
memory: "prompt-relevant",
|
|
244
253
|
codebaseMap: true,
|
|
@@ -256,7 +265,7 @@ export const UNIT_MANIFESTS = {
|
|
|
256
265
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
257
266
|
},
|
|
258
267
|
"refine-slice": {
|
|
259
|
-
skills:
|
|
268
|
+
skills: skillPolicyForUnit("refine-slice"),
|
|
260
269
|
knowledge: "scoped",
|
|
261
270
|
memory: "prompt-relevant",
|
|
262
271
|
codebaseMap: true,
|
|
@@ -274,7 +283,7 @@ export const UNIT_MANIFESTS = {
|
|
|
274
283
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
275
284
|
},
|
|
276
285
|
"replan-slice": {
|
|
277
|
-
skills:
|
|
286
|
+
skills: skillPolicyForUnit("replan-slice"),
|
|
278
287
|
knowledge: "scoped",
|
|
279
288
|
memory: "prompt-relevant",
|
|
280
289
|
codebaseMap: true,
|
|
@@ -289,7 +298,7 @@ export const UNIT_MANIFESTS = {
|
|
|
289
298
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
290
299
|
},
|
|
291
300
|
"complete-slice": {
|
|
292
|
-
skills:
|
|
301
|
+
skills: skillPolicyForUnit("complete-slice"),
|
|
293
302
|
knowledge: "scoped",
|
|
294
303
|
memory: "prompt-relevant",
|
|
295
304
|
codebaseMap: false,
|
|
@@ -310,7 +319,7 @@ export const UNIT_MANIFESTS = {
|
|
|
310
319
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
311
320
|
},
|
|
312
321
|
"reassess-roadmap": {
|
|
313
|
-
skills:
|
|
322
|
+
skills: skillPolicyForUnit("reassess-roadmap"),
|
|
314
323
|
knowledge: "scoped",
|
|
315
324
|
memory: "critical-only",
|
|
316
325
|
codebaseMap: false,
|
|
@@ -326,7 +335,7 @@ export const UNIT_MANIFESTS = {
|
|
|
326
335
|
},
|
|
327
336
|
// ─── Task-scoped ─────────────────────────────────────────────────────
|
|
328
337
|
"execute-task": {
|
|
329
|
-
skills:
|
|
338
|
+
skills: skillPolicyForUnit("execute-task"),
|
|
330
339
|
knowledge: "scoped",
|
|
331
340
|
memory: "prompt-relevant",
|
|
332
341
|
codebaseMap: true,
|
|
@@ -341,7 +350,7 @@ export const UNIT_MANIFESTS = {
|
|
|
341
350
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
342
351
|
},
|
|
343
352
|
"reactive-execute": {
|
|
344
|
-
skills:
|
|
353
|
+
skills: skillPolicyForUnit("reactive-execute"),
|
|
345
354
|
knowledge: "scoped",
|
|
346
355
|
memory: "prompt-relevant",
|
|
347
356
|
codebaseMap: true,
|
|
@@ -357,7 +366,7 @@ export const UNIT_MANIFESTS = {
|
|
|
357
366
|
},
|
|
358
367
|
// ─── Ancillary units ─────────────────────────────────────────────────
|
|
359
368
|
"run-uat": {
|
|
360
|
-
skills:
|
|
369
|
+
skills: skillPolicyForUnit("run-uat"),
|
|
361
370
|
knowledge: "critical-only",
|
|
362
371
|
memory: "critical-only",
|
|
363
372
|
codebaseMap: false,
|
|
@@ -372,7 +381,7 @@ export const UNIT_MANIFESTS = {
|
|
|
372
381
|
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
373
382
|
},
|
|
374
383
|
"gate-evaluate": {
|
|
375
|
-
skills:
|
|
384
|
+
skills: skillPolicyForUnit("gate-evaluate"),
|
|
376
385
|
knowledge: "critical-only",
|
|
377
386
|
memory: "critical-only",
|
|
378
387
|
codebaseMap: false,
|
|
@@ -389,7 +398,7 @@ export const UNIT_MANIFESTS = {
|
|
|
389
398
|
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
390
399
|
},
|
|
391
400
|
"rewrite-docs": {
|
|
392
|
-
skills:
|
|
401
|
+
skills: skillPolicyForUnit("rewrite-docs"),
|
|
393
402
|
knowledge: "scoped",
|
|
394
403
|
memory: "prompt-relevant",
|
|
395
404
|
codebaseMap: true,
|
|
@@ -404,7 +413,7 @@ export const UNIT_MANIFESTS = {
|
|
|
404
413
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
405
414
|
},
|
|
406
415
|
"triage-captures": {
|
|
407
|
-
skills:
|
|
416
|
+
skills: skillPolicyForUnit("triage-captures"),
|
|
408
417
|
knowledge: "scoped",
|
|
409
418
|
memory: "prompt-relevant",
|
|
410
419
|
codebaseMap: false,
|
|
@@ -419,7 +428,7 @@ export const UNIT_MANIFESTS = {
|
|
|
419
428
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
420
429
|
},
|
|
421
430
|
"quick-task": {
|
|
422
|
-
skills:
|
|
431
|
+
skills: skillPolicyForUnit("quick-task"),
|
|
423
432
|
knowledge: "full",
|
|
424
433
|
memory: "prompt-relevant",
|
|
425
434
|
codebaseMap: true,
|
|
@@ -456,7 +465,7 @@ export const UNIT_MANIFESTS = {
|
|
|
456
465
|
// discussion runs before any milestone exists, so milestone artifacts are
|
|
457
466
|
// not loaded. Keeps templates available for PROJECT.md scaffolding.
|
|
458
467
|
"discuss-project": {
|
|
459
|
-
skills:
|
|
468
|
+
skills: skillPolicyForUnit("discuss-project"),
|
|
460
469
|
knowledge: "scoped",
|
|
461
470
|
memory: "prompt-relevant",
|
|
462
471
|
codebaseMap: true,
|
|
@@ -473,7 +482,7 @@ export const UNIT_MANIFESTS = {
|
|
|
473
482
|
// discuss-requirements: REQUIREMENTS.md interview. PROJECT.md is the
|
|
474
483
|
// primary context input; templates carry the requirements format.
|
|
475
484
|
"discuss-requirements": {
|
|
476
|
-
skills:
|
|
485
|
+
skills: skillPolicyForUnit("discuss-requirements"),
|
|
477
486
|
knowledge: "scoped",
|
|
478
487
|
memory: "prompt-relevant",
|
|
479
488
|
codebaseMap: true,
|
|
@@ -509,7 +518,7 @@ export const UNIT_MANIFESTS = {
|
|
|
509
518
|
// planning-dispatch policy to dispatch them. PROJECT.md + REQUIREMENTS.md
|
|
510
519
|
// give the orchestrator the framing context.
|
|
511
520
|
"research-project": {
|
|
512
|
-
skills:
|
|
521
|
+
skills: skillPolicyForUnit("research-project"),
|
|
513
522
|
knowledge: "scoped",
|
|
514
523
|
memory: "prompt-relevant",
|
|
515
524
|
codebaseMap: true,
|
|
@@ -29,7 +29,7 @@ function extractTextFromMessage(msg) {
|
|
|
29
29
|
}
|
|
30
30
|
return parts.join("\n");
|
|
31
31
|
}
|
|
32
|
-
function lastAssistantText(messages) {
|
|
32
|
+
export function lastAssistantText(messages) {
|
|
33
33
|
if (!Array.isArray(messages))
|
|
34
34
|
return "";
|
|
35
35
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural-language openers for milestone discussion.
|
|
3
|
+
*
|
|
4
|
+
* Keep these short and conversational. They are often the user's first prompt
|
|
5
|
+
* when GSD starts shaping a project or milestone, so they should feel like a
|
|
6
|
+
* collaborator starting a working session rather than a form field.
|
|
7
|
+
*/
|
|
8
|
+
import { randomInt } from "node:crypto";
|
|
9
|
+
export const VISION_ASK_VARIANTS = [
|
|
10
|
+
"What are we building?",
|
|
11
|
+
"What do you want to make next?",
|
|
12
|
+
"What should this become?",
|
|
13
|
+
"What are you picturing?",
|
|
14
|
+
"Where should we take this?",
|
|
15
|
+
"What should this milestone unlock?",
|
|
16
|
+
"Tell me what you want to build.",
|
|
17
|
+
"What should GSD help you shape?",
|
|
18
|
+
];
|
|
19
|
+
export function chooseVisionAskVariant(pickIndex = randomInt) {
|
|
20
|
+
const index = pickIndex(VISION_ASK_VARIANTS.length);
|
|
21
|
+
return VISION_ASK_VARIANTS[index] ?? VISION_ASK_VARIANTS[0];
|
|
22
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
2
2
|
import { loadVisualizerData } from "./visualizer-data.js";
|
|
3
3
|
import { renderProgressView, renderDepsView, renderMetricsView, renderTimelineView, renderAgentView, renderChangelogView, renderExportView, renderKnowledgeView, renderCapturesView, renderHealthView, } from "./visualizer-views.js";
|
|
4
4
|
import { writeFileSync, mkdirSync } from "node:fs";
|
|
@@ -6,6 +6,7 @@ import { join } from "node:path";
|
|
|
6
6
|
import { writeExportFile } from "./export.js";
|
|
7
7
|
import { gsdRoot } from "./paths.js";
|
|
8
8
|
import { stripAnsi } from "../shared/mod.js";
|
|
9
|
+
import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
|
|
9
10
|
export const TAB_COUNT = 10;
|
|
10
11
|
const TAB_LABELS = [
|
|
11
12
|
"1 Progress",
|
|
@@ -440,51 +441,22 @@ export class GSDVisualizerOverlay {
|
|
|
440
441
|
}
|
|
441
442
|
// Apply scroll
|
|
442
443
|
const viewportHeight = Math.max(5, process.stdout.rows ? process.stdout.rows - 8 : 24);
|
|
443
|
-
const
|
|
444
|
-
const visibleContentRows = Math.max(1, viewportHeight - chromeHeight);
|
|
444
|
+
const visibleContentRows = Math.max(1, viewportHeight - 4);
|
|
445
445
|
this.lastVisibleRows = visibleContentRows;
|
|
446
446
|
const totalLines = content.length;
|
|
447
447
|
const maxScroll = Math.max(0, content.length - visibleContentRows);
|
|
448
448
|
this.scrollOffsets[this.activeTab] = Math.min(this.scrollOffsets[this.activeTab], maxScroll);
|
|
449
449
|
const offset = this.scrollOffsets[this.activeTab];
|
|
450
450
|
const visibleContent = content.slice(offset, offset + visibleContentRows);
|
|
451
|
-
const
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
lines.push(" ".repeat(hintPad) + hint);
|
|
451
|
+
const footer = renderKeyHints(th, ["Tab/Shift+Tab/1-9,0 switch", "/ filter", "PgUp/PgDn scroll", "? help", "esc close"], Math.max(1, width - 4));
|
|
452
|
+
const lines = renderDialogFrame(th, "GSD Visualizer", visibleContent, width, {
|
|
453
|
+
footer,
|
|
454
|
+
scroll: { offset, visibleRows: visibleContentRows, totalRows: totalLines },
|
|
455
|
+
});
|
|
457
456
|
this.cachedWidth = width;
|
|
458
457
|
this.cachedLines = lines;
|
|
459
458
|
return lines;
|
|
460
459
|
}
|
|
461
|
-
wrapInBox(inner, width, offset, visibleRows, totalLines) {
|
|
462
|
-
const th = this.theme;
|
|
463
|
-
const border = (s) => th.fg("borderAccent", s);
|
|
464
|
-
const innerWidth = width - 4;
|
|
465
|
-
const lines = [];
|
|
466
|
-
lines.push(border("\u256d" + "\u2500".repeat(width - 2) + "\u256e"));
|
|
467
|
-
// Compute scroll indicator positions
|
|
468
|
-
const scrollable = totalLines !== undefined && visibleRows !== undefined && totalLines > visibleRows;
|
|
469
|
-
let thumbStart = -1;
|
|
470
|
-
let thumbLen = 0;
|
|
471
|
-
const innerRows = inner.length;
|
|
472
|
-
if (scrollable && innerRows > 0 && totalLines > 0) {
|
|
473
|
-
thumbStart = Math.round(((offset ?? 0) / totalLines) * innerRows);
|
|
474
|
-
thumbLen = Math.max(1, Math.round((visibleRows / totalLines) * innerRows));
|
|
475
|
-
}
|
|
476
|
-
for (let i = 0; i < inner.length; i++) {
|
|
477
|
-
const line = inner[i];
|
|
478
|
-
const truncated = truncateToWidth(line, innerWidth);
|
|
479
|
-
const padWidth = Math.max(0, innerWidth - visibleWidth(truncated));
|
|
480
|
-
const rightBorder = scrollable && i >= thumbStart && i < thumbStart + thumbLen
|
|
481
|
-
? border("\u2503")
|
|
482
|
-
: border("\u2502");
|
|
483
|
-
lines.push(border("\u2502") + " " + truncated + " ".repeat(padWidth) + " " + rightBorder);
|
|
484
|
-
}
|
|
485
|
-
lines.push(border("\u2570" + "\u2500".repeat(width - 2) + "\u256f"));
|
|
486
|
-
return lines;
|
|
487
|
-
}
|
|
488
460
|
invalidate() {
|
|
489
461
|
this.cachedWidth = undefined;
|
|
490
462
|
this.cachedLines = undefined;
|
|
@@ -203,7 +203,7 @@ function validateMilestoneId(milestoneId) {
|
|
|
203
203
|
* - emits worktree-created telemetry on successful entry
|
|
204
204
|
* - notifies the caller via `ctx.notify` for every user-visible outcome
|
|
205
205
|
*/
|
|
206
|
-
export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
|
|
206
|
+
export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
207
207
|
if (!isValidMilestoneId(milestoneId)) {
|
|
208
208
|
debugLog("WorktreeLifecycle", {
|
|
209
209
|
action: "enterMilestone",
|
|
@@ -305,7 +305,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
|
|
|
305
305
|
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
306
306
|
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
307
307
|
const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
308
|
-
const mode = getIsolationMode(basePath);
|
|
308
|
+
const mode = opts.modeOverride ?? getIsolationMode(basePath);
|
|
309
309
|
if (s.isolationDegraded) {
|
|
310
310
|
if (mode === "worktree") {
|
|
311
311
|
try {
|
|
@@ -841,7 +841,8 @@ export function mergeMilestoneStandalone(deps, mctx) {
|
|
|
841
841
|
pushed: false,
|
|
842
842
|
};
|
|
843
843
|
}
|
|
844
|
-
const mode =
|
|
844
|
+
const mode = mctx.isolationModeOverride ??
|
|
845
|
+
getIsolationMode(originalBasePath || worktreeBasePath);
|
|
845
846
|
debugLog("WorktreeLifecycle", {
|
|
846
847
|
action: "mergeAndExit",
|
|
847
848
|
milestoneId,
|
|
@@ -1137,6 +1138,7 @@ export class WorktreeLifecycle {
|
|
|
1137
1138
|
originalBasePath: this.s.originalBasePath,
|
|
1138
1139
|
worktreeBasePath: this.s.basePath,
|
|
1139
1140
|
milestoneId,
|
|
1141
|
+
isolationModeOverride: this.s.strandedRecoveryIsolationMode ?? undefined,
|
|
1140
1142
|
isolationDegraded: this.s.isolationDegraded,
|
|
1141
1143
|
notify: ctx.notify,
|
|
1142
1144
|
});
|
|
@@ -1223,6 +1225,7 @@ export class WorktreeLifecycle {
|
|
|
1223
1225
|
// Rebuild GitService after merge (branch HEAD changed)
|
|
1224
1226
|
rebuildGitService(this.s, this.deps);
|
|
1225
1227
|
}
|
|
1228
|
+
this.s.strandedRecoveryIsolationMode = null;
|
|
1226
1229
|
return result;
|
|
1227
1230
|
}
|
|
1228
1231
|
// ── Removed: _mergeWorktreeMode / _mergeBranchMode bodies ────────────
|
|
@@ -1345,6 +1348,24 @@ export class WorktreeLifecycle {
|
|
|
1345
1348
|
resumeFromPausedSession(base, persistedWorktreePath) {
|
|
1346
1349
|
this.s.basePath = resolvePausedResumeBasePath(base, persistedWorktreePath);
|
|
1347
1350
|
}
|
|
1351
|
+
/**
|
|
1352
|
+
* Adopt in-progress stranded work during bootstrap.
|
|
1353
|
+
*
|
|
1354
|
+
* Unlike completed-orphan recovery, this does not merge, delete, or commit.
|
|
1355
|
+
* It only moves the live session onto the branch/worktree proven by the
|
|
1356
|
+
* audit evidence, while preserving that mode for the eventual merge.
|
|
1357
|
+
*/
|
|
1358
|
+
adoptStrandedMilestone(milestoneId, base, ctx, opts) {
|
|
1359
|
+
this.adoptSessionRoot(base);
|
|
1360
|
+
this.s.strandedRecoveryIsolationMode = opts.mode;
|
|
1361
|
+
const result = _enterMilestoneCore(this.s, this.deps, milestoneId, ctx, {
|
|
1362
|
+
modeOverride: opts.mode,
|
|
1363
|
+
});
|
|
1364
|
+
if (!result.ok) {
|
|
1365
|
+
this.s.strandedRecoveryIsolationMode = null;
|
|
1366
|
+
}
|
|
1367
|
+
return result;
|
|
1368
|
+
}
|
|
1348
1369
|
/**
|
|
1349
1370
|
* Adopt an orphan worktree for a bootstrap-time merge (ADR-016 phase 2 / B4,
|
|
1350
1371
|
* issue #5622).
|
|
@@ -12,6 +12,45 @@ export const BRAVE_TOOL_NAMES = ["search-the-web", "search_and_read"];
|
|
|
12
12
|
export const CUSTOM_SEARCH_TOOL_NAMES = ["search-the-web", "search_and_read", "google_search"];
|
|
13
13
|
/** Thinking block types that require signature validation by the API */
|
|
14
14
|
const THINKING_TYPES = new Set(["thinking", "redacted_thinking"]);
|
|
15
|
+
const NATIVE_SERVER_TOOL_USE_TYPES = new Set([
|
|
16
|
+
"server_tool_use",
|
|
17
|
+
"serverToolUse",
|
|
18
|
+
]);
|
|
19
|
+
const NATIVE_WEB_SEARCH_RESULT_TYPES = new Set([
|
|
20
|
+
"web_search_tool_result",
|
|
21
|
+
"webSearchResult",
|
|
22
|
+
]);
|
|
23
|
+
function nativeServerToolId(block) {
|
|
24
|
+
if (!NATIVE_SERVER_TOOL_USE_TYPES.has(block?.type))
|
|
25
|
+
return undefined;
|
|
26
|
+
return typeof block.id === "string" ? block.id : undefined;
|
|
27
|
+
}
|
|
28
|
+
function nativeWebSearchResultId(block) {
|
|
29
|
+
if (!NATIVE_WEB_SEARCH_RESULT_TYPES.has(block?.type))
|
|
30
|
+
return undefined;
|
|
31
|
+
const id = block.type === "webSearchResult" ? block.toolUseId : block.tool_use_id;
|
|
32
|
+
return typeof id === "string" ? id : undefined;
|
|
33
|
+
}
|
|
34
|
+
function hasCompleteNativeServerToolReplay(content) {
|
|
35
|
+
const pendingToolUseIds = new Set();
|
|
36
|
+
let sawNativeServerToolUse = false;
|
|
37
|
+
for (const block of content) {
|
|
38
|
+
const toolUseId = nativeServerToolId(block);
|
|
39
|
+
if (toolUseId !== undefined) {
|
|
40
|
+
if (pendingToolUseIds.has(toolUseId))
|
|
41
|
+
return false;
|
|
42
|
+
sawNativeServerToolUse = true;
|
|
43
|
+
pendingToolUseIds.add(toolUseId);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const resultId = nativeWebSearchResultId(block);
|
|
47
|
+
if (resultId !== undefined) {
|
|
48
|
+
if (!pendingToolUseIds.delete(resultId))
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return sawNativeServerToolUse && pendingToolUseIds.size === 0;
|
|
53
|
+
}
|
|
15
54
|
/**
|
|
16
55
|
* Providers whose Anthropic-Messages endpoint is known to accept the native
|
|
17
56
|
* `web_search_20250305` server tool. Anthropic-shaped transports NOT in this
|
|
@@ -30,6 +69,10 @@ const NATIVE_WEB_SEARCH_PROVIDERS = new Set([
|
|
|
30
69
|
"anthropic-vertex",
|
|
31
70
|
"vercel-ai-gateway",
|
|
32
71
|
]);
|
|
72
|
+
function looksLikeAnthropicModelName(modelName) {
|
|
73
|
+
const normalized = modelName.trim().toLowerCase();
|
|
74
|
+
return normalized.startsWith("claude-") || normalized.startsWith("anthropic/claude-");
|
|
75
|
+
}
|
|
33
76
|
/**
|
|
34
77
|
* True when the model is an Anthropic-shaped transport AND the provider is
|
|
35
78
|
* known to accept the native `web_search_20250305` tool. Gate both on api
|
|
@@ -74,11 +117,10 @@ export function preferBraveSearch() {
|
|
|
74
117
|
* those blocks. The Anthropic API detects the modification and rejects the
|
|
75
118
|
* request with "thinking blocks cannot be modified."
|
|
76
119
|
*
|
|
77
|
-
* Fix: Remove thinking blocks from
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* current turn regardless.
|
|
120
|
+
* Fix: Remove thinking blocks only from assistant messages that do not carry
|
|
121
|
+
* native server-tool blocks. Complete native server-tool histories can be
|
|
122
|
+
* replayed as-is; stripping thinking from those messages is itself a latest
|
|
123
|
+
* assistant message modification.
|
|
82
124
|
*/
|
|
83
125
|
export function stripThinkingFromHistory(messages) {
|
|
84
126
|
for (const msg of messages) {
|
|
@@ -87,6 +129,9 @@ export function stripThinkingFromHistory(messages) {
|
|
|
87
129
|
const content = msg.content;
|
|
88
130
|
if (!Array.isArray(content))
|
|
89
131
|
continue;
|
|
132
|
+
if (hasCompleteNativeServerToolReplay(content)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
90
135
|
msg.content = content.filter((block) => !THINKING_TYPES.has(block?.type));
|
|
91
136
|
}
|
|
92
137
|
}
|
|
@@ -152,6 +197,8 @@ export function registerNativeSearchHooks(pi) {
|
|
|
152
197
|
// The model name heuristic is needed for session restores where
|
|
153
198
|
// modelsAreEqual suppresses model_select AND the SDK doesn't pass model.
|
|
154
199
|
const eventModel = event.model;
|
|
200
|
+
const payloadModelName = typeof payload.model === "string" ? payload.model : "";
|
|
201
|
+
const payloadLooksAnthropic = payloadModelName ? looksLikeAnthropicModelName(payloadModelName) : undefined;
|
|
155
202
|
let isAnthropic;
|
|
156
203
|
if (eventModel?.api || eventModel?.provider) {
|
|
157
204
|
// Preferred path: gate on api shape + provider allowlist. Both fields
|
|
@@ -161,13 +208,15 @@ export function registerNativeSearchHooks(pi) {
|
|
|
161
208
|
isAnthropic = supportsNativeWebSearch(eventModel);
|
|
162
209
|
}
|
|
163
210
|
else if (modelSelectFired) {
|
|
164
|
-
|
|
211
|
+
// The model_select flag can be stale if the next request omits event.model
|
|
212
|
+
// after a provider switch. A concrete non-Claude payload must win so an
|
|
213
|
+
// Anthropic-only tool never leaks into OpenAI Responses requests.
|
|
214
|
+
isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
|
|
165
215
|
}
|
|
166
216
|
else {
|
|
167
217
|
// Last resort: session-restore paths where the SDK doesn't pass model.
|
|
168
218
|
// The model-name prefix is best-effort and assumes direct Anthropic.
|
|
169
|
-
|
|
170
|
-
isAnthropic = modelName.startsWith("claude-");
|
|
219
|
+
isAnthropic = payloadLooksAnthropic === true;
|
|
171
220
|
}
|
|
172
221
|
if (!isAnthropic)
|
|
173
222
|
return;
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* if (!confirmed) return textResult("Cancelled.");
|
|
16
16
|
*/
|
|
17
17
|
import { Key, matchesKey, truncateToWidth } from "@gsd/pi-tui";
|
|
18
|
+
import { renderSharedDialogFrame } from "./dialog-frame.js";
|
|
18
19
|
import { makeUI, GLYPH } from "./ui.js";
|
|
19
20
|
/**
|
|
20
21
|
* Show a themed yes/no confirmation dialog.
|
|
@@ -69,12 +70,13 @@ export async function showConfirm(ctx, opts) {
|
|
|
69
70
|
function render(width) {
|
|
70
71
|
if (cachedLines)
|
|
71
72
|
return cachedLines;
|
|
72
|
-
const
|
|
73
|
+
const contentWidth = Math.max(1, width - 4);
|
|
74
|
+
const ui = makeUI(theme, contentWidth);
|
|
73
75
|
const lines = [];
|
|
74
76
|
const push = (...rows) => { for (const r of rows)
|
|
75
77
|
lines.push(...r); };
|
|
76
|
-
push(ui.
|
|
77
|
-
const add = (s) => truncateToWidth(s,
|
|
78
|
+
push(ui.blank(), ui.subtitle(` ${opts.message}`), ui.blank());
|
|
79
|
+
const add = (s) => truncateToWidth(s, contentWidth);
|
|
78
80
|
const option = (num, label, selected) => {
|
|
79
81
|
if (selected) {
|
|
80
82
|
return add(` ${theme.fg("accent", GLYPH.cursor)} ${theme.fg("accent", `${num}. ${label}`)}`);
|
|
@@ -83,9 +85,10 @@ export async function showConfirm(ctx, opts) {
|
|
|
83
85
|
};
|
|
84
86
|
lines.push(option(1, yesLabel, cursor === 0));
|
|
85
87
|
lines.push(option(2, noLabel, cursor === 1));
|
|
86
|
-
push(ui.blank()
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
push(ui.blank());
|
|
89
|
+
const footer = ui.hints(["↑/↓ to choose", "y/n to quick-select", "enter to confirm"])[0] ?? "";
|
|
90
|
+
cachedLines = renderSharedDialogFrame(theme, opts.title, lines, width, { footer });
|
|
91
|
+
return cachedLines;
|
|
89
92
|
}
|
|
90
93
|
return {
|
|
91
94
|
render,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
2
|
+
function safeLine(text, width) {
|
|
3
|
+
return truncateToWidth(text, width, "");
|
|
4
|
+
}
|
|
5
|
+
function padVisible(text, width) {
|
|
6
|
+
const clipped = safeLine(text, width);
|
|
7
|
+
return clipped + " ".repeat(Math.max(0, width - visibleWidth(clipped)));
|
|
8
|
+
}
|
|
9
|
+
function renderTopBorder(theme, title, width, border) {
|
|
10
|
+
const trimmedTitle = title.trim();
|
|
11
|
+
if (!trimmedTitle || width < 10) {
|
|
12
|
+
return border("╭" + "─".repeat(width - 2) + "╮");
|
|
13
|
+
}
|
|
14
|
+
const safeTitle = safeLine(trimmedTitle, Math.max(0, width - 7));
|
|
15
|
+
const fill = Math.max(0, width - visibleWidth(safeTitle) - 5);
|
|
16
|
+
return border("╭─ ") + theme.bold(theme.fg("accent", safeTitle)) + border(" " + "─".repeat(fill) + "╮");
|
|
17
|
+
}
|
|
18
|
+
export function renderSharedDialogFrame(theme, title, inner, width, options = {}) {
|
|
19
|
+
if (width < 4)
|
|
20
|
+
return inner.map((line) => safeLine(line, width));
|
|
21
|
+
const paddingX = Math.max(0, options.paddingX ?? 1);
|
|
22
|
+
const contentWidth = Math.max(0, width - 2 - paddingX * 2);
|
|
23
|
+
const border = (text) => theme.fg(options.borderColor ?? "borderAccent", text);
|
|
24
|
+
const pad = " ".repeat(paddingX);
|
|
25
|
+
const lines = [renderTopBorder(theme, title, width, border)];
|
|
26
|
+
for (const line of inner) {
|
|
27
|
+
lines.push(border("│") + pad + padVisible(line, contentWidth) + pad + border("│"));
|
|
28
|
+
}
|
|
29
|
+
const footer = Array.isArray(options.footer)
|
|
30
|
+
? options.footer
|
|
31
|
+
: options.footer
|
|
32
|
+
? [options.footer]
|
|
33
|
+
: [];
|
|
34
|
+
if (footer.length > 0) {
|
|
35
|
+
lines.push(border("├" + "─".repeat(width - 2) + "┤"));
|
|
36
|
+
for (const line of footer) {
|
|
37
|
+
lines.push(border("│") + pad + padVisible(line, contentWidth) + pad + border("│"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
lines.push(border("╰" + "─".repeat(width - 2) + "╯"));
|
|
41
|
+
return lines;
|
|
42
|
+
}
|