@aligndottech/cli 0.48.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 +10 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +35 -26
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +7 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/ai.d.ts +11 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +121 -0
- package/dist/commands/ai.js.map +1 -0
- 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/default-action.js +2 -2
- package/dist/commands/default-action.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 +12 -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 +118 -241
- 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 +27 -1
- package/dist/commands/why.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ask-key-offer.d.ts +38 -0
- package/dist/lib/ask-key-offer.d.ts.map +1 -0
- package/dist/lib/ask-key-offer.js +130 -0
- package/dist/lib/ask-key-offer.js.map +1 -0
- 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 +56 -24
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +176 -45
- 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/amp.d.ts +18 -0
- package/dist/lib/launch/adapters/amp.d.ts.map +1 -0
- package/dist/lib/launch/adapters/amp.js +29 -0
- package/dist/lib/launch/adapters/amp.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/droid.d.ts +19 -0
- package/dist/lib/launch/adapters/droid.d.ts.map +1 -0
- package/dist/lib/launch/adapters/droid.js +38 -0
- package/dist/lib/launch/adapters/droid.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/grok-build.d.ts +16 -0
- package/dist/lib/launch/adapters/grok-build.d.ts.map +1 -0
- package/dist/lib/launch/adapters/grok-build.js +25 -0
- package/dist/lib/launch/adapters/grok-build.js.map +1 -0
- package/dist/lib/launch/adapters/kiro.d.ts +17 -0
- package/dist/lib/launch/adapters/kiro.d.ts.map +1 -0
- package/dist/lib/launch/adapters/kiro.js +25 -0
- package/dist/lib/launch/adapters/kiro.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/adapters/qwen.d.ts +25 -0
- package/dist/lib/launch/adapters/qwen.d.ts.map +1 -0
- package/dist/lib/launch/adapters/qwen.js +67 -0
- package/dist/lib/launch/adapters/qwen.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +6 -1
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +12 -4
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/amp-state.d.ts +21 -0
- package/dist/lib/launch/amp-state.d.ts.map +1 -0
- package/dist/lib/launch/amp-state.js +61 -0
- package/dist/lib/launch/amp-state.js.map +1 -0
- 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 +11 -1
- package/dist/lib/launch/config-writes.d.ts.map +1 -1
- package/dist/lib/launch/config-writes.js +66 -8
- 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 +5 -2
- package/dist/lib/launch/detect.js.map +1 -1
- package/dist/lib/launch/droid-state.d.ts +24 -0
- package/dist/lib/launch/droid-state.d.ts.map +1 -0
- package/dist/lib/launch/droid-state.js +74 -0
- package/dist/lib/launch/droid-state.js.map +1 -0
- 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/grok-state.d.ts +42 -0
- package/dist/lib/launch/grok-state.d.ts.map +1 -0
- package/dist/lib/launch/grok-state.js +128 -0
- package/dist/lib/launch/grok-state.js.map +1 -0
- package/dist/lib/launch/kiro-state.d.ts +22 -0
- package/dist/lib/launch/kiro-state.d.ts.map +1 -0
- package/dist/lib/launch/kiro-state.js +59 -0
- package/dist/lib/launch/kiro-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 +51 -2
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +70 -6
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/layer-files.d.ts +12 -0
- package/dist/lib/launch/layer-files.d.ts.map +1 -0
- package/dist/lib/launch/layer-files.js +43 -0
- package/dist/lib/launch/layer-files.js.map +1 -0
- 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 +7 -6
- 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/qwen-state.d.ts +30 -0
- package/dist/lib/launch/qwen-state.d.ts.map +1 -0
- package/dist/lib/launch/qwen-state.js +57 -0
- package/dist/lib/launch/qwen-state.js.map +1 -0
- package/dist/lib/launch/qwen-trust.d.ts +24 -0
- package/dist/lib/launch/qwen-trust.d.ts.map +1 -0
- package/dist/lib/launch/qwen-trust.js +100 -0
- package/dist/lib/launch/qwen-trust.js.map +1 -0
- 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/amp.d.ts +3 -0
- package/dist/lib/launch/registry/agents/amp.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/amp.js +14 -0
- package/dist/lib/launch/registry/agents/amp.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/droid.d.ts +3 -0
- package/dist/lib/launch/registry/agents/droid.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/droid.js +13 -0
- package/dist/lib/launch/registry/agents/droid.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/agents/grok-build.d.ts +3 -0
- package/dist/lib/launch/registry/agents/grok-build.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/grok-build.js +14 -0
- package/dist/lib/launch/registry/agents/grok-build.js.map +1 -0
- package/dist/lib/launch/registry/agents/kiro.d.ts +3 -0
- package/dist/lib/launch/registry/agents/kiro.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/kiro.js +11 -0
- package/dist/lib/launch/registry/agents/kiro.js.map +1 -0
- package/dist/lib/launch/registry/agents/qwen.d.ts +3 -0
- package/dist/lib/launch/registry/agents/qwen.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/qwen.js +11 -0
- package/dist/lib/launch/registry/agents/qwen.js.map +1 -0
- package/dist/lib/launch/registry/index.d.ts +4 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +15 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +17 -1
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.d.ts +11 -0
- package/dist/lib/launch/run-agent.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.js +22 -1
- package/dist/lib/launch/run-agent.js.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 +82 -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/llm-providers.d.ts +66 -0
- package/dist/lib/llm-providers.d.ts.map +1 -0
- package/dist/lib/llm-providers.js +150 -0
- package/dist/lib/llm-providers.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-llm.d.ts +63 -12
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +229 -104
- package/dist/lib/local-llm.js.map +1 -1
- 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 +12 -1
- package/dist/lib/safe-config-write.d.ts.map +1 -1
- package/dist/lib/safe-config-write.js +162 -9
- 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-env.d.ts +8 -0
- package/dist/lib/startup-env.d.ts.map +1 -0
- package/dist/lib/startup-env.js +8 -0
- package/dist/lib/startup-env.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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5/L6, Decision 8: the READ side of `sync-summary.json`, split out of summary.ts so the launch
|
|
3
|
+
* path can import it. summary.ts also builds the file from SQLite (sync-state.ts -> node:sqlite),
|
|
4
|
+
* and the launch path imports no database layer (launch-path-imports.test.ts). This file imports
|
|
5
|
+
* `node:fs`, `node:path` and the state-directory helper, and nothing else.
|
|
6
|
+
*
|
|
7
|
+
* Reading tolerates a missing, corrupt or foreign file by returning undefined: the launch hook
|
|
8
|
+
* then spawns nothing, which is the safe direction.
|
|
9
|
+
*/
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { alignStateDir } from '../backfill-state.js';
|
|
12
|
+
import { readRegularFile } from './safe-read.js';
|
|
13
|
+
import { isKnownSource } from './source-ids.js';
|
|
14
|
+
export const SUMMARY_FILE = 'sync-summary.json';
|
|
15
|
+
export function summaryPath(dir = alignStateDir()) {
|
|
16
|
+
return dir === null ? null : path.join(dir, SUMMARY_FILE);
|
|
17
|
+
}
|
|
18
|
+
export function readSummary(dir = alignStateDir()) {
|
|
19
|
+
const file = summaryPath(dir);
|
|
20
|
+
if (file === null)
|
|
21
|
+
return undefined;
|
|
22
|
+
try {
|
|
23
|
+
const text = readRegularFile(file, 4_194_304);
|
|
24
|
+
if (text === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const raw = JSON.parse(text);
|
|
27
|
+
if (raw.version !== 1 || !Array.isArray(raw.sources) || typeof raw.generated_at !== 'string')
|
|
28
|
+
return undefined;
|
|
29
|
+
const sources = raw.sources.filter((s) => typeof s?.id === 'string' && isKnownSource(s.id) && typeof s.backgroundEligible === 'boolean');
|
|
30
|
+
// One entry per source: a repeated id would only repeat work, and a huge file is cut to the known list.
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
const unique = sources.filter((s) => !seen.has(s.id) && seen.add(s.id));
|
|
33
|
+
return { version: 1, generated_at: raw.generated_at, sources: unique };
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=summary-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-read.js","sourceRoot":"","sources":["../../../src/lib/sync/summary-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAchD,MAAM,UAAU,WAAW,CAAC,MAAqB,aAAa,EAAE;IAC9D,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB,aAAa,EAAE;IAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyB,CAAC;QACrD,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/G,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC;QAC7J,wGAAwG;QACxG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BlockedState } from './blocked.js';
|
|
2
|
+
import { readSummary, SUMMARY_FILE, summaryPath, type SummarySource, type SyncSummary } from './summary-read.js';
|
|
3
|
+
/** The read side lives in summary-read.ts (the launch path imports it; this file reaches SQLite). */
|
|
4
|
+
export { SUMMARY_FILE, type SummarySource, type SyncSummary, readSummary, summaryPath };
|
|
5
|
+
export declare function buildSummary(dbPath: string, isConnected: (id: string) => boolean, now: Date, blocked?: (id: string) => BlockedState | undefined): SyncSummary;
|
|
6
|
+
/** Returns false when it could not write (an unusable state directory); nothing else depends on it. */
|
|
7
|
+
export declare function writeSummary(summary: SyncSummary, dir?: string | null): boolean;
|
|
8
|
+
/** Rebuild and write it. Called after a sync, and when a source is connected or forgotten. */
|
|
9
|
+
export declare function refreshSummary(dbPath: string, isConnected: (id: string) => boolean, now?: Date, dir?: string | null): boolean;
|
|
10
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/summary.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjH,qGAAqG;AACrG,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAIxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,YAAY,GAAG,SAA2B,GAAG,WAAW,CAuB9K;AAED,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,GAAE,MAAM,GAAG,IAAsB,GAAG,OAAO,CAYhG;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAAE,GAAG,GAAE,IAAiB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAMzI"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5, Decision 8: `sync-summary.json`, the one file the launch path reads. `source_sync` in SQLite
|
|
3
|
+
* is the truth; this is a derived cache with ONE writer (the sync job and the few commands that
|
|
4
|
+
* change what is connected), so launch can decide whether to start a background sync without
|
|
5
|
+
* importing the database layer.
|
|
6
|
+
*
|
|
7
|
+
* Written atomically (a sibling file, renamed over), mode 0600, inside the private state
|
|
8
|
+
* directory. Reading tolerates a missing, corrupt or foreign file by returning undefined: the
|
|
9
|
+
* launch path then spawns nothing, which is the safe direction.
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import { alignStateDir } from '../backfill-state.js';
|
|
13
|
+
import { readBlocked } from './blocked.js';
|
|
14
|
+
import { BACKFILL_SOURCES } from '../mcp-backfill.js';
|
|
15
|
+
import { readRows } from './sync-state.js';
|
|
16
|
+
import { readSummary, SUMMARY_FILE, summaryPath } from './summary-read.js';
|
|
17
|
+
/** The read side lives in summary-read.ts (the launch path imports it; this file reaches SQLite). */
|
|
18
|
+
export { SUMMARY_FILE, readSummary, summaryPath };
|
|
19
|
+
const SEVERITY = { ok: 0, partial: 1, error: 2, needs_reauth: 3 };
|
|
20
|
+
export function buildSummary(dbPath, isConnected, now, blocked = () => undefined) {
|
|
21
|
+
const all = readRows(dbPath);
|
|
22
|
+
const sources = [];
|
|
23
|
+
for (const id of BACKFILL_SOURCES) {
|
|
24
|
+
if (!isConnected(id))
|
|
25
|
+
continue;
|
|
26
|
+
const rows = all.filter((r) => r.source_id === id);
|
|
27
|
+
let status = 'never';
|
|
28
|
+
for (const r of rows)
|
|
29
|
+
if (status === 'never' || SEVERITY[r.status] > SEVERITY[status])
|
|
30
|
+
status = r.status;
|
|
31
|
+
let last;
|
|
32
|
+
for (const r of rows) {
|
|
33
|
+
if (r.last_success_at === null || Number.isNaN(Date.parse(r.last_success_at)))
|
|
34
|
+
continue;
|
|
35
|
+
if (last === undefined || Date.parse(r.last_success_at) > Date.parse(last))
|
|
36
|
+
last = r.last_success_at;
|
|
37
|
+
}
|
|
38
|
+
let attempt;
|
|
39
|
+
for (const r of rows) {
|
|
40
|
+
if (r.last_attempt_at === null || Number.isNaN(Date.parse(r.last_attempt_at)))
|
|
41
|
+
continue;
|
|
42
|
+
if (attempt === undefined || Date.parse(r.last_attempt_at) > Date.parse(attempt))
|
|
43
|
+
attempt = r.last_attempt_at;
|
|
44
|
+
}
|
|
45
|
+
const stuck = blocked(id);
|
|
46
|
+
if (stuck !== undefined)
|
|
47
|
+
status = stuck;
|
|
48
|
+
sources.push({ id, backgroundEligible: id !== 'teams', status, ...(last !== undefined ? { lastSuccessAt: last } : {}), ...(attempt !== undefined ? { lastAttemptAt: attempt } : {}) });
|
|
49
|
+
}
|
|
50
|
+
return { version: 1, generated_at: now.toISOString(), sources };
|
|
51
|
+
}
|
|
52
|
+
/** Returns false when it could not write (an unusable state directory); nothing else depends on it. */
|
|
53
|
+
export function writeSummary(summary, dir = alignStateDir()) {
|
|
54
|
+
const file = summaryPath(dir);
|
|
55
|
+
if (file === null)
|
|
56
|
+
return false;
|
|
57
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
58
|
+
try {
|
|
59
|
+
fs.writeFileSync(tmp, JSON.stringify(summary), { mode: 0o600 });
|
|
60
|
+
fs.renameSync(tmp, file);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
try {
|
|
65
|
+
fs.rmSync(tmp, { force: true });
|
|
66
|
+
}
|
|
67
|
+
catch { /* nothing to clean */ }
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Rebuild and write it. Called after a sync, and when a source is connected or forgotten. */
|
|
72
|
+
export function refreshSummary(dbPath, isConnected, now = new Date(), dir) {
|
|
73
|
+
try {
|
|
74
|
+
return writeSummary(buildSummary(dbPath, isConnected, now, (id) => readBlocked(id, dir === undefined ? alignStateDir() : dir)?.state), dir);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/lib/sync/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import type { CaptureSkip } from '../fetchers/capture.js';
|
|
3
|
+
export type SyncStatus = 'ok' | 'partial' | 'needs_reauth' | 'error';
|
|
4
|
+
export interface SyncRow {
|
|
5
|
+
source_id: string;
|
|
6
|
+
scope_key: string;
|
|
7
|
+
scope: 'yours' | 'team';
|
|
8
|
+
window_since: string | null;
|
|
9
|
+
high_water: string | null;
|
|
10
|
+
pending_until: string | null;
|
|
11
|
+
status: SyncStatus;
|
|
12
|
+
last_started_at: string | null;
|
|
13
|
+
last_success_at: string | null;
|
|
14
|
+
/** Every run stamps this; last_success_at is stamped only by a complete one. */
|
|
15
|
+
last_attempt_at: string | null;
|
|
16
|
+
/** The newest updated_at seen across a pending cycle, in THIS scope's own row. */
|
|
17
|
+
cycle_top: string | null;
|
|
18
|
+
/** What the last incomplete run could not read (a signature), and how many runs in a row had exactly that. */
|
|
19
|
+
hole_sig: string | null;
|
|
20
|
+
hole_streak: number;
|
|
21
|
+
items_last_run: number | null;
|
|
22
|
+
skips_last_run: string | null;
|
|
23
|
+
changed_via: 'cli' | 'mcp' | null;
|
|
24
|
+
changed_by_agent: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface ScopeKey {
|
|
27
|
+
source: string;
|
|
28
|
+
scopeKey: string;
|
|
29
|
+
scope: 'yours' | 'team';
|
|
30
|
+
}
|
|
31
|
+
/** Rows of one source (every scope), or of all sources. A file that has no `source_sync` yet reads as empty. */
|
|
32
|
+
export declare function readRows(dbPath: string, source?: string): SyncRow[];
|
|
33
|
+
/**
|
|
34
|
+
* Open a run: create the row if the scope is new (with `defaultWindowSince` as its window - an
|
|
35
|
+
* existing row with a NULL window means "all", so a new row must never be left NULL), stamp
|
|
36
|
+
* `last_started_at`, and return the row as stored. An existing row keeps everything else.
|
|
37
|
+
*/
|
|
38
|
+
export declare function beginRun(dbPath: string, key: ScopeKey, defaultWindowSince: string | null, nowIso: string): SyncRow;
|
|
39
|
+
/**
|
|
40
|
+
* A person (or their agent) chose a scope: give it its row NOW, with the source's window and no watermark, and attribute the
|
|
41
|
+
* change. An existing row keeps its window and its watermark - going back to a scope read before only catches up - and only
|
|
42
|
+
* its attribution moves. `created` says which. Nothing else is touched: the earlier scope's row and every stored item stay.
|
|
43
|
+
*/
|
|
44
|
+
export declare function adoptScope(dbPath: string, key: ScopeKey, windowSince: string | null, by: {
|
|
45
|
+
via: 'cli' | 'mcp';
|
|
46
|
+
agent: string | null;
|
|
47
|
+
}): {
|
|
48
|
+
created: boolean;
|
|
49
|
+
row: SyncRow;
|
|
50
|
+
};
|
|
51
|
+
export interface RunResult {
|
|
52
|
+
status: SyncStatus;
|
|
53
|
+
high_water: string | null;
|
|
54
|
+
pending_until: string | null;
|
|
55
|
+
/** The cycle's newest stamp while a cycle is pending; null once it ends. */
|
|
56
|
+
cycle_top?: string | null;
|
|
57
|
+
hole_sig?: string | null;
|
|
58
|
+
hole_streak?: number;
|
|
59
|
+
/** Stamped as last_attempt_at on every run. */
|
|
60
|
+
attemptAt: string;
|
|
61
|
+
items: number;
|
|
62
|
+
skips: readonly CaptureSkip[];
|
|
63
|
+
/** Stamped as last_success_at, or left as it was when absent: only a COMPLETE run is a success. */
|
|
64
|
+
successAt?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function saveRun(dbPath: string, key: ScopeKey, r: RunResult): void;
|
|
67
|
+
/** Move the watermark FORWARD only, from inside a run: called after a batch has committed. */
|
|
68
|
+
export declare function advanceHighWater(dbPath: string, key: ScopeKey, to: string, now: Date): void;
|
|
69
|
+
/**
|
|
70
|
+
* The provider refused this source's token. Every scope row of the source says so (a refused
|
|
71
|
+
* token is refused for the whole source), and a source with no row yet gets one, so the next
|
|
72
|
+
* foreground moment has something to report. The token itself is never touched here.
|
|
73
|
+
*/
|
|
74
|
+
export declare function markNeedsReauth(dbPath: string, key: ScopeKey, defaultWindowSince: string | null, nowIso: string): void;
|
|
75
|
+
/** A fresh token was saved: the source is no longer waiting on the user. */
|
|
76
|
+
export declare function clearNeedsReauth(dbPath: string, source: string): void;
|
|
77
|
+
/** `align local forget <source>`: the source's sync rows go with its token. Returns how many. */
|
|
78
|
+
export declare function deleteSource(dbPath: string, source: string): number;
|
|
79
|
+
export declare function recordActivity(dbPath: string, scopeKey: string, entries: ReadonlyArray<{
|
|
80
|
+
decisionId: string;
|
|
81
|
+
platform: string;
|
|
82
|
+
updatedAt: string;
|
|
83
|
+
}>): void;
|
|
84
|
+
/** Stored items of a platform with their last known activity (null when none was recorded). */
|
|
85
|
+
export declare function threadRows(dbPath: string, platform: string): Array<{
|
|
86
|
+
source_url: string;
|
|
87
|
+
last_activity: string | null;
|
|
88
|
+
}>;
|
|
89
|
+
/** Rows of this platform still waiting for their discussion (GitHub items-first). */
|
|
90
|
+
export declare function pendingDetailCount(dbPath: string, platform: string): number;
|
|
91
|
+
/** Rows whose link pass has not finished and that a re-link can finish (see unfinishedRows). */
|
|
92
|
+
export declare function unfinishedCount(dbPath: string, currentModel: string): number;
|
|
93
|
+
/**
|
|
94
|
+
* Ids of rows whose link pass is unfinished, oldest first, that a re-link CAN finish: it holds a
|
|
95
|
+
* current-model embedding, or it has a URL to re-ingest from (see relinkUnfinished). `keyed`
|
|
96
|
+
* says whether the row carries a source_key, so a re-ingest keeps its identity.
|
|
97
|
+
*/
|
|
98
|
+
export declare function unfinishedRows(dbPath: string, currentModel: string, limit: number): Array<{
|
|
99
|
+
id: string;
|
|
100
|
+
keyed: boolean;
|
|
101
|
+
pending: boolean;
|
|
102
|
+
}>;
|
|
103
|
+
export interface PendingRow {
|
|
104
|
+
id: string;
|
|
105
|
+
title: string;
|
|
106
|
+
summary: string;
|
|
107
|
+
source_url: string;
|
|
108
|
+
decided_at: string | null;
|
|
109
|
+
}
|
|
110
|
+
/** Rows of a platform still waiting for their discussion, newest first (undated last). The SDK drain sorts
|
|
111
|
+
* what it is given as well, so this order decides only which undated rows come first. */
|
|
112
|
+
export declare function pendingRows(dbPath: string, platform: string): PendingRow[];
|
|
113
|
+
/** Clear the flag on exactly these rows: the ones whose discussion was just read and stored. */
|
|
114
|
+
export declare function clearDetailPending(dbPath: string, ids: readonly string[]): void;
|
|
115
|
+
/** The stored text of the one-item-per-URL row a fetched item belongs to, for merging a partial read into it. */
|
|
116
|
+
export declare function storedByKey(dbPath: string, sourceKey: string): {
|
|
117
|
+
title: string;
|
|
118
|
+
summary: string;
|
|
119
|
+
} | undefined;
|
|
120
|
+
/** Run `fn` in one IMMEDIATE transaction on its own handle: all of it commits, or none of it does. */
|
|
121
|
+
export declare function transact<T>(dbPath: string, fn: (db: DatabaseSync) => T): T;
|
|
122
|
+
/**
|
|
123
|
+
* A run died before it could say why (a database error, the re-link queue). Record it on each
|
|
124
|
+
* source's rows so the next foreground moment and `align_sync` status can tell the person, instead of
|
|
125
|
+
* the background child vanishing without a trace. Watermarks are untouched; a source with no row gets one.
|
|
126
|
+
*/
|
|
127
|
+
export declare function recordRunError(dbPath: string, sources: readonly string[], message: string, nowIso: string, defaultWindowSince: string): void;
|
|
128
|
+
//# sourceMappingURL=sync-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-state.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/sync-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: reads and writes of `source_sync` (schema v7) and of the one small table the schema did
|
|
3
|
+
* not give the sync: `sync_item_state`, the vendor's own last-updated time per stored item.
|
|
4
|
+
*
|
|
5
|
+
* Why that table exists: Slack lists channel history by ROOT time, so a reply to an old thread
|
|
6
|
+
* never shows up in a date window. The SDK's `hotThreads` is the remedy, and choosing the hot
|
|
7
|
+
* ones needs each stored thread's last activity, which `decisions` does not hold. The same
|
|
8
|
+
* numbers give the true top of a cycle that a ceiling split across several runs (see
|
|
9
|
+
* `finishRun`). It is created lazily with IF NOT EXISTS: it is a cache of vendor facts the next
|
|
10
|
+
* full read would rebuild, so it needs no migration and losing it costs one wide read.
|
|
11
|
+
*
|
|
12
|
+
* Every function opens its own short-lived handle with the 30 s busy_timeout, the same pairing
|
|
13
|
+
* with WAL that source-sync-state.ts relies on: the MCP server reads while a sync child writes.
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
17
|
+
import { assertSchemaSupported } from '../local-db-migrate.js';
|
|
18
|
+
function withDb(dbPath, fn) {
|
|
19
|
+
const db = new DatabaseSync(dbPath);
|
|
20
|
+
try {
|
|
21
|
+
db.exec('PRAGMA busy_timeout = 30000');
|
|
22
|
+
// A newer CLI's file is not ours to read or write: the same refusal migrate() makes.
|
|
23
|
+
assertSchemaSupported(db.prepare('PRAGMA user_version').get().user_version);
|
|
24
|
+
return fn(db);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
db.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** A reader must never create the graph it was asked to look at: opening a missing path makes an empty file. */
|
|
31
|
+
function readDb(dbPath, fallback, fn) {
|
|
32
|
+
if (!fs.existsSync(dbPath))
|
|
33
|
+
return fallback;
|
|
34
|
+
return withDb(dbPath, (db) => {
|
|
35
|
+
try {
|
|
36
|
+
return fn(db);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
if (/no such (table|column)/i.test(e.message))
|
|
40
|
+
return fallback;
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Rows of one source (every scope), or of all sources. A file that has no `source_sync` yet reads as empty. */
|
|
46
|
+
export function readRows(dbPath, source) {
|
|
47
|
+
return readDb(dbPath, [], (db) => (source === undefined
|
|
48
|
+
? db.prepare('SELECT * FROM source_sync ORDER BY source_id, scope_key').all()
|
|
49
|
+
: db.prepare('SELECT * FROM source_sync WHERE source_id = ? ORDER BY scope_key').all(source)));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Open a run: create the row if the scope is new (with `defaultWindowSince` as its window - an
|
|
53
|
+
* existing row with a NULL window means "all", so a new row must never be left NULL), stamp
|
|
54
|
+
* `last_started_at`, and return the row as stored. An existing row keeps everything else.
|
|
55
|
+
*/
|
|
56
|
+
export function beginRun(dbPath, key, defaultWindowSince, nowIso) {
|
|
57
|
+
return withDb(dbPath, (db) => db.prepare(`INSERT INTO source_sync (source_id, scope_key, scope, window_since, last_started_at)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?)
|
|
59
|
+
ON CONFLICT(source_id, scope_key) DO UPDATE SET last_started_at = excluded.last_started_at
|
|
60
|
+
RETURNING *`).get(key.source, key.scopeKey, key.scope, defaultWindowSince, nowIso));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A person (or their agent) chose a scope: give it its row NOW, with the source's window and no watermark, and attribute the
|
|
64
|
+
* change. An existing row keeps its window and its watermark - going back to a scope read before only catches up - and only
|
|
65
|
+
* its attribution moves. `created` says which. Nothing else is touched: the earlier scope's row and every stored item stay.
|
|
66
|
+
*/
|
|
67
|
+
export function adoptScope(dbPath, key, windowSince, by) {
|
|
68
|
+
return transact(dbPath, (db) => {
|
|
69
|
+
const exists = db.prepare('SELECT 1 AS hit FROM source_sync WHERE source_id = ? AND scope_key = ?').get(key.source, key.scopeKey) !== undefined;
|
|
70
|
+
const row = db.prepare(`INSERT INTO source_sync (source_id, scope_key, scope, window_since, changed_via, changed_by_agent)
|
|
71
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
72
|
+
ON CONFLICT(source_id, scope_key) DO UPDATE SET changed_via = excluded.changed_via, changed_by_agent = excluded.changed_by_agent
|
|
73
|
+
RETURNING *`).get(key.source, key.scopeKey, key.scope, windowSince, by.via, by.agent);
|
|
74
|
+
return { created: !exists, row };
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export function saveRun(dbPath, key, r) {
|
|
78
|
+
withDb(dbPath, (db) => {
|
|
79
|
+
db.prepare(`UPDATE source_sync SET status = ?, high_water = ?, pending_until = ?, cycle_top = ?, hole_sig = ?, hole_streak = ?, items_last_run = ?, skips_last_run = ?,
|
|
80
|
+
last_attempt_at = ?, last_success_at = COALESCE(?, last_success_at)
|
|
81
|
+
WHERE source_id = ? AND scope_key = ?`).run(r.status, r.high_water, r.pending_until, r.cycle_top ?? null, r.hole_sig ?? null, r.hole_streak ?? 0, r.items, JSON.stringify(r.skips), r.attemptAt, r.successAt ?? null, key.source, key.scopeKey);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Move the watermark FORWARD only, from inside a run: called after a batch has committed. */
|
|
85
|
+
export function advanceHighWater(dbPath, key, to, now) {
|
|
86
|
+
withDb(dbPath, (db) => {
|
|
87
|
+
const row = db.prepare('SELECT high_water FROM source_sync WHERE source_id = ? AND scope_key = ?').get(key.source, key.scopeKey);
|
|
88
|
+
const stored = row?.high_water ? Date.parse(row.high_water) : Number.NaN;
|
|
89
|
+
const next = Date.parse(to);
|
|
90
|
+
// A stamp more than a day ahead of now (a vendor bug, a wrong clock) would hide every later change.
|
|
91
|
+
if (Number.isNaN(next) || next > now.getTime() + 86_400_000)
|
|
92
|
+
return;
|
|
93
|
+
if (!Number.isNaN(stored) && stored >= next)
|
|
94
|
+
return;
|
|
95
|
+
db.prepare('UPDATE source_sync SET high_water = ? WHERE source_id = ? AND scope_key = ?').run(to, key.source, key.scopeKey);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The provider refused this source's token. Every scope row of the source says so (a refused
|
|
100
|
+
* token is refused for the whole source), and a source with no row yet gets one, so the next
|
|
101
|
+
* foreground moment has something to report. The token itself is never touched here.
|
|
102
|
+
*/
|
|
103
|
+
export function markNeedsReauth(dbPath, key, defaultWindowSince, nowIso) {
|
|
104
|
+
withDb(dbPath, (db) => {
|
|
105
|
+
db.prepare(`INSERT INTO source_sync (source_id, scope_key, scope, window_since, status, last_started_at)
|
|
106
|
+
VALUES (?, ?, ?, ?, 'needs_reauth', ?)
|
|
107
|
+
ON CONFLICT(source_id, scope_key) DO UPDATE SET status = 'needs_reauth'`).run(key.source, key.scopeKey, key.scope, defaultWindowSince, nowIso);
|
|
108
|
+
db.prepare(`UPDATE source_sync SET status = 'needs_reauth' WHERE source_id = ?`).run(key.source);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/** A fresh token was saved: the source is no longer waiting on the user. */
|
|
112
|
+
export function clearNeedsReauth(dbPath, source) {
|
|
113
|
+
withDb(dbPath, (db) => {
|
|
114
|
+
try {
|
|
115
|
+
db.prepare(`UPDATE source_sync SET status = 'ok' WHERE source_id = ? AND status = 'needs_reauth'`).run(source);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
if (!/no such table/i.test(e.message))
|
|
119
|
+
throw e;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** `align local forget <source>`: the source's sync rows go with its token. Returns how many. */
|
|
124
|
+
export function deleteSource(dbPath, source) {
|
|
125
|
+
if (!fs.existsSync(dbPath))
|
|
126
|
+
return 0;
|
|
127
|
+
return withDb(dbPath, (db) => {
|
|
128
|
+
try {
|
|
129
|
+
return Number(db.prepare('DELETE FROM source_sync WHERE source_id = ?').run(source).changes);
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
if (/no such table/i.test(e.message))
|
|
133
|
+
return 0;
|
|
134
|
+
throw e;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export function recordActivity(dbPath, scopeKey, entries) {
|
|
139
|
+
if (entries.length === 0)
|
|
140
|
+
return;
|
|
141
|
+
withDb(dbPath, (db) => {
|
|
142
|
+
const put = db.prepare(`INSERT INTO sync_item_state (decision_id, scope_key, platform, updated_at) VALUES (?, ?, ?, ?)
|
|
143
|
+
ON CONFLICT(decision_id, scope_key) DO UPDATE SET updated_at = excluded.updated_at, platform = excluded.platform`);
|
|
144
|
+
db.exec('BEGIN');
|
|
145
|
+
try {
|
|
146
|
+
for (const e of entries)
|
|
147
|
+
put.run(e.decisionId, scopeKey, e.platform, e.updatedAt);
|
|
148
|
+
db.exec('COMMIT');
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
db.exec('ROLLBACK');
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/** Stored items of a platform with their last known activity (null when none was recorded). */
|
|
157
|
+
export function threadRows(dbPath, platform) {
|
|
158
|
+
const plain = readDb(dbPath, [], (db) => db.prepare(`SELECT d.source_url AS source_url, NULL AS last_activity FROM decisions d WHERE d.platform = ? AND d.source_url IS NOT NULL`).all(platform));
|
|
159
|
+
if (plain.length === 0)
|
|
160
|
+
return plain;
|
|
161
|
+
// The activity table may not exist yet (nothing has been synced): then no thread has a known activity.
|
|
162
|
+
return readDb(dbPath, plain, (db) => db.prepare(`SELECT d.source_url AS source_url, s.updated_at AS last_activity FROM decisions d
|
|
163
|
+
LEFT JOIN sync_item_state s ON s.decision_id = d.id AND s.scope_key = 'yours'
|
|
164
|
+
WHERE d.platform = ? AND d.source_url IS NOT NULL`).all(platform));
|
|
165
|
+
}
|
|
166
|
+
/** Rows of this platform still waiting for their discussion (GitHub items-first). */
|
|
167
|
+
export function pendingDetailCount(dbPath, platform) {
|
|
168
|
+
return readDb(dbPath, 0, (db) => db.prepare('SELECT COUNT(*) AS n FROM decisions WHERE platform = ? AND detail_pending = 1').get(platform).n);
|
|
169
|
+
}
|
|
170
|
+
/** Rows whose link pass has not finished and that a re-link can finish (see unfinishedRows). */
|
|
171
|
+
export function unfinishedCount(dbPath, currentModel) {
|
|
172
|
+
return readDb(dbPath, 0, (db) => db.prepare(`SELECT COUNT(*) AS n FROM decisions d LEFT JOIN decision_embeddings e ON e.decision_id = d.id
|
|
173
|
+
WHERE d.enriched_at IS NULL AND (e.model = ? OR d.source_url IS NOT NULL)`).get(currentModel).n);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Ids of rows whose link pass is unfinished, oldest first, that a re-link CAN finish: it holds a
|
|
177
|
+
* current-model embedding, or it has a URL to re-ingest from (see relinkUnfinished). `keyed`
|
|
178
|
+
* says whether the row carries a source_key, so a re-ingest keeps its identity.
|
|
179
|
+
*/
|
|
180
|
+
export function unfinishedRows(dbPath, currentModel, limit) {
|
|
181
|
+
return readDb(dbPath, [], (db) => {
|
|
182
|
+
const rows = db.prepare(`SELECT d.id AS id, d.source_key AS source_key, d.detail_pending AS pending FROM decisions d
|
|
183
|
+
LEFT JOIN decision_embeddings e ON e.decision_id = d.id
|
|
184
|
+
WHERE d.enriched_at IS NULL AND (e.model = ? OR d.source_url IS NOT NULL)
|
|
185
|
+
ORDER BY d.created_at ASC, d.rowid ASC LIMIT ?`).all(currentModel, limit);
|
|
186
|
+
return rows.map((r) => ({ id: r.id, keyed: r.source_key !== null, pending: r.pending === 1 }));
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** Rows of a platform still waiting for their discussion, newest first (undated last). The SDK drain sorts
|
|
190
|
+
* what it is given as well, so this order decides only which undated rows come first. */
|
|
191
|
+
export function pendingRows(dbPath, platform) {
|
|
192
|
+
return readDb(dbPath, [], (db) => db.prepare(`SELECT id, title, summary, source_url, decided_at FROM decisions
|
|
193
|
+
WHERE platform = ? AND detail_pending = 1 AND source_url IS NOT NULL
|
|
194
|
+
ORDER BY decided_at IS NULL, decided_at DESC, rowid DESC`).all(platform));
|
|
195
|
+
}
|
|
196
|
+
/** Clear the flag on exactly these rows: the ones whose discussion was just read and stored. */
|
|
197
|
+
export function clearDetailPending(dbPath, ids) {
|
|
198
|
+
if (ids.length === 0)
|
|
199
|
+
return;
|
|
200
|
+
withDb(dbPath, (db) => {
|
|
201
|
+
const clear = db.prepare('UPDATE decisions SET detail_pending = 0 WHERE id = ?');
|
|
202
|
+
db.exec('BEGIN');
|
|
203
|
+
try {
|
|
204
|
+
for (const id of ids)
|
|
205
|
+
clear.run(id);
|
|
206
|
+
db.exec('COMMIT');
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
db.exec('ROLLBACK');
|
|
210
|
+
throw e;
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/** The stored text of the one-item-per-URL row a fetched item belongs to, for merging a partial read into it. */
|
|
215
|
+
export function storedByKey(dbPath, sourceKey) {
|
|
216
|
+
return withDb(dbPath, (db) => db.prepare('SELECT title, summary FROM decisions WHERE source_key = ?').get(sourceKey));
|
|
217
|
+
}
|
|
218
|
+
/** Run `fn` in one IMMEDIATE transaction on its own handle: all of it commits, or none of it does. */
|
|
219
|
+
export function transact(dbPath, fn) {
|
|
220
|
+
return withDb(dbPath, (db) => {
|
|
221
|
+
db.exec('BEGIN IMMEDIATE');
|
|
222
|
+
try {
|
|
223
|
+
const out = fn(db);
|
|
224
|
+
db.exec('COMMIT');
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
if (db.isTransaction)
|
|
229
|
+
db.exec('ROLLBACK');
|
|
230
|
+
throw e;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* A run died before it could say why (a database error, the re-link queue). Record it on each
|
|
236
|
+
* source's rows so the next foreground moment and `align_sync` status can tell the person, instead of
|
|
237
|
+
* the background child vanishing without a trace. Watermarks are untouched; a source with no row gets one.
|
|
238
|
+
*/
|
|
239
|
+
export function recordRunError(dbPath, sources, message, nowIso, defaultWindowSince) {
|
|
240
|
+
if (sources.length === 0)
|
|
241
|
+
return;
|
|
242
|
+
const skips = JSON.stringify([{ kind: 'error', count: 1, detail: message.slice(0, 200) }]);
|
|
243
|
+
transact(dbPath, (db) => {
|
|
244
|
+
for (const source of sources) {
|
|
245
|
+
const has = db.prepare('SELECT 1 AS hit FROM source_sync WHERE source_id = ? LIMIT 1').get(source) !== undefined;
|
|
246
|
+
if (!has) {
|
|
247
|
+
db.prepare(`INSERT INTO source_sync (source_id, scope_key, scope, window_since) VALUES (?, 'yours', 'yours', ?)`).run(source, defaultWindowSince);
|
|
248
|
+
}
|
|
249
|
+
db.prepare(`UPDATE source_sync SET status = CASE WHEN status = 'needs_reauth' THEN status ELSE 'error' END, skips_last_run = ?, last_attempt_at = ? WHERE source_id = ?`).run(skips, nowIso, source);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=sync-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-state.js","sourceRoot":"","sources":["../../../src/lib/sync/sync-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L7: the sync's one telemetry event, `source_synced`. This file only decides WHICH outcomes
|
|
3
|
+
* count and what the five reported values are; consent, CI, hook and DO_NOT_TRACK rules, the
|
|
4
|
+
* closed lists and the wire shape all live in `recordFunnelStage` (usage-telemetry.ts), so there
|
|
5
|
+
* is one enforcement point.
|
|
6
|
+
*
|
|
7
|
+
* The body is built from a fixed set of five fields - never by stripping a richer outcome, which
|
|
8
|
+
* carries a message, a scope note, skip details and window dates a ping must never see.
|
|
9
|
+
*/
|
|
10
|
+
import type { SourceOutcome } from './run-source.js';
|
|
11
|
+
import type { SyncMeasurement } from '../usage-telemetry.js';
|
|
12
|
+
export type ReportedTrigger = SyncMeasurement['trigger'];
|
|
13
|
+
/** Undefined when the outcome is not a sync that ran (locked, not connected, a backfill in the way, Teams by hand) or has no scope to name. */
|
|
14
|
+
export declare function syncMeasurementOf(o: SourceOutcome, trigger: ReportedTrigger): SyncMeasurement | undefined;
|
|
15
|
+
/** Each source's ping waits at most this long, and `align sync` waits at most SYNC_TELEMETRY_TOTAL_MS for all of them together. */
|
|
16
|
+
export declare const SOURCE_PING_CAP_MS = 1000;
|
|
17
|
+
export declare const SYNC_TELEMETRY_TOTAL_MS = 1500;
|
|
18
|
+
/** One `source_synced` ping for one outcome, local graph only. Never throws and never prints. */
|
|
19
|
+
export declare function recordSourceSynced(o: SourceOutcome, trigger: ReportedTrigger): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAIzD,+IAA+I;AAC/I,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,eAAe,GAAG,SAAS,CASzG;AAED,mIAAmI;AACnI,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AACxC,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAE7C,iGAAiG;AACjG,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const REPORTED_STATES = new Set(['ok', 'partial', 'needs_reauth', 'error']);
|
|
2
|
+
/** Undefined when the outcome is not a sync that ran (locked, not connected, a backfill in the way, Teams by hand) or has no scope to name. */
|
|
3
|
+
export function syncMeasurementOf(o, trigger) {
|
|
4
|
+
if (!REPORTED_STATES.has(o.state) || o.scope === undefined)
|
|
5
|
+
return undefined;
|
|
6
|
+
return {
|
|
7
|
+
count: o.created + o.updated,
|
|
8
|
+
source: o.source,
|
|
9
|
+
outcome: o.state,
|
|
10
|
+
scope: o.scope,
|
|
11
|
+
trigger,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Each source's ping waits at most this long, and `align sync` waits at most SYNC_TELEMETRY_TOTAL_MS for all of them together. */
|
|
15
|
+
export const SOURCE_PING_CAP_MS = 1_000;
|
|
16
|
+
export const SYNC_TELEMETRY_TOTAL_MS = 1_500;
|
|
17
|
+
/** One `source_synced` ping for one outcome, local graph only. Never throws and never prints. */
|
|
18
|
+
export async function recordSourceSynced(o, trigger) {
|
|
19
|
+
try {
|
|
20
|
+
const m = syncMeasurementOf(o, trigger);
|
|
21
|
+
if (m === undefined)
|
|
22
|
+
return;
|
|
23
|
+
const { createConfigStore } = await import('../config.js');
|
|
24
|
+
const { recordFunnelStage } = await import('../usage-telemetry.js');
|
|
25
|
+
await recordFunnelStage(createConfigStore().getEnvironment('local'), 'source_synced', 'sync', m, { capMs: SOURCE_PING_CAP_MS });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Telemetry never fails a sync.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/lib/sync/telemetry.ts"],"names":[],"mappings":"AAcA,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjG,+IAA+I;AAC/I,MAAM,UAAU,iBAAiB,CAAC,CAAgB,EAAE,OAAwB;IAC1E,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAmC;QAC7C,OAAO,EAAE,CAAC,CAAC,KAAmC;QAC9C,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAED,mIAAmI;AACnI,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,CAAgB,EAAE,OAAwB;IACjF,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO;QAC5B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAClI,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;AACH,CAAC"}
|