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
|
@@ -11,10 +11,32 @@
|
|
|
11
11
|
* - Optional search/tool integrations (Brave, Tavily, Jina, Context7)
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
14
15
|
import { AuthStorage } from "@gsd/pi-coding-agent";
|
|
15
16
|
import { getEnvApiKey } from "@gsd/pi-ai";
|
|
16
17
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
17
18
|
import { getAuthPath, PROVIDER_REGISTRY } from "./key-manager.js";
|
|
19
|
+
// ── Provider routing constants ────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Providers that use external CLI authentication (not API keys).
|
|
22
|
+
* These are always considered "found" — the host CLI handles auth.
|
|
23
|
+
*/
|
|
24
|
+
const CLI_AUTH_PROVIDERS = new Set([
|
|
25
|
+
"claude-code",
|
|
26
|
+
"openai-codex",
|
|
27
|
+
"google-gemini-cli",
|
|
28
|
+
"google-antigravity",
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Providers that can serve models normally associated with another provider.
|
|
32
|
+
* Key = the provider whose models can be served, Value = alternative providers to check.
|
|
33
|
+
* e.g. GitHub Copilot subscriptions can access Claude and GPT models.
|
|
34
|
+
*/
|
|
35
|
+
const PROVIDER_ROUTES = {
|
|
36
|
+
anthropic: ["github-copilot", "claude-code"],
|
|
37
|
+
openai: ["github-copilot", "openai-codex"],
|
|
38
|
+
google: ["google-gemini-cli"],
|
|
39
|
+
};
|
|
18
40
|
// ── Model → Provider ID mapping ───────────────────────────────────────────────
|
|
19
41
|
/**
|
|
20
42
|
* Infer the auth provider ID from a model string.
|
|
@@ -96,8 +118,34 @@ function collectConfiguredModelProviders() {
|
|
|
96
118
|
providers.add("anthropic");
|
|
97
119
|
return providers;
|
|
98
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Map of CLI provider IDs to their binary names on disk.
|
|
123
|
+
* Used for lightweight binary-presence checks (PATH scan, no subprocess).
|
|
124
|
+
*/
|
|
125
|
+
const CLI_BINARY_MAP = {
|
|
126
|
+
"claude-code": "claude",
|
|
127
|
+
"openai-codex": "codex",
|
|
128
|
+
"google-gemini-cli": "gemini",
|
|
129
|
+
"google-antigravity": "antigravity",
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Check if a CLI provider's binary exists anywhere in PATH.
|
|
133
|
+
* Fast filesystem scan — no subprocess, no network, sub-1ms.
|
|
134
|
+
*/
|
|
135
|
+
function isCliBinaryInPath(providerId) {
|
|
136
|
+
const binary = CLI_BINARY_MAP[providerId];
|
|
137
|
+
if (!binary)
|
|
138
|
+
return false;
|
|
139
|
+
const pathDirs = (process.env.PATH ?? "").split(":");
|
|
140
|
+
return pathDirs.some(dir => dir && existsSync(join(dir, binary)));
|
|
141
|
+
}
|
|
99
142
|
function resolveKey(providerId) {
|
|
100
143
|
const info = PROVIDER_REGISTRY.find(p => p.id === providerId);
|
|
144
|
+
// claude-code never stores credentials in auth.json — GSD delegates entirely to
|
|
145
|
+
// the local CLI binary. Presence of the binary in PATH is the only signal.
|
|
146
|
+
if (providerId === "claude-code") {
|
|
147
|
+
return { found: isCliBinaryInPath("claude-code"), source: "env", backedOff: false };
|
|
148
|
+
}
|
|
101
149
|
if (providerId === "anthropic-vertex" && process.env.ANTHROPIC_VERTEX_PROJECT_ID) {
|
|
102
150
|
return { found: true, source: "env", backedOff: false };
|
|
103
151
|
}
|
|
@@ -137,26 +185,6 @@ function resolveKey(providerId) {
|
|
|
137
185
|
return { found: false, source: "none", backedOff: false };
|
|
138
186
|
}
|
|
139
187
|
// ── Individual check groups ────────────────────────────────────────────────────
|
|
140
|
-
/**
|
|
141
|
-
* Providers that can serve models normally associated with another provider.
|
|
142
|
-
* Key = the provider whose models can be served, Value = alternative providers to check.
|
|
143
|
-
* e.g. GitHub Copilot subscriptions can access Claude and GPT models.
|
|
144
|
-
*/
|
|
145
|
-
const PROVIDER_ROUTES = {
|
|
146
|
-
anthropic: ["github-copilot"],
|
|
147
|
-
openai: ["github-copilot", "openai-codex"],
|
|
148
|
-
google: ["google-gemini-cli"],
|
|
149
|
-
};
|
|
150
|
-
/**
|
|
151
|
-
* Providers that use external CLI authentication (not API keys).
|
|
152
|
-
* These are always considered "ok" — the host CLI handles auth.
|
|
153
|
-
*/
|
|
154
|
-
const CLI_AUTH_PROVIDERS = new Set([
|
|
155
|
-
"claude-code",
|
|
156
|
-
"openai-codex",
|
|
157
|
-
"google-gemini-cli",
|
|
158
|
-
"google-antigravity",
|
|
159
|
-
]);
|
|
160
188
|
function checkLlmProviders() {
|
|
161
189
|
const required = collectConfiguredModelProviders();
|
|
162
190
|
const results = [];
|
|
@@ -6,9 +6,10 @@ import { deriveState } from "./state.js";
|
|
|
6
6
|
import { saveFile } from "./files.js";
|
|
7
7
|
import { nativeIsRepo, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
8
8
|
import { readCrashLock, isLockProcessAlive, clearLock } from "./crash-recovery.js";
|
|
9
|
-
import { ensureGitignore } from "./gitignore.js";
|
|
9
|
+
import { ensureGitignore, isGsdGitignored } from "./gitignore.js";
|
|
10
10
|
import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
|
|
11
11
|
import { recoverFailedMigration } from "./migrate-external.js";
|
|
12
|
+
import { splitCompletedKey } from "./forensics.js";
|
|
12
13
|
export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldFix) {
|
|
13
14
|
const root = gsdRoot(basePath);
|
|
14
15
|
// ── Stale crash lock ──────────────────────────────────────────────────
|
|
@@ -107,9 +108,6 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
|
|
|
107
108
|
const keys = JSON.parse(raw);
|
|
108
109
|
const orphaned = [];
|
|
109
110
|
for (const key of keys) {
|
|
110
|
-
// Key format: "unitType/unitId" e.g. "execute-task/M001/S01/T01"
|
|
111
|
-
// Hook units have compound types: "hook/<hookName>/unitId"
|
|
112
|
-
const { splitCompletedKey } = await import("./forensics.js");
|
|
113
111
|
const parsed = splitCompletedKey(key);
|
|
114
112
|
if (!parsed)
|
|
115
113
|
continue;
|
|
@@ -352,6 +350,26 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
|
|
|
352
350
|
fixable: false,
|
|
353
351
|
});
|
|
354
352
|
}
|
|
353
|
+
// ── Symlinked .gsd without .gitignore entry (#4423) ──
|
|
354
|
+
// When `.gsd` is a symlink AND not gitignored, `git add -A -- :!.gsd/...`
|
|
355
|
+
// pathspecs fail with "beyond a symbolic link". Without self-heal this
|
|
356
|
+
// silently drops new user files during auto-commit.
|
|
357
|
+
if (nativeIsRepo(basePath) && !isGsdGitignored(basePath)) {
|
|
358
|
+
issues.push({
|
|
359
|
+
severity: "warning",
|
|
360
|
+
code: "symlinked_gsd_unignored",
|
|
361
|
+
scope: "project",
|
|
362
|
+
unitId: "project",
|
|
363
|
+
message: ".gsd is a symlink to external state but is not listed in .gitignore. This causes git pathspec exclusions to fail and can lead to silently dropped new files during auto-commit. Add `.gsd` to .gitignore.",
|
|
364
|
+
file: ".gitignore",
|
|
365
|
+
fixable: true,
|
|
366
|
+
});
|
|
367
|
+
if (shouldFix("symlinked_gsd_unignored")) {
|
|
368
|
+
const modified = ensureGitignore(basePath);
|
|
369
|
+
if (modified)
|
|
370
|
+
fixesApplied.push("added .gsd to .gitignore (symlinked external state)");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
355
373
|
}
|
|
356
374
|
}
|
|
357
375
|
}
|
|
@@ -154,8 +154,14 @@ function auditRequirements(content) {
|
|
|
154
154
|
const owner = block.match(/^-\s+Primary owning slice:\s+(.+)$/m)?.[1]?.trim().toLowerCase() ?? "";
|
|
155
155
|
const notes = block.match(/^-\s+Notes:\s+(.+)$/m)?.[1]?.trim().toLowerCase() ?? "";
|
|
156
156
|
if (status === "active" && (!owner || owner === "none" || owner === "none yet")) {
|
|
157
|
+
// #4414: Downgrade to warning. A newly-created requirement has
|
|
158
|
+
// primary_owner='' by default until the planning agent wires it to
|
|
159
|
+
// a slice via gsd_requirement_update. Flagging this as an error
|
|
160
|
+
// during normal planning is noisy — the real failure mode is when
|
|
161
|
+
// it persists past milestone completion, which is covered by other
|
|
162
|
+
// audits. Keep the signal but don't treat it as a blocker.
|
|
157
163
|
issues.push({
|
|
158
|
-
severity: "
|
|
164
|
+
severity: "warning",
|
|
159
165
|
code: "active_requirement_missing_owner",
|
|
160
166
|
scope: "project",
|
|
161
167
|
unitId: requirementId,
|
|
@@ -19,11 +19,14 @@ export function resetRetryState(state) {
|
|
|
19
19
|
}
|
|
20
20
|
// ── Classification ──────────────────────────────────────────────────────────
|
|
21
21
|
const PERMANENT_RE = /auth|unauthorized|forbidden|invalid.*key|invalid.*api|billing|quota exceeded|account/i;
|
|
22
|
-
|
|
22
|
+
// Include provider-specific quota-window phrasing like:
|
|
23
|
+
// - "You've hit your limit"
|
|
24
|
+
// - "usage limit" / "quota reached"
|
|
25
|
+
const RATE_LIMIT_RE = /rate.?limit|too many requests|429|hit your limit|usage limit|quota (?:reached|hit)|limit.*resets?/i;
|
|
23
26
|
// OpenRouter affordability-style quota errors should be treated as transient
|
|
24
27
|
// so core retry logic can lower maxTokens and continue in-session.
|
|
25
28
|
const AFFORDABILITY_RE = /requires more credits|can only afford|insufficient credits|not enough credits|fewer max_tokens/i;
|
|
26
|
-
const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|fetch failed|connection.*reset|dns/i;
|
|
29
|
+
const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|fetch failed|connection.*reset|dns|unexpected eof/i;
|
|
27
30
|
const SERVER_RE = /internal server error|500|502|503|overloaded|server_error|api_error|service.?unavailable/i;
|
|
28
31
|
// ECONNRESET/ECONNREFUSED are in NETWORK_RE (same-model retry first).
|
|
29
32
|
const CONNECTION_RE = /terminated|connection.?(?:refused|error)|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
|
|
@@ -36,7 +39,7 @@ const RESET_DELAY_RE = /reset in (\d+)s/i;
|
|
|
36
39
|
*
|
|
37
40
|
* Classification order:
|
|
38
41
|
* 1. Permanent (auth/billing/quota) — unless also rate-limited
|
|
39
|
-
* 2. Rate limit (429, rate.?limit, too many requests)
|
|
42
|
+
* 2. Rate limit (429, rate.?limit, too many requests, hit-your-limit/quota-window phrasing)
|
|
40
43
|
* 3. Network (ECONNRESET, ETIMEDOUT, socket hang up, fetch failed, dns)
|
|
41
44
|
* 4. Stream truncation (malformed JSON from mid-stream cut)
|
|
42
45
|
* 5. Server (500/502/503, overloaded, server_error)
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
// GSD Extension — ADR-011 Phase 2 Mid-Execution Escalation
|
|
2
|
+
//
|
|
3
|
+
// A single module that owns: escalation artifact I/O, detection, resolution,
|
|
4
|
+
// carry-forward injection lookup, and audit-event emission. Scoped to
|
|
5
|
+
// execute-task only (refine-slice escalation is deferred per ADR-011).
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { resolveSlicePath } from "./paths.js";
|
|
9
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
10
|
+
import { getTask, setTaskEscalationPending, setTaskEscalationAwaitingReview, clearTaskEscalationFlags, claimEscalationOverride, findUnappliedEscalationOverride, setTaskBlockerSource, listEscalationArtifacts, } from "./gsd-db.js";
|
|
11
|
+
import { emitUokAuditEvent, buildAuditEnvelope } from "./uok/audit.js";
|
|
12
|
+
import { logWarning } from "./workflow-logger.js";
|
|
13
|
+
// ─── Paths ────────────────────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Canonical escalation artifact path, parallel to T##-SUMMARY.md:
|
|
16
|
+
* .gsd/milestones/{M}/slices/{S}/tasks/{T}-ESCALATION.json
|
|
17
|
+
*/
|
|
18
|
+
export function escalationArtifactPath(basePath, milestoneId, sliceId, taskId) {
|
|
19
|
+
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
20
|
+
if (!sDir)
|
|
21
|
+
return null;
|
|
22
|
+
return join(sDir, "tasks", `${taskId}-ESCALATION.json`);
|
|
23
|
+
}
|
|
24
|
+
// ─── Artifact I/O ─────────────────────────────────────────────────────────
|
|
25
|
+
/** Build an EscalationArtifact from a gsd_complete_task escalation payload. */
|
|
26
|
+
export function buildEscalationArtifact(params) {
|
|
27
|
+
// Server-side validation — the MCP Type schema already constrains shape,
|
|
28
|
+
// but we belt-and-suspenders here so non-MCP callers can't construct
|
|
29
|
+
// malformed artifacts. These checks match readEscalationArtifact's.
|
|
30
|
+
if (!Array.isArray(params.options) || params.options.length < 2 || params.options.length > 4) {
|
|
31
|
+
throw new Error(`escalation.options must have between 2 and 4 entries (got ${params.options?.length ?? 0})`);
|
|
32
|
+
}
|
|
33
|
+
const optionIds = new Set(params.options.map((o) => o.id));
|
|
34
|
+
if (optionIds.size !== params.options.length) {
|
|
35
|
+
throw new Error("escalation.options must have unique ids");
|
|
36
|
+
}
|
|
37
|
+
if (!optionIds.has(params.recommendation)) {
|
|
38
|
+
throw new Error(`escalation.recommendation "${params.recommendation}" is not one of the option ids: ${[...optionIds].join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
version: 1,
|
|
42
|
+
taskId: params.taskId,
|
|
43
|
+
sliceId: params.sliceId,
|
|
44
|
+
milestoneId: params.milestoneId,
|
|
45
|
+
question: params.question,
|
|
46
|
+
options: params.options,
|
|
47
|
+
recommendation: params.recommendation,
|
|
48
|
+
recommendationRationale: params.recommendationRationale,
|
|
49
|
+
continueWithDefault: params.continueWithDefault,
|
|
50
|
+
createdAt: new Date().toISOString(),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Atomically write an escalation artifact and flip the appropriate DB flag. */
|
|
54
|
+
export function writeEscalationArtifact(basePath, artifact) {
|
|
55
|
+
const path = escalationArtifactPath(basePath, artifact.milestoneId, artifact.sliceId, artifact.taskId);
|
|
56
|
+
if (!path) {
|
|
57
|
+
throw new Error(`escalation: cannot resolve tasks dir for ${artifact.milestoneId}/${artifact.sliceId} — run doctor`);
|
|
58
|
+
}
|
|
59
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
60
|
+
atomicWriteSync(path, JSON.stringify(artifact, null, 2));
|
|
61
|
+
if (artifact.continueWithDefault) {
|
|
62
|
+
setTaskEscalationAwaitingReview(artifact.milestoneId, artifact.sliceId, artifact.taskId, path);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
setTaskEscalationPending(artifact.milestoneId, artifact.sliceId, artifact.taskId, path);
|
|
66
|
+
}
|
|
67
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
68
|
+
traceId: `escalation:${artifact.milestoneId}:${artifact.sliceId}:${artifact.taskId}`,
|
|
69
|
+
category: "gate",
|
|
70
|
+
type: "escalation-manual-attention-created",
|
|
71
|
+
payload: {
|
|
72
|
+
milestoneId: artifact.milestoneId,
|
|
73
|
+
sliceId: artifact.sliceId,
|
|
74
|
+
taskId: artifact.taskId,
|
|
75
|
+
continueWithDefault: artifact.continueWithDefault,
|
|
76
|
+
optionCount: artifact.options.length,
|
|
77
|
+
recommendation: artifact.recommendation,
|
|
78
|
+
},
|
|
79
|
+
}));
|
|
80
|
+
return path;
|
|
81
|
+
}
|
|
82
|
+
/** Read an escalation artifact by path. Returns null when missing or malformed. */
|
|
83
|
+
export function readEscalationArtifact(path) {
|
|
84
|
+
if (!existsSync(path))
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
const raw = readFileSync(path, "utf-8");
|
|
88
|
+
const parsed = JSON.parse(raw);
|
|
89
|
+
if (!parsed || typeof parsed !== "object")
|
|
90
|
+
return null;
|
|
91
|
+
const art = parsed;
|
|
92
|
+
// Full schema validation — invalid artifacts return null so downstream
|
|
93
|
+
// code (formatEscalationForDisplay, resolveEscalation, carry-forward)
|
|
94
|
+
// never crashes on malformed input.
|
|
95
|
+
if (art.version !== 1)
|
|
96
|
+
return null;
|
|
97
|
+
if (typeof art.taskId !== "string" || art.taskId.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
if (typeof art.sliceId !== "string" || art.sliceId.length === 0)
|
|
100
|
+
return null;
|
|
101
|
+
if (typeof art.milestoneId !== "string" || art.milestoneId.length === 0)
|
|
102
|
+
return null;
|
|
103
|
+
if (typeof art.question !== "string" || art.question.length === 0)
|
|
104
|
+
return null;
|
|
105
|
+
// Option array constraints — kept in sync with buildEscalationArtifact so
|
|
106
|
+
// a hand-edited artifact cannot be weaker than what the writer would emit.
|
|
107
|
+
if (!Array.isArray(art.options) || art.options.length < 2 || art.options.length > 4)
|
|
108
|
+
return null;
|
|
109
|
+
const optionIds = new Set();
|
|
110
|
+
for (const opt of art.options) {
|
|
111
|
+
if (!opt || typeof opt !== "object")
|
|
112
|
+
return null;
|
|
113
|
+
const o = opt;
|
|
114
|
+
if (typeof o.id !== "string" || o.id.length === 0)
|
|
115
|
+
return null;
|
|
116
|
+
if (typeof o.label !== "string")
|
|
117
|
+
return null;
|
|
118
|
+
if (typeof o.tradeoffs !== "string")
|
|
119
|
+
return null;
|
|
120
|
+
if (optionIds.has(o.id))
|
|
121
|
+
return null;
|
|
122
|
+
optionIds.add(o.id);
|
|
123
|
+
}
|
|
124
|
+
if (typeof art.recommendation !== "string")
|
|
125
|
+
return null;
|
|
126
|
+
// Recommendation must reference a real option id.
|
|
127
|
+
if (!art.options.some((o) => o.id === art.recommendation))
|
|
128
|
+
return null;
|
|
129
|
+
if (typeof art.continueWithDefault !== "boolean")
|
|
130
|
+
return null;
|
|
131
|
+
if (typeof art.createdAt !== "string")
|
|
132
|
+
return null;
|
|
133
|
+
return art;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ─── Detection ────────────────────────────────────────────────────────────
|
|
140
|
+
/**
|
|
141
|
+
* Returns the task id of the first task with an un-resolved pause-escalation
|
|
142
|
+
* (escalation_pending=1, not yet respondedAt). awaiting_review slices are NOT
|
|
143
|
+
* returned — they don't pause the loop.
|
|
144
|
+
*/
|
|
145
|
+
export function detectPendingEscalation(tasks, basePath) {
|
|
146
|
+
for (const t of tasks) {
|
|
147
|
+
if (t.escalation_pending !== 1)
|
|
148
|
+
continue;
|
|
149
|
+
if (!t.escalation_artifact_path)
|
|
150
|
+
continue;
|
|
151
|
+
const art = readEscalationArtifact(t.escalation_artifact_path);
|
|
152
|
+
if (art && !art.respondedAt)
|
|
153
|
+
return t.id;
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Apply a user response to a pending escalation:
|
|
159
|
+
* 1) Update the artifact with respondedAt/userChoice/userRationale.
|
|
160
|
+
* 2) Clear the DB escalation flags.
|
|
161
|
+
* 3) For "reject-blocker": set blocker_discovered=1 + blocker_source='reject-escalation'.
|
|
162
|
+
* 4) Emit audit events.
|
|
163
|
+
*
|
|
164
|
+
* Note: this does NOT persist a decision via saveDecisionToDb — the caller
|
|
165
|
+
* (commands/handlers/escalate.ts) owns that step so it can fail gracefully
|
|
166
|
+
* and surface the decision id in the user-visible message.
|
|
167
|
+
*/
|
|
168
|
+
export function resolveEscalation(basePath, milestoneId, sliceId, taskId, choice, rationale) {
|
|
169
|
+
const task = getTask(milestoneId, sliceId, taskId);
|
|
170
|
+
if (!task || !task.escalation_artifact_path) {
|
|
171
|
+
return { status: "not-found", message: `No escalation artifact found for ${milestoneId}/${sliceId}/${taskId}.` };
|
|
172
|
+
}
|
|
173
|
+
const art = readEscalationArtifact(task.escalation_artifact_path);
|
|
174
|
+
if (!art) {
|
|
175
|
+
return { status: "not-found", message: `Escalation artifact at ${task.escalation_artifact_path} is missing or malformed.` };
|
|
176
|
+
}
|
|
177
|
+
if (art.respondedAt) {
|
|
178
|
+
return { status: "already-resolved", message: `Escalation for ${taskId} was already resolved at ${art.respondedAt}.` };
|
|
179
|
+
}
|
|
180
|
+
// Resolve `choice` into a concrete option.
|
|
181
|
+
let chosenOption;
|
|
182
|
+
if (choice === "accept") {
|
|
183
|
+
chosenOption = art.options.find((o) => o.id === art.recommendation);
|
|
184
|
+
}
|
|
185
|
+
else if (choice === "reject-blocker") {
|
|
186
|
+
// Handled below; no option selection.
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
chosenOption = art.options.find((o) => o.id === choice);
|
|
190
|
+
if (!chosenOption) {
|
|
191
|
+
const valid = ["accept", "reject-blocker", ...art.options.map((o) => o.id)].join(", ");
|
|
192
|
+
return { status: "invalid-choice", message: `Unknown choice "${choice}". Valid choices: ${valid}.` };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const respondedAt = new Date().toISOString();
|
|
196
|
+
const updated = {
|
|
197
|
+
...art,
|
|
198
|
+
respondedAt,
|
|
199
|
+
userChoice: choice,
|
|
200
|
+
userRationale: rationale,
|
|
201
|
+
};
|
|
202
|
+
atomicWriteSync(task.escalation_artifact_path, JSON.stringify(updated, null, 2));
|
|
203
|
+
clearTaskEscalationFlags(milestoneId, sliceId, taskId);
|
|
204
|
+
if (choice === "reject-blocker") {
|
|
205
|
+
setTaskBlockerSource(milestoneId, sliceId, taskId, "reject-escalation");
|
|
206
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
207
|
+
traceId: `escalation:${milestoneId}:${sliceId}:${taskId}`,
|
|
208
|
+
category: "gate",
|
|
209
|
+
type: "escalation-rejected-to-blocker",
|
|
210
|
+
payload: { milestoneId, sliceId, taskId, rationale },
|
|
211
|
+
}));
|
|
212
|
+
return {
|
|
213
|
+
status: "rejected-to-blocker",
|
|
214
|
+
message: `Escalation rejected. Task ${taskId} now flagged as a blocker — next /gsd auto will replan slice ${sliceId}.`,
|
|
215
|
+
artifactPath: task.escalation_artifact_path,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
219
|
+
traceId: `escalation:${milestoneId}:${sliceId}:${taskId}`,
|
|
220
|
+
category: "gate",
|
|
221
|
+
type: "escalation-user-responded",
|
|
222
|
+
payload: {
|
|
223
|
+
milestoneId, sliceId, taskId,
|
|
224
|
+
chosenOptionId: chosenOption?.id,
|
|
225
|
+
rationale,
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
return {
|
|
229
|
+
status: "resolved",
|
|
230
|
+
message: `Escalation resolved. Next task in ${sliceId} will receive the override.`,
|
|
231
|
+
artifactPath: task.escalation_artifact_path,
|
|
232
|
+
chosenOption,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// ─── Carry-forward lookup ─────────────────────────────────────────────────
|
|
236
|
+
/**
|
|
237
|
+
* If this slice has a resolved-but-unapplied escalation override, atomically
|
|
238
|
+
* claim it (via DB UPDATE) and return the markdown block to prepend to the
|
|
239
|
+
* next task's prompt. Returns null when there's no unapplied override OR
|
|
240
|
+
* when another caller claimed it first (idempotent).
|
|
241
|
+
*/
|
|
242
|
+
export function claimOverrideForInjection(basePath, milestoneId, sliceId) {
|
|
243
|
+
const unapplied = findUnappliedEscalationOverride(milestoneId, sliceId);
|
|
244
|
+
if (!unapplied)
|
|
245
|
+
return null;
|
|
246
|
+
// Validate artifact BEFORE claiming so a missing/malformed file doesn't
|
|
247
|
+
// mark the DB row as applied (which would silently swallow the override
|
|
248
|
+
// forever). If the artifact is bad, return null without touching the row.
|
|
249
|
+
const art = readEscalationArtifact(unapplied.artifactPath);
|
|
250
|
+
if (!art) {
|
|
251
|
+
logWarning("tool", `escalation: artifact missing/malformed at ${unapplied.artifactPath} (task ${unapplied.taskId}); skipping without claim — operator should resolve or remove the row`);
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
if (!art.respondedAt || !art.userChoice)
|
|
255
|
+
return null;
|
|
256
|
+
const claimed = claimEscalationOverride(milestoneId, sliceId, unapplied.taskId);
|
|
257
|
+
if (!claimed)
|
|
258
|
+
return null; // lost the race
|
|
259
|
+
void basePath;
|
|
260
|
+
return {
|
|
261
|
+
injectionBlock: formatOverrideBlock(art),
|
|
262
|
+
sourceTaskId: unapplied.taskId,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function formatOverrideBlock(art) {
|
|
266
|
+
const isReject = art.userChoice === "reject-blocker";
|
|
267
|
+
const isAccept = art.userChoice === "accept";
|
|
268
|
+
const isOptionChoice = !!art.userChoice && !isReject && !isAccept;
|
|
269
|
+
// Include the stable option id in the block so downstream prompts and
|
|
270
|
+
// parsers have a machine-readable token, not just the display label.
|
|
271
|
+
const choiceLabel = isReject
|
|
272
|
+
? "rejected — blocker path"
|
|
273
|
+
: isAccept
|
|
274
|
+
? `accepted recommendation (${art.recommendation})`
|
|
275
|
+
: isOptionChoice
|
|
276
|
+
? `${art.options.find((o) => o.id === art.userChoice)?.label ?? art.userChoice} (id: ${art.userChoice})`
|
|
277
|
+
: (art.userChoice ?? "unknown");
|
|
278
|
+
const tradeoffs = isOptionChoice
|
|
279
|
+
? art.options.find((o) => o.id === art.userChoice)?.tradeoffs ?? ""
|
|
280
|
+
: "";
|
|
281
|
+
const rationale = art.userRationale ? `\n\n**User rationale:** ${art.userRationale}` : "";
|
|
282
|
+
return [
|
|
283
|
+
`## Escalation Override (from ${art.taskId})`,
|
|
284
|
+
"",
|
|
285
|
+
`During ${art.taskId} the executor escalated: **${art.question}**`,
|
|
286
|
+
"",
|
|
287
|
+
`The user's resolution: **${choiceLabel}**.${rationale}`,
|
|
288
|
+
tradeoffs ? `\n**Tradeoffs of this choice:** ${tradeoffs}` : "",
|
|
289
|
+
"",
|
|
290
|
+
"Apply this decision as a hard constraint for the current task. If it contradicts the task plan, surface the conflict in your summary rather than silently deviating.",
|
|
291
|
+
].filter((line) => line !== undefined).join("\n");
|
|
292
|
+
}
|
|
293
|
+
// ─── Display ──────────────────────────────────────────────────────────────
|
|
294
|
+
/** Human-readable summary of an artifact for `/gsd escalate show`. */
|
|
295
|
+
export function formatEscalationForDisplay(art) {
|
|
296
|
+
const resolved = art.respondedAt
|
|
297
|
+
? `\nResolved: ${art.respondedAt} — user chose "${art.userChoice}"${art.userRationale ? ` (rationale: ${art.userRationale})` : ""}`
|
|
298
|
+
: "\nStatus: awaiting user response";
|
|
299
|
+
const optionLines = art.options.map((o) => ` [${o.id}] ${o.label}${o.id === art.recommendation ? " (recommended)" : ""}\n ${o.tradeoffs}`).join("\n");
|
|
300
|
+
return [
|
|
301
|
+
`Task ${art.taskId} (slice ${art.sliceId})`,
|
|
302
|
+
`continueWithDefault: ${art.continueWithDefault}`,
|
|
303
|
+
`Question: ${art.question}`,
|
|
304
|
+
"",
|
|
305
|
+
"Options:",
|
|
306
|
+
optionLines,
|
|
307
|
+
"",
|
|
308
|
+
`Recommendation: ${art.recommendation} — ${art.recommendationRationale}`,
|
|
309
|
+
resolved,
|
|
310
|
+
"",
|
|
311
|
+
`Resolve with: /gsd escalate resolve ${art.taskId} <${art.options.map((o) => o.id).join("|")}|accept|reject-blocker> [rationale...]`,
|
|
312
|
+
].join("\n");
|
|
313
|
+
}
|
|
314
|
+
/** List actionable (unresolved) escalations for `/gsd escalate list`. */
|
|
315
|
+
export function listActionableEscalations(milestoneId) {
|
|
316
|
+
return listEscalationArtifacts(milestoneId, /* includeResolved */ false);
|
|
317
|
+
}
|
|
318
|
+
/** List every escalation (including resolved) for `/gsd escalate list --all`. */
|
|
319
|
+
export function listAllEscalations(milestoneId) {
|
|
320
|
+
return listEscalationArtifacts(milestoneId, /* includeResolved */ true);
|
|
321
|
+
}
|
|
@@ -451,7 +451,32 @@ function gatherActivityLogMeta(basePath, activeMilestone) {
|
|
|
451
451
|
return null;
|
|
452
452
|
}
|
|
453
453
|
}
|
|
454
|
-
// ─── Completed Keys
|
|
454
|
+
// ─── Completed Keys Helpers ───────────────────────────────────────────────────
|
|
455
|
+
/**
|
|
456
|
+
* Parse a completed-unit key into { unitType, unitId }.
|
|
457
|
+
*
|
|
458
|
+
* Most unit types are a single segment ("execute-task", "complete-slice", …)
|
|
459
|
+
* so the key format is simply "unitType/unitId". Hook units are the exception:
|
|
460
|
+
* their type is compound ("hook/<hookName>"), making the key look like
|
|
461
|
+
* "hook/telegram-progress/M007/S01". Splitting naïvely on the first slash
|
|
462
|
+
* yields unitType="hook" which bypasses verifyExpectedArtifact()'s
|
|
463
|
+
* startsWith("hook/") guard and produces false-positive missing-artifact
|
|
464
|
+
* errors (#2826).
|
|
465
|
+
*
|
|
466
|
+
* Returns null for malformed keys (no slash, or hook/ with no second slash).
|
|
467
|
+
*/
|
|
468
|
+
export function splitCompletedKey(key) {
|
|
469
|
+
if (key.startsWith("hook/")) {
|
|
470
|
+
const secondSlash = key.indexOf("/", 5); // skip past "hook/"
|
|
471
|
+
if (secondSlash === -1)
|
|
472
|
+
return null; // malformed — "hook/" with no hook name
|
|
473
|
+
return { unitType: key.slice(0, secondSlash), unitId: key.slice(secondSlash + 1) };
|
|
474
|
+
}
|
|
475
|
+
const slashIdx = key.indexOf("/");
|
|
476
|
+
if (slashIdx === -1)
|
|
477
|
+
return null;
|
|
478
|
+
return { unitType: key.slice(0, slashIdx), unitId: key.slice(slashIdx + 1) };
|
|
479
|
+
}
|
|
455
480
|
function loadCompletedKeys(basePath) {
|
|
456
481
|
const file = join(gsdRoot(basePath), "completed-units.json");
|
|
457
482
|
try {
|
|
@@ -583,34 +608,6 @@ function detectTimeouts(traces, anomalies) {
|
|
|
583
608
|
}
|
|
584
609
|
}
|
|
585
610
|
}
|
|
586
|
-
/**
|
|
587
|
-
* Parse a completed-unit key into its unitType and unitId.
|
|
588
|
-
*
|
|
589
|
-
* Hook units use a compound slash-delimited type ("hook/<hookName>"), so a
|
|
590
|
-
* naive `key.indexOf("/")` would split "hook/telegram-progress/M007/S01" into
|
|
591
|
-
* unitType="hook" (wrong) instead of "hook/telegram-progress".
|
|
592
|
-
*
|
|
593
|
-
* Returns `null` for malformed keys that cannot be split.
|
|
594
|
-
*/
|
|
595
|
-
export function splitCompletedKey(key) {
|
|
596
|
-
if (key.startsWith("hook/")) {
|
|
597
|
-
// Hook unit types are two segments: "hook/<hookName>/<unitId...>"
|
|
598
|
-
const secondSlash = key.indexOf("/", 5); // skip past "hook/"
|
|
599
|
-
if (secondSlash === -1)
|
|
600
|
-
return null; // malformed — no unitId after hook name
|
|
601
|
-
return {
|
|
602
|
-
unitType: key.slice(0, secondSlash),
|
|
603
|
-
unitId: key.slice(secondSlash + 1),
|
|
604
|
-
};
|
|
605
|
-
}
|
|
606
|
-
const slashIdx = key.indexOf("/");
|
|
607
|
-
if (slashIdx === -1)
|
|
608
|
-
return null;
|
|
609
|
-
return {
|
|
610
|
-
unitType: key.slice(0, slashIdx),
|
|
611
|
-
unitId: key.slice(slashIdx + 1),
|
|
612
|
-
};
|
|
613
|
-
}
|
|
614
611
|
function detectMissingArtifacts(completedKeys, basePath, activeMilestone, anomalies) {
|
|
615
612
|
// Also check the worktree path for artifacts — they may exist there but not at root
|
|
616
613
|
const wtBasePath = activeMilestone ? getAutoWorktreePath(basePath, activeMilestone) : null;
|
|
@@ -574,7 +574,6 @@ export class GitServiceImpl {
|
|
|
574
574
|
* Run pre-merge verification check. Auto-detects test runner from project
|
|
575
575
|
* files, or uses custom command from prefs.pre_merge_check.
|
|
576
576
|
* Gated on prefs.pre_merge_check (false = skip, string = custom command).
|
|
577
|
-
* Stub: to be implemented in T03.
|
|
578
577
|
*/
|
|
579
578
|
runPreMergeCheck() {
|
|
580
579
|
if (this.prefs.pre_merge_check === false) {
|
|
@@ -129,6 +129,32 @@ export function markStepComplete(graph, stepId) {
|
|
|
129
129
|
: s),
|
|
130
130
|
};
|
|
131
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Return a new graph with the specified step marked as "active".
|
|
134
|
+
* Immutable — does not mutate the input graph.
|
|
135
|
+
*
|
|
136
|
+
* @param graph — the current workflow graph
|
|
137
|
+
* @param stepId — ID of the step to mark active
|
|
138
|
+
* @returns New graph with the step's status set to "active"
|
|
139
|
+
* @throws Error if stepId is not found in the graph
|
|
140
|
+
*/
|
|
141
|
+
export function markStepActive(graph, stepId) {
|
|
142
|
+
const found = graph.steps.some((s) => s.id === stepId);
|
|
143
|
+
if (!found) {
|
|
144
|
+
throw new Error(`Step not found: ${stepId}`);
|
|
145
|
+
}
|
|
146
|
+
const startedAt = new Date().toISOString();
|
|
147
|
+
return {
|
|
148
|
+
...graph,
|
|
149
|
+
steps: graph.steps.map((s) => s.id === stepId
|
|
150
|
+
? {
|
|
151
|
+
...s,
|
|
152
|
+
status: "active",
|
|
153
|
+
startedAt: s.startedAt ?? startedAt,
|
|
154
|
+
}
|
|
155
|
+
: s),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
132
158
|
// ─── Iteration expansion ─────────────────────────────────────────────────
|
|
133
159
|
/**
|
|
134
160
|
* Expand an iterate step into concrete instances. Pure and deterministic —
|
|
@@ -221,5 +247,3 @@ export function initializeGraph(def) {
|
|
|
221
247
|
},
|
|
222
248
|
};
|
|
223
249
|
}
|
|
224
|
-
/** @deprecated Use initializeGraph instead. Kept for backward compatibility. */
|
|
225
|
-
export { initializeGraph as graphFromDefinition };
|