gsd-pi 2.75.0 → 2.76.0
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 +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/onboarding.d.ts +20 -1
- package/dist/onboarding.js +99 -39
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -4
- package/dist/resources/extensions/gsd/auto/phases.js +72 -47
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +120 -14
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +14 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +190 -46
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
- package/dist/resources/extensions/gsd/auto.js +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +128 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-memory.js +462 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +1 -0
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +27 -3
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +490 -32
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
- package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
- package/dist/resources/extensions/gsd/memory-relations.js +189 -0
- package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
- package/dist/resources/extensions/gsd/memory-store.js +299 -6
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -6
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +105 -8
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +13 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +47 -3
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
- package/dist/resources/extensions/gsd/uok/flags.js +7 -7
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
- package/dist/resources/extensions/search-the-web/native-search.js +13 -2
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +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/static/chunks/2826.e59e8578e2e28639.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{page-7115e62689b5fd84.js → page-151349214571e2b6.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +8 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +207 -71
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/mcp-server.test.ts +40 -4
- package/packages/mcp-server/src/server.ts +12 -10
- package/packages/mcp-server/src/session-manager.ts +10 -3
- package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
- package/packages/mcp-server/src/workflow-tools.ts +228 -75
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +3 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.js +0 -153
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +17 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +18 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
- package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.js +47 -0
- package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
- package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +2 -2
- package/packages/pi-ai/scripts/generate-models.ts +50 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/models/capability-patches.ts +5 -2
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
- package/packages/pi-ai/src/models/generated/groq.ts +0 -153
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +17 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +19 -1
- package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
- package/packages/pi-ai/src/providers/api-family.ts +57 -0
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +14 -4
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
- package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -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.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -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/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +39 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +3 -0
- package/packages/pi-coding-agent/dist/main.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 +17 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- 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 +83 -33
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- 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 +1 -75
- 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 +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 +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
- package/packages/pi-coding-agent/src/cli/args.ts +21 -6
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +4 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -2
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +58 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- package/packages/pi-coding-agent/src/main.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -9
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +97 -60
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +141 -9
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +17 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +232 -47
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
- package/src/resources/extensions/gsd/auto.ts +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
- package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +3 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +578 -32
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +351 -7
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +25 -6
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +106 -12
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +13 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +50 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +341 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +7 -7
- package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
- package/src/resources/extensions/search-the-web/native-search.ts +13 -3
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → ssX7BLv3Dw9Fb4CtrCGeR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → ssX7BLv3Dw9Fb4CtrCGeR}/_ssgManifest.js +0 -0
|
@@ -18,7 +18,7 @@ import type {
|
|
|
18
18
|
ToolCall,
|
|
19
19
|
} from "@gsd/pi-ai";
|
|
20
20
|
import type { ExtensionUIContext } from "@gsd/pi-coding-agent";
|
|
21
|
-
import { EventStream
|
|
21
|
+
import { EventStream } from "@gsd/pi-ai";
|
|
22
22
|
import { execSync } from "node:child_process";
|
|
23
23
|
import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
24
24
|
import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
|
|
@@ -31,6 +31,7 @@ import type {
|
|
|
31
31
|
SDKUserMessage,
|
|
32
32
|
} from "./sdk-types.js";
|
|
33
33
|
|
|
34
|
+
/** A single content block returned by an external (SDK-executed) tool call. */
|
|
34
35
|
export interface ExternalToolResultContentBlock {
|
|
35
36
|
type: string;
|
|
36
37
|
text?: string;
|
|
@@ -38,25 +39,30 @@ export interface ExternalToolResultContentBlock {
|
|
|
38
39
|
mimeType?: string;
|
|
39
40
|
}
|
|
40
41
|
|
|
42
|
+
/** The full result payload returned by an external tool, including content blocks and error status. */
|
|
41
43
|
export interface ExternalToolResultPayload {
|
|
42
44
|
content: ExternalToolResultContentBlock[];
|
|
43
45
|
details?: Record<string, unknown>;
|
|
44
46
|
isError: boolean;
|
|
45
47
|
}
|
|
46
48
|
|
|
49
|
+
/** A `ToolCall` block augmented with the external result attached by the SDK synthetic user message. */
|
|
47
50
|
type ToolCallWithExternalResult = ToolCall & {
|
|
48
51
|
externalResult?: ExternalToolResultPayload;
|
|
49
52
|
};
|
|
50
53
|
|
|
54
|
+
/** `SimpleStreamOptions` extended with an optional extension UI context for elicitation dialogs. */
|
|
51
55
|
interface ClaudeCodeStreamOptions extends SimpleStreamOptions {
|
|
52
56
|
extensionUIContext?: ExtensionUIContext;
|
|
53
57
|
}
|
|
54
58
|
|
|
59
|
+
/** A single selectable option within an SDK elicitation schema field. */
|
|
55
60
|
interface SdkElicitationRequestOption {
|
|
56
61
|
const?: string;
|
|
57
62
|
title?: string;
|
|
58
63
|
}
|
|
59
64
|
|
|
65
|
+
/** JSON-Schema-like descriptor for a single field within an SDK elicitation request schema. */
|
|
60
66
|
interface SdkElicitationFieldSchema {
|
|
61
67
|
type?: string;
|
|
62
68
|
title?: string;
|
|
@@ -69,6 +75,7 @@ interface SdkElicitationFieldSchema {
|
|
|
69
75
|
};
|
|
70
76
|
}
|
|
71
77
|
|
|
78
|
+
/** The full elicitation request object received from an MCP server via the Claude Agent SDK. */
|
|
72
79
|
interface SdkElicitationRequest {
|
|
73
80
|
serverName: string;
|
|
74
81
|
message: string;
|
|
@@ -80,15 +87,18 @@ interface SdkElicitationRequest {
|
|
|
80
87
|
};
|
|
81
88
|
}
|
|
82
89
|
|
|
90
|
+
/** The result returned by an elicitation handler back to the Claude Agent SDK. */
|
|
83
91
|
interface SdkElicitationResult {
|
|
84
92
|
action: "accept" | "decline" | "cancel";
|
|
85
93
|
content?: Record<string, string | string[]>;
|
|
86
94
|
}
|
|
87
95
|
|
|
96
|
+
/** A TUI `Question` extended with an optional note-field ID for "None of the above" free-text capture. */
|
|
88
97
|
interface ParsedElicitationQuestion extends Question {
|
|
89
98
|
noteFieldId?: string;
|
|
90
99
|
}
|
|
91
100
|
|
|
101
|
+
/** Descriptor for a single free-text input field parsed from an SDK elicitation form schema. */
|
|
92
102
|
interface ParsedTextInputField {
|
|
93
103
|
id: string;
|
|
94
104
|
title: string;
|
|
@@ -97,6 +107,7 @@ interface ParsedTextInputField {
|
|
|
97
107
|
secure: boolean;
|
|
98
108
|
}
|
|
99
109
|
|
|
110
|
+
/** A base64-encoded image block in the format accepted by the Claude Agent SDK input message. */
|
|
100
111
|
interface SDKInputImageBlock {
|
|
101
112
|
type: "image";
|
|
102
113
|
source: {
|
|
@@ -106,13 +117,16 @@ interface SDKInputImageBlock {
|
|
|
106
117
|
};
|
|
107
118
|
}
|
|
108
119
|
|
|
120
|
+
/** A plain-text block in the format accepted by the Claude Agent SDK input message. */
|
|
109
121
|
interface SDKInputTextBlock {
|
|
110
122
|
type: "text";
|
|
111
123
|
text: string;
|
|
112
124
|
}
|
|
113
125
|
|
|
126
|
+
/** Union of content block types that may appear in a Claude Agent SDK user input message. */
|
|
114
127
|
type SDKInputUserContentBlock = SDKInputImageBlock | SDKInputTextBlock;
|
|
115
128
|
|
|
129
|
+
/** A synthetic user message in the Claude Agent SDK's async-iterable prompt format, used when images are present. */
|
|
116
130
|
interface SDKInputUserMessage {
|
|
117
131
|
type: "user";
|
|
118
132
|
message: {
|
|
@@ -122,7 +136,9 @@ interface SDKInputUserMessage {
|
|
|
122
136
|
parent_tool_use_id: null;
|
|
123
137
|
}
|
|
124
138
|
|
|
139
|
+
/** Label used for the free-text fallback option in single-choice elicitation questions. */
|
|
125
140
|
const OTHER_OPTION_LABEL = "None of the above";
|
|
141
|
+
/** Regex pattern that identifies field names and descriptions that should be treated as sensitive/secure inputs. */
|
|
126
142
|
const SENSITIVE_FIELD_PATTERN = /(password|passphrase|secret|token|api[_\s-]*key|private[_\s-]*key|credential)/i;
|
|
127
143
|
|
|
128
144
|
// ---------------------------------------------------------------------------
|
|
@@ -144,6 +160,7 @@ function createAssistantStream(): AssistantMessageEventStream {
|
|
|
144
160
|
) as AssistantMessageEventStream;
|
|
145
161
|
}
|
|
146
162
|
|
|
163
|
+
/** Extract a human-readable error string from an SDK result message. */
|
|
147
164
|
export function getResultErrorMessage(result: SDKResultMessage): string {
|
|
148
165
|
if ("errors" in result && Array.isArray(result.errors) && result.errors.length > 0) {
|
|
149
166
|
return result.errors.join("; ");
|
|
@@ -160,12 +177,15 @@ export function getResultErrorMessage(result: SDKResultMessage): string {
|
|
|
160
177
|
// Claude binary resolution
|
|
161
178
|
// ---------------------------------------------------------------------------
|
|
162
179
|
|
|
180
|
+
/** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
|
|
163
181
|
let cachedClaudePath: string | null = null;
|
|
164
182
|
|
|
183
|
+
/** Return the shell command used to locate the `claude` binary on the given platform. */
|
|
165
184
|
export function getClaudeLookupCommand(platform: NodeJS.Platform = process.platform): string {
|
|
166
185
|
return platform === "win32" ? "where claude" : "which claude";
|
|
167
186
|
}
|
|
168
187
|
|
|
188
|
+
/** Extract the first line of `which`/`where` output as the resolved binary path. */
|
|
169
189
|
export function parseClaudeLookupOutput(output: Buffer | string): string {
|
|
170
190
|
return output
|
|
171
191
|
.toString()
|
|
@@ -248,6 +268,7 @@ export function buildPromptFromContext(context: Context): string {
|
|
|
248
268
|
return parts.join("\n\n");
|
|
249
269
|
}
|
|
250
270
|
|
|
271
|
+
/** Strip the `data:<mime>;base64,` prefix from a data URI, returning only the raw base64 payload. */
|
|
251
272
|
function stripDataUriPrefix(value: string): string {
|
|
252
273
|
const commaIndex = value.indexOf(",");
|
|
253
274
|
if (value.startsWith("data:") && commaIndex !== -1) {
|
|
@@ -256,11 +277,13 @@ function stripDataUriPrefix(value: string): string {
|
|
|
256
277
|
return value;
|
|
257
278
|
}
|
|
258
279
|
|
|
280
|
+
/** Extract the MIME type from a data URI string, or return `null` if the value is not a valid data URI. */
|
|
259
281
|
function inferMimeTypeFromDataUri(value: string): string | null {
|
|
260
282
|
const match = /^data:([^;,]+);base64,/.exec(value);
|
|
261
283
|
return match?.[1] ?? null;
|
|
262
284
|
}
|
|
263
285
|
|
|
286
|
+
/** Collect all base64 image blocks from user messages in the context for inclusion in the SDK prompt. */
|
|
264
287
|
export function extractImageBlocksFromContext(context: Context): SDKInputImageBlock[] {
|
|
265
288
|
const imageBlocks: SDKInputImageBlock[] = [];
|
|
266
289
|
|
|
@@ -291,6 +314,7 @@ export function extractImageBlocksFromContext(context: Context): SDKInputImageBl
|
|
|
291
314
|
return imageBlocks;
|
|
292
315
|
}
|
|
293
316
|
|
|
317
|
+
/** Build the SDK query prompt, wrapping image blocks into an async iterable user message when present. */
|
|
294
318
|
export function buildSdkQueryPrompt(
|
|
295
319
|
context: Context,
|
|
296
320
|
textPrompt: string = buildPromptFromContext(context),
|
|
@@ -320,6 +344,7 @@ export function buildSdkQueryPrompt(
|
|
|
320
344
|
// Error helper
|
|
321
345
|
// ---------------------------------------------------------------------------
|
|
322
346
|
|
|
347
|
+
/** Build a minimal error `AssistantMessage` with the given model ID and error text. */
|
|
323
348
|
function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
|
|
324
349
|
return {
|
|
325
350
|
role: "assistant",
|
|
@@ -348,6 +373,7 @@ export function makeStreamExhaustedErrorMessage(model: string, lastTextContent:
|
|
|
348
373
|
return message;
|
|
349
374
|
}
|
|
350
375
|
|
|
376
|
+
/** Extract the string labels from an array of SDK elicitation option objects, filtering out blank entries. */
|
|
351
377
|
function readElicitationChoices(options: SdkElicitationRequestOption[] | undefined): string[] {
|
|
352
378
|
if (!Array.isArray(options)) return [];
|
|
353
379
|
return options
|
|
@@ -355,6 +381,7 @@ function readElicitationChoices(options: SdkElicitationRequestOption[] | undefin
|
|
|
355
381
|
.filter((option): option is string => option.length > 0);
|
|
356
382
|
}
|
|
357
383
|
|
|
384
|
+
/** Parse an SDK elicitation request into structured multiple-choice questions, or null if the schema is unsupported. */
|
|
358
385
|
export function parseAskUserQuestionsElicitation(
|
|
359
386
|
request: Pick<SdkElicitationRequest, "mode" | "requestedSchema">,
|
|
360
387
|
): ParsedElicitationQuestion[] | null {
|
|
@@ -408,6 +435,7 @@ export function parseAskUserQuestionsElicitation(
|
|
|
408
435
|
return questions.length > 0 ? questions : null;
|
|
409
436
|
}
|
|
410
437
|
|
|
438
|
+
/** Return true if the elicitation field should be treated as sensitive and rendered as a secure/password input. */
|
|
411
439
|
function isSecureElicitationField(
|
|
412
440
|
requestMessage: string,
|
|
413
441
|
fieldId: string,
|
|
@@ -431,6 +459,7 @@ function isSecureElicitationField(
|
|
|
431
459
|
return SENSITIVE_FIELD_PATTERN.test(haystack);
|
|
432
460
|
}
|
|
433
461
|
|
|
462
|
+
/** Parse an SDK elicitation request into free-text input field descriptors, or null if unsupported. */
|
|
434
463
|
export function parseTextInputElicitation(
|
|
435
464
|
request: Pick<SdkElicitationRequest, "message" | "mode" | "requestedSchema">,
|
|
436
465
|
): ParsedTextInputField[] | null {
|
|
@@ -469,6 +498,7 @@ export function parseTextInputElicitation(
|
|
|
469
498
|
return fields.length > 0 ? fields : null;
|
|
470
499
|
}
|
|
471
500
|
|
|
501
|
+
/** Convert a TUI interview round result into the SDK elicitation content map. */
|
|
472
502
|
export function roundResultToElicitationContent(
|
|
473
503
|
questions: ParsedElicitationQuestion[],
|
|
474
504
|
result: RoundResult,
|
|
@@ -495,6 +525,7 @@ export function roundResultToElicitationContent(
|
|
|
495
525
|
return content;
|
|
496
526
|
}
|
|
497
527
|
|
|
528
|
+
/** Build the dialog title string for a multiple-choice elicitation question, combining server name, header, and question text. */
|
|
498
529
|
function buildElicitationPromptTitle(request: SdkElicitationRequest, question: ParsedElicitationQuestion): string {
|
|
499
530
|
const parts = [
|
|
500
531
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -504,6 +535,7 @@ function buildElicitationPromptTitle(request: SdkElicitationRequest, question: P
|
|
|
504
535
|
return parts.join("\n\n");
|
|
505
536
|
}
|
|
506
537
|
|
|
538
|
+
/** Drive each multiple-choice elicitation question through the extension UI's `select` dialog, collecting answers into an SDK result. */
|
|
507
539
|
async function promptElicitationWithDialogs(
|
|
508
540
|
request: SdkElicitationRequest,
|
|
509
541
|
questions: ParsedElicitationQuestion[],
|
|
@@ -550,6 +582,7 @@ async function promptElicitationWithDialogs(
|
|
|
550
582
|
return { action: "accept", content };
|
|
551
583
|
}
|
|
552
584
|
|
|
585
|
+
/** Build the dialog title string for a free-text input field, combining server name, field title, and description. */
|
|
553
586
|
function buildTextInputPromptTitle(request: SdkElicitationRequest, field: ParsedTextInputField): string {
|
|
554
587
|
const parts = [
|
|
555
588
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -559,6 +592,7 @@ function buildTextInputPromptTitle(request: SdkElicitationRequest, field: Parsed
|
|
|
559
592
|
return parts.join("\n\n");
|
|
560
593
|
}
|
|
561
594
|
|
|
595
|
+
/** Derive a placeholder hint for a free-text input field from its description, falling back to "Required" or "Leave empty to skip". */
|
|
562
596
|
function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefined {
|
|
563
597
|
const desc = field.description.trim();
|
|
564
598
|
if (!desc) return field.required ? "Required" : "Leave empty to skip";
|
|
@@ -573,6 +607,7 @@ function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefi
|
|
|
573
607
|
return hint.length > 0 ? hint : field.required ? "Required" : "Leave empty to skip";
|
|
574
608
|
}
|
|
575
609
|
|
|
610
|
+
/** Collect each free-text input field via the extension UI's `input` dialog, returning the filled SDK elicitation result. */
|
|
576
611
|
async function promptTextInputElicitation(
|
|
577
612
|
request: SdkElicitationRequest,
|
|
578
613
|
fields: ParsedTextInputField[],
|
|
@@ -596,6 +631,7 @@ async function promptTextInputElicitation(
|
|
|
596
631
|
return { action: "accept", content };
|
|
597
632
|
}
|
|
598
633
|
|
|
634
|
+
/** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
|
|
599
635
|
export function createClaudeCodeElicitationHandler(
|
|
600
636
|
ui: ExtensionUIContext | undefined,
|
|
601
637
|
): ((request: SdkElicitationRequest, options: { signal: AbortSignal }) => Promise<SdkElicitationResult>) | undefined {
|
|
@@ -679,6 +715,44 @@ export async function resolveClaudePermissionMode(
|
|
|
679
715
|
return "bypassPermissions";
|
|
680
716
|
}
|
|
681
717
|
|
|
718
|
+
// NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
|
|
719
|
+
// behavior so this extension remains typecheck-stable even when the published
|
|
720
|
+
// @gsd/pi-ai barrel lags behind monorepo source exports.
|
|
721
|
+
/** Return true for model IDs that support the adaptive thinking API (Opus 4.6/4.7, Sonnet 4.6/4.7, Haiku 4.5). */
|
|
722
|
+
function modelSupportsAdaptiveThinking(modelId: string): boolean {
|
|
723
|
+
return (
|
|
724
|
+
modelId.includes("opus-4-6")
|
|
725
|
+
|| modelId.includes("opus-4.6")
|
|
726
|
+
|| modelId.includes("opus-4-7")
|
|
727
|
+
|| modelId.includes("opus-4.7")
|
|
728
|
+
|| modelId.includes("sonnet-4-6")
|
|
729
|
+
|| modelId.includes("sonnet-4.6")
|
|
730
|
+
|| modelId.includes("sonnet-4-7")
|
|
731
|
+
|| modelId.includes("sonnet-4.7")
|
|
732
|
+
|| modelId.includes("haiku-4-5")
|
|
733
|
+
|| modelId.includes("haiku-4.5")
|
|
734
|
+
);
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
/** Map a GSD thinking level to the Anthropic effort value, clamping xhigh to max for models that lack native xhigh support. */
|
|
738
|
+
function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, modelId: string): "low" | "medium" | "high" | "xhigh" | "max" {
|
|
739
|
+
switch (level) {
|
|
740
|
+
case "minimal":
|
|
741
|
+
case "low":
|
|
742
|
+
return "low";
|
|
743
|
+
case "medium":
|
|
744
|
+
return "medium";
|
|
745
|
+
case "high":
|
|
746
|
+
return "high";
|
|
747
|
+
case "xhigh":
|
|
748
|
+
if (modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) return "xhigh";
|
|
749
|
+
if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6")) return "max";
|
|
750
|
+
return "high";
|
|
751
|
+
default:
|
|
752
|
+
return "high";
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
682
756
|
/**
|
|
683
757
|
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
684
758
|
*
|
|
@@ -715,10 +789,21 @@ export function buildSdkOptions(
|
|
|
715
789
|
"Bash(pwd)",
|
|
716
790
|
...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
|
|
717
791
|
];
|
|
792
|
+
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
718
793
|
const effort =
|
|
719
|
-
reasoning &&
|
|
720
|
-
?
|
|
794
|
+
reasoning && supportsAdaptive
|
|
795
|
+
? mapThinkingLevelToAnthropicEffort(reasoning, modelId)
|
|
721
796
|
: undefined;
|
|
797
|
+
|
|
798
|
+
// Bug B: SDK requires thinking:{type:"adaptive"} alongside effort for adaptive thinking to activate.
|
|
799
|
+
// Bug C: SDK requires thinking:{type:"disabled"} to actually stop adaptive thinking when reasoning is off;
|
|
800
|
+
// omitting the field leaves the SDK in its adaptive default (or persisted session state).
|
|
801
|
+
const thinkingConfig = supportsAdaptive
|
|
802
|
+
? effort
|
|
803
|
+
? { thinking: { type: "adaptive" } }
|
|
804
|
+
: { thinking: { type: "disabled" } }
|
|
805
|
+
: undefined;
|
|
806
|
+
|
|
722
807
|
return {
|
|
723
808
|
pathToClaudeCodeExecutable: getClaudePath(),
|
|
724
809
|
model: modelId,
|
|
@@ -732,12 +817,14 @@ export function buildSdkOptions(
|
|
|
732
817
|
disallowedTools,
|
|
733
818
|
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
734
819
|
...(mcpServers ? { mcpServers } : {}),
|
|
735
|
-
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
820
|
+
betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
|
|
821
|
+
...(thinkingConfig ?? {}),
|
|
736
822
|
...(effort ? { effort } : {}),
|
|
737
823
|
...sdkExtraOptions,
|
|
738
824
|
};
|
|
739
825
|
}
|
|
740
826
|
|
|
827
|
+
/** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
|
|
741
828
|
function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
|
|
742
829
|
if (typeof content === "string") {
|
|
743
830
|
return [{ type: "text", text: content }];
|
|
@@ -780,6 +867,7 @@ function normalizeToolResultContent(content: unknown): ExternalToolResultContent
|
|
|
780
867
|
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
781
868
|
}
|
|
782
869
|
|
|
870
|
+
/** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
|
|
783
871
|
export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
|
|
784
872
|
toolUseId: string;
|
|
785
873
|
result: ExternalToolResultPayload;
|
|
@@ -830,6 +918,7 @@ export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): A
|
|
|
830
918
|
return extracted;
|
|
831
919
|
}
|
|
832
920
|
|
|
921
|
+
/** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
|
|
833
922
|
function attachExternalResultsToToolBlocks(
|
|
834
923
|
toolBlocks: AssistantMessage["content"],
|
|
835
924
|
toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
|
|
@@ -888,6 +977,7 @@ export function streamViaClaudeCode(
|
|
|
888
977
|
return stream;
|
|
889
978
|
}
|
|
890
979
|
|
|
980
|
+
/** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
|
|
891
981
|
async function pumpSdkMessages(
|
|
892
982
|
model: Model<any>,
|
|
893
983
|
context: Context,
|
|
@@ -431,6 +431,14 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
431
431
|
);
|
|
432
432
|
});
|
|
433
433
|
|
|
434
|
+
test("buildSdkOptions enables context-1m beta for opus-4-7 (#4348)", () => {
|
|
435
|
+
const opts = buildSdkOptions("claude-opus-4-7", "test");
|
|
436
|
+
assert.ok(
|
|
437
|
+
Array.isArray(opts.betas) && opts.betas.includes("context-1m-2025-08-07"),
|
|
438
|
+
"claude-opus-4-7 should have context-1m beta enabled for 1M token context window",
|
|
439
|
+
);
|
|
440
|
+
});
|
|
441
|
+
|
|
434
442
|
test("buildSdkOptions maps reasoning to effort for adaptive Claude Code models (#3917)", () => {
|
|
435
443
|
const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, { reasoning: "high" });
|
|
436
444
|
assert.equal(options.effort, "high");
|
|
@@ -441,6 +449,16 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
441
449
|
assert.equal(options.effort, "max");
|
|
442
450
|
});
|
|
443
451
|
|
|
452
|
+
test("buildSdkOptions maps reasoning to effort for opus-4-7 (#4348)", () => {
|
|
453
|
+
const options = buildSdkOptions("claude-opus-4-7", "test", undefined, { reasoning: "high" });
|
|
454
|
+
assert.equal(options.effort, "high");
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
test("buildSdkOptions passes xhigh reasoning natively for opus-4-7 (#4348)", () => {
|
|
458
|
+
const options = buildSdkOptions("claude-opus-4-7", "test", undefined, { reasoning: "xhigh" });
|
|
459
|
+
assert.equal(options.effort, "xhigh");
|
|
460
|
+
});
|
|
461
|
+
|
|
444
462
|
test("buildSdkOptions omits effort when reasoning is undefined (#3917)", () => {
|
|
445
463
|
const options = buildSdkOptions("claude-sonnet-4-6", "test");
|
|
446
464
|
assert.equal("effort" in options, false);
|
|
@@ -451,6 +469,72 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
451
469
|
assert.equal("effort" in options, false);
|
|
452
470
|
});
|
|
453
471
|
|
|
472
|
+
// --- Bug fixes #4392: thinking field & model coverage ---
|
|
473
|
+
|
|
474
|
+
test("buildSdkOptions sets thinking disabled when reasoning is undefined on adaptive model (#4392)", () => {
|
|
475
|
+
// Bug C: thinkingLevel="off" means reasoning===undefined; SDK needs thinking:{type:"disabled"}
|
|
476
|
+
const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
|
|
477
|
+
assert.deepEqual(
|
|
478
|
+
(options as any).thinking,
|
|
479
|
+
{ type: "disabled" },
|
|
480
|
+
"thinking must be {type:'disabled'} when reasoning is undefined so SDK stops adaptive thinking",
|
|
481
|
+
);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
test("buildSdkOptions omits effort when reasoning is undefined (thinking disabled) (#4392)", () => {
|
|
485
|
+
// Bug C corollary: no effort when thinking is off
|
|
486
|
+
const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
|
|
487
|
+
assert.equal("effort" in options, false, "effort must not be set when reasoning is undefined");
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test("buildSdkOptions sets thinking adaptive when reasoning is provided (#4392)", () => {
|
|
491
|
+
// Bug B: when effort is set, thinking:{type:"adaptive"} must also be present
|
|
492
|
+
const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
|
|
493
|
+
assert.deepEqual(
|
|
494
|
+
(options as any).thinking,
|
|
495
|
+
{ type: "adaptive" },
|
|
496
|
+
"thinking must be {type:'adaptive'} alongside effort when reasoning is set",
|
|
497
|
+
);
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test("buildSdkOptions includes both effort and thinking.type=adaptive when reasoning is set (#4392)", () => {
|
|
501
|
+
// Bug B: both fields must be present together
|
|
502
|
+
const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
|
|
503
|
+
assert.equal(options.effort, "high", "effort must be set");
|
|
504
|
+
assert.deepEqual((options as any).thinking, { type: "adaptive" }, "thinking must be adaptive");
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
test("buildSdkOptions maps reasoning to effort for sonnet-4-7 (modelSupportsAdaptiveThinking #4392)", () => {
|
|
508
|
+
// Bug D: sonnet-4-7 was missing from modelSupportsAdaptiveThinking
|
|
509
|
+
const options = buildSdkOptions("claude-sonnet-4-7", "test", undefined, { reasoning: "high" });
|
|
510
|
+
assert.equal(options.effort, "high", "sonnet-4-7 must support adaptive thinking and map effort");
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test("buildSdkOptions maps reasoning to effort for haiku-4-5 (modelSupportsAdaptiveThinking #4392)", () => {
|
|
514
|
+
// Bug D: haiku-4-5 was missing from modelSupportsAdaptiveThinking
|
|
515
|
+
const options = buildSdkOptions("claude-haiku-4-5", "test", undefined, { reasoning: "high" });
|
|
516
|
+
assert.equal(options.effort, "high", "haiku-4-5 must support adaptive thinking and map effort");
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
test("buildSdkOptions maps reasoning to effort for sonnet-4.7 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
|
|
520
|
+
// Dot-form aliases (e.g. claude-sonnet-4.7) must also be recognised
|
|
521
|
+
const options = buildSdkOptions("claude-sonnet-4.7", "test", undefined, { reasoning: "high" });
|
|
522
|
+
assert.equal(options.effort, "high", "claude-sonnet-4.7 must support adaptive thinking and map effort");
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test("buildSdkOptions maps reasoning to effort for haiku-4.5 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
|
|
526
|
+
// Dot-form aliases (e.g. claude-haiku-4.5) must also be recognised
|
|
527
|
+
const options = buildSdkOptions("claude-haiku-4.5", "test", undefined, { reasoning: "high" });
|
|
528
|
+
assert.equal(options.effort, "high", "claude-haiku-4.5 must support adaptive thinking and map effort");
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
test("buildSdkOptions does not set thinking field for non-adaptive model when reasoning is undefined (#4392)", () => {
|
|
532
|
+
// Non-adaptive models (e.g. claude-sonnet-4-20250514) don't use the thinking API at all;
|
|
533
|
+
// no thinking field should be set when reasoning is undefined
|
|
534
|
+
const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, {});
|
|
535
|
+
assert.equal("thinking" in options, false, "non-adaptive models must not receive a thinking field");
|
|
536
|
+
});
|
|
537
|
+
|
|
454
538
|
test("buildSdkOptions includes workflow MCP server config when env is set", () => {
|
|
455
539
|
const prev = {
|
|
456
540
|
GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
|
|
@@ -20,6 +20,7 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
|
|
|
20
20
|
*
|
|
21
21
|
* Rule 1: Same error string twice in a row → stuck immediately.
|
|
22
22
|
* Rule 2: Same unit key 3+ consecutive times → stuck (preserves prior behavior).
|
|
23
|
+
* Rule 2b: Same unit key appears 3+ times anywhere in the active window → stuck.
|
|
23
24
|
* Rule 3: Oscillation A→B→A→B in last 4 entries → stuck.
|
|
24
25
|
* Rule 4: Same ENOENT path in any 2 entries within the window → stuck (#3575).
|
|
25
26
|
* Missing files don't self-heal between retries — retrying wastes budget.
|
|
@@ -58,6 +59,15 @@ export function detectStuck(
|
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
// Rule 2b: Same unit key 3+ times anywhere in the active window
|
|
63
|
+
const countInWindow = window.filter((entry) => entry.key === last.key).length;
|
|
64
|
+
if (countInWindow >= 3) {
|
|
65
|
+
return {
|
|
66
|
+
stuck: true,
|
|
67
|
+
reason: `${last.key} derived ${countInWindow} times in last ${window.length} attempts without progress${suffix}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
61
71
|
// Rule 3: Oscillation (A→B→A→B in last 4)
|
|
62
72
|
if (window.length >= 4) {
|
|
63
73
|
const w = window.slice(-4);
|
|
@@ -16,7 +16,7 @@ import type {
|
|
|
16
16
|
VerificationContext,
|
|
17
17
|
VerificationResult,
|
|
18
18
|
} from "../auto-verification.js";
|
|
19
|
-
import type { DispatchAction } from "../auto-dispatch.js";
|
|
19
|
+
import type { DispatchAction, DispatchContext } from "../auto-dispatch.js";
|
|
20
20
|
import type { WorktreeResolver } from "../worktree-resolver.js";
|
|
21
21
|
import type { CmuxLogLevel } from "../../cmux/index.js";
|
|
22
22
|
import type { JournalEntry } from "../journal.js";
|
|
@@ -145,14 +145,7 @@ export interface LoopDeps {
|
|
|
145
145
|
} | null>;
|
|
146
146
|
|
|
147
147
|
// Dispatch
|
|
148
|
-
resolveDispatch: (dctx:
|
|
149
|
-
basePath: string;
|
|
150
|
-
mid: string;
|
|
151
|
-
midTitle: string;
|
|
152
|
-
state: GSDState;
|
|
153
|
-
prefs: GSDPreferences | undefined;
|
|
154
|
-
session?: AutoSession;
|
|
155
|
-
}) => Promise<DispatchAction>;
|
|
148
|
+
resolveDispatch: (dctx: DispatchContext) => Promise<DispatchAction>;
|
|
156
149
|
runPreDispatchHooks: (
|
|
157
150
|
unitType: string,
|
|
158
151
|
unitId: string,
|
|
@@ -14,6 +14,7 @@ import type { AutoSession, SidecarItem } from "./session.js";
|
|
|
14
14
|
import type { LoopDeps } from "./loop-deps.js";
|
|
15
15
|
import {
|
|
16
16
|
MAX_LOOP_ITERATIONS,
|
|
17
|
+
type PhaseResult,
|
|
17
18
|
type LoopState,
|
|
18
19
|
type IterationContext,
|
|
19
20
|
type IterationData,
|
|
@@ -33,6 +34,8 @@ import { logWarning } from "../workflow-logger.js";
|
|
|
33
34
|
import { gsdRoot } from "../paths.js";
|
|
34
35
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
35
36
|
import { scheduleSidecarQueue } from "../uok/execution-graph.js";
|
|
37
|
+
import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
|
|
38
|
+
import type { UokGraphNode } from "../uok/contracts.js";
|
|
36
39
|
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
37
40
|
import { join } from "node:path";
|
|
38
41
|
|
|
@@ -78,6 +81,12 @@ function saveStuckState(basePath: string, state: LoopState): void {
|
|
|
78
81
|
const MEMORY_CHECK_INTERVAL = 5; // check every 5 iterations
|
|
79
82
|
const MEMORY_PRESSURE_THRESHOLD = 0.85; // 85% of heap limit
|
|
80
83
|
|
|
84
|
+
type DispatchContract = "legacy-direct" | "uok-scheduler";
|
|
85
|
+
|
|
86
|
+
interface AutoLoopOptions {
|
|
87
|
+
dispatchContract?: DispatchContract;
|
|
88
|
+
}
|
|
89
|
+
|
|
81
90
|
function checkMemoryPressure(): { pressured: boolean; heapMB: number; limitMB: number; pct: number } {
|
|
82
91
|
const mem = process.memoryUsage();
|
|
83
92
|
// v8.getHeapStatistics() gives heap_size_limit but requires import
|
|
@@ -95,22 +104,90 @@ function checkMemoryPressure(): { pressured: boolean; heapMB: number; limitMB: n
|
|
|
95
104
|
return { pressured: pct > MEMORY_PRESSURE_THRESHOLD, heapMB, limitMB, pct };
|
|
96
105
|
}
|
|
97
106
|
|
|
107
|
+
function resolveDispatchNodeKind(
|
|
108
|
+
unitType: string,
|
|
109
|
+
sidecarItem?: SidecarItem,
|
|
110
|
+
): UokGraphNode["kind"] {
|
|
111
|
+
if (sidecarItem?.kind === "hook") return "hook";
|
|
112
|
+
if (sidecarItem?.kind === "triage") return "verification";
|
|
113
|
+
if (sidecarItem?.kind === "quick-task") return "team-worker";
|
|
114
|
+
|
|
115
|
+
if (unitType.startsWith("hook/")) return "hook";
|
|
116
|
+
if (unitType === "reactive-execute") return "subagent";
|
|
117
|
+
if (
|
|
118
|
+
unitType === "gate-evaluate"
|
|
119
|
+
|| unitType === "validate-milestone"
|
|
120
|
+
|| unitType === "run-uat"
|
|
121
|
+
|| unitType === "complete-slice"
|
|
122
|
+
) {
|
|
123
|
+
return "verification";
|
|
124
|
+
}
|
|
125
|
+
if (unitType === "replan-slice" || unitType === "reassess-roadmap") {
|
|
126
|
+
return "reprocess";
|
|
127
|
+
}
|
|
128
|
+
return "unit";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function runUnitPhaseViaContract(
|
|
132
|
+
dispatchContract: DispatchContract,
|
|
133
|
+
ic: IterationContext,
|
|
134
|
+
iterData: IterationData,
|
|
135
|
+
loopState: LoopState,
|
|
136
|
+
sidecarItem?: SidecarItem,
|
|
137
|
+
): Promise<PhaseResult<{ unitStartedAt: number }>> {
|
|
138
|
+
if (dispatchContract === "legacy-direct") {
|
|
139
|
+
return runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const scheduler = new ExecutionGraphScheduler();
|
|
143
|
+
let outcome: PhaseResult<{ unitStartedAt: number }> | null = null;
|
|
144
|
+
const executeNode = async (): Promise<void> => {
|
|
145
|
+
outcome = await runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
146
|
+
};
|
|
147
|
+
const kinds: UokGraphNode["kind"][] = [
|
|
148
|
+
"unit",
|
|
149
|
+
"hook",
|
|
150
|
+
"subagent",
|
|
151
|
+
"team-worker",
|
|
152
|
+
"verification",
|
|
153
|
+
"reprocess",
|
|
154
|
+
];
|
|
155
|
+
for (const kind of kinds) scheduler.registerHandler(kind, executeNode);
|
|
156
|
+
|
|
157
|
+
const nodeId = `dispatch:${ic.iteration}:${iterData.unitType}:${iterData.unitId}`;
|
|
158
|
+
await scheduler.run([
|
|
159
|
+
{
|
|
160
|
+
id: nodeId,
|
|
161
|
+
kind: resolveDispatchNodeKind(iterData.unitType, sidecarItem),
|
|
162
|
+
dependsOn: [],
|
|
163
|
+
metadata: {
|
|
164
|
+
unitType: iterData.unitType,
|
|
165
|
+
unitId: iterData.unitId,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
], { parallel: false, maxWorkers: 1 });
|
|
169
|
+
|
|
170
|
+
return outcome ?? { action: "break", reason: "scheduler-dispatch-missing-result" };
|
|
171
|
+
}
|
|
172
|
+
|
|
98
173
|
/**
|
|
99
174
|
* Main auto-mode execution loop. Iterates: derive → dispatch → guards →
|
|
100
175
|
* runUnit → finalize → repeat. Exits when s.active becomes false or a
|
|
101
176
|
* terminal condition is reached.
|
|
102
177
|
*
|
|
103
178
|
* This is the linear replacement for the recursive
|
|
104
|
-
* dispatchNextUnit →
|
|
179
|
+
* dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
|
|
105
180
|
*/
|
|
106
181
|
export async function autoLoop(
|
|
107
182
|
ctx: ExtensionContext,
|
|
108
183
|
pi: ExtensionAPI,
|
|
109
184
|
s: AutoSession,
|
|
110
185
|
deps: LoopDeps,
|
|
186
|
+
options?: AutoLoopOptions,
|
|
111
187
|
): Promise<void> {
|
|
112
188
|
debugLog("autoLoop", { phase: "enter" });
|
|
113
189
|
let iteration = 0;
|
|
190
|
+
const dispatchContract = options?.dispatchContract ?? "legacy-direct";
|
|
114
191
|
// Load persisted stuck state so counters survive session restarts (#3704)
|
|
115
192
|
const persisted = loadStuckState(s.basePath);
|
|
116
193
|
const loopState: LoopState = {
|
|
@@ -324,7 +401,12 @@ export async function autoLoop(
|
|
|
324
401
|
}
|
|
325
402
|
|
|
326
403
|
// ── Unit execution (shared with dev path) ──
|
|
327
|
-
const unitPhaseResult = await
|
|
404
|
+
const unitPhaseResult = await runUnitPhaseViaContract(
|
|
405
|
+
dispatchContract,
|
|
406
|
+
ic,
|
|
407
|
+
iterData,
|
|
408
|
+
loopState,
|
|
409
|
+
);
|
|
328
410
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
329
411
|
unitType: iterData.unitType,
|
|
330
412
|
unitId: iterData.unitId,
|
|
@@ -469,7 +551,13 @@ export async function autoLoop(
|
|
|
469
551
|
});
|
|
470
552
|
}
|
|
471
553
|
|
|
472
|
-
const unitPhaseResult = await
|
|
554
|
+
const unitPhaseResult = await runUnitPhaseViaContract(
|
|
555
|
+
dispatchContract,
|
|
556
|
+
ic,
|
|
557
|
+
iterData,
|
|
558
|
+
loopState,
|
|
559
|
+
sidecarItem,
|
|
560
|
+
);
|
|
473
561
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
474
562
|
unitType: iterData.unitType,
|
|
475
563
|
unitId: iterData.unitId,
|
|
@@ -622,3 +710,21 @@ export async function autoLoop(
|
|
|
622
710
|
_clearCurrentResolve();
|
|
623
711
|
debugLog("autoLoop", { phase: "exit", totalIterations: iteration });
|
|
624
712
|
}
|
|
713
|
+
|
|
714
|
+
export async function runUokKernelLoop(
|
|
715
|
+
ctx: ExtensionContext,
|
|
716
|
+
pi: ExtensionAPI,
|
|
717
|
+
s: AutoSession,
|
|
718
|
+
deps: LoopDeps,
|
|
719
|
+
): Promise<void> {
|
|
720
|
+
return autoLoop(ctx, pi, s, deps, { dispatchContract: "uok-scheduler" });
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
export async function runLegacyAutoLoop(
|
|
724
|
+
ctx: ExtensionContext,
|
|
725
|
+
pi: ExtensionAPI,
|
|
726
|
+
s: AutoSession,
|
|
727
|
+
deps: LoopDeps,
|
|
728
|
+
): Promise<void> {
|
|
729
|
+
return autoLoop(ctx, pi, s, deps, { dispatchContract: "legacy-direct" });
|
|
730
|
+
}
|