gsd-pi 2.49.0 → 2.50.0-dev.d210a87
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 +2 -0
- package/dist/cli.js +26 -0
- package/dist/headless-ui.js +12 -2
- package/dist/headless.js +29 -13
- package/dist/loader.js +4 -0
- 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 +3 -1
- 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/gsd/auto/infra-errors.js +1 -0
- package/dist/resources/extensions/gsd/auto/phases.js +27 -12
- package/dist/resources/extensions/gsd/auto/resolve.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -2
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +8 -10
- package/dist/resources/extensions/gsd/auto-dashboard.js +28 -6
- package/dist/resources/extensions/gsd/auto-dispatch.js +113 -74
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +53 -99
- package/dist/resources/extensions/gsd/auto-prompts.js +155 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -205
- package/dist/resources/extensions/gsd/auto-start.js +4 -31
- package/dist/resources/extensions/gsd/auto-timers.js +2 -2
- package/dist/resources/extensions/gsd/auto-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto-verification.js +4 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +257 -113
- package/dist/resources/extensions/gsd/auto.js +22 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -1
- package/dist/resources/extensions/gsd/branch-patterns.js +13 -0
- 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 +589 -3
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +5 -1234
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +168 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +405 -0
- package/dist/resources/extensions/gsd/doctor-global-checks.js +74 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +600 -0
- package/dist/resources/extensions/gsd/doctor.js +9 -1
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -1
- package/dist/resources/extensions/gsd/files.js +5 -1
- package/dist/resources/extensions/gsd/git-service.js +9 -10
- package/dist/resources/extensions/gsd/gsd-db.js +124 -1
- package/dist/resources/extensions/gsd/guided-flow-queue.js +10 -11
- package/dist/resources/extensions/gsd/guided-flow.js +10 -0
- package/dist/resources/extensions/gsd/init-wizard.js +9 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -5
- 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-skills.js +11 -5
- package/dist/resources/extensions/gsd/preferences-types.js +3 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +64 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/dist/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
- package/dist/resources/extensions/gsd/repo-identity.js +29 -0
- package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +2 -2
- package/dist/resources/extensions/gsd/rtk-status.js +43 -0
- package/dist/resources/extensions/gsd/rule-registry.js +10 -11
- package/dist/resources/extensions/gsd/session-forensics.js +13 -14
- package/dist/resources/extensions/gsd/session-lock.js +67 -56
- 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 +51 -12
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/plan.md +16 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/dist/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/dist/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -3
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
- package/dist/resources/extensions/gsd/verdict-parser.js +84 -0
- package/dist/resources/extensions/gsd/verification-gate.js +3 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +24 -0
- package/dist/resources/extensions/gsd/worktree.js +3 -2
- package/dist/resources/extensions/remote-questions/config.js +3 -5
- package/dist/resources/extensions/search-the-web/native-search.js +8 -3
- package/dist/resources/extensions/search-the-web/tool-search.js +19 -2
- package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
- package/dist/resources/extensions/shared/rtk.js +100 -0
- package/dist/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- 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 +20 -19
- 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 +20 -19
- 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/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.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-cfc9a116e6450a6b.js +1 -0
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
- package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +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/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +39 -10
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -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/providers/openai-codex-responses.ts +39 -8
- package/packages/pi-ai/src/types.ts +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 +10 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/blob-store.js +8 -3
- package/packages/pi-coding-agent/dist/core/blob-store.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.js +9 -2
- package/packages/pi-coding-agent/dist/core/discovery-cache.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/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/retry-handler.js +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.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/index.d.ts +2 -2
- 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/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/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -36
- 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/jsonl.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js.map +1 -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 +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
- package/packages/pi-coding-agent/src/core/blob-store.ts +6 -3
- package/packages/pi-coding-agent/src/core/discovery-cache.ts +9 -2
- 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/package-manager.ts +10 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -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/index.ts +4 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -36
- 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/jsonl.ts +6 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +0 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
- 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 +3 -1
- 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/tests/partial-builder.test.ts +105 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +25 -12
- package/src/resources/extensions/gsd/auto/resolve.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -2
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/types.ts +13 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +19 -21
- package/src/resources/extensions/gsd/auto-dashboard.ts +36 -5
- package/src/resources/extensions/gsd/auto-dispatch.ts +122 -71
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-observability.ts +72 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +73 -110
- package/src/resources/extensions/gsd/auto-prompts.ts +159 -17
- package/src/resources/extensions/gsd/auto-recovery.ts +80 -221
- package/src/resources/extensions/gsd/auto-start.ts +7 -27
- package/src/resources/extensions/gsd/auto-timers.ts +2 -2
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-verification.ts +4 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +305 -108
- package/src/resources/extensions/gsd/auto.ts +26 -15
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +93 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -0
- package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
- 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 +662 -3
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +5 -1291
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +182 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +30 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +415 -0
- package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +626 -0
- package/src/resources/extensions/gsd/doctor.ts +9 -1
- package/src/resources/extensions/gsd/extension-manifest.json +1 -1
- package/src/resources/extensions/gsd/files.ts +6 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -15
- package/src/resources/extensions/gsd/gsd-db.ts +150 -2
- package/src/resources/extensions/gsd/guided-flow-queue.ts +11 -12
- package/src/resources/extensions/gsd/guided-flow.ts +11 -0
- package/src/resources/extensions/gsd/init-wizard.ts +9 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +37 -4
- 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-skills.ts +11 -5
- package/src/resources/extensions/gsd/preferences-types.ts +25 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +63 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
- package/src/resources/extensions/gsd/prompts/complete-slice.md +9 -8
- package/src/resources/extensions/gsd/prompts/execute-task.md +16 -13
- package/src/resources/extensions/gsd/prompts/forensics.md +19 -8
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +8 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +28 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +2 -2
- package/src/resources/extensions/gsd/rtk-status.ts +53 -0
- package/src/resources/extensions/gsd/rule-registry.ts +10 -11
- package/src/resources/extensions/gsd/session-forensics.ts +13 -14
- package/src/resources/extensions/gsd/session-lock.ts +92 -64
- 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 +54 -10
- package/src/resources/extensions/gsd/templates/milestone-summary.md +8 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/plan.md +16 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +13 -0
- package/src/resources/extensions/gsd/templates/slice-summary.md +9 -0
- package/src/resources/extensions/gsd/templates/task-plan.md +24 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +2 -2
- 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 +103 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -81
- 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.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +9 -12
- 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 +4 -3
- package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +115 -1
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +65 -1
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +49 -0
- 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/infra-error.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +39 -0
- 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/notifications.test.ts +28 -6
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/queue-completed-milestone-perf.test.ts +155 -0
- 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/replan-slice.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +32 -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/roadmap-slices.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +166 -16
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +44 -4
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +204 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +16 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -3
- package/src/resources/extensions/gsd/types.ts +32 -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/verdict-parser.ts +95 -0
- package/src/resources/extensions/gsd/verification-gate.ts +3 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +31 -0
- package/src/resources/extensions/gsd/worktree.ts +3 -2
- package/src/resources/extensions/remote-questions/config.ts +3 -5
- package/src/resources/extensions/search-the-web/native-search.ts +8 -3
- package/src/resources/extensions/search-the-web/tool-search.ts +22 -2
- package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
- package/src/resources/extensions/shared/rtk.ts +120 -0
- package/src/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +0 -191
- package/dist/resources/extensions/gsd/resource-version.js +0 -97
- 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/chunks/4024.11ca5c01938e5948.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-0a4cd455ec4197d2.js +0 -1
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
- package/dist/web/standalone/.next/static/gj-y5hikmhS--NT8Web6M/_buildManifest.js +0 -1
- package/packages/pi-ai/pnpm-lock.yaml +0 -2022
- package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -234
- package/src/resources/extensions/gsd/resource-version.ts +0 -101
- /package/dist/web/standalone/.next/static/{gj-y5hikmhS--NT8Web6M → yJIyd5cXPNpmXTv18ZlyC}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -19,6 +19,8 @@ One command. Walk away. Come back to a built project with clean git history.
|
|
|
19
19
|
|
|
20
20
|
<pre><code>npm install -g gsd-pi@latest</code></pre>
|
|
21
21
|
|
|
22
|
+
> GSD now provisions a managed [RTK](https://github.com/rtk-ai/rtk) binary on supported macOS, Linux, and Windows installs to compress shell-command output in `bash`, `async_bash`, `bg_shell`, and verification flows. GSD forces `RTK_TELEMETRY_DISABLED=1` for all managed invocations. Set `GSD_RTK_DISABLED=1` to disable the integration.
|
|
23
|
+
|
|
22
24
|
> **📋 NOTICE: New to Node on Mac?** If you installed Node.js via Homebrew, you may be running a development release instead of LTS. **[Read this guide](./docs/node-lts-macos.md)** to pin Node 24 LTS and avoid compatibility issues.
|
|
23
25
|
|
|
24
26
|
</div>
|
package/dist/cli.js
CHANGED
|
@@ -14,6 +14,8 @@ import { parseCliArgs as parseWebCliArgs, runWebCliBranch, migrateLegacyFlatSess
|
|
|
14
14
|
import { stopWebMode } from './web-mode.js';
|
|
15
15
|
import { getProjectSessionsDir } from './project-sessions.js';
|
|
16
16
|
import { markStartup, printStartupTimings } from './startup-timings.js';
|
|
17
|
+
import { bootstrapRtk, GSD_RTK_DISABLED_ENV } from './rtk.js';
|
|
18
|
+
import { loadEffectiveGSDPreferences } from './resources/extensions/gsd/preferences.js';
|
|
17
19
|
// ---------------------------------------------------------------------------
|
|
18
20
|
// V8 compile cache — Node 22+ can cache compiled bytecode across runs,
|
|
19
21
|
// eliminating repeated parse/compile overhead for unchanged modules.
|
|
@@ -114,6 +116,26 @@ if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listMode
|
|
|
114
116
|
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
115
117
|
process.exit(1);
|
|
116
118
|
}
|
|
119
|
+
async function ensureRtkBootstrap() {
|
|
120
|
+
if (ensureRtkBootstrap._done)
|
|
121
|
+
return;
|
|
122
|
+
// RTK is opt-in via experimental.rtk preference. Default: disabled.
|
|
123
|
+
// Honor GSD_RTK_DISABLED if already explicitly set in the environment
|
|
124
|
+
// (env var takes precedence over preferences for manual override).
|
|
125
|
+
if (!process.env[GSD_RTK_DISABLED_ENV]) {
|
|
126
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
127
|
+
const rtkEnabled = prefs?.preferences.experimental?.rtk === true;
|
|
128
|
+
if (!rtkEnabled) {
|
|
129
|
+
process.env[GSD_RTK_DISABLED_ENV] = "1";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const rtkStatus = await bootstrapRtk();
|
|
133
|
+
ensureRtkBootstrap._done = true;
|
|
134
|
+
markStartup('bootstrapRtk');
|
|
135
|
+
if (!rtkStatus.available && rtkStatus.supported && rtkStatus.enabled && rtkStatus.reason) {
|
|
136
|
+
process.stderr.write(`[gsd] Warning: RTK unavailable — continuing without shell-command compression (${rtkStatus.reason}).\n`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
117
139
|
// `gsd <subcommand> --help` — show subcommand-specific help
|
|
118
140
|
const subcommand = cliFlags.messages[0];
|
|
119
141
|
if (subcommand && process.argv.includes('--help')) {
|
|
@@ -161,6 +183,7 @@ if (cliFlags.messages[0] === 'web' && cliFlags.messages[1] === 'stop') {
|
|
|
161
183
|
}
|
|
162
184
|
// `gsd --web [path]` or `gsd web [start] [path]` — launch browser-only web mode
|
|
163
185
|
if (cliFlags.web || (cliFlags.messages[0] === 'web' && cliFlags.messages[1] !== 'stop')) {
|
|
186
|
+
await ensureRtkBootstrap();
|
|
164
187
|
const webFlags = parseWebCliArgs(process.argv);
|
|
165
188
|
const webBranch = await runWebCliBranch(webFlags, {
|
|
166
189
|
stderr: process.stderr,
|
|
@@ -220,6 +243,7 @@ if (cliFlags.messages[0] === 'sessions') {
|
|
|
220
243
|
}
|
|
221
244
|
// `gsd headless` — run auto-mode without TUI
|
|
222
245
|
if (cliFlags.messages[0] === 'headless') {
|
|
246
|
+
await ensureRtkBootstrap();
|
|
223
247
|
const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
|
|
224
248
|
await runHeadless(parseHeadlessArgs(process.argv));
|
|
225
249
|
process.exit(0);
|
|
@@ -348,6 +372,7 @@ if (!settingsManager.getCollapseChangelog()) {
|
|
|
348
372
|
// Print / subagent mode — single-shot execution, no TTY required
|
|
349
373
|
// ---------------------------------------------------------------------------
|
|
350
374
|
if (isPrintMode) {
|
|
375
|
+
await ensureRtkBootstrap();
|
|
351
376
|
const sessionManager = cliFlags.noSession
|
|
352
377
|
? SessionManager.inMemory()
|
|
353
378
|
: SessionManager.create(process.cwd());
|
|
@@ -465,6 +490,7 @@ if (!cliFlags.worktree && !isPrintMode) {
|
|
|
465
490
|
// ---------------------------------------------------------------------------
|
|
466
491
|
// Interactive mode — normal TTY session
|
|
467
492
|
// ---------------------------------------------------------------------------
|
|
493
|
+
await ensureRtkBootstrap();
|
|
468
494
|
// Per-directory session storage — same encoding as the upstream SDK so that
|
|
469
495
|
// /resume only shows sessions from the current working directory.
|
|
470
496
|
const cwd = process.cwd();
|
package/dist/headless-ui.js
CHANGED
|
@@ -13,9 +13,19 @@ export function handleExtensionUIRequest(event, writeToStdin) {
|
|
|
13
13
|
const { id, method } = event;
|
|
14
14
|
let response;
|
|
15
15
|
switch (method) {
|
|
16
|
-
case 'select':
|
|
17
|
-
|
|
16
|
+
case 'select': {
|
|
17
|
+
// Lock-guard prompts list "View status" first, but headless needs "Force start"
|
|
18
|
+
// to proceed. Detect by title and pick the force option.
|
|
19
|
+
const title = String(event.title ?? '');
|
|
20
|
+
let selected = event.options?.[0] ?? '';
|
|
21
|
+
if (title.includes('Auto-mode is running') && event.options) {
|
|
22
|
+
const forceOption = event.options.find(o => o.toLowerCase().includes('force start'));
|
|
23
|
+
if (forceOption)
|
|
24
|
+
selected = forceOption;
|
|
25
|
+
}
|
|
26
|
+
response = { type: 'extension_ui_response', id, value: selected };
|
|
18
27
|
break;
|
|
28
|
+
}
|
|
19
29
|
case 'confirm':
|
|
20
30
|
response = { type: 'extension_ui_response', id, confirmed: true };
|
|
21
31
|
break;
|
package/dist/headless.js
CHANGED
|
@@ -37,8 +37,8 @@ export function parseHeadlessArgs(argv) {
|
|
|
37
37
|
if (!positionalStarted && arg.startsWith('--')) {
|
|
38
38
|
if (arg === '--timeout' && i + 1 < args.length) {
|
|
39
39
|
options.timeout = parseInt(args[++i], 10);
|
|
40
|
-
if (Number.isNaN(options.timeout) || options.timeout
|
|
41
|
-
process.stderr.write('[headless] Error: --timeout must be a
|
|
40
|
+
if (Number.isNaN(options.timeout) || options.timeout < 0) {
|
|
41
|
+
process.stderr.write('[headless] Error: --timeout must be a non-negative integer (milliseconds, 0 to disable)\n');
|
|
42
42
|
process.exit(1);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -132,6 +132,13 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
132
132
|
if (isNewMilestone && options.timeout === 300_000) {
|
|
133
133
|
options.timeout = 600_000; // 10 minutes
|
|
134
134
|
}
|
|
135
|
+
// auto-mode sessions are long-running (minutes to hours) with their own internal
|
|
136
|
+
// per-unit timeout via auto-supervisor. Disable the overall timeout unless the
|
|
137
|
+
// user explicitly set --timeout.
|
|
138
|
+
const isAutoMode = options.command === 'auto';
|
|
139
|
+
if (isAutoMode && options.timeout === 300_000) {
|
|
140
|
+
options.timeout = 0;
|
|
141
|
+
}
|
|
135
142
|
// Supervised mode cannot share stdin with --context -
|
|
136
143
|
if (options.supervised && options.context === '-') {
|
|
137
144
|
process.stderr.write('[headless] Error: --supervised cannot be used with --context - (both require stdin)\n');
|
|
@@ -267,12 +274,14 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
267
274
|
}
|
|
268
275
|
// Precompute supervised response timeout
|
|
269
276
|
const responseTimeout = options.responseTimeout ?? 30_000;
|
|
270
|
-
// Overall timeout
|
|
271
|
-
const timeoutTimer =
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
277
|
+
// Overall timeout (disabled when options.timeout === 0, e.g. auto-mode)
|
|
278
|
+
const timeoutTimer = options.timeout > 0
|
|
279
|
+
? setTimeout(() => {
|
|
280
|
+
process.stderr.write(`[headless] Timeout after ${options.timeout / 1000}s\n`);
|
|
281
|
+
exitCode = 1;
|
|
282
|
+
resolveCompletion();
|
|
283
|
+
}, options.timeout)
|
|
284
|
+
: null;
|
|
276
285
|
// Event handler
|
|
277
286
|
client.onEvent((event) => {
|
|
278
287
|
const eventObj = event;
|
|
@@ -354,7 +363,8 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
354
363
|
interrupted = true;
|
|
355
364
|
exitCode = 1;
|
|
356
365
|
client.stop().finally(() => {
|
|
357
|
-
|
|
366
|
+
if (timeoutTimer)
|
|
367
|
+
clearTimeout(timeoutTimer);
|
|
358
368
|
if (idleTimer)
|
|
359
369
|
clearTimeout(idleTimer);
|
|
360
370
|
process.exit(exitCode);
|
|
@@ -368,7 +378,8 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
368
378
|
}
|
|
369
379
|
catch (err) {
|
|
370
380
|
process.stderr.write(`[headless] Error: Failed to start RPC session: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
371
|
-
|
|
381
|
+
if (timeoutTimer)
|
|
382
|
+
clearTimeout(timeoutTimer);
|
|
372
383
|
process.exit(1);
|
|
373
384
|
}
|
|
374
385
|
// Access stdin writer from the internal process
|
|
@@ -376,7 +387,8 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
376
387
|
if (!internalProcess?.stdin) {
|
|
377
388
|
process.stderr.write('[headless] Error: Cannot access child process stdin\n');
|
|
378
389
|
await client.stop();
|
|
379
|
-
|
|
390
|
+
if (timeoutTimer)
|
|
391
|
+
clearTimeout(timeoutTimer);
|
|
380
392
|
process.exit(1);
|
|
381
393
|
}
|
|
382
394
|
stdinWriter = (data) => {
|
|
@@ -424,7 +436,10 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
424
436
|
if (!options.json) {
|
|
425
437
|
process.stderr.write('[headless] Milestone ready — chaining into auto-mode...\n');
|
|
426
438
|
}
|
|
427
|
-
// Reset completion state for the auto-mode phase
|
|
439
|
+
// Reset completion state for the auto-mode phase.
|
|
440
|
+
// Disable the overall timeout — auto-mode has its own internal supervisor.
|
|
441
|
+
if (timeoutTimer)
|
|
442
|
+
clearTimeout(timeoutTimer);
|
|
428
443
|
completed = false;
|
|
429
444
|
milestoneReady = false;
|
|
430
445
|
blocked = false;
|
|
@@ -443,7 +458,8 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
443
458
|
}
|
|
444
459
|
}
|
|
445
460
|
// Cleanup
|
|
446
|
-
|
|
461
|
+
if (timeoutTimer)
|
|
462
|
+
clearTimeout(timeoutTimer);
|
|
447
463
|
if (idleTimer)
|
|
448
464
|
clearTimeout(idleTimer);
|
|
449
465
|
pendingResponseTimers.forEach((timer) => clearTimeout(timer));
|
package/dist/loader.js
CHANGED
|
@@ -61,6 +61,7 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
import { agentDir, appRoot } from './app-paths.js';
|
|
64
|
+
import { applyRtkProcessEnv } from './rtk.js';
|
|
64
65
|
import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
|
|
65
66
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
66
67
|
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled } from './extension-registry.js';
|
|
@@ -92,6 +93,9 @@ if (!existsSync(appRoot)) {
|
|
|
92
93
|
}
|
|
93
94
|
// GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/
|
|
94
95
|
process.env.GSD_CODING_AGENT_DIR = agentDir;
|
|
96
|
+
// RTK environment — make ~/.gsd/agent/bin visible to all child-process paths,
|
|
97
|
+
// not just the bash tool, and force-disable RTK telemetry for GSD-managed use.
|
|
98
|
+
applyRtkProcessEnv(process.env);
|
|
95
99
|
// NODE_PATH — make gsd's own node_modules available to extensions loaded via jiti.
|
|
96
100
|
// Without this, extensions (e.g. browser-tools) can't resolve dependencies like
|
|
97
101
|
// `playwright` because jiti resolves modules from pi-coding-agent's location, not gsd's.
|
|
@@ -8,9 +8,12 @@ export declare function getNewerManagedResourceVersion(agentDir: string, current
|
|
|
8
8
|
*
|
|
9
9
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
10
10
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
11
|
-
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
12
11
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
13
12
|
*
|
|
13
|
+
* Skills are NOT synced here. They are installed by the user via the
|
|
14
|
+
* skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ — the
|
|
15
|
+
* industry-standard Agent Skills ecosystem directory.
|
|
16
|
+
*
|
|
14
17
|
* Skips the copy when the managed-resources.json version matches the current
|
|
15
18
|
* GSD version, avoiding ~128ms of synchronous cpSync on every startup.
|
|
16
19
|
* After `npm update -g @glittercowboy/gsd`, versions will differ and the
|
package/dist/resource-loader.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
5
5
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { compareSemver } from './update-check.js';
|
|
@@ -352,9 +352,12 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
352
352
|
*
|
|
353
353
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
354
354
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
355
|
-
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
356
355
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
357
356
|
*
|
|
357
|
+
* Skills are NOT synced here. They are installed by the user via the
|
|
358
|
+
* skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ — the
|
|
359
|
+
* industry-standard Agent Skills ecosystem directory.
|
|
360
|
+
*
|
|
358
361
|
* Skips the copy when the managed-resources.json version matches the current
|
|
359
362
|
* GSD version, avoiding ~128ms of synchronous cpSync on every startup.
|
|
360
363
|
* After `npm update -g @glittercowboy/gsd`, versions will differ and the
|
|
@@ -375,6 +378,9 @@ export function initResources(agentDir) {
|
|
|
375
378
|
// launch, not just during resource syncs. A stale/broken symlink makes ALL
|
|
376
379
|
// extensions fail to resolve @gsd/* packages, rendering GSD non-functional.
|
|
377
380
|
ensureNodeModulesSymlink(agentDir);
|
|
381
|
+
// Migrate legacy skills on every launch (not gated by manifest) so that
|
|
382
|
+
// partial-failure retries don't wait for a version bump.
|
|
383
|
+
migrateSkillsToEcosystemDir(agentDir);
|
|
378
384
|
// Skip the full copy when both version AND content fingerprint match.
|
|
379
385
|
// Version-only checks miss same-version content changes (npm link dev workflow,
|
|
380
386
|
// hotfixes within a release). The content hash catches those at ~1ms cost.
|
|
@@ -389,7 +395,13 @@ export function initResources(agentDir) {
|
|
|
389
395
|
// Sync bundled resources — overwrite so updates land on next launch.
|
|
390
396
|
syncResourceDir(bundledExtensionsDir, join(agentDir, 'extensions'));
|
|
391
397
|
syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
|
|
392
|
-
|
|
398
|
+
// Skills are no longer force-synced here. Users install skills via the
|
|
399
|
+
// skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ which
|
|
400
|
+
// is the industry-standard Agent Skills ecosystem directory.
|
|
401
|
+
//
|
|
402
|
+
// Migration from the legacy ~/.gsd/agent/skills/ directory is handled
|
|
403
|
+
// above the manifest check so it runs on every launch (including retries
|
|
404
|
+
// after partial copy failures).
|
|
393
405
|
// Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
|
|
394
406
|
// env var is not set (e.g. fork/dev builds, alternative entry points).
|
|
395
407
|
const workflowSrc = join(resourcesDir, 'GSD-WORKFLOW.md');
|
|
@@ -405,6 +417,129 @@ export function initResources(agentDir) {
|
|
|
405
417
|
writeManagedResourceManifest(agentDir);
|
|
406
418
|
ensureRegistryEntries(join(agentDir, 'extensions'));
|
|
407
419
|
}
|
|
420
|
+
// ─── Legacy Skill Migration ──────────────────────────────────────────────────────
|
|
421
|
+
/**
|
|
422
|
+
* One-time migration: copy user-customized skills from the old
|
|
423
|
+
* ~/.gsd/agent/skills/ directory into ~/.agents/skills/.
|
|
424
|
+
*
|
|
425
|
+
* The migration is conservative:
|
|
426
|
+
* - Only skill directories containing a SKILL.md are considered.
|
|
427
|
+
* - Copies, does not move — the old directory stays intact so downgrading
|
|
428
|
+
* to a pre-migration GSD version still works.
|
|
429
|
+
* - Collision-safe — if a skill name already exists in the target, the
|
|
430
|
+
* existing ecosystem skill wins (user may have already installed a newer
|
|
431
|
+
* version via skills.sh).
|
|
432
|
+
* - Writes a `.migrated-to-agents` marker inside the legacy directory so
|
|
433
|
+
* the migration runs at most once.
|
|
434
|
+
*/
|
|
435
|
+
function migrateSkillsToEcosystemDir(agentDir) {
|
|
436
|
+
const legacyDir = join(agentDir, 'skills');
|
|
437
|
+
const markerPath = join(legacyDir, '.migrated-to-agents');
|
|
438
|
+
// Already migrated or no legacy dir — nothing to do
|
|
439
|
+
if (!existsSync(legacyDir))
|
|
440
|
+
return;
|
|
441
|
+
// Atomic marker check — 'wx' fails if file already exists, preventing races
|
|
442
|
+
// when two GSD processes start simultaneously.
|
|
443
|
+
let markerFd;
|
|
444
|
+
try {
|
|
445
|
+
markerFd = openSync(markerPath, 'wx');
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return; // marker already exists (another process won the race, or already migrated)
|
|
449
|
+
}
|
|
450
|
+
try {
|
|
451
|
+
const ecosystemDir = join(homedir(), '.agents', 'skills');
|
|
452
|
+
mkdirSync(ecosystemDir, { recursive: true });
|
|
453
|
+
const entries = readdirSync(legacyDir, { withFileTypes: true });
|
|
454
|
+
let migrated = 0;
|
|
455
|
+
let candidates = 0;
|
|
456
|
+
for (const entry of entries) {
|
|
457
|
+
// Handle both real directories and symlinks pointing to directories
|
|
458
|
+
const isDir = entry.isDirectory();
|
|
459
|
+
const isSymlink = entry.isSymbolicLink();
|
|
460
|
+
if (!isDir && !isSymlink)
|
|
461
|
+
continue;
|
|
462
|
+
const sourcePath = join(legacyDir, entry.name);
|
|
463
|
+
// For symlinks, verify the target is a directory
|
|
464
|
+
if (isSymlink) {
|
|
465
|
+
try {
|
|
466
|
+
const stat = statSync(sourcePath);
|
|
467
|
+
if (!stat.isDirectory())
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
continue; // broken symlink — skip
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
const skillMd = join(sourcePath, 'SKILL.md');
|
|
475
|
+
if (!existsSync(skillMd))
|
|
476
|
+
continue;
|
|
477
|
+
const target = join(ecosystemDir, entry.name);
|
|
478
|
+
if (existsSync(target))
|
|
479
|
+
continue; // ecosystem version wins
|
|
480
|
+
candidates++;
|
|
481
|
+
try {
|
|
482
|
+
if (isSymlink) {
|
|
483
|
+
// Recreate the symlink in the ecosystem directory using an absolute
|
|
484
|
+
// target. Relative symlinks would resolve from the new parent dir
|
|
485
|
+
// (~/.agents/skills/) instead of the original (~/.gsd/agent/skills/),
|
|
486
|
+
// pointing to the wrong location.
|
|
487
|
+
const rawTarget = readlinkSync(sourcePath);
|
|
488
|
+
const absTarget = resolve(dirname(sourcePath), rawTarget);
|
|
489
|
+
symlinkSync(absTarget, target);
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
cpSync(sourcePath, target, { recursive: true });
|
|
493
|
+
}
|
|
494
|
+
migrated++;
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
// non-fatal — skip this skill
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// If any skills failed to copy, remove the marker so migration retries
|
|
501
|
+
// on the next launch. This keeps the legacy dir as fallback until every
|
|
502
|
+
// skill has been successfully migrated.
|
|
503
|
+
if (migrated < candidates) {
|
|
504
|
+
try {
|
|
505
|
+
closeSync(markerFd);
|
|
506
|
+
markerFd = -1;
|
|
507
|
+
}
|
|
508
|
+
catch { /* non-fatal */ }
|
|
509
|
+
try {
|
|
510
|
+
unlinkSync(markerPath);
|
|
511
|
+
}
|
|
512
|
+
catch { /* non-fatal */ }
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
// Write migration info to the marker
|
|
516
|
+
try {
|
|
517
|
+
writeFileSync(markerFd, `Migrated ${migrated} skill(s) to ${ecosystemDir} on ${new Date().toISOString()}\n`);
|
|
518
|
+
}
|
|
519
|
+
catch { /* non-fatal */ }
|
|
520
|
+
}
|
|
521
|
+
catch {
|
|
522
|
+
// can't create ecosystem dir or read legacy dir — close fd first (required on Windows
|
|
523
|
+
// where unlinkSync fails on open handles), then remove marker so we retry next launch
|
|
524
|
+
try {
|
|
525
|
+
closeSync(markerFd);
|
|
526
|
+
markerFd = -1;
|
|
527
|
+
}
|
|
528
|
+
catch { /* non-fatal */ }
|
|
529
|
+
try {
|
|
530
|
+
unlinkSync(markerPath);
|
|
531
|
+
}
|
|
532
|
+
catch { /* non-fatal */ }
|
|
533
|
+
}
|
|
534
|
+
finally {
|
|
535
|
+
if (markerFd !== -1) {
|
|
536
|
+
try {
|
|
537
|
+
closeSync(markerFd);
|
|
538
|
+
}
|
|
539
|
+
catch { /* non-fatal */ }
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
408
543
|
export function hasStaleCompiledExtensionSiblings(extensionsDir) {
|
|
409
544
|
if (!existsSync(extensionsDir))
|
|
410
545
|
return false;
|
|
@@ -12,6 +12,7 @@ import { createWriteStream } from "node:fs";
|
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { randomBytes } from "node:crypto";
|
|
15
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
15
16
|
const schema = Type.Object({
|
|
16
17
|
command: Type.String({ description: "Bash command to execute in the background" }),
|
|
17
18
|
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional)" })),
|
|
@@ -93,7 +94,8 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
93
94
|
reject(err);
|
|
94
95
|
} };
|
|
95
96
|
const { shell, args } = getShellConfig();
|
|
96
|
-
const
|
|
97
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
98
|
+
const resolvedCommand = sanitizeCommand(rewrittenCommand);
|
|
97
99
|
const child = spawn(shell, [...args, resolvedCommand], {
|
|
98
100
|
cwd,
|
|
99
101
|
detached: true,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Expect-style interactions: send_and_wait, run on session, query shell environment.
|
|
3
3
|
*/
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
5
6
|
// ── Query Shell Environment ────────────────────────────────────────────────
|
|
6
7
|
export async function queryShellEnv(bg, timeout, signal) {
|
|
7
8
|
const sentinel = `__GSD_ENV_${randomUUID().slice(0, 8)}__`;
|
|
@@ -97,9 +98,10 @@ export async function runOnSession(bg, command, timeout, signal) {
|
|
|
97
98
|
// Snapshot current output buffer position
|
|
98
99
|
const startIndex = bg.output.length;
|
|
99
100
|
// Write the sentinel-wrapped command to stdin
|
|
101
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
100
102
|
const wrappedCommand = [
|
|
101
103
|
`echo ${startMarker}`,
|
|
102
|
-
|
|
104
|
+
rewrittenCommand,
|
|
103
105
|
`${exitVar}=$?`,
|
|
104
106
|
`echo ${endMarker} $${exitVar}`,
|
|
105
107
|
].join("\n");
|
|
@@ -7,6 +7,7 @@ import { randomUUID } from "node:crypto";
|
|
|
7
7
|
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
|
|
10
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
10
11
|
import { MAX_BUFFER_LINES, MAX_EVENTS, DEAD_PROCESS_TTL, } from "./types.js";
|
|
11
12
|
import { restoreWindowsVTInput, formatUptime } from "./utilities.js";
|
|
12
13
|
import { analyzeLine } from "./output-formatter.js";
|
|
@@ -101,7 +102,9 @@ export function startProcess(opts) {
|
|
|
101
102
|
const env = { ...process.env, ...(opts.env || {}) };
|
|
102
103
|
const { shell, args: shellArgs } = getShellConfig();
|
|
103
104
|
// Shell sessions default to the user's shell if no command specified
|
|
104
|
-
const command = processType === "shell" && !opts.command
|
|
105
|
+
const command = processType === "shell" && !opts.command
|
|
106
|
+
? shell
|
|
107
|
+
: rewriteCommandWithRtk(opts.command);
|
|
105
108
|
const proc = spawn(shell, [...shellArgs, sanitizeCommand(command)], {
|
|
106
109
|
cwd: opts.cwd,
|
|
107
110
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -210,7 +210,12 @@ export class PartialMessageBuilder {
|
|
|
210
210
|
block.arguments = JSON.parse(jsonStr);
|
|
211
211
|
}
|
|
212
212
|
catch {
|
|
213
|
+
// Stream was truncated mid-tool-call — JSON is garbage.
|
|
214
|
+
// Preserve the raw string for diagnostics but signal the
|
|
215
|
+
// malformation explicitly so downstream consumers can
|
|
216
|
+
// distinguish this from a healthy tool completion (#2574).
|
|
213
217
|
block.arguments = { _raw: jsonStr };
|
|
218
|
+
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
|
|
214
219
|
}
|
|
215
220
|
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
|
|
216
221
|
}
|
|
@@ -17,6 +17,7 @@ export const INFRA_ERROR_CODES = new Set([
|
|
|
17
17
|
"EDQUOT", // disk quota exceeded
|
|
18
18
|
"EMFILE", // too many open files (process)
|
|
19
19
|
"ENFILE", // too many open files (system)
|
|
20
|
+
"EAGAIN", // resource temporarily unavailable (resource exhaustion)
|
|
20
21
|
"ECONNREFUSED", // connection refused (offline / local server down)
|
|
21
22
|
"ENOTFOUND", // DNS lookup failed (offline / no network)
|
|
22
23
|
"ENETUNREACH", // network unreachable (offline / no route)
|
|
@@ -219,6 +219,8 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
219
219
|
if (s.currentMilestoneId) {
|
|
220
220
|
try {
|
|
221
221
|
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
222
|
+
// Prevent stopAuto from attempting the same merge (#2645)
|
|
223
|
+
s.milestoneMergedInPhases = true;
|
|
222
224
|
}
|
|
223
225
|
catch (mergeErr) {
|
|
224
226
|
if (mergeErr instanceof MergeConflictError) {
|
|
@@ -284,6 +286,8 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
284
286
|
if (s.currentMilestoneId) {
|
|
285
287
|
try {
|
|
286
288
|
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
289
|
+
// Prevent stopAuto from attempting the same merge (#2645)
|
|
290
|
+
s.milestoneMergedInPhases = true;
|
|
287
291
|
}
|
|
288
292
|
catch (mergeErr) {
|
|
289
293
|
if (mergeErr instanceof MergeConflictError) {
|
|
@@ -334,7 +338,18 @@ export async function runDispatch(ic, preData, loopState) {
|
|
|
334
338
|
});
|
|
335
339
|
if (dispatchResult.action === "stop") {
|
|
336
340
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
|
|
337
|
-
|
|
341
|
+
// Warning-level stops are recoverable human checkpoints (e.g. UAT verdict
|
|
342
|
+
// gate) — pause instead of hard-stopping so the session is resumable with
|
|
343
|
+
// `/gsd auto`. Error/info-level stops remain hard stops for infrastructure
|
|
344
|
+
// failures and terminal conditions respectively.
|
|
345
|
+
// See: https://github.com/gsd-build/gsd-2/issues/2474
|
|
346
|
+
if (dispatchResult.level === "warning") {
|
|
347
|
+
ctx.ui.notify(dispatchResult.reason, "warning");
|
|
348
|
+
await deps.pauseAuto(ctx, pi);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
|
|
352
|
+
}
|
|
338
353
|
debugLog("autoLoop", { phase: "exit", reason: "dispatch-stop" });
|
|
339
354
|
return { action: "break", reason: "dispatch-stop" };
|
|
340
355
|
}
|
|
@@ -721,18 +736,18 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
721
736
|
deps.updateSessionLock(deps.lockBase(), unitType, unitId, sessionFile);
|
|
722
737
|
deps.writeLock(deps.lockBase(), unitType, unitId, sessionFile);
|
|
723
738
|
// Tag the most recent window entry with error info for stuck detection
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
if (
|
|
739
|
+
const lastEntry = loopState.recentUnits[loopState.recentUnits.length - 1];
|
|
740
|
+
if (lastEntry) {
|
|
741
|
+
if (unitResult.errorContext) {
|
|
742
|
+
lastEntry.error = `${unitResult.errorContext.category}:${unitResult.errorContext.message}`.slice(0, 200);
|
|
743
|
+
}
|
|
744
|
+
else if (unitResult.status === "error" || unitResult.status === "cancelled") {
|
|
727
745
|
lastEntry.error = `${unitResult.status}:${unitType}/${unitId}`;
|
|
728
746
|
}
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
if (/error|fail|exception/i.test(msgStr)) {
|
|
734
|
-
const lastEntry = loopState.recentUnits[loopState.recentUnits.length - 1];
|
|
735
|
-
if (lastEntry) {
|
|
747
|
+
else if (unitResult.event?.messages?.length) {
|
|
748
|
+
const lastMsg = unitResult.event.messages[unitResult.event.messages.length - 1];
|
|
749
|
+
const msgStr = typeof lastMsg === "string" ? lastMsg : JSON.stringify(lastMsg);
|
|
750
|
+
if (/error|fail|exception/i.test(msgStr)) {
|
|
736
751
|
lastEntry.error = msgStr.slice(0, 200);
|
|
737
752
|
}
|
|
738
753
|
}
|
|
@@ -779,7 +794,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
779
794
|
s.unitDispatchCount.delete(`${unitType}/${unitId}`);
|
|
780
795
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
781
796
|
}
|
|
782
|
-
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
797
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
783
798
|
return { action: "next", data: { unitStartedAt: s.currentUnit.startedAt } };
|
|
784
799
|
}
|
|
785
800
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
@@ -64,12 +64,12 @@ export function isSessionSwitchInFlight() {
|
|
|
64
64
|
* blocks to ensure the autoLoop is never stuck awaiting a promise that
|
|
65
65
|
* will never resolve. Safe to call when no resolver is pending (no-op).
|
|
66
66
|
*/
|
|
67
|
-
export function resolveAgentEndCancelled() {
|
|
67
|
+
export function resolveAgentEndCancelled(errorContext) {
|
|
68
68
|
if (_currentResolve) {
|
|
69
69
|
debugLog("resolveAgentEndCancelled", { status: "resolving-cancelled" });
|
|
70
70
|
const r = _currentResolve;
|
|
71
71
|
_currentResolve = null;
|
|
72
|
-
r({ status: "cancelled" });
|
|
72
|
+
r({ status: "cancelled", ...(errorContext ? { errorContext } : {}) });
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
// ─── resetPendingResolve (test helper) ───────────────────────────────────────
|
|
@@ -41,13 +41,13 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
41
41
|
unitId,
|
|
42
42
|
error: msg,
|
|
43
43
|
});
|
|
44
|
-
return { status: "cancelled" };
|
|
44
|
+
return { status: "cancelled", errorContext: { message: `Session creation failed: ${msg}`, category: "session-failed", isTransient: true } };
|
|
45
45
|
}
|
|
46
46
|
if (sessionTimeoutHandle)
|
|
47
47
|
clearTimeout(sessionTimeoutHandle);
|
|
48
48
|
if (sessionResult.cancelled) {
|
|
49
49
|
debugLog("runUnit-session-timeout", { unitType, unitId });
|
|
50
|
-
return { status: "cancelled" };
|
|
50
|
+
return { status: "cancelled", errorContext: { message: "Session creation timed out", category: "timeout", isTransient: true } };
|
|
51
51
|
}
|
|
52
52
|
if (!s.active) {
|
|
53
53
|
return { status: "cancelled" };
|
|
@@ -61,6 +61,13 @@ export class AutoSession {
|
|
|
61
61
|
lastStateRebuildAt = 0;
|
|
62
62
|
// ── Sidecar queue ─────────────────────────────────────────────────────
|
|
63
63
|
sidecarQueue = [];
|
|
64
|
+
// ── Isolation degradation ────────────────────────────────────────────
|
|
65
|
+
/** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
|
|
66
|
+
isolationDegraded = false;
|
|
67
|
+
// ── Merge guard ──────────────────────────────────────────────────────
|
|
68
|
+
/** Set to true after phases.ts successfully calls mergeAndExit, so that
|
|
69
|
+
* stopAuto does not attempt the same merge a second time (#2645). */
|
|
70
|
+
milestoneMergedInPhases = false;
|
|
64
71
|
// ── Dispatch circuit breakers ──────────────────────────────────────
|
|
65
72
|
rewriteAttemptCount = 0;
|
|
66
73
|
// ── Metrics ──────────────────────────────────────────────────────────────
|
|
@@ -140,6 +147,8 @@ export class AutoSession {
|
|
|
140
147
|
this.pendingQuickTasks = [];
|
|
141
148
|
this.sidecarQueue = [];
|
|
142
149
|
this.rewriteAttemptCount = 0;
|
|
150
|
+
this.isolationDegraded = false;
|
|
151
|
+
this.milestoneMergedInPhases = false;
|
|
143
152
|
// Signal handler
|
|
144
153
|
this.sigtermHandler = null;
|
|
145
154
|
// Loop promise state lives in auto-loop.ts module scope
|