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
package/dist/onboarding.js
CHANGED
|
@@ -15,6 +15,8 @@ import { dirname, join } from 'node:path';
|
|
|
15
15
|
import { renderLogo } from './logo.js';
|
|
16
16
|
import { agentDir } from './app-paths.js';
|
|
17
17
|
import { isClaudeCliReady } from './claude-cli-check.js';
|
|
18
|
+
import { markOnboardingComplete, markStepCompleted, markStepSkipped, isOnboardingComplete, } from './resources/extensions/gsd/onboarding-state.js';
|
|
19
|
+
import { getLlmProviderIds } from './resources/extensions/gsd/setup-catalog.js';
|
|
18
20
|
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
19
21
|
const TOOL_KEYS = [
|
|
20
22
|
{
|
|
@@ -36,25 +38,17 @@ const TOOL_KEYS = [
|
|
|
36
38
|
hint: 'voice transcription — free at console.groq.com',
|
|
37
39
|
},
|
|
38
40
|
];
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Known LLM provider IDs that, if authed, mean the user doesn't need onboarding.
|
|
43
|
+
* Sourced from the shared setup-catalog so adding a provider lands in one place.
|
|
44
|
+
* 'anthropic-vertex' and 'ollama' aren't in PROVIDER_REGISTRY but are still
|
|
45
|
+
* treated as "authed = no onboarding needed" for back-compat.
|
|
46
|
+
*/
|
|
47
|
+
const LLM_PROVIDER_IDS = Array.from(new Set([
|
|
48
|
+
...getLlmProviderIds(),
|
|
42
49
|
'anthropic-vertex',
|
|
43
|
-
'claude-code',
|
|
44
|
-
'openai',
|
|
45
|
-
'github-copilot',
|
|
46
|
-
'openai-codex',
|
|
47
|
-
'google-gemini-cli',
|
|
48
|
-
'google-antigravity',
|
|
49
|
-
'google',
|
|
50
|
-
'groq',
|
|
51
|
-
'xai',
|
|
52
|
-
'openrouter',
|
|
53
|
-
'mistral',
|
|
54
50
|
'ollama',
|
|
55
|
-
|
|
56
|
-
'custom-openai',
|
|
57
|
-
];
|
|
51
|
+
]));
|
|
58
52
|
/** API key prefix validation — loose checks to catch obvious mistakes */
|
|
59
53
|
const API_KEY_PREFIXES = {
|
|
60
54
|
anthropic: ['sk-ant-'],
|
|
@@ -118,6 +112,25 @@ function openBrowser(url) {
|
|
|
118
112
|
execFile(cmd, [url], () => { });
|
|
119
113
|
}
|
|
120
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Persist the selected default provider to settings.json.
|
|
117
|
+
*
|
|
118
|
+
* This ensures first startup after onboarding prefers the provider the user
|
|
119
|
+
* just configured, instead of falling back to the first "available" provider
|
|
120
|
+
* (which can be influenced by unrelated env auth like AWS_PROFILE).
|
|
121
|
+
*/
|
|
122
|
+
function persistDefaultProvider(providerId) {
|
|
123
|
+
const settingsPath = join(agentDir, 'settings.json');
|
|
124
|
+
try {
|
|
125
|
+
const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
|
|
126
|
+
raw.defaultProvider = providerId;
|
|
127
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
128
|
+
writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Non-fatal: startup fallback logic will still run.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
121
134
|
/** Sentinel returned by runStep when the user cancels — tells the caller
|
|
122
135
|
* to abort the entire wizard. */
|
|
123
136
|
const STEP_CANCELLED = Symbol('step-cancelled');
|
|
@@ -159,6 +172,10 @@ async function runStep(p, warnLabel, fn, opts = {}) {
|
|
|
159
172
|
export function shouldRunOnboarding(authStorage, settingsDefaultProvider) {
|
|
160
173
|
if (!process.stdin.isTTY)
|
|
161
174
|
return false;
|
|
175
|
+
// Explicit completion record wins — user has already finished onboarding (and
|
|
176
|
+
// our flowVersion hasn't bumped since).
|
|
177
|
+
if (isOnboardingComplete())
|
|
178
|
+
return false;
|
|
162
179
|
if (settingsDefaultProvider)
|
|
163
180
|
return false;
|
|
164
181
|
// Check if any LLM provider has credentials
|
|
@@ -177,7 +194,7 @@ export function shouldRunOnboarding(authStorage, settingsDefaultProvider) {
|
|
|
177
194
|
* All steps are skippable. All errors are recoverable.
|
|
178
195
|
* Writes status to stderr during execution.
|
|
179
196
|
*/
|
|
180
|
-
export async function runOnboarding(authStorage) {
|
|
197
|
+
export async function runOnboarding(authStorage, opts = {}) {
|
|
181
198
|
let p;
|
|
182
199
|
let pc;
|
|
183
200
|
try {
|
|
@@ -190,31 +207,62 @@ export async function runOnboarding(authStorage) {
|
|
|
190
207
|
return;
|
|
191
208
|
}
|
|
192
209
|
// ── Intro ─────────────────────────────────────────────────────────────────
|
|
193
|
-
|
|
194
|
-
|
|
210
|
+
if (opts.showIntro !== false) {
|
|
211
|
+
process.stderr.write(renderLogo(pc.cyan));
|
|
212
|
+
p.intro(pc.bold('Welcome to GSD — let\'s get you set up'));
|
|
213
|
+
}
|
|
214
|
+
const completedSteps = [];
|
|
195
215
|
// ── LLM Provider Selection ────────────────────────────────────────────────
|
|
196
216
|
const llmResult = await runStep(p, 'LLM setup failed', () => runLlmStep(p, pc, authStorage), {
|
|
197
|
-
cancelMessage: 'Setup cancelled — you can run /
|
|
217
|
+
cancelMessage: 'Setup cancelled — you can run /gsd onboarding --resume later.',
|
|
198
218
|
errorInfo: 'You can configure your LLM provider later with /login inside GSD.',
|
|
199
219
|
});
|
|
200
220
|
if (llmResult === STEP_CANCELLED)
|
|
201
221
|
return;
|
|
202
222
|
const llmConfigured = llmResult ?? false;
|
|
223
|
+
if (llmConfigured) {
|
|
224
|
+
markStepCompleted('llm');
|
|
225
|
+
completedSteps.push('llm');
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
markStepSkipped('llm');
|
|
229
|
+
}
|
|
203
230
|
// ── Web Search Provider ──────────────────────────────────────────────────
|
|
204
231
|
const searchResult = await runStep(p, 'Web search setup failed', () => runWebSearchStep(p, pc, authStorage, llmConfigured));
|
|
205
232
|
if (searchResult === STEP_CANCELLED)
|
|
206
233
|
return;
|
|
207
234
|
const searchConfigured = searchResult;
|
|
235
|
+
if (searchConfigured) {
|
|
236
|
+
markStepCompleted('search');
|
|
237
|
+
completedSteps.push('search');
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
markStepSkipped('search');
|
|
241
|
+
}
|
|
208
242
|
// ── Remote Questions ─────────────────────────────────────────────────────
|
|
209
243
|
const remoteResult = await runStep(p, 'Remote questions setup failed', () => runRemoteQuestionsStep(p, pc, authStorage));
|
|
210
244
|
if (remoteResult === STEP_CANCELLED)
|
|
211
245
|
return;
|
|
212
246
|
const remoteConfigured = remoteResult;
|
|
247
|
+
if (remoteConfigured) {
|
|
248
|
+
markStepCompleted('remote');
|
|
249
|
+
completedSteps.push('remote');
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
markStepSkipped('remote');
|
|
253
|
+
}
|
|
213
254
|
// ── Tool API Keys ─────────────────────────────────────────────────────────
|
|
214
255
|
const toolResult = await runStep(p, 'Tool key setup failed', () => runToolKeysStep(p, pc, authStorage));
|
|
215
256
|
if (toolResult === STEP_CANCELLED)
|
|
216
257
|
return;
|
|
217
258
|
const toolKeyCount = toolResult ?? 0;
|
|
259
|
+
if (toolKeyCount > 0) {
|
|
260
|
+
markStepCompleted('tool-keys');
|
|
261
|
+
completedSteps.push('tool-keys');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
markStepSkipped('tool-keys');
|
|
265
|
+
}
|
|
218
266
|
// ── Summary ───────────────────────────────────────────────────────────────
|
|
219
267
|
const summaryLines = [];
|
|
220
268
|
if (llmConfigured) {
|
|
@@ -249,11 +297,17 @@ export async function runOnboarding(authStorage) {
|
|
|
249
297
|
else {
|
|
250
298
|
summaryLines.push(`${pc.dim('↷')} Tool keys: none configured`);
|
|
251
299
|
}
|
|
300
|
+
// Persist completion record so re-entry, web boot probe, and shouldRunOnboarding
|
|
301
|
+
// all agree the wizard finished. Required steps drive the "complete" semantics
|
|
302
|
+
// in onboarding-state.ts; here we mark wizard-level completion regardless.
|
|
303
|
+
markOnboardingComplete(completedSteps);
|
|
304
|
+
summaryLines.push('');
|
|
305
|
+
summaryLines.push(`${pc.dim('Tip:')} re-run anytime with ${pc.cyan('/gsd onboarding')}`);
|
|
252
306
|
p.note(summaryLines.join('\n'), 'Setup complete');
|
|
253
307
|
p.outro(pc.dim('Launching GSD...'));
|
|
254
308
|
}
|
|
255
309
|
// ─── LLM Authentication Step ──────────────────────────────────────────────────
|
|
256
|
-
async function runLlmStep(p, pc, authStorage) {
|
|
310
|
+
export async function runLlmStep(p, pc, authStorage) {
|
|
257
311
|
// Build the OAuth provider list dynamically from what's registered
|
|
258
312
|
const oauthProviders = authStorage.getOAuthProviders();
|
|
259
313
|
const oauthMap = new Map(oauthProviders.map(op => [op.id, op]));
|
|
@@ -283,16 +337,8 @@ async function runLlmStep(p, pc, authStorage) {
|
|
|
283
337
|
p.log.info('Your Claude subscription will be used for inference. No API key needed.');
|
|
284
338
|
// Store sentinel so hasAuth('claude-code') returns true on future boots
|
|
285
339
|
authStorage.set('claude-code', { type: 'api_key', key: 'cli' });
|
|
286
|
-
// Persist claude-code
|
|
287
|
-
|
|
288
|
-
const settingsPath = join(agentDir, 'settings.json');
|
|
289
|
-
try {
|
|
290
|
-
const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
|
|
291
|
-
raw.defaultProvider = 'claude-code';
|
|
292
|
-
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
293
|
-
writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
|
|
294
|
-
}
|
|
295
|
-
catch { /* non-fatal — startup migration will catch it */ }
|
|
340
|
+
// Persist claude-code so startup does not keep users on anthropic direct API.
|
|
341
|
+
persistDefaultProvider('claude-code');
|
|
296
342
|
return true;
|
|
297
343
|
}
|
|
298
344
|
// ── Step 2: Which provider? ──────────────────────────────────────────────
|
|
@@ -345,7 +391,7 @@ async function runOAuthFlow(p, pc, authStorage, providerId, oauthMap) {
|
|
|
345
391
|
const s = p.spinner();
|
|
346
392
|
s.start(`Authenticating with ${providerName}...`);
|
|
347
393
|
try {
|
|
348
|
-
|
|
394
|
+
const loginCallbacks = {
|
|
349
395
|
onAuth: (info) => {
|
|
350
396
|
s.stop(`Opening browser for ${providerName}`);
|
|
351
397
|
openBrowser(info.url);
|
|
@@ -377,7 +423,9 @@ async function runOAuthFlow(p, pc, authStorage, providerId, oauthMap) {
|
|
|
377
423
|
return result;
|
|
378
424
|
}
|
|
379
425
|
: undefined,
|
|
380
|
-
}
|
|
426
|
+
};
|
|
427
|
+
await authStorage.login(providerId, loginCallbacks);
|
|
428
|
+
persistDefaultProvider(providerId);
|
|
381
429
|
p.log.success(`Authenticated with ${pc.green(providerName)}`);
|
|
382
430
|
return true;
|
|
383
431
|
}
|
|
@@ -416,6 +464,7 @@ async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
|
|
|
416
464
|
p.log.warn(`Key doesn't start with expected prefix (${expectedPrefixes.join(' or ')}). Saving anyway.`);
|
|
417
465
|
}
|
|
418
466
|
authStorage.set(providerId, { type: 'api_key', key: trimmed });
|
|
467
|
+
persistDefaultProvider(providerId);
|
|
419
468
|
p.log.success(`API key saved for ${pc.green(providerLabel)}`);
|
|
420
469
|
// Provider-specific post-setup hints
|
|
421
470
|
if (providerId === 'openrouter') {
|
|
@@ -438,6 +487,7 @@ async function runOllamaLocalFlow(p, pc, authStorage) {
|
|
|
438
487
|
s.stop(`Ollama is running at ${pc.green(host)}`);
|
|
439
488
|
// Store a placeholder so the provider is recognized as authenticated
|
|
440
489
|
authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
|
|
490
|
+
persistDefaultProvider('ollama');
|
|
441
491
|
p.log.success(`${pc.green('Ollama (Local)')} configured — no API key needed`);
|
|
442
492
|
p.log.info(pc.dim('Models are discovered automatically from your local Ollama instance.'));
|
|
443
493
|
return true;
|
|
@@ -460,6 +510,7 @@ async function runOllamaLocalFlow(p, pc, authStorage) {
|
|
|
460
510
|
if (p.isCancel(proceed) || !proceed)
|
|
461
511
|
return false;
|
|
462
512
|
authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
|
|
513
|
+
persistDefaultProvider('ollama');
|
|
463
514
|
p.log.success(`${pc.green('Ollama (Local)')} saved — models will appear when Ollama is running`);
|
|
464
515
|
return true;
|
|
465
516
|
}
|
|
@@ -509,6 +560,7 @@ async function runCustomOpenAIFlow(p, pc, authStorage) {
|
|
|
509
560
|
const trimmedModelId = modelId.trim();
|
|
510
561
|
// Save API key to auth storage
|
|
511
562
|
authStorage.set('custom-openai', { type: 'api_key', key: trimmedKey });
|
|
563
|
+
persistDefaultProvider('custom-openai');
|
|
512
564
|
// Write or merge into models.json
|
|
513
565
|
const modelsJsonPath = join(agentDir, 'models.json');
|
|
514
566
|
let config = { providers: {} };
|
|
@@ -555,7 +607,7 @@ async function runCustomOpenAIFlow(p, pc, authStorage) {
|
|
|
555
607
|
return true;
|
|
556
608
|
}
|
|
557
609
|
// ─── Web Search Provider Step ─────────────────────────────────────────────────
|
|
558
|
-
async function runWebSearchStep(p, pc, authStorage, isAnthropicAuth) {
|
|
610
|
+
export async function runWebSearchStep(p, pc, authStorage, isAnthropicAuth) {
|
|
559
611
|
// Check which LLM provider was configured
|
|
560
612
|
const authed = authStorage.list().filter(id => LLM_PROVIDER_IDS.includes(id));
|
|
561
613
|
const isAnthropic = isAnthropicAuth && authed.includes('anthropic');
|
|
@@ -616,7 +668,7 @@ async function runWebSearchStep(p, pc, authStorage, isAnthropicAuth) {
|
|
|
616
668
|
return null;
|
|
617
669
|
}
|
|
618
670
|
// ─── Tool API Keys Step ───────────────────────────────────────────────────────
|
|
619
|
-
async function runToolKeysStep(p, pc, authStorage) {
|
|
671
|
+
export async function runToolKeysStep(p, pc, authStorage) {
|
|
620
672
|
// Filter to keys not already configured
|
|
621
673
|
const missing = TOOL_KEYS.filter(tk => !authStorage.has(tk.provider) && !process.env[tk.envVar]);
|
|
622
674
|
if (missing.length === 0)
|
|
@@ -651,9 +703,11 @@ async function runToolKeysStep(p, pc, authStorage) {
|
|
|
651
703
|
return savedCount;
|
|
652
704
|
}
|
|
653
705
|
// ─── Remote Questions Step ────────────────────────────────────────────────────
|
|
654
|
-
async function runRemoteQuestionsStep(p, pc, authStorage) {
|
|
706
|
+
export async function runRemoteQuestionsStep(p, pc, authStorage) {
|
|
655
707
|
// Check existing config — use getCredentialsForProvider to skip empty-key entries
|
|
656
|
-
const hasValidKey = (provider) => authStorage
|
|
708
|
+
const hasValidKey = (provider) => authStorage
|
|
709
|
+
.getCredentialsForProvider(provider)
|
|
710
|
+
.some((c) => c.type === 'api_key' && typeof c.key === 'string' && c.key.length > 0);
|
|
657
711
|
const hasDiscord = hasValidKey('discord_bot');
|
|
658
712
|
const hasSlack = hasValidKey('slack_bot');
|
|
659
713
|
const hasTelegram = hasValidKey('telegram_bot');
|
|
@@ -858,7 +912,13 @@ async function runDiscordChannelStep(p, pc, token) {
|
|
|
858
912
|
try {
|
|
859
913
|
const res = await fetch(`https://discord.com/api/v10/guilds/${guildId}/channels`, { headers, signal: AbortSignal.timeout(15_000) });
|
|
860
914
|
const data = await res.json();
|
|
861
|
-
channels = Array.isArray(data)
|
|
915
|
+
channels = Array.isArray(data)
|
|
916
|
+
? data.filter((ch) => typeof ch === 'object' &&
|
|
917
|
+
ch !== null &&
|
|
918
|
+
typeof ch.id === 'string' &&
|
|
919
|
+
typeof ch.name === 'string' &&
|
|
920
|
+
(ch.type === 0 || ch.type === 5))
|
|
921
|
+
: [];
|
|
862
922
|
}
|
|
863
923
|
catch {
|
|
864
924
|
p.log.warn('Could not fetch channels — configure later with /gsd remote discord');
|
|
@@ -16,13 +16,16 @@ import { showInterviewRound, } from "./shared/tui.js";
|
|
|
16
16
|
const OptionSchema = Type.Object({
|
|
17
17
|
label: Type.String({ description: "User-facing label (1-5 words)" }),
|
|
18
18
|
description: Type.String({ description: "One short sentence explaining impact/tradeoff if selected" }),
|
|
19
|
+
preview: Type.Optional(Type.String({
|
|
20
|
+
description: "Optional markdown content shown in a side-by-side preview panel when this option is highlighted. Use for showing code samples, config snippets, or detailed explanations. Keep under ~20 lines — longer content is truncated.",
|
|
21
|
+
})),
|
|
19
22
|
});
|
|
20
23
|
const QuestionSchema = Type.Object({
|
|
21
24
|
id: Type.String({ description: "Stable identifier for mapping answers (snake_case)" }),
|
|
22
25
|
header: Type.String({ description: "Short header label shown in the UI (12 or fewer chars)" }),
|
|
23
26
|
question: Type.String({ description: "Single-sentence prompt shown to the user" }),
|
|
24
27
|
options: Type.Array(OptionSchema, {
|
|
25
|
-
description: 'Provide 2-3 mutually exclusive choices for single-select, or any number for multi-select. Put the recommended option first and suffix its label with "(Recommended)". Do not include an "Other" option for single-select; the client adds a free-form "None of the above" option automatically.',
|
|
28
|
+
description: 'Provide 2-3 mutually exclusive choices for single-select, or any number for multi-select. Put the recommended option first and suffix its label with "(Recommended)". Each option can include an optional "preview" field with markdown content shown in a side panel. Do not include an "Other" option for single-select; the client adds a free-form "None of the above" option automatically.',
|
|
26
29
|
}),
|
|
27
30
|
allowMultiple: Type.Optional(Type.Boolean({
|
|
28
31
|
description: "If true, the user can select multiple options using SPACE to toggle and ENTER to confirm. No 'None of the above' option is added. Default: false.",
|
|
@@ -134,12 +137,14 @@ export default function AskUserQuestions(pi) {
|
|
|
134
137
|
pi.registerTool({
|
|
135
138
|
name: "ask_user_questions",
|
|
136
139
|
label: "Request User Input",
|
|
137
|
-
description: "Request user input for one to three short questions and wait for the response. Single-select questions have 2-3 mutually exclusive options with a free-form 'None of the above' added automatically. Multi-select questions (allowMultiple: true) let the user toggle multiple options with SPACE and confirm with ENTER.",
|
|
140
|
+
description: "Request user input for one to three short questions and wait for the response. Single-select questions have 2-3 mutually exclusive options with a free-form 'None of the above' added automatically. Multi-select questions (allowMultiple: true) let the user toggle multiple options with SPACE and confirm with ENTER. Options can include an optional 'preview' field with markdown content shown in a side-by-side panel when highlighted.",
|
|
138
141
|
promptGuidelines: [
|
|
139
142
|
"Use ask_user_questions when you need the user to choose between concrete alternatives before proceeding.",
|
|
140
143
|
"Keep questions to 1 when possible; never exceed 3.",
|
|
141
144
|
"For single-select: each question must have 2-3 options. Put the recommended option first with '(Recommended)' suffix. Do not include an 'Other' or 'None of the above' option - the client adds one automatically.",
|
|
142
145
|
"For multi-select: set allowMultiple: true. The user can pick any number of options. No 'None of the above' is added.",
|
|
146
|
+
"When options involve code patterns, config choices, or architecture decisions, add a 'preview' field with markdown content (code blocks, lists, headers, etc.). The preview renders in a side-by-side panel when the option is highlighted.",
|
|
147
|
+
"Preview content is rendered in a fixed-height panel (max ~20 lines visible). Keep previews concise — show the most relevant snippet, not exhaustive examples. Longer content is truncated with a '+N lines hidden' indicator.",
|
|
143
148
|
],
|
|
144
149
|
parameters: AskUserQuestionsParams,
|
|
145
150
|
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
@@ -274,6 +279,10 @@ export default function AskUserQuestions(pi) {
|
|
|
274
279
|
const headers = qs.map((q) => q.header).join(", ");
|
|
275
280
|
text += theme.fg("dim", ` (${headers})`);
|
|
276
281
|
}
|
|
282
|
+
const previewCount = qs.reduce((acc, q) => acc + (q.options || []).filter((o) => o.preview).length, 0);
|
|
283
|
+
if (previewCount > 0) {
|
|
284
|
+
text += theme.fg("accent", ` [${previewCount} preview${previewCount !== 1 ? "s" : ""}]`);
|
|
285
|
+
}
|
|
277
286
|
for (const q of qs) {
|
|
278
287
|
const multiSel = !!q.allowMultiple;
|
|
279
288
|
text += `\n ${theme.fg("text", q.question)}`;
|
|
@@ -307,10 +316,13 @@ export default function AskUserQuestions(pi) {
|
|
|
307
316
|
lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
|
|
308
317
|
continue;
|
|
309
318
|
}
|
|
310
|
-
const
|
|
319
|
+
const selected = answer.selected;
|
|
320
|
+
const answerText = Array.isArray(selected)
|
|
321
|
+
? (selected.length > 0 ? selected.join(", ") : "(custom)")
|
|
322
|
+
: (selected || "(custom)");
|
|
311
323
|
let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
|
|
312
|
-
if (answer.
|
|
313
|
-
line += ` ${theme.fg("muted", `[note: ${answer.
|
|
324
|
+
if (answer.notes) {
|
|
325
|
+
line += ` ${theme.fg("muted", `[note: ${answer.notes}]`)}`;
|
|
314
326
|
}
|
|
315
327
|
lines.push(line);
|
|
316
328
|
}
|
|
@@ -19,6 +19,15 @@ export const CLAUDE_CODE_MODELS = [
|
|
|
19
19
|
contextWindow: 1_000_000,
|
|
20
20
|
maxTokens: 128_000,
|
|
21
21
|
},
|
|
22
|
+
{
|
|
23
|
+
id: "claude-opus-4-7",
|
|
24
|
+
name: "Claude Opus 4.7 (via Claude Code)",
|
|
25
|
+
reasoning: true,
|
|
26
|
+
input: ["text", "image"],
|
|
27
|
+
cost: ZERO_COST,
|
|
28
|
+
contextWindow: 1_000_000,
|
|
29
|
+
maxTokens: 128_000,
|
|
30
|
+
},
|
|
22
31
|
{
|
|
23
32
|
id: "claude-sonnet-4-6",
|
|
24
33
|
name: "Claude Sonnet 4.6 (via Claude Code)",
|
|
@@ -9,6 +9,16 @@
|
|
|
9
9
|
* and check the exit code + output for an authenticated session.
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
|
+
/**
|
|
13
|
+
* Platform-correct binary name for the Claude Code CLI.
|
|
14
|
+
*
|
|
15
|
+
* On Windows, npm-global binaries are installed as `.cmd` shims and
|
|
16
|
+
* `execFileSync` does not auto-resolve the extension — calling bare
|
|
17
|
+
* `claude` would fail with ENOENT even when the CLI is installed and
|
|
18
|
+
* authenticated. Mirrors the `NPM_COMMAND` pattern in
|
|
19
|
+
* `src/resources/extensions/gsd/pre-execution-checks.ts`.
|
|
20
|
+
*/
|
|
21
|
+
const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
|
|
12
22
|
let cachedBinaryPresent = null;
|
|
13
23
|
let cachedAuthed = null;
|
|
14
24
|
let lastCheckMs = 0;
|
|
@@ -22,7 +32,7 @@ function refreshCache() {
|
|
|
22
32
|
lastCheckMs = now;
|
|
23
33
|
// Check binary presence
|
|
24
34
|
try {
|
|
25
|
-
execFileSync(
|
|
35
|
+
execFileSync(CLAUDE_COMMAND, ["--version"], { timeout: 5_000, stdio: "pipe" });
|
|
26
36
|
cachedBinaryPresent = true;
|
|
27
37
|
}
|
|
28
38
|
catch {
|
|
@@ -32,7 +42,7 @@ function refreshCache() {
|
|
|
32
42
|
}
|
|
33
43
|
// Check auth status — exit code 0 with non-error output means authenticated
|
|
34
44
|
try {
|
|
35
|
-
const output = execFileSync(
|
|
45
|
+
const output = execFileSync(CLAUDE_COMMAND, ["auth", "status"], { timeout: 5_000, stdio: "pipe" })
|
|
36
46
|
.toString()
|
|
37
47
|
.toLowerCase();
|
|
38
48
|
// The CLI outputs "not logged in", "no credentials", or similar when unauthenticated
|
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
* AssistantMessageEvents for TUI rendering, then strips tool-call blocks from
|
|
7
7
|
* the final AssistantMessage so GSD's agent loop doesn't try to dispatch them.
|
|
8
8
|
*/
|
|
9
|
-
import { EventStream
|
|
9
|
+
import { EventStream } from "@gsd/pi-ai";
|
|
10
10
|
import { execSync } from "node:child_process";
|
|
11
11
|
import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
12
12
|
import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
|
|
13
13
|
import { showInterviewRound } from "../shared/tui.js";
|
|
14
|
+
/** Label used for the free-text fallback option in single-choice elicitation questions. */
|
|
14
15
|
const OTHER_OPTION_LABEL = "None of the above";
|
|
16
|
+
/** Regex pattern that identifies field names and descriptions that should be treated as sensitive/secure inputs. */
|
|
15
17
|
const SENSITIVE_FIELD_PATTERN = /(password|passphrase|secret|token|api[_\s-]*key|private[_\s-]*key|credential)/i;
|
|
16
18
|
// ---------------------------------------------------------------------------
|
|
17
19
|
// Stream factory
|
|
@@ -29,6 +31,7 @@ function createAssistantStream() {
|
|
|
29
31
|
throw new Error("Unexpected event type for final result");
|
|
30
32
|
});
|
|
31
33
|
}
|
|
34
|
+
/** Extract a human-readable error string from an SDK result message. */
|
|
32
35
|
export function getResultErrorMessage(result) {
|
|
33
36
|
if ("errors" in result && Array.isArray(result.errors) && result.errors.length > 0) {
|
|
34
37
|
return result.errors.join("; ");
|
|
@@ -41,10 +44,13 @@ export function getResultErrorMessage(result) {
|
|
|
41
44
|
// ---------------------------------------------------------------------------
|
|
42
45
|
// Claude binary resolution
|
|
43
46
|
// ---------------------------------------------------------------------------
|
|
47
|
+
/** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
|
|
44
48
|
let cachedClaudePath = null;
|
|
49
|
+
/** Return the shell command used to locate the `claude` binary on the given platform. */
|
|
45
50
|
export function getClaudeLookupCommand(platform = process.platform) {
|
|
46
51
|
return platform === "win32" ? "where claude" : "which claude";
|
|
47
52
|
}
|
|
53
|
+
/** Extract the first line of `which`/`where` output as the resolved binary path. */
|
|
48
54
|
export function parseClaudeLookupOutput(output) {
|
|
49
55
|
return output
|
|
50
56
|
.toString()
|
|
@@ -123,6 +129,7 @@ export function buildPromptFromContext(context) {
|
|
|
123
129
|
}
|
|
124
130
|
return parts.join("\n\n");
|
|
125
131
|
}
|
|
132
|
+
/** Strip the `data:<mime>;base64,` prefix from a data URI, returning only the raw base64 payload. */
|
|
126
133
|
function stripDataUriPrefix(value) {
|
|
127
134
|
const commaIndex = value.indexOf(",");
|
|
128
135
|
if (value.startsWith("data:") && commaIndex !== -1) {
|
|
@@ -130,10 +137,12 @@ function stripDataUriPrefix(value) {
|
|
|
130
137
|
}
|
|
131
138
|
return value;
|
|
132
139
|
}
|
|
140
|
+
/** Extract the MIME type from a data URI string, or return `null` if the value is not a valid data URI. */
|
|
133
141
|
function inferMimeTypeFromDataUri(value) {
|
|
134
142
|
const match = /^data:([^;,]+);base64,/.exec(value);
|
|
135
143
|
return match?.[1] ?? null;
|
|
136
144
|
}
|
|
145
|
+
/** Collect all base64 image blocks from user messages in the context for inclusion in the SDK prompt. */
|
|
137
146
|
export function extractImageBlocksFromContext(context) {
|
|
138
147
|
const imageBlocks = [];
|
|
139
148
|
for (const msg of context.messages) {
|
|
@@ -162,6 +171,7 @@ export function extractImageBlocksFromContext(context) {
|
|
|
162
171
|
}
|
|
163
172
|
return imageBlocks;
|
|
164
173
|
}
|
|
174
|
+
/** Build the SDK query prompt, wrapping image blocks into an async iterable user message when present. */
|
|
165
175
|
export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext(context)) {
|
|
166
176
|
const imageBlocks = extractImageBlocksFromContext(context);
|
|
167
177
|
if (imageBlocks.length === 0) {
|
|
@@ -183,6 +193,7 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
|
|
|
183
193
|
// ---------------------------------------------------------------------------
|
|
184
194
|
// Error helper
|
|
185
195
|
// ---------------------------------------------------------------------------
|
|
196
|
+
/** Build a minimal error `AssistantMessage` with the given model ID and error text. */
|
|
186
197
|
function makeErrorMessage(model, errorMsg) {
|
|
187
198
|
return {
|
|
188
199
|
role: "assistant",
|
|
@@ -209,6 +220,7 @@ export function makeStreamExhaustedErrorMessage(model, lastTextContent) {
|
|
|
209
220
|
}
|
|
210
221
|
return message;
|
|
211
222
|
}
|
|
223
|
+
/** Extract the string labels from an array of SDK elicitation option objects, filtering out blank entries. */
|
|
212
224
|
function readElicitationChoices(options) {
|
|
213
225
|
if (!Array.isArray(options))
|
|
214
226
|
return [];
|
|
@@ -216,6 +228,7 @@ function readElicitationChoices(options) {
|
|
|
216
228
|
.map((option) => (typeof option?.const === "string" ? option.const : typeof option?.title === "string" ? option.title : ""))
|
|
217
229
|
.filter((option) => option.length > 0);
|
|
218
230
|
}
|
|
231
|
+
/** Parse an SDK elicitation request into structured multiple-choice questions, or null if the schema is unsupported. */
|
|
219
232
|
export function parseAskUserQuestionsElicitation(request) {
|
|
220
233
|
if (request.mode && request.mode !== "form")
|
|
221
234
|
return null;
|
|
@@ -265,6 +278,7 @@ export function parseAskUserQuestionsElicitation(request) {
|
|
|
265
278
|
}
|
|
266
279
|
return questions.length > 0 ? questions : null;
|
|
267
280
|
}
|
|
281
|
+
/** Return true if the elicitation field should be treated as sensitive and rendered as a secure/password input. */
|
|
268
282
|
function isSecureElicitationField(requestMessage, fieldId, field) {
|
|
269
283
|
if (field.format === "password")
|
|
270
284
|
return true;
|
|
@@ -283,6 +297,7 @@ function isSecureElicitationField(requestMessage, fieldId, field) {
|
|
|
283
297
|
.toLowerCase();
|
|
284
298
|
return SENSITIVE_FIELD_PATTERN.test(haystack);
|
|
285
299
|
}
|
|
300
|
+
/** Parse an SDK elicitation request into free-text input field descriptors, or null if unsupported. */
|
|
286
301
|
export function parseTextInputElicitation(request) {
|
|
287
302
|
if (request.mode && request.mode !== "form")
|
|
288
303
|
return null;
|
|
@@ -315,6 +330,7 @@ export function parseTextInputElicitation(request) {
|
|
|
315
330
|
}
|
|
316
331
|
return fields.length > 0 ? fields : null;
|
|
317
332
|
}
|
|
333
|
+
/** Convert a TUI interview round result into the SDK elicitation content map. */
|
|
318
334
|
export function roundResultToElicitationContent(questions, result) {
|
|
319
335
|
const content = {};
|
|
320
336
|
for (const question of questions) {
|
|
@@ -334,6 +350,7 @@ export function roundResultToElicitationContent(questions, result) {
|
|
|
334
350
|
}
|
|
335
351
|
return content;
|
|
336
352
|
}
|
|
353
|
+
/** Build the dialog title string for a multiple-choice elicitation question, combining server name, header, and question text. */
|
|
337
354
|
function buildElicitationPromptTitle(request, question) {
|
|
338
355
|
const parts = [
|
|
339
356
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -342,6 +359,7 @@ function buildElicitationPromptTitle(request, question) {
|
|
|
342
359
|
].filter((part) => part && part.trim().length > 0);
|
|
343
360
|
return parts.join("\n\n");
|
|
344
361
|
}
|
|
362
|
+
/** Drive each multiple-choice elicitation question through the extension UI's `select` dialog, collecting answers into an SDK result. */
|
|
345
363
|
async function promptElicitationWithDialogs(request, questions, ui, signal) {
|
|
346
364
|
const content = {};
|
|
347
365
|
for (const question of questions) {
|
|
@@ -379,6 +397,7 @@ async function promptElicitationWithDialogs(request, questions, ui, signal) {
|
|
|
379
397
|
}
|
|
380
398
|
return { action: "accept", content };
|
|
381
399
|
}
|
|
400
|
+
/** Build the dialog title string for a free-text input field, combining server name, field title, and description. */
|
|
382
401
|
function buildTextInputPromptTitle(request, field) {
|
|
383
402
|
const parts = [
|
|
384
403
|
request.serverName ? `[${request.serverName}]` : "",
|
|
@@ -387,6 +406,7 @@ function buildTextInputPromptTitle(request, field) {
|
|
|
387
406
|
].filter((part) => typeof part === "string" && part.trim().length > 0);
|
|
388
407
|
return parts.join("\n\n");
|
|
389
408
|
}
|
|
409
|
+
/** Derive a placeholder hint for a free-text input field from its description, falling back to "Required" or "Leave empty to skip". */
|
|
390
410
|
function buildTextInputPlaceholder(field) {
|
|
391
411
|
const desc = field.description.trim();
|
|
392
412
|
if (!desc)
|
|
@@ -400,6 +420,7 @@ function buildTextInputPlaceholder(field) {
|
|
|
400
420
|
const hint = formatLine.replace(/^format:\s*/i, "").trim();
|
|
401
421
|
return hint.length > 0 ? hint : field.required ? "Required" : "Leave empty to skip";
|
|
402
422
|
}
|
|
423
|
+
/** Collect each free-text input field via the extension UI's `input` dialog, returning the filled SDK elicitation result. */
|
|
403
424
|
async function promptTextInputElicitation(request, fields, ui, signal) {
|
|
404
425
|
const content = {};
|
|
405
426
|
for (const field of fields) {
|
|
@@ -411,6 +432,7 @@ async function promptTextInputElicitation(request, fields, ui, signal) {
|
|
|
411
432
|
}
|
|
412
433
|
return { action: "accept", content };
|
|
413
434
|
}
|
|
435
|
+
/** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
|
|
414
436
|
export function createClaudeCodeElicitationHandler(ui) {
|
|
415
437
|
if (!ui)
|
|
416
438
|
return undefined;
|
|
@@ -482,6 +504,42 @@ export async function resolveClaudePermissionMode(env = process.env) {
|
|
|
482
504
|
}
|
|
483
505
|
return "bypassPermissions";
|
|
484
506
|
}
|
|
507
|
+
// NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
|
|
508
|
+
// behavior so this extension remains typecheck-stable even when the published
|
|
509
|
+
// @gsd/pi-ai barrel lags behind monorepo source exports.
|
|
510
|
+
/** Return true for model IDs that support the adaptive thinking API (Opus 4.6/4.7, Sonnet 4.6/4.7, Haiku 4.5). */
|
|
511
|
+
function modelSupportsAdaptiveThinking(modelId) {
|
|
512
|
+
return (modelId.includes("opus-4-6")
|
|
513
|
+
|| modelId.includes("opus-4.6")
|
|
514
|
+
|| modelId.includes("opus-4-7")
|
|
515
|
+
|| modelId.includes("opus-4.7")
|
|
516
|
+
|| modelId.includes("sonnet-4-6")
|
|
517
|
+
|| modelId.includes("sonnet-4.6")
|
|
518
|
+
|| modelId.includes("sonnet-4-7")
|
|
519
|
+
|| modelId.includes("sonnet-4.7")
|
|
520
|
+
|| modelId.includes("haiku-4-5")
|
|
521
|
+
|| modelId.includes("haiku-4.5"));
|
|
522
|
+
}
|
|
523
|
+
/** Map a GSD thinking level to the Anthropic effort value, clamping xhigh to max for models that lack native xhigh support. */
|
|
524
|
+
function mapThinkingLevelToAnthropicEffort(level, modelId) {
|
|
525
|
+
switch (level) {
|
|
526
|
+
case "minimal":
|
|
527
|
+
case "low":
|
|
528
|
+
return "low";
|
|
529
|
+
case "medium":
|
|
530
|
+
return "medium";
|
|
531
|
+
case "high":
|
|
532
|
+
return "high";
|
|
533
|
+
case "xhigh":
|
|
534
|
+
if (modelId.includes("opus-4-7") || modelId.includes("opus-4.7"))
|
|
535
|
+
return "xhigh";
|
|
536
|
+
if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
|
|
537
|
+
return "max";
|
|
538
|
+
return "high";
|
|
539
|
+
default:
|
|
540
|
+
return "high";
|
|
541
|
+
}
|
|
542
|
+
}
|
|
485
543
|
/**
|
|
486
544
|
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
487
545
|
*
|
|
@@ -513,8 +571,17 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
513
571
|
"Bash(pwd)",
|
|
514
572
|
...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
|
|
515
573
|
];
|
|
516
|
-
const
|
|
517
|
-
|
|
574
|
+
const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
|
|
575
|
+
const effort = reasoning && supportsAdaptive
|
|
576
|
+
? mapThinkingLevelToAnthropicEffort(reasoning, modelId)
|
|
577
|
+
: undefined;
|
|
578
|
+
// Bug B: SDK requires thinking:{type:"adaptive"} alongside effort for adaptive thinking to activate.
|
|
579
|
+
// Bug C: SDK requires thinking:{type:"disabled"} to actually stop adaptive thinking when reasoning is off;
|
|
580
|
+
// omitting the field leaves the SDK in its adaptive default (or persisted session state).
|
|
581
|
+
const thinkingConfig = supportsAdaptive
|
|
582
|
+
? effort
|
|
583
|
+
? { thinking: { type: "adaptive" } }
|
|
584
|
+
: { thinking: { type: "disabled" } }
|
|
518
585
|
: undefined;
|
|
519
586
|
return {
|
|
520
587
|
pathToClaudeCodeExecutable: getClaudePath(),
|
|
@@ -529,11 +596,13 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
529
596
|
disallowedTools,
|
|
530
597
|
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
531
598
|
...(mcpServers ? { mcpServers } : {}),
|
|
532
|
-
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
599
|
+
betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
|
|
600
|
+
...(thinkingConfig ?? {}),
|
|
533
601
|
...(effort ? { effort } : {}),
|
|
534
602
|
...sdkExtraOptions,
|
|
535
603
|
};
|
|
536
604
|
}
|
|
605
|
+
/** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
|
|
537
606
|
function normalizeToolResultContent(content) {
|
|
538
607
|
if (typeof content === "string") {
|
|
539
608
|
return [{ type: "text", text: content }];
|
|
@@ -568,6 +637,7 @@ function normalizeToolResultContent(content) {
|
|
|
568
637
|
}
|
|
569
638
|
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
570
639
|
}
|
|
640
|
+
/** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
|
|
571
641
|
export function extractToolResultsFromSdkUserMessage(message) {
|
|
572
642
|
const extracted = [];
|
|
573
643
|
const seen = new Set();
|
|
@@ -612,6 +682,7 @@ export function extractToolResultsFromSdkUserMessage(message) {
|
|
|
612
682
|
}
|
|
613
683
|
return extracted;
|
|
614
684
|
}
|
|
685
|
+
/** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
|
|
615
686
|
function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
|
|
616
687
|
for (const block of toolBlocks) {
|
|
617
688
|
if (block.type !== "toolCall" && block.type !== "serverToolUse")
|
|
@@ -659,6 +730,7 @@ export function streamViaClaudeCode(model, context, options) {
|
|
|
659
730
|
void pumpSdkMessages(model, context, options, stream);
|
|
660
731
|
return stream;
|
|
661
732
|
}
|
|
733
|
+
/** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
|
|
662
734
|
async function pumpSdkMessages(model, context, options, stream) {
|
|
663
735
|
const modelId = model.id;
|
|
664
736
|
let builder = null;
|