gsd-pi 2.50.0-dev.9476db8 → 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/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/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 +81 -54
- 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-utils.js +20 -0
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -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/files.js +5 -1
- 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/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 +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -0
- package/dist/resources/extensions/gsd/preferences.js +3 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +11 -7
- 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/roadmap-mutations.js +110 -0
- 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 +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 +17 -5
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
- 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/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 +17 -16
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/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 +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.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 +17 -16
- 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/{471.js → 7471.js} +1 -1
- 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 +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/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/{page-6654a8cca61a3d1c.js → page-b950e4e384cc62b3.js} +1 -1
- 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/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/server.js +1 -1
- package/package.json +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/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/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/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 +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/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/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/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 +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/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/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/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 +84 -51
- 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-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto.ts +15 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -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/files.ts +6 -1
- 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/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 +20 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +26 -0
- package/src/resources/extensions/gsd/preferences.ts +3 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +11 -7
- 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/roadmap-mutations.ts +134 -0
- 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 +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 +16 -5
- package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
- package/src/resources/extensions/gsd/templates/preferences.md +2 -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/complete-milestone.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 +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/double-merge-guard.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
- 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/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/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 +24 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- 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/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/static/MkE9kzqUGny3-cSE0GNnm/_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/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/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/{MkE9kzqUGny3-cSE0GNnm → yJIyd5cXPNpmXTv18ZlyC}/_ssgManifest.js +0 -0
|
@@ -1989,6 +1989,7 @@ export class InteractiveMode {
|
|
|
1989
1989
|
handleDebugCommand: () => this.handleDebugCommand(),
|
|
1990
1990
|
shutdown: () => this.shutdown(),
|
|
1991
1991
|
executeCompaction: (instructions, isAuto) => this.executeCompaction(instructions, isAuto),
|
|
1992
|
+
handleBashCommand: (command, options) => this.handleBashCommand(command, options?.excludeFromContext, options?.displayCommand, options?.loginShell),
|
|
1992
1993
|
};
|
|
1993
1994
|
}
|
|
1994
1995
|
|
|
@@ -3647,8 +3648,9 @@ export class InteractiveMode {
|
|
|
3647
3648
|
}
|
|
3648
3649
|
}
|
|
3649
3650
|
|
|
3650
|
-
private async handleBashCommand(command: string, excludeFromContext = false): Promise<void> {
|
|
3651
|
+
private async handleBashCommand(command: string, excludeFromContext = false, displayCommand?: string, loginShell?: boolean): Promise<void> {
|
|
3651
3652
|
const extensionRunner = this.session.extensionRunner;
|
|
3653
|
+
const label = displayCommand || command;
|
|
3652
3654
|
|
|
3653
3655
|
// Emit user_bash event to let extensions intercept
|
|
3654
3656
|
const eventResult = extensionRunner
|
|
@@ -3665,7 +3667,7 @@ export class InteractiveMode {
|
|
|
3665
3667
|
const result = eventResult.result;
|
|
3666
3668
|
|
|
3667
3669
|
// Create UI component for display
|
|
3668
|
-
this.bashComponent = new BashExecutionComponent(
|
|
3670
|
+
this.bashComponent = new BashExecutionComponent(label, this.ui, excludeFromContext);
|
|
3669
3671
|
if (this.session.isStreaming) {
|
|
3670
3672
|
this.pendingMessagesContainer.addChild(this.bashComponent);
|
|
3671
3673
|
this.pendingBashComponents.push(this.bashComponent);
|
|
@@ -3693,7 +3695,7 @@ export class InteractiveMode {
|
|
|
3693
3695
|
|
|
3694
3696
|
// Normal execution path (possibly with custom operations)
|
|
3695
3697
|
const isDeferred = this.session.isStreaming;
|
|
3696
|
-
this.bashComponent = new BashExecutionComponent(
|
|
3698
|
+
this.bashComponent = new BashExecutionComponent(label, this.ui, excludeFromContext);
|
|
3697
3699
|
|
|
3698
3700
|
if (isDeferred) {
|
|
3699
3701
|
// Show in pending area when agent is streaming
|
|
@@ -3714,7 +3716,7 @@ export class InteractiveMode {
|
|
|
3714
3716
|
this.ui.requestRender();
|
|
3715
3717
|
}
|
|
3716
3718
|
},
|
|
3717
|
-
{ excludeFromContext, operations: eventResult?.operations },
|
|
3719
|
+
{ excludeFromContext, operations: eventResult?.operations, loginShell },
|
|
3718
3720
|
);
|
|
3719
3721
|
|
|
3720
3722
|
if (this.bashComponent) {
|
|
@@ -104,6 +104,9 @@ export interface SlashCommandContext {
|
|
|
104
104
|
|
|
105
105
|
// For compaction
|
|
106
106
|
executeCompaction(customInstructions?: string, isAuto?: boolean): Promise<unknown>;
|
|
107
|
+
|
|
108
|
+
// Bash execution
|
|
109
|
+
handleBashCommand(command: string, options?: { excludeFromContext?: boolean; displayCommand?: string; loginShell?: boolean }): Promise<void>;
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
// ---------------------------------------------------------------------------
|
|
@@ -220,6 +223,18 @@ export async function dispatchSlashCommand(
|
|
|
220
223
|
await ctx.shutdown();
|
|
221
224
|
return true;
|
|
222
225
|
}
|
|
226
|
+
if (text === "/terminal" || text.startsWith("/terminal ")) {
|
|
227
|
+
const command = text.startsWith("/terminal ") ? text.slice(10).trim() : "";
|
|
228
|
+
if (!command) {
|
|
229
|
+
ctx.showWarning("Usage: /terminal <command> (e.g. /terminal ping -c3 1.1.1.1)");
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
// Run in the user's login shell ($SHELL -l -c) so PATH additions
|
|
233
|
+
// and env vars from shell profiles (.zprofile/.profile) are available.
|
|
234
|
+
// Note: shell aliases are not loaded (requires -i which has side effects).
|
|
235
|
+
await ctx.handleBashCommand(command, { loginShell: true });
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
223
238
|
|
|
224
239
|
return false;
|
|
225
240
|
}
|
|
@@ -113,6 +113,7 @@ const light: ThemeJson = {
|
|
|
113
113
|
green: "#588458",
|
|
114
114
|
red: "#aa5555",
|
|
115
115
|
yellow: "#9a7326",
|
|
116
|
+
warning: "#7a5a00",
|
|
116
117
|
mediumGray: "#6c6c6c",
|
|
117
118
|
dimGray: "#767676",
|
|
118
119
|
lightGray: "#b0b0b0",
|
|
@@ -130,7 +131,7 @@ const light: ThemeJson = {
|
|
|
130
131
|
borderMuted: "lightGray",
|
|
131
132
|
success: "green",
|
|
132
133
|
error: "red",
|
|
133
|
-
warning: "
|
|
134
|
+
warning: "warning",
|
|
134
135
|
muted: "mediumGray",
|
|
135
136
|
dim: "dimGray",
|
|
136
137
|
text: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/themes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/themes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAwL5C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAmB,CAAC"}
|
|
@@ -99,6 +99,7 @@ const light = {
|
|
|
99
99
|
green: "#588458",
|
|
100
100
|
red: "#aa5555",
|
|
101
101
|
yellow: "#9a7326",
|
|
102
|
+
warning: "#7a5a00",
|
|
102
103
|
mediumGray: "#6c6c6c",
|
|
103
104
|
dimGray: "#767676",
|
|
104
105
|
lightGray: "#b0b0b0",
|
|
@@ -116,7 +117,7 @@ const light = {
|
|
|
116
117
|
borderMuted: "lightGray",
|
|
117
118
|
success: "green",
|
|
118
119
|
error: "red",
|
|
119
|
-
warning: "
|
|
120
|
+
warning: "warning",
|
|
120
121
|
muted: "mediumGray",
|
|
121
122
|
dim: "dimGray",
|
|
122
123
|
text: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/themes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/themes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Built-in theme definitions.\n *\n * Each theme is a self-contained record of color values. Variable references\n * (e.g. \"accent\") are resolved against the `vars` map at load time by the\n * theme engine in theme.ts.\n *\n * To add a new built-in theme, add an entry to `builtinThemes` below.\n */\n\n// Re-use the ThemeJson type from the schema defined in theme.ts.\n// We import only the type to avoid circular runtime dependencies.\nimport type { ThemeJson } from \"./theme.js\";\n\n// ---------------------------------------------------------------------------\n// Dark theme\n// ---------------------------------------------------------------------------\n\nconst dark: ThemeJson = {\n\tname: \"dark\",\n\tvars: {\n\t\tcyan: \"#00d7ff\",\n\t\tblue: \"#5f87ff\",\n\t\tgreen: \"#b5bd68\",\n\t\tred: \"#cc6666\",\n\t\tyellow: \"#ffff00\",\n\t\tgray: \"#808080\",\n\t\tdimGray: \"#666666\",\n\t\tdarkGray: \"#505050\",\n\t\taccent: \"#8abeb7\",\n\t\tselectedBg: \"#3a3a4a\",\n\t\tuserMsgBg: \"#343541\",\n\t\ttoolPendingBg: \"#282832\",\n\t\ttoolSuccessBg: \"#283228\",\n\t\ttoolErrorBg: \"#3c2828\",\n\t\tcustomMsgBg: \"#2d2838\",\n\t},\n\tcolors: {\n\t\taccent: \"accent\",\n\t\tborder: \"blue\",\n\t\tborderAccent: \"cyan\",\n\t\tborderMuted: \"darkGray\",\n\t\tsuccess: \"green\",\n\t\terror: \"red\",\n\t\twarning: \"yellow\",\n\t\tmuted: \"gray\",\n\t\tdim: \"dimGray\",\n\t\ttext: \"\",\n\t\tthinkingText: \"gray\",\n\n\t\tselectedBg: \"selectedBg\",\n\t\tuserMessageBg: \"userMsgBg\",\n\t\tuserMessageText: \"\",\n\t\tcustomMessageBg: \"customMsgBg\",\n\t\tcustomMessageText: \"\",\n\t\tcustomMessageLabel: \"#9575cd\",\n\t\ttoolPendingBg: \"toolPendingBg\",\n\t\ttoolSuccessBg: \"toolSuccessBg\",\n\t\ttoolErrorBg: \"toolErrorBg\",\n\t\ttoolTitle: \"\",\n\t\ttoolOutput: \"gray\",\n\n\t\tmdHeading: \"#f0c674\",\n\t\tmdLink: \"#81a2be\",\n\t\tmdLinkUrl: \"dimGray\",\n\t\tmdCode: \"accent\",\n\t\tmdCodeBlock: \"green\",\n\t\tmdCodeBlockBorder: \"gray\",\n\t\tmdQuote: \"gray\",\n\t\tmdQuoteBorder: \"gray\",\n\t\tmdHr: \"gray\",\n\t\tmdListBullet: \"accent\",\n\n\t\ttoolDiffAdded: \"green\",\n\t\ttoolDiffRemoved: \"red\",\n\t\ttoolDiffContext: \"gray\",\n\n\t\tsyntaxComment: \"#6A9955\",\n\t\tsyntaxKeyword: \"#569CD6\",\n\t\tsyntaxFunction: \"#DCDCAA\",\n\t\tsyntaxVariable: \"#9CDCFE\",\n\t\tsyntaxString: \"#CE9178\",\n\t\tsyntaxNumber: \"#B5CEA8\",\n\t\tsyntaxType: \"#4EC9B0\",\n\t\tsyntaxOperator: \"#D4D4D4\",\n\t\tsyntaxPunctuation: \"#D4D4D4\",\n\n\t\tthinkingOff: \"darkGray\",\n\t\tthinkingMinimal: \"#6e6e6e\",\n\t\tthinkingLow: \"#5f87af\",\n\t\tthinkingMedium: \"#81a2be\",\n\t\tthinkingHigh: \"#b294bb\",\n\t\tthinkingXhigh: \"#d183e8\",\n\n\t\tbashMode: \"green\",\n\t},\n\texport: {\n\t\tpageBg: \"#18181e\",\n\t\tcardBg: \"#1e1e24\",\n\t\tinfoBg: \"#3c3728\",\n\t},\n};\n\n// ---------------------------------------------------------------------------\n// Light theme\n// ---------------------------------------------------------------------------\n\nconst light: ThemeJson = {\n\tname: \"light\",\n\tvars: {\n\t\tteal: \"#5a8080\",\n\t\tblue: \"#547da7\",\n\t\tgreen: \"#588458\",\n\t\tred: \"#aa5555\",\n\t\tyellow: \"#9a7326\",\n\t\twarning: \"#7a5a00\",\n\t\tmediumGray: \"#6c6c6c\",\n\t\tdimGray: \"#767676\",\n\t\tlightGray: \"#b0b0b0\",\n\t\tselectedBg: \"#d0d0e0\",\n\t\tuserMsgBg: \"#e8e8e8\",\n\t\ttoolPendingBg: \"#e8e8f0\",\n\t\ttoolSuccessBg: \"#e8f0e8\",\n\t\ttoolErrorBg: \"#f0e8e8\",\n\t\tcustomMsgBg: \"#ede7f6\",\n\t},\n\tcolors: {\n\t\taccent: \"teal\",\n\t\tborder: \"blue\",\n\t\tborderAccent: \"teal\",\n\t\tborderMuted: \"lightGray\",\n\t\tsuccess: \"green\",\n\t\terror: \"red\",\n\t\twarning: \"warning\",\n\t\tmuted: \"mediumGray\",\n\t\tdim: \"dimGray\",\n\t\ttext: \"\",\n\t\tthinkingText: \"mediumGray\",\n\n\t\tselectedBg: \"selectedBg\",\n\t\tuserMessageBg: \"userMsgBg\",\n\t\tuserMessageText: \"\",\n\t\tcustomMessageBg: \"customMsgBg\",\n\t\tcustomMessageText: \"\",\n\t\tcustomMessageLabel: \"#7e57c2\",\n\t\ttoolPendingBg: \"toolPendingBg\",\n\t\ttoolSuccessBg: \"toolSuccessBg\",\n\t\ttoolErrorBg: \"toolErrorBg\",\n\t\ttoolTitle: \"\",\n\t\ttoolOutput: \"mediumGray\",\n\n\t\tmdHeading: \"yellow\",\n\t\tmdLink: \"blue\",\n\t\tmdLinkUrl: \"dimGray\",\n\t\tmdCode: \"teal\",\n\t\tmdCodeBlock: \"green\",\n\t\tmdCodeBlockBorder: \"mediumGray\",\n\t\tmdQuote: \"mediumGray\",\n\t\tmdQuoteBorder: \"mediumGray\",\n\t\tmdHr: \"mediumGray\",\n\t\tmdListBullet: \"green\",\n\n\t\ttoolDiffAdded: \"green\",\n\t\ttoolDiffRemoved: \"red\",\n\t\ttoolDiffContext: \"mediumGray\",\n\n\t\tsyntaxComment: \"#008000\",\n\t\tsyntaxKeyword: \"#0000FF\",\n\t\tsyntaxFunction: \"#795E26\",\n\t\tsyntaxVariable: \"#001080\",\n\t\tsyntaxString: \"#A31515\",\n\t\tsyntaxNumber: \"#098658\",\n\t\tsyntaxType: \"#267F99\",\n\t\tsyntaxOperator: \"#000000\",\n\t\tsyntaxPunctuation: \"#000000\",\n\n\t\tthinkingOff: \"lightGray\",\n\t\tthinkingMinimal: \"#767676\",\n\t\tthinkingLow: \"blue\",\n\t\tthinkingMedium: \"teal\",\n\t\tthinkingHigh: \"#875f87\",\n\t\tthinkingXhigh: \"#8b008b\",\n\n\t\tbashMode: \"green\",\n\t},\n\texport: {\n\t\tpageBg: \"#f8f8f8\",\n\t\tcardBg: \"#ffffff\",\n\t\tinfoBg: \"#fffae6\",\n\t},\n};\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const builtinThemes: Record<string, ThemeJson> = { dark, light };\n"]}
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,23 +1,180 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { exec as execCb } from 'child_process'
|
|
4
|
-
import {
|
|
3
|
+
import { exec as execCb, spawnSync } from 'child_process'
|
|
4
|
+
import { createHash, randomUUID } from 'crypto'
|
|
5
|
+
import { chmodSync, copyFileSync, createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from 'fs'
|
|
6
|
+
import { arch, homedir, platform } from 'os'
|
|
7
|
+
import { dirname, resolve, join } from 'path'
|
|
8
|
+
import { Readable } from 'stream'
|
|
9
|
+
import { finished } from 'stream/promises'
|
|
10
|
+
import extractZip from 'extract-zip'
|
|
5
11
|
import { fileURLToPath } from 'url'
|
|
6
12
|
|
|
7
13
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
8
14
|
const cwd = resolve(__dirname, '..')
|
|
9
|
-
const
|
|
15
|
+
const PLAYWRIGHT_SKIP =
|
|
10
16
|
process.env.PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD === '1' ||
|
|
11
17
|
process.env.PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD === 'true'
|
|
18
|
+
const RTK_SKIP =
|
|
19
|
+
process.env.GSD_SKIP_RTK_INSTALL === '1' ||
|
|
20
|
+
process.env.GSD_SKIP_RTK_INSTALL === 'true' ||
|
|
21
|
+
process.env.GSD_RTK_DISABLED === '1' ||
|
|
22
|
+
process.env.GSD_RTK_DISABLED === 'true'
|
|
23
|
+
|
|
24
|
+
const RTK_VERSION = '0.33.1'
|
|
25
|
+
const RTK_REPO = 'rtk-ai/rtk'
|
|
26
|
+
const RTK_ENV = { ...process.env, RTK_TELEMETRY_DISABLED: '1' }
|
|
27
|
+
const managedBinDir = join(process.env.GSD_HOME || join(homedir(), '.gsd'), 'agent', 'bin')
|
|
28
|
+
const managedBinaryPath = join(managedBinDir, platform() === 'win32' ? 'rtk.exe' : 'rtk')
|
|
12
29
|
|
|
13
30
|
function run(cmd) {
|
|
14
|
-
return new Promise((
|
|
31
|
+
return new Promise((resolvePromise) => {
|
|
15
32
|
execCb(cmd, { cwd }, (error, stdout, stderr) => {
|
|
16
|
-
|
|
33
|
+
resolvePromise({ ok: !error, stdout, stderr })
|
|
17
34
|
})
|
|
18
35
|
})
|
|
19
36
|
}
|
|
20
37
|
|
|
21
|
-
|
|
38
|
+
function logWarn(message) {
|
|
39
|
+
process.stderr.write(`[gsd] postinstall: ${message}\n`)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function resolveAssetName() {
|
|
43
|
+
const currentPlatform = platform()
|
|
44
|
+
const currentArch = arch()
|
|
45
|
+
if (currentPlatform === 'darwin' && currentArch === 'arm64') return 'rtk-aarch64-apple-darwin.tar.gz'
|
|
46
|
+
if (currentPlatform === 'darwin' && currentArch === 'x64') return 'rtk-x86_64-apple-darwin.tar.gz'
|
|
47
|
+
if (currentPlatform === 'linux' && currentArch === 'arm64') return 'rtk-aarch64-unknown-linux-gnu.tar.gz'
|
|
48
|
+
if (currentPlatform === 'linux' && currentArch === 'x64') return 'rtk-x86_64-unknown-linux-musl.tar.gz'
|
|
49
|
+
if (currentPlatform === 'win32' && currentArch === 'x64') return 'rtk-x86_64-pc-windows-msvc.zip'
|
|
50
|
+
return null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function parseChecksums(text) {
|
|
54
|
+
const checksums = new Map()
|
|
55
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
56
|
+
const line = rawLine.trim()
|
|
57
|
+
if (!line) continue
|
|
58
|
+
const match = line.match(/^([a-f0-9]{64})\s+(.+)$/i)
|
|
59
|
+
if (!match) continue
|
|
60
|
+
checksums.set(match[2], match[1].toLowerCase())
|
|
61
|
+
}
|
|
62
|
+
return checksums
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function sha256File(path) {
|
|
66
|
+
const hash = createHash('sha256')
|
|
67
|
+
hash.update(readFileSync(path))
|
|
68
|
+
return hash.digest('hex')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function downloadToFile(url, destination) {
|
|
72
|
+
const response = await fetch(url, { headers: { 'User-Agent': 'gsd-pi-postinstall' } })
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`download failed (${response.status}) for ${url}`)
|
|
75
|
+
}
|
|
76
|
+
if (!response.body) {
|
|
77
|
+
throw new Error(`download returned no body for ${url}`)
|
|
78
|
+
}
|
|
79
|
+
const output = createWriteStream(destination)
|
|
80
|
+
await finished(Readable.fromWeb(response.body).pipe(output))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function findBinaryRecursively(rootDir, binaryName) {
|
|
84
|
+
const stack = [rootDir]
|
|
85
|
+
while (stack.length > 0) {
|
|
86
|
+
const current = stack.pop()
|
|
87
|
+
if (!current) continue
|
|
88
|
+
const entries = readdirSync(current, { withFileTypes: true })
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
const fullPath = join(current, entry.name)
|
|
91
|
+
if (entry.isFile() && entry.name === binaryName) return fullPath
|
|
92
|
+
if (entry.isDirectory()) stack.push(fullPath)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return null
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function validateRtkBinary(binaryPath) {
|
|
99
|
+
const result = spawnSync(binaryPath, ['rewrite', 'git status'], {
|
|
100
|
+
encoding: 'utf-8',
|
|
101
|
+
env: RTK_ENV,
|
|
102
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
103
|
+
timeout: 5000,
|
|
104
|
+
})
|
|
105
|
+
return !result.error && result.status === 0 && (result.stdout || '').trim() === 'rtk git status'
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function ensureRtkInstalled() {
|
|
109
|
+
if (RTK_SKIP) return
|
|
110
|
+
const assetName = resolveAssetName()
|
|
111
|
+
if (!assetName) return
|
|
112
|
+
if (existsSync(managedBinaryPath) && validateRtkBinary(managedBinaryPath)) return
|
|
113
|
+
|
|
114
|
+
const tempRoot = join(managedBinDir, `.rtk-postinstall-${randomUUID().slice(0, 8)}`)
|
|
115
|
+
const archivePath = join(tempRoot, assetName)
|
|
116
|
+
const extractDir = join(tempRoot, 'extract')
|
|
117
|
+
const releaseBase = `https://github.com/${RTK_REPO}/releases/download/v${RTK_VERSION}`
|
|
118
|
+
|
|
119
|
+
mkdirSync(tempRoot, { recursive: true })
|
|
120
|
+
mkdirSync(managedBinDir, { recursive: true })
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
const checksumsResponse = await fetch(`${releaseBase}/checksums.txt`, {
|
|
124
|
+
headers: { 'User-Agent': 'gsd-pi-postinstall' },
|
|
125
|
+
})
|
|
126
|
+
if (!checksumsResponse.ok) {
|
|
127
|
+
throw new Error(`failed to fetch RTK checksums (${checksumsResponse.status})`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const checksums = parseChecksums(await checksumsResponse.text())
|
|
131
|
+
const expectedSha = checksums.get(assetName)
|
|
132
|
+
if (!expectedSha) {
|
|
133
|
+
throw new Error(`missing checksum for ${assetName}`)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
await downloadToFile(`${releaseBase}/${assetName}`, archivePath)
|
|
137
|
+
const actualSha = sha256File(archivePath)
|
|
138
|
+
if (actualSha !== expectedSha) {
|
|
139
|
+
throw new Error(`checksum mismatch for ${assetName}`)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
mkdirSync(extractDir, { recursive: true })
|
|
143
|
+
if (assetName.endsWith('.zip')) {
|
|
144
|
+
await extractZip(archivePath, { dir: extractDir })
|
|
145
|
+
} else {
|
|
146
|
+
const extractResult = spawnSync('tar', ['xzf', archivePath, '-C', extractDir], {
|
|
147
|
+
encoding: 'utf-8',
|
|
148
|
+
timeout: 30000,
|
|
149
|
+
})
|
|
150
|
+
if (extractResult.error || extractResult.status !== 0) {
|
|
151
|
+
throw new Error(extractResult.error?.message || extractResult.stderr?.trim() || `failed to extract ${assetName}`)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const extractedBinary = findBinaryRecursively(extractDir, platform() === 'win32' ? 'rtk.exe' : 'rtk')
|
|
156
|
+
if (!extractedBinary) {
|
|
157
|
+
throw new Error(`RTK binary not found in ${assetName}`)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
copyFileSync(extractedBinary, managedBinaryPath)
|
|
161
|
+
if (platform() !== 'win32') {
|
|
162
|
+
chmodSync(managedBinaryPath, 0o755)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!validateRtkBinary(managedBinaryPath)) {
|
|
166
|
+
rmSync(managedBinaryPath, { force: true })
|
|
167
|
+
throw new Error('downloaded RTK binary failed validation')
|
|
168
|
+
}
|
|
169
|
+
} catch (error) {
|
|
170
|
+
logWarn(`RTK install skipped: ${error instanceof Error ? error.message : String(error)}`)
|
|
171
|
+
} finally {
|
|
172
|
+
rmSync(tempRoot, { recursive: true, force: true })
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!PLAYWRIGHT_SKIP) {
|
|
22
177
|
await run('npx playwright install chromium')
|
|
23
178
|
}
|
|
179
|
+
|
|
180
|
+
await ensureRtkInstalled()
|
|
@@ -20,6 +20,7 @@ import { tmpdir } from "node:os";
|
|
|
20
20
|
import { join } from "node:path";
|
|
21
21
|
import { randomBytes } from "node:crypto";
|
|
22
22
|
import type { AsyncJobManager } from "./job-manager.js";
|
|
23
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
23
24
|
|
|
24
25
|
const schema = Type.Object({
|
|
25
26
|
command: Type.String({ description: "Bash command to execute in the background" }),
|
|
@@ -114,7 +115,8 @@ function executeBashInBackground(
|
|
|
114
115
|
const safeReject = (err: unknown) => { if (!settled) { settled = true; reject(err); } };
|
|
115
116
|
|
|
116
117
|
const { shell, args } = getShellConfig();
|
|
117
|
-
const
|
|
118
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
119
|
+
const resolvedCommand = sanitizeCommand(rewrittenCommand);
|
|
118
120
|
|
|
119
121
|
const child = spawn(shell, [...args, resolvedCommand], {
|
|
120
122
|
cwd,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import type { BgProcess } from "./types.js";
|
|
7
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
7
8
|
|
|
8
9
|
// ── Query Shell Environment ────────────────────────────────────────────────
|
|
9
10
|
|
|
@@ -128,9 +129,10 @@ export async function runOnSession(
|
|
|
128
129
|
const startIndex = bg.output.length;
|
|
129
130
|
|
|
130
131
|
// Write the sentinel-wrapped command to stdin
|
|
132
|
+
const rewrittenCommand = rewriteCommandWithRtk(command);
|
|
131
133
|
const wrappedCommand = [
|
|
132
134
|
`echo ${startMarker}`,
|
|
133
|
-
|
|
135
|
+
rewrittenCommand,
|
|
134
136
|
`${exitVar}=$?`,
|
|
135
137
|
`echo ${endMarker} $${exitVar}`,
|
|
136
138
|
].join("\n");
|
|
@@ -8,6 +8,7 @@ import { randomUUID } from "node:crypto";
|
|
|
8
8
|
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
10
|
import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
|
|
11
|
+
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
11
12
|
import type {
|
|
12
13
|
BgProcess,
|
|
13
14
|
BgProcessInfo,
|
|
@@ -127,7 +128,9 @@ export function startProcess(opts: StartOptions): BgProcess {
|
|
|
127
128
|
|
|
128
129
|
const { shell, args: shellArgs } = getShellConfig();
|
|
129
130
|
// Shell sessions default to the user's shell if no command specified
|
|
130
|
-
const command = processType === "shell" && !opts.command
|
|
131
|
+
const command = processType === "shell" && !opts.command
|
|
132
|
+
? shell
|
|
133
|
+
: rewriteCommandWithRtk(opts.command);
|
|
131
134
|
const proc = spawn(shell, [...shellArgs, sanitizeCommand(command)], {
|
|
132
135
|
cwd: opts.cwd,
|
|
133
136
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -244,7 +244,12 @@ export class PartialMessageBuilder {
|
|
|
244
244
|
try {
|
|
245
245
|
block.arguments = JSON.parse(jsonStr);
|
|
246
246
|
} catch {
|
|
247
|
+
// Stream was truncated mid-tool-call — JSON is garbage.
|
|
248
|
+
// Preserve the raw string for diagnostics but signal the
|
|
249
|
+
// malformation explicitly so downstream consumers can
|
|
250
|
+
// distinguish this from a healthy tool completion (#2574).
|
|
247
251
|
block.arguments = { _raw: jsonStr };
|
|
252
|
+
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
|
|
248
253
|
}
|
|
249
254
|
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
|
|
250
255
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { describe, test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { PartialMessageBuilder } from "../partial-builder.ts";
|
|
4
|
+
import type { BetaRawMessageStreamEvent } from "../sdk-types.ts";
|
|
5
|
+
|
|
6
|
+
describe("PartialMessageBuilder — malformed tool arguments (#2574)", () => {
|
|
7
|
+
/**
|
|
8
|
+
* Helper: feed a tool_use block through the builder lifecycle and return
|
|
9
|
+
* the toolcall_end event. Simulates: content_block_start → N deltas → content_block_stop.
|
|
10
|
+
*/
|
|
11
|
+
function feedToolCall(
|
|
12
|
+
builder: PartialMessageBuilder,
|
|
13
|
+
jsonFragments: string[],
|
|
14
|
+
) {
|
|
15
|
+
// Start the tool_use block at stream index 0
|
|
16
|
+
builder.handleEvent({
|
|
17
|
+
type: "content_block_start",
|
|
18
|
+
index: 0,
|
|
19
|
+
content_block: { type: "tool_use", id: "tool_1", name: "gsd_plan_slice", input: {} },
|
|
20
|
+
} as BetaRawMessageStreamEvent);
|
|
21
|
+
|
|
22
|
+
// Feed JSON fragments as input_json_delta
|
|
23
|
+
for (const fragment of jsonFragments) {
|
|
24
|
+
builder.handleEvent({
|
|
25
|
+
type: "content_block_delta",
|
|
26
|
+
index: 0,
|
|
27
|
+
delta: { type: "input_json_delta", partial_json: fragment },
|
|
28
|
+
} as BetaRawMessageStreamEvent);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Stop the block — this is where JSON parse happens
|
|
32
|
+
return builder.handleEvent({
|
|
33
|
+
type: "content_block_stop",
|
|
34
|
+
index: 0,
|
|
35
|
+
} as BetaRawMessageStreamEvent);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
test("valid JSON → toolcall_end without malformedArguments", () => {
|
|
39
|
+
const builder = new PartialMessageBuilder("claude-sonnet-4-20250514");
|
|
40
|
+
const event = feedToolCall(builder, ['{"milestone', 'Id": "M001"}']);
|
|
41
|
+
|
|
42
|
+
assert.ok(event, "event should not be null");
|
|
43
|
+
assert.equal(event!.type, "toolcall_end");
|
|
44
|
+
// Valid JSON should NOT have the malformedArguments flag
|
|
45
|
+
assert.equal(
|
|
46
|
+
(event as any).malformedArguments,
|
|
47
|
+
undefined,
|
|
48
|
+
"valid JSON should not set malformedArguments",
|
|
49
|
+
);
|
|
50
|
+
// Arguments should be parsed correctly
|
|
51
|
+
if (event!.type === "toolcall_end") {
|
|
52
|
+
assert.deepEqual(event!.toolCall.arguments, { milestoneId: "M001" });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("truncated JSON → toolcall_end WITH malformedArguments: true", () => {
|
|
57
|
+
const builder = new PartialMessageBuilder("claude-sonnet-4-20250514");
|
|
58
|
+
// Simulate a stream truncation: JSON is cut off mid-value
|
|
59
|
+
const event = feedToolCall(builder, ['{"milestone', 'Id": "M00']);
|
|
60
|
+
|
|
61
|
+
assert.ok(event, "event should not be null");
|
|
62
|
+
assert.equal(event!.type, "toolcall_end");
|
|
63
|
+
assert.equal(
|
|
64
|
+
(event as any).malformedArguments,
|
|
65
|
+
true,
|
|
66
|
+
"truncated JSON should set malformedArguments: true",
|
|
67
|
+
);
|
|
68
|
+
// The _raw field should contain the original broken JSON
|
|
69
|
+
if (event!.type === "toolcall_end") {
|
|
70
|
+
assert.equal(
|
|
71
|
+
event!.toolCall.arguments._raw,
|
|
72
|
+
'{"milestoneId": "M00',
|
|
73
|
+
"_raw should contain the truncated JSON string",
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("no JSON deltas → malformedArguments: true (empty accumulator is not valid JSON)", () => {
|
|
79
|
+
const builder = new PartialMessageBuilder("claude-sonnet-4-20250514");
|
|
80
|
+
// No deltas — the accumulator is initialized to "" by content_block_start,
|
|
81
|
+
// and "" is not valid JSON, so this correctly signals malformed.
|
|
82
|
+
const event = feedToolCall(builder, []);
|
|
83
|
+
|
|
84
|
+
assert.ok(event, "event should not be null");
|
|
85
|
+
assert.equal(event!.type, "toolcall_end");
|
|
86
|
+
assert.equal(
|
|
87
|
+
(event as any).malformedArguments,
|
|
88
|
+
true,
|
|
89
|
+
"empty accumulator (no JSON deltas) is not valid JSON → malformed",
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("garbage input (non-JSON) → malformedArguments: true", () => {
|
|
94
|
+
const builder = new PartialMessageBuilder("claude-sonnet-4-20250514");
|
|
95
|
+
const event = feedToolCall(builder, ["not json at all <html>"]);
|
|
96
|
+
|
|
97
|
+
assert.ok(event, "event should not be null");
|
|
98
|
+
assert.equal(event!.type, "toolcall_end");
|
|
99
|
+
assert.equal(
|
|
100
|
+
(event as any).malformedArguments,
|
|
101
|
+
true,
|
|
102
|
+
"non-JSON content should set malformedArguments: true",
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -333,6 +333,8 @@ export async function runPreDispatch(
|
|
|
333
333
|
if (s.currentMilestoneId) {
|
|
334
334
|
try {
|
|
335
335
|
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
336
|
+
// Prevent stopAuto from attempting the same merge (#2645)
|
|
337
|
+
s.milestoneMergedInPhases = true;
|
|
336
338
|
} catch (mergeErr) {
|
|
337
339
|
if (mergeErr instanceof MergeConflictError) {
|
|
338
340
|
ctx.ui.notify(
|
|
@@ -428,6 +430,8 @@ export async function runPreDispatch(
|
|
|
428
430
|
if (s.currentMilestoneId) {
|
|
429
431
|
try {
|
|
430
432
|
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
433
|
+
// Prevent stopAuto from attempting the same merge (#2645)
|
|
434
|
+
s.milestoneMergedInPhases = true;
|
|
431
435
|
} catch (mergeErr) {
|
|
432
436
|
if (mergeErr instanceof MergeConflictError) {
|
|
433
437
|
ctx.ui.notify(
|
|
@@ -500,7 +504,17 @@ export async function runDispatch(
|
|
|
500
504
|
|
|
501
505
|
if (dispatchResult.action === "stop") {
|
|
502
506
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
|
|
503
|
-
|
|
507
|
+
// Warning-level stops are recoverable human checkpoints (e.g. UAT verdict
|
|
508
|
+
// gate) — pause instead of hard-stopping so the session is resumable with
|
|
509
|
+
// `/gsd auto`. Error/info-level stops remain hard stops for infrastructure
|
|
510
|
+
// failures and terminal conditions respectively.
|
|
511
|
+
// See: https://github.com/gsd-build/gsd-2/issues/2474
|
|
512
|
+
if (dispatchResult.level === "warning") {
|
|
513
|
+
ctx.ui.notify(dispatchResult.reason, "warning");
|
|
514
|
+
await deps.pauseAuto(ctx, pi);
|
|
515
|
+
} else {
|
|
516
|
+
await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
|
|
517
|
+
}
|
|
504
518
|
debugLog("autoLoop", { phase: "exit", reason: "dispatch-stop" });
|
|
505
519
|
return { action: "break", reason: "dispatch-stop" };
|
|
506
520
|
}
|
|
@@ -122,6 +122,11 @@ export class AutoSession {
|
|
|
122
122
|
/** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
|
|
123
123
|
isolationDegraded = false;
|
|
124
124
|
|
|
125
|
+
// ── Merge guard ──────────────────────────────────────────────────────
|
|
126
|
+
/** Set to true after phases.ts successfully calls mergeAndExit, so that
|
|
127
|
+
* stopAuto does not attempt the same merge a second time (#2645). */
|
|
128
|
+
milestoneMergedInPhases = false;
|
|
129
|
+
|
|
125
130
|
// ── Dispatch circuit breakers ──────────────────────────────────────
|
|
126
131
|
rewriteAttemptCount = 0;
|
|
127
132
|
|
|
@@ -205,6 +210,7 @@ export class AutoSession {
|
|
|
205
210
|
this.sidecarQueue = [];
|
|
206
211
|
this.rewriteAttemptCount = 0;
|
|
207
212
|
this.isolationDegraded = false;
|
|
213
|
+
this.milestoneMergedInPhases = false;
|
|
208
214
|
|
|
209
215
|
// Signal handler
|
|
210
216
|
this.sigtermHandler = null;
|
|
@@ -26,6 +26,11 @@ import { getActiveWorktreeName } from "./worktree-command.js";
|
|
|
26
26
|
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
27
27
|
import { resolveServiceTierIcon, getEffectiveServiceTier } from "./service-tier.js";
|
|
28
28
|
import { parseUnitId } from "./unit-id.js";
|
|
29
|
+
import {
|
|
30
|
+
formatRtkSavingsLabel,
|
|
31
|
+
getRtkSessionSavings,
|
|
32
|
+
type RtkSessionSavings,
|
|
33
|
+
} from "../shared/rtk-session-stats.js";
|
|
29
34
|
|
|
30
35
|
// ─── UAT Slice Extraction ─────────────────────────────────────────────────────
|
|
31
36
|
|
|
@@ -59,6 +64,10 @@ export interface AutoDashboardData {
|
|
|
59
64
|
profileDowngraded?: boolean;
|
|
60
65
|
/** Number of pending captures awaiting triage (0 if none or file missing) */
|
|
61
66
|
pendingCaptureCount: number;
|
|
67
|
+
/** RTK token savings for the current session, or null when unavailable. */
|
|
68
|
+
rtkSavings?: RtkSessionSavings | null;
|
|
69
|
+
/** Whether RTK is enabled via experimental.rtk preference. False when not opted in. */
|
|
70
|
+
rtkEnabled?: boolean;
|
|
62
71
|
/** Cross-process: another auto-mode session detected via auto.lock (PID, startedAt) */
|
|
63
72
|
remoteSession?: { pid: number; startedAt: string; unitType: string; unitId: string };
|
|
64
73
|
}
|
|
@@ -476,6 +485,19 @@ export function updateProgressWidget(
|
|
|
476
485
|
let pulseBright = true;
|
|
477
486
|
let cachedLines: string[] | undefined;
|
|
478
487
|
let cachedWidth: number | undefined;
|
|
488
|
+
let cachedRtkLabel: string | null | undefined;
|
|
489
|
+
|
|
490
|
+
const refreshRtkLabel = (): void => {
|
|
491
|
+
try {
|
|
492
|
+
const sessionId = ctx.sessionManager.getSessionId();
|
|
493
|
+
const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
|
|
494
|
+
cachedRtkLabel = formatRtkSavingsLabel(savings);
|
|
495
|
+
} catch {
|
|
496
|
+
cachedRtkLabel = null;
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
refreshRtkLabel();
|
|
479
501
|
|
|
480
502
|
const pulseTimer = setInterval(() => {
|
|
481
503
|
pulseBright = !pulseBright;
|
|
@@ -487,12 +509,15 @@ export function updateProgressWidget(
|
|
|
487
509
|
// task/slice completion mid-unit. Without this, the progress bar only
|
|
488
510
|
// updates at dispatch time, appearing frozen during long-running units.
|
|
489
511
|
// 15s (vs 5s) reduces synchronous file I/O on the hot path.
|
|
490
|
-
const progressRefreshTimer =
|
|
512
|
+
const progressRefreshTimer = setInterval(() => {
|
|
491
513
|
try {
|
|
492
|
-
|
|
514
|
+
if (mid) {
|
|
515
|
+
updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
|
|
516
|
+
}
|
|
517
|
+
refreshRtkLabel();
|
|
493
518
|
cachedLines = undefined;
|
|
494
519
|
} catch { /* non-fatal */ }
|
|
495
|
-
}, 15_000)
|
|
520
|
+
}, 15_000);
|
|
496
521
|
|
|
497
522
|
return {
|
|
498
523
|
render(width: number): string[] {
|
|
@@ -776,6 +801,9 @@ export function updateProgressWidget(
|
|
|
776
801
|
if (statsLine) {
|
|
777
802
|
lines.push(rightAlign("", statsLine, width));
|
|
778
803
|
}
|
|
804
|
+
if (cachedRtkLabel) {
|
|
805
|
+
lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
|
|
806
|
+
}
|
|
779
807
|
}
|
|
780
808
|
// PWD line with last commit info right-aligned
|
|
781
809
|
const lastCommit = getLastCommit(accessors.getBasePath());
|