@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,35 @@
|
|
|
1
|
+
export declare const LOCK_STALE_MS: number;
|
|
2
|
+
export interface LockBody {
|
|
3
|
+
pid: number;
|
|
4
|
+
started_at: string;
|
|
5
|
+
at: number;
|
|
6
|
+
nonce: string;
|
|
7
|
+
}
|
|
8
|
+
export type Lock = {
|
|
9
|
+
ok: true; /** Is the lock file still mine? False after a takeover or a release. */
|
|
10
|
+
owned(): boolean;
|
|
11
|
+
touch(): void;
|
|
12
|
+
release(): void;
|
|
13
|
+
}
|
|
14
|
+
/** `holder` is absent when the lock could not be taken for a reason that names no process. */
|
|
15
|
+
| {
|
|
16
|
+
ok: false;
|
|
17
|
+
holder?: {
|
|
18
|
+
pid: number;
|
|
19
|
+
started_at: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export interface LockOptions {
|
|
23
|
+
dir?: string;
|
|
24
|
+
pid?: number;
|
|
25
|
+
now?: () => number;
|
|
26
|
+
alive?: (pid: number) => boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function lockFile(dir: string, name: string): string;
|
|
29
|
+
export declare function acquireLock(name: string, o?: LockOptions): Lock;
|
|
30
|
+
/** Who holds this lock right now (a live pid, touched within 30 minutes), or undefined. Reads only: it never takes the lock. */
|
|
31
|
+
export declare function lockHolder(name: string, o?: LockOptions): {
|
|
32
|
+
pid: number;
|
|
33
|
+
started_at: string;
|
|
34
|
+
} | undefined;
|
|
35
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/lock.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa,QAAc,CAAC;AAKzC,MAAM,WAAW,QAAQ;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAExF,MAAM,MAAM,IAAI,GACZ;IAAE,EAAE,EAAE,IAAI,CAAC,CAAC,wEAAwE;IAAC,KAAK,IAAI,OAAO,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE;AACzI,8FAA8F;GAC5F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAuCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAE,WAAgB,GAAG,IAAI,CAkEnE;AAED,gIAAgI;AAChI,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAE,WAAgB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAO7G"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: the sync lock. One writer per source, across processes, on every OS.
|
|
3
|
+
*
|
|
4
|
+
* A lock is a small file created ATOMICALLY WITH ITS CONTENT: the body is written to a private
|
|
5
|
+
* temp file and hard-linked into place, and link fails if the name exists, so a reader never sees a
|
|
6
|
+
* half-written lock and two processes cannot both create it. (A filesystem without hard links
|
|
7
|
+
* falls back to the exclusive-create flag.) It holds the pid, the start time and a nonce. It is
|
|
8
|
+
* STALE when its pid is gone or it has not been touched for 30 minutes (a pid can be reused, and a
|
|
9
|
+
* run quiet for half an hour has stopped). A lock file that cannot be read is NOT stale until its
|
|
10
|
+
* own modified time is 30 minutes old: a corrupt file is more likely a peer mid-write than a corpse.
|
|
11
|
+
*
|
|
12
|
+
* Takeover is serialised by a guard file (`<lock>.takeover`, exclusive create): one process at a
|
|
13
|
+
* time judges a lock stale, removes it and creates its own, and it re-reads the lock after taking
|
|
14
|
+
* the guard so it removes only the lock it judged. A second process arriving meanwhile is told the
|
|
15
|
+
* lock is held, which is the safe answer.
|
|
16
|
+
*
|
|
17
|
+
* A holder can still lose its lock (a laptop asleep past 30 minutes, then a peer took over). The
|
|
18
|
+
* holder therefore asks `owned()` before every batch it commits and before it records its result,
|
|
19
|
+
* and stops if the answer is no: at worst one batch of idempotent upserts overlaps.
|
|
20
|
+
*/
|
|
21
|
+
import { randomBytes } from 'node:crypto';
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { alignStateDir, pidAlive } from '../backfill-state.js';
|
|
25
|
+
import { readRegularFile } from './safe-read.js';
|
|
26
|
+
export const LOCK_STALE_MS = 30 * 60_000;
|
|
27
|
+
/** A takeover guard is held for microseconds; one older than this is a corpse. */
|
|
28
|
+
const GUARD_STALE_MS = 10_000;
|
|
29
|
+
const NAME = /^[a-z0-9][a-z0-9-]*$/;
|
|
30
|
+
export function lockFile(dir, name) {
|
|
31
|
+
if (!NAME.test(name))
|
|
32
|
+
throw new Error(`Not a valid lock name: ${JSON.stringify(name.slice(0, 40))}`);
|
|
33
|
+
return path.join(dir, `${name}.lock`);
|
|
34
|
+
}
|
|
35
|
+
function read(file) {
|
|
36
|
+
const raw = readRegularFile(file, 4096);
|
|
37
|
+
if (raw === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
try {
|
|
40
|
+
const b = JSON.parse(raw);
|
|
41
|
+
if (Number.isInteger(b.pid) && typeof b.at === 'number' && typeof b.started_at === 'string' && typeof b.nonce === 'string')
|
|
42
|
+
return { raw, body: b };
|
|
43
|
+
}
|
|
44
|
+
catch { /* not a lock body */ }
|
|
45
|
+
return { raw, body: undefined };
|
|
46
|
+
}
|
|
47
|
+
function ageOf(file, now) {
|
|
48
|
+
try {
|
|
49
|
+
return now - fs.statSync(file).mtimeMs;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return Number.POSITIVE_INFINITY;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Create `file` holding `body` in one atomic step, or report that it exists. */
|
|
56
|
+
function createWhole(file, body, tag) {
|
|
57
|
+
const tmp = `${file}.tmp.${tag}`;
|
|
58
|
+
fs.writeFileSync(tmp, body, { mode: 0o600 });
|
|
59
|
+
try {
|
|
60
|
+
fs.linkSync(tmp, file);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
const code = e.code;
|
|
65
|
+
if (code === 'EEXIST')
|
|
66
|
+
return false;
|
|
67
|
+
// No hard links here (some network and FAT filesystems): the exclusive-create flag is the next best atomic.
|
|
68
|
+
try {
|
|
69
|
+
fs.writeFileSync(file, body, { flag: 'wx', mode: 0o600 });
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (e2) {
|
|
73
|
+
if (e2.code === 'EEXIST')
|
|
74
|
+
return false;
|
|
75
|
+
throw e2;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
fs.rmSync(tmp, { force: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function acquireLock(name, o = {}) {
|
|
83
|
+
const dir = o.dir ?? alignStateDir();
|
|
84
|
+
if (dir === null)
|
|
85
|
+
return { ok: false };
|
|
86
|
+
const file = lockFile(dir, name);
|
|
87
|
+
const pid = o.pid ?? process.pid;
|
|
88
|
+
const now = o.now ?? Date.now;
|
|
89
|
+
const alive = o.alive ?? pidAlive;
|
|
90
|
+
const mine = { pid, started_at: new Date(now()).toISOString(), at: now(), nonce: randomBytes(8).toString('hex') };
|
|
91
|
+
const create = () => createWhole(file, JSON.stringify(mine), `${pid}.${mine.nonce}`);
|
|
92
|
+
const held = (seen) => (seen?.body ? { ok: false, holder: { pid: seen.body.pid, started_at: seen.body.started_at } } : { ok: false });
|
|
93
|
+
/** Is what we read a lock somebody may still be using? */
|
|
94
|
+
const live = (seen) => seen.body !== undefined ? alive(seen.body.pid) && now() - seen.body.at <= LOCK_STALE_MS : ageOf(file, now()) <= LOCK_STALE_MS;
|
|
95
|
+
if (!create()) {
|
|
96
|
+
const seen = read(file);
|
|
97
|
+
if (seen === undefined) {
|
|
98
|
+
// Gone between our create and our read: its holder just released it. One more try decides.
|
|
99
|
+
if (!create())
|
|
100
|
+
return { ok: false };
|
|
101
|
+
}
|
|
102
|
+
else if (live(seen)) {
|
|
103
|
+
return held(seen);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const guard = `${file}.takeover`;
|
|
107
|
+
const guardBody = JSON.stringify({ pid, at: now() });
|
|
108
|
+
let guarded = false;
|
|
109
|
+
for (let attempt = 0; attempt < 2 && !guarded; attempt++) {
|
|
110
|
+
try {
|
|
111
|
+
fs.writeFileSync(guard, guardBody, { flag: 'wx', mode: 0o600 });
|
|
112
|
+
guarded = true;
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
if (e.code !== 'EEXIST')
|
|
116
|
+
throw e;
|
|
117
|
+
if (ageOf(guard, now()) <= GUARD_STALE_MS)
|
|
118
|
+
return { ok: false }; // somebody is taking it over right now
|
|
119
|
+
fs.rmSync(guard, { force: true });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!guarded)
|
|
123
|
+
return { ok: false };
|
|
124
|
+
try {
|
|
125
|
+
const again = read(file);
|
|
126
|
+
// Only the lock we judged stale may be removed. Anything else is a peer's: leave it.
|
|
127
|
+
if (again !== undefined && again.raw !== seen.raw)
|
|
128
|
+
return held(again);
|
|
129
|
+
if (again !== undefined)
|
|
130
|
+
fs.rmSync(file, { force: true });
|
|
131
|
+
if (!create())
|
|
132
|
+
return { ok: false };
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
fs.rmSync(guard, { force: true });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const ownsIt = () => read(file)?.body?.nonce === mine.nonce;
|
|
140
|
+
return {
|
|
141
|
+
ok: true,
|
|
142
|
+
owned: ownsIt,
|
|
143
|
+
touch() {
|
|
144
|
+
if (!ownsIt())
|
|
145
|
+
return;
|
|
146
|
+
const tmp = `${file}.touch.${pid}.${mine.nonce}`;
|
|
147
|
+
try {
|
|
148
|
+
fs.writeFileSync(tmp, JSON.stringify({ ...mine, at: now() }), { mode: 0o600 });
|
|
149
|
+
fs.renameSync(tmp, file);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
fs.rmSync(tmp, { force: true }); /* the next touch will try again */
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
release() {
|
|
156
|
+
if (!ownsIt())
|
|
157
|
+
return;
|
|
158
|
+
try {
|
|
159
|
+
fs.rmSync(file, { force: true });
|
|
160
|
+
}
|
|
161
|
+
catch { /* a stale lock is taken over after 30 minutes */ }
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Who holds this lock right now (a live pid, touched within 30 minutes), or undefined. Reads only: it never takes the lock. */
|
|
166
|
+
export function lockHolder(name, o = {}) {
|
|
167
|
+
const dir = o.dir ?? alignStateDir();
|
|
168
|
+
if (dir === null)
|
|
169
|
+
return undefined;
|
|
170
|
+
const body = read(lockFile(dir, name))?.body;
|
|
171
|
+
const now = o.now ?? Date.now;
|
|
172
|
+
const alive = o.alive ?? pidAlive;
|
|
173
|
+
return body !== undefined && alive(body.pid) && now() - body.at <= LOCK_STALE_MS ? { pid: body.pid, started_at: body.started_at } : undefined;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/lib/sync/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: `align local forget <source> --purge`. Forgetting a source drops its token and its sync rows
|
|
3
|
+
* and keeps what it imported; `--purge` also deletes the imported items, but only ones nobody has
|
|
4
|
+
* put their name to or ever handled.
|
|
5
|
+
*
|
|
6
|
+
* What may be purged: a row of a CONNECTOR source (never git, docs, sessions, cli or anything
|
|
7
|
+
* else) that carries a `source_key`, which only a connector import ever sets. A row captured by
|
|
8
|
+
* hand (`align capture <PR url>`, a plain-text capture) has none, so it cannot be purged even when
|
|
9
|
+
* its platform says `github`. Note that `decider_kind` cannot separate imports from captures:
|
|
10
|
+
* every connector import is derived `human` (decider-kind.ts), so it is not used here.
|
|
11
|
+
*
|
|
12
|
+
* Kept whatever the platform says: a ratified row, a confirmed row, a row with ANY audit act on it
|
|
13
|
+
* (a `capture_seen` note is one: somebody captured it by hand after the import; only the notes the
|
|
14
|
+
* system writes about its own text revisions and classification attempts are not acts), a row a
|
|
15
|
+
* local judgement names as target or counterpart, and a row a promotion records (`promotions.local_id`).
|
|
16
|
+
*
|
|
17
|
+
* Every purged row is copied to `decisions_purged_backup` (with its vector and refs) in the same
|
|
18
|
+
* transaction, so a purge can be undone by copying them back. Its links and sync-item state go with it.
|
|
19
|
+
*/
|
|
20
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
21
|
+
/** Audit rows the system writes about itself. They are not acts. `capture_seen` is NOT here: it is a person's act. */
|
|
22
|
+
export declare const SYSTEM_AUDIT_ACTIONS: readonly ["text_revision_pending", "sync_classified"];
|
|
23
|
+
/** The only names `--purge` accepts: sources a connector import fills. */
|
|
24
|
+
export declare const PURGEABLE_SOURCES: readonly string[];
|
|
25
|
+
export declare const isPurgeable: (name: string) => boolean;
|
|
26
|
+
export interface PurgeResult {
|
|
27
|
+
deleted: number;
|
|
28
|
+
kept: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function previewIn(db: DatabaseSync, platform: string): PurgeResult & {
|
|
31
|
+
total: number;
|
|
32
|
+
};
|
|
33
|
+
/** Copy, then delete, inside the caller's transaction. */
|
|
34
|
+
export declare function purgeIn(db: DatabaseSync, platform: string): PurgeResult;
|
|
35
|
+
/** How many rows of this platform a purge would delete and keep. Reads only; refuses a name that is not a connector. */
|
|
36
|
+
export declare function purgePreview(dbPath: string, platform: string): PurgeResult;
|
|
37
|
+
export declare function purgePlatform(dbPath: string, platform: string): PurgeResult;
|
|
38
|
+
//# sourceMappingURL=purge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/purge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,sHAAsH;AACtH,eAAO,MAAM,oBAAoB,uDAAwD,CAAC;AAE1F,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAkC,CAAC;AAClF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAA2C,CAAC;AAEvF,MAAM,WAAW,WAAW;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAyB9D,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAI7F;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAYvE;AAED,wHAAwH;AACxH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAI1E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAG3E"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { copyRowsToBackup } from '../backup-copy.js';
|
|
2
|
+
import { createLocalDb } from '../local-db.js';
|
|
3
|
+
import { deleteDecisionWithDependents } from '../local-db-migrate.js';
|
|
4
|
+
import { BACKFILL_SOURCES } from '../mcp-backfill.js';
|
|
5
|
+
import { transact } from './sync-state.js';
|
|
6
|
+
/** Audit rows the system writes about itself. They are not acts. `capture_seen` is NOT here: it is a person's act. */
|
|
7
|
+
export const SYSTEM_AUDIT_ACTIONS = ['text_revision_pending', 'sync_classified'];
|
|
8
|
+
/** The only names `--purge` accepts: sources a connector import fills. */
|
|
9
|
+
export const PURGEABLE_SOURCES = [...BACKFILL_SOURCES, 'zoom'];
|
|
10
|
+
export const isPurgeable = (name) => PURGEABLE_SOURCES.includes(name);
|
|
11
|
+
const hasTable = (db, name) => db.prepare(`SELECT 1 AS hit FROM sqlite_master WHERE type = 'table' AND name = ?`).get(name) !== undefined;
|
|
12
|
+
/** A WHERE fragment over `decisions d` selecting the rows a purge of one platform may delete. Binds the platform once. */
|
|
13
|
+
function disposableWhere(db) {
|
|
14
|
+
const marks = SYSTEM_AUDIT_ACTIONS.map((a) => `'${a}'`).join(', ');
|
|
15
|
+
const parts = [
|
|
16
|
+
'd.platform = ?',
|
|
17
|
+
'd.source_key IS NOT NULL',
|
|
18
|
+
`d.platform NOT IN ('cli', 'agent-session')`,
|
|
19
|
+
'd.ratified_at IS NULL',
|
|
20
|
+
'd.confirmed_at IS NULL',
|
|
21
|
+
`NOT EXISTS (SELECT 1 FROM decision_audit a WHERE a.decision_id = d.id AND a.action NOT IN (${marks}))`,
|
|
22
|
+
];
|
|
23
|
+
if (hasTable(db, 'local_judgements')) {
|
|
24
|
+
parts.push('NOT EXISTS (SELECT 1 FROM local_judgements j WHERE j.decision_id = d.id OR j.counterpart_id = d.id)');
|
|
25
|
+
}
|
|
26
|
+
if (hasTable(db, 'promotions')) {
|
|
27
|
+
parts.push('NOT EXISTS (SELECT 1 FROM promotions p WHERE p.local_id = d.id)');
|
|
28
|
+
}
|
|
29
|
+
return parts.join(' AND ');
|
|
30
|
+
}
|
|
31
|
+
export function previewIn(db, platform) {
|
|
32
|
+
const total = db.prepare('SELECT COUNT(*) AS n FROM decisions WHERE platform = ?').get(platform).n;
|
|
33
|
+
const deletable = isPurgeable(platform) ? db.prepare(`SELECT COUNT(*) AS n FROM decisions d WHERE ${disposableWhere(db)}`).get(platform).n : 0;
|
|
34
|
+
return { deleted: deletable, kept: total - deletable, total };
|
|
35
|
+
}
|
|
36
|
+
/** Copy, then delete, inside the caller's transaction. */
|
|
37
|
+
export function purgeIn(db, platform) {
|
|
38
|
+
if (!isPurgeable(platform))
|
|
39
|
+
throw new Error(`"${platform.slice(0, 24)}" is not a connector source, so nothing was purged.`);
|
|
40
|
+
const { total } = previewIn(db, platform);
|
|
41
|
+
const ids = db.prepare(`SELECT d.id AS id FROM decisions d WHERE ${disposableWhere(db)}`).all(platform).map((r) => r.id);
|
|
42
|
+
for (const id of ids) {
|
|
43
|
+
copyRowsToBackup(db, 'decisions', 'decisions_purged_backup', 'id', id);
|
|
44
|
+
copyRowsToBackup(db, 'decision_embeddings', 'decision_embeddings_purged_backup', 'decision_id', id);
|
|
45
|
+
copyRowsToBackup(db, 'decision_refs', 'decision_refs_purged_backup', 'decision_id', id);
|
|
46
|
+
deleteDecisionWithDependents(db, id);
|
|
47
|
+
db.prepare('DELETE FROM sync_item_state WHERE decision_id = ?').run(id);
|
|
48
|
+
}
|
|
49
|
+
return { deleted: ids.length, kept: total - ids.length };
|
|
50
|
+
}
|
|
51
|
+
/** How many rows of this platform a purge would delete and keep. Reads only; refuses a name that is not a connector. */
|
|
52
|
+
export function purgePreview(dbPath, platform) {
|
|
53
|
+
createLocalDb(dbPath).close(); // migrates an older file, refuses a newer one
|
|
54
|
+
const r = transact(dbPath, (db) => previewIn(db, platform));
|
|
55
|
+
return { deleted: r.deleted, kept: r.kept };
|
|
56
|
+
}
|
|
57
|
+
export function purgePlatform(dbPath, platform) {
|
|
58
|
+
createLocalDb(dbPath).close();
|
|
59
|
+
return transact(dbPath, (db) => purgeIn(db, platform));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=purge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../../src/lib/sync/purge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import type { SyncEnv } from './run-source.js';
|
|
2
|
+
import type { StatusDeps } from './status.js';
|
|
3
|
+
/** The local graph this machine syncs into, or undefined when local mode is not set up. Never creates it. */
|
|
4
|
+
export declare function localGraphPath(config?: {
|
|
5
|
+
getEnvironment(env: import("../config.js").EnvName): import("../config.js").EnvironmentConfig;
|
|
6
|
+
setAuthToken(env: import("../config.js").EnvName, token: string): void;
|
|
7
|
+
setTenantId(env: import("../config.js").EnvName, tenantId: string): void;
|
|
8
|
+
setNgrokUrl(url: string): void;
|
|
9
|
+
setDefaultEnv(env: import("../config.js").EnvName): void;
|
|
10
|
+
getDefaultEnv(): import("../config.js").EnvName;
|
|
11
|
+
getConnectorToken(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
12
|
+
setConnectorToken(env: import("../config.js").EnvName, connectorKey: string, token: string): void;
|
|
13
|
+
getConnectorFields(env: import("../config.js").EnvName, connectorKey: string): Record<string, string> | null;
|
|
14
|
+
saveConnectorFields(env: import("../config.js").EnvName, connectorKey: string, fields: Record<string, string>): void;
|
|
15
|
+
forgetConnector(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
16
|
+
forgetAllConnectors(env: import("../config.js").EnvName): void;
|
|
17
|
+
getConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
18
|
+
setConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string, cloudId: string): void;
|
|
19
|
+
getConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
20
|
+
setConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string, siteBase: string): void;
|
|
21
|
+
getConnectorScope(env: import("../config.js").EnvName, connectorKey: string): import("../scope-values.js").StoredScope | null;
|
|
22
|
+
setConnectorScope(env: import("../config.js").EnvName, connectorKey: string, scope: import("../scope-values.js").StoredScope): void;
|
|
23
|
+
clearConnectorScope(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
24
|
+
clearTeamScopeDisclosed(source: string): void;
|
|
25
|
+
getTeamScopeDisclosedFor(): string[];
|
|
26
|
+
isTeamScopeDisclosed(source: string, scopeKey: string): boolean;
|
|
27
|
+
markTeamScopeDisclosed(source: string, scopeKey: string): void;
|
|
28
|
+
setLocalMode(dbPath: string): void;
|
|
29
|
+
clearLocalMode(): void;
|
|
30
|
+
clear(env: import("../config.js").EnvName): void;
|
|
31
|
+
getInstallId(): string;
|
|
32
|
+
getAgent(): string | undefined;
|
|
33
|
+
setAgent(agent: string): void;
|
|
34
|
+
isLaunchOff(): boolean;
|
|
35
|
+
setLaunchOff(off: boolean): void;
|
|
36
|
+
clearAgent(): void;
|
|
37
|
+
isBackgroundSyncOff(): boolean;
|
|
38
|
+
setBackgroundSyncOff(off: boolean): void;
|
|
39
|
+
backgroundSyncNoticeShown(): boolean;
|
|
40
|
+
markBackgroundSyncNoticeShown(at: string): void;
|
|
41
|
+
getReauthLineShownAt(): string | undefined;
|
|
42
|
+
markReauthLineShown(at: string): void;
|
|
43
|
+
getWrittenConfigs(): Record<string, import("../safe-config-write.js").WrittenConfig>;
|
|
44
|
+
recordWrittenConfig(file: string, entry: import("../safe-config-write.js").WrittenConfig): void;
|
|
45
|
+
dropWrittenConfigs(files: string[]): void;
|
|
46
|
+
wasWriteRefused(file: string): boolean;
|
|
47
|
+
unmarkWriteRefused(file: string): void;
|
|
48
|
+
clearRefusedWrites(): void;
|
|
49
|
+
markWriteRefused(file: string): void;
|
|
50
|
+
getTelemetryConsent(): import("../config.js").TelemetryConsent | undefined;
|
|
51
|
+
setTelemetryConsent(value: import("../config.js").TelemetryConsent): void;
|
|
52
|
+
setTelemetryOffByEnv(via: string, now?: Date): void;
|
|
53
|
+
getTelemetryOffByEnv(): {
|
|
54
|
+
via: string;
|
|
55
|
+
at: string;
|
|
56
|
+
} | undefined;
|
|
57
|
+
getTelemetryNoticeShownAt(): string | undefined;
|
|
58
|
+
markTelemetryNoticeShown(): void;
|
|
59
|
+
getProviderKey(provider: import("../config.js").GuidedProviderKey): string | null;
|
|
60
|
+
setProviderKey(provider: import("../config.js").GuidedProviderKey, key: string): void;
|
|
61
|
+
clearProviderKey(provider: import("../config.js").GuidedProviderKey): void;
|
|
62
|
+
getLlmPreference(): import("../config.js").LlmPreference;
|
|
63
|
+
setLlmPreference(pref: import("../config.js").LlmPreference): void;
|
|
64
|
+
clearLlmPreference(): void;
|
|
65
|
+
isAskKeyOfferDismissed(): boolean;
|
|
66
|
+
setAskKeyOfferDismissed(dismissed: boolean): void;
|
|
67
|
+
wasFunnelStageRecorded(stage: string): boolean;
|
|
68
|
+
claimFunnelStage(stage: string): boolean;
|
|
69
|
+
releaseFunnelStage(stage: string): boolean;
|
|
70
|
+
markFunnelStageRecorded(stage: string): void;
|
|
71
|
+
}): string | undefined;
|
|
72
|
+
export declare function realSyncEnv(dbPath: string, config?: {
|
|
73
|
+
getEnvironment(env: import("../config.js").EnvName): import("../config.js").EnvironmentConfig;
|
|
74
|
+
setAuthToken(env: import("../config.js").EnvName, token: string): void;
|
|
75
|
+
setTenantId(env: import("../config.js").EnvName, tenantId: string): void;
|
|
76
|
+
setNgrokUrl(url: string): void;
|
|
77
|
+
setDefaultEnv(env: import("../config.js").EnvName): void;
|
|
78
|
+
getDefaultEnv(): import("../config.js").EnvName;
|
|
79
|
+
getConnectorToken(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
80
|
+
setConnectorToken(env: import("../config.js").EnvName, connectorKey: string, token: string): void;
|
|
81
|
+
getConnectorFields(env: import("../config.js").EnvName, connectorKey: string): Record<string, string> | null;
|
|
82
|
+
saveConnectorFields(env: import("../config.js").EnvName, connectorKey: string, fields: Record<string, string>): void;
|
|
83
|
+
forgetConnector(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
84
|
+
forgetAllConnectors(env: import("../config.js").EnvName): void;
|
|
85
|
+
getConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
86
|
+
setConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string, cloudId: string): void;
|
|
87
|
+
getConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
88
|
+
setConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string, siteBase: string): void;
|
|
89
|
+
getConnectorScope(env: import("../config.js").EnvName, connectorKey: string): import("../scope-values.js").StoredScope | null;
|
|
90
|
+
setConnectorScope(env: import("../config.js").EnvName, connectorKey: string, scope: import("../scope-values.js").StoredScope): void;
|
|
91
|
+
clearConnectorScope(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
92
|
+
clearTeamScopeDisclosed(source: string): void;
|
|
93
|
+
getTeamScopeDisclosedFor(): string[];
|
|
94
|
+
isTeamScopeDisclosed(source: string, scopeKey: string): boolean;
|
|
95
|
+
markTeamScopeDisclosed(source: string, scopeKey: string): void;
|
|
96
|
+
setLocalMode(dbPath: string): void;
|
|
97
|
+
clearLocalMode(): void;
|
|
98
|
+
clear(env: import("../config.js").EnvName): void;
|
|
99
|
+
getInstallId(): string;
|
|
100
|
+
getAgent(): string | undefined;
|
|
101
|
+
setAgent(agent: string): void;
|
|
102
|
+
isLaunchOff(): boolean;
|
|
103
|
+
setLaunchOff(off: boolean): void;
|
|
104
|
+
clearAgent(): void;
|
|
105
|
+
isBackgroundSyncOff(): boolean;
|
|
106
|
+
setBackgroundSyncOff(off: boolean): void;
|
|
107
|
+
backgroundSyncNoticeShown(): boolean;
|
|
108
|
+
markBackgroundSyncNoticeShown(at: string): void;
|
|
109
|
+
getReauthLineShownAt(): string | undefined;
|
|
110
|
+
markReauthLineShown(at: string): void;
|
|
111
|
+
getWrittenConfigs(): Record<string, import("../safe-config-write.js").WrittenConfig>;
|
|
112
|
+
recordWrittenConfig(file: string, entry: import("../safe-config-write.js").WrittenConfig): void;
|
|
113
|
+
dropWrittenConfigs(files: string[]): void;
|
|
114
|
+
wasWriteRefused(file: string): boolean;
|
|
115
|
+
unmarkWriteRefused(file: string): void;
|
|
116
|
+
clearRefusedWrites(): void;
|
|
117
|
+
markWriteRefused(file: string): void;
|
|
118
|
+
getTelemetryConsent(): import("../config.js").TelemetryConsent | undefined;
|
|
119
|
+
setTelemetryConsent(value: import("../config.js").TelemetryConsent): void;
|
|
120
|
+
setTelemetryOffByEnv(via: string, now?: Date): void;
|
|
121
|
+
getTelemetryOffByEnv(): {
|
|
122
|
+
via: string;
|
|
123
|
+
at: string;
|
|
124
|
+
} | undefined;
|
|
125
|
+
getTelemetryNoticeShownAt(): string | undefined;
|
|
126
|
+
markTelemetryNoticeShown(): void;
|
|
127
|
+
getProviderKey(provider: import("../config.js").GuidedProviderKey): string | null;
|
|
128
|
+
setProviderKey(provider: import("../config.js").GuidedProviderKey, key: string): void;
|
|
129
|
+
clearProviderKey(provider: import("../config.js").GuidedProviderKey): void;
|
|
130
|
+
getLlmPreference(): import("../config.js").LlmPreference;
|
|
131
|
+
setLlmPreference(pref: import("../config.js").LlmPreference): void;
|
|
132
|
+
clearLlmPreference(): void;
|
|
133
|
+
isAskKeyOfferDismissed(): boolean;
|
|
134
|
+
setAskKeyOfferDismissed(dismissed: boolean): void;
|
|
135
|
+
wasFunnelStageRecorded(stage: string): boolean;
|
|
136
|
+
claimFunnelStage(stage: string): boolean;
|
|
137
|
+
releaseFunnelStage(stage: string): boolean;
|
|
138
|
+
markFunnelStageRecorded(stage: string): void;
|
|
139
|
+
}): SyncEnv;
|
|
140
|
+
export declare function realStatusDeps(dbPath: string, config?: {
|
|
141
|
+
getEnvironment(env: import("../config.js").EnvName): import("../config.js").EnvironmentConfig;
|
|
142
|
+
setAuthToken(env: import("../config.js").EnvName, token: string): void;
|
|
143
|
+
setTenantId(env: import("../config.js").EnvName, tenantId: string): void;
|
|
144
|
+
setNgrokUrl(url: string): void;
|
|
145
|
+
setDefaultEnv(env: import("../config.js").EnvName): void;
|
|
146
|
+
getDefaultEnv(): import("../config.js").EnvName;
|
|
147
|
+
getConnectorToken(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
148
|
+
setConnectorToken(env: import("../config.js").EnvName, connectorKey: string, token: string): void;
|
|
149
|
+
getConnectorFields(env: import("../config.js").EnvName, connectorKey: string): Record<string, string> | null;
|
|
150
|
+
saveConnectorFields(env: import("../config.js").EnvName, connectorKey: string, fields: Record<string, string>): void;
|
|
151
|
+
forgetConnector(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
152
|
+
forgetAllConnectors(env: import("../config.js").EnvName): void;
|
|
153
|
+
getConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
154
|
+
setConnectorCloudId(env: import("../config.js").EnvName, connectorKey: string, cloudId: string): void;
|
|
155
|
+
getConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string): string | null;
|
|
156
|
+
setConnectorSiteBase(env: import("../config.js").EnvName, connectorKey: string, siteBase: string): void;
|
|
157
|
+
getConnectorScope(env: import("../config.js").EnvName, connectorKey: string): import("../scope-values.js").StoredScope | null;
|
|
158
|
+
setConnectorScope(env: import("../config.js").EnvName, connectorKey: string, scope: import("../scope-values.js").StoredScope): void;
|
|
159
|
+
clearConnectorScope(env: import("../config.js").EnvName, connectorKey: string): void;
|
|
160
|
+
clearTeamScopeDisclosed(source: string): void;
|
|
161
|
+
getTeamScopeDisclosedFor(): string[];
|
|
162
|
+
isTeamScopeDisclosed(source: string, scopeKey: string): boolean;
|
|
163
|
+
markTeamScopeDisclosed(source: string, scopeKey: string): void;
|
|
164
|
+
setLocalMode(dbPath: string): void;
|
|
165
|
+
clearLocalMode(): void;
|
|
166
|
+
clear(env: import("../config.js").EnvName): void;
|
|
167
|
+
getInstallId(): string;
|
|
168
|
+
getAgent(): string | undefined;
|
|
169
|
+
setAgent(agent: string): void;
|
|
170
|
+
isLaunchOff(): boolean;
|
|
171
|
+
setLaunchOff(off: boolean): void;
|
|
172
|
+
clearAgent(): void;
|
|
173
|
+
isBackgroundSyncOff(): boolean;
|
|
174
|
+
setBackgroundSyncOff(off: boolean): void;
|
|
175
|
+
backgroundSyncNoticeShown(): boolean;
|
|
176
|
+
markBackgroundSyncNoticeShown(at: string): void;
|
|
177
|
+
getReauthLineShownAt(): string | undefined;
|
|
178
|
+
markReauthLineShown(at: string): void;
|
|
179
|
+
getWrittenConfigs(): Record<string, import("../safe-config-write.js").WrittenConfig>;
|
|
180
|
+
recordWrittenConfig(file: string, entry: import("../safe-config-write.js").WrittenConfig): void;
|
|
181
|
+
dropWrittenConfigs(files: string[]): void;
|
|
182
|
+
wasWriteRefused(file: string): boolean;
|
|
183
|
+
unmarkWriteRefused(file: string): void;
|
|
184
|
+
clearRefusedWrites(): void;
|
|
185
|
+
markWriteRefused(file: string): void;
|
|
186
|
+
getTelemetryConsent(): import("../config.js").TelemetryConsent | undefined;
|
|
187
|
+
setTelemetryConsent(value: import("../config.js").TelemetryConsent): void;
|
|
188
|
+
setTelemetryOffByEnv(via: string, now?: Date): void;
|
|
189
|
+
getTelemetryOffByEnv(): {
|
|
190
|
+
via: string;
|
|
191
|
+
at: string;
|
|
192
|
+
} | undefined;
|
|
193
|
+
getTelemetryNoticeShownAt(): string | undefined;
|
|
194
|
+
markTelemetryNoticeShown(): void;
|
|
195
|
+
getProviderKey(provider: import("../config.js").GuidedProviderKey): string | null;
|
|
196
|
+
setProviderKey(provider: import("../config.js").GuidedProviderKey, key: string): void;
|
|
197
|
+
clearProviderKey(provider: import("../config.js").GuidedProviderKey): void;
|
|
198
|
+
getLlmPreference(): import("../config.js").LlmPreference;
|
|
199
|
+
setLlmPreference(pref: import("../config.js").LlmPreference): void;
|
|
200
|
+
clearLlmPreference(): void;
|
|
201
|
+
isAskKeyOfferDismissed(): boolean;
|
|
202
|
+
setAskKeyOfferDismissed(dismissed: boolean): void;
|
|
203
|
+
wasFunnelStageRecorded(stage: string): boolean;
|
|
204
|
+
claimFunnelStage(stage: string): boolean;
|
|
205
|
+
releaseFunnelStage(stage: string): boolean;
|
|
206
|
+
markFunnelStageRecorded(stage: string): void;
|
|
207
|
+
}): StatusDeps;
|
|
208
|
+
//# sourceMappingURL=real-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"real-env.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/real-env.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,6GAA6G;AAC7G,wBAAgB,cAAc,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAsB,GAAG,MAAM,GAAG,SAAS,CAG/E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAsB,GAAG,OAAO,CAcjF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAsB,GAAG,UAAU,CAWvF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: the production wiring of `SyncEnv` and `StatusDeps`: the real config store, the real graph,
|
|
3
|
+
* the real lock directory and the real backfill status files. Kept out of the command so the
|
|
4
|
+
* command is argument handling and printing only, and out of run-source.ts so that file stays a
|
|
5
|
+
* function of its injected world.
|
|
6
|
+
*/
|
|
7
|
+
import { backfillDir, liveBackfills, pidAlive, readStatus, statusPath } from '../backfill-state.js';
|
|
8
|
+
import { createConfigStore } from '../config.js';
|
|
9
|
+
import { createLocalGatewayClient } from '../local-gateway-client.js';
|
|
10
|
+
import { getLocalDbPath } from '../local-mode.js';
|
|
11
|
+
import { acquireLock, lockHolder } from './lock.js';
|
|
12
|
+
import { markTold } from '../scope.js';
|
|
13
|
+
import { configScopeStore, realScopeDeps, scopeStatusHooks } from '../scope-real.js';
|
|
14
|
+
import { fetchSource, fetchWhole, scopeOf } from './sources.js';
|
|
15
|
+
/** The local graph this machine syncs into, or undefined when local mode is not set up. Never creates it. */
|
|
16
|
+
export function localGraphPath(config = createConfigStore()) {
|
|
17
|
+
const env = config.getEnvironment('local');
|
|
18
|
+
return env.mode === 'local-embedded' ? (env.localDbPath ?? getLocalDbPath()) : undefined;
|
|
19
|
+
}
|
|
20
|
+
export function realSyncEnv(dbPath, config = createConfigStore()) {
|
|
21
|
+
const dir = backfillDir();
|
|
22
|
+
return {
|
|
23
|
+
dbPath,
|
|
24
|
+
now: () => new Date(),
|
|
25
|
+
tokens: (source) => config.getConnectorFields('local', source),
|
|
26
|
+
scopeOf: (source, o) => scopeOf(source, o, realScopeDeps(dbPath, { config })),
|
|
27
|
+
markDisclosed: (source, scopeKey) => markTold(configScopeStore(config), source, scopeKey),
|
|
28
|
+
fetch: fetchSource,
|
|
29
|
+
fetchWhole,
|
|
30
|
+
client: createLocalGatewayClient(dbPath),
|
|
31
|
+
lock: (name) => acquireLock(name),
|
|
32
|
+
backfillRunning: (source) => dir !== null && liveBackfills(dir).some((s) => s.source === source),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function realStatusDeps(dbPath, config = createConfigStore()) {
|
|
36
|
+
return {
|
|
37
|
+
dbPath, ...scopeStatusHooks(config),
|
|
38
|
+
isConnected: (id) => Boolean(config.getConnectorFields('local', id)?.['token']),
|
|
39
|
+
syncRunning: (id) => lockHolder(`sync-${id}`) !== undefined,
|
|
40
|
+
backfill: (id) => {
|
|
41
|
+
const dir = backfillDir();
|
|
42
|
+
return dir ? readStatus(statusPath(dir, id)) : null;
|
|
43
|
+
},
|
|
44
|
+
backfillAlive: (s) => s.state === 'running' && pidAlive(s.pid),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=real-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"real-env.js","sourceRoot":"","sources":["../../../src/lib/sync/real-env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { createLocalGatewayClient } from '../local-gateway-client.js';
|
|
2
|
+
export interface RelinkResult {
|
|
3
|
+
linked: number;
|
|
4
|
+
embedded: number;
|
|
5
|
+
skipped: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function relinkAll(dbPath: string, client: Pick<ReturnType<typeof createLocalGatewayClient>, 'relinkUnfinished'>, o?: {
|
|
8
|
+
deadlineAt?: number;
|
|
9
|
+
now?: () => number;
|
|
10
|
+
batch?: number;
|
|
11
|
+
}): Promise<RelinkResult & {
|
|
12
|
+
timedOut: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=relink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relink.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/relink.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG3E,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAInF,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,EAAE,kBAAkB,CAAC,EAC7E,CAAC,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAClE,OAAO,CAAC,YAAY,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAiB/C"}
|