@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.97ef11e3
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 +10 -8
- package/dist/cli.js +5 -1
- package/dist/headless-events.d.ts +2 -1
- package/dist/headless-events.js +11 -3
- package/dist/headless-milestone-readiness.d.ts +29 -0
- package/dist/headless-milestone-readiness.js +161 -0
- package/dist/headless.js +27 -3
- package/dist/print-mode-exit.d.ts +12 -0
- package/dist/print-mode-exit.js +14 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +18 -49
- package/dist/resources/extensions/browser-tools/capture.js +2 -77
- package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
- package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +29 -9
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +20 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
- package/dist/resources/extensions/gsd/command-feedback.js +16 -12
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +56 -18
- package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
- package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
- package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +262 -76
- package/dist/resources/extensions/gsd/guided-flow.js +40 -15
- package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
- package/dist/resources/extensions/gsd/md-importer.js +107 -20
- package/dist/resources/extensions/gsd/migrate/command.js +19 -162
- package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
- package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
- package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +11 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
- package/dist/resources/extensions/gsd/paths.js +70 -16
- package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
- package/dist/resources/extensions/gsd/preferences-types.js +5 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
- package/dist/resources/extensions/gsd/preferences.js +17 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +24 -1
- package/dist/resources/extensions/gsd/sync-lock.js +13 -7
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
- package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
- package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/unit-registry.js +4 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
- package/dist/resources/extensions/mac-tools/index.js +31 -9
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- 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/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 +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.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/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_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 +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_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 +7 -7
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- 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/package.json +0 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +31 -3
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +13 -10
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -1
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +5 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/cloud-config.test.js +51 -1
- package/packages/daemon/dist/cloud-config.test.js.map +1 -1
- package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
- package/packages/daemon/dist/local-tool-executor.js +2 -0
- package/packages/daemon/dist/local-tool-executor.js.map +1 -1
- package/packages/daemon/package.json +6 -6
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +9 -3
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts +5 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cli.js +266 -0
- package/packages/gsd-cloud/dist/cli.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.js +237 -0
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.js +37 -0
- package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
- package/packages/gsd-cloud/dist/config.d.ts +17 -0
- package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/config.js +146 -0
- package/packages/gsd-cloud/dist/config.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.js +128 -0
- package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
- package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.js +11 -0
- package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.js +29 -0
- package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
- package/packages/gsd-cloud/dist/index.d.ts +7 -0
- package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/index.js +8 -0
- package/packages/gsd-cloud/dist/index.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
- package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
- package/packages/gsd-cloud/dist/logger.d.ts +25 -0
- package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/logger.js +72 -0
- package/packages/gsd-cloud/dist/logger.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +272 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/types.d.ts +51 -0
- package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/types.js +9 -0
- package/packages/gsd-cloud/dist/types.js.map +1 -0
- package/packages/gsd-cloud/package.json +3 -3
- package/packages/mcp-server/README.md +15 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +64 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +136 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +124 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +25 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +18 -49
- package/src/resources/extensions/browser-tools/capture.ts +2 -86
- package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
- package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +31 -8
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +25 -8
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
- package/src/resources/extensions/gsd/command-feedback.ts +19 -12
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +58 -19
- package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
- package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
- package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +340 -85
- package/src/resources/extensions/gsd/guided-flow.ts +50 -14
- package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
- package/src/resources/extensions/gsd/md-importer.ts +114 -16
- package/src/resources/extensions/gsd/migrate/command.ts +21 -227
- package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
- package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
- package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
- package/src/resources/extensions/gsd/model-router.ts +12 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
- package/src/resources/extensions/gsd/paths.ts +77 -16
- package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
- package/src/resources/extensions/gsd/preferences.ts +25 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
- package/src/resources/extensions/gsd/stop-notice.ts +29 -1
- package/src/resources/extensions/gsd/sync-lock.ts +14 -6
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
- package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
- package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
- package/src/resources/extensions/gsd/types.ts +11 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/unit-registry.ts +4 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
- package/src/resources/extensions/mac-tools/index.ts +52 -9
- package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
|
@@ -11,6 +11,7 @@ import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
|
11
11
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
12
12
|
import { getLatestAssessmentByScope } from "./gsd-db.js";
|
|
13
13
|
import { checkpointWorkflowDatabase } from "./db-workspace.js";
|
|
14
|
+
import { formatVerdictRecordedNotice, formatVerdictRejectedNotice } from "./stop-notice.js";
|
|
14
15
|
import {
|
|
15
16
|
VALIDATION_VERDICTS,
|
|
16
17
|
extractVerdict,
|
|
@@ -165,17 +166,17 @@ export async function handleVerdict(
|
|
|
165
166
|
basePath: string,
|
|
166
167
|
): Promise<void> {
|
|
167
168
|
if (!rawArgs.trim()) {
|
|
168
|
-
ctx.ui.notify(USAGE, "warning");
|
|
169
|
+
ctx.ui.notify(formatVerdictRejectedNotice(USAGE), "warning");
|
|
169
170
|
return;
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
const parsed = parseArgs(rawArgs);
|
|
173
174
|
if ("error" in parsed) {
|
|
174
|
-
ctx.ui.notify(`${parsed.error}\n${USAGE}
|
|
175
|
+
ctx.ui.notify(formatVerdictRejectedNotice(`${parsed.error}\n${USAGE}`), "warning");
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
177
178
|
if (!parsed.verdict) {
|
|
178
|
-
ctx.ui.notify(USAGE, "warning");
|
|
179
|
+
ctx.ui.notify(formatVerdictRejectedNotice(USAGE), "warning");
|
|
179
180
|
return;
|
|
180
181
|
}
|
|
181
182
|
|
|
@@ -184,7 +185,7 @@ export async function handleVerdict(
|
|
|
184
185
|
const state = await deriveState(basePath);
|
|
185
186
|
if (!state.activeMilestone) {
|
|
186
187
|
ctx.ui.notify(
|
|
187
|
-
"No active milestone — pass --milestone Mxxx to target a specific milestone.",
|
|
188
|
+
formatVerdictRejectedNotice("No active milestone — pass --milestone Mxxx to target a specific milestone."),
|
|
188
189
|
"warning",
|
|
189
190
|
);
|
|
190
191
|
return;
|
|
@@ -195,7 +196,9 @@ export async function handleVerdict(
|
|
|
195
196
|
const existingValidation = await loadExistingValidation(basePath, milestoneId);
|
|
196
197
|
if (!existingValidation) {
|
|
197
198
|
ctx.ui.notify(
|
|
198
|
-
|
|
199
|
+
formatVerdictRejectedNotice(
|
|
200
|
+
`No milestone validation found for ${milestoneId}. Run /gsd auto to validate first, then retry /gsd verdict.`,
|
|
201
|
+
),
|
|
199
202
|
"warning",
|
|
200
203
|
);
|
|
201
204
|
return;
|
|
@@ -205,7 +208,7 @@ export async function handleVerdict(
|
|
|
205
208
|
|
|
206
209
|
if (parsed.verdict !== "pass" && !parsed.rationale) {
|
|
207
210
|
ctx.ui.notify(
|
|
208
|
-
`--rationale is required when overriding to ${parsed.verdict}
|
|
211
|
+
formatVerdictRejectedNotice(`--rationale is required when overriding to ${parsed.verdict}.`),
|
|
209
212
|
"warning",
|
|
210
213
|
);
|
|
211
214
|
return;
|
|
@@ -234,7 +237,7 @@ export async function handleVerdict(
|
|
|
234
237
|
if (result.isError) {
|
|
235
238
|
const msg =
|
|
236
239
|
result.content[0]?.type === "text" ? result.content[0].text : "Unknown error";
|
|
237
|
-
ctx.ui.notify(msg, "error");
|
|
240
|
+
ctx.ui.notify(formatVerdictRejectedNotice(msg), "error");
|
|
238
241
|
return;
|
|
239
242
|
}
|
|
240
243
|
|
|
@@ -244,12 +247,16 @@ export async function handleVerdict(
|
|
|
244
247
|
const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
|
|
245
248
|
if (effectiveVerdict !== parsed.verdict) {
|
|
246
249
|
ctx.ui.notify(
|
|
247
|
-
|
|
250
|
+
formatVerdictRecordedNotice(
|
|
251
|
+
`Milestone ${milestoneId} verdict requested: ${parsed.verdict}, effective: ${effectiveVerdict} (${existingValidation.source})`,
|
|
252
|
+
),
|
|
248
253
|
"warning",
|
|
249
254
|
);
|
|
250
255
|
} else {
|
|
251
256
|
ctx.ui.notify(
|
|
252
|
-
|
|
257
|
+
formatVerdictRecordedNotice(
|
|
258
|
+
`Milestone ${milestoneId} verdict: ${prevVerdict} -> ${effectiveVerdict} (${existingValidation.source})`,
|
|
259
|
+
),
|
|
253
260
|
"success",
|
|
254
261
|
);
|
|
255
262
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
// (drift to import). gsd-core is oblivious to this file and ignores it.
|
|
7
7
|
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
|
-
import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync, mkdirSync } from "node:fs";
|
|
10
|
-
import { dirname, join } from "node:path";
|
|
9
|
+
import { existsSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync, mkdirSync } from "node:fs";
|
|
10
|
+
import { dirname, join, isAbsolute, normalize, relative, resolve } from "node:path";
|
|
11
11
|
|
|
12
12
|
/** Current marker schema version. Bump on breaking format changes + migrate. */
|
|
13
13
|
export const COMPAT_MARKER_SCHEMA = 2;
|
|
@@ -34,8 +34,10 @@ export interface PlanningMarker {
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Per-file projection entry. `sha` is a normalized-content SHA-256; `entities`
|
|
37
|
-
* is the list of DB entity ids (milestone/slice/task) that the file projects
|
|
38
|
-
*
|
|
37
|
+
* is the list of DB entity ids (milestone/slice/task) that the file projects.
|
|
38
|
+
* External-edit repair derives milestone ids from this list so markdown status
|
|
39
|
+
* authority is limited to the drifted projection's milestone scope while the
|
|
40
|
+
* importer still walks the whole tree.
|
|
39
41
|
*/
|
|
40
42
|
export interface ProjectionEntry {
|
|
41
43
|
sha: string;
|
|
@@ -52,6 +54,13 @@ export interface CompatMarker {
|
|
|
52
54
|
piVersion: string;
|
|
53
55
|
}
|
|
54
56
|
|
|
57
|
+
export interface ReadCompatMarkerOptions {
|
|
58
|
+
/** Rewrite invalid-but-derivable marker keys back to safe root-relative keys. */
|
|
59
|
+
healInvalidKeys?: boolean;
|
|
60
|
+
/** Quarantine malformed/unsafe markers. Disable only for read-only previews. */
|
|
61
|
+
quarantineInvalid?: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
55
64
|
/** Marker returned when no marker exists yet (fresh project, first gsd-pi run). */
|
|
56
65
|
export const EMPTY_MARKER: CompatMarker = {
|
|
57
66
|
schema: COMPAT_MARKER_SCHEMA,
|
|
@@ -79,6 +88,37 @@ export function computeProjectionSha(content: string): string {
|
|
|
79
88
|
return createHash("sha256").update(normalizeForHash(content)).digest("hex").slice(0, 16);
|
|
80
89
|
}
|
|
81
90
|
|
|
91
|
+
function normalizeRealPath(p: string): string {
|
|
92
|
+
try {
|
|
93
|
+
return realpathSync.native(p);
|
|
94
|
+
} catch {
|
|
95
|
+
return resolve(p);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function rootRelativeKey(rootPath: string, absPath: string): string | null {
|
|
100
|
+
const root = normalizeRealPath(rootPath);
|
|
101
|
+
const abs = normalizeRealPath(absPath);
|
|
102
|
+
const rel = relative(root, abs);
|
|
103
|
+
if (!rel || rel === ".." || rel.startsWith(`..${sepForRelative(rel)}`) || isAbsolute(rel)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return rel.replace(/\\/g, "/");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function sepForRelative(rel: string): string {
|
|
110
|
+
return rel.includes("\\") ? "\\" : "/";
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function deriveCompatProjectionKey(absPath: string, roots: readonly string[]): string {
|
|
114
|
+
for (const root of roots) {
|
|
115
|
+
const key = rootRelativeKey(root, absPath);
|
|
116
|
+
if (key) return key;
|
|
117
|
+
}
|
|
118
|
+
const fallbackRoot = roots[roots.length - 1] ?? dirname(absPath);
|
|
119
|
+
return relative(fallbackRoot, absPath).replace(/\\/g, "/");
|
|
120
|
+
}
|
|
121
|
+
|
|
82
122
|
/**
|
|
83
123
|
* Read & validate the marker. A missing marker → EMPTY_MARKER (treat every
|
|
84
124
|
* projection as external on next reconcile). A malformed marker is quarantined
|
|
@@ -86,7 +126,12 @@ export function computeProjectionSha(content: string): string {
|
|
|
86
126
|
* EMPTY_MARKER. A schema-mismatch returns EMPTY_MARKER (forward-compat: refuse
|
|
87
127
|
* to act on a future format we don't understand).
|
|
88
128
|
*/
|
|
89
|
-
export function readCompatMarker(
|
|
129
|
+
export function readCompatMarker(
|
|
130
|
+
basePath: string,
|
|
131
|
+
options: ReadCompatMarkerOptions = {},
|
|
132
|
+
): CompatMarker {
|
|
133
|
+
const healInvalidKeys = options.healInvalidKeys ?? true;
|
|
134
|
+
const quarantineInvalid = options.quarantineInvalid ?? true;
|
|
90
135
|
const path = compatMarkerPath(basePath);
|
|
91
136
|
if (!existsSync(path)) return emptyMarker();
|
|
92
137
|
|
|
@@ -101,12 +146,16 @@ export function readCompatMarker(basePath: string): CompatMarker {
|
|
|
101
146
|
try {
|
|
102
147
|
parsed = JSON.parse(raw);
|
|
103
148
|
} catch {
|
|
104
|
-
quarantine(basePath, raw);
|
|
149
|
+
if (quarantineInvalid) quarantine(basePath, raw);
|
|
105
150
|
return emptyMarker();
|
|
106
151
|
}
|
|
107
152
|
|
|
153
|
+
if (healInvalidKeys && healMarkerProjectionKeys(basePath, parsed) && isValidMarker(parsed)) {
|
|
154
|
+
writeCompatMarker(basePath, parsed);
|
|
155
|
+
}
|
|
156
|
+
|
|
108
157
|
if (!isValidMarker(parsed)) {
|
|
109
|
-
quarantine(basePath, raw);
|
|
158
|
+
if (quarantineInvalid) quarantine(basePath, raw);
|
|
110
159
|
return emptyMarker();
|
|
111
160
|
}
|
|
112
161
|
// Promote older markers by defaulting absent fields. Schema 1 → 2 only adds
|
|
@@ -220,14 +269,76 @@ function isValidProjectionEntry(x: unknown): x is ProjectionEntry {
|
|
|
220
269
|
return true;
|
|
221
270
|
}
|
|
222
271
|
|
|
272
|
+
/**
|
|
273
|
+
* Projection-map keys are repo-relative paths under .gsd/ or .planning/.
|
|
274
|
+
* The marker is repo-controlled content, so a key must never escape its
|
|
275
|
+
* root: reject absolute paths, drive letters, backslashes, and any
|
|
276
|
+
* normalized form that starts with "..". Mirrors the write-side guard in
|
|
277
|
+
* db-writer.ts.
|
|
278
|
+
*/
|
|
279
|
+
function isSafeProjectionKey(key: string): boolean {
|
|
280
|
+
if (key.length === 0 || key.includes("\\") || key.includes("\0")) return false;
|
|
281
|
+
if (isAbsolute(key) || /^[A-Za-z]:/.test(key)) return false;
|
|
282
|
+
const norm = normalize(key);
|
|
283
|
+
return norm !== ".." && !norm.startsWith("../") && !isAbsolute(norm);
|
|
284
|
+
}
|
|
285
|
+
|
|
223
286
|
function isValidProjectionMap(x: unknown): boolean {
|
|
224
287
|
if (typeof x !== "object" || x === null) return false;
|
|
225
|
-
for (const v of Object.
|
|
288
|
+
for (const [k, v] of Object.entries(x as Record<string, unknown>)) {
|
|
289
|
+
if (!isSafeProjectionKey(k)) return false;
|
|
226
290
|
if (!isValidProjectionEntry(v)) return false;
|
|
227
291
|
}
|
|
228
292
|
return true;
|
|
229
293
|
}
|
|
230
294
|
|
|
295
|
+
function healMarkerProjectionKeys(basePath: string, marker: unknown): marker is CompatMarker {
|
|
296
|
+
if (typeof marker !== "object" || marker === null) return false;
|
|
297
|
+
const m = marker as Record<string, unknown>;
|
|
298
|
+
let changed = false;
|
|
299
|
+
|
|
300
|
+
if (typeof m.projections === "object" && m.projections !== null) {
|
|
301
|
+
changed = healProjectionMapKeys(basePath, ".gsd", m.projections as Record<string, ProjectionEntry>) || changed;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const planning = m.planning;
|
|
305
|
+
if (typeof planning === "object" && planning !== null) {
|
|
306
|
+
const p = planning as Record<string, unknown>;
|
|
307
|
+
if (typeof p.projections === "object" && p.projections !== null) {
|
|
308
|
+
changed = healProjectionMapKeys(basePath, ".planning", p.projections as Record<string, ProjectionEntry>) || changed;
|
|
309
|
+
}
|
|
310
|
+
if (typeof p.passthrough === "object" && p.passthrough !== null) {
|
|
311
|
+
changed = healProjectionMapKeys(basePath, ".planning", p.passthrough as Record<string, ProjectionEntry>) || changed;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return changed;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function healProjectionMapKeys(
|
|
319
|
+
basePath: string,
|
|
320
|
+
rootName: ".gsd" | ".planning",
|
|
321
|
+
map: Record<string, ProjectionEntry>,
|
|
322
|
+
): boolean {
|
|
323
|
+
let changed = false;
|
|
324
|
+
const root = join(basePath, rootName);
|
|
325
|
+
|
|
326
|
+
for (const key of Object.keys(map)) {
|
|
327
|
+
if (isSafeProjectionKey(key)) continue;
|
|
328
|
+
if (key.includes("\0") || isAbsolute(key) || /^[A-Za-z]:/.test(key)) continue;
|
|
329
|
+
const healedKey = rootRelativeKey(root, resolve(root, key));
|
|
330
|
+
if (!healedKey || !isSafeProjectionKey(healedKey)) continue;
|
|
331
|
+
|
|
332
|
+
if (!map[healedKey]) {
|
|
333
|
+
map[healedKey] = map[key]!;
|
|
334
|
+
}
|
|
335
|
+
delete map[key];
|
|
336
|
+
changed = true;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return changed;
|
|
340
|
+
}
|
|
341
|
+
|
|
231
342
|
function isValidPlanningMarker(x: unknown): x is PlanningMarker {
|
|
232
343
|
if (typeof x !== "object" || x === null) return false;
|
|
233
344
|
const p = x as Record<string, unknown>;
|
|
@@ -31,36 +31,37 @@ export const CACHE_MAX = 50;
|
|
|
31
31
|
* By scoping tools to this allowlist during discuss dispatches, the grammar
|
|
32
32
|
* sent to the provider stays well under provider limits.
|
|
33
33
|
*
|
|
34
|
-
* Included tools and why
|
|
34
|
+
* Included tools and why (canonical names only — aliases are no longer
|
|
35
|
+
* advertised to models by default, see plan 035):
|
|
35
36
|
* - gsd_summary_save: writes CONTEXT.md artifacts (all discuss prompts)
|
|
36
|
-
* - gsd_save_summary: alias for above
|
|
37
37
|
* - gsd_decision_save: records decisions (discuss.md output phase)
|
|
38
|
-
* - gsd_save_decision: alias for above
|
|
39
38
|
* - gsd_plan_milestone: writes roadmap (discuss.md single/multi milestone)
|
|
40
|
-
* - gsd_milestone_plan: alias for above
|
|
41
39
|
* - gsd_milestone_generate_id: generates milestone IDs (discuss.md multi-milestone)
|
|
42
|
-
* - gsd_generate_milestone_id: alias for above
|
|
43
40
|
* - gsd_requirement_save: creates requirements during discuss
|
|
44
|
-
* - gsd_save_requirement: alias for above
|
|
45
41
|
* - gsd_requirement_update: updates requirements during discuss
|
|
46
|
-
* - gsd_update_requirement: alias for above
|
|
47
42
|
*/
|
|
48
43
|
export const DISCUSS_TOOLS_ALLOWLIST: readonly string[] = [
|
|
49
44
|
// Context / summary writing
|
|
50
45
|
"gsd_summary_save",
|
|
51
|
-
"gsd_save_summary",
|
|
52
46
|
// Decision recording
|
|
53
47
|
"gsd_decision_save",
|
|
54
|
-
"gsd_save_decision",
|
|
55
48
|
// Milestone planning (needed for discuss.md output phase)
|
|
56
49
|
"gsd_plan_milestone",
|
|
57
|
-
"gsd_milestone_plan",
|
|
58
50
|
// Milestone ID generation (multi-milestone flow)
|
|
59
51
|
"gsd_milestone_generate_id",
|
|
60
|
-
"gsd_generate_milestone_id",
|
|
61
52
|
// Requirement updates
|
|
62
53
|
"gsd_requirement_save",
|
|
63
|
-
"gsd_save_requirement",
|
|
64
54
|
"gsd_requirement_update",
|
|
65
|
-
"gsd_update_requirement",
|
|
66
55
|
];
|
|
56
|
+
|
|
57
|
+
// ─── Context Injection ────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Leading marker stamped on every buildContextMessage() output
|
|
61
|
+
* (bootstrap/system-context.ts). Single source of truth for the producer and
|
|
62
|
+
* the consumer: the provider payload policy (filterSupersededContextInjections
|
|
63
|
+
* in context-masker.ts) matches this prefix to find and dedupe injected
|
|
64
|
+
* memory/guided/forensics messages after convertToLlm strips their customType.
|
|
65
|
+
* Both sides import it from here — do not inline the literal in either module.
|
|
66
|
+
*/
|
|
67
|
+
export const GSD_CONTEXT_MESSAGE_SENTINEL = "[GSD Context Injection]";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { GSD_CONTEXT_MESSAGE_SENTINEL } from "./constants.js";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Observation masking for GSD auto-mode sessions.
|
|
3
5
|
*
|
|
@@ -75,6 +77,26 @@ function findTurnBoundary(messages: MaskableMessage[], keepRecentTurns: number):
|
|
|
75
77
|
return 0;
|
|
76
78
|
}
|
|
77
79
|
|
|
80
|
+
function countRealUserTurns(messages: MaskableMessage[]): number {
|
|
81
|
+
let count = 0;
|
|
82
|
+
for (const m of messages) {
|
|
83
|
+
if (m.role === "user" && !isBashResultUserMessage(m)) count++;
|
|
84
|
+
}
|
|
85
|
+
return count;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Quantizes how many recent turns stay unmasked so the boundary only moves
|
|
90
|
+
* forward once per full block of `keepRecentTurns` new turns, instead of
|
|
91
|
+
* every turn. Keeps the masked prefix byte-stable within a block, which is
|
|
92
|
+
* what lets the LLM provider's prompt cache survive across turns.
|
|
93
|
+
*/
|
|
94
|
+
function quantizedKeepTurns(totalTurns: number, keepRecentTurns: number): number {
|
|
95
|
+
if (keepRecentTurns <= 0 || totalTurns < 2 * keepRecentTurns) return totalTurns;
|
|
96
|
+
const maskedTurns = Math.floor((totalTurns - keepRecentTurns) / keepRecentTurns) * keepRecentTurns;
|
|
97
|
+
return totalTurns - maskedTurns;
|
|
98
|
+
}
|
|
99
|
+
|
|
78
100
|
/**
|
|
79
101
|
* Detect user messages that originated from bashExecution.
|
|
80
102
|
* After convertToLlm, these are {role: "user", content: [{type:"text", text:"Ran `cmd`\n..."}]}.
|
|
@@ -95,7 +117,8 @@ function isMaskableMessage(m: MaskableMessage): boolean {
|
|
|
95
117
|
|
|
96
118
|
export function createObservationMask(keepRecentTurns: number = 8) {
|
|
97
119
|
return (messages: MaskableMessage[]): MaskableMessage[] => {
|
|
98
|
-
const
|
|
120
|
+
const totalTurns = countRealUserTurns(messages);
|
|
121
|
+
const boundary = findTurnBoundary(messages, quantizedKeepTurns(totalTurns, keepRecentTurns));
|
|
99
122
|
if (boundary === 0) return messages;
|
|
100
123
|
|
|
101
124
|
return messages.map((m, i) => {
|
|
@@ -126,6 +149,14 @@ function findResponsesTurnBoundary(items: ResponsesInputItem[], keepRecentTurns:
|
|
|
126
149
|
return 0;
|
|
127
150
|
}
|
|
128
151
|
|
|
152
|
+
function countResponsesRealUserTurns(items: ResponsesInputItem[]): number {
|
|
153
|
+
let count = 0;
|
|
154
|
+
for (const item of items) {
|
|
155
|
+
if (item.role === "user" && !isResponsesBashResultUserItem(item)) count++;
|
|
156
|
+
}
|
|
157
|
+
return count;
|
|
158
|
+
}
|
|
159
|
+
|
|
129
160
|
/**
|
|
130
161
|
* Observation masking for OpenAI/Codex Responses API payloads.
|
|
131
162
|
*
|
|
@@ -135,7 +166,8 @@ function findResponsesTurnBoundary(items: ResponsesInputItem[], keepRecentTurns:
|
|
|
135
166
|
*/
|
|
136
167
|
export function createResponsesInputObservationMask(keepRecentTurns: number = 8) {
|
|
137
168
|
return (items: ResponsesInputItem[]): ResponsesInputItem[] => {
|
|
138
|
-
const
|
|
169
|
+
const totalTurns = countResponsesRealUserTurns(items);
|
|
170
|
+
const boundary = findResponsesTurnBoundary(items, quantizedKeepTurns(totalTurns, keepRecentTurns));
|
|
139
171
|
if (boundary === 0) return items;
|
|
140
172
|
|
|
141
173
|
return items.map((item, i) => {
|
|
@@ -219,3 +251,67 @@ export function truncateResponsesInputResultItems(items: ResponsesInputItem[], m
|
|
|
219
251
|
return item;
|
|
220
252
|
});
|
|
221
253
|
}
|
|
254
|
+
|
|
255
|
+
// GSD injects at most one context message per turn (memory/guided/forensics —
|
|
256
|
+
// see buildContextMessage in bootstrap/system-context.ts), marked with
|
|
257
|
+
// GSD_CONTEXT_MESSAGE_SENTINEL. convertToLlm strips the distinguishing
|
|
258
|
+
// customType before the payload reaches this hook, so detection is by content
|
|
259
|
+
// prefix instead. Pre-sentinel session history lacks the sentinel, so we also
|
|
260
|
+
// match the stable *bracketed* GSD block labels those injections begin with,
|
|
261
|
+
// letting resumed sessions dedupe older memory/guided blocks.
|
|
262
|
+
//
|
|
263
|
+
// Only GSD-specific bracketed markers belong here — never generic prose. A
|
|
264
|
+
// message is dropped from the payload when it matches, so a natural-language
|
|
265
|
+
// prefix (e.g. the forensics prompt "Debug GSD itself.") could silently delete
|
|
266
|
+
// a real user message that happens to start the same way. Legacy forensics
|
|
267
|
+
// injections without memory are therefore left un-deduped by design; those
|
|
268
|
+
// with memory still match via the "[GSD Context Metadata]" wrapper.
|
|
269
|
+
const LEGACY_GSD_CONTEXT_INJECTION_PREFIXES = [
|
|
270
|
+
"[GSD Context Metadata]",
|
|
271
|
+
"[MEMORY — Critical and prompt-relevant memories from the GSD memory store]",
|
|
272
|
+
"[GSD Guided Execute Context]",
|
|
273
|
+
] as const;
|
|
274
|
+
|
|
275
|
+
function isGsdContextInjectionText(text: string | undefined): boolean {
|
|
276
|
+
if (typeof text !== "string") return false;
|
|
277
|
+
if (text.startsWith(GSD_CONTEXT_MESSAGE_SENTINEL)) return true;
|
|
278
|
+
return LEGACY_GSD_CONTEXT_INJECTION_PREFIXES.some((prefix) => text.startsWith(prefix));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function isGsdContextInjectionMessage(m: MaskableMessage): boolean {
|
|
282
|
+
if (m.role !== "user") return false;
|
|
283
|
+
return isGsdContextInjectionText(firstTextFromContent(m.content));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Removes every GSD context-injection user message except the latest one.
|
|
288
|
+
* Each turn re-injects a near-identical memory/guided/forensics block; left
|
|
289
|
+
* in place they duplicate verbatim across an N-turn session. Removal (not
|
|
290
|
+
* masking) — an empty placeholder still costs tokens and shifts message
|
|
291
|
+
* positions, breaking cache byte-stability. Pure function: stored history is
|
|
292
|
+
* never mutated, only the outgoing payload array.
|
|
293
|
+
*/
|
|
294
|
+
export function filterSupersededContextInjections(messages: MaskableMessage[]): MaskableMessage[] {
|
|
295
|
+
let lastIndex = -1;
|
|
296
|
+
for (let i = 0; i < messages.length; i++) {
|
|
297
|
+
if (isGsdContextInjectionMessage(messages[i])) lastIndex = i;
|
|
298
|
+
}
|
|
299
|
+
if (lastIndex === -1) return messages;
|
|
300
|
+
return messages.filter((m, i) => i === lastIndex || !isGsdContextInjectionMessage(m));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function isResponsesGsdContextInjectionItem(item: ResponsesInputItem): boolean {
|
|
304
|
+
if (item.role !== "user") return false;
|
|
305
|
+
return isGsdContextInjectionText(firstTextFromContent(item.content));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export function filterSupersededResponsesContextInjections(
|
|
309
|
+
items: ResponsesInputItem[],
|
|
310
|
+
): ResponsesInputItem[] {
|
|
311
|
+
let lastIndex = -1;
|
|
312
|
+
for (let i = 0; i < items.length; i++) {
|
|
313
|
+
if (isResponsesGsdContextInjectionItem(items[i])) lastIndex = i;
|
|
314
|
+
}
|
|
315
|
+
if (lastIndex === -1) return items;
|
|
316
|
+
return items.filter((item, i) => i === lastIndex || !isResponsesGsdContextInjectionItem(item));
|
|
317
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import {
|
|
17
17
|
_getAdapter,
|
|
18
|
+
immediateTransaction,
|
|
18
19
|
isDbAvailable,
|
|
19
20
|
transaction,
|
|
20
21
|
} from "../gsd-db.js";
|
|
@@ -75,7 +76,12 @@ export function claimNextCommand(workerId: string): CommandQueueRow | null {
|
|
|
75
76
|
const now = new Date().toISOString();
|
|
76
77
|
const db = _getAdapter()!;
|
|
77
78
|
|
|
78
|
-
|
|
79
|
+
// BEGIN IMMEDIATE: this is a read-then-write claim. Under WAL, a deferred
|
|
80
|
+
// transaction that reads first and then upgrades to a writer can fail with
|
|
81
|
+
// SQLITE_BUSY_SNAPSHOT (not retried by busy_timeout) when two workers race;
|
|
82
|
+
// taking the write lock up front serializes claimants so the loser waits
|
|
83
|
+
// and then sees the row already claimed (changes !== 1 → null).
|
|
84
|
+
return immediateTransaction((): CommandQueueRow | null => {
|
|
79
85
|
// Find the oldest unclaimed command targeted at this worker OR
|
|
80
86
|
// broadcast. The partial index covers both via NULL-in-B-tree.
|
|
81
87
|
const row = db.prepare(
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// writer layer.
|
|
11
11
|
import { createRequire } from "node:module";
|
|
12
12
|
import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
|
|
13
|
-
import { dirname, join } from "node:path";
|
|
13
|
+
import { dirname, join, resolve } from "node:path";
|
|
14
14
|
import { GSDError, GSD_STALE_STATE } from "../errors.js";
|
|
15
15
|
import type { GsdWorkspace, MilestoneScope } from "../workspace.js";
|
|
16
16
|
import { logError, logWarning } from "../workflow-logger.js";
|
|
@@ -46,6 +46,7 @@ import {
|
|
|
46
46
|
applyMigrationV27ArtifactHash,
|
|
47
47
|
applyMigrationV28MemoryLastHitAt,
|
|
48
48
|
applyMigrationV29RepositoryTargets,
|
|
49
|
+
applyMigrationV30ReworkBriefs,
|
|
49
50
|
} from "../db-migration-steps.js";
|
|
50
51
|
import {
|
|
51
52
|
isMemoriesFtsAvailableSchema,
|
|
@@ -70,7 +71,10 @@ let _gsdRequire: ReturnType<typeof createRequire> | null | undefined;
|
|
|
70
71
|
function getGsdRequire(): ReturnType<typeof createRequire> | null {
|
|
71
72
|
if (_gsdRequire !== undefined) return _gsdRequire;
|
|
72
73
|
try {
|
|
73
|
-
|
|
74
|
+
// Next.js may emit this module into a CommonJS chunk. Avoid ESM-only module
|
|
75
|
+
// metadata syntax here; it is a hard parse error there.
|
|
76
|
+
const packageRoot = process.env.GSD_WEB_PACKAGE_ROOT || process.env.GSD_PKG_ROOT || process.cwd();
|
|
77
|
+
_gsdRequire = createRequire(resolve(packageRoot, "package.json"));
|
|
74
78
|
} catch {
|
|
75
79
|
_gsdRequire = null;
|
|
76
80
|
}
|
|
@@ -93,7 +97,7 @@ const providerLoader = createSqliteProviderLoader({
|
|
|
93
97
|
nodeVersion: process.versions.node,
|
|
94
98
|
writeStderr: (message: string) => process.stderr.write(message),
|
|
95
99
|
});
|
|
96
|
-
export const SCHEMA_VERSION =
|
|
100
|
+
export const SCHEMA_VERSION = 30;
|
|
97
101
|
function initSchema(db: DbAdapter, fileBacked: boolean, dbPath: string | null): void {
|
|
98
102
|
const conservativeFilePragmas = fileBacked && _isLikelyWslDrvFsPathForTest(dbPath);
|
|
99
103
|
if (fileBacked) db.exec(conservativeFilePragmas ? "PRAGMA journal_mode=DELETE" : "PRAGMA journal_mode=WAL");
|
|
@@ -114,21 +118,39 @@ function initSchema(db: DbAdapter, fileBacked: boolean, dbPath: string | null):
|
|
|
114
118
|
|
|
115
119
|
const existing = db.prepare("SELECT count(*) as cnt FROM schema_version").get();
|
|
116
120
|
if (existing && (existing["cnt"] as number) === 0) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
121
|
+
// An empty schema_version table usually means a fresh install, but it can
|
|
122
|
+
// also be a legacy/truncated DB that already holds user data. Stamping
|
|
123
|
+
// that DB SCHEMA_VERSION without running migrations would mis-mark it as
|
|
124
|
+
// fully migrated and break at first query. Probe before stamping.
|
|
125
|
+
const hasData = ["milestones", "decisions", "memories"].some((t) => {
|
|
126
|
+
try {
|
|
127
|
+
const r = db.prepare(`SELECT count(*) as cnt FROM ${t}`).get();
|
|
128
|
+
return ((r?.["cnt"] as number) ?? 0) > 0;
|
|
129
|
+
} catch { /* table absent on a truly fresh DB — treat as no data */ return false; }
|
|
130
|
+
});
|
|
131
|
+
if (hasData) {
|
|
132
|
+
// Legacy DB with data but no version row: record the baseline so
|
|
133
|
+
// migrateSchema runs the full chain instead of stamping the current version.
|
|
134
|
+
recordSchemaVersion(db, 1);
|
|
135
|
+
} else {
|
|
136
|
+
createCoordinationTablesV24(db);
|
|
137
|
+
createRuntimeKvTableV25(db);
|
|
138
|
+
|
|
139
|
+
// Fresh install — all tables are created above with the full current schema,
|
|
140
|
+
// so it is safe to create all migration-specific indexes here. For existing
|
|
141
|
+
// databases these indexes are created inside the individual migration guards
|
|
142
|
+
// in migrateSchema() after the corresponding columns have been added.
|
|
143
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
144
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
|
|
145
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
|
|
146
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
|
|
147
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
|
|
148
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
|
|
149
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_briefs_task ON rework_briefs(milestone_id, slice_id, task_id)");
|
|
150
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_findings_status ON rework_brief_findings(brief_id, severity, status)");
|
|
151
|
+
|
|
152
|
+
recordSchemaVersion(db, SCHEMA_VERSION);
|
|
153
|
+
}
|
|
132
154
|
}
|
|
133
155
|
|
|
134
156
|
db.exec("COMMIT");
|
|
@@ -183,9 +205,19 @@ function copyQualityGateRowsToRepairedTable(db: DbAdapter): void {
|
|
|
183
205
|
`);
|
|
184
206
|
}
|
|
185
207
|
|
|
208
|
+
let _migrationFaultForTest = false;
|
|
209
|
+
/** Test-only: force migrateSchema to throw after applying its steps but before COMMIT. */
|
|
210
|
+
export function _setMigrationFaultForTest(v: boolean): void { _migrationFaultForTest = v; }
|
|
211
|
+
|
|
186
212
|
function migrateSchema(db: DbAdapter, dbPath: string | null): void {
|
|
187
213
|
const currentVersion = getCurrentSchemaVersion(db);
|
|
188
|
-
if (currentVersion
|
|
214
|
+
if (currentVersion > SCHEMA_VERSION) {
|
|
215
|
+
throw new Error(
|
|
216
|
+
`gsd.db schema is v${currentVersion}, newer than the v${SCHEMA_VERSION} this gsd-pi supports. ` +
|
|
217
|
+
`Update gsd-pi (npm i -g @opengsd/gsd-pi) before opening this project.`,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
if (currentVersion === SCHEMA_VERSION) return;
|
|
189
221
|
|
|
190
222
|
backupDatabaseBeforeMigration(db, dbPath, currentVersion, {
|
|
191
223
|
existsSync,
|
|
@@ -351,6 +383,13 @@ function migrateSchema(db: DbAdapter, dbPath: string | null): void {
|
|
|
351
383
|
recordSchemaVersion(db, 29);
|
|
352
384
|
}
|
|
353
385
|
|
|
386
|
+
if (currentVersion < 30) {
|
|
387
|
+
applyMigrationV30ReworkBriefs(db);
|
|
388
|
+
recordSchemaVersion(db, 30);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (_migrationFaultForTest) throw new Error("migration fault injected for test");
|
|
392
|
+
|
|
354
393
|
db.exec("COMMIT");
|
|
355
394
|
} catch (err) {
|
|
356
395
|
db.exec("ROLLBACK");
|
|
@@ -211,7 +211,11 @@ export function skipSliceCascade(milestoneId: string, sliceId: string): SkipSlic
|
|
|
211
211
|
transaction(() => {
|
|
212
212
|
const slice = getSlice(milestoneId, sliceId);
|
|
213
213
|
if (!slice) { outcome = { ok: false, reason: "slice-not-found" }; return; }
|
|
214
|
-
|
|
214
|
+
// Reject any closed slice except "skipped" (which falls through to the
|
|
215
|
+
// wasAlreadySkipped no-op). isClosedStatus covers the "closed"/"done"
|
|
216
|
+
// aliases too — hand-picking literals here nulls a completed slice's
|
|
217
|
+
// completed_at on re-skip.
|
|
218
|
+
if (isClosedStatus(slice.status) && slice.status !== "skipped") {
|
|
215
219
|
outcome = { ok: false, reason: "slice-already-complete" };
|
|
216
220
|
return;
|
|
217
221
|
}
|