gsd-pi 2.50.0 → 2.51.0-dev.7d435fe
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 +6 -4
- package/dist/cli.js +26 -0
- package/dist/headless-events.d.ts +18 -0
- package/dist/headless-events.js +36 -0
- package/dist/headless-types.d.ts +28 -0
- package/dist/headless-types.js +7 -0
- package/dist/headless.d.ts +8 -3
- package/dist/headless.js +47 -16
- package/dist/help-text.js +16 -5
- package/dist/loader.js +4 -0
- package/dist/onboarding.js +5 -4
- package/dist/remote-questions-config.js +1 -1
- package/dist/resource-loader.d.ts +4 -1
- package/dist/resource-loader.js +138 -3
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +32 -18
- package/dist/resources/extensions/bg-shell/interaction.js +3 -1
- package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +18 -19
- package/dist/resources/extensions/gsd/auto/phases.js +16 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +98 -53
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +37 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +57 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +21 -25
- package/dist/resources/extensions/gsd/auto-start.js +2 -0
- package/dist/resources/extensions/gsd/auto-timers.js +24 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +25 -7
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +21 -0
- package/dist/resources/extensions/gsd/auto.js +19 -7
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +95 -69
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +12 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -1
- package/dist/resources/extensions/gsd/claude-import.js +60 -9
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +69 -6
- package/dist/resources/extensions/gsd/commands-config.js +10 -5
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
- package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
- package/dist/resources/extensions/gsd/custom-verification.js +3 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
- package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
- package/dist/resources/extensions/gsd/detection.js +595 -9
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +18 -3
- package/dist/resources/extensions/gsd/error-classifier.js +105 -0
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/gitignore.js +7 -7
- package/dist/resources/extensions/gsd/gsd-db.js +298 -45
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +11 -3
- package/dist/resources/extensions/gsd/key-manager.js +7 -16
- package/dist/resources/extensions/gsd/memory-store.js +28 -13
- package/dist/resources/extensions/gsd/milestone-actions.js +19 -0
- package/dist/resources/extensions/gsd/model-router.js +25 -0
- package/dist/resources/extensions/gsd/notifications.js +23 -0
- package/dist/resources/extensions/gsd/observability-validator.js +422 -0
- package/dist/resources/extensions/gsd/preferences-models.js +1 -13
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -36
- package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
- package/dist/resources/extensions/gsd/rtk-status.js +43 -0
- package/dist/resources/extensions/gsd/rule-registry.js +11 -12
- package/dist/resources/extensions/gsd/service-tier.js +13 -2
- package/dist/resources/extensions/gsd/session-forensics.js +7 -3
- package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
- package/dist/resources/extensions/gsd/state.js +38 -7
- package/dist/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +2 -0
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -10
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -17
- package/dist/resources/extensions/gsd/tools/complete-task.js +7 -18
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +26 -17
- package/dist/resources/extensions/gsd/tools/plan-slice.js +25 -14
- package/dist/resources/extensions/gsd/tools/plan-task.js +21 -11
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +47 -37
- package/dist/resources/extensions/gsd/tools/replan-slice.js +49 -38
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +23 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +0 -1
- package/dist/resources/extensions/remote-questions/config.js +1 -1
- package/dist/resources/extensions/remote-questions/remote-command.js +1 -1
- package/dist/resources/extensions/search-the-web/native-search.js +1 -1
- package/dist/resources/extensions/search-the-web/provider.js +1 -1
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- package/dist/rtk.d.ts +52 -0
- package/dist/rtk.js +332 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.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 +2 -2
- 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.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- 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/boot/route_client-reference-manifest.js +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/input/route_client-reference-manifest.js +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/resize/route_client-reference-manifest.js +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/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +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/captures/route_client-reference-manifest.js +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/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +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/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +3 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
- 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/export-data/route_client-reference-manifest.js +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/files/route_client-reference-manifest.js +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/forensics/route_client-reference-manifest.js +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/git/route_client-reference-manifest.js +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/history/route_client-reference-manifest.js +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/hooks/route_client-reference-manifest.js +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/inspect/route_client-reference-manifest.js +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/knowledge/route_client-reference-manifest.js +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/live-state/route_client-reference-manifest.js +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/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +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/projects/route_client-reference-manifest.js +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/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -26
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +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/browser/route_client-reference-manifest.js +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/command/route_client-reference-manifest.js +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/events/route_client-reference-manifest.js +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/session/manage/route_client-reference-manifest.js +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/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +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/skill-health/route_client-reference-manifest.js +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/steer/route_client-reference-manifest.js +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/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +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/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +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/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.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/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- 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 +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
- package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
- package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/RqOU-jOv9uZ1Q03P6L6nn/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/4024.21054f459af5cc78.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-024d82be84800e52.js +1 -0
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/wizard.js +4 -1
- package/package.json +2 -2
- package/packages/pi-ai/dist/models.d.ts +14 -3
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +53 -10
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +102 -1
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +31 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/models.test.ts +114 -1
- package/packages/pi-ai/src/models.ts +70 -13
- package/packages/pi-ai/src/types.ts +32 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +3 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +15 -2
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.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 +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -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/extensions/wrapper.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +9 -4
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +30 -8
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +83 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +5 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -3
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +5 -3
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/index.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 +3 -2
- 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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +28 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +49 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +114 -6
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js +831 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +66 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +0 -1
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +4 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +15 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +10 -3
- package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
- package/packages/pi-coding-agent/src/core/skills.ts +35 -10
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +101 -0
- package/packages/pi-coding-agent/src/core/tools/bash.ts +5 -1
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +5 -3
- package/packages/pi-coding-agent/src/modes/index.ts +8 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +6 -4
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +54 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +124 -6
- package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +61 -4
- package/packages/pi-coding-agent/src/utils/shell.ts +0 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +2 -1
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/postinstall.js +163 -6
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +25 -12
- package/src/resources/extensions/bg-shell/interaction.ts +3 -1
- package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +19 -20
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +21 -0
- package/src/resources/extensions/gsd/auto/phases.ts +15 -1
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +31 -3
- package/src/resources/extensions/gsd/auto-dispatch.ts +102 -50
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -83
- package/src/resources/extensions/gsd/auto-prompts.ts +48 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +19 -26
- package/src/resources/extensions/gsd/auto-start.ts +2 -0
- package/src/resources/extensions/gsd/auto-timers.ts +25 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +30 -6
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +21 -0
- package/src/resources/extensions/gsd/auto.ts +20 -7
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +115 -72
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +11 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -1
- package/src/resources/extensions/gsd/claude-import.ts +58 -9
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +73 -6
- package/src/resources/extensions/gsd/commands-config.ts +11 -5
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
- package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
- package/src/resources/extensions/gsd/custom-verification.ts +3 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
- package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
- package/src/resources/extensions/gsd/detection.ts +668 -9
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +18 -3
- package/src/resources/extensions/gsd/error-classifier.ts +139 -0
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/gitignore.ts +7 -7
- package/src/resources/extensions/gsd/gsd-db.ts +355 -63
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +11 -3
- package/src/resources/extensions/gsd/key-manager.ts +7 -16
- package/src/resources/extensions/gsd/memory-store.ts +29 -18
- package/src/resources/extensions/gsd/milestone-actions.ts +17 -0
- package/src/resources/extensions/gsd/model-router.ts +25 -0
- package/src/resources/extensions/gsd/notifications.ts +23 -0
- package/src/resources/extensions/gsd/observability-validator.ts +456 -0
- package/src/resources/extensions/gsd/preferences-models.ts +1 -13
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
- package/src/resources/extensions/gsd/preferences-types.ts +20 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -48
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/rtk-status.ts +53 -0
- package/src/resources/extensions/gsd/rule-registry.ts +11 -12
- package/src/resources/extensions/gsd/service-tier.ts +14 -2
- package/src/resources/extensions/gsd/session-forensics.ts +7 -3
- package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
- package/src/resources/extensions/gsd/state.ts +38 -7
- package/src/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +2 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +39 -10
- package/src/resources/extensions/gsd/tests/detection.test.ts +839 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +77 -70
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +56 -21
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +81 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +130 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -14
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -21
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -22
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +28 -18
- package/src/resources/extensions/gsd/tools/plan-slice.ts +28 -16
- package/src/resources/extensions/gsd/tools/plan-task.ts +24 -12
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +54 -42
- package/src/resources/extensions/gsd/tools/replan-slice.ts +53 -40
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +26 -20
- package/src/resources/extensions/gsd/types.ts +2 -0
- package/src/resources/extensions/gsd/undo.ts +8 -7
- package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
- package/src/resources/extensions/gsd/verification-gate.ts +3 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
- package/src/resources/extensions/remote-questions/config.ts +1 -1
- package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/src/resources/extensions/search-the-web/native-search.ts +1 -1
- package/src/resources/extensions/search-the-web/provider.ts +1 -1
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- package/dist/web/standalone/.next/server/chunks/229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/441.js +0 -2
- package/dist/web/standalone/.next/server/chunks/471.js +0 -13
- package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- /package/dist/web/standalone/.next/static/{MQOhBnkC_TLtNn_JvZWDj → RqOU-jOv9uZ1Q03P6L6nn}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provider error handling tests — consolidated from:
|
|
3
|
-
* - provider-error-classify.test.ts (
|
|
3
|
+
* - provider-error-classify.test.ts (classifyError)
|
|
4
4
|
* - network-error-fallback.test.ts (isTransientNetworkError, getNextFallbackModel)
|
|
5
5
|
* - agent-end-provider-error.test.ts (pauseAutoForProviderError)
|
|
6
6
|
*/
|
|
@@ -10,102 +10,111 @@ import assert from "node:assert/strict";
|
|
|
10
10
|
import { readFileSync } from "node:fs";
|
|
11
11
|
import { join, dirname } from "node:path";
|
|
12
12
|
import { fileURLToPath } from "node:url";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { classifyError, isTransient, isTransientNetworkError } from "../error-classifier.ts";
|
|
14
|
+
import { pauseAutoForProviderError } from "../provider-error-pause.ts";
|
|
15
|
+
import { getNextFallbackModel } from "../preferences.ts";
|
|
15
16
|
|
|
16
17
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
18
|
|
|
18
|
-
// ──
|
|
19
|
+
// ── classifyError ────────────────────────────────────────────────────────────
|
|
19
20
|
|
|
20
|
-
test("
|
|
21
|
-
const result =
|
|
22
|
-
assert.ok(result
|
|
23
|
-
assert.
|
|
24
|
-
assert.ok(result.
|
|
21
|
+
test("classifyError detects rate limit from 429", () => {
|
|
22
|
+
const result = classifyError("HTTP 429 Too Many Requests");
|
|
23
|
+
assert.ok(isTransient(result));
|
|
24
|
+
assert.equal(result.kind, "rate-limit");
|
|
25
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs > 0);
|
|
25
26
|
});
|
|
26
27
|
|
|
27
|
-
test("
|
|
28
|
-
const result =
|
|
29
|
-
assert.ok(result
|
|
30
|
-
assert.
|
|
28
|
+
test("classifyError detects rate limit from message", () => {
|
|
29
|
+
const result = classifyError("rate limit exceeded");
|
|
30
|
+
assert.ok(isTransient(result));
|
|
31
|
+
assert.equal(result.kind, "rate-limit");
|
|
31
32
|
});
|
|
32
33
|
|
|
33
|
-
test("
|
|
34
|
-
const result =
|
|
35
|
-
assert.
|
|
36
|
-
assert.
|
|
34
|
+
test("classifyError extracts reset delay from message", () => {
|
|
35
|
+
const result = classifyError("rate limit exceeded, reset in 45s");
|
|
36
|
+
assert.equal(result.kind, "rate-limit");
|
|
37
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 45000);
|
|
37
38
|
});
|
|
38
39
|
|
|
39
|
-
test("
|
|
40
|
-
const result =
|
|
41
|
-
assert.
|
|
42
|
-
assert.
|
|
40
|
+
test("classifyError defaults to 60s for rate limit without reset", () => {
|
|
41
|
+
const result = classifyError("429 too many requests");
|
|
42
|
+
assert.equal(result.kind, "rate-limit");
|
|
43
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 60_000);
|
|
43
44
|
});
|
|
44
45
|
|
|
45
|
-
test("
|
|
46
|
+
test("classifyError treats stream_exhausted_without_result as transient connection failure", () => {
|
|
47
|
+
const result = classifyError("stream_exhausted_without_result");
|
|
48
|
+
assert.ok(isTransient(result));
|
|
49
|
+
assert.equal(result.kind, "connection");
|
|
50
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 15_000);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("classifyError detects Anthropic internal server error", () => {
|
|
46
54
|
const msg = '{"type":"error","error":{"details":null,"type":"api_error","message":"Internal server error"}}';
|
|
47
|
-
const result =
|
|
48
|
-
assert.ok(result
|
|
49
|
-
assert.
|
|
50
|
-
assert.
|
|
55
|
+
const result = classifyError(msg);
|
|
56
|
+
assert.ok(isTransient(result));
|
|
57
|
+
assert.equal(result.kind, "server");
|
|
58
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
|
|
51
59
|
});
|
|
52
60
|
|
|
53
|
-
test("
|
|
61
|
+
test("classifyError detects Codex server_error from extracted message", () => {
|
|
54
62
|
// After fix, mapCodexEvents extracts the nested error type and produces
|
|
55
63
|
// "Codex server_error: <message>" instead of raw JSON.
|
|
56
64
|
const msg = "Codex server_error: An error occurred while processing your request.";
|
|
57
|
-
const result =
|
|
58
|
-
assert.ok(result
|
|
59
|
-
assert.
|
|
60
|
-
assert.
|
|
65
|
+
const result = classifyError(msg);
|
|
66
|
+
assert.ok(isTransient(result));
|
|
67
|
+
assert.equal(result.kind, "server");
|
|
68
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
|
|
61
69
|
});
|
|
62
70
|
|
|
63
|
-
test("
|
|
64
|
-
const result =
|
|
65
|
-
assert.ok(result
|
|
66
|
-
assert.
|
|
71
|
+
test("classifyError detects overloaded error", () => {
|
|
72
|
+
const result = classifyError("overloaded_error: Overloaded");
|
|
73
|
+
assert.ok(isTransient(result));
|
|
74
|
+
assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
|
|
67
75
|
});
|
|
68
76
|
|
|
69
|
-
test("
|
|
70
|
-
const result =
|
|
71
|
-
assert.ok(result
|
|
77
|
+
test("classifyError detects 503 service unavailable", () => {
|
|
78
|
+
const result = classifyError("HTTP 503 Service Unavailable");
|
|
79
|
+
assert.ok(isTransient(result));
|
|
72
80
|
});
|
|
73
81
|
|
|
74
|
-
test("
|
|
75
|
-
const result =
|
|
76
|
-
assert.ok(result
|
|
82
|
+
test("classifyError detects 502 bad gateway", () => {
|
|
83
|
+
const result = classifyError("HTTP 502 Bad Gateway");
|
|
84
|
+
assert.ok(isTransient(result));
|
|
77
85
|
});
|
|
78
86
|
|
|
79
|
-
test("
|
|
80
|
-
const result =
|
|
81
|
-
assert.ok(!result
|
|
82
|
-
assert.
|
|
87
|
+
test("classifyError detects auth error as permanent", () => {
|
|
88
|
+
const result = classifyError("unauthorized: invalid API key");
|
|
89
|
+
assert.ok(!isTransient(result));
|
|
90
|
+
assert.equal(result.kind, "permanent");
|
|
83
91
|
});
|
|
84
92
|
|
|
85
|
-
test("
|
|
86
|
-
const result =
|
|
87
|
-
assert.ok(!result
|
|
93
|
+
test("classifyError detects billing error as permanent", () => {
|
|
94
|
+
const result = classifyError("billing issue: payment required");
|
|
95
|
+
assert.ok(!isTransient(result));
|
|
88
96
|
});
|
|
89
97
|
|
|
90
|
-
test("
|
|
91
|
-
const result =
|
|
92
|
-
assert.ok(!result
|
|
98
|
+
test("classifyError detects quota exceeded as permanent", () => {
|
|
99
|
+
const result = classifyError("quota exceeded for this month");
|
|
100
|
+
assert.ok(!isTransient(result));
|
|
93
101
|
});
|
|
94
102
|
|
|
95
|
-
test("
|
|
96
|
-
const result =
|
|
97
|
-
assert.ok(!result
|
|
103
|
+
test("classifyError treats unknown error as not transient", () => {
|
|
104
|
+
const result = classifyError("something went wrong");
|
|
105
|
+
assert.ok(!isTransient(result));
|
|
106
|
+
assert.equal(result.kind, "unknown");
|
|
98
107
|
});
|
|
99
108
|
|
|
100
|
-
test("
|
|
101
|
-
const result =
|
|
102
|
-
assert.ok(!result
|
|
109
|
+
test("classifyError treats empty string as not transient", () => {
|
|
110
|
+
const result = classifyError("");
|
|
111
|
+
assert.ok(!isTransient(result));
|
|
103
112
|
});
|
|
104
113
|
|
|
105
|
-
test("
|
|
106
|
-
const result =
|
|
107
|
-
assert.
|
|
108
|
-
assert.ok(result
|
|
114
|
+
test("classifyError: rate limit takes precedence over auth keywords", () => {
|
|
115
|
+
const result = classifyError("429 unauthorized rate limit");
|
|
116
|
+
assert.equal(result.kind, "rate-limit");
|
|
117
|
+
assert.ok(isTransient(result));
|
|
109
118
|
});
|
|
110
119
|
|
|
111
120
|
// ── isTransientNetworkError ──────────────────────────────────────────────────
|
|
@@ -265,8 +274,8 @@ test("agent-end-recovery.ts tracks consecutive transient errors for escalating b
|
|
|
265
274
|
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
266
275
|
|
|
267
276
|
assert.ok(
|
|
268
|
-
src.includes("
|
|
269
|
-
"agent-end-recovery.ts must track
|
|
277
|
+
src.includes("consecutiveTransientCount"),
|
|
278
|
+
"agent-end-recovery.ts must track consecutiveTransientCount for escalating backoff (#1166)",
|
|
270
279
|
);
|
|
271
280
|
assert.ok(
|
|
272
281
|
src.includes("MAX_TRANSIENT_AUTO_RESUMES"),
|
|
@@ -274,15 +283,13 @@ test("agent-end-recovery.ts tracks consecutive transient errors for escalating b
|
|
|
274
283
|
);
|
|
275
284
|
});
|
|
276
285
|
|
|
277
|
-
test("agent-end-recovery.ts resets
|
|
286
|
+
test("agent-end-recovery.ts resets retry state before resolveAgentEnd on success", () => {
|
|
278
287
|
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
279
288
|
|
|
280
|
-
// After successful agent_end
|
|
281
|
-
// Use a regex across the success block so CRLF checkouts on Windows do not
|
|
282
|
-
// push the reset line outside a fixed substring window.
|
|
289
|
+
// After successful agent_end, resetRetryState must be called before resolveAgentEnd.
|
|
283
290
|
assert.ok(
|
|
284
|
-
/
|
|
285
|
-
"
|
|
291
|
+
/resetRetryState[\s\S]{0,250}resolveAgentEnd/.test(src),
|
|
292
|
+
"resetRetryState must be called before resolveAgentEnd on the success path (#1166)",
|
|
286
293
|
);
|
|
287
294
|
});
|
|
288
295
|
|
|
@@ -291,7 +298,7 @@ test("agent-end-recovery.ts applies escalating delay for repeated transient erro
|
|
|
291
298
|
|
|
292
299
|
// Must contain the exponential backoff formula (may span multiple lines)
|
|
293
300
|
assert.ok(
|
|
294
|
-
src.includes("2 ** Math.max(0,
|
|
301
|
+
src.includes("2 ** Math.max(0, retryState.consecutiveTransientCount"),
|
|
295
302
|
"agent-end-recovery.ts must escalate retryAfterMs exponentially for consecutive transient errors (#1166)",
|
|
296
303
|
);
|
|
297
304
|
});
|
|
@@ -292,4 +292,44 @@ test('E2E: depends_on inline format preserved after partial removal', () => {
|
|
|
292
292
|
}
|
|
293
293
|
});
|
|
294
294
|
|
|
295
|
+
test('E2E: DB-backed path respects queue order (#2556)', async () => {
|
|
296
|
+
// Regression test for #2556: getActiveMilestoneId and deriveStateFromDb
|
|
297
|
+
// used lexicographic sort instead of queue order, causing a deadlock when
|
|
298
|
+
// the dispatch guard (which respects queue order) blocked completion.
|
|
299
|
+
const base = createFixtureBase();
|
|
300
|
+
try {
|
|
301
|
+
const { openDatabase, closeDatabase, insertMilestone, isDbAvailable } = await import('../gsd-db.ts');
|
|
302
|
+
const dbPath = join(base, '.gsd', 'gsd.db');
|
|
303
|
+
|
|
304
|
+
// Create milestone directories (required for findMilestoneIds)
|
|
305
|
+
writeMilestoneDir(base, 'M006');
|
|
306
|
+
writeContext(base, 'M006', '', 'Earlier milestone');
|
|
307
|
+
writeMilestoneDir(base, 'M008');
|
|
308
|
+
writeContext(base, 'M008', '', 'Later milestone');
|
|
309
|
+
|
|
310
|
+
// Open DB and insert milestones
|
|
311
|
+
openDatabase(dbPath);
|
|
312
|
+
try {
|
|
313
|
+
insertMilestone({ id: 'M006', title: 'Earlier', status: 'active' });
|
|
314
|
+
insertMilestone({ id: 'M008', title: 'Later', status: 'active' });
|
|
315
|
+
|
|
316
|
+
// Set queue order: M008 should come FIRST (user reordered via /gsd queue)
|
|
317
|
+
saveQueueOrder(base, ['M008', 'M006']);
|
|
318
|
+
|
|
319
|
+
// deriveState should pick M008 (queue-first), not M006 (ID-first)
|
|
320
|
+
invalidateStateCache();
|
|
321
|
+
const state = await deriveState(base);
|
|
322
|
+
assert.equal(
|
|
323
|
+
state.activeMilestone?.id,
|
|
324
|
+
'M008',
|
|
325
|
+
'DB-backed deriveState must respect queue order — M008 is queued first',
|
|
326
|
+
);
|
|
327
|
+
} finally {
|
|
328
|
+
if (isDbAvailable()) closeDatabase();
|
|
329
|
+
}
|
|
330
|
+
} finally {
|
|
331
|
+
cleanup(base);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
|
|
295
335
|
});
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "../reactive-graph.ts";
|
|
16
16
|
import { validatePreferences } from "../preferences-validation.ts";
|
|
17
17
|
import type { ReactiveExecutionState } from "../types.ts";
|
|
18
|
+
import { parseUnitId } from "../unit-id.ts";
|
|
18
19
|
|
|
19
20
|
// ─── Preference Validation ────────────────────────────────────────────────
|
|
20
21
|
|
|
@@ -441,13 +442,12 @@ test("unitId batch encoding round-trips correctly", () => {
|
|
|
441
442
|
const unitId = `${mid}/${sid}/reactive+${selected.join(",")}`;
|
|
442
443
|
|
|
443
444
|
// Parse it back
|
|
444
|
-
const
|
|
445
|
-
assert.equal(
|
|
446
|
-
assert.equal(
|
|
447
|
-
const
|
|
448
|
-
const plusIdx = batchPart.indexOf("+");
|
|
445
|
+
const { milestone, slice, task: batchPart } = parseUnitId(unitId);
|
|
446
|
+
assert.equal(milestone, "M001");
|
|
447
|
+
assert.equal(slice, "S01");
|
|
448
|
+
const plusIdx = batchPart!.indexOf("+");
|
|
449
449
|
assert.ok(plusIdx > 0, "Should have + separator");
|
|
450
|
-
const batchIds = batchPart
|
|
450
|
+
const batchIds = batchPart!.slice(plusIdx + 1).split(",");
|
|
451
451
|
assert.deepEqual(batchIds, ["T02", "T03", "T05"]);
|
|
452
452
|
});
|
|
453
453
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #2675: completing-milestone dispatch rule must
|
|
3
|
+
* block completion when VALIDATION verdict is "needs-remediation".
|
|
4
|
+
*
|
|
5
|
+
* Without this guard, needs-remediation + allSlicesDone causes a loop:
|
|
6
|
+
* complete-milestone dispatched → agent refuses (correct) → no SUMMARY
|
|
7
|
+
* → re-dispatch → repeat until stuck detection fires.
|
|
8
|
+
*/
|
|
9
|
+
import { test } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
|
|
15
|
+
import { DISPATCH_RULES } from "../auto-dispatch.ts";
|
|
16
|
+
|
|
17
|
+
/** Find the completing-milestone dispatch rule */
|
|
18
|
+
const completingRule = DISPATCH_RULES.find(r => r.name === "completing-milestone → complete-milestone");
|
|
19
|
+
|
|
20
|
+
test("completing-milestone dispatch rule exists", () => {
|
|
21
|
+
assert.ok(completingRule, "rule should exist in DISPATCH_RULES");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("completing-milestone blocks when VALIDATION verdict is needs-remediation (#2675)", async () => {
|
|
25
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-remediation-"));
|
|
26
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
// Write a VALIDATION file with needs-remediation verdict
|
|
30
|
+
writeFileSync(
|
|
31
|
+
join(base, ".gsd", "milestones", "M001", "M001-VALIDATION.md"),
|
|
32
|
+
[
|
|
33
|
+
"---",
|
|
34
|
+
"verdict: needs-remediation",
|
|
35
|
+
"remediation_round: 0",
|
|
36
|
+
"---",
|
|
37
|
+
"",
|
|
38
|
+
"# Validation Report",
|
|
39
|
+
"",
|
|
40
|
+
"3 success criteria failed. Remediation required.",
|
|
41
|
+
].join("\n"),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const ctx = {
|
|
45
|
+
mid: "M001",
|
|
46
|
+
midTitle: "Test Milestone",
|
|
47
|
+
basePath: base,
|
|
48
|
+
state: { phase: "completing-milestone" } as any,
|
|
49
|
+
prefs: {} as any,
|
|
50
|
+
session: undefined,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const result = await completingRule!.match(ctx);
|
|
54
|
+
|
|
55
|
+
assert.ok(result !== null, "rule should match");
|
|
56
|
+
assert.equal(result!.action, "stop", "should return stop action");
|
|
57
|
+
if (result!.action === "stop") {
|
|
58
|
+
assert.equal(result!.level, "warning", "should be warning level (pausable)");
|
|
59
|
+
assert.ok(
|
|
60
|
+
result!.reason.includes("needs-remediation"),
|
|
61
|
+
"reason should mention needs-remediation",
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
} finally {
|
|
65
|
+
rmSync(base, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("completing-milestone proceeds normally when VALIDATION verdict is pass (#2675 guard)", async () => {
|
|
70
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-remediation-"));
|
|
71
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
// Write a VALIDATION file with pass verdict
|
|
75
|
+
writeFileSync(
|
|
76
|
+
join(base, ".gsd", "milestones", "M001", "M001-VALIDATION.md"),
|
|
77
|
+
[
|
|
78
|
+
"---",
|
|
79
|
+
"verdict: pass",
|
|
80
|
+
"---",
|
|
81
|
+
"",
|
|
82
|
+
"# Validation Report",
|
|
83
|
+
"",
|
|
84
|
+
"All criteria met.",
|
|
85
|
+
].join("\n"),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const ctx = {
|
|
89
|
+
mid: "M001",
|
|
90
|
+
midTitle: "Test Milestone",
|
|
91
|
+
basePath: base,
|
|
92
|
+
state: { phase: "completing-milestone" } as any,
|
|
93
|
+
prefs: {} as any,
|
|
94
|
+
session: undefined,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const result = await completingRule!.match(ctx);
|
|
98
|
+
|
|
99
|
+
// Should NOT return a stop — should either dispatch or return stop for
|
|
100
|
+
// a different reason (e.g. missing SUMMARY files, no implementation)
|
|
101
|
+
if (result && result.action === "stop") {
|
|
102
|
+
assert.ok(
|
|
103
|
+
!result.reason.includes("needs-remediation"),
|
|
104
|
+
"pass verdict should NOT trigger the remediation guard",
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
} finally {
|
|
108
|
+
rmSync(base, { recursive: true, force: true });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
@@ -724,3 +724,32 @@ test("resolveRemoteConfig returns null when preferences are absent (no env side-
|
|
|
724
724
|
if (savedTelegram !== undefined) process.env.TELEGRAM_BOT_TOKEN = savedTelegram;
|
|
725
725
|
}
|
|
726
726
|
});
|
|
727
|
+
|
|
728
|
+
test("config source-level: hydration skips api_key entries with empty keys", () => {
|
|
729
|
+
const configSrc = readFileSync(
|
|
730
|
+
join(__dirname, "..", "..", "remote-questions", "config.ts"),
|
|
731
|
+
"utf-8",
|
|
732
|
+
);
|
|
733
|
+
// The find() call in hydrateRemoteTokensFromAuth must filter for non-empty keys,
|
|
734
|
+
// not just match on type === "api_key". This prevents stale empty-key entries
|
|
735
|
+
// (left by removeProviderToken) from shadowing valid tokens.
|
|
736
|
+
assert.ok(
|
|
737
|
+
configSrc.includes('c.type === "api_key" && !!c.key'),
|
|
738
|
+
"hydrateRemoteTokensFromAuth find() should require a non-empty key",
|
|
739
|
+
);
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
test("config source-level: removeProviderToken uses auth.remove not auth.set with empty key", () => {
|
|
743
|
+
const commandSrc = readFileSync(
|
|
744
|
+
join(__dirname, "..", "..", "remote-questions", "remote-command.ts"),
|
|
745
|
+
"utf-8",
|
|
746
|
+
);
|
|
747
|
+
// removeProviderToken should call auth.remove(provider), not auth.set(provider, { key: "" }).
|
|
748
|
+
// Setting an empty key pollutes the credentials array and shadows valid tokens.
|
|
749
|
+
const fnStart = commandSrc.indexOf("function removeProviderToken");
|
|
750
|
+
assert.ok(fnStart !== -1, "removeProviderToken should exist");
|
|
751
|
+
const fnEnd = commandSrc.indexOf("\n}", fnStart);
|
|
752
|
+
const fnBody = commandSrc.slice(fnStart, fnEnd);
|
|
753
|
+
assert.ok(fnBody.includes("auth.remove("), "removeProviderToken should call auth.remove()");
|
|
754
|
+
assert.ok(!fnBody.includes('key: ""'), "removeProviderToken should not set an empty key");
|
|
755
|
+
});
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for #2195: formatTraceSummary (used by getDeepDiagnostic →
|
|
3
|
+
* retry prompts) must NOT include lastReasoning from prior assistant text.
|
|
4
|
+
*
|
|
5
|
+
* Including prior assistant free-text in retry diagnostics causes hallucination
|
|
6
|
+
* loops when the previous turn was truncated or malformed.
|
|
7
|
+
*
|
|
8
|
+
* The crash recovery path (formatCrashRecoveryBriefing) has its own safe handling
|
|
9
|
+
* of lastReasoning and is NOT affected by this change.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, test } from "node:test";
|
|
12
|
+
import assert from "node:assert/strict";
|
|
13
|
+
import { mkdirSync, writeFileSync, rmSync, mkdtempSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
|
|
17
|
+
import { extractTrace, getDeepDiagnostic } from "../session-forensics.ts";
|
|
18
|
+
|
|
19
|
+
/** Build a minimal assistant text reasoning entry. */
|
|
20
|
+
function makeAssistantText(text: string): unknown {
|
|
21
|
+
return {
|
|
22
|
+
type: "message",
|
|
23
|
+
message: {
|
|
24
|
+
role: "assistant",
|
|
25
|
+
content: [{ type: "text", text }],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Build a minimal assistant tool call + tool result pair. */
|
|
31
|
+
function makeToolPair(
|
|
32
|
+
toolName: string,
|
|
33
|
+
input: Record<string, unknown>,
|
|
34
|
+
resultText: string,
|
|
35
|
+
isError: boolean,
|
|
36
|
+
): unknown[] {
|
|
37
|
+
const toolCallId = `toolu_${Math.random().toString(36).slice(2, 10)}`;
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
type: "message",
|
|
41
|
+
message: {
|
|
42
|
+
role: "assistant",
|
|
43
|
+
content: [
|
|
44
|
+
{
|
|
45
|
+
type: "toolCall",
|
|
46
|
+
id: toolCallId,
|
|
47
|
+
name: toolName,
|
|
48
|
+
arguments: input,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: "message",
|
|
55
|
+
message: {
|
|
56
|
+
role: "toolResult",
|
|
57
|
+
toolCallId,
|
|
58
|
+
toolName,
|
|
59
|
+
isError,
|
|
60
|
+
content: [{ type: "text", text: resultText }],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe("retry diagnostic excludes lastReasoning (#2195)", () => {
|
|
67
|
+
test("extractTrace still captures lastReasoning in the trace object", () => {
|
|
68
|
+
const entries = [
|
|
69
|
+
makeAssistantText("I am going to write the summary file now"),
|
|
70
|
+
...makeToolPair("write", { path: "/tmp/SUMMARY.md" }, "ok", false),
|
|
71
|
+
makeAssistantText("The task is complete — all files written."),
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const trace = extractTrace(entries);
|
|
75
|
+
// extractTrace should still collect lastReasoning for crash recovery
|
|
76
|
+
assert.ok(trace.lastReasoning.length > 0,
|
|
77
|
+
"extractTrace should still populate lastReasoning");
|
|
78
|
+
assert.ok(trace.lastReasoning.includes("all files written"),
|
|
79
|
+
"lastReasoning should contain the last assistant text");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("getDeepDiagnostic output does NOT contain lastReasoning", () => {
|
|
83
|
+
// Create a temporary activity directory with a JSONL file
|
|
84
|
+
const tempBase = mkdtempSync(join(tmpdir(), "gsd-diag-test-"));
|
|
85
|
+
const gsdDir = join(tempBase, ".gsd");
|
|
86
|
+
const activityDir = join(gsdDir, "activity");
|
|
87
|
+
mkdirSync(activityDir, { recursive: true });
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
// Build entries with both tool calls and assistant reasoning
|
|
91
|
+
const entries = [
|
|
92
|
+
makeAssistantText("Let me analyze the codebase structure first"),
|
|
93
|
+
...makeToolPair("bash", { command: "ls src/" }, "index.ts\nutils.ts", false),
|
|
94
|
+
makeAssistantText("I see the milestone/M001 branch has a significantly different ... 3. "),
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
// Write JSONL activity file
|
|
98
|
+
const jsonl = entries.map(e => JSON.stringify(e)).join("\n");
|
|
99
|
+
writeFileSync(join(activityDir, "2025-01-01T00-00-00.jsonl"), jsonl);
|
|
100
|
+
|
|
101
|
+
const diagnostic = getDeepDiagnostic(tempBase);
|
|
102
|
+
|
|
103
|
+
// Diagnostic should exist (we have tool calls)
|
|
104
|
+
assert.ok(diagnostic !== null, "diagnostic should not be null");
|
|
105
|
+
|
|
106
|
+
// Diagnostic should contain structured execution evidence
|
|
107
|
+
assert.ok(diagnostic!.includes("Tool calls completed:"),
|
|
108
|
+
"should include tool call count");
|
|
109
|
+
assert.ok(diagnostic!.includes("ls src/"),
|
|
110
|
+
"should include commands run");
|
|
111
|
+
|
|
112
|
+
// Diagnostic must NOT contain the assistant's free-text reasoning
|
|
113
|
+
assert.ok(!diagnostic!.includes("Last reasoning"),
|
|
114
|
+
"diagnostic must not include 'Last reasoning' label");
|
|
115
|
+
assert.ok(!diagnostic!.includes("analyze the codebase"),
|
|
116
|
+
"diagnostic must not include prior assistant text");
|
|
117
|
+
assert.ok(!diagnostic!.includes("significantly different"),
|
|
118
|
+
"diagnostic must not include truncated assistant reasoning");
|
|
119
|
+
} finally {
|
|
120
|
+
rmSync(tempBase, { recursive: true, force: true });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("getDeepDiagnostic still includes errors and file operations", () => {
|
|
125
|
+
const tempBase = mkdtempSync(join(tmpdir(), "gsd-diag-test-"));
|
|
126
|
+
const gsdDir = join(tempBase, ".gsd");
|
|
127
|
+
const activityDir = join(gsdDir, "activity");
|
|
128
|
+
mkdirSync(activityDir, { recursive: true });
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
const entries = [
|
|
132
|
+
makeAssistantText("Writing the plan file"),
|
|
133
|
+
...makeToolPair("write", { path: "M001/S01/S01-PLAN.md" }, "ok", false),
|
|
134
|
+
...makeToolPair("bash", { command: "npm run build" }, "Error: type mismatch", true),
|
|
135
|
+
makeAssistantText("The build failed, let me investigate"),
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
const jsonl = entries.map(e => JSON.stringify(e)).join("\n");
|
|
139
|
+
writeFileSync(join(activityDir, "2025-01-01T00-00-00.jsonl"), jsonl);
|
|
140
|
+
|
|
141
|
+
const diagnostic = getDeepDiagnostic(tempBase);
|
|
142
|
+
assert.ok(diagnostic !== null);
|
|
143
|
+
|
|
144
|
+
// Structured evidence should be present
|
|
145
|
+
assert.ok(diagnostic!.includes("S01-PLAN.md"),
|
|
146
|
+
"should include files written");
|
|
147
|
+
assert.ok(diagnostic!.includes("npm run build"),
|
|
148
|
+
"should include commands run");
|
|
149
|
+
assert.ok(diagnostic!.includes("type mismatch"),
|
|
150
|
+
"should include errors");
|
|
151
|
+
|
|
152
|
+
// But NOT the assistant's free-text
|
|
153
|
+
assert.ok(!diagnostic!.includes("Writing the plan"),
|
|
154
|
+
"must not include assistant reasoning");
|
|
155
|
+
assert.ok(!diagnostic!.includes("build failed"),
|
|
156
|
+
"must not include assistant reasoning about failures");
|
|
157
|
+
} finally {
|
|
158
|
+
rmSync(tempBase, { recursive: true, force: true });
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
resolveHookArtifactPath,
|
|
17
17
|
} from "../post-unit-hooks.ts";
|
|
18
18
|
import { uncheckTaskInPlan } from "../undo.ts";
|
|
19
|
+
import { parseUnitId } from "../unit-id.ts";
|
|
19
20
|
|
|
20
21
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
21
22
|
|
|
@@ -183,8 +184,7 @@ test('Full retry reset: all steps combined', () => {
|
|
|
183
184
|
retryArtifact: "NEEDS-REWORK.md",
|
|
184
185
|
};
|
|
185
186
|
|
|
186
|
-
const
|
|
187
|
-
const [mid, sid, tid] = parts;
|
|
187
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
|
|
188
188
|
|
|
189
189
|
// Simulate completedUnits
|
|
190
190
|
let completedUnits = [
|
|
@@ -264,11 +264,10 @@ test('Retry reset: idempotent when artifacts already missing', () => {
|
|
|
264
264
|
};
|
|
265
265
|
|
|
266
266
|
// These should not throw even with missing files
|
|
267
|
-
const
|
|
268
|
-
const [mid, sid, tid] = parts;
|
|
267
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
|
|
269
268
|
|
|
270
269
|
// Uncheck — returns false because no PLAN file
|
|
271
|
-
const uncheckResult = uncheckTaskInPlan(base, mid, sid
|
|
270
|
+
const uncheckResult = uncheckTaskInPlan(base, mid, sid!, tid!);
|
|
272
271
|
assert.ok(!uncheckResult, "uncheck returns false when no PLAN exists");
|
|
273
272
|
|
|
274
273
|
// Summary does not exist — no crash
|