gsd-pi 2.79.0 → 2.80.0-dev.b62439b9f
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 +94 -47
- package/dist/{cli-web-branch.d.ts → cli/cli-web-branch.d.ts} +1 -1
- package/dist/{cli-web-branch.js → cli/cli-web-branch.js} +3 -3
- package/dist/{cli.js → cli/cli.js} +25 -25
- package/dist/{web-mode.js → cli/web-mode.js} +3 -3
- package/dist/{extension-registry.js → extension-runtime/extension-registry.js} +1 -1
- package/dist/{headless-query.d.ts → headless/headless-query.d.ts} +1 -1
- package/dist/{headless-query.js → headless/headless-query.js} +3 -2
- package/dist/{headless-recover.js → headless/headless-recover.js} +3 -2
- package/dist/{headless.js → headless/headless.js} +3 -3
- package/dist/loader.js +10 -10
- package/dist/{onboarding.js → onboarding/onboarding.js} +8 -8
- package/dist/{welcome-screen.js → onboarding/welcome-screen.js} +1 -1
- package/dist/{models-resolver.js → providers/models-resolver.js} +1 -1
- package/dist/{remote-questions-config.js → providers/remote-questions-config.js} +1 -1
- package/dist/{resource-loader.d.ts → resource-runtime/resource-loader.d.ts} +1 -1
- package/dist/{resource-loader.js → resource-runtime/resource-loader.js} +6 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +55 -70
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +362 -523
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +61 -7
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
- package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-start.js +3 -2
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +85 -38
- package/dist/resources/extensions/gsd/auto.js +162 -5
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
- package/dist/resources/extensions/gsd/commands/context.js +1 -1
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
- package/dist/resources/extensions/gsd/guided-flow.js +40 -0
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/paths.js +5 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/preferences-types.js +20 -2
- package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
- package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
- package/dist/resources/extensions/gsd/uok/audit.js +23 -9
- package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- package/dist/{security-overrides.js → security/security-overrides.js} +1 -1
- package/dist/{startup-model-validation.js → startup/startup-model-validation.js} +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/{update-check.js → update/update-check.js} +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +12 -12
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/7020.js +12 -0
- package/dist/web/standalone/.next/server/middleware-build-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 +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-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-fab3ebb85b006001.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/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/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/{worktree-cli.js → worktrees/worktree-cli.js} +3 -2
- package/package.json +12 -5
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +52 -37
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
- package/packages/mcp-server/src/workflow-tools.ts +80 -37
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- 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 +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +25 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +3 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +3 -1
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/tui.test.ts +30 -3
- package/packages/pi-tui/src/tui.ts +3 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +59 -84
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +414 -598
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +88 -9
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
- package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-start.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -36
- package/src/resources/extensions/gsd/auto.ts +170 -4
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
- package/src/resources/extensions/gsd/commands/context.ts +1 -1
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
- package/src/resources/extensions/gsd/guided-flow.ts +47 -0
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/paths.ts +6 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/preferences-types.ts +23 -4
- package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +18 -34
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
- package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
- package/src/resources/extensions/gsd/uok/audit.ts +25 -9
- package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- package/dist/web/standalone/.next/server/chunks/6897.js +0 -12
- package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.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/{app-paths.d.ts → app/app-paths.d.ts} +0 -0
- /package/dist/{app-paths.js → app/app-paths.js} +0 -0
- /package/dist/{project-sessions.d.ts → app/project-sessions.d.ts} +0 -0
- /package/dist/{project-sessions.js → app/project-sessions.js} +0 -0
- /package/dist/{tool-bootstrap.d.ts → app/tool-bootstrap.d.ts} +0 -0
- /package/dist/{tool-bootstrap.js → app/tool-bootstrap.js} +0 -0
- /package/dist/{cli-auto-routing.d.ts → cli/cli-auto-routing.d.ts} +0 -0
- /package/dist/{cli-auto-routing.js → cli/cli-auto-routing.js} +0 -0
- /package/dist/{cli-policy.d.ts → cli/cli-policy.d.ts} +0 -0
- /package/dist/{cli-policy.js → cli/cli-policy.js} +0 -0
- /package/dist/{cli.d.ts → cli/cli.d.ts} +0 -0
- /package/dist/{help-text.d.ts → cli/help-text.d.ts} +0 -0
- /package/dist/{help-text.js → cli/help-text.js} +0 -0
- /package/dist/{logo.d.ts → cli/logo.d.ts} +0 -0
- /package/dist/{logo.js → cli/logo.js} +0 -0
- /package/dist/{web-mode.d.ts → cli/web-mode.d.ts} +0 -0
- /package/dist/{bundled-extension-paths.d.ts → extension-runtime/bundled-extension-paths.d.ts} +0 -0
- /package/dist/{bundled-extension-paths.js → extension-runtime/bundled-extension-paths.js} +0 -0
- /package/dist/{bundled-resource-path.d.ts → extension-runtime/bundled-resource-path.d.ts} +0 -0
- /package/dist/{bundled-resource-path.js → extension-runtime/bundled-resource-path.js} +0 -0
- /package/dist/{extension-discovery.d.ts → extension-runtime/extension-discovery.d.ts} +0 -0
- /package/dist/{extension-discovery.js → extension-runtime/extension-discovery.js} +0 -0
- /package/dist/{extension-registry.d.ts → extension-runtime/extension-registry.d.ts} +0 -0
- /package/dist/{extension-sort.d.ts → extension-runtime/extension-sort.d.ts} +0 -0
- /package/dist/{extension-sort.js → extension-runtime/extension-sort.js} +0 -0
- /package/dist/{extension-validator.d.ts → extension-runtime/extension-validator.d.ts} +0 -0
- /package/dist/{extension-validator.js → extension-runtime/extension-validator.js} +0 -0
- /package/dist/{headless-answers.d.ts → headless/headless-answers.d.ts} +0 -0
- /package/dist/{headless-answers.js → headless/headless-answers.js} +0 -0
- /package/dist/{headless-context.d.ts → headless/headless-context.d.ts} +0 -0
- /package/dist/{headless-context.js → headless/headless-context.js} +0 -0
- /package/dist/{headless-events.d.ts → headless/headless-events.d.ts} +0 -0
- /package/dist/{headless-events.js → headless/headless-events.js} +0 -0
- /package/dist/{headless-recover.d.ts → headless/headless-recover.d.ts} +0 -0
- /package/dist/{headless-types.d.ts → headless/headless-types.d.ts} +0 -0
- /package/dist/{headless-types.js → headless/headless-types.js} +0 -0
- /package/dist/{headless-ui.d.ts → headless/headless-ui.d.ts} +0 -0
- /package/dist/{headless-ui.js → headless/headless-ui.js} +0 -0
- /package/dist/{headless.d.ts → headless/headless.d.ts} +0 -0
- /package/dist/{mcp-server.d.ts → mcp/mcp-server.d.ts} +0 -0
- /package/dist/{mcp-server.js → mcp/mcp-server.js} +0 -0
- /package/dist/{onboarding.d.ts → onboarding/onboarding.d.ts} +0 -0
- /package/dist/{welcome-screen.d.ts → onboarding/welcome-screen.d.ts} +0 -0
- /package/dist/{wizard.d.ts → onboarding/wizard.d.ts} +0 -0
- /package/dist/{wizard.js → onboarding/wizard.js} +0 -0
- /package/dist/{models-resolver.d.ts → providers/models-resolver.d.ts} +0 -0
- /package/dist/{pi-migration.d.ts → providers/pi-migration.d.ts} +0 -0
- /package/dist/{pi-migration.js → providers/pi-migration.js} +0 -0
- /package/dist/{provider-migrations.d.ts → providers/provider-migrations.d.ts} +0 -0
- /package/dist/{provider-migrations.js → providers/provider-migrations.js} +0 -0
- /package/dist/{remote-questions-config.d.ts → providers/remote-questions-config.d.ts} +0 -0
- /package/dist/{rtk-shared.d.ts → rtk/rtk-shared.d.ts} +0 -0
- /package/dist/{rtk-shared.js → rtk/rtk-shared.js} +0 -0
- /package/dist/{rtk.d.ts → rtk/rtk.d.ts} +0 -0
- /package/dist/{rtk.js → rtk/rtk.js} +0 -0
- /package/dist/{security-overrides.d.ts → security/security-overrides.d.ts} +0 -0
- /package/dist/{claude-cli-check.d.ts → startup/claude-cli-check.d.ts} +0 -0
- /package/dist/{claude-cli-check.js → startup/claude-cli-check.js} +0 -0
- /package/dist/{runtime-checks.d.ts → startup/runtime-checks.d.ts} +0 -0
- /package/dist/{runtime-checks.js → startup/runtime-checks.js} +0 -0
- /package/dist/{startup-model-validation.d.ts → startup/startup-model-validation.d.ts} +0 -0
- /package/dist/{startup-timings.d.ts → startup/startup-timings.d.ts} +0 -0
- /package/dist/{startup-timings.js → startup/startup-timings.js} +0 -0
- /package/dist/{update-check.d.ts → update/update-check.d.ts} +0 -0
- /package/dist/{update-cmd.d.ts → update/update-cmd.d.ts} +0 -0
- /package/dist/{update-cmd.js → update/update-cmd.js} +0 -0
- /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → -WDXZiiJHGZDbYH75Mu6f}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → -WDXZiiJHGZDbYH75Mu6f}/_ssgManifest.js +0 -0
- /package/dist/{worktree-cli.d.ts → worktrees/worktree-cli.d.ts} +0 -0
- /package/dist/{worktree-name-gen.d.ts → worktrees/worktree-name-gen.d.ts} +0 -0
- /package/dist/{worktree-name-gen.js → worktrees/worktree-name-gen.js} +0 -0
- /package/dist/{worktree-status-banner.d.ts → worktrees/worktree-status-banner.d.ts} +0 -0
- /package/dist/{worktree-status-banner.js → worktrees/worktree-status-banner.js} +0 -0
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
*
|
|
18
18
|
* This rewrite builds a real git parent repo + local submodule, creates
|
|
19
19
|
* a worktree, dirties a tracked file inside the submodule, then invokes
|
|
20
|
-
* `removeWorktree` and asserts observable behaviour
|
|
21
|
-
*
|
|
20
|
+
* `removeWorktree` and asserts observable behaviour through the workflow log
|
|
21
|
+
* buffer and on the filesystem (the worktree is gone).
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
@@ -35,6 +35,7 @@ import { join } from "node:path";
|
|
|
35
35
|
import { tmpdir } from "node:os";
|
|
36
36
|
|
|
37
37
|
import { createWorktree, removeWorktree } from "../worktree-manager.ts";
|
|
38
|
+
import { _resetLogs, peekLogs } from "../workflow-logger.ts";
|
|
38
39
|
|
|
39
40
|
interface Harness {
|
|
40
41
|
parent: string;
|
|
@@ -112,53 +113,38 @@ function makeHarness(): Harness {
|
|
|
112
113
|
};
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
function captureStderr(fn: () => void): string {
|
|
118
|
-
const streamAny = process.stderr as unknown as {
|
|
119
|
-
write: (chunk: string | Uint8Array, ...rest: unknown[]) => boolean;
|
|
120
|
-
};
|
|
121
|
-
const original = streamAny.write.bind(streamAny);
|
|
122
|
-
const chunks: string[] = [];
|
|
123
|
-
streamAny.write = (chunk: string | Uint8Array): boolean => {
|
|
124
|
-
chunks.push(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf-8"));
|
|
125
|
-
return true;
|
|
126
|
-
};
|
|
127
|
-
try {
|
|
128
|
-
fn();
|
|
129
|
-
} finally {
|
|
130
|
-
streamAny.write = original;
|
|
131
|
-
}
|
|
132
|
-
return chunks.join("");
|
|
116
|
+
function workflowLogMessages(): string {
|
|
117
|
+
return peekLogs().map((entry) => entry.message).join("\n");
|
|
133
118
|
}
|
|
134
119
|
|
|
135
120
|
describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
136
121
|
let h: Harness;
|
|
137
122
|
|
|
138
123
|
beforeEach(() => {
|
|
124
|
+
_resetLogs();
|
|
139
125
|
h = makeHarness();
|
|
140
126
|
});
|
|
141
127
|
|
|
142
128
|
afterEach(() => {
|
|
143
129
|
h.cleanup();
|
|
130
|
+
_resetLogs();
|
|
144
131
|
});
|
|
145
132
|
|
|
146
133
|
test("clean submodules: worktree removes without stashing or submodule warnings", () => {
|
|
147
134
|
const wt = createWorktree(h.parent, "cleanwt");
|
|
148
135
|
runGit(wt.path, ["submodule", "update", "--init", "--recursive"]);
|
|
149
136
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
});
|
|
137
|
+
removeWorktree(h.parent, "cleanwt");
|
|
138
|
+
const logs = workflowLogMessages();
|
|
153
139
|
|
|
154
140
|
assert.ok(!existsSync(wt.path), "worktree directory should be gone");
|
|
155
141
|
assert.doesNotMatch(
|
|
156
|
-
|
|
142
|
+
logs,
|
|
157
143
|
/Saved uncommitted submodule changes to rescue branch/,
|
|
158
144
|
"clean submodule must not trigger rescue-branch creation",
|
|
159
145
|
);
|
|
160
146
|
assert.doesNotMatch(
|
|
161
|
-
|
|
147
|
+
logs,
|
|
162
148
|
/Submodule rescue branch creation failed/,
|
|
163
149
|
"clean submodule must not trigger rescue-branch failure warning",
|
|
164
150
|
);
|
|
@@ -191,21 +177,20 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
|
191
177
|
`precondition: submodule must be diverged, got: "${subStatus}"`,
|
|
192
178
|
);
|
|
193
179
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
});
|
|
180
|
+
removeWorktree(h.parent, "dirtywt");
|
|
181
|
+
const logs = workflowLogMessages();
|
|
197
182
|
|
|
198
183
|
// Worktree is gone: force fallback succeeded.
|
|
199
184
|
assert.ok(!existsSync(wt.path), "worktree directory should be removed");
|
|
200
185
|
|
|
201
186
|
// The code path that fires on dirty submodules emits one of these
|
|
202
|
-
//
|
|
187
|
+
// warnings. Any of these indicates the detection ran — the ONLY
|
|
203
188
|
// observable that would fail if someone removed the
|
|
204
189
|
// `if (hasSubmoduleChanges)` branch and went straight to force
|
|
205
190
|
// removal. This is the assertion that #4823 demanded in place of
|
|
206
191
|
// the tautological `src.includes("submodule") && src.includes("force")`.
|
|
207
192
|
assert.match(
|
|
208
|
-
|
|
193
|
+
logs,
|
|
209
194
|
/Saved uncommitted submodule changes to rescue branch|Submodule rescue branch creation failed|Submodule changes detected/,
|
|
210
195
|
"dirty submodule must trigger detection-and-warning path",
|
|
211
196
|
);
|
|
@@ -231,12 +216,11 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
|
231
216
|
renameSync(modPath, hiddenPath);
|
|
232
217
|
}
|
|
233
218
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
});
|
|
219
|
+
removeWorktree(h.parent, "no-gitmodules");
|
|
220
|
+
const logs = workflowLogMessages();
|
|
237
221
|
|
|
238
222
|
assert.doesNotMatch(
|
|
239
|
-
|
|
223
|
+
logs,
|
|
240
224
|
/Saved uncommitted submodule changes to rescue branch/,
|
|
241
225
|
"missing .gitmodules should skip submodule detection entirely",
|
|
242
226
|
);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD2 complete-milestone tool handler
|
|
1
2
|
/**
|
|
2
3
|
* complete-milestone handler — the core operation behind gsd_complete_milestone.
|
|
3
4
|
*
|
|
@@ -57,6 +58,7 @@ export interface CompleteMilestoneResult {
|
|
|
57
58
|
milestoneId: string;
|
|
58
59
|
summaryPath: string;
|
|
59
60
|
stale?: boolean;
|
|
61
|
+
alreadyComplete?: boolean;
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
function renderMilestoneSummaryMarkdown(params: CompleteMilestoneParams): string {
|
|
@@ -143,6 +145,7 @@ export async function handleCompleteMilestone(
|
|
|
143
145
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
144
146
|
const completedAt = new Date().toISOString();
|
|
145
147
|
let guardError: string | null = null;
|
|
148
|
+
let alreadyComplete = false;
|
|
146
149
|
|
|
147
150
|
transaction(() => {
|
|
148
151
|
// State machine preconditions (inside txn for atomicity)
|
|
@@ -152,7 +155,7 @@ export async function handleCompleteMilestone(
|
|
|
152
155
|
return;
|
|
153
156
|
}
|
|
154
157
|
if (isClosedStatus(milestone.status)) {
|
|
155
|
-
|
|
158
|
+
alreadyComplete = true;
|
|
156
159
|
return;
|
|
157
160
|
}
|
|
158
161
|
|
|
@@ -238,14 +241,16 @@ export async function handleCompleteMilestone(
|
|
|
238
241
|
logWarning("tool", `complete-milestone manifest warning: ${(mfErr as Error).message}`);
|
|
239
242
|
}
|
|
240
243
|
try {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
244
|
+
if (!alreadyComplete) {
|
|
245
|
+
appendEvent(basePath, {
|
|
246
|
+
cmd: "complete-milestone",
|
|
247
|
+
params: { milestoneId: params.milestoneId },
|
|
248
|
+
ts: new Date().toISOString(),
|
|
249
|
+
actor: "agent",
|
|
250
|
+
actor_name: params.actorName,
|
|
251
|
+
trigger_reason: params.triggerReason,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
249
254
|
} catch (eventErr) {
|
|
250
255
|
logError("tool", `complete-milestone event log FAILED — completion invisible to reconciliation`, { error: (eventErr as Error).message });
|
|
251
256
|
}
|
|
@@ -254,5 +259,6 @@ export async function handleCompleteMilestone(
|
|
|
254
259
|
milestoneId: params.milestoneId,
|
|
255
260
|
summaryPath,
|
|
256
261
|
...(projectionStale ? { stale: true } : {}),
|
|
262
|
+
...(alreadyComplete ? { alreadyComplete: true } : {}),
|
|
257
263
|
};
|
|
258
264
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Complete-task tool handler for GSD workflow state and summaries.
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* complete-task handler — the core operation behind gsd_complete_task.
|
|
3
6
|
*
|
|
@@ -55,7 +58,7 @@ export interface CompleteTaskResult {
|
|
|
55
58
|
stale?: boolean;
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
import type { TaskRow } from "../
|
|
61
|
+
import type { TaskRow } from "../db-task-slice-rows.js";
|
|
59
62
|
|
|
60
63
|
/**
|
|
61
64
|
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
@@ -3,6 +3,7 @@ import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-
|
|
|
3
3
|
import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
|
|
4
4
|
import {
|
|
5
5
|
getActiveRequirements,
|
|
6
|
+
insertMilestone,
|
|
6
7
|
getMilestone,
|
|
7
8
|
getSliceStatusSummary,
|
|
8
9
|
getSliceTaskCounts,
|
|
@@ -31,6 +32,7 @@ import { handleValidateMilestone } from "./validate-milestone.js";
|
|
|
31
32
|
import { logError, logWarning } from "../workflow-logger.js";
|
|
32
33
|
import { invalidateStateCache } from "../state.js";
|
|
33
34
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
35
|
+
import { parseProject } from "../schemas/parsers.js";
|
|
34
36
|
|
|
35
37
|
export const SUPPORTED_SUMMARY_ARTIFACT_TYPES = [
|
|
36
38
|
"SUMMARY",
|
|
@@ -71,6 +73,20 @@ export interface SummarySaveParams {
|
|
|
71
73
|
content: string;
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
function registerProjectMilestoneSequence(content: string): string[] {
|
|
77
|
+
const parsed = parseProject(content);
|
|
78
|
+
const registered: string[] = [];
|
|
79
|
+
for (const milestone of parsed.milestones) {
|
|
80
|
+
insertMilestone({
|
|
81
|
+
id: milestone.id,
|
|
82
|
+
title: milestone.title,
|
|
83
|
+
status: milestone.done ? "complete" : "queued",
|
|
84
|
+
});
|
|
85
|
+
registered.push(milestone.id);
|
|
86
|
+
}
|
|
87
|
+
return registered;
|
|
88
|
+
}
|
|
89
|
+
|
|
74
90
|
export async function executeSummarySave(
|
|
75
91
|
params: SummarySaveParams,
|
|
76
92
|
basePath: string = process.cwd(),
|
|
@@ -173,6 +189,67 @@ export async function executeSummarySave(
|
|
|
173
189
|
basePath,
|
|
174
190
|
);
|
|
175
191
|
|
|
192
|
+
let registeredMilestones: string[] = [];
|
|
193
|
+
if (params.artifact_type === "PROJECT") {
|
|
194
|
+
try {
|
|
195
|
+
registeredMilestones = registerProjectMilestoneSequence(contentToSave);
|
|
196
|
+
if (registeredMilestones.length > 0) invalidateStateCache();
|
|
197
|
+
} catch (err) {
|
|
198
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
199
|
+
logError("tool", `gsd_summary_save: PROJECT artifact persisted but milestone registration threw: ${msg}`, {
|
|
200
|
+
tool: "gsd_summary_save",
|
|
201
|
+
error: String(err),
|
|
202
|
+
stack: err instanceof Error ? err.stack ?? "" : "",
|
|
203
|
+
});
|
|
204
|
+
// PROJECT.md was persisted by saveArtifactToDb above; the artifacts row
|
|
205
|
+
// changed even though no milestones registered. Invalidate so subsequent
|
|
206
|
+
// /gsd reads see the persisted artifact instead of the pre-save cache.
|
|
207
|
+
invalidateStateCache();
|
|
208
|
+
return {
|
|
209
|
+
content: [{
|
|
210
|
+
type: "text",
|
|
211
|
+
text:
|
|
212
|
+
`Error: PROJECT.md was saved to ${relativePath} but milestone registration failed: ${msg}. ` +
|
|
213
|
+
`The DB has no milestone rows for this project, so /gsd will report "No Active Milestone". ` +
|
|
214
|
+
`Re-call gsd_summary_save(PROJECT) once the underlying error is resolved — INSERT OR IGNORE makes registration idempotent.`,
|
|
215
|
+
}],
|
|
216
|
+
details: {
|
|
217
|
+
operation: "save_summary",
|
|
218
|
+
path: relativePath,
|
|
219
|
+
artifact_type: params.artifact_type,
|
|
220
|
+
error: "milestone_registration_threw",
|
|
221
|
+
registration_error: msg,
|
|
222
|
+
},
|
|
223
|
+
isError: true,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (registeredMilestones.length === 0) {
|
|
227
|
+
logError("tool", `gsd_summary_save: PROJECT.md saved to ${relativePath} but parsed zero milestones — registration produced no DB rows`, {
|
|
228
|
+
tool: "gsd_summary_save",
|
|
229
|
+
});
|
|
230
|
+
// PROJECT.md was persisted; invalidate so subsequent reads see the new
|
|
231
|
+
// artifacts row even though no milestones registered.
|
|
232
|
+
invalidateStateCache();
|
|
233
|
+
return {
|
|
234
|
+
content: [{
|
|
235
|
+
type: "text",
|
|
236
|
+
text:
|
|
237
|
+
`Error: PROJECT.md was saved to ${relativePath} but contains zero parseable milestone lines, ` +
|
|
238
|
+
`so no milestones were registered in the DB. /gsd will report "No Active Milestone". ` +
|
|
239
|
+
`Rewrite PROJECT.md so the "Milestone Sequence" section uses canonical lines: ` +
|
|
240
|
+
`\`- [ ] M001: <Title> — <One-liner>\` (em-dash, double-dash \`--\`, or single-dash \`-\` separator), then re-call gsd_summary_save(PROJECT).`,
|
|
241
|
+
}],
|
|
242
|
+
details: {
|
|
243
|
+
operation: "save_summary",
|
|
244
|
+
path: relativePath,
|
|
245
|
+
artifact_type: params.artifact_type,
|
|
246
|
+
error: "milestone_registration_empty_parse",
|
|
247
|
+
},
|
|
248
|
+
isError: true,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
176
253
|
if (params.artifact_type === "CONTEXT" && !params.task_id) {
|
|
177
254
|
try {
|
|
178
255
|
const draftFile = params.slice_id
|
|
@@ -186,7 +263,13 @@ export async function executeSummarySave(
|
|
|
186
263
|
|
|
187
264
|
return {
|
|
188
265
|
content: [{ type: "text", text: `Saved ${params.artifact_type} artifact to ${relativePath}` }],
|
|
189
|
-
details: {
|
|
266
|
+
details: {
|
|
267
|
+
operation: "save_summary",
|
|
268
|
+
path: relativePath,
|
|
269
|
+
artifact_type: params.artifact_type,
|
|
270
|
+
content_source: contentSource,
|
|
271
|
+
...(registeredMilestones.length > 0 ? { registeredMilestones } : {}),
|
|
272
|
+
},
|
|
190
273
|
};
|
|
191
274
|
} catch (err) {
|
|
192
275
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -394,12 +477,17 @@ export async function executeCompleteMilestone(
|
|
|
394
477
|
isError: true,
|
|
395
478
|
};
|
|
396
479
|
}
|
|
480
|
+
const message = result.alreadyComplete
|
|
481
|
+
? `Milestone ${result.milestoneId} is already complete. Summary available at ${result.summaryPath}`
|
|
482
|
+
: `Completed milestone ${result.milestoneId}. Summary written to ${result.summaryPath}`;
|
|
397
483
|
return {
|
|
398
|
-
content: [{ type: "text", text:
|
|
484
|
+
content: [{ type: "text", text: message }],
|
|
399
485
|
details: {
|
|
400
486
|
operation: "complete_milestone",
|
|
401
487
|
milestoneId: result.milestoneId,
|
|
402
488
|
summaryPath: result.summaryPath,
|
|
489
|
+
...(result.alreadyComplete ? { alreadyComplete: true } : {}),
|
|
490
|
+
...(result.stale ? { stale: true } : {}),
|
|
403
491
|
},
|
|
404
492
|
};
|
|
405
493
|
} catch (err) {
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
type BaseResolverContext,
|
|
43
43
|
type ComputedArtifactId,
|
|
44
44
|
type ComputedArtifactRegistry,
|
|
45
|
+
type ContextModePolicy,
|
|
45
46
|
type UnitContextManifest,
|
|
46
47
|
} from "./unit-context-manifest.js";
|
|
47
48
|
|
|
@@ -92,6 +93,54 @@ export function manifestBudgetChars(unitType: string): number | null {
|
|
|
92
93
|
return manifest ? manifest.maxSystemPromptChars : null;
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
// ─── Context Mode lane guidance ──────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
export type ContextModeRenderMode = "standalone" | "nested";
|
|
99
|
+
|
|
100
|
+
export interface ComposeContextModeInstructionOptions {
|
|
101
|
+
readonly enabled: boolean;
|
|
102
|
+
readonly renderMode: ContextModeRenderMode;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const CONTEXT_MODE_LANE_LABELS: Record<Exclude<ContextModePolicy, "none">, string> = {
|
|
106
|
+
interview: "interview",
|
|
107
|
+
research: "research",
|
|
108
|
+
planning: "planning",
|
|
109
|
+
execution: "execution",
|
|
110
|
+
verification: "verification",
|
|
111
|
+
orchestration: "orchestration",
|
|
112
|
+
docs: "documentation",
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const CONTEXT_MODE_GUIDANCE =
|
|
116
|
+
"Use `gsd_exec` for noisy commands, `gsd_exec_search` before reruns, and `gsd_resume` after compaction or resume.";
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Render the Context Mode instruction lane for a unit type. Unknown unit
|
|
120
|
+
* types, disabled config, and explicit `contextMode: "none"` all omit the
|
|
121
|
+
* block so callers can prefix this safely without extra branching.
|
|
122
|
+
*/
|
|
123
|
+
export function composeContextModeInstructions(
|
|
124
|
+
unitType: string,
|
|
125
|
+
opts: ComposeContextModeInstructionOptions,
|
|
126
|
+
): string {
|
|
127
|
+
if (!opts.enabled) return "";
|
|
128
|
+
const manifest = resolveManifest(unitType);
|
|
129
|
+
if (!manifest || manifest.contextMode === "none") return "";
|
|
130
|
+
|
|
131
|
+
const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
|
|
132
|
+
if (opts.renderMode === "nested") {
|
|
133
|
+
return `Context Mode (${lane} lane): ${CONTEXT_MODE_GUIDANCE}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return [
|
|
137
|
+
"## Context Mode",
|
|
138
|
+
"",
|
|
139
|
+
`Lane: **${lane} lane**.`,
|
|
140
|
+
CONTEXT_MODE_GUIDANCE,
|
|
141
|
+
].join("\n");
|
|
142
|
+
}
|
|
143
|
+
|
|
95
144
|
// ─── v2 surface (#4924) ───────────────────────────────────────────────────
|
|
96
145
|
|
|
97
146
|
/**
|
|
@@ -90,6 +90,17 @@ export type MemoryPolicy = "none" | "critical-only" | "prompt-relevant";
|
|
|
90
90
|
/** Preferences block policy. */
|
|
91
91
|
export type PreferencesPolicy = "none" | "active-only" | "full";
|
|
92
92
|
|
|
93
|
+
/** Context Mode lane guidance policy for each auto-mode unit. */
|
|
94
|
+
export type ContextModePolicy =
|
|
95
|
+
| "none"
|
|
96
|
+
| "interview"
|
|
97
|
+
| "research"
|
|
98
|
+
| "planning"
|
|
99
|
+
| "execution"
|
|
100
|
+
| "verification"
|
|
101
|
+
| "orchestration"
|
|
102
|
+
| "docs";
|
|
103
|
+
|
|
93
104
|
/**
|
|
94
105
|
* Tool-access policy per unit type (#4934).
|
|
95
106
|
*
|
|
@@ -220,6 +231,8 @@ export interface UnitContextManifest {
|
|
|
220
231
|
readonly codebaseMap: boolean;
|
|
221
232
|
/** Preferences block policy. */
|
|
222
233
|
readonly preferences: PreferencesPolicy;
|
|
234
|
+
/** Context Mode guidance lane. */
|
|
235
|
+
readonly contextMode: ContextModePolicy;
|
|
223
236
|
/**
|
|
224
237
|
* Tool-access policy (#4934). Runtime enforcement covers path-scoped write
|
|
225
238
|
* blocking, subagent denial, and bash allowlisting for active auto-mode
|
|
@@ -343,6 +356,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
343
356
|
memory: "prompt-relevant",
|
|
344
357
|
codebaseMap: true,
|
|
345
358
|
preferences: "active-only",
|
|
359
|
+
contextMode: "research",
|
|
346
360
|
tools: TOOLS_PLANNING,
|
|
347
361
|
artifacts: {
|
|
348
362
|
// Phase 3 migration (#4782): matches today's actual
|
|
@@ -359,6 +373,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
359
373
|
memory: "prompt-relevant",
|
|
360
374
|
codebaseMap: true,
|
|
361
375
|
preferences: "active-only",
|
|
376
|
+
contextMode: "planning",
|
|
362
377
|
tools: TOOLS_PLANNING,
|
|
363
378
|
artifacts: {
|
|
364
379
|
inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
|
|
@@ -373,6 +388,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
373
388
|
memory: "prompt-relevant",
|
|
374
389
|
codebaseMap: true,
|
|
375
390
|
preferences: "active-only",
|
|
391
|
+
contextMode: "interview",
|
|
376
392
|
tools: TOOLS_PLANNING,
|
|
377
393
|
artifacts: {
|
|
378
394
|
inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
|
|
@@ -387,6 +403,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
387
403
|
memory: "prompt-relevant",
|
|
388
404
|
codebaseMap: false,
|
|
389
405
|
preferences: "active-only",
|
|
406
|
+
contextMode: "verification",
|
|
390
407
|
// planning-dispatch: validation is a verification-fan-out unit. It reads
|
|
391
408
|
// the milestone surface and dispatches reviewer/security/tester subagents
|
|
392
409
|
// to report findings without touching user source. Mirrors
|
|
@@ -405,6 +422,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
405
422
|
memory: "prompt-relevant",
|
|
406
423
|
codebaseMap: false,
|
|
407
424
|
preferences: "active-only",
|
|
425
|
+
contextMode: "verification",
|
|
408
426
|
// planning-dispatch: completion is a high-leverage place to fan out to
|
|
409
427
|
// reviewer / security / tester subagents. They read the diff and report
|
|
410
428
|
// findings; they do not write user source. Write isolation to .gsd/ is
|
|
@@ -428,6 +446,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
428
446
|
memory: "prompt-relevant",
|
|
429
447
|
codebaseMap: true,
|
|
430
448
|
preferences: "active-only",
|
|
449
|
+
contextMode: "research",
|
|
431
450
|
tools: TOOLS_PLANNING,
|
|
432
451
|
artifacts: {
|
|
433
452
|
inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
|
|
@@ -442,6 +461,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
442
461
|
memory: "prompt-relevant",
|
|
443
462
|
codebaseMap: true,
|
|
444
463
|
preferences: "active-only",
|
|
464
|
+
contextMode: "planning",
|
|
445
465
|
// planning-dispatch: allows subagent dispatch so the planner can fan out
|
|
446
466
|
// to scout for codebase recon and to planner/decompose-style specialists
|
|
447
467
|
// for sub-decomposition. Write-isolation to .gsd/ is preserved.
|
|
@@ -459,6 +479,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
459
479
|
memory: "prompt-relevant",
|
|
460
480
|
codebaseMap: true,
|
|
461
481
|
preferences: "active-only",
|
|
482
|
+
contextMode: "planning",
|
|
462
483
|
// See plan-slice — same rationale: dispatch to scout/planner-style
|
|
463
484
|
// specialists during refinement is materially better than re-doing recon
|
|
464
485
|
// inline.
|
|
@@ -476,6 +497,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
476
497
|
memory: "prompt-relevant",
|
|
477
498
|
codebaseMap: true,
|
|
478
499
|
preferences: "active-only",
|
|
500
|
+
contextMode: "planning",
|
|
479
501
|
tools: TOOLS_PLANNING,
|
|
480
502
|
artifacts: {
|
|
481
503
|
inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
|
|
@@ -490,6 +512,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
490
512
|
memory: "prompt-relevant",
|
|
491
513
|
codebaseMap: false,
|
|
492
514
|
preferences: "active-only",
|
|
515
|
+
contextMode: "verification",
|
|
493
516
|
// See complete-milestone — same rationale: dispatch to reviewer / security /
|
|
494
517
|
// tester subagents to fan out review work without bloating this unit's
|
|
495
518
|
// context.
|
|
@@ -511,6 +534,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
511
534
|
memory: "critical-only",
|
|
512
535
|
codebaseMap: false,
|
|
513
536
|
preferences: "none",
|
|
537
|
+
contextMode: "planning",
|
|
514
538
|
tools: TOOLS_PLANNING,
|
|
515
539
|
artifacts: {
|
|
516
540
|
// Phase 2 pilot (#4782): manifest now matches today's actual
|
|
@@ -530,6 +554,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
530
554
|
memory: "prompt-relevant",
|
|
531
555
|
codebaseMap: true,
|
|
532
556
|
preferences: "active-only",
|
|
557
|
+
contextMode: "execution",
|
|
533
558
|
tools: TOOLS_ALL,
|
|
534
559
|
artifacts: {
|
|
535
560
|
inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
|
|
@@ -544,6 +569,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
544
569
|
memory: "prompt-relevant",
|
|
545
570
|
codebaseMap: true,
|
|
546
571
|
preferences: "active-only",
|
|
572
|
+
contextMode: "execution",
|
|
547
573
|
tools: TOOLS_ALL,
|
|
548
574
|
artifacts: {
|
|
549
575
|
inline: ["slice-plan", "prior-task-summaries", "templates"],
|
|
@@ -560,6 +586,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
560
586
|
memory: "critical-only",
|
|
561
587
|
codebaseMap: false,
|
|
562
588
|
preferences: "active-only",
|
|
589
|
+
contextMode: "verification",
|
|
563
590
|
tools: TOOLS_PLANNING,
|
|
564
591
|
artifacts: {
|
|
565
592
|
// Phase 3 migration (#4782): manifest matches today's actual
|
|
@@ -578,6 +605,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
578
605
|
memory: "critical-only",
|
|
579
606
|
codebaseMap: false,
|
|
580
607
|
preferences: "active-only",
|
|
608
|
+
contextMode: "verification",
|
|
581
609
|
tools: TOOLS_PLANNING,
|
|
582
610
|
artifacts: {
|
|
583
611
|
inline: ["slice-plan", "prior-task-summaries"],
|
|
@@ -592,6 +620,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
592
620
|
memory: "prompt-relevant",
|
|
593
621
|
codebaseMap: true,
|
|
594
622
|
preferences: "active-only",
|
|
623
|
+
contextMode: "docs",
|
|
595
624
|
tools: TOOLS_DOCS,
|
|
596
625
|
artifacts: {
|
|
597
626
|
inline: ["project", "requirements", "decisions", "templates"],
|
|
@@ -611,6 +640,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
611
640
|
memory: "none",
|
|
612
641
|
codebaseMap: false,
|
|
613
642
|
preferences: "none",
|
|
643
|
+
contextMode: "none",
|
|
614
644
|
tools: TOOLS_PLANNING,
|
|
615
645
|
artifacts: {
|
|
616
646
|
inline: [],
|
|
@@ -628,6 +658,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
628
658
|
memory: "prompt-relevant",
|
|
629
659
|
codebaseMap: true,
|
|
630
660
|
preferences: "active-only",
|
|
661
|
+
contextMode: "interview",
|
|
631
662
|
tools: TOOLS_PLANNING,
|
|
632
663
|
artifacts: {
|
|
633
664
|
inline: ["templates"],
|
|
@@ -644,6 +675,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
644
675
|
memory: "prompt-relevant",
|
|
645
676
|
codebaseMap: true,
|
|
646
677
|
preferences: "active-only",
|
|
678
|
+
contextMode: "interview",
|
|
647
679
|
tools: TOOLS_PLANNING,
|
|
648
680
|
artifacts: {
|
|
649
681
|
inline: ["project", "templates"],
|
|
@@ -660,6 +692,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
660
692
|
memory: "none",
|
|
661
693
|
codebaseMap: false,
|
|
662
694
|
preferences: "none",
|
|
695
|
+
contextMode: "none",
|
|
663
696
|
tools: TOOLS_PLANNING,
|
|
664
697
|
artifacts: {
|
|
665
698
|
inline: [],
|
|
@@ -678,6 +711,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
678
711
|
memory: "prompt-relevant",
|
|
679
712
|
codebaseMap: true,
|
|
680
713
|
preferences: "active-only",
|
|
714
|
+
contextMode: "research",
|
|
681
715
|
tools: { mode: "planning-dispatch", allowedSubagents: ["scout"] },
|
|
682
716
|
artifacts: {
|
|
683
717
|
inline: ["project", "requirements", "templates"],
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// GSD2 UOK Audit Events and DB-First Projection Writes
|
|
2
|
+
|
|
1
3
|
import { appendFileSync, closeSync, existsSync, mkdirSync, openSync } from "node:fs";
|
|
2
4
|
import { join } from "node:path";
|
|
3
5
|
import { randomUUID } from "node:crypto";
|
|
@@ -6,7 +8,7 @@ import { isStaleWrite } from "../auto/turn-epoch.js";
|
|
|
6
8
|
import { withFileLockSync } from "../file-lock.js";
|
|
7
9
|
import { gsdRoot } from "../paths.js";
|
|
8
10
|
import { isDbAvailable, insertAuditEvent } from "../gsd-db.js";
|
|
9
|
-
import type
|
|
11
|
+
import { CURRENT_UOK_CONTRACT_VERSION, validateAuditEvent, type AuditEventEnvelope } from "./contracts.js";
|
|
10
12
|
|
|
11
13
|
function auditLogPath(basePath: string): string {
|
|
12
14
|
return join(gsdRoot(basePath), "audit", "events.jsonl");
|
|
@@ -25,6 +27,7 @@ export function buildAuditEnvelope(args: {
|
|
|
25
27
|
payload?: Record<string, unknown>;
|
|
26
28
|
}): AuditEventEnvelope {
|
|
27
29
|
return {
|
|
30
|
+
version: CURRENT_UOK_CONTRACT_VERSION,
|
|
28
31
|
eventId: randomUUID(),
|
|
29
32
|
traceId: args.traceId,
|
|
30
33
|
turnId: args.turnId,
|
|
@@ -39,6 +42,26 @@ export function buildAuditEnvelope(args: {
|
|
|
39
42
|
export function emitUokAuditEvent(basePath: string, event: AuditEventEnvelope): void {
|
|
40
43
|
// Drop writes from a turn superseded by timeout recovery / cancellation.
|
|
41
44
|
if (isStaleWrite("uok-audit")) return;
|
|
45
|
+
const validation = validateAuditEvent(event);
|
|
46
|
+
if (!validation.ok) {
|
|
47
|
+
throw new Error(`Invalid UOK audit event: ${validation.issues.map((issue) => `${issue.path}: ${issue.message}`).join("; ")}`);
|
|
48
|
+
}
|
|
49
|
+
const canonical = validation.value;
|
|
50
|
+
|
|
51
|
+
if (isDbAvailable()) {
|
|
52
|
+
try {
|
|
53
|
+
insertAuditEvent({
|
|
54
|
+
...canonical,
|
|
55
|
+
payload: {
|
|
56
|
+
...canonical.payload,
|
|
57
|
+
contractVersion: canonical.version ?? CURRENT_UOK_CONTRACT_VERSION,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
} catch (err) {
|
|
61
|
+
throw new Error(`DB authoritative audit write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
42
65
|
try {
|
|
43
66
|
ensureAuditDir(basePath);
|
|
44
67
|
const path = auditLogPath(basePath);
|
|
@@ -52,18 +75,11 @@ export function emitUokAuditEvent(basePath: string, event: AuditEventEnvelope):
|
|
|
52
75
|
withFileLockSync(
|
|
53
76
|
path,
|
|
54
77
|
() => {
|
|
55
|
-
appendFileSync(path, `${JSON.stringify(
|
|
78
|
+
appendFileSync(path, `${JSON.stringify(canonical)}\n`, "utf-8");
|
|
56
79
|
},
|
|
57
80
|
{ onLocked: "skip" },
|
|
58
81
|
);
|
|
59
82
|
} catch {
|
|
60
83
|
// Best-effort: audit writes must never break orchestration.
|
|
61
84
|
}
|
|
62
|
-
|
|
63
|
-
if (!isDbAvailable()) return;
|
|
64
|
-
try {
|
|
65
|
-
insertAuditEvent(event);
|
|
66
|
-
} catch {
|
|
67
|
-
// Projection failures are non-fatal while legacy readers are still active.
|
|
68
|
-
}
|
|
69
85
|
}
|