gsd-pi 2.74.0 → 2.75.0-dev.fd2382b9f
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 +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/cli.js +85 -0
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless-query.js +4 -1
- package/dist/headless.js +5 -6
- package/dist/help-text.js +23 -0
- package/dist/loader.js +0 -0
- package/dist/onboarding.js +39 -14
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +20 -4
- package/dist/resources/extensions/gsd/auto/loop.js +214 -14
- package/dist/resources/extensions/gsd/auto/phases.js +273 -51
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +15 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +123 -7
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +64 -10
- package/dist/resources/extensions/gsd/auto-post-unit.js +229 -24
- package/dist/resources/extensions/gsd/auto-prompts.js +159 -33
- package/dist/resources/extensions/gsd/auto-recovery.js +81 -10
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +103 -5
- package/dist/resources/extensions/gsd/auto-worktree.js +57 -1
- package/dist/resources/extensions/gsd/auto.js +84 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +22 -4
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +83 -9
- package/dist/resources/extensions/gsd/cache.js +16 -5
- package/dist/resources/extensions/gsd/commands/catalog.js +97 -3
- package/dist/resources/extensions/gsd/commands/handlers/core.js +11 -1
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +41 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +295 -37
- package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
- package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +80 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
- package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
- package/dist/resources/extensions/gsd/commands-ship.js +187 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +4 -5
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +17 -2
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +49 -2
- package/dist/resources/extensions/gsd/graph-context.js +157 -0
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +822 -18
- package/dist/resources/extensions/gsd/guided-flow.js +31 -6
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/index.js +15 -2
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/md-importer.js +3 -4
- package/dist/resources/extensions/gsd/memory-store.js +19 -51
- package/dist/resources/extensions/gsd/metrics.js +20 -0
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +7 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +144 -9
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
- package/dist/resources/extensions/gsd/preferences-models.js +21 -3
- package/dist/resources/extensions/gsd/preferences-types.js +4 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +160 -10
- package/dist/resources/extensions/gsd/preferences.js +41 -10
- package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/state.js +52 -4
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +85 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +16 -69
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
- package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +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/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 +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.02df9631042cc18e.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-6c7cda3e318eedb6.js} +1 -1
- package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +5 -4
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/index.d.ts +3 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/index.js +3 -0
- package/packages/mcp-server/dist/index.js.map +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/graph.js +655 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +2 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/index.js +1 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +65 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +88 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/index.ts +15 -0
- package/packages/mcp-server/src/readers/graph.test.ts +604 -0
- package/packages/mcp-server/src/readers/graph.ts +855 -0
- package/packages/mcp-server/src/readers/index.ts +12 -0
- package/packages/mcp-server/src/server.ts +83 -0
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.json +1 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
- package/packages/native/package.json +2 -2
- package/packages/native/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.json +1 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-ai/dist/index.d.ts +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +37 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1550 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1552 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +394 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +396 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +173 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +175 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +158 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +137 -154
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +158 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4287 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4289 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +18 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +18 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +2 -2
- package/packages/pi-ai/scripts/generate-models.ts +124 -40
- package/packages/pi-ai/src/index.ts +1 -9
- package/packages/pi-ai/src/models/capability-patches.ts +43 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1554 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +398 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +177 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +160 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +160 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4291 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +18 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +19 -1
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +476 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -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/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +63 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- 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 +68 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +315 -51
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
- 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 +70 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +616 -1
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +87 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +386 -77
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +9 -1
- package/packages/pi-tui/tsconfig.json +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.json +1 -0
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +22 -4
- package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -0
- package/src/resources/extensions/gsd/auto/loop.ts +268 -13
- package/src/resources/extensions/gsd/auto/phases.ts +349 -64
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +17 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +139 -11
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +82 -10
- package/src/resources/extensions/gsd/auto-post-unit.ts +247 -25
- package/src/resources/extensions/gsd/auto-prompts.ts +188 -35
- package/src/resources/extensions/gsd/auto-recovery.ts +92 -10
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +132 -5
- package/src/resources/extensions/gsd/auto-worktree.ts +66 -0
- package/src/resources/extensions/gsd/auto.ts +92 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +94 -8
- package/src/resources/extensions/gsd/cache.ts +16 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +90 -3
- package/src/resources/extensions/gsd/commands/handlers/core.ts +11 -1
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +352 -37
- package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
- package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +110 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
- package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
- package/src/resources/extensions/gsd/commands-ship.ts +219 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +6 -5
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +17 -2
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +68 -1
- package/src/resources/extensions/gsd/graph-context.ts +212 -0
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +1083 -21
- package/src/resources/extensions/gsd/guided-flow.ts +36 -2
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/index.ts +18 -2
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -5
- package/src/resources/extensions/gsd/memory-store.ts +31 -62
- package/src/resources/extensions/gsd/metrics.ts +27 -0
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +15 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +145 -18
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
- package/src/resources/extensions/gsd/preferences-models.ts +21 -3
- package/src/resources/extensions/gsd/preferences-types.ts +47 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +150 -9
- package/src/resources/extensions/gsd/preferences.ts +44 -10
- package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/state.ts +59 -4
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +49 -31
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +22 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +39 -19
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +242 -5
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +214 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +90 -2
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
- package/src/resources/extensions/gsd/types.ts +76 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +136 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +117 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +17 -104
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
- package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{JpjdI2QtmIkQr4xz6gbhM → jaWw1Jh0TYayjbfOrFe8D}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{JpjdI2QtmIkQr4xz6gbhM → jaWw1Jh0TYayjbfOrFe8D}/_ssgManifest.js +0 -0
|
@@ -4,6 +4,21 @@
|
|
|
4
4
|
//
|
|
5
5
|
// Exposes a unified sync API for decisions and requirements storage.
|
|
6
6
|
// Schema is initialized on first open with WAL mode for file-backed DBs.
|
|
7
|
+
//
|
|
8
|
+
// ─── Single-writer invariant ─────────────────────────────────────────────
|
|
9
|
+
// This file is the ONLY place in the codebase that issues write SQL
|
|
10
|
+
// (INSERT / UPDATE / DELETE / REPLACE / BEGIN-COMMIT transactions) against
|
|
11
|
+
// the engine database at `.gsd/gsd.db`. All other modules must call the
|
|
12
|
+
// typed wrappers exported here. The structural test
|
|
13
|
+
// `tests/single-writer-invariant.test.ts` fails CI if a new bypass appears.
|
|
14
|
+
//
|
|
15
|
+
// `_getAdapter()` is retained for read-only SELECTs in query modules
|
|
16
|
+
// (context-store, memory-store queries, doctor checks, projections).
|
|
17
|
+
// Do NOT use it for writes — add a wrapper here instead.
|
|
18
|
+
//
|
|
19
|
+
// The separate `.gsd/unit-claims.db` managed by `unit-ownership.ts` is an
|
|
20
|
+
// intentionally independent store for cross-worktree claim races and is
|
|
21
|
+
// excluded from this invariant.
|
|
7
22
|
import { createRequire } from "node:module";
|
|
8
23
|
import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
|
|
9
24
|
import { dirname } from "node:path";
|
|
@@ -16,7 +31,7 @@ let providerModule = null;
|
|
|
16
31
|
let loadAttempted = false;
|
|
17
32
|
function suppressSqliteWarning() {
|
|
18
33
|
const origEmit = process.emit;
|
|
19
|
-
//
|
|
34
|
+
// Override via loose cast: Node's overloaded emit signature is not directly assignable.
|
|
20
35
|
process.emit = function (event, ...args) {
|
|
21
36
|
if (event === "warning" &&
|
|
22
37
|
args[0] &&
|
|
@@ -120,7 +135,7 @@ function openRawDb(path) {
|
|
|
120
135
|
const Database = providerModule;
|
|
121
136
|
return new Database(path);
|
|
122
137
|
}
|
|
123
|
-
const SCHEMA_VERSION =
|
|
138
|
+
const SCHEMA_VERSION = 17;
|
|
124
139
|
function indexExists(db, name) {
|
|
125
140
|
return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
|
|
126
141
|
}
|
|
@@ -174,6 +189,7 @@ function initSchema(db, fileBacked) {
|
|
|
174
189
|
rationale TEXT NOT NULL DEFAULT '',
|
|
175
190
|
revisable TEXT NOT NULL DEFAULT '',
|
|
176
191
|
made_by TEXT NOT NULL DEFAULT 'agent',
|
|
192
|
+
source TEXT NOT NULL DEFAULT 'discussion', -- ADR-011 P2: 'discussion' | 'planning' | 'escalation'
|
|
177
193
|
superseded_by TEXT DEFAULT NULL
|
|
178
194
|
)
|
|
179
195
|
`);
|
|
@@ -267,6 +283,8 @@ function initSchema(db, fileBacked) {
|
|
|
267
283
|
observability_impact TEXT NOT NULL DEFAULT '',
|
|
268
284
|
sequence INTEGER DEFAULT 0, -- Ordering hint: tools may set this to control execution order
|
|
269
285
|
replan_triggered_at TEXT DEFAULT NULL,
|
|
286
|
+
is_sketch INTEGER NOT NULL DEFAULT 0, -- ADR-011: 1 = slice is a sketch awaiting refinement
|
|
287
|
+
sketch_scope TEXT NOT NULL DEFAULT '', -- ADR-011: 2-3 sentence rough scope from plan-milestone
|
|
270
288
|
PRIMARY KEY (milestone_id, id),
|
|
271
289
|
FOREIGN KEY (milestone_id) REFERENCES milestones(id)
|
|
272
290
|
)
|
|
@@ -284,6 +302,11 @@ function initSchema(db, fileBacked) {
|
|
|
284
302
|
duration TEXT NOT NULL DEFAULT '',
|
|
285
303
|
completed_at TEXT DEFAULT NULL,
|
|
286
304
|
blocker_discovered INTEGER DEFAULT 0,
|
|
305
|
+
blocker_source TEXT NOT NULL DEFAULT '', -- ADR-011 P2: provenance for blocker_discovered (e.g. 'reject-escalation')
|
|
306
|
+
escalation_pending INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: pause-on-escalation flag
|
|
307
|
+
escalation_awaiting_review INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: artifact exists but continueWithDefault=true (no pause)
|
|
308
|
+
escalation_artifact_path TEXT DEFAULT NULL, -- ADR-011 P2: path to T##-ESCALATION.json
|
|
309
|
+
escalation_override_applied_at TEXT DEFAULT NULL, -- ADR-011 P2: DB claim lock for idempotent override injection
|
|
287
310
|
deviations TEXT NOT NULL DEFAULT '',
|
|
288
311
|
known_issues TEXT NOT NULL DEFAULT '',
|
|
289
312
|
key_files TEXT NOT NULL DEFAULT '[]',
|
|
@@ -368,6 +391,66 @@ function initSchema(db, fileBacked) {
|
|
|
368
391
|
FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id),
|
|
369
392
|
FOREIGN KEY (milestone_id, depends_on_slice_id) REFERENCES slices(milestone_id, id)
|
|
370
393
|
)
|
|
394
|
+
`);
|
|
395
|
+
db.exec(`
|
|
396
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
397
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
398
|
+
trace_id TEXT NOT NULL,
|
|
399
|
+
turn_id TEXT NOT NULL,
|
|
400
|
+
gate_id TEXT NOT NULL,
|
|
401
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
402
|
+
unit_type TEXT DEFAULT NULL,
|
|
403
|
+
unit_id TEXT DEFAULT NULL,
|
|
404
|
+
milestone_id TEXT DEFAULT NULL,
|
|
405
|
+
slice_id TEXT DEFAULT NULL,
|
|
406
|
+
task_id TEXT DEFAULT NULL,
|
|
407
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
408
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
409
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
410
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
411
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
412
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
413
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
414
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
415
|
+
)
|
|
416
|
+
`);
|
|
417
|
+
db.exec(`
|
|
418
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
419
|
+
trace_id TEXT NOT NULL,
|
|
420
|
+
turn_id TEXT NOT NULL,
|
|
421
|
+
unit_type TEXT DEFAULT NULL,
|
|
422
|
+
unit_id TEXT DEFAULT NULL,
|
|
423
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
424
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
425
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
426
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
427
|
+
error TEXT DEFAULT NULL,
|
|
428
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
429
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
430
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
431
|
+
)
|
|
432
|
+
`);
|
|
433
|
+
db.exec(`
|
|
434
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
435
|
+
event_id TEXT PRIMARY KEY,
|
|
436
|
+
trace_id TEXT NOT NULL,
|
|
437
|
+
turn_id TEXT DEFAULT NULL,
|
|
438
|
+
caused_by TEXT DEFAULT NULL,
|
|
439
|
+
category TEXT NOT NULL,
|
|
440
|
+
type TEXT NOT NULL,
|
|
441
|
+
ts TEXT NOT NULL,
|
|
442
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
443
|
+
)
|
|
444
|
+
`);
|
|
445
|
+
db.exec(`
|
|
446
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
447
|
+
trace_id TEXT NOT NULL,
|
|
448
|
+
turn_id TEXT NOT NULL,
|
|
449
|
+
first_ts TEXT NOT NULL,
|
|
450
|
+
last_ts TEXT NOT NULL,
|
|
451
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
452
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
453
|
+
)
|
|
371
454
|
`);
|
|
372
455
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
373
456
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
@@ -380,6 +463,14 @@ function initSchema(db, fileBacked) {
|
|
|
380
463
|
ensureVerificationEvidenceDedupIndex(db);
|
|
381
464
|
// v14 index — slice dependency lookups
|
|
382
465
|
db.exec("CREATE INDEX IF NOT EXISTS idx_slice_deps_target ON slice_dependencies(milestone_id, depends_on_slice_id)");
|
|
466
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
467
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
468
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
469
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
470
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
471
|
+
// ADR-011 Phase 2 — also created by the v17 migration; fresh installs
|
|
472
|
+
// skip migrations so the index must be created here too.
|
|
473
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
383
474
|
db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
|
|
384
475
|
db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
|
|
385
476
|
db.exec(`CREATE VIEW IF NOT EXISTS active_memories AS SELECT * FROM memories WHERE superseded_by IS NULL`);
|
|
@@ -710,6 +801,101 @@ function migrateSchema(db) {
|
|
|
710
801
|
":applied_at": new Date().toISOString(),
|
|
711
802
|
});
|
|
712
803
|
}
|
|
804
|
+
if (currentVersion < 15) {
|
|
805
|
+
db.exec(`
|
|
806
|
+
CREATE TABLE IF NOT EXISTS gate_runs (
|
|
807
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
808
|
+
trace_id TEXT NOT NULL,
|
|
809
|
+
turn_id TEXT NOT NULL,
|
|
810
|
+
gate_id TEXT NOT NULL,
|
|
811
|
+
gate_type TEXT NOT NULL DEFAULT '',
|
|
812
|
+
unit_type TEXT DEFAULT NULL,
|
|
813
|
+
unit_id TEXT DEFAULT NULL,
|
|
814
|
+
milestone_id TEXT DEFAULT NULL,
|
|
815
|
+
slice_id TEXT DEFAULT NULL,
|
|
816
|
+
task_id TEXT DEFAULT NULL,
|
|
817
|
+
outcome TEXT NOT NULL DEFAULT 'pass',
|
|
818
|
+
failure_class TEXT NOT NULL DEFAULT 'none',
|
|
819
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
820
|
+
findings TEXT NOT NULL DEFAULT '',
|
|
821
|
+
attempt INTEGER NOT NULL DEFAULT 1,
|
|
822
|
+
max_attempts INTEGER NOT NULL DEFAULT 1,
|
|
823
|
+
retryable INTEGER NOT NULL DEFAULT 0,
|
|
824
|
+
evaluated_at TEXT NOT NULL DEFAULT ''
|
|
825
|
+
)
|
|
826
|
+
`);
|
|
827
|
+
db.exec(`
|
|
828
|
+
CREATE TABLE IF NOT EXISTS turn_git_transactions (
|
|
829
|
+
trace_id TEXT NOT NULL,
|
|
830
|
+
turn_id TEXT NOT NULL,
|
|
831
|
+
unit_type TEXT DEFAULT NULL,
|
|
832
|
+
unit_id TEXT DEFAULT NULL,
|
|
833
|
+
stage TEXT NOT NULL DEFAULT 'turn-start',
|
|
834
|
+
action TEXT NOT NULL DEFAULT 'status-only',
|
|
835
|
+
push INTEGER NOT NULL DEFAULT 0,
|
|
836
|
+
status TEXT NOT NULL DEFAULT 'ok',
|
|
837
|
+
error TEXT DEFAULT NULL,
|
|
838
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
839
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
840
|
+
PRIMARY KEY (trace_id, turn_id, stage)
|
|
841
|
+
)
|
|
842
|
+
`);
|
|
843
|
+
db.exec(`
|
|
844
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
845
|
+
event_id TEXT PRIMARY KEY,
|
|
846
|
+
trace_id TEXT NOT NULL,
|
|
847
|
+
turn_id TEXT DEFAULT NULL,
|
|
848
|
+
caused_by TEXT DEFAULT NULL,
|
|
849
|
+
category TEXT NOT NULL,
|
|
850
|
+
type TEXT NOT NULL,
|
|
851
|
+
ts TEXT NOT NULL,
|
|
852
|
+
payload_json TEXT NOT NULL DEFAULT '{}'
|
|
853
|
+
)
|
|
854
|
+
`);
|
|
855
|
+
db.exec(`
|
|
856
|
+
CREATE TABLE IF NOT EXISTS audit_turn_index (
|
|
857
|
+
trace_id TEXT NOT NULL,
|
|
858
|
+
turn_id TEXT NOT NULL,
|
|
859
|
+
first_ts TEXT NOT NULL,
|
|
860
|
+
last_ts TEXT NOT NULL,
|
|
861
|
+
event_count INTEGER NOT NULL DEFAULT 0,
|
|
862
|
+
PRIMARY KEY (trace_id, turn_id)
|
|
863
|
+
)
|
|
864
|
+
`);
|
|
865
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
|
|
866
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
|
|
867
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
|
|
868
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
|
|
869
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
|
|
870
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
871
|
+
":version": 15,
|
|
872
|
+
":applied_at": new Date().toISOString(),
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
if (currentVersion < 16) {
|
|
876
|
+
// ADR-011 Phase 1: sketch-then-refine progressive planning — sketch columns on slices.
|
|
877
|
+
ensureColumn(db, "slices", "is_sketch", `ALTER TABLE slices ADD COLUMN is_sketch INTEGER NOT NULL DEFAULT 0`);
|
|
878
|
+
ensureColumn(db, "slices", "sketch_scope", `ALTER TABLE slices ADD COLUMN sketch_scope TEXT NOT NULL DEFAULT ''`);
|
|
879
|
+
// ADR-011 Phase 2: decisions can now be sourced from escalation resolutions.
|
|
880
|
+
ensureColumn(db, "decisions", "source", `ALTER TABLE decisions ADD COLUMN source TEXT NOT NULL DEFAULT 'discussion'`);
|
|
881
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
882
|
+
":version": 16,
|
|
883
|
+
":applied_at": new Date().toISOString(),
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
if (currentVersion < 17) {
|
|
887
|
+
// ADR-011 Phase 2: mid-execution escalation — columns on the tasks table.
|
|
888
|
+
ensureColumn(db, "tasks", "blocker_source", `ALTER TABLE tasks ADD COLUMN blocker_source TEXT NOT NULL DEFAULT ''`);
|
|
889
|
+
ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
|
|
890
|
+
ensureColumn(db, "tasks", "escalation_awaiting_review", `ALTER TABLE tasks ADD COLUMN escalation_awaiting_review INTEGER NOT NULL DEFAULT 0`);
|
|
891
|
+
ensureColumn(db, "tasks", "escalation_artifact_path", `ALTER TABLE tasks ADD COLUMN escalation_artifact_path TEXT DEFAULT NULL`);
|
|
892
|
+
ensureColumn(db, "tasks", "escalation_override_applied_at", `ALTER TABLE tasks ADD COLUMN escalation_override_applied_at TEXT DEFAULT NULL`);
|
|
893
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
|
|
894
|
+
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
895
|
+
":version": 17,
|
|
896
|
+
":applied_at": new Date().toISOString(),
|
|
897
|
+
});
|
|
898
|
+
}
|
|
713
899
|
db.exec("COMMIT");
|
|
714
900
|
}
|
|
715
901
|
catch (err) {
|
|
@@ -833,6 +1019,17 @@ export function vacuumDatabase() {
|
|
|
833
1019
|
logWarning("db", `VACUUM failed: ${e.message}`);
|
|
834
1020
|
}
|
|
835
1021
|
}
|
|
1022
|
+
/** Flush WAL into gsd.db so `git add .gsd/gsd.db` stages current state — safe while DB is open. */
|
|
1023
|
+
export function checkpointDatabase() {
|
|
1024
|
+
if (!currentDb)
|
|
1025
|
+
return;
|
|
1026
|
+
try {
|
|
1027
|
+
currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
1028
|
+
}
|
|
1029
|
+
catch (e) {
|
|
1030
|
+
logWarning("db", `WAL checkpoint failed: ${e.message}`);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
836
1033
|
let _txDepth = 0;
|
|
837
1034
|
export function transaction(fn) {
|
|
838
1035
|
if (!currentDb)
|
|
@@ -863,11 +1060,55 @@ export function transaction(fn) {
|
|
|
863
1060
|
_txDepth--;
|
|
864
1061
|
}
|
|
865
1062
|
}
|
|
1063
|
+
/**
|
|
1064
|
+
* Wrap a block of reads in a DEFERRED transaction so that all SELECTs observe
|
|
1065
|
+
* a consistent snapshot of the DB even if a concurrent writer commits between
|
|
1066
|
+
* them. Use this for multi-query read flows (e.g. tool executors that query
|
|
1067
|
+
* milestone + slices + counts and want one snapshot). Re-entrant — if already
|
|
1068
|
+
* inside a transaction, runs fn() without starting a nested one.
|
|
1069
|
+
*/
|
|
1070
|
+
export function readTransaction(fn) {
|
|
1071
|
+
if (!currentDb)
|
|
1072
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1073
|
+
if (_txDepth > 0) {
|
|
1074
|
+
_txDepth++;
|
|
1075
|
+
try {
|
|
1076
|
+
return fn();
|
|
1077
|
+
}
|
|
1078
|
+
finally {
|
|
1079
|
+
_txDepth--;
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
_txDepth++;
|
|
1083
|
+
currentDb.exec("BEGIN DEFERRED");
|
|
1084
|
+
try {
|
|
1085
|
+
const result = fn();
|
|
1086
|
+
currentDb.exec("COMMIT");
|
|
1087
|
+
return result;
|
|
1088
|
+
}
|
|
1089
|
+
catch (err) {
|
|
1090
|
+
try {
|
|
1091
|
+
currentDb.exec("ROLLBACK");
|
|
1092
|
+
}
|
|
1093
|
+
catch (rollbackErr) {
|
|
1094
|
+
// A failed ROLLBACK after a failed read is a split-brain signal —
|
|
1095
|
+
// the transaction is in an indeterminate state. Surface it via the
|
|
1096
|
+
// logger instead of swallowing it.
|
|
1097
|
+
logError("db", "snapshotState ROLLBACK failed", {
|
|
1098
|
+
error: rollbackErr.message,
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
throw err;
|
|
1102
|
+
}
|
|
1103
|
+
finally {
|
|
1104
|
+
_txDepth--;
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
866
1107
|
export function insertDecision(d) {
|
|
867
1108
|
if (!currentDb)
|
|
868
1109
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
869
|
-
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
870
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)`).run({
|
|
1110
|
+
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1111
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)`).run({
|
|
871
1112
|
":id": d.id,
|
|
872
1113
|
":when_context": d.when_context,
|
|
873
1114
|
":scope": d.scope,
|
|
@@ -876,6 +1117,7 @@ export function insertDecision(d) {
|
|
|
876
1117
|
":rationale": d.rationale,
|
|
877
1118
|
":revisable": d.revisable,
|
|
878
1119
|
":made_by": d.made_by ?? "agent",
|
|
1120
|
+
":source": d.source ?? "discussion",
|
|
879
1121
|
":superseded_by": d.superseded_by,
|
|
880
1122
|
});
|
|
881
1123
|
}
|
|
@@ -895,6 +1137,7 @@ export function getDecisionById(id) {
|
|
|
895
1137
|
rationale: row["rationale"],
|
|
896
1138
|
revisable: row["revisable"],
|
|
897
1139
|
made_by: row["made_by"] ?? "agent",
|
|
1140
|
+
source: row["source"] ?? "discussion",
|
|
898
1141
|
superseded_by: row["superseded_by"] ?? null,
|
|
899
1142
|
};
|
|
900
1143
|
}
|
|
@@ -912,6 +1155,7 @@ export function getActiveDecisions() {
|
|
|
912
1155
|
rationale: row["rationale"],
|
|
913
1156
|
revisable: row["revisable"],
|
|
914
1157
|
made_by: row["made_by"] ?? "agent",
|
|
1158
|
+
source: row["source"] ?? "discussion",
|
|
915
1159
|
superseded_by: null,
|
|
916
1160
|
}));
|
|
917
1161
|
}
|
|
@@ -994,8 +1238,8 @@ export function upsertDecision(d) {
|
|
|
994
1238
|
// Use ON CONFLICT DO UPDATE instead of INSERT OR REPLACE to preserve the
|
|
995
1239
|
// seq column. INSERT OR REPLACE deletes then reinserts, resetting seq and
|
|
996
1240
|
// corrupting decision ordering in DECISIONS.md after reconcile replay.
|
|
997
|
-
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
|
|
998
|
-
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)
|
|
1241
|
+
currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
1242
|
+
VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)
|
|
999
1243
|
ON CONFLICT(id) DO UPDATE SET
|
|
1000
1244
|
when_context = excluded.when_context,
|
|
1001
1245
|
scope = excluded.scope,
|
|
@@ -1004,6 +1248,7 @@ export function upsertDecision(d) {
|
|
|
1004
1248
|
rationale = excluded.rationale,
|
|
1005
1249
|
revisable = excluded.revisable,
|
|
1006
1250
|
made_by = excluded.made_by,
|
|
1251
|
+
source = excluded.source,
|
|
1007
1252
|
superseded_by = excluded.superseded_by`).run({
|
|
1008
1253
|
":id": d.id,
|
|
1009
1254
|
":when_context": d.when_context,
|
|
@@ -1013,6 +1258,7 @@ export function upsertDecision(d) {
|
|
|
1013
1258
|
":rationale": d.rationale,
|
|
1014
1259
|
":revisable": d.revisable,
|
|
1015
1260
|
":made_by": d.made_by ?? "agent",
|
|
1261
|
+
":source": d.source ?? "discussion",
|
|
1016
1262
|
":superseded_by": d.superseded_by ?? null,
|
|
1017
1263
|
});
|
|
1018
1264
|
}
|
|
@@ -1132,10 +1378,12 @@ export function insertSlice(s) {
|
|
|
1132
1378
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1133
1379
|
currentDb.prepare(`INSERT INTO slices (
|
|
1134
1380
|
milestone_id, id, title, status, risk, depends, demo, created_at,
|
|
1135
|
-
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence
|
|
1381
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
|
|
1382
|
+
is_sketch, sketch_scope
|
|
1136
1383
|
) VALUES (
|
|
1137
1384
|
:milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
|
|
1138
|
-
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence
|
|
1385
|
+
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
|
|
1386
|
+
:is_sketch, :sketch_scope
|
|
1139
1387
|
)
|
|
1140
1388
|
ON CONFLICT (milestone_id, id) DO UPDATE SET
|
|
1141
1389
|
title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
|
|
@@ -1148,7 +1396,9 @@ export function insertSlice(s) {
|
|
|
1148
1396
|
proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
|
|
1149
1397
|
integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
|
|
1150
1398
|
observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
|
|
1151
|
-
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END
|
|
1399
|
+
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
|
|
1400
|
+
is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
|
|
1401
|
+
sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`).run({
|
|
1152
1402
|
":milestone_id": s.milestoneId,
|
|
1153
1403
|
":id": s.id,
|
|
1154
1404
|
":title": s.title ?? "",
|
|
@@ -1163,6 +1413,8 @@ export function insertSlice(s) {
|
|
|
1163
1413
|
":integration_closure": s.planning?.integrationClosure ?? "",
|
|
1164
1414
|
":observability_impact": s.planning?.observabilityImpact ?? "",
|
|
1165
1415
|
":sequence": s.sequence ?? 0,
|
|
1416
|
+
":is_sketch": s.isSketch ? 1 : 0,
|
|
1417
|
+
":sketch_scope": s.sketchScope ?? "",
|
|
1166
1418
|
// Raw sentinel params: NULL when caller omitted the field, used in ON CONFLICT guards
|
|
1167
1419
|
":raw_title": s.title ?? null,
|
|
1168
1420
|
":raw_risk": s.risk ?? null,
|
|
@@ -1173,8 +1425,47 @@ export function insertSlice(s) {
|
|
|
1173
1425
|
":raw_integration_closure": s.planning?.integrationClosure ?? null,
|
|
1174
1426
|
":raw_observability_impact": s.planning?.observabilityImpact ?? null,
|
|
1175
1427
|
":raw_sequence": s.sequence ?? null,
|
|
1428
|
+
":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
|
|
1429
|
+
// NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
|
|
1430
|
+
// as a present value and correctly clears the existing sketch_scope on
|
|
1431
|
+
// CONFLICT. ?? would incorrectly preserve the stale value.
|
|
1432
|
+
":raw_sketch_scope": s.sketchScope !== undefined ? s.sketchScope : null,
|
|
1176
1433
|
});
|
|
1177
1434
|
}
|
|
1435
|
+
// ADR-011: sketch-then-refine helpers
|
|
1436
|
+
export function setSliceSketchFlag(milestoneId, sliceId, isSketch) {
|
|
1437
|
+
if (!currentDb)
|
|
1438
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1439
|
+
currentDb.prepare(`UPDATE slices SET is_sketch = :is_sketch WHERE milestone_id = :mid AND id = :sid`).run({ ":is_sketch": isSketch ? 1 : 0, ":mid": milestoneId, ":sid": sliceId });
|
|
1440
|
+
}
|
|
1441
|
+
/**
|
|
1442
|
+
* ADR-011 auto-heal: reconcile stale is_sketch=1 rows whose PLAN already exists.
|
|
1443
|
+
*
|
|
1444
|
+
* Callers pass a predicate that resolves whether a plan file exists for a slice.
|
|
1445
|
+
* The predicate MUST use the canonical path resolver (`resolveSliceFile`, etc.)
|
|
1446
|
+
* to keep path logic in one place — do not hand-roll the path inside the callback.
|
|
1447
|
+
*
|
|
1448
|
+
* Recovers from two scenarios:
|
|
1449
|
+
* 1. Crash between `gsd_plan_slice` write and the sketch flag flip.
|
|
1450
|
+
* 2. Flag-OFF downgrade path: when `progressive_planning` is off, the dispatch
|
|
1451
|
+
* rule routes sketch slices to plan-slice, which writes PLAN.md but leaves
|
|
1452
|
+
* `is_sketch=1` — the next state derivation auto-heals it to 0 here.
|
|
1453
|
+
*
|
|
1454
|
+
* Not aggressive in practice: PLAN.md is only written via the DB-backed
|
|
1455
|
+
* `gsd_plan_slice` tool (which also inserts tasks), so a "stale PLAN.md with
|
|
1456
|
+
* is_sketch=1" is extremely unlikely to indicate anything other than the two
|
|
1457
|
+
* recovery scenarios above.
|
|
1458
|
+
*/
|
|
1459
|
+
export function autoHealSketchFlags(milestoneId, hasPlanFile) {
|
|
1460
|
+
if (!currentDb)
|
|
1461
|
+
return;
|
|
1462
|
+
const rows = currentDb.prepare(`SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`).all({ ":mid": milestoneId });
|
|
1463
|
+
for (const row of rows) {
|
|
1464
|
+
if (hasPlanFile(row.id)) {
|
|
1465
|
+
setSliceSketchFlag(milestoneId, row.id, false);
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1178
1469
|
export function upsertSlicePlanning(milestoneId, sliceId, planning) {
|
|
1179
1470
|
if (!currentDb)
|
|
1180
1471
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
@@ -1321,6 +1612,8 @@ function rowToSlice(row) {
|
|
|
1321
1612
|
observability_impact: row["observability_impact"] ?? "",
|
|
1322
1613
|
sequence: row["sequence"] ?? 0,
|
|
1323
1614
|
replan_triggered_at: row["replan_triggered_at"] ?? null,
|
|
1615
|
+
is_sketch: row["is_sketch"] ?? 0,
|
|
1616
|
+
sketch_scope: row["sketch_scope"] ?? "",
|
|
1324
1617
|
};
|
|
1325
1618
|
}
|
|
1326
1619
|
export function getSlice(milestoneId, sliceId) {
|
|
@@ -1421,6 +1714,11 @@ function rowToTask(row) {
|
|
|
1421
1714
|
observability_impact: row["observability_impact"] ?? "",
|
|
1422
1715
|
full_plan_md: row["full_plan_md"] ?? "",
|
|
1423
1716
|
sequence: row["sequence"] ?? 0,
|
|
1717
|
+
blocker_source: row["blocker_source"] ?? "",
|
|
1718
|
+
escalation_pending: row["escalation_pending"] ?? 0,
|
|
1719
|
+
escalation_awaiting_review: row["escalation_awaiting_review"] ?? 0,
|
|
1720
|
+
escalation_artifact_path: row["escalation_artifact_path"] ?? null,
|
|
1721
|
+
escalation_override_applied_at: row["escalation_override_applied_at"] ?? null,
|
|
1424
1722
|
};
|
|
1425
1723
|
}
|
|
1426
1724
|
export function getTask(milestoneId, sliceId, taskId) {
|
|
@@ -1437,6 +1735,95 @@ export function getSliceTasks(milestoneId, sliceId) {
|
|
|
1437
1735
|
const rows = currentDb.prepare("SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id").all({ ":mid": milestoneId, ":sid": sliceId });
|
|
1438
1736
|
return rows.map(rowToTask);
|
|
1439
1737
|
}
|
|
1738
|
+
// ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
|
|
1739
|
+
/** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
|
|
1740
|
+
export function setTaskEscalationPending(milestoneId, sliceId, taskId, artifactPath) {
|
|
1741
|
+
if (!currentDb)
|
|
1742
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1743
|
+
currentDb.prepare(`UPDATE tasks
|
|
1744
|
+
SET escalation_pending = 1,
|
|
1745
|
+
escalation_awaiting_review = 0,
|
|
1746
|
+
escalation_artifact_path = :path
|
|
1747
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1748
|
+
}
|
|
1749
|
+
/** Set awaiting-review state (artifact exists but continueWithDefault=true, no pause). Mutually exclusive with pending. */
|
|
1750
|
+
export function setTaskEscalationAwaitingReview(milestoneId, sliceId, taskId, artifactPath) {
|
|
1751
|
+
if (!currentDb)
|
|
1752
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1753
|
+
currentDb.prepare(`UPDATE tasks
|
|
1754
|
+
SET escalation_awaiting_review = 1,
|
|
1755
|
+
escalation_pending = 0,
|
|
1756
|
+
escalation_artifact_path = :path
|
|
1757
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1758
|
+
}
|
|
1759
|
+
/** Clear escalation-pending and awaiting-review flags once the user has resolved it. */
|
|
1760
|
+
export function clearTaskEscalationFlags(milestoneId, sliceId, taskId) {
|
|
1761
|
+
if (!currentDb)
|
|
1762
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1763
|
+
currentDb.prepare(`UPDATE tasks
|
|
1764
|
+
SET escalation_pending = 0,
|
|
1765
|
+
escalation_awaiting_review = 0
|
|
1766
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1767
|
+
}
|
|
1768
|
+
/**
|
|
1769
|
+
* Atomically claim a resolved escalation override for injection into a downstream
|
|
1770
|
+
* task's prompt. Returns true if this caller claimed it (must inject), false if
|
|
1771
|
+
* another caller already claimed it (must skip).
|
|
1772
|
+
*/
|
|
1773
|
+
export function claimEscalationOverride(milestoneId, sliceId, sourceTaskId) {
|
|
1774
|
+
if (!currentDb)
|
|
1775
|
+
return false;
|
|
1776
|
+
const now = new Date().toISOString();
|
|
1777
|
+
const result = currentDb.prepare(`UPDATE tasks
|
|
1778
|
+
SET escalation_override_applied_at = :now
|
|
1779
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid
|
|
1780
|
+
AND escalation_override_applied_at IS NULL
|
|
1781
|
+
AND escalation_artifact_path IS NOT NULL`).run({ ":now": now, ":mid": milestoneId, ":sid": sliceId, ":tid": sourceTaskId });
|
|
1782
|
+
// node:sqlite + better-sqlite3 both surface `changes` on the run result.
|
|
1783
|
+
const changes = result.changes ?? 0;
|
|
1784
|
+
return changes > 0;
|
|
1785
|
+
}
|
|
1786
|
+
/** Find the most recent resolved-but-unapplied escalation override in a slice. */
|
|
1787
|
+
export function findUnappliedEscalationOverride(milestoneId, sliceId) {
|
|
1788
|
+
if (!currentDb)
|
|
1789
|
+
return null;
|
|
1790
|
+
// Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
|
|
1791
|
+
// ensures we only claim overrides the user has explicitly resolved.
|
|
1792
|
+
// Without the awaiting_review filter, continueWithDefault=true artifacts
|
|
1793
|
+
// (not yet responded to) would be prematurely claimed, causing the override
|
|
1794
|
+
// to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
|
|
1795
|
+
const row = currentDb.prepare(`SELECT id, escalation_artifact_path AS path
|
|
1796
|
+
FROM tasks
|
|
1797
|
+
WHERE milestone_id = :mid AND slice_id = :sid
|
|
1798
|
+
AND escalation_artifact_path IS NOT NULL
|
|
1799
|
+
AND escalation_override_applied_at IS NULL
|
|
1800
|
+
AND escalation_pending = 0
|
|
1801
|
+
AND escalation_awaiting_review = 0
|
|
1802
|
+
ORDER BY sequence DESC, id DESC
|
|
1803
|
+
LIMIT 1`).get({ ":mid": milestoneId, ":sid": sliceId });
|
|
1804
|
+
if (!row || !row.path)
|
|
1805
|
+
return null;
|
|
1806
|
+
return { taskId: row.id, artifactPath: row.path };
|
|
1807
|
+
}
|
|
1808
|
+
/** Set the blocker_source provenance field (used when rejecting an escalation). */
|
|
1809
|
+
export function setTaskBlockerSource(milestoneId, sliceId, taskId, source) {
|
|
1810
|
+
if (!currentDb)
|
|
1811
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1812
|
+
currentDb.prepare(`UPDATE tasks
|
|
1813
|
+
SET blocker_discovered = 1,
|
|
1814
|
+
blocker_source = :src
|
|
1815
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":src": source, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
1816
|
+
}
|
|
1817
|
+
/** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
|
|
1818
|
+
export function listEscalationArtifacts(milestoneId, includeResolved = false) {
|
|
1819
|
+
if (!currentDb)
|
|
1820
|
+
return [];
|
|
1821
|
+
const filter = includeResolved
|
|
1822
|
+
? "escalation_artifact_path IS NOT NULL"
|
|
1823
|
+
: "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
|
|
1824
|
+
const rows = currentDb.prepare(`SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`).all({ ":mid": milestoneId });
|
|
1825
|
+
return rows.map(rowToTask);
|
|
1826
|
+
}
|
|
1440
1827
|
export function insertVerificationEvidence(e) {
|
|
1441
1828
|
if (!currentDb)
|
|
1442
1829
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
@@ -1667,6 +2054,19 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1667
2054
|
try {
|
|
1668
2055
|
const wtInfo = adapter.prepare("PRAGMA wt.table_info('decisions')").all();
|
|
1669
2056
|
const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
|
|
2057
|
+
// ADR-011: worktree may predate schema v16/v17. For missing columns we
|
|
2058
|
+
// fall through to the main DB's existing value (not a literal default)
|
|
2059
|
+
// so reconcile never silently clears state the main tree has recorded.
|
|
2060
|
+
const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
|
|
2061
|
+
const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
|
|
2062
|
+
const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
|
|
2063
|
+
const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
|
|
2064
|
+
const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
|
|
2065
|
+
const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
|
|
2066
|
+
const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
|
|
2067
|
+
const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
|
|
2068
|
+
const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
|
|
2069
|
+
const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
|
|
1670
2070
|
const decConf = adapter.prepare(`SELECT m.id FROM decisions m INNER JOIN wt.decisions w ON m.id = w.id WHERE m.decision != w.decision OR m.choice != w.choice OR m.rationale != w.rationale OR ${hasMadeBy ? "m.made_by != w.made_by" : "'agent' != 'agent'"} OR m.superseded_by IS NOT w.superseded_by`).all();
|
|
1671
2071
|
for (const row of decConf)
|
|
1672
2072
|
conflicts.push(`decision ${row["id"]}: modified in both`);
|
|
@@ -1679,11 +2079,16 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1679
2079
|
}
|
|
1680
2080
|
adapter.exec("BEGIN");
|
|
1681
2081
|
try {
|
|
2082
|
+
// Join the target decisions so we can prefer an existing main.source
|
|
2083
|
+
// when the worktree predates v16 — otherwise a write-through reconcile
|
|
2084
|
+
// would clobber 'escalation'-sourced decisions with the literal default.
|
|
1682
2085
|
merged.decisions = countChanges(adapter.prepare(`
|
|
1683
2086
|
INSERT OR REPLACE INTO decisions (
|
|
1684
|
-
id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by
|
|
2087
|
+
id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
|
|
1685
2088
|
)
|
|
1686
|
-
SELECT id, when_context, scope, decision, choice, rationale, revisable, ${hasMadeBy ? "made_by" : "'agent'"},
|
|
2089
|
+
SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"}, ${hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"}, w.superseded_by
|
|
2090
|
+
FROM wt.decisions w
|
|
2091
|
+
LEFT JOIN decisions m ON m.id = w.id
|
|
1687
2092
|
`).run());
|
|
1688
2093
|
merged.requirements = countChanges(adapter.prepare(`
|
|
1689
2094
|
INSERT OR REPLACE INTO requirements (
|
|
@@ -1716,13 +2121,15 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1716
2121
|
FROM wt.milestones
|
|
1717
2122
|
`).run());
|
|
1718
2123
|
// Merge slices — preserve worktree progress but never downgrade completed status (#2558).
|
|
1719
|
-
//
|
|
1720
|
-
//
|
|
2124
|
+
// ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
|
|
2125
|
+
// silently clear sketch metadata. When the worktree predates v16,
|
|
2126
|
+
// fall back to the main DB's existing value rather than a literal 0/''.
|
|
1721
2127
|
merged.slices = countChanges(adapter.prepare(`
|
|
1722
2128
|
INSERT OR REPLACE INTO slices (
|
|
1723
2129
|
milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
|
|
1724
2130
|
full_summary_md, full_uat_md, goal, success_criteria, proof_level,
|
|
1725
|
-
integration_closure, observability_impact, sequence, replan_triggered_at
|
|
2131
|
+
integration_closure, observability_impact, sequence, replan_triggered_at,
|
|
2132
|
+
is_sketch, sketch_scope
|
|
1726
2133
|
)
|
|
1727
2134
|
SELECT w.milestone_id, w.id, w.title,
|
|
1728
2135
|
CASE
|
|
@@ -1735,18 +2142,24 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1735
2142
|
THEN m.completed_at ELSE w.completed_at
|
|
1736
2143
|
END,
|
|
1737
2144
|
w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
|
|
1738
|
-
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at
|
|
2145
|
+
w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at,
|
|
2146
|
+
${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
|
|
2147
|
+
${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
|
|
1739
2148
|
FROM wt.slices w
|
|
1740
2149
|
LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
|
|
1741
2150
|
`).run());
|
|
1742
|
-
// Merge tasks — preserve execution results, never downgrade completed status (#2558)
|
|
2151
|
+
// Merge tasks — preserve execution results, never downgrade completed status (#2558).
|
|
2152
|
+
// ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
|
|
2153
|
+
// doesn't silently clear escalation state back to defaults.
|
|
1743
2154
|
merged.tasks = countChanges(adapter.prepare(`
|
|
1744
2155
|
INSERT OR REPLACE INTO tasks (
|
|
1745
2156
|
milestone_id, slice_id, id, title, status, one_liner, narrative,
|
|
1746
2157
|
verification_result, duration, completed_at, blocker_discovered,
|
|
1747
2158
|
deviations, known_issues, key_files, key_decisions, full_summary_md,
|
|
1748
2159
|
description, estimate, files, verify, inputs, expected_output,
|
|
1749
|
-
observability_impact, full_plan_md, sequence
|
|
2160
|
+
observability_impact, full_plan_md, sequence,
|
|
2161
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2162
|
+
escalation_artifact_path, escalation_override_applied_at
|
|
1750
2163
|
)
|
|
1751
2164
|
SELECT w.milestone_id, w.slice_id, w.id, w.title,
|
|
1752
2165
|
CASE
|
|
@@ -1762,7 +2175,12 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
|
|
|
1762
2175
|
w.blocker_discovered,
|
|
1763
2176
|
w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
|
|
1764
2177
|
w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
|
|
1765
|
-
w.observability_impact, w.full_plan_md, w.sequence
|
|
2178
|
+
w.observability_impact, w.full_plan_md, w.sequence,
|
|
2179
|
+
${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
|
|
2180
|
+
${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
|
|
2181
|
+
${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
|
|
2182
|
+
${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
|
|
2183
|
+
${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
|
|
1766
2184
|
FROM wt.tasks w
|
|
1767
2185
|
LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
|
|
1768
2186
|
`).run());
|
|
@@ -1880,6 +2298,7 @@ export function deleteMilestone(milestoneId) {
|
|
|
1880
2298
|
transaction(() => {
|
|
1881
2299
|
currentDb.prepare(`DELETE FROM verification_evidence WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1882
2300
|
currentDb.prepare(`DELETE FROM quality_gates WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
2301
|
+
currentDb.prepare(`DELETE FROM gate_runs WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1883
2302
|
currentDb.prepare(`DELETE FROM tasks WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1884
2303
|
currentDb.prepare(`DELETE FROM slice_dependencies WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
1885
2304
|
currentDb.prepare(`DELETE FROM slices WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
|
|
@@ -1965,6 +2384,28 @@ export function saveGateResult(g) {
|
|
|
1965
2384
|
":findings": g.findings,
|
|
1966
2385
|
":evaluated_at": new Date().toISOString(),
|
|
1967
2386
|
});
|
|
2387
|
+
const outcome = g.verdict === "pass"
|
|
2388
|
+
? "pass"
|
|
2389
|
+
: g.verdict === "omitted"
|
|
2390
|
+
? "manual-attention"
|
|
2391
|
+
: "fail";
|
|
2392
|
+
insertGateRun({
|
|
2393
|
+
traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
|
|
2394
|
+
turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
|
|
2395
|
+
gateId: g.gateId,
|
|
2396
|
+
gateType: "quality-gate",
|
|
2397
|
+
milestoneId: g.milestoneId,
|
|
2398
|
+
sliceId: g.sliceId,
|
|
2399
|
+
taskId: g.taskId ?? undefined,
|
|
2400
|
+
outcome,
|
|
2401
|
+
failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
|
|
2402
|
+
rationale: g.rationale,
|
|
2403
|
+
findings: g.findings,
|
|
2404
|
+
attempt: 1,
|
|
2405
|
+
maxAttempts: 1,
|
|
2406
|
+
retryable: false,
|
|
2407
|
+
evaluatedAt: new Date().toISOString(),
|
|
2408
|
+
});
|
|
1968
2409
|
}
|
|
1969
2410
|
export function getPendingGates(milestoneId, sliceId, scope) {
|
|
1970
2411
|
if (!currentDb)
|
|
@@ -2045,3 +2486,366 @@ export function getPendingGatesForTurn(milestoneId, sliceId, turn, taskId) {
|
|
|
2045
2486
|
export function getPendingGateCountForTurn(milestoneId, sliceId, turn) {
|
|
2046
2487
|
return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
|
|
2047
2488
|
}
|
|
2489
|
+
export function insertGateRun(entry) {
|
|
2490
|
+
if (!currentDb)
|
|
2491
|
+
return;
|
|
2492
|
+
currentDb.prepare(`INSERT INTO gate_runs (
|
|
2493
|
+
trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
|
|
2494
|
+
outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
|
|
2495
|
+
) VALUES (
|
|
2496
|
+
:trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
|
|
2497
|
+
:outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
|
|
2498
|
+
)`).run({
|
|
2499
|
+
":trace_id": entry.traceId,
|
|
2500
|
+
":turn_id": entry.turnId,
|
|
2501
|
+
":gate_id": entry.gateId,
|
|
2502
|
+
":gate_type": entry.gateType,
|
|
2503
|
+
":unit_type": entry.unitType ?? null,
|
|
2504
|
+
":unit_id": entry.unitId ?? null,
|
|
2505
|
+
":milestone_id": entry.milestoneId ?? null,
|
|
2506
|
+
":slice_id": entry.sliceId ?? null,
|
|
2507
|
+
":task_id": entry.taskId ?? null,
|
|
2508
|
+
":outcome": entry.outcome,
|
|
2509
|
+
":failure_class": entry.failureClass,
|
|
2510
|
+
":rationale": entry.rationale ?? "",
|
|
2511
|
+
":findings": entry.findings ?? "",
|
|
2512
|
+
":attempt": entry.attempt,
|
|
2513
|
+
":max_attempts": entry.maxAttempts,
|
|
2514
|
+
":retryable": entry.retryable ? 1 : 0,
|
|
2515
|
+
":evaluated_at": entry.evaluatedAt,
|
|
2516
|
+
});
|
|
2517
|
+
}
|
|
2518
|
+
export function upsertTurnGitTransaction(entry) {
|
|
2519
|
+
if (!currentDb)
|
|
2520
|
+
return;
|
|
2521
|
+
currentDb.prepare(`INSERT OR REPLACE INTO turn_git_transactions (
|
|
2522
|
+
trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
|
|
2523
|
+
) VALUES (
|
|
2524
|
+
:trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
|
|
2525
|
+
)`).run({
|
|
2526
|
+
":trace_id": entry.traceId,
|
|
2527
|
+
":turn_id": entry.turnId,
|
|
2528
|
+
":unit_type": entry.unitType ?? null,
|
|
2529
|
+
":unit_id": entry.unitId ?? null,
|
|
2530
|
+
":stage": entry.stage,
|
|
2531
|
+
":action": entry.action,
|
|
2532
|
+
":push": entry.push ? 1 : 0,
|
|
2533
|
+
":status": entry.status,
|
|
2534
|
+
":error": entry.error ?? null,
|
|
2535
|
+
":metadata_json": JSON.stringify(entry.metadata ?? {}),
|
|
2536
|
+
":updated_at": entry.updatedAt,
|
|
2537
|
+
});
|
|
2538
|
+
}
|
|
2539
|
+
export function insertAuditEvent(entry) {
|
|
2540
|
+
if (!currentDb)
|
|
2541
|
+
return;
|
|
2542
|
+
transaction(() => {
|
|
2543
|
+
currentDb.prepare(`INSERT OR IGNORE INTO audit_events (
|
|
2544
|
+
event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
|
|
2545
|
+
) VALUES (
|
|
2546
|
+
:event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
|
|
2547
|
+
)`).run({
|
|
2548
|
+
":event_id": entry.eventId,
|
|
2549
|
+
":trace_id": entry.traceId,
|
|
2550
|
+
":turn_id": entry.turnId ?? null,
|
|
2551
|
+
":caused_by": entry.causedBy ?? null,
|
|
2552
|
+
":category": entry.category,
|
|
2553
|
+
":type": entry.type,
|
|
2554
|
+
":ts": entry.ts,
|
|
2555
|
+
":payload_json": JSON.stringify(entry.payload ?? {}),
|
|
2556
|
+
});
|
|
2557
|
+
if (entry.turnId) {
|
|
2558
|
+
const row = currentDb.prepare(`SELECT event_count, first_ts, last_ts
|
|
2559
|
+
FROM audit_turn_index
|
|
2560
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`).get({
|
|
2561
|
+
":trace_id": entry.traceId,
|
|
2562
|
+
":turn_id": entry.turnId,
|
|
2563
|
+
});
|
|
2564
|
+
if (row) {
|
|
2565
|
+
currentDb.prepare(`UPDATE audit_turn_index
|
|
2566
|
+
SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
|
|
2567
|
+
last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
|
|
2568
|
+
event_count = event_count + 1
|
|
2569
|
+
WHERE trace_id = :trace_id AND turn_id = :turn_id`).run({
|
|
2570
|
+
":trace_id": entry.traceId,
|
|
2571
|
+
":turn_id": entry.turnId,
|
|
2572
|
+
":ts": entry.ts,
|
|
2573
|
+
});
|
|
2574
|
+
}
|
|
2575
|
+
else {
|
|
2576
|
+
currentDb.prepare(`INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
|
|
2577
|
+
VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`).run({
|
|
2578
|
+
":trace_id": entry.traceId,
|
|
2579
|
+
":turn_id": entry.turnId,
|
|
2580
|
+
":first_ts": entry.ts,
|
|
2581
|
+
":last_ts": entry.ts,
|
|
2582
|
+
":event_count": 1,
|
|
2583
|
+
});
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
});
|
|
2587
|
+
}
|
|
2588
|
+
// ─── Single-writer bypass wrappers ───────────────────────────────────────
|
|
2589
|
+
// These wrappers exist so modules outside this file never need to call
|
|
2590
|
+
// `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
|
|
2591
|
+
// a raw prepare/run previously issued from another module. Keep them
|
|
2592
|
+
// minimal and direct — they exist to hold SQL text in one place, not to
|
|
2593
|
+
// add new behavior.
|
|
2594
|
+
/** Delete a decision row by id. Used by db-writer.ts rollback on disk-write failure. */
|
|
2595
|
+
export function deleteDecisionById(id) {
|
|
2596
|
+
if (!currentDb)
|
|
2597
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2598
|
+
currentDb.prepare("DELETE FROM decisions WHERE id = :id").run({ ":id": id });
|
|
2599
|
+
}
|
|
2600
|
+
/** Delete a requirement row by id. Used by db-writer.ts rollback on disk-write failure. */
|
|
2601
|
+
export function deleteRequirementById(id) {
|
|
2602
|
+
if (!currentDb)
|
|
2603
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2604
|
+
currentDb.prepare("DELETE FROM requirements WHERE id = :id").run({ ":id": id });
|
|
2605
|
+
}
|
|
2606
|
+
/** Delete an artifact row by path. Used by db-writer.ts rollback on disk-write failure. */
|
|
2607
|
+
export function deleteArtifactByPath(path) {
|
|
2608
|
+
if (!currentDb)
|
|
2609
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2610
|
+
currentDb.prepare("DELETE FROM artifacts WHERE path = :path").run({ ":path": path });
|
|
2611
|
+
}
|
|
2612
|
+
/**
|
|
2613
|
+
* Drop all rows from tasks/slices/milestones in dependency order inside a
|
|
2614
|
+
* transaction. Used by `gsd recover` to rebuild engine state from markdown.
|
|
2615
|
+
*/
|
|
2616
|
+
export function clearEngineHierarchy() {
|
|
2617
|
+
if (!currentDb)
|
|
2618
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2619
|
+
transaction(() => {
|
|
2620
|
+
currentDb.exec("DELETE FROM tasks");
|
|
2621
|
+
currentDb.exec("DELETE FROM slices");
|
|
2622
|
+
currentDb.exec("DELETE FROM milestones");
|
|
2623
|
+
});
|
|
2624
|
+
}
|
|
2625
|
+
/**
|
|
2626
|
+
* INSERT OR IGNORE a slice during event replay (workflow-reconcile.ts).
|
|
2627
|
+
* Strict insert-or-ignore semantics are required here to avoid the
|
|
2628
|
+
* `insertSlice` ON CONFLICT path that could downgrade an already-completed
|
|
2629
|
+
* slice back to 'pending'.
|
|
2630
|
+
*/
|
|
2631
|
+
export function insertOrIgnoreSlice(args) {
|
|
2632
|
+
if (!currentDb)
|
|
2633
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2634
|
+
currentDb.prepare(`INSERT OR IGNORE INTO slices (milestone_id, id, title, status, created_at)
|
|
2635
|
+
VALUES (:mid, :sid, :title, 'pending', :ts)`).run({
|
|
2636
|
+
":mid": args.milestoneId,
|
|
2637
|
+
":sid": args.sliceId,
|
|
2638
|
+
":title": args.title,
|
|
2639
|
+
":ts": args.createdAt,
|
|
2640
|
+
});
|
|
2641
|
+
}
|
|
2642
|
+
/**
|
|
2643
|
+
* INSERT OR IGNORE a task during event replay (workflow-reconcile.ts).
|
|
2644
|
+
* Same rationale as `insertOrIgnoreSlice`.
|
|
2645
|
+
*/
|
|
2646
|
+
export function insertOrIgnoreTask(args) {
|
|
2647
|
+
if (!currentDb)
|
|
2648
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2649
|
+
currentDb.prepare(`INSERT OR IGNORE INTO tasks (milestone_id, slice_id, id, title, status, created_at)
|
|
2650
|
+
VALUES (:mid, :sid, :tid, :title, 'pending', :ts)`).run({
|
|
2651
|
+
":mid": args.milestoneId,
|
|
2652
|
+
":sid": args.sliceId,
|
|
2653
|
+
":tid": args.taskId,
|
|
2654
|
+
":title": args.title,
|
|
2655
|
+
":ts": args.createdAt,
|
|
2656
|
+
});
|
|
2657
|
+
}
|
|
2658
|
+
/**
|
|
2659
|
+
* Stamp the `replan_triggered_at` column on a slice. Used by triage-resolution
|
|
2660
|
+
* when a user capture requests a replan so the dispatcher can detect the
|
|
2661
|
+
* trigger via DB in addition to the on-disk REPLAN-TRIGGER.md marker.
|
|
2662
|
+
*/
|
|
2663
|
+
export function setSliceReplanTriggeredAt(milestoneId, sliceId, ts) {
|
|
2664
|
+
if (!currentDb)
|
|
2665
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2666
|
+
currentDb.prepare("UPDATE slices SET replan_triggered_at = :ts WHERE milestone_id = :mid AND id = :sid").run({ ":ts": ts, ":mid": milestoneId, ":sid": sliceId });
|
|
2667
|
+
}
|
|
2668
|
+
/**
|
|
2669
|
+
* INSERT OR REPLACE a quality_gates row. Used by milestone-validation-gates.ts
|
|
2670
|
+
* to persist milestone-level (MV*) gate outcomes after validate-milestone runs.
|
|
2671
|
+
*/
|
|
2672
|
+
export function upsertQualityGate(g) {
|
|
2673
|
+
if (!currentDb)
|
|
2674
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2675
|
+
currentDb.prepare(`INSERT OR REPLACE INTO quality_gates
|
|
2676
|
+
(milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at)
|
|
2677
|
+
VALUES (:mid, :sid, :gid, :scope, :tid, :status, :verdict, :rationale, :findings, :evaluated_at)`).run({
|
|
2678
|
+
":mid": g.milestoneId,
|
|
2679
|
+
":sid": g.sliceId,
|
|
2680
|
+
":gid": g.gateId,
|
|
2681
|
+
":scope": g.scope,
|
|
2682
|
+
":tid": g.taskId,
|
|
2683
|
+
":status": g.status,
|
|
2684
|
+
":verdict": g.verdict,
|
|
2685
|
+
":rationale": g.rationale,
|
|
2686
|
+
":findings": g.findings,
|
|
2687
|
+
":evaluated_at": g.evaluatedAt,
|
|
2688
|
+
});
|
|
2689
|
+
}
|
|
2690
|
+
/**
|
|
2691
|
+
* Atomically replace all workflow state from a manifest. Lifted verbatim from
|
|
2692
|
+
* workflow-manifest.ts so the single-writer invariant holds. Only touches
|
|
2693
|
+
* engine tables + decisions. Does NOT modify artifacts or memories.
|
|
2694
|
+
*/
|
|
2695
|
+
export function restoreManifest(manifest) {
|
|
2696
|
+
if (!currentDb)
|
|
2697
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2698
|
+
const db = currentDb;
|
|
2699
|
+
transaction(() => {
|
|
2700
|
+
// Clear engine tables (order matters for foreign-key-like consistency)
|
|
2701
|
+
db.exec("DELETE FROM verification_evidence");
|
|
2702
|
+
db.exec("DELETE FROM tasks");
|
|
2703
|
+
db.exec("DELETE FROM slices");
|
|
2704
|
+
db.exec("DELETE FROM milestones");
|
|
2705
|
+
db.exec("DELETE FROM decisions WHERE 1=1");
|
|
2706
|
+
// Restore milestones
|
|
2707
|
+
const msStmt = db.prepare(`INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
|
|
2708
|
+
vision, success_criteria, key_risks, proof_strategy,
|
|
2709
|
+
verification_contract, verification_integration, verification_operational, verification_uat,
|
|
2710
|
+
definition_of_done, requirement_coverage, boundary_map_markdown)
|
|
2711
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2712
|
+
for (const m of manifest.milestones) {
|
|
2713
|
+
msStmt.run(m.id, m.title, m.status, JSON.stringify(m.depends_on), m.created_at, m.completed_at, m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks), JSON.stringify(m.proof_strategy), m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat, JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown);
|
|
2714
|
+
}
|
|
2715
|
+
// Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
|
|
2716
|
+
const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
|
|
2717
|
+
created_at, completed_at, full_summary_md, full_uat_md,
|
|
2718
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact,
|
|
2719
|
+
sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
2720
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2721
|
+
for (const s of manifest.slices) {
|
|
2722
|
+
slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at, s.is_sketch ?? 0, s.sketch_scope ?? "");
|
|
2723
|
+
}
|
|
2724
|
+
// Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
|
|
2725
|
+
const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
|
|
2726
|
+
one_liner, narrative, verification_result, duration, completed_at,
|
|
2727
|
+
blocker_discovered, deviations, known_issues, key_files, key_decisions,
|
|
2728
|
+
full_summary_md, description, estimate, files, verify,
|
|
2729
|
+
inputs, expected_output, observability_impact, sequence,
|
|
2730
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2731
|
+
escalation_artifact_path, escalation_override_applied_at)
|
|
2732
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2733
|
+
for (const t of manifest.tasks) {
|
|
2734
|
+
tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence, t.blocker_source ?? "", t.escalation_pending ?? 0, t.escalation_awaiting_review ?? 0, t.escalation_artifact_path ?? null, t.escalation_override_applied_at ?? null);
|
|
2735
|
+
}
|
|
2736
|
+
// Restore decisions (ADR-011 P2: include source so escalation decisions survive)
|
|
2737
|
+
const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
2738
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2739
|
+
for (const d of manifest.decisions) {
|
|
2740
|
+
dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
|
|
2741
|
+
}
|
|
2742
|
+
// Restore verification evidence
|
|
2743
|
+
const evStmt = db.prepare(`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
|
|
2744
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
2745
|
+
for (const e of manifest.verification_evidence) {
|
|
2746
|
+
evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
|
|
2747
|
+
}
|
|
2748
|
+
});
|
|
2749
|
+
}
|
|
2750
|
+
/**
|
|
2751
|
+
* Bulk delete + insert a legacy milestone hierarchy for markdown → DB migration.
|
|
2752
|
+
* Used by workflow-migration.ts to populate engine tables from parsed ROADMAP/PLAN
|
|
2753
|
+
* files. All operations run inside a single transaction.
|
|
2754
|
+
*/
|
|
2755
|
+
export function bulkInsertLegacyHierarchy(payload) {
|
|
2756
|
+
if (!currentDb)
|
|
2757
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2758
|
+
const db = currentDb;
|
|
2759
|
+
const { milestones, slices, tasks, clearMilestoneIds, createdAt } = payload;
|
|
2760
|
+
if (clearMilestoneIds.length === 0)
|
|
2761
|
+
return;
|
|
2762
|
+
const placeholders = clearMilestoneIds.map(() => "?").join(",");
|
|
2763
|
+
transaction(() => {
|
|
2764
|
+
db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
2765
|
+
db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
2766
|
+
db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
2767
|
+
const insertMilestone = db.prepare("INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)");
|
|
2768
|
+
for (const m of milestones) {
|
|
2769
|
+
insertMilestone.run(m.id, m.title, m.status, createdAt);
|
|
2770
|
+
}
|
|
2771
|
+
const insertSliceStmt = db.prepare("INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
|
|
2772
|
+
for (const s of slices) {
|
|
2773
|
+
insertSliceStmt.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, createdAt);
|
|
2774
|
+
}
|
|
2775
|
+
const insertTaskStmt = db.prepare("INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
2776
|
+
for (const t of tasks) {
|
|
2777
|
+
insertTaskStmt.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
|
|
2778
|
+
}
|
|
2779
|
+
});
|
|
2780
|
+
}
|
|
2781
|
+
// ─── Memory store writers ────────────────────────────────────────────────
|
|
2782
|
+
// All memory writes go through gsd-db.ts so the single-writer invariant
|
|
2783
|
+
// holds. These are direct pass-throughs to the SQL previously in
|
|
2784
|
+
// memory-store.ts — same bindings, same behavior.
|
|
2785
|
+
export function insertMemoryRow(args) {
|
|
2786
|
+
if (!currentDb)
|
|
2787
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2788
|
+
currentDb.prepare(`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at)
|
|
2789
|
+
VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at)`).run({
|
|
2790
|
+
":id": args.id,
|
|
2791
|
+
":category": args.category,
|
|
2792
|
+
":content": args.content,
|
|
2793
|
+
":confidence": args.confidence,
|
|
2794
|
+
":source_unit_type": args.sourceUnitType,
|
|
2795
|
+
":source_unit_id": args.sourceUnitId,
|
|
2796
|
+
":created_at": args.createdAt,
|
|
2797
|
+
":updated_at": args.updatedAt,
|
|
2798
|
+
});
|
|
2799
|
+
}
|
|
2800
|
+
export function rewriteMemoryId(placeholderId, realId) {
|
|
2801
|
+
if (!currentDb)
|
|
2802
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2803
|
+
currentDb.prepare("UPDATE memories SET id = :real_id WHERE id = :placeholder").run({
|
|
2804
|
+
":real_id": realId,
|
|
2805
|
+
":placeholder": placeholderId,
|
|
2806
|
+
});
|
|
2807
|
+
}
|
|
2808
|
+
export function updateMemoryContentRow(id, content, confidence, updatedAt) {
|
|
2809
|
+
if (!currentDb)
|
|
2810
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2811
|
+
if (confidence != null) {
|
|
2812
|
+
currentDb.prepare("UPDATE memories SET content = :content, confidence = :confidence, updated_at = :updated_at WHERE id = :id").run({ ":content": content, ":confidence": confidence, ":updated_at": updatedAt, ":id": id });
|
|
2813
|
+
}
|
|
2814
|
+
else {
|
|
2815
|
+
currentDb.prepare("UPDATE memories SET content = :content, updated_at = :updated_at WHERE id = :id").run({ ":content": content, ":updated_at": updatedAt, ":id": id });
|
|
2816
|
+
}
|
|
2817
|
+
}
|
|
2818
|
+
export function incrementMemoryHitCount(id, updatedAt) {
|
|
2819
|
+
if (!currentDb)
|
|
2820
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2821
|
+
currentDb.prepare("UPDATE memories SET hit_count = hit_count + 1, updated_at = :updated_at WHERE id = :id").run({ ":updated_at": updatedAt, ":id": id });
|
|
2822
|
+
}
|
|
2823
|
+
export function supersedeMemoryRow(oldId, newId, updatedAt) {
|
|
2824
|
+
if (!currentDb)
|
|
2825
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2826
|
+
currentDb.prepare("UPDATE memories SET superseded_by = :new_id, updated_at = :updated_at WHERE id = :old_id").run({ ":new_id": newId, ":updated_at": updatedAt, ":old_id": oldId });
|
|
2827
|
+
}
|
|
2828
|
+
export function markMemoryUnitProcessed(unitKey, activityFile, processedAt) {
|
|
2829
|
+
if (!currentDb)
|
|
2830
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2831
|
+
currentDb.prepare(`INSERT OR IGNORE INTO memory_processed_units (unit_key, activity_file, processed_at)
|
|
2832
|
+
VALUES (:key, :file, :at)`).run({ ":key": unitKey, ":file": activityFile, ":at": processedAt });
|
|
2833
|
+
}
|
|
2834
|
+
export function decayMemoriesBefore(cutoffTs, now) {
|
|
2835
|
+
if (!currentDb)
|
|
2836
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2837
|
+
currentDb.prepare(`UPDATE memories
|
|
2838
|
+
SET confidence = MAX(0.1, confidence - 0.1), updated_at = :now
|
|
2839
|
+
WHERE superseded_by IS NULL AND updated_at < :cutoff AND confidence > 0.1`).run({ ":now": now, ":cutoff": cutoffTs });
|
|
2840
|
+
}
|
|
2841
|
+
export function supersedeLowestRankedMemories(limit, now) {
|
|
2842
|
+
if (!currentDb)
|
|
2843
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
2844
|
+
currentDb.prepare(`UPDATE memories SET superseded_by = 'CAP_EXCEEDED', updated_at = :now
|
|
2845
|
+
WHERE id IN (
|
|
2846
|
+
SELECT id FROM memories
|
|
2847
|
+
WHERE superseded_by IS NULL
|
|
2848
|
+
ORDER BY (confidence * (1.0 + hit_count * 0.1)) ASC
|
|
2849
|
+
LIMIT :limit
|
|
2850
|
+
)`).run({ ":now": now, ":limit": limit });
|
|
2851
|
+
}
|