gsd-pi 2.51.0 → 2.52.0-dev.655ad8a
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 +59 -36
- package/dist/headless-events.d.ts +18 -0
- package/dist/headless-events.js +36 -0
- package/dist/headless-query.js +1 -1
- package/dist/headless-types.d.ts +28 -0
- package/dist/headless-types.js +7 -0
- package/dist/headless.d.ts +8 -3
- package/dist/headless.js +47 -16
- package/dist/help-text.js +16 -5
- package/dist/onboarding.js +5 -4
- package/dist/remote-questions-config.js +1 -1
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +29 -17
- package/dist/resources/extensions/async-jobs/job-manager.js +4 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +18 -19
- package/dist/resources/extensions/get-secrets-from-user.js +7 -0
- package/dist/resources/extensions/gsd/auto/phases.js +34 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +23 -1
- package/dist/resources/extensions/gsd/auto-start.js +2 -0
- package/dist/resources/extensions/gsd/auto-timers.js +24 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +25 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +91 -14
- package/dist/resources/extensions/gsd/auto.js +30 -4
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -70
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +12 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +1 -1
- package/dist/resources/extensions/gsd/claude-import.js +60 -9
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +69 -6
- package/dist/resources/extensions/gsd/commands-config.js +10 -5
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +4 -4
- package/dist/resources/extensions/gsd/detection.js +6 -6
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +5 -5
- package/dist/resources/extensions/gsd/error-classifier.js +105 -0
- package/dist/resources/extensions/gsd/git-service.js +4 -3
- package/dist/resources/extensions/gsd/gitignore.js +7 -7
- package/dist/resources/extensions/gsd/gsd-db.js +298 -45
- package/dist/resources/extensions/gsd/guided-flow.js +4 -3
- package/dist/resources/extensions/gsd/init-wizard.js +2 -2
- package/dist/resources/extensions/gsd/key-manager.js +7 -16
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -4
- package/dist/resources/extensions/gsd/memory-store.js +28 -13
- package/dist/resources/extensions/gsd/milestone-actions.js +19 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +18 -2
- package/dist/resources/extensions/gsd/preferences-models.js +1 -13
- package/dist/resources/extensions/gsd/preferences-types.js +1 -1
- package/dist/resources/extensions/gsd/preferences.js +13 -13
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -44
- package/dist/resources/extensions/gsd/rule-registry.js +1 -1
- package/dist/resources/extensions/gsd/service-tier.js +13 -2
- package/dist/resources/extensions/gsd/state.js +38 -30
- package/dist/resources/extensions/gsd/status-guards.js +12 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +7 -13
- package/dist/resources/extensions/gsd/tools/complete-slice.js +7 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -21
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +28 -29
- package/dist/resources/extensions/gsd/tools/plan-slice.js +27 -26
- package/dist/resources/extensions/gsd/tools/plan-task.js +23 -23
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +50 -41
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +4 -3
- package/dist/resources/extensions/gsd/tools/reopen-task.js +5 -4
- package/dist/resources/extensions/gsd/tools/replan-slice.js +51 -41
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +23 -16
- package/dist/resources/extensions/gsd/validation.js +21 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +0 -1
- package/dist/resources/extensions/remote-questions/config.js +1 -1
- package/dist/resources/extensions/remote-questions/remote-command.js +1 -1
- package/dist/resources/extensions/search-the-web/native-search.js +1 -1
- package/dist/resources/extensions/search-the-web/provider.js +1 -1
- package/dist/resources/extensions/shared/rtk.js +14 -4
- package/dist/rtk.js +3 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_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_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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/2229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- 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 +2 -2
- 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/static/chunks/4024.87fd909ae0110f50.js +9 -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/{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/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-cfc9a116e6450a6b.js → webpack-bca0e732db0dcec3.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/wizard.js +4 -1
- package/package.json +2 -2
- package/packages/mcp-server/README.md +202 -0
- package/packages/mcp-server/package.json +36 -0
- package/packages/mcp-server/src/cli.ts +68 -0
- package/packages/mcp-server/src/index.ts +14 -0
- package/packages/mcp-server/src/mcp-server.test.ts +628 -0
- package/packages/mcp-server/src/server.ts +278 -0
- package/packages/mcp-server/src/session-manager.ts +328 -0
- package/packages/mcp-server/src/types.ts +107 -0
- package/packages/mcp-server/tsconfig.json +24 -0
- package/packages/pi-ai/dist/models.d.ts +14 -3
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +53 -10
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +102 -1
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +30 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/models.test.ts +114 -1
- package/packages/pi-ai/src/models.ts +70 -13
- package/packages/pi-ai/src/types.ts +31 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts +2 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +3 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +5 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +9 -4
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +83 -0
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +5 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +5 -3
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +28 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +49 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +114 -6
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js +831 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-protocol-v2.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +66 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +0 -1
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +4 -0
- package/packages/pi-coding-agent/src/core/bash-executor.ts +5 -1
- package/packages/pi-coding-agent/src/core/model-registry.ts +10 -3
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +101 -0
- package/packages/pi-coding-agent/src/core/tools/bash.ts +5 -1
- package/packages/pi-coding-agent/src/index.ts +3 -0
- package/packages/pi-coding-agent/src/main.ts +5 -3
- package/packages/pi-coding-agent/src/modes/index.ts +8 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +54 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +124 -6
- package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +61 -4
- package/packages/pi-coding-agent/src/utils/shell.ts +0 -1
- package/packages/rpc-client/package.json +20 -0
- package/pkg/package.json +1 -1
- package/scripts/ensure-workspace-builds.cjs +36 -8
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +22 -11
- package/src/resources/extensions/async-jobs/job-manager.ts +4 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +19 -20
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +21 -0
- package/src/resources/extensions/get-secrets-from-user.ts +8 -0
- package/src/resources/extensions/gsd/auto/phases.ts +44 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +25 -1
- package/src/resources/extensions/gsd/auto-start.ts +2 -0
- package/src/resources/extensions/gsd/auto-timers.ts +25 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +30 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +94 -14
- package/src/resources/extensions/gsd/auto.ts +31 -4
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +118 -73
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +11 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1 -1
- package/src/resources/extensions/gsd/claude-import.ts +58 -9
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +73 -6
- package/src/resources/extensions/gsd/commands-config.ts +11 -5
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -4
- package/src/resources/extensions/gsd/detection.ts +6 -6
- package/src/resources/extensions/gsd/docs/preferences-reference.md +5 -5
- package/src/resources/extensions/gsd/error-classifier.ts +139 -0
- package/src/resources/extensions/gsd/git-service.ts +4 -3
- package/src/resources/extensions/gsd/gitignore.ts +7 -7
- package/src/resources/extensions/gsd/gsd-db.ts +355 -63
- package/src/resources/extensions/gsd/guided-flow.ts +4 -3
- package/src/resources/extensions/gsd/init-wizard.ts +2 -2
- package/src/resources/extensions/gsd/key-manager.ts +7 -16
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -4
- package/src/resources/extensions/gsd/memory-store.ts +29 -18
- package/src/resources/extensions/gsd/milestone-actions.ts +17 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +23 -1
- package/src/resources/extensions/gsd/preferences-models.ts +1 -13
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/preferences.ts +12 -13
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -57
- package/src/resources/extensions/gsd/rule-registry.ts +1 -1
- package/src/resources/extensions/gsd/service-tier.ts +14 -2
- package/src/resources/extensions/gsd/state.ts +39 -30
- package/src/resources/extensions/gsd/status-guards.ts +13 -0
- package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-stale-lock-self-kill.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +35 -7
- package/src/resources/extensions/gsd/tests/detection.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +65 -31
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +277 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +77 -70
- package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +42 -31
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/validation.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +81 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +130 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -17
- package/src/resources/extensions/gsd/tools/complete-slice.ts +7 -24
- package/src/resources/extensions/gsd/tools/complete-task.ts +13 -25
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +30 -32
- package/src/resources/extensions/gsd/tools/plan-slice.ts +30 -30
- package/src/resources/extensions/gsd/tools/plan-task.ts +26 -26
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +57 -46
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +4 -3
- package/src/resources/extensions/gsd/tools/reopen-task.ts +5 -4
- package/src/resources/extensions/gsd/tools/replan-slice.ts +55 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +26 -20
- package/src/resources/extensions/gsd/validation.ts +23 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
- package/src/resources/extensions/remote-questions/config.ts +1 -1
- package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/src/resources/extensions/search-the-web/native-search.ts +1 -1
- package/src/resources/extensions/search-the-web/provider.ts +1 -1
- package/src/resources/extensions/shared/rtk.ts +22 -4
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-fbecd1237e2d6d1f.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/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
- /package/dist/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +0 -0
- /package/dist/web/standalone/.next/static/{vkr67v-utm1dgZnbrBWQh → zpvUPKoW5jRAMB_fWHlPi}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{vkr67v-utm1dgZnbrBWQh → zpvUPKoW5jRAMB_fWHlPi}/_ssgManifest.js +0 -0
- /package/src/resources/extensions/gsd/templates/{preferences.md → PREFERENCES.md} +0 -0
|
@@ -1,14 +1,13 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
1
2
|
import { clearParseCache } from "../files.js";
|
|
3
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
4
|
+
import { isNonEmptyString } from "../validation.js";
|
|
2
5
|
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertSlice, updateSliceFields, insertAssessment, deleteSlice, } from "../gsd-db.js";
|
|
3
6
|
import { invalidateStateCache } from "../state.js";
|
|
4
7
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
5
8
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
6
9
|
import { writeManifest } from "../workflow-manifest.js";
|
|
7
10
|
import { appendEvent } from "../workflow-events.js";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
function isNonEmptyString(value) {
|
|
10
|
-
return typeof value === "string" && value.trim().length > 0;
|
|
11
|
-
}
|
|
12
11
|
function validateParams(params) {
|
|
13
12
|
if (!isNonEmptyString(params?.milestoneId))
|
|
14
13
|
throw new Error("milestoneId is required");
|
|
@@ -61,48 +60,55 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
61
60
|
catch (err) {
|
|
62
61
|
return { error: `validation failed: ${err.message}` };
|
|
63
62
|
}
|
|
64
|
-
// ── Verify milestone exists and is active ────────────────────────
|
|
65
|
-
const milestone = getMilestone(params.milestoneId);
|
|
66
|
-
if (!milestone) {
|
|
67
|
-
return { error: `milestone not found: ${params.milestoneId}` };
|
|
68
|
-
}
|
|
69
|
-
if (milestone.status === "complete" || milestone.status === "done") {
|
|
70
|
-
return { error: `cannot reassess a closed milestone: ${params.milestoneId} (status: ${milestone.status})` };
|
|
71
|
-
}
|
|
72
|
-
// ── Verify completedSliceId is actually complete ──────────────────
|
|
73
|
-
const completedSlice = getSlice(params.milestoneId, params.completedSliceId);
|
|
74
|
-
if (!completedSlice) {
|
|
75
|
-
return { error: `completedSliceId not found: ${params.milestoneId}/${params.completedSliceId}` };
|
|
76
|
-
}
|
|
77
|
-
if (completedSlice.status !== "complete" && completedSlice.status !== "done") {
|
|
78
|
-
return { error: `completedSliceId ${params.completedSliceId} is not complete (status: ${completedSlice.status}) — reassess can only be called after a slice finishes` };
|
|
79
|
-
}
|
|
80
|
-
// ── Structural enforcement ────────────────────────────────────────
|
|
81
|
-
const existingSlices = getMilestoneSlices(params.milestoneId);
|
|
82
|
-
const completedSliceIds = new Set();
|
|
83
|
-
for (const slice of existingSlices) {
|
|
84
|
-
if (slice.status === "complete" || slice.status === "done") {
|
|
85
|
-
completedSliceIds.add(slice.id);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// Reject modifications to completed slices
|
|
89
|
-
for (const modifiedSlice of params.sliceChanges.modified) {
|
|
90
|
-
if (completedSliceIds.has(modifiedSlice.sliceId)) {
|
|
91
|
-
return { error: `cannot modify completed slice ${modifiedSlice.sliceId}` };
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Reject removal of completed slices
|
|
95
|
-
for (const removedId of params.sliceChanges.removed) {
|
|
96
|
-
if (completedSliceIds.has(removedId)) {
|
|
97
|
-
return { error: `cannot remove completed slice ${removedId}` };
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
63
|
// ── Compute assessment artifact path ──────────────────────────────
|
|
101
64
|
// Assessment lives in the completed slice's directory
|
|
102
65
|
const assessmentRelPath = join(".gsd", "milestones", params.milestoneId, "slices", params.completedSliceId, `${params.completedSliceId}-ASSESSMENT.md`);
|
|
103
|
-
// ──
|
|
66
|
+
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
67
|
+
// Guards must be inside the transaction so the state they check cannot
|
|
68
|
+
// change between the read and the write (#2723).
|
|
69
|
+
let guardError = null;
|
|
104
70
|
try {
|
|
105
71
|
transaction(() => {
|
|
72
|
+
// Verify milestone exists and is active
|
|
73
|
+
const milestone = getMilestone(params.milestoneId);
|
|
74
|
+
if (!milestone) {
|
|
75
|
+
guardError = `milestone not found: ${params.milestoneId}`;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (isClosedStatus(milestone.status)) {
|
|
79
|
+
guardError = `cannot reassess a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Verify completedSliceId is actually complete
|
|
83
|
+
const completedSlice = getSlice(params.milestoneId, params.completedSliceId);
|
|
84
|
+
if (!completedSlice) {
|
|
85
|
+
guardError = `completedSliceId not found: ${params.milestoneId}/${params.completedSliceId}`;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!isClosedStatus(completedSlice.status)) {
|
|
89
|
+
guardError = `completedSliceId ${params.completedSliceId} is not complete (status: ${completedSlice.status}) — reassess can only be called after a slice finishes`;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Structural enforcement — reject modifications/removal of completed slices
|
|
93
|
+
const existingSlices = getMilestoneSlices(params.milestoneId);
|
|
94
|
+
const completedSliceIds = new Set();
|
|
95
|
+
for (const slice of existingSlices) {
|
|
96
|
+
if (isClosedStatus(slice.status)) {
|
|
97
|
+
completedSliceIds.add(slice.id);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const modifiedSlice of params.sliceChanges.modified) {
|
|
101
|
+
if (completedSliceIds.has(modifiedSlice.sliceId)) {
|
|
102
|
+
guardError = `cannot modify completed slice ${modifiedSlice.sliceId}`;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const removedId of params.sliceChanges.removed) {
|
|
107
|
+
if (completedSliceIds.has(removedId)) {
|
|
108
|
+
guardError = `cannot remove completed slice ${removedId}`;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
106
112
|
// Record assessment
|
|
107
113
|
insertAssessment({
|
|
108
114
|
path: assessmentRelPath,
|
|
@@ -142,6 +148,9 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
142
148
|
catch (err) {
|
|
143
149
|
return { error: `db write failed: ${err.message}` };
|
|
144
150
|
}
|
|
151
|
+
if (guardError) {
|
|
152
|
+
return { error: guardError };
|
|
153
|
+
}
|
|
145
154
|
// ── Render artifacts ──────────────────────────────────────────────
|
|
146
155
|
try {
|
|
147
156
|
const roadmapResult = await renderRoadmapFromDb(basePath, params.milestoneId);
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
12
12
|
import { getMilestone, getSlice, getSliceTasks, updateSliceStatus, updateTaskStatus, transaction, } from "../gsd-db.js";
|
|
13
13
|
import { invalidateStateCache } from "../state.js";
|
|
14
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
14
15
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
15
16
|
import { writeManifest } from "../workflow-manifest.js";
|
|
16
17
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -31,8 +32,8 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
31
32
|
guardError = `milestone not found: ${params.milestoneId}`;
|
|
32
33
|
return;
|
|
33
34
|
}
|
|
34
|
-
if (milestone.status
|
|
35
|
-
guardError = `cannot reopen slice
|
|
35
|
+
if (isClosedStatus(milestone.status)) {
|
|
36
|
+
guardError = `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
39
|
const slice = getSlice(params.milestoneId, params.sliceId);
|
|
@@ -40,7 +41,7 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
40
41
|
guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
|
-
if (slice.status
|
|
44
|
+
if (!isClosedStatus(slice.status)) {
|
|
44
45
|
guardError = `slice ${params.sliceId} is not complete (status: ${slice.status}) — nothing to reopen`;
|
|
45
46
|
return;
|
|
46
47
|
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
11
11
|
import { getMilestone, getSlice, getTask, updateTaskStatus, transaction, } from "../gsd-db.js";
|
|
12
12
|
import { invalidateStateCache } from "../state.js";
|
|
13
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
13
14
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
14
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
15
16
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -32,7 +33,7 @@ export async function handleReopenTask(params, basePath) {
|
|
|
32
33
|
guardError = `milestone not found: ${params.milestoneId}`;
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
|
-
if (milestone.status
|
|
36
|
+
if (isClosedStatus(milestone.status)) {
|
|
36
37
|
guardError = `cannot reopen task in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
37
38
|
return;
|
|
38
39
|
}
|
|
@@ -41,8 +42,8 @@ export async function handleReopenTask(params, basePath) {
|
|
|
41
42
|
guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
|
-
if (slice.status
|
|
45
|
-
guardError = `cannot reopen task
|
|
45
|
+
if (isClosedStatus(slice.status)) {
|
|
46
|
+
guardError = `cannot reopen task in a closed slice: ${params.sliceId} (status: ${slice.status}) — use gsd_slice_reopen first`;
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
49
|
const task = getTask(params.milestoneId, params.sliceId, params.taskId);
|
|
@@ -50,7 +51,7 @@ export async function handleReopenTask(params, basePath) {
|
|
|
50
51
|
guardError = `task not found: ${params.milestoneId}/${params.sliceId}/${params.taskId}`;
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
|
-
if (task.status
|
|
54
|
+
if (!isClosedStatus(task.status)) {
|
|
54
55
|
guardError = `task ${params.taskId} is not complete (status: ${task.status}) — nothing to reopen`;
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { clearParseCache } from "../files.js";
|
|
2
2
|
import { transaction, getSlice, getSliceTasks, getTask, insertTask, upsertTaskPlanning, insertReplanHistory, deleteTask, } from "../gsd-db.js";
|
|
3
3
|
import { invalidateStateCache } from "../state.js";
|
|
4
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
5
|
+
import { isNonEmptyString } from "../validation.js";
|
|
4
6
|
import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
|
|
5
7
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
6
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
7
9
|
import { appendEvent } from "../workflow-events.js";
|
|
8
|
-
function isNonEmptyString(value) {
|
|
9
|
-
return typeof value === "string" && value.trim().length > 0;
|
|
10
|
-
}
|
|
11
10
|
function validateParams(params) {
|
|
12
11
|
if (!isNonEmptyString(params?.milestoneId))
|
|
13
12
|
throw new Error("milestoneId is required");
|
|
@@ -46,46 +45,54 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
46
45
|
catch (err) {
|
|
47
46
|
return { error: `validation failed: ${err.message}` };
|
|
48
47
|
}
|
|
49
|
-
// ──
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (parentSlice.status === "complete" || parentSlice.status === "done") {
|
|
55
|
-
return { error: `cannot replan a closed slice: ${params.sliceId} (status: ${parentSlice.status})` };
|
|
56
|
-
}
|
|
57
|
-
// ── Verify blocker task exists and is complete ────────────────────
|
|
58
|
-
const blockerTask = getTask(params.milestoneId, params.sliceId, params.blockerTaskId);
|
|
59
|
-
if (!blockerTask) {
|
|
60
|
-
return { error: `blockerTaskId not found: ${params.milestoneId}/${params.sliceId}/${params.blockerTaskId}` };
|
|
61
|
-
}
|
|
62
|
-
if (blockerTask.status !== "complete" && blockerTask.status !== "done") {
|
|
63
|
-
return { error: `blockerTaskId ${params.blockerTaskId} is not complete (status: ${blockerTask.status}) — the blocker task must be finished before a replan is triggered` };
|
|
64
|
-
}
|
|
65
|
-
// ── Structural enforcement ────────────────────────────────────────
|
|
66
|
-
const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
67
|
-
const completedTaskIds = new Set();
|
|
68
|
-
for (const task of existingTasks) {
|
|
69
|
-
if (task.status === "complete" || task.status === "done") {
|
|
70
|
-
completedTaskIds.add(task.id);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// Reject updates to completed tasks
|
|
74
|
-
for (const updatedTask of params.updatedTasks) {
|
|
75
|
-
if (completedTaskIds.has(updatedTask.taskId)) {
|
|
76
|
-
return { error: `cannot modify completed task ${updatedTask.taskId}` };
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Reject removal of completed tasks
|
|
80
|
-
for (const removedId of params.removedTaskIds) {
|
|
81
|
-
if (completedTaskIds.has(removedId)) {
|
|
82
|
-
return { error: `cannot remove completed task ${removedId}` };
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// ── Transaction: DB mutations ─────────────────────────────────────
|
|
86
|
-
const existingTaskIds = new Set(existingTasks.map((t) => t.id));
|
|
48
|
+
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
49
|
+
// Guards must be inside the transaction so the state they check cannot
|
|
50
|
+
// change between the read and the write (#2723).
|
|
51
|
+
let guardError = null;
|
|
52
|
+
let existingTaskIds = new Set();
|
|
87
53
|
try {
|
|
88
54
|
transaction(() => {
|
|
55
|
+
// Verify parent slice exists and is not closed
|
|
56
|
+
const parentSlice = getSlice(params.milestoneId, params.sliceId);
|
|
57
|
+
if (!parentSlice) {
|
|
58
|
+
guardError = `missing parent slice: ${params.milestoneId}/${params.sliceId}`;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (isClosedStatus(parentSlice.status)) {
|
|
62
|
+
guardError = `cannot replan a closed slice: ${params.sliceId} (status: ${parentSlice.status})`;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Verify blocker task exists and is complete
|
|
66
|
+
const blockerTask = getTask(params.milestoneId, params.sliceId, params.blockerTaskId);
|
|
67
|
+
if (!blockerTask) {
|
|
68
|
+
guardError = `blockerTaskId not found: ${params.milestoneId}/${params.sliceId}/${params.blockerTaskId}`;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!isClosedStatus(blockerTask.status)) {
|
|
72
|
+
guardError = `blockerTaskId ${params.blockerTaskId} is not complete (status: ${blockerTask.status}) — the blocker task must be finished before a replan is triggered`;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Structural enforcement — reject modifications/removal of completed tasks
|
|
76
|
+
const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
77
|
+
const completedTaskIds = new Set();
|
|
78
|
+
for (const task of existingTasks) {
|
|
79
|
+
if (isClosedStatus(task.status)) {
|
|
80
|
+
completedTaskIds.add(task.id);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (const updatedTask of params.updatedTasks) {
|
|
84
|
+
if (completedTaskIds.has(updatedTask.taskId)) {
|
|
85
|
+
guardError = `cannot modify completed task ${updatedTask.taskId}`;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const removedId of params.removedTaskIds) {
|
|
90
|
+
if (completedTaskIds.has(removedId)) {
|
|
91
|
+
guardError = `cannot remove completed task ${removedId}`;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
existingTaskIds = new Set(existingTasks.map((t) => t.id));
|
|
89
96
|
// Record replan history
|
|
90
97
|
insertReplanHistory({
|
|
91
98
|
milestoneId: params.milestoneId,
|
|
@@ -138,6 +145,9 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
138
145
|
catch (err) {
|
|
139
146
|
return { error: `db write failed: ${err.message}` };
|
|
140
147
|
}
|
|
148
|
+
if (guardError) {
|
|
149
|
+
return { error: guardError };
|
|
150
|
+
}
|
|
141
151
|
// ── Render artifacts ──────────────────────────────────────────────
|
|
142
152
|
try {
|
|
143
153
|
const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* renders VALIDATION.md to disk, and invalidates caches.
|
|
6
6
|
*/
|
|
7
7
|
import { join } from "node:path";
|
|
8
|
-
import { transaction,
|
|
8
|
+
import { transaction, insertAssessment, deleteAssessmentByScope, } from "../gsd-db.js";
|
|
9
9
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
10
10
|
import { saveFile, clearParseCache } from "../files.js";
|
|
11
11
|
import { invalidateStateCache } from "../state.js";
|
|
@@ -45,7 +45,7 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
45
45
|
if (!isValidMilestoneVerdict(params.verdict)) {
|
|
46
46
|
return { error: `verdict must be one of: ${VALIDATION_VERDICTS.join(", ")}` };
|
|
47
47
|
}
|
|
48
|
-
// ──
|
|
48
|
+
// ── Resolve paths and render markdown ────────────────────────────────
|
|
49
49
|
const validationMd = renderValidationMarkdown(params);
|
|
50
50
|
let validationPath;
|
|
51
51
|
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
@@ -57,26 +57,33 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
57
57
|
const manualDir = join(gsdDir, "milestones", params.milestoneId);
|
|
58
58
|
validationPath = join(manualDir, `${params.milestoneId}-VALIDATION.md`);
|
|
59
59
|
}
|
|
60
|
+
// ── DB write first — matches complete-task/complete-slice pattern ───
|
|
61
|
+
// Write DB before disk so a crash between the two leaves a recoverable
|
|
62
|
+
// state: the DB row exists but the file is missing, which projection
|
|
63
|
+
// rendering can regenerate. The inverse (file exists, no DB row) is
|
|
64
|
+
// harder to detect and recover from (#2725).
|
|
65
|
+
const validatedAt = new Date().toISOString();
|
|
66
|
+
transaction(() => {
|
|
67
|
+
insertAssessment({
|
|
68
|
+
path: validationPath,
|
|
69
|
+
milestoneId: params.milestoneId,
|
|
70
|
+
sliceId: null,
|
|
71
|
+
taskId: null,
|
|
72
|
+
status: params.verdict,
|
|
73
|
+
scope: 'milestone-validation',
|
|
74
|
+
fullContent: validationMd,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
78
|
+
// If disk render fails, roll back the DB row so state stays consistent.
|
|
60
79
|
try {
|
|
61
80
|
await saveFile(validationPath, validationMd);
|
|
62
81
|
}
|
|
63
82
|
catch (renderErr) {
|
|
64
|
-
process.stderr.write(`gsd-db: validate_milestone — disk render failed: ${renderErr.message}\n`);
|
|
83
|
+
process.stderr.write(`gsd-db: validate_milestone — disk render failed, rolling back DB row: ${renderErr.message}\n`);
|
|
84
|
+
deleteAssessmentByScope(params.milestoneId, 'milestone-validation');
|
|
65
85
|
return { error: `disk render failed: ${renderErr.message}` };
|
|
66
86
|
}
|
|
67
|
-
// ── DB write — store in assessments table ──────────────────────────────
|
|
68
|
-
const validatedAt = new Date().toISOString();
|
|
69
|
-
transaction(() => {
|
|
70
|
-
const adapter = _getAdapter();
|
|
71
|
-
adapter.prepare(`INSERT OR REPLACE INTO assessments (path, milestone_id, slice_id, task_id, status, scope, full_content, created_at)
|
|
72
|
-
VALUES (:path, :mid, NULL, NULL, :verdict, 'milestone-validation', :content, :created_at)`).run({
|
|
73
|
-
":path": validationPath,
|
|
74
|
-
":mid": params.milestoneId,
|
|
75
|
-
":verdict": params.verdict,
|
|
76
|
-
":content": validationMd,
|
|
77
|
-
":created_at": validatedAt,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
87
|
invalidateStateCache();
|
|
81
88
|
clearPathCache();
|
|
82
89
|
clearParseCache();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared input-validation primitives for GSD tool handlers.
|
|
3
|
+
*/
|
|
4
|
+
/** Type guard: value is a string with at least one non-whitespace character. */
|
|
5
|
+
export function isNonEmptyString(value) {
|
|
6
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validate that `value` is an array of non-empty strings.
|
|
10
|
+
* Throws with a message referencing `field` on failure.
|
|
11
|
+
* Returns the validated array (narrowed to string[]).
|
|
12
|
+
*/
|
|
13
|
+
export function validateStringArray(value, field) {
|
|
14
|
+
if (!Array.isArray(value)) {
|
|
15
|
+
throw new Error(`${field} must be an array`);
|
|
16
|
+
}
|
|
17
|
+
if (value.some((item) => !isNonEmptyString(item))) {
|
|
18
|
+
throw new Error(`${field} must contain only non-empty strings`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
@@ -158,7 +158,6 @@ export function readAuditLog(basePath) {
|
|
|
158
158
|
*/
|
|
159
159
|
export function _resetLogs() {
|
|
160
160
|
_buffer = [];
|
|
161
|
-
_auditBasePath = null;
|
|
162
161
|
}
|
|
163
162
|
// ─── Internal ───────────────────────────────────────────────────────────
|
|
164
163
|
function _push(severity, component, message, context) {
|
|
@@ -43,7 +43,7 @@ function hydrateRemoteTokensFromAuth() {
|
|
|
43
43
|
for (const [providerId, envVar] of needed) {
|
|
44
44
|
try {
|
|
45
45
|
const creds = auth.getCredentialsForProvider(providerId);
|
|
46
|
-
const apiKeyCred = creds.find((c) => c.type === "api_key");
|
|
46
|
+
const apiKeyCred = creds.find((c) => c.type === "api_key" && !!c.key);
|
|
47
47
|
if (apiKeyCred?.key) {
|
|
48
48
|
process.env[envVar] = apiKeyCred.key;
|
|
49
49
|
}
|
|
@@ -301,7 +301,7 @@ function saveProviderToken(provider, token) {
|
|
|
301
301
|
}
|
|
302
302
|
function removeProviderToken(provider) {
|
|
303
303
|
const auth = getAuthStorage();
|
|
304
|
-
auth.
|
|
304
|
+
auth.remove(provider);
|
|
305
305
|
}
|
|
306
306
|
export function saveRemoteQuestionsConfig(channel, channelId) {
|
|
307
307
|
const prefsPath = getGlobalGSDPreferencesPath();
|
|
@@ -22,7 +22,7 @@ const THINKING_TYPES = new Set(["thinking", "redacted_thinking"]);
|
|
|
22
22
|
export const MAX_NATIVE_SEARCHES_PER_SESSION = 15;
|
|
23
23
|
/** When true, skip native web search injection and keep Brave/custom tools active on Anthropic. */
|
|
24
24
|
export function preferBraveSearch() {
|
|
25
|
-
//
|
|
25
|
+
// PREFERENCES.md takes priority over env var
|
|
26
26
|
const prefsPref = resolveSearchProviderFromPreferences();
|
|
27
27
|
if (prefsPref === "brave" || prefsPref === "tavily" || prefsPref === "ollama")
|
|
28
28
|
return true;
|
|
@@ -91,7 +91,7 @@ export function resolveSearchProvider(overridePreference) {
|
|
|
91
91
|
pref = overridePreference;
|
|
92
92
|
}
|
|
93
93
|
else {
|
|
94
|
-
//
|
|
94
|
+
// PREFERENCES.md takes priority over auth.json
|
|
95
95
|
const mdPref = resolveSearchProviderFromPreferences();
|
|
96
96
|
if (mdPref && mdPref !== 'auto' && mdPref !== 'native') {
|
|
97
97
|
pref = mdPref;
|
|
@@ -4,6 +4,7 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import { delimiter, join } from "node:path";
|
|
5
5
|
const GSD_RTK_PATH_ENV = "GSD_RTK_PATH";
|
|
6
6
|
const GSD_RTK_DISABLED_ENV = "GSD_RTK_DISABLED";
|
|
7
|
+
const GSD_RTK_REWRITE_TIMEOUT_MS_ENV = "GSD_RTK_REWRITE_TIMEOUT_MS";
|
|
7
8
|
const RTK_TELEMETRY_DISABLED_ENV = "RTK_TELEMETRY_DISABLED";
|
|
8
9
|
const RTK_REWRITE_TIMEOUT_MS = 5_000;
|
|
9
10
|
function isTruthy(value) {
|
|
@@ -12,6 +13,13 @@ function isTruthy(value) {
|
|
|
12
13
|
const normalized = value.trim().toLowerCase();
|
|
13
14
|
return normalized === "1" || normalized === "true" || normalized === "yes";
|
|
14
15
|
}
|
|
16
|
+
function getRewriteTimeoutMs(env = process.env) {
|
|
17
|
+
const configured = Number.parseInt(env[GSD_RTK_REWRITE_TIMEOUT_MS_ENV] ?? "", 10);
|
|
18
|
+
if (Number.isFinite(configured) && configured > 0) {
|
|
19
|
+
return configured;
|
|
20
|
+
}
|
|
21
|
+
return RTK_REWRITE_TIMEOUT_MS;
|
|
22
|
+
}
|
|
15
23
|
export function isRtkEnabled(env = process.env) {
|
|
16
24
|
return !isTruthy(env[GSD_RTK_DISABLED_ENV]);
|
|
17
25
|
}
|
|
@@ -75,19 +83,21 @@ export function resolveRtkBinaryPath(options = {}) {
|
|
|
75
83
|
}
|
|
76
84
|
return resolveSystemRtkPath(options.pathValue ?? getPathValue(env), platform);
|
|
77
85
|
}
|
|
78
|
-
export function rewriteCommandWithRtk(command,
|
|
86
|
+
export function rewriteCommandWithRtk(command, options = {}) {
|
|
87
|
+
const env = options.env ?? process.env;
|
|
79
88
|
if (!command.trim())
|
|
80
89
|
return command;
|
|
81
90
|
if (!isRtkEnabled(env))
|
|
82
91
|
return command;
|
|
83
|
-
const binaryPath = resolveRtkBinaryPath({ env });
|
|
92
|
+
const binaryPath = options.binaryPath ?? resolveRtkBinaryPath({ env });
|
|
84
93
|
if (!binaryPath)
|
|
85
94
|
return command;
|
|
86
|
-
const
|
|
95
|
+
const run = options.spawnSyncImpl ?? spawnSync;
|
|
96
|
+
const result = run(binaryPath, ["rewrite", command], {
|
|
87
97
|
encoding: "utf-8",
|
|
88
98
|
env: buildRtkEnv(env),
|
|
89
99
|
stdio: ["ignore", "pipe", "ignore"],
|
|
90
|
-
timeout:
|
|
100
|
+
timeout: getRewriteTimeoutMs(env),
|
|
91
101
|
// .cmd/.bat wrappers (used by fake-rtk in tests) require shell:true on Windows
|
|
92
102
|
shell: /\.(cmd|bat)$/i.test(binaryPath),
|
|
93
103
|
});
|
package/dist/rtk.js
CHANGED
|
@@ -175,7 +175,9 @@ function resolveSystemRtkPath(pathValue, platform = process.platform) {
|
|
|
175
175
|
export function resolveRtkBinaryPath(options = {}) {
|
|
176
176
|
const env = options.env ?? process.env;
|
|
177
177
|
const platform = options.platform ?? process.platform;
|
|
178
|
-
|
|
178
|
+
if (options.binaryPath)
|
|
179
|
+
return options.binaryPath;
|
|
180
|
+
const explicitPath = env[GSD_RTK_PATH_ENV];
|
|
179
181
|
if (explicitPath && existsSync(explicitPath)) {
|
|
180
182
|
return explicitPath;
|
|
181
183
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
zpvUPKoW5jRAMB_fWHlPi
|
|
@@ -7,40 +7,40 @@
|
|
|
7
7
|
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
8
8
|
"/api/cleanup/route": "/api/cleanup",
|
|
9
9
|
"/api/dev-mode/route": "/api/dev-mode",
|
|
10
|
-
"/api/browse-directories/route": "/api/browse-directories",
|
|
11
10
|
"/api/doctor/route": "/api/doctor",
|
|
12
|
-
"/api/
|
|
11
|
+
"/api/browse-directories/route": "/api/browse-directories",
|
|
12
|
+
"/api/captures/route": "/api/captures",
|
|
13
13
|
"/api/export-data/route": "/api/export-data",
|
|
14
|
+
"/api/forensics/route": "/api/forensics",
|
|
14
15
|
"/api/git/route": "/api/git",
|
|
15
16
|
"/api/history/route": "/api/history",
|
|
16
17
|
"/api/hooks/route": "/api/hooks",
|
|
17
|
-
"/api/
|
|
18
|
-
"/api/experimental/route": "/api/experimental",
|
|
18
|
+
"/api/knowledge/route": "/api/knowledge",
|
|
19
19
|
"/api/inspect/route": "/api/inspect",
|
|
20
|
+
"/api/experimental/route": "/api/experimental",
|
|
20
21
|
"/api/live-state/route": "/api/live-state",
|
|
21
|
-
"/api/
|
|
22
|
+
"/api/recovery/route": "/api/recovery",
|
|
22
23
|
"/api/preferences/route": "/api/preferences",
|
|
23
24
|
"/api/onboarding/route": "/api/onboarding",
|
|
24
|
-
"/api/
|
|
25
|
+
"/api/projects/route": "/api/projects",
|
|
25
26
|
"/api/session/browser/route": "/api/session/browser",
|
|
26
27
|
"/api/session/command/route": "/api/session/command",
|
|
27
|
-
"/api/projects/route": "/api/projects",
|
|
28
28
|
"/api/session/events/route": "/api/session/events",
|
|
29
29
|
"/api/settings-data/route": "/api/settings-data",
|
|
30
|
-
"/api/shutdown/route": "/api/shutdown",
|
|
31
30
|
"/api/session/manage/route": "/api/session/manage",
|
|
31
|
+
"/api/shutdown/route": "/api/shutdown",
|
|
32
32
|
"/api/skill-health/route": "/api/skill-health",
|
|
33
|
-
"/api/files/route": "/api/files",
|
|
34
33
|
"/api/steer/route": "/api/steer",
|
|
35
34
|
"/api/terminal/input/route": "/api/terminal/input",
|
|
36
35
|
"/api/switch-root/route": "/api/switch-root",
|
|
36
|
+
"/api/files/route": "/api/files",
|
|
37
37
|
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
38
38
|
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
39
39
|
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
40
|
+
"/api/update/route": "/api/update",
|
|
40
41
|
"/api/terminal/upload/route": "/api/terminal/upload",
|
|
41
42
|
"/api/undo/route": "/api/undo",
|
|
42
|
-
"/api/visualizer/route": "/api/visualizer",
|
|
43
|
-
"/api/update/route": "/api/update",
|
|
44
43
|
"/api/remote-questions/route": "/api/remote-questions",
|
|
44
|
+
"/api/visualizer/route": "/api/visualizer",
|
|
45
45
|
"/page": "/"
|
|
46
46
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/zpvUPKoW5jRAMB_fWHlPi/_buildManifest.js",
|
|
8
|
+
"static/zpvUPKoW5jRAMB_fWHlPi/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
|
-
"static/chunks/webpack-
|
|
11
|
+
"static/chunks/webpack-bca0e732db0dcec3.js",
|
|
12
12
|
"static/chunks/4bd1b696-e5d7c65570c947b7.js",
|
|
13
13
|
"static/chunks/3794-337d1ca25ad99a89.js",
|
|
14
|
-
"static/chunks/main-app-
|
|
14
|
+
"static/chunks/main-app-fdab67f7802d7832.js"
|
|
15
15
|
],
|
|
16
16
|
"rootMainFilesTree": {},
|
|
17
17
|
"pages": {
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"dynamicRoutes": {},
|
|
79
79
|
"notFoundRoutes": [],
|
|
80
80
|
"preview": {
|
|
81
|
-
"previewModeId": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "567cc67a2ad86cde21a94dfc040dc7eb",
|
|
82
|
+
"previewModeSigningKey": "a0bce4a185bd8d7efe69f5863d47e2100c6feefb312d0a9aaa4e0b0c30d594fe",
|
|
83
|
+
"previewModeEncryptionKey": "1d2b3722994b5f5e35c394d3845587cacae1b7c89c2bc2875ff4d2dd21d8880d"
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"static/chunks/363642f4.f9053a63f1b97508.js",
|
|
7
7
|
"static/chunks/4986-c2fc8845ce785303.js",
|
|
8
8
|
"static/chunks/2008.817d0885545aaea9.js",
|
|
9
|
-
"static/chunks/4024.
|
|
9
|
+
"static/chunks/4024.87fd909ae0110f50.js"
|
|
10
10
|
]
|
|
11
11
|
},
|
|
12
12
|
"components/gsd/chat-mode.tsx -> react-markdown": {
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"transform": "lodash/{{member}}"
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
|
-
"outputFileTracingRoot": "/
|
|
103
|
+
"outputFileTracingRoot": "/__w/gsd-2/gsd-2",
|
|
104
104
|
"cacheComponents": false,
|
|
105
105
|
"cacheLife": {
|
|
106
106
|
"default": {
|
|
@@ -297,11 +297,11 @@
|
|
|
297
297
|
"node-pty"
|
|
298
298
|
],
|
|
299
299
|
"turbopack": {
|
|
300
|
-
"root": "/
|
|
300
|
+
"root": "/__w/gsd-2/gsd-2"
|
|
301
301
|
},
|
|
302
302
|
"distDirRoot": ".next"
|
|
303
303
|
},
|
|
304
|
-
"appDir": "/
|
|
304
|
+
"appDir": "/__w/gsd-2/gsd-2/web",
|
|
305
305
|
"relativeAppDir": "web",
|
|
306
306
|
"files": [
|
|
307
307
|
".next/routes-manifest.json",
|