@aligndottech/cli 0.49.0 → 0.50.0
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 +4 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +4 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +18 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +24 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +24 -5
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/docs.js +2 -2
- package/dist/commands/import/git.d.ts.map +1 -1
- package/dist/commands/import/git.js +15 -5
- package/dist/commands/import/git.js.map +1 -1
- package/dist/commands/import/github.d.ts.map +1 -1
- package/dist/commands/import/github.js +34 -7
- package/dist/commands/import/github.js.map +1 -1
- package/dist/commands/import/gitlab.d.ts.map +1 -1
- package/dist/commands/import/gitlab.js +10 -5
- package/dist/commands/import/gitlab.js.map +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +10 -5
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/import/linear.d.ts.map +1 -1
- package/dist/commands/import/linear.js +10 -5
- package/dist/commands/import/linear.js.map +1 -1
- package/dist/commands/import/notion.d.ts.map +1 -1
- package/dist/commands/import/notion.js +10 -5
- package/dist/commands/import/notion.js.map +1 -1
- package/dist/commands/import/sessions.js +2 -2
- package/dist/commands/import/slack.d.ts.map +1 -1
- package/dist/commands/import/slack.js +12 -7
- package/dist/commands/import/slack.js.map +1 -1
- package/dist/commands/import/teams.d.ts.map +1 -1
- package/dist/commands/import/teams.js +10 -5
- package/dist/commands/import/teams.js.map +1 -1
- package/dist/commands/import/zoom.d.ts.map +1 -1
- package/dist/commands/import/zoom.js +10 -5
- package/dist/commands/import/zoom.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +43 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +76 -4
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/mark.d.ts +37 -0
- package/dist/commands/mark.d.ts.map +1 -0
- package/dist/commands/mark.js +105 -0
- package/dist/commands/mark.js.map +1 -0
- package/dist/commands/mcp.d.ts +141 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +72 -14
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +8 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.d.ts +39 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +65 -50
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/share.d.ts +7 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/sync.d.ts +55 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +278 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/telemetry.d.ts +3 -3
- package/dist/commands/telemetry.js +6 -6
- package/dist/commands/telemetry.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +6 -1
- package/dist/commands/why.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/backfill-state.d.ts +116 -0
- package/dist/lib/backfill-state.d.ts.map +1 -0
- package/dist/lib/backfill-state.js +342 -0
- package/dist/lib/backfill-state.js.map +1 -0
- package/dist/lib/backup-copy.d.ts +17 -0
- package/dist/lib/backup-copy.d.ts.map +1 -0
- package/dist/lib/backup-copy.js +13 -0
- package/dist/lib/backup-copy.js.map +1 -0
- package/dist/lib/capture-report.d.ts +22 -18
- package/dist/lib/capture-report.d.ts.map +1 -1
- package/dist/lib/capture-report.js +64 -2
- package/dist/lib/capture-report.js.map +1 -1
- package/dist/lib/config.d.ts +31 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +139 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/confirm-timeout.d.ts +8 -0
- package/dist/lib/confirm-timeout.d.ts.map +1 -0
- package/dist/lib/confirm-timeout.js +18 -0
- package/dist/lib/confirm-timeout.js.map +1 -0
- package/dist/lib/curation/check-marks.d.ts +48 -0
- package/dist/lib/curation/check-marks.d.ts.map +1 -0
- package/dist/lib/curation/check-marks.js +81 -0
- package/dist/lib/curation/check-marks.js.map +1 -0
- package/dist/lib/curation/guardrail.d.ts +39 -0
- package/dist/lib/curation/guardrail.d.ts.map +1 -0
- package/dist/lib/curation/guardrail.js +93 -0
- package/dist/lib/curation/guardrail.js.map +1 -0
- package/dist/lib/curation/judge.d.ts +3 -0
- package/dist/lib/curation/judge.d.ts.map +1 -0
- package/dist/lib/curation/judge.js +9 -0
- package/dist/lib/curation/judge.js.map +1 -0
- package/dist/lib/curation/judgements-db.d.ts +96 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -0
- package/dist/lib/curation/judgements-db.js +200 -0
- package/dist/lib/curation/judgements-db.js.map +1 -0
- package/dist/lib/curation/last-check.d.ts +32 -0
- package/dist/lib/curation/last-check.d.ts.map +1 -0
- package/dist/lib/curation/last-check.js +81 -0
- package/dist/lib/curation/last-check.js.map +1 -0
- package/dist/lib/curation/mark.d.ts +76 -0
- package/dist/lib/curation/mark.d.ts.map +1 -0
- package/dist/lib/curation/mark.js +359 -0
- package/dist/lib/curation/mark.js.map +1 -0
- package/dist/lib/curation/text.d.ts +6 -0
- package/dist/lib/curation/text.d.ts.map +1 -0
- package/dist/lib/curation/text.js +35 -0
- package/dist/lib/curation/text.js.map +1 -0
- package/dist/lib/fetchers/capture.d.ts +49 -2
- package/dist/lib/fetchers/capture.d.ts.map +1 -1
- package/dist/lib/fetchers/capture.js +7 -1
- package/dist/lib/fetchers/capture.js.map +1 -1
- package/dist/lib/fetchers/confluence.d.ts +2 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts +1 -0
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +3 -1
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts +44 -5
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +122 -5
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/gitlab.d.ts +2 -2
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
- package/dist/lib/fetchers/gitlab.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +2 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts +2 -2
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts +2 -2
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts +2 -3
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts +2 -2
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts +2 -2
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +34 -0
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +19 -1
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/github-text.d.ts +3 -0
- package/dist/lib/github-text.d.ts.map +1 -0
- package/dist/lib/github-text.js +18 -0
- package/dist/lib/github-text.js.map +1 -0
- package/dist/lib/hook-context.d.ts +10 -0
- package/dist/lib/hook-context.d.ts.map +1 -1
- package/dist/lib/hook-context.js +14 -0
- package/dist/lib/hook-context.js.map +1 -1
- package/dist/lib/import-defaults.d.ts +39 -23
- package/dist/lib/import-defaults.d.ts.map +1 -1
- package/dist/lib/import-defaults.js +28 -26
- package/dist/lib/import-defaults.js.map +1 -1
- package/dist/lib/launch/adapters/aider.d.ts +17 -0
- package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
- package/dist/lib/launch/adapters/aider.js +30 -0
- package/dist/lib/launch/adapters/aider.js.map +1 -0
- package/dist/lib/launch/adapters/auggie.d.ts +18 -0
- package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
- package/dist/lib/launch/adapters/auggie.js +34 -0
- package/dist/lib/launch/adapters/auggie.js.map +1 -0
- package/dist/lib/launch/adapters/cline.d.ts +10 -0
- package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
- package/dist/lib/launch/adapters/cline.js +41 -0
- package/dist/lib/launch/adapters/cline.js.map +1 -0
- package/dist/lib/launch/adapters/continue.d.ts +22 -0
- package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
- package/dist/lib/launch/adapters/continue.js +46 -0
- package/dist/lib/launch/adapters/continue.js.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
- package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
- package/dist/lib/launch/adapters/gemini-cli.js +38 -53
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
- package/dist/lib/launch/adapters/goose.d.ts +20 -0
- package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
- package/dist/lib/launch/adapters/goose.js +47 -0
- package/dist/lib/launch/adapters/goose.js.map +1 -0
- package/dist/lib/launch/adapters/notes.d.ts +7 -0
- package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
- package/dist/lib/launch/adapters/notes.js +5 -0
- package/dist/lib/launch/adapters/notes.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +2 -0
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +3 -1
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/auggie-state.d.ts +25 -0
- package/dist/lib/launch/auggie-state.d.ts.map +1 -0
- package/dist/lib/launch/auggie-state.js +74 -0
- package/dist/lib/launch/auggie-state.js.map +1 -0
- package/dist/lib/launch/cline-state.d.ts +32 -0
- package/dist/lib/launch/cline-state.d.ts.map +1 -0
- package/dist/lib/launch/cline-state.js +108 -0
- package/dist/lib/launch/cline-state.js.map +1 -0
- package/dist/lib/launch/config-writes.d.ts +4 -0
- package/dist/lib/launch/config-writes.d.ts.map +1 -1
- package/dist/lib/launch/config-writes.js +8 -3
- package/dist/lib/launch/config-writes.js.map +1 -1
- package/dist/lib/launch/continue-state.d.ts +41 -0
- package/dist/lib/launch/continue-state.d.ts.map +1 -0
- package/dist/lib/launch/continue-state.js +142 -0
- package/dist/lib/launch/continue-state.js.map +1 -0
- package/dist/lib/launch/detect.d.ts.map +1 -1
- package/dist/lib/launch/detect.js +3 -1
- package/dist/lib/launch/detect.js.map +1 -1
- package/dist/lib/launch/gemini-state.d.ts +26 -20
- package/dist/lib/launch/gemini-state.d.ts.map +1 -1
- package/dist/lib/launch/gemini-state.js +95 -37
- package/dist/lib/launch/gemini-state.js.map +1 -1
- package/dist/lib/launch/gemini-system-file.d.ts +17 -0
- package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
- package/dist/lib/launch/gemini-system-file.js +55 -0
- package/dist/lib/launch/gemini-system-file.js.map +1 -0
- package/dist/lib/launch/gemini-trust.d.ts +3 -1
- package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
- package/dist/lib/launch/gemini-trust.js +10 -3
- package/dist/lib/launch/gemini-trust.js.map +1 -1
- package/dist/lib/launch/goose-state.d.ts +53 -0
- package/dist/lib/launch/goose-state.d.ts.map +1 -0
- package/dist/lib/launch/goose-state.js +137 -0
- package/dist/lib/launch/goose-state.js.map +1 -0
- package/dist/lib/launch/launch-files.d.ts.map +1 -1
- package/dist/lib/launch/launch-files.js +3 -2
- package/dist/lib/launch/launch-files.js.map +1 -1
- package/dist/lib/launch/launch.d.ts +17 -2
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +36 -3
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/mcp-child-env.d.ts +30 -0
- package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
- package/dist/lib/launch/mcp-child-env.js +151 -0
- package/dist/lib/launch/mcp-child-env.js.map +1 -0
- package/dist/lib/launch/pick-agent.d.ts.map +1 -1
- package/dist/lib/launch/pick-agent.js +4 -4
- package/dist/lib/launch/pick-agent.js.map +1 -1
- package/dist/lib/launch/picker-options.d.ts.map +1 -1
- package/dist/lib/launch/picker-options.js +7 -2
- package/dist/lib/launch/picker-options.js.map +1 -1
- package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
- package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/aider.js +13 -0
- package/dist/lib/launch/registry/agents/aider.js.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.js +11 -0
- package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
- package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
- package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/cline.js +19 -0
- package/dist/lib/launch/registry/agents/cline.js.map +1 -0
- package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
- package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/continue.js +20 -0
- package/dist/lib/launch/registry/agents/continue.js.map +1 -0
- package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
- package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
- package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
- package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/goose.js +20 -0
- package/dist/lib/launch/registry/agents/goose.js.map +1 -0
- package/dist/lib/launch/registry/index.d.ts +1 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +7 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +12 -1
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +22 -2
- package/dist/lib/launch/strict-entry.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.js +80 -2
- package/dist/lib/launch/strict-entry.js.map +1 -1
- package/dist/lib/launch/yaml-scan.d.ts +59 -0
- package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
- package/dist/lib/launch/yaml-scan.js +275 -0
- package/dist/lib/launch/yaml-scan.js.map +1 -0
- package/dist/lib/local-db-epoch.d.ts +4 -0
- package/dist/lib/local-db-epoch.d.ts.map +1 -0
- package/dist/lib/local-db-epoch.js +19 -0
- package/dist/lib/local-db-epoch.js.map +1 -0
- package/dist/lib/local-db-migrate.d.ts +85 -0
- package/dist/lib/local-db-migrate.d.ts.map +1 -0
- package/dist/lib/local-db-migrate.js +484 -0
- package/dist/lib/local-db-migrate.js.map +1 -0
- package/dist/lib/local-db-v10.d.ts +28 -0
- package/dist/lib/local-db-v10.d.ts.map +1 -0
- package/dist/lib/local-db-v10.js +49 -0
- package/dist/lib/local-db-v10.js.map +1 -0
- package/dist/lib/local-db-v11.d.ts +24 -0
- package/dist/lib/local-db-v11.d.ts.map +1 -0
- package/dist/lib/local-db-v11.js +25 -0
- package/dist/lib/local-db-v11.js.map +1 -0
- package/dist/lib/local-db-v7.d.ts +30 -0
- package/dist/lib/local-db-v7.d.ts.map +1 -0
- package/dist/lib/local-db-v7.js +285 -0
- package/dist/lib/local-db-v7.js.map +1 -0
- package/dist/lib/local-db-v8.d.ts +22 -0
- package/dist/lib/local-db-v8.d.ts.map +1 -0
- package/dist/lib/local-db-v8.js +33 -0
- package/dist/lib/local-db-v8.js.map +1 -0
- package/dist/lib/local-db-v9.d.ts +10 -0
- package/dist/lib/local-db-v9.d.ts.map +1 -0
- package/dist/lib/local-db-v9.js +8 -0
- package/dist/lib/local-db-v9.js.map +1 -0
- package/dist/lib/local-db.d.ts +61 -11
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +186 -371
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-embeddings.d.ts.map +1 -1
- package/dist/lib/local-embeddings.js +2 -2
- package/dist/lib/local-embeddings.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +30 -87
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +182 -171
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +129 -0
- package/dist/lib/local-ingest.d.ts.map +1 -0
- package/dist/lib/local-ingest.js +81 -0
- package/dist/lib/local-ingest.js.map +1 -0
- package/dist/lib/local-link-pass.d.ts +15 -0
- package/dist/lib/local-link-pass.d.ts.map +1 -0
- package/dist/lib/local-link-pass.js +61 -0
- package/dist/lib/local-link-pass.js.map +1 -0
- package/dist/lib/local-mode.d.ts +4 -1
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +16 -1
- package/dist/lib/local-mode.js.map +1 -1
- package/dist/lib/local-provenance.d.ts +14 -0
- package/dist/lib/local-provenance.d.ts.map +1 -0
- package/dist/lib/local-provenance.js +14 -0
- package/dist/lib/local-provenance.js.map +1 -0
- package/dist/lib/local-thresholds.d.ts +70 -0
- package/dist/lib/local-thresholds.d.ts.map +1 -0
- package/dist/lib/local-thresholds.js +79 -0
- package/dist/lib/local-thresholds.js.map +1 -0
- package/dist/lib/mcp/mark-tool.d.ts +27 -0
- package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
- package/dist/lib/mcp/mark-tool.js +103 -0
- package/dist/lib/mcp/mark-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +46 -0
- package/dist/lib/mcp/share-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-tool.js +68 -0
- package/dist/lib/mcp/share-tool.js.map +1 -0
- package/dist/lib/mcp/tool-rules.d.ts +30 -0
- package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
- package/dist/lib/mcp/tool-rules.js +84 -0
- package/dist/lib/mcp/tool-rules.js.map +1 -0
- package/dist/lib/mcp-backfill.d.ts +89 -0
- package/dist/lib/mcp-backfill.d.ts.map +1 -0
- package/dist/lib/mcp-backfill.js +194 -0
- package/dist/lib/mcp-backfill.js.map +1 -0
- package/dist/lib/mcp-scope.d.ts +90 -0
- package/dist/lib/mcp-scope.d.ts.map +1 -0
- package/dist/lib/mcp-scope.js +125 -0
- package/dist/lib/mcp-scope.js.map +1 -0
- package/dist/lib/mcp-sync.d.ts +64 -0
- package/dist/lib/mcp-sync.d.ts.map +1 -0
- package/dist/lib/mcp-sync.js +183 -0
- package/dist/lib/mcp-sync.js.map +1 -0
- package/dist/lib/personal-import.d.ts +7 -0
- package/dist/lib/personal-import.d.ts.map +1 -1
- package/dist/lib/personal-import.js +13 -1
- package/dist/lib/personal-import.js.map +1 -1
- package/dist/lib/safe-config-write.d.ts.map +1 -1
- package/dist/lib/safe-config-write.js +39 -2
- package/dist/lib/safe-config-write.js.map +1 -1
- package/dist/lib/scope-choices.d.ts +51 -0
- package/dist/lib/scope-choices.d.ts.map +1 -0
- package/dist/lib/scope-choices.js +193 -0
- package/dist/lib/scope-choices.js.map +1 -0
- package/dist/lib/scope-connect.d.ts +82 -0
- package/dist/lib/scope-connect.d.ts.map +1 -0
- package/dist/lib/scope-connect.js +258 -0
- package/dist/lib/scope-connect.js.map +1 -0
- package/dist/lib/scope-defaults.d.ts +3 -0
- package/dist/lib/scope-defaults.d.ts.map +1 -0
- package/dist/lib/scope-defaults.js +42 -0
- package/dist/lib/scope-defaults.js.map +1 -0
- package/dist/lib/scope-real.d.ts +223 -0
- package/dist/lib/scope-real.d.ts.map +1 -0
- package/dist/lib/scope-real.js +58 -0
- package/dist/lib/scope-real.js.map +1 -0
- package/dist/lib/scope-values.d.ts +76 -0
- package/dist/lib/scope-values.d.ts.map +1 -0
- package/dist/lib/scope-values.js +169 -0
- package/dist/lib/scope-values.js.map +1 -0
- package/dist/lib/scope.d.ts +161 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +323 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/share/command.d.ts +32 -0
- package/dist/lib/share/command.d.ts.map +1 -0
- package/dist/lib/share/command.js +136 -0
- package/dist/lib/share/command.js.map +1 -0
- package/dist/lib/share/ledger.d.ts +59 -0
- package/dist/lib/share/ledger.d.ts.map +1 -0
- package/dist/lib/share/ledger.js +135 -0
- package/dist/lib/share/ledger.js.map +1 -0
- package/dist/lib/share/payload.d.ts +92 -0
- package/dist/lib/share/payload.d.ts.map +1 -0
- package/dist/lib/share/payload.js +138 -0
- package/dist/lib/share/payload.js.map +1 -0
- package/dist/lib/share/pending.d.ts +48 -0
- package/dist/lib/share/pending.d.ts.map +1 -0
- package/dist/lib/share/pending.js +130 -0
- package/dist/lib/share/pending.js.map +1 -0
- package/dist/lib/share/preview.d.ts +18 -0
- package/dist/lib/share/preview.d.ts.map +1 -0
- package/dist/lib/share/preview.js +72 -0
- package/dist/lib/share/preview.js.map +1 -0
- package/dist/lib/share/run.d.ts +115 -0
- package/dist/lib/share/run.d.ts.map +1 -0
- package/dist/lib/share/run.js +261 -0
- package/dist/lib/share/run.js.map +1 -0
- package/dist/lib/share/salt.d.ts +2 -0
- package/dist/lib/share/salt.d.ts.map +1 -0
- package/dist/lib/share/salt.js +44 -0
- package/dist/lib/share/salt.js.map +1 -0
- package/dist/lib/share/secret-patterns.json +100 -0
- package/dist/lib/share/secret-scan.d.ts +19 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -0
- package/dist/lib/share/secret-scan.js +75 -0
- package/dist/lib/share/secret-scan.js.map +1 -0
- package/dist/lib/share/tty.d.ts +4 -0
- package/dist/lib/share/tty.d.ts.map +1 -0
- package/dist/lib/share/tty.js +57 -0
- package/dist/lib/share/tty.js.map +1 -0
- package/dist/lib/share/visible.d.ts +4 -0
- package/dist/lib/share/visible.d.ts.map +1 -0
- package/dist/lib/share/visible.js +30 -0
- package/dist/lib/share/visible.js.map +1 -0
- package/dist/lib/share/wire.d.ts +98 -0
- package/dist/lib/share/wire.d.ts.map +1 -0
- package/dist/lib/share/wire.js +43 -0
- package/dist/lib/share/wire.js.map +1 -0
- package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
- package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
- package/dist/lib/similarity/embedding-matrix.js +119 -0
- package/dist/lib/similarity/embedding-matrix.js.map +1 -0
- package/dist/lib/since-flag.d.ts +11 -0
- package/dist/lib/since-flag.d.ts.map +1 -0
- package/dist/lib/since-flag.js +24 -0
- package/dist/lib/since-flag.js.map +1 -0
- package/dist/lib/since.d.ts +59 -0
- package/dist/lib/since.d.ts.map +1 -0
- package/dist/lib/since.js +86 -0
- package/dist/lib/since.js.map +1 -0
- package/dist/lib/source-key.d.ts +13 -0
- package/dist/lib/source-key.d.ts.map +1 -0
- package/dist/lib/source-key.js +60 -0
- package/dist/lib/source-key.js.map +1 -0
- package/dist/lib/source-sync-state.d.ts +12 -0
- package/dist/lib/source-sync-state.d.ts.map +1 -0
- package/dist/lib/source-sync-state.js +43 -0
- package/dist/lib/source-sync-state.js.map +1 -0
- package/dist/lib/startup-backfill-track.d.ts +2 -0
- package/dist/lib/startup-backfill-track.d.ts.map +1 -0
- package/dist/lib/startup-backfill-track.js +6 -0
- package/dist/lib/startup-backfill-track.js.map +1 -0
- package/dist/lib/startup-xdg.d.ts +2 -0
- package/dist/lib/startup-xdg.d.ts.map +1 -0
- package/dist/lib/startup-xdg.js +9 -0
- package/dist/lib/startup-xdg.js.map +1 -0
- package/dist/lib/sync/after-connect.d.ts +2 -0
- package/dist/lib/sync/after-connect.d.ts.map +1 -0
- package/dist/lib/sync/after-connect.js +18 -0
- package/dist/lib/sync/after-connect.js.map +1 -0
- package/dist/lib/sync/bg-claim.d.ts +14 -0
- package/dist/lib/sync/bg-claim.d.ts.map +1 -0
- package/dist/lib/sync/bg-claim.js +97 -0
- package/dist/lib/sync/bg-claim.js.map +1 -0
- package/dist/lib/sync/blocked.d.ts +8 -0
- package/dist/lib/sync/blocked.d.ts.map +1 -0
- package/dist/lib/sync/blocked.js +44 -0
- package/dist/lib/sync/blocked.js.map +1 -0
- package/dist/lib/sync/classify.d.ts +34 -0
- package/dist/lib/sync/classify.d.ts.map +1 -0
- package/dist/lib/sync/classify.js +91 -0
- package/dist/lib/sync/classify.js.map +1 -0
- package/dist/lib/sync/drain.d.ts +16 -0
- package/dist/lib/sync/drain.d.ts.map +1 -0
- package/dist/lib/sync/drain.js +33 -0
- package/dist/lib/sync/drain.js.map +1 -0
- package/dist/lib/sync/forget.d.ts +12 -0
- package/dist/lib/sync/forget.d.ts.map +1 -0
- package/dist/lib/sync/forget.js +32 -0
- package/dist/lib/sync/forget.js.map +1 -0
- package/dist/lib/sync/launch-hook.d.ts +42 -0
- package/dist/lib/sync/launch-hook.d.ts.map +1 -0
- package/dist/lib/sync/launch-hook.js +117 -0
- package/dist/lib/sync/launch-hook.js.map +1 -0
- package/dist/lib/sync/lock.d.ts +35 -0
- package/dist/lib/sync/lock.d.ts.map +1 -0
- package/dist/lib/sync/lock.js +175 -0
- package/dist/lib/sync/lock.js.map +1 -0
- package/dist/lib/sync/purge.d.ts +38 -0
- package/dist/lib/sync/purge.d.ts.map +1 -0
- package/dist/lib/sync/purge.js +61 -0
- package/dist/lib/sync/purge.js.map +1 -0
- package/dist/lib/sync/real-env.d.ts +208 -0
- package/dist/lib/sync/real-env.d.ts.map +1 -0
- package/dist/lib/sync/real-env.js +47 -0
- package/dist/lib/sync/real-env.js.map +1 -0
- package/dist/lib/sync/relink.d.ts +14 -0
- package/dist/lib/sync/relink.d.ts.map +1 -0
- package/dist/lib/sync/relink.js +36 -0
- package/dist/lib/sync/relink.js.map +1 -0
- package/dist/lib/sync/report.d.ts +3 -0
- package/dist/lib/sync/report.d.ts.map +1 -0
- package/dist/lib/sync/report.js +54 -0
- package/dist/lib/sync/report.js.map +1 -0
- package/dist/lib/sync/run-all.d.ts +23 -0
- package/dist/lib/sync/run-all.d.ts.map +1 -0
- package/dist/lib/sync/run-all.js +30 -0
- package/dist/lib/sync/run-all.js.map +1 -0
- package/dist/lib/sync/run-source.d.ts +73 -0
- package/dist/lib/sync/run-source.d.ts.map +1 -0
- package/dist/lib/sync/run-source.js +262 -0
- package/dist/lib/sync/run-source.js.map +1 -0
- package/dist/lib/sync/safe-read.d.ts +4 -0
- package/dist/lib/sync/safe-read.d.ts.map +1 -0
- package/dist/lib/sync/safe-read.js +40 -0
- package/dist/lib/sync/safe-read.js.map +1 -0
- package/dist/lib/sync/should-background-sync.d.ts +31 -0
- package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
- package/dist/lib/sync/should-background-sync.js +69 -0
- package/dist/lib/sync/should-background-sync.js.map +1 -0
- package/dist/lib/sync/source-ids.d.ts +10 -0
- package/dist/lib/sync/source-ids.d.ts.map +1 -0
- package/dist/lib/sync/source-ids.js +9 -0
- package/dist/lib/sync/source-ids.js.map +1 -0
- package/dist/lib/sync/sources.d.ts +33 -0
- package/dist/lib/sync/sources.d.ts.map +1 -0
- package/dist/lib/sync/sources.js +37 -0
- package/dist/lib/sync/sources.js.map +1 -0
- package/dist/lib/sync/spawn-background.d.ts +27 -0
- package/dist/lib/sync/spawn-background.d.ts.map +1 -0
- package/dist/lib/sync/spawn-background.js +66 -0
- package/dist/lib/sync/spawn-background.js.map +1 -0
- package/dist/lib/sync/status.d.ts +57 -0
- package/dist/lib/sync/status.d.ts.map +1 -0
- package/dist/lib/sync/status.js +166 -0
- package/dist/lib/sync/status.js.map +1 -0
- package/dist/lib/sync/summary-read.d.ts +19 -0
- package/dist/lib/sync/summary-read.d.ts.map +1 -0
- package/dist/lib/sync/summary-read.js +39 -0
- package/dist/lib/sync/summary-read.js.map +1 -0
- package/dist/lib/sync/summary.d.ts +10 -0
- package/dist/lib/sync/summary.d.ts.map +1 -0
- package/dist/lib/sync/summary.js +80 -0
- package/dist/lib/sync/summary.js.map +1 -0
- package/dist/lib/sync/sync-state.d.ts +128 -0
- package/dist/lib/sync/sync-state.d.ts.map +1 -0
- package/dist/lib/sync/sync-state.js +253 -0
- package/dist/lib/sync/sync-state.js.map +1 -0
- package/dist/lib/sync/telemetry.d.ts +20 -0
- package/dist/lib/sync/telemetry.d.ts.map +1 -0
- package/dist/lib/sync/telemetry.js +31 -0
- package/dist/lib/sync/telemetry.js.map +1 -0
- package/dist/lib/sync/threads.d.ts +48 -0
- package/dist/lib/sync/threads.d.ts.map +1 -0
- package/dist/lib/sync/threads.js +82 -0
- package/dist/lib/sync/threads.js.map +1 -0
- package/dist/lib/sync/window.d.ts +72 -0
- package/dist/lib/sync/window.d.ts.map +1 -0
- package/dist/lib/sync/window.js +112 -0
- package/dist/lib/sync/window.js.map +1 -0
- package/dist/lib/team-cta.d.ts +11 -0
- package/dist/lib/team-cta.d.ts.map +1 -0
- package/dist/lib/team-cta.js +16 -0
- package/dist/lib/team-cta.js.map +1 -0
- package/dist/lib/telemetry-ci.d.ts +2 -0
- package/dist/lib/telemetry-ci.d.ts.map +1 -0
- package/dist/lib/telemetry-ci.js +21 -0
- package/dist/lib/telemetry-ci.js.map +1 -0
- package/dist/lib/telemetry-consent.d.ts +44 -23
- package/dist/lib/telemetry-consent.d.ts.map +1 -1
- package/dist/lib/telemetry-consent.js +74 -35
- package/dist/lib/telemetry-consent.js.map +1 -1
- package/dist/lib/telemetry-env.d.ts +1 -1
- package/dist/lib/usage-telemetry.d.ts +87 -22
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +263 -74
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/dist/lib/xdg.d.ts +27 -0
- package/dist/lib/xdg.d.ts.map +1 -0
- package/dist/lib/xdg.js +56 -0
- package/dist/lib/xdg.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -98
- package/dist/commands/push.js.map +0 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
export interface TwinRow {
|
|
3
|
+
id: string;
|
|
4
|
+
rowid: number;
|
|
5
|
+
created_at: string;
|
|
6
|
+
title: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
ratified_by: string | null;
|
|
9
|
+
ratified_at: string | null;
|
|
10
|
+
confirmed_by: string | null;
|
|
11
|
+
confirmed_at: string | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fold a set of twins of one item into one row. Survivor: the earliest ratified row, else the
|
|
15
|
+
* earliest confirmed row, else `preferred` (the keyed holder at runtime) or the newest. A row a
|
|
16
|
+
* person ratified or confirmed keeps ITS text and vector: the attestation covers text they
|
|
17
|
+
* read, so newer upstream text is recorded as a `text_revision_pending` audit note instead of
|
|
18
|
+
* replacing it. An unattested survivor holds the newest text already. Either way the survivor
|
|
19
|
+
* keeps the earliest created_at and carries any ratification or confirmation a loser held that
|
|
20
|
+
* it lacks. A SECOND ratified twin with different text is a disagreement between two people:
|
|
21
|
+
* its ratification is kept as a `ratification_conflict` audit row (by, at, text) on the
|
|
22
|
+
* survivor. The local graph has no decision flag column or status surface for that, so the
|
|
23
|
+
* audit row is the visible record. Caller owns the transaction.
|
|
24
|
+
*/
|
|
25
|
+
export declare function foldTwins(db: DatabaseSync, twins: TwinRow[], key: string, actor: string, preferred?: string): void;
|
|
26
|
+
/** Runtime entry: fold the keyless row `twinId` into the row holding `key`, in one transaction
|
|
27
|
+
* (no partial re-points, no duplicate backup row on a retry). */
|
|
28
|
+
export declare function foldKeylessTwin(db: DatabaseSync, twinId: string, holderId: string, key: string): void;
|
|
29
|
+
export declare function migrateV7(db: DatabaseSync): void;
|
|
30
|
+
//# sourceMappingURL=local-db-v7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v7.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v7.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAyHhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAC9E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAClH;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA0ClH;AAID;kEACkE;AAClE,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAYrG;AAQD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8ChD"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema v7 (plan phase L2): one bump for sync state, source identity, enrichment and local
|
|
3
|
+
* judgements. Called from migrate() in local-db-migrate.ts, inside the `version < 7` branch.
|
|
4
|
+
*
|
|
5
|
+
* What it adds:
|
|
6
|
+
* - `source_sync`: one row per (source, scope) - window, watermark, status and who changed it
|
|
7
|
+
* (`changed_via` cli|mcp, plus the agent for mcp). A widened scope is a NEW row, so it starts
|
|
8
|
+
* a fresh window instead of inheriting the narrow scope's watermark.
|
|
9
|
+
* - `decisions.source_key`: the identity of a one-item-per-URL connector item
|
|
10
|
+
* (source-key.ts). (source_url, title) stays the identity of every other row, because a
|
|
11
|
+
* session transcript or a manual capture can hold several decisions under one URL.
|
|
12
|
+
* - `decisions.detail_pending`: 1 while a GitHub item's discussion has not been fetched yet.
|
|
13
|
+
* - `decisions.enriched_at`: set by ingestOne as its LAST write, after the link pass. NULL on
|
|
14
|
+
* every row that exists at upgrade, on purpose: nothing on disk tells a finished ingest from
|
|
15
|
+
* one that died between embedding and linking, so every row is re-linked once by the next
|
|
16
|
+
* sync (Decision 30). The migration itself does no re-linking, so it stays fast.
|
|
17
|
+
* - `local_judgements`: a person's verdict on a decision, with judge, time and cli|mcp origin.
|
|
18
|
+
* No foreign key to `decisions`, like C7's `promotions`: a purge must not erase a record the
|
|
19
|
+
* user may still want to share. Ratification is not here (Decision 14).
|
|
20
|
+
* - `decisions_merged_backup`, `decision_embeddings_merged_backup`, `decision_refs_merged_backup`:
|
|
21
|
+
* every decision row the twin merge deletes, with that row's vector and refs. That is what a
|
|
22
|
+
* restore can recover (INSERT ... SELECT the three back). It is NOT a full undo: links, audit
|
|
23
|
+
* rows, local judgements and promotions that named a loser were RE-POINTED at the survivor
|
|
24
|
+
* (a link between two twins, and a duplicate link's lower confidence, were dropped), and are
|
|
25
|
+
* not copied anywhere. A restored loser comes back without them.
|
|
26
|
+
*
|
|
27
|
+
* Twin merge (Decision 3). v6 keyed rows on (source_url, title), so an edited PR or issue title
|
|
28
|
+
* wrote a second row for the same item. Rows sharing a source_key are merged: the survivor is
|
|
29
|
+
* the first ratified row, else the first confirmed row, else the most recently inserted. An
|
|
30
|
+
* unattested survivor holds the newest text (it is the newest row). An attested survivor KEEPS
|
|
31
|
+
* its own text and vector, and the newer text is stored as a `text_revision_pending` audit note
|
|
32
|
+
* (mergeGroup). Everything that named a loser is re-pointed; a link between two twins is dropped
|
|
33
|
+
* rather than turned into a self-link; a duplicate link keeps the higher confidence.
|
|
34
|
+
*
|
|
35
|
+
* Replay-safe: every CREATE is IF NOT EXISTS, every ALTER is guarded by table_info, keys are
|
|
36
|
+
* computed only where NULL, and a second pass finds no group of twins left to merge.
|
|
37
|
+
*/
|
|
38
|
+
import { copyRowsToBackup } from './backup-copy.js';
|
|
39
|
+
import { bumpRowSetEpoch } from './local-db-epoch.js';
|
|
40
|
+
import { isCaptureShaped } from './local-ingest.js';
|
|
41
|
+
import { connectorItemKey } from './source-key.js';
|
|
42
|
+
const V7_TABLES = `
|
|
43
|
+
CREATE TABLE IF NOT EXISTS source_sync (
|
|
44
|
+
source_id TEXT NOT NULL,
|
|
45
|
+
scope_key TEXT NOT NULL,
|
|
46
|
+
scope TEXT NOT NULL CHECK (scope IN ('yours', 'team')),
|
|
47
|
+
window_since TEXT,
|
|
48
|
+
high_water TEXT,
|
|
49
|
+
pending_until TEXT,
|
|
50
|
+
status TEXT NOT NULL DEFAULT 'ok' CHECK (status IN ('ok', 'partial', 'needs_reauth', 'error')),
|
|
51
|
+
last_started_at TEXT,
|
|
52
|
+
last_success_at TEXT,
|
|
53
|
+
items_last_run INTEGER,
|
|
54
|
+
skips_last_run TEXT,
|
|
55
|
+
changed_via TEXT CHECK (changed_via IS NULL OR changed_via IN ('cli', 'mcp')),
|
|
56
|
+
changed_by_agent TEXT,
|
|
57
|
+
PRIMARY KEY (source_id, scope_key)
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE TABLE IF NOT EXISTS local_judgements (
|
|
61
|
+
id TEXT PRIMARY KEY,
|
|
62
|
+
decision_id TEXT NOT NULL,
|
|
63
|
+
counterpart_id TEXT,
|
|
64
|
+
context_key TEXT,
|
|
65
|
+
kind TEXT NOT NULL CHECK (kind IN ('conflict_verdict', 'check_verdict', 'supersede', 'not_a_decision', 'note')),
|
|
66
|
+
value TEXT CHECK (value IS NULL OR value IN ('real', 'false')),
|
|
67
|
+
note TEXT,
|
|
68
|
+
judge_id TEXT NOT NULL,
|
|
69
|
+
judge_label TEXT,
|
|
70
|
+
via TEXT NOT NULL CHECK (via IN ('cli', 'mcp')),
|
|
71
|
+
agent_id TEXT,
|
|
72
|
+
judged_at TEXT NOT NULL,
|
|
73
|
+
CHECK ((via = 'mcp') = (agent_id IS NOT NULL)),
|
|
74
|
+
CHECK ((kind = 'check_verdict') = (context_key IS NOT NULL))
|
|
75
|
+
);
|
|
76
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uq_local_judgements_person
|
|
77
|
+
ON local_judgements (decision_id, COALESCE(counterpart_id, context_key, decision_id), judge_id, kind)
|
|
78
|
+
WHERE kind <> 'note';
|
|
79
|
+
`;
|
|
80
|
+
/** Created LAST: the source_key index cannot build while twins still share a key. */
|
|
81
|
+
const V7_INDEXES = `
|
|
82
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uq_decisions_source_key ON decisions(source_key) WHERE source_key IS NOT NULL;
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_decisions_detail_pending ON decisions(platform, decided_at) WHERE detail_pending = 1;
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_decisions_not_enriched ON decisions(created_at) WHERE enriched_at IS NULL;
|
|
85
|
+
`;
|
|
86
|
+
const V7_COLUMNS = [
|
|
87
|
+
['source_key', 'source_key TEXT'],
|
|
88
|
+
['detail_pending', 'detail_pending INTEGER NOT NULL DEFAULT 0'],
|
|
89
|
+
['enriched_at', 'enriched_at TEXT'],
|
|
90
|
+
];
|
|
91
|
+
function tableExists(db, name) {
|
|
92
|
+
return db.prepare(`SELECT 1 AS hit FROM sqlite_master WHERE type = 'table' AND name = ?`).get(name) !== undefined;
|
|
93
|
+
}
|
|
94
|
+
function columnsOf(db, table) {
|
|
95
|
+
return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map(c => c.name));
|
|
96
|
+
}
|
|
97
|
+
/** Rows naming `from` now name `to`. A row whose re-pointed key already exists is left on the
|
|
98
|
+
* loser's id (the loser is in the backup table), never deleted: losing a record is the
|
|
99
|
+
* destructive direction, and an orphan pointing at a backed-up row can still be restored. */
|
|
100
|
+
function repoint(db, table, column, from, to) {
|
|
101
|
+
db.prepare(`UPDATE OR IGNORE ${table} SET ${column} = ? WHERE ${column} = ?`).run(to, from);
|
|
102
|
+
}
|
|
103
|
+
function repointLinks(db, loser, survivor, group) {
|
|
104
|
+
const links = db.prepare(`SELECT id, source_id AS s, target_id AS t, relation, confidence FROM decision_links WHERE source_id = ? OR target_id = ?`)
|
|
105
|
+
.all(loser, loser);
|
|
106
|
+
for (const link of links) {
|
|
107
|
+
const s = link.s === loser ? survivor : link.s;
|
|
108
|
+
const t = link.t === loser ? survivor : link.t;
|
|
109
|
+
// A link between two twins of one item would become a self-link: drop it.
|
|
110
|
+
if (s === t || (group.has(s) && group.has(t))) {
|
|
111
|
+
db.prepare('DELETE FROM decision_links WHERE id = ?').run(link.id);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const existing = db.prepare('SELECT id FROM decision_links WHERE source_id = ? AND target_id = ? AND relation = ?')
|
|
115
|
+
.get(s, t, link.relation);
|
|
116
|
+
if (existing) {
|
|
117
|
+
db.prepare('UPDATE decision_links SET confidence = MAX(confidence, ?) WHERE id = ?').run(link.confidence, existing.id);
|
|
118
|
+
db.prepare('DELETE FROM decision_links WHERE id = ?').run(link.id);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
db.prepare('UPDATE decision_links SET source_id = ?, target_id = ? WHERE id = ?').run(s, t, link.id);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Fold one twin into its survivor: back the row up, re-point everything that named it, delete
|
|
126
|
+
* it. The loser's vector is dropped: the survivor keeps its own text, so it keeps its own
|
|
127
|
+
* vector (a survivor that takes newer text is the newest row, which already holds that
|
|
128
|
+
* text's vector). Also used by insertDecision to absorb a keyless row written by an older
|
|
129
|
+
* binary. */
|
|
130
|
+
function absorbLoser(db, loserId, survivorId, group, actor) {
|
|
131
|
+
bumpRowSetEpoch(db);
|
|
132
|
+
const hasJudgements = tableExists(db, 'local_judgements');
|
|
133
|
+
const hasPromotions = tableExists(db, 'promotions');
|
|
134
|
+
copyRowsToBackup(db, 'decisions', 'decisions_merged_backup', 'id', loserId);
|
|
135
|
+
copyRowsToBackup(db, 'decision_embeddings', 'decision_embeddings_merged_backup', 'decision_id', loserId);
|
|
136
|
+
copyRowsToBackup(db, 'decision_refs', 'decision_refs_merged_backup', 'decision_id', loserId);
|
|
137
|
+
repoint(db, 'decision_audit', 'decision_id', loserId, survivorId);
|
|
138
|
+
repointLinks(db, loserId, survivorId, group);
|
|
139
|
+
repoint(db, 'decision_refs', 'decision_id', loserId, survivorId);
|
|
140
|
+
if (hasJudgements) {
|
|
141
|
+
repoint(db, 'local_judgements', 'decision_id', loserId, survivorId);
|
|
142
|
+
repoint(db, 'local_judgements', 'counterpart_id', loserId, survivorId);
|
|
143
|
+
}
|
|
144
|
+
if (hasPromotions)
|
|
145
|
+
repoint(db, 'promotions', 'local_id', loserId, survivorId);
|
|
146
|
+
// Refs the survivor already had stay as they are; the loser's leftovers are duplicates.
|
|
147
|
+
db.prepare('DELETE FROM decision_refs WHERE decision_id = ?').run(loserId);
|
|
148
|
+
db.prepare('DELETE FROM decision_embeddings WHERE decision_id = ?').run(loserId);
|
|
149
|
+
db.prepare('DELETE FROM decisions WHERE id = ?').run(loserId);
|
|
150
|
+
db.prepare(`INSERT INTO decision_audit (id, decision_id, action, actor, detail) VALUES (lower(hex(randomblob(16))), ?, 'merged', ?, ?)`)
|
|
151
|
+
.run(survivorId, actor, loserId);
|
|
152
|
+
}
|
|
153
|
+
/** Earliest first by the attestation time, ties by insertion order. */
|
|
154
|
+
function earliestBy(twins, at) {
|
|
155
|
+
return twins.filter(t => t[at] !== null)
|
|
156
|
+
.sort((a, b) => (a[at] < b[at] ? -1 : a[at] > b[at] ? 1 : a.rowid - b.rowid));
|
|
157
|
+
}
|
|
158
|
+
const auditInsert = `INSERT INTO decision_audit (id, decision_id, action, actor, detail) VALUES (lower(hex(randomblob(16))), ?, ?, ?, ?)`;
|
|
159
|
+
/**
|
|
160
|
+
* Fold a set of twins of one item into one row. Survivor: the earliest ratified row, else the
|
|
161
|
+
* earliest confirmed row, else `preferred` (the keyed holder at runtime) or the newest. A row a
|
|
162
|
+
* person ratified or confirmed keeps ITS text and vector: the attestation covers text they
|
|
163
|
+
* read, so newer upstream text is recorded as a `text_revision_pending` audit note instead of
|
|
164
|
+
* replacing it. An unattested survivor holds the newest text already. Either way the survivor
|
|
165
|
+
* keeps the earliest created_at and carries any ratification or confirmation a loser held that
|
|
166
|
+
* it lacks. A SECOND ratified twin with different text is a disagreement between two people:
|
|
167
|
+
* its ratification is kept as a `ratification_conflict` audit row (by, at, text) on the
|
|
168
|
+
* survivor. The local graph has no decision flag column or status surface for that, so the
|
|
169
|
+
* audit row is the visible record. Caller owns the transaction.
|
|
170
|
+
*/
|
|
171
|
+
export function foldTwins(db, twins, key, actor, preferred) {
|
|
172
|
+
const newest = twins[twins.length - 1];
|
|
173
|
+
const ratifiedAll = earliestBy(twins, 'ratified_at');
|
|
174
|
+
const ratified = ratifiedAll[0];
|
|
175
|
+
const confirmed = earliestBy(twins, 'confirmed_at')[0];
|
|
176
|
+
const attested = ratified ?? confirmed;
|
|
177
|
+
const survivor = attested ?? twins.find(t => t.id === preferred) ?? newest;
|
|
178
|
+
const group = new Set(twins.map(t => t.id));
|
|
179
|
+
const earliestCreated = twins.map(t => t.created_at).sort()[0];
|
|
180
|
+
const latest = db.prepare('SELECT source_url, repo, decided_at FROM decisions WHERE id = ?')
|
|
181
|
+
.get(newest.id);
|
|
182
|
+
for (const loser of twins.filter(t => t.id !== survivor.id))
|
|
183
|
+
absorbLoser(db, loser.id, survivor.id, group, actor);
|
|
184
|
+
const others = ratifiedAll.slice(1).filter(t => t.id !== survivor.id);
|
|
185
|
+
const conflicts = others.filter(t => t.title !== survivor.title || t.summary !== survivor.summary);
|
|
186
|
+
// A second ratifier of the SAME text: their ratification would otherwise exist only in the backup.
|
|
187
|
+
for (const t of others.filter(o => !conflicts.includes(o))) {
|
|
188
|
+
db.prepare(auditInsert).run(survivor.id, 'ratification_agreed', actor, JSON.stringify({ by: t.ratified_by, at: t.ratified_at }));
|
|
189
|
+
}
|
|
190
|
+
for (const c of conflicts) {
|
|
191
|
+
db.prepare(auditInsert).run(survivor.id, 'ratification_conflict', actor, JSON.stringify({ by: c.ratified_by, at: c.ratified_at, title: c.title, summary: c.summary }));
|
|
192
|
+
}
|
|
193
|
+
if (attested === undefined) {
|
|
194
|
+
db.prepare('UPDATE decisions SET source_url = ?, repo = COALESCE(?, repo), decided_at = COALESCE(?, decided_at) WHERE id = ?')
|
|
195
|
+
.run(latest.source_url, latest.repo, latest.decided_at, survivor.id);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
db.prepare('UPDATE decisions SET repo = COALESCE(?, repo), decided_at = COALESCE(?, decided_at) WHERE id = ?')
|
|
199
|
+
.run(latest.repo, latest.decided_at, survivor.id);
|
|
200
|
+
const covered = conflicts.some(c => c.id === newest.id);
|
|
201
|
+
if (newest.id !== survivor.id && !covered && (newest.title !== survivor.title || newest.summary !== survivor.summary)) {
|
|
202
|
+
db.prepare(auditInsert).run(survivor.id, 'text_revision_pending', actor, JSON.stringify({ title: newest.title, summary: newest.summary }));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
db.prepare(`UPDATE decisions SET created_at = ?, source_key = ?,
|
|
206
|
+
ratified_by = COALESCE(ratified_by, ?), ratified_at = COALESCE(ratified_at, ?),
|
|
207
|
+
confirmed_by = COALESCE(confirmed_by, ?), confirmed_at = COALESCE(confirmed_at, ?)
|
|
208
|
+
WHERE id = ?`).run(earliestCreated, key, ratified?.ratified_by ?? null, ratified?.ratified_at ?? null, confirmed?.confirmed_by ?? null, confirmed?.confirmed_at ?? null, survivor.id);
|
|
209
|
+
}
|
|
210
|
+
const TWIN_COLUMNS = 'id, rowid, created_at, title, summary, ratified_by, ratified_at, confirmed_by, confirmed_at';
|
|
211
|
+
/** Runtime entry: fold the keyless row `twinId` into the row holding `key`, in one transaction
|
|
212
|
+
* (no partial re-points, no duplicate backup row on a retry). */
|
|
213
|
+
export function foldKeylessTwin(db, twinId, holderId, key) {
|
|
214
|
+
const own = !db.isTransaction;
|
|
215
|
+
if (own)
|
|
216
|
+
db.exec('BEGIN IMMEDIATE');
|
|
217
|
+
try {
|
|
218
|
+
const twins = db.prepare(`SELECT ${TWIN_COLUMNS} FROM decisions WHERE id IN (?, ?) ORDER BY rowid`)
|
|
219
|
+
.all(twinId, holderId);
|
|
220
|
+
foldTwins(db, twins, key, 'sync', holderId);
|
|
221
|
+
if (own)
|
|
222
|
+
db.exec('COMMIT');
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
if (own && db.isTransaction)
|
|
226
|
+
db.exec('ROLLBACK');
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function mergeGroup(db, key) {
|
|
231
|
+
const twins = db.prepare(`SELECT ${TWIN_COLUMNS} FROM decisions WHERE source_key = ? ORDER BY rowid`)
|
|
232
|
+
.all(key);
|
|
233
|
+
foldTwins(db, twins, key, 'migration');
|
|
234
|
+
}
|
|
235
|
+
export function migrateV7(db) {
|
|
236
|
+
const existing = columnsOf(db, 'decisions');
|
|
237
|
+
for (const [name, ddl] of V7_COLUMNS) {
|
|
238
|
+
if (!existing.has(name))
|
|
239
|
+
db.exec(`ALTER TABLE decisions ADD COLUMN ${ddl}`);
|
|
240
|
+
}
|
|
241
|
+
db.exec(V7_TABLES);
|
|
242
|
+
// After the ALTERs, so the backup carries every column a row can hold.
|
|
243
|
+
db.exec('CREATE TABLE IF NOT EXISTS decisions_merged_backup AS SELECT * FROM decisions WHERE 0');
|
|
244
|
+
db.exec('CREATE TABLE IF NOT EXISTS decision_embeddings_merged_backup AS SELECT * FROM decision_embeddings WHERE 0');
|
|
245
|
+
db.exec('CREATE TABLE IF NOT EXISTS decision_refs_merged_backup AS SELECT * FROM decision_refs WHERE 0');
|
|
246
|
+
// Only rows that look like connector imports are keyed. A v6 row cannot say how it was
|
|
247
|
+
// written, and `align capture <PR url>` wrote platform github too, so the rule is on the
|
|
248
|
+
// row: a capture has the summary "Captured from <host>" or the URL's last path segment as
|
|
249
|
+
// its title (isCaptureShaped). Those stay unkeyed. When unsure, do not merge: the cost of
|
|
250
|
+
// a missed twin is a duplicate the next sync can still resolve, the cost of a wrong merge
|
|
251
|
+
// is a lost record.
|
|
252
|
+
const unkeyed = db.prepare('SELECT id, platform, source_url, title, summary FROM decisions WHERE source_key IS NULL AND source_url IS NOT NULL')
|
|
253
|
+
.all();
|
|
254
|
+
const setKey = db.prepare('UPDATE decisions SET source_key = ? WHERE id = ?');
|
|
255
|
+
for (const row of unkeyed) {
|
|
256
|
+
if (isCaptureShaped(row))
|
|
257
|
+
continue;
|
|
258
|
+
const key = connectorItemKey(row.platform, row.source_url);
|
|
259
|
+
if (key !== undefined)
|
|
260
|
+
setKey.run(key, row.id);
|
|
261
|
+
}
|
|
262
|
+
// Non-unique and temporary: the unique index cannot exist while twins share a key, and
|
|
263
|
+
// without any index each group's `WHERE source_key = ?` scanned the whole table.
|
|
264
|
+
db.exec('CREATE INDEX IF NOT EXISTS tmp_v7_key ON decisions(source_key)');
|
|
265
|
+
const groups = db.prepare('SELECT source_key AS k FROM decisions WHERE source_key IS NOT NULL GROUP BY source_key HAVING count(*) > 1')
|
|
266
|
+
.all();
|
|
267
|
+
// The fold looks up links by target, audit rows and judgements by decision for every loser;
|
|
268
|
+
// none of those has an index (links are indexed by source only), so 3k merges scanned the
|
|
269
|
+
// tables 3k times. Temporary, created inside the migration's transaction and dropped with it.
|
|
270
|
+
const temp = [
|
|
271
|
+
'CREATE INDEX IF NOT EXISTS tmp_v7_links_target ON decision_links(target_id)',
|
|
272
|
+
'CREATE INDEX IF NOT EXISTS tmp_v7_audit_decision ON decision_audit(decision_id)',
|
|
273
|
+
'CREATE INDEX IF NOT EXISTS tmp_v7_judgements_counterpart ON local_judgements(counterpart_id)',
|
|
274
|
+
];
|
|
275
|
+
if (groups.length > 0)
|
|
276
|
+
for (const ddl of temp)
|
|
277
|
+
db.exec(ddl);
|
|
278
|
+
for (const { k } of groups)
|
|
279
|
+
mergeGroup(db, k);
|
|
280
|
+
for (const name of ['tmp_v7_key', 'tmp_v7_links_target', 'tmp_v7_audit_decision', 'tmp_v7_judgements_counterpart']) {
|
|
281
|
+
db.exec(`DROP INDEX IF EXISTS ${name}`);
|
|
282
|
+
}
|
|
283
|
+
db.exec(V7_INDEXES);
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=local-db-v7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v7.js","sourceRoot":"","sources":["../../src/lib/local-db-v7.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCjB,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,GAAG;;;;CAIlB,CAAC;AAEF,MAAM,UAAU,GAAuC;IACrD,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACjC,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;IAC/D,CAAC,aAAa,EAAE,kBAAkB,CAAC;CACpC,CAAC;AAEF,SAAS,WAAW,CAAC,EAAgB,EAAE,IAAY;IACjD,OAAO,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;AACpH,CAAC;AAED,SAAS,SAAS,CAAC,EAAgB,EAAE,KAAa;IAChD,OAAO,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChH,CAAC;AAED;;8FAE8F;AAC9F,SAAS,OAAO,CAAC,EAAgB,EAAE,KAAa,EAAE,MAAc,EAAE,IAAY,EAAE,EAAU;IACxF,EAAE,CAAC,OAAO,CAAC,oBAAoB,KAAK,QAAQ,MAAM,cAAc,MAAM,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,YAAY,CAAC,EAAgB,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAkB;IACzF,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,0HAA0H,CAAC;SACjJ,GAAG,CAAC,KAAK,EAAE,KAAK,CAAsF,CAAC;IAC1G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,0EAA0E;QAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,sFAAsF,CAAC;aAChH,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAA+B,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvH,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;cAIc;AACd,SAAS,WAAW,CAAC,EAAgB,EAAE,OAAe,EAAE,UAAkB,EAAE,KAAkB,EAAE,KAAa;IAC3G,eAAe,CAAC,EAAE,CAAC,CAAC;IACpB,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACpD,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,gBAAgB,CAAC,EAAE,EAAE,qBAAqB,EAAE,mCAAmC,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACzG,gBAAgB,CAAC,EAAE,EAAE,eAAe,EAAE,6BAA6B,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAC7F,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAClE,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACjE,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACpE,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,aAAa;QAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9E,wFAAwF;IACxF,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3E,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjF,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9D,EAAE,CAAC,OAAO,CAAC,4HAA4H,CAAC;SACrI,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAOD,uEAAuE;AACvE,SAAS,UAAU,CAAC,KAAgB,EAAE,EAAkC;IACtE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,WAAW,GAAG,qHAAqH,CAAC;AAE1I;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,KAAgB,EAAE,GAAW,EAAE,KAAa,EAAE,SAAkB;IAC1G,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAE,CAAC;IAChE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC;SACzF,GAAG,CAAC,MAAM,CAAC,EAAE,CAAkF,CAAC;IAEnG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;QAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAElH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnG,mGAAmG;IACnG,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnI,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,uBAAuB,EAAE,KAAK,EACrE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,EAAE,CAAC,OAAO,CAAC,kHAAkH,CAAC;aAC3H,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,OAAO,CAAC,kGAAkG,CAAC;aAC3G,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtH,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7I,CAAC;IACH,CAAC;IACD,EAAE,CAAC,OAAO,CACR;;;kBAGc,CACf,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI,EACtF,SAAS,EAAE,YAAY,IAAI,IAAI,EAAE,SAAS,EAAE,YAAY,IAAI,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,YAAY,GAAG,6FAA6F,CAAC;AAEnH;kEACkE;AAClE,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,MAAc,EAAE,QAAgB,EAAE,GAAW;IAC7F,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC;IAC9B,IAAI,GAAG;QAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,YAAY,mDAAmD,CAAC;aAChG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAyB,CAAC;QACjD,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,GAAG;YAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,IAAI,EAAE,CAAC,aAAa;YAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,GAAW;IAC/C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,YAAY,qDAAqD,CAAC;SAClG,GAAG,CAAC,GAAG,CAAyB,CAAC;IACpC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnB,uEAAuE;IACvE,EAAE,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACjG,EAAE,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;IACrH,EAAE,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAEzG,uFAAuF;IACvF,yFAAyF;IACzF,0FAA0F;IAC1F,0FAA0F;IAC1F,0FAA0F;IAC1F,oBAAoB;IACpB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,oHAAoH,CAAC;SAC7I,GAAG,EAAiG,CAAC;IACxG,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;IAC9E,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,eAAe,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,uFAAuF;IACvF,iFAAiF;IACjF,EAAE,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,4GAA4G,CAAC;SACpI,GAAG,EAA0B,CAAC;IACjC,4FAA4F;IAC5F,0FAA0F;IAC1F,8FAA8F;IAC9F,MAAM,IAAI,GAAa;QACrB,6EAA6E;QAC7E,iFAAiF;QACjF,8FAA8F;KAC/F,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM;QAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,+BAA+B,CAAC,EAAE,CAAC;QACnH,EAAE,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema v8 (L5 review): the sync's own state moves into the migration system.
|
|
3
|
+
*
|
|
4
|
+
* - `source_sync.cycle_top`: the newest `updated_at` seen across a pending cycle (a read a ceiling
|
|
5
|
+
* split over several runs), kept in the scope's own row so another scope's items can never
|
|
6
|
+
* lift this scope's watermark.
|
|
7
|
+
* - `source_sync.last_attempt_at`: every run stamps it; `last_success_at` is stamped only by a
|
|
8
|
+
* COMPLETE run, so a source that is always partial no longer reads as freshly synced.
|
|
9
|
+
* - `sync_item_state`: the vendor's own last-updated time per stored item and scope (hot Slack
|
|
10
|
+
* threads). A cache of vendor facts, rebuilt by the next wide read. An earlier, unreleased shape
|
|
11
|
+
* of this table (no scope column, created outside the migrations) is replaced and its rows carried across.
|
|
12
|
+
* - `*_purged_backup`: every row `align local forget --purge` deletes is copied here first, with its
|
|
13
|
+
* vector and refs, inside the same transaction. Links, audit rows and judgements of a purged
|
|
14
|
+
* row are not copied (a purge never touches a row that has an audit act or a judgement).
|
|
15
|
+
*
|
|
16
|
+
* An earlier, unreleased shape of `sync_item_state` (no scope column) keeps its rows, as scope 'yours'.
|
|
17
|
+
*
|
|
18
|
+
* Replay-safe: every ALTER is guarded by table_info, every CREATE is IF NOT EXISTS.
|
|
19
|
+
*/
|
|
20
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
21
|
+
export declare function migrateV8(db: DatabaseSync): void;
|
|
22
|
+
//# sourceMappingURL=local-db-v8.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v8.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v8.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0BhD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function columnsOf(db, table) {
|
|
2
|
+
return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((c) => c.name));
|
|
3
|
+
}
|
|
4
|
+
export function migrateV8(db) {
|
|
5
|
+
const sync = columnsOf(db, 'source_sync');
|
|
6
|
+
for (const [name, ddl] of [['cycle_top', 'cycle_top TEXT'], ['last_attempt_at', 'last_attempt_at TEXT']]) {
|
|
7
|
+
if (!sync.has(name))
|
|
8
|
+
db.exec(`ALTER TABLE source_sync ADD COLUMN ${ddl}`);
|
|
9
|
+
}
|
|
10
|
+
// An earlier, unreleased shape (no scope column, created outside the migrations) is set aside and its rows
|
|
11
|
+
// carried across as scope 'yours', the only scope that ever wrote them.
|
|
12
|
+
const state = columnsOf(db, 'sync_item_state');
|
|
13
|
+
const legacy = state.size > 0 && !state.has('scope_key');
|
|
14
|
+
if (legacy)
|
|
15
|
+
db.exec('ALTER TABLE sync_item_state RENAME TO sync_item_state_unscoped');
|
|
16
|
+
db.exec(`CREATE TABLE IF NOT EXISTS sync_item_state (
|
|
17
|
+
decision_id TEXT NOT NULL,
|
|
18
|
+
scope_key TEXT NOT NULL DEFAULT 'yours',
|
|
19
|
+
platform TEXT NOT NULL,
|
|
20
|
+
updated_at TEXT NOT NULL,
|
|
21
|
+
PRIMARY KEY (decision_id, scope_key)
|
|
22
|
+
)`);
|
|
23
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_item_state_platform ON sync_item_state(platform)');
|
|
24
|
+
if (legacy) {
|
|
25
|
+
db.exec(`INSERT OR IGNORE INTO sync_item_state (decision_id, scope_key, platform, updated_at)
|
|
26
|
+
SELECT decision_id, 'yours', platform, updated_at FROM sync_item_state_unscoped`);
|
|
27
|
+
db.exec('DROP TABLE sync_item_state_unscoped');
|
|
28
|
+
}
|
|
29
|
+
db.exec('CREATE TABLE IF NOT EXISTS decisions_purged_backup AS SELECT * FROM decisions WHERE 0');
|
|
30
|
+
db.exec('CREATE TABLE IF NOT EXISTS decision_embeddings_purged_backup AS SELECT * FROM decision_embeddings WHERE 0');
|
|
31
|
+
db.exec('CREATE TABLE IF NOT EXISTS decision_refs_purged_backup AS SELECT * FROM decision_refs WHERE 0');
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=local-db-v8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v8.js","sourceRoot":"","sources":["../../src/lib/local-db-v8.ts"],"names":[],"mappings":"AAqBA,SAAS,SAAS,CAAC,EAAgB,EAAE,KAAa;IAChD,OAAO,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAU,EAAE,CAAC;QAClH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,2GAA2G;IAC3G,wEAAwE;IACxE,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,EAAE,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IACtF,EAAE,CAAC,IAAI,CAAC;;;;;;IAMN,CAAC,CAAC;IACJ,EAAE,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IAChG,IAAI,MAAM,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CAAC;6FACiF,CAAC,CAAC;QAC3F,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACjD,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACjG,EAAE,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;IACrH,EAAE,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;AAC3G,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema v9 (L5 second review): a hole that comes back run after run has to be NAMED and counted, or the
|
|
3
|
+
* source re-reads it forever (or, worse, hides it). `source_sync.hole_sig` is a signature of what the last
|
|
4
|
+
* incomplete run could not read and `hole_streak` is how many consecutive runs had that same hole; after
|
|
5
|
+
* five, the sync says plainly that it is a persistent hole and stops letting it hold the watermark back.
|
|
6
|
+
* Guarded ALTERs: replay-safe.
|
|
7
|
+
*/
|
|
8
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
9
|
+
export declare function migrateV9(db: DatabaseSync): void;
|
|
10
|
+
//# sourceMappingURL=local-db-v9.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v9.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v9.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAIhD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function migrateV9(db) {
|
|
2
|
+
const have = new Set(db.prepare('PRAGMA table_info(source_sync)').all().map((c) => c.name));
|
|
3
|
+
if (!have.has('hole_sig'))
|
|
4
|
+
db.exec('ALTER TABLE source_sync ADD COLUMN hole_sig TEXT');
|
|
5
|
+
if (!have.has('hole_streak'))
|
|
6
|
+
db.exec('ALTER TABLE source_sync ADD COLUMN hole_streak INTEGER NOT NULL DEFAULT 0');
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=local-db-v9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-db-v9.js","sourceRoot":"","sources":["../../src/lib/local-db-v9.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACvF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;AACrH,CAAC"}
|
package/dist/lib/local-db.d.ts
CHANGED
|
@@ -49,16 +49,7 @@ export interface DbStats {
|
|
|
49
49
|
decisions: number;
|
|
50
50
|
embeddings: number;
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
* Schema version this build expects. Bump when adding a step to `migrate`.
|
|
54
|
-
*
|
|
55
|
-
* Exported so a test can assert the migration WROTE the version it claims, without hardcoding
|
|
56
|
-
* the number - a test pinning a literal 1 had to be edited by this change rather than passing
|
|
57
|
-
* or failing on its own merits. A parity test also derives the highest `version <` branch in
|
|
58
|
-
* `migrate` from the source and compares it here, because forgetting the bump leaves the new
|
|
59
|
-
* branch running destructively on every open with nothing to stop it.
|
|
60
|
-
*/
|
|
61
|
-
export declare const SCHEMA_VERSION = 6;
|
|
52
|
+
export { SCHEMA_VERSION } from './local-db-migrate.js';
|
|
62
53
|
/**
|
|
63
54
|
* ALI-829: a source timestamp as this database stores it - ISO-8601 Z - or null.
|
|
64
55
|
*
|
|
@@ -134,6 +125,14 @@ export declare function createLocalDb(dbPath: string): {
|
|
|
134
125
|
* immutable, so a human re-capture cannot launder an agent claim into 'human' (the
|
|
135
126
|
* cloud's snapshots.ts rule). Omitted stores NULL, which reads as 'unknown'. */
|
|
136
127
|
deciderKind?: DeciderKind | null;
|
|
128
|
+
/** L2: true ONLY from connector import code. Gives a one-item-per-URL item its source_key,
|
|
129
|
+
* so an edited title updates the row. Never inferred from the platform: `align capture
|
|
130
|
+
* <PR url>` stamps `github` too, and must not merge with the imported item. */
|
|
131
|
+
keyed?: boolean;
|
|
132
|
+
/** L3: the item arrived items-first (GitHub `discussion: 'none'`): its discussion has not
|
|
133
|
+
* been fetched. Stored in `detail_pending` so the later drain can find it. A pending
|
|
134
|
+
* arrival never downgrades a row whose discussion is already stored (see the upsert). */
|
|
135
|
+
detailPending?: boolean;
|
|
137
136
|
}): string;
|
|
138
137
|
/**
|
|
139
138
|
* The id this graph already holds for `(source_url, title)`, or null.
|
|
@@ -159,7 +158,30 @@ export declare function createLocalDb(dbPath: string): {
|
|
|
159
158
|
* A null `sourceUrl` is always null here: SQLite treats each NULL in a unique index as
|
|
160
159
|
* distinct, so those rows never conflict and every one of them really is new.
|
|
161
160
|
*/
|
|
162
|
-
findIdBySource(sourceUrl: string | null, title: string): string | null;
|
|
161
|
+
findIdBySource(sourceUrl: string | null, title: string, platform?: string, keyed?: boolean): string | null;
|
|
162
|
+
/**
|
|
163
|
+
* Review finding 4: what a keyed re-import may write over row `id`. A ratified or confirmed
|
|
164
|
+
* row keeps the text a person attested; the incoming text is recorded once as a
|
|
165
|
+
* `text_revision_pending` audit note and the stored text is returned. Any other row (or an
|
|
166
|
+
* unknown id) gets the incoming text back unchanged.
|
|
167
|
+
*/
|
|
168
|
+
keepProtectedText(id: string, title: string, summary: string, thin?: boolean): {
|
|
169
|
+
title: string;
|
|
170
|
+
summary: string;
|
|
171
|
+
keptDiscussion?: true;
|
|
172
|
+
};
|
|
173
|
+
/** The id of the connector-imported item `url` names, under any platform, or null. A capture
|
|
174
|
+
* of that URL must not rewrite the imported text (L2 review finding 1). */
|
|
175
|
+
findKeyedIdByUrl(url: string): string | null;
|
|
176
|
+
/**
|
|
177
|
+
* A keyless row at this (source_url, title) is a twin an older binary wrote beside the keyed
|
|
178
|
+
* one. Adopt it as the keyed row, or fold it with the row that already holds the key (the
|
|
179
|
+
* attested one survives). ingestOne calls this BEFORE it looks the item up, so the text it
|
|
180
|
+
* protects and embeds is the survivor's. No-op for an unkeyed call.
|
|
181
|
+
*/
|
|
182
|
+
foldPendingTwin(sourceUrl: string | null, title: string, platform: string, keyed?: boolean): void;
|
|
183
|
+
/** A capture of a URL a connector already imported: audit it, change nothing, return the row. */
|
|
184
|
+
noteCaptureOfHeldItem(url: string): DecisionRow | null;
|
|
163
185
|
/**
|
|
164
186
|
* `filter.repo` scopes to one repo's rows. `includeUnattributed` (ALI-798's own rule:
|
|
165
187
|
* "repo = ? OR repo IS NULL") also returns rows with no repo at all - a Jira ticket, a
|
|
@@ -197,6 +219,14 @@ export declare function createLocalDb(dbPath: string): {
|
|
|
197
219
|
markConfirmed(id: string, confirmedBy: string): {
|
|
198
220
|
confirmedAt: string;
|
|
199
221
|
} | null;
|
|
222
|
+
/**
|
|
223
|
+
* L2, Decision 30: the decision's ingest finished, link pass included. ingestOne is the one
|
|
224
|
+
* caller, and calls it as its last write; insertDecision clears it whenever it rewrites the
|
|
225
|
+
* row. NULL therefore means "links not known to be current", and the unchanged-skip will
|
|
226
|
+
* not skip such a row.
|
|
227
|
+
*/
|
|
228
|
+
markEnriched(id: string): void;
|
|
229
|
+
getEnrichedAt(id: string): string | null;
|
|
200
230
|
/** ALI-831: one row per human act on a decision (ratified, pushed), so "who stood behind
|
|
201
231
|
* this, and when" is answerable after the fact. Append-only by construction. */
|
|
202
232
|
insertAudit(entry: {
|
|
@@ -309,11 +339,20 @@ export declare function createLocalDb(dbPath: string): {
|
|
|
309
339
|
* refreshed rather than ignored so a better score replaces a worse one.
|
|
310
340
|
*/
|
|
311
341
|
insertLink(link: {
|
|
342
|
+
id?: string;
|
|
312
343
|
sourceId: string;
|
|
313
344
|
targetId: string;
|
|
314
345
|
relation: string;
|
|
315
346
|
confidence: number;
|
|
316
347
|
}): void;
|
|
348
|
+
/**
|
|
349
|
+
* LM: the ONE way a link is deleted on behalf of a person's mark. `align mark <a> replaces <b>`
|
|
350
|
+
* writes its supersedes link under the id `mark:<judgement id>` (when the classifier had not
|
|
351
|
+
* already written that edge, in which case the edge keeps its own id and is not ours), and
|
|
352
|
+
* `--undo` removes exactly that row here. The id is built inside this method, so no caller can
|
|
353
|
+
* name another link: a classifier edge, or a link another mark owns, cannot be reached from here.
|
|
354
|
+
*/
|
|
355
|
+
deleteMarkLink(judgementId: string): number;
|
|
317
356
|
/**
|
|
318
357
|
* ALI-1065: a pair gets ONE edge, never two. `insertLinkRow`'s unique index is on
|
|
319
358
|
* (source_id, target_id, relation), so writing `supersedes` for a pair that already
|
|
@@ -392,6 +431,17 @@ export declare function createLocalDb(dbPath: string): {
|
|
|
392
431
|
}): LinkRow[];
|
|
393
432
|
getStats(): DbStats;
|
|
394
433
|
dropAll(): void;
|
|
434
|
+
/** Goes up whenever a decision is deleted or re-id'd or an embedding is deleted or replaced
|
|
435
|
+
* on this connection (see local-db-epoch.ts). A holder of a copy of the embeddings
|
|
436
|
+
* compares it to the value it built at. */
|
|
437
|
+
rowSetEpoch(): number;
|
|
438
|
+
/** SQLite's data_version: changes when ANOTHER connection commits (another process, an
|
|
439
|
+
* MCP server, a second CLI), never for this connection's own writes. The cross-process
|
|
440
|
+
* half of "has the graph moved under my copy of it". */
|
|
441
|
+
dataVersion(): number;
|
|
442
|
+
/** Stored embeddings of every model: an upper bound on what a matrix would hold, read
|
|
443
|
+
* before building one so a huge graph is never loaded just to be refused. */
|
|
444
|
+
countEmbeddings(): number;
|
|
395
445
|
close(): void;
|
|
396
446
|
};
|
|
397
447
|
export type LocalDb = ReturnType<typeof createLocalDb>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"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"}
|