@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,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6: the per-source claim that keeps concurrent launches from each starting a child. One file per
|
|
3
|
+
* source per INTERVAL BUCKET, `<source>.<floor(now / interval)>.bgclaim`, created exclusively
|
|
4
|
+
* (`wx`) and never taken over: whoever creates the file for this bucket owns the interval, and
|
|
5
|
+
* everyone else finds it and stops. There is no "stale, remove it and retry" step, because that is
|
|
6
|
+
* what lets many launches each win once a claim is old (a remove followed by an exclusive create
|
|
7
|
+
* is two steps, and every racer can pass the first).
|
|
8
|
+
*
|
|
9
|
+
* The previous bucket's claim is honoured while it is younger than the interval, so a bucket
|
|
10
|
+
* boundary cannot double-start. After taking its own claim a launch also looks at the neighbouring
|
|
11
|
+
* buckets once more and yields if one appeared meanwhile; two launches on either side of a boundary
|
|
12
|
+
* may then both yield, which costs one interval of no refresh and never a second child.
|
|
13
|
+
* Files older than two intervals are swept. File-system only: the launch path imports this.
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { kindAt, readRegularFile } from './safe-read.js';
|
|
18
|
+
const NAME = (source) => new RegExp(`^${source}\\.(\\d+)\\.bgclaim$`);
|
|
19
|
+
export const claimFile = (dir, source, bucket) => path.join(dir, `${source}.${bucket}.bgclaim`);
|
|
20
|
+
const bucketOf = (now, intervalMs) => Math.floor(now / intervalMs);
|
|
21
|
+
function claimAt(file) {
|
|
22
|
+
const raw = readRegularFile(file, 4096);
|
|
23
|
+
if (raw === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
try {
|
|
26
|
+
const at = JSON.parse(raw).at;
|
|
27
|
+
return typeof at === 'number' && Number.isFinite(at) ? at : undefined;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Fresh = younger than the interval and not dated in the future. */
|
|
34
|
+
const fresh = (at, now, intervalMs) => at !== undefined && at <= now && now - at < intervalMs;
|
|
35
|
+
/** Is a claim for this source in force (this bucket's or the previous one's)? Reads only. */
|
|
36
|
+
export function claimInForce(dir, source, now, intervalMs) {
|
|
37
|
+
const b = bucketOf(now, intervalMs);
|
|
38
|
+
return [b, b - 1].some((k) => fresh(claimAt(claimFile(dir, source, k)), now, intervalMs));
|
|
39
|
+
}
|
|
40
|
+
export function takeClaim(dir, source, now, intervalMs) {
|
|
41
|
+
const b = bucketOf(now, intervalMs);
|
|
42
|
+
if (claimInForce(dir, source, now, intervalMs))
|
|
43
|
+
return { ok: false, why: 'held' };
|
|
44
|
+
const mine = claimFile(dir, source, b);
|
|
45
|
+
try {
|
|
46
|
+
fs.writeFileSync(mine, JSON.stringify({ at: now, pid: process.pid }), { flag: 'wx', mode: 0o600 });
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// EEXIST on a regular file: this bucket is taken (even by a claim too damaged to read), and it owns the interval.
|
|
50
|
+
// EEXIST on anything else (a directory, a FIFO) is an object in the way, which no claim can replace.
|
|
51
|
+
const code = e.code;
|
|
52
|
+
return { ok: false, why: code === 'EEXIST' && kindAt(mine) === 'file' ? 'held' : 'unwritable' };
|
|
53
|
+
}
|
|
54
|
+
// A launch on the other side of a boundary may have claimed between our check and our create.
|
|
55
|
+
if ([b - 1, b + 1].some((k) => { const at = claimAt(claimFile(dir, source, k)); return at !== undefined && Math.abs(now - at) < intervalMs; })) {
|
|
56
|
+
try {
|
|
57
|
+
fs.rmSync(mine, { force: true });
|
|
58
|
+
}
|
|
59
|
+
catch { /* it expires on its own */ }
|
|
60
|
+
return { ok: false, why: 'held' };
|
|
61
|
+
}
|
|
62
|
+
sweep(dir, source, b);
|
|
63
|
+
return { ok: true };
|
|
64
|
+
}
|
|
65
|
+
export function releaseClaim(dir, source, now, intervalMs) {
|
|
66
|
+
try {
|
|
67
|
+
fs.rmSync(claimFile(dir, source, bucketOf(now, intervalMs)), { force: true });
|
|
68
|
+
}
|
|
69
|
+
catch { /* it expires on its own */ }
|
|
70
|
+
}
|
|
71
|
+
function sweep(dir, source, bucket) {
|
|
72
|
+
try {
|
|
73
|
+
const re = NAME(source);
|
|
74
|
+
for (const n of fs.readdirSync(dir)) {
|
|
75
|
+
const m = re.exec(n);
|
|
76
|
+
if (m && Number(m[1]) < bucket - 2)
|
|
77
|
+
fs.rmSync(path.join(dir, n), { force: true });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch { /* a sweep that fails leaves old files, which are harmless */ }
|
|
81
|
+
}
|
|
82
|
+
/** Why a background refresh cannot record its claim for this source (a directory or other object in the way, or an unwritable state directory), or undefined. For `align sync --status`. */
|
|
83
|
+
export function claimProblem(dir, source, now, intervalMs) {
|
|
84
|
+
try {
|
|
85
|
+
fs.accessSync(dir, fs.constants.W_OK);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return `Align cannot write to its state directory (${dir}), so it does not refresh ${source} in the background`;
|
|
89
|
+
}
|
|
90
|
+
const b = bucketOf(now, intervalMs);
|
|
91
|
+
for (const k of [b, b - 1]) {
|
|
92
|
+
if (kindAt(claimFile(dir, source, k)) === 'other')
|
|
93
|
+
return `something that is not a file is in the way at ${claimFile(dir, source, k)}, so Align does not refresh ${source} in the background. Remove it`;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=bg-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bg-claim.js","sourceRoot":"","sources":["../../../src/lib/sync/bg-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type BlockedState = 'manual' | 'not_connected';
|
|
2
|
+
export declare function writeBlocked(source: string, state: BlockedState, reason: string, dir?: string | null): void;
|
|
3
|
+
export declare function clearBlocked(source: string, dir?: string | null): void;
|
|
4
|
+
export declare function readBlocked(source: string, dir?: string | null): {
|
|
5
|
+
state: BlockedState;
|
|
6
|
+
reason: string;
|
|
7
|
+
} | undefined;
|
|
8
|
+
//# sourceMappingURL=blocked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocked.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/blocked.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,eAAe,CAAC;AAGtD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,IAAsB,GAAG,IAAI,CAG5H;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,IAAsB,GAAG,IAAI,CAGvF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,IAAsB,GAAG;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQrI"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6: sources a background run found it cannot read until a person acts: `manual` (Confluence with no
|
|
3
|
+
* spaces chosen, Teams) or `not_connected`. Such a run writes no timestamp, so the launcher would
|
|
4
|
+
* start a child for it every interval for ever. The child leaves a small marker here instead; the
|
|
5
|
+
* summary builder reads it and lists the source as not schedulable, and the next run of that source
|
|
6
|
+
* that gets further clears it. File-system only (neither the launcher nor the summary reader opens it).
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { alignStateDir } from '../backfill-state.js';
|
|
11
|
+
import { isKnownSource } from './source-ids.js';
|
|
12
|
+
import { readRegularFile } from './safe-read.js';
|
|
13
|
+
const file = (dir, source) => path.join(dir, `${source}.blocked.json`);
|
|
14
|
+
export function writeBlocked(source, state, reason, dir = alignStateDir()) {
|
|
15
|
+
if (dir === null || !isKnownSource(source))
|
|
16
|
+
return;
|
|
17
|
+
try {
|
|
18
|
+
fs.writeFileSync(file(dir, source), JSON.stringify({ state, reason: reason.slice(0, 300) }), { mode: 0o600 });
|
|
19
|
+
}
|
|
20
|
+
catch { /* the next interval tries again */ }
|
|
21
|
+
}
|
|
22
|
+
export function clearBlocked(source, dir = alignStateDir()) {
|
|
23
|
+
if (dir === null || !isKnownSource(source))
|
|
24
|
+
return;
|
|
25
|
+
try {
|
|
26
|
+
fs.rmSync(file(dir, source), { force: true });
|
|
27
|
+
}
|
|
28
|
+
catch { /* as above */ }
|
|
29
|
+
}
|
|
30
|
+
export function readBlocked(source, dir = alignStateDir()) {
|
|
31
|
+
if (dir === null || !isKnownSource(source))
|
|
32
|
+
return undefined;
|
|
33
|
+
const raw = readRegularFile(file(dir, source), 4096);
|
|
34
|
+
if (raw === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
const b = JSON.parse(raw);
|
|
38
|
+
return (b.state === 'manual' || b.state === 'not_connected') ? { state: b.state, reason: typeof b.reason === 'string' ? b.reason : '' } : undefined;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=blocked.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocked.js","sourceRoot":"","sources":["../../../src/lib/sync/blocked.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,MAAc,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC;AAE/F,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAmB,EAAE,MAAc,EAAE,MAAqB,aAAa,EAAE;IACpH,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO;IACnD,IAAI,CAAC;QAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,mCAAmC,CAAC,CAAC;AACtK,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAAqB,aAAa,EAAE;IAC/E,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO;IACnD,IAAI,CAAC;QAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAqB,aAAa,EAAE;IAC9E,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7D,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0C,CAAC;QACnE,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtJ,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ClassificationOutcome } from '../local-relationship-classifier.js';
|
|
2
|
+
export declare const CLASSIFY_AUDIT_ACTION = "sync_classified";
|
|
3
|
+
export interface Unclassified {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
summary: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function unclassifiedItems(dbPath: string, limit: number): Unclassified[];
|
|
9
|
+
export interface Estimate {
|
|
10
|
+
/** Items that would be classified: min(max, unclassified). */
|
|
11
|
+
items: number;
|
|
12
|
+
/** Upper bound on LLM calls: items x CAPTURE_CLASSIFY_TOP_K. */
|
|
13
|
+
calls: number;
|
|
14
|
+
/** How many unclassified items exist in all. */
|
|
15
|
+
available: number;
|
|
16
|
+
/** "Anthropic", "Ollama"... or undefined when none is configured. */
|
|
17
|
+
provider: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare function estimateClassify(dbPath: string, max: number): Estimate;
|
|
20
|
+
export interface ClassifyResult {
|
|
21
|
+
items: number;
|
|
22
|
+
calls: number;
|
|
23
|
+
typed: number;
|
|
24
|
+
unparsed: number;
|
|
25
|
+
stopped?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function classifyUnclassified(dbPath: string, max: number, classify?: (a: {
|
|
28
|
+
title: string;
|
|
29
|
+
summary: string;
|
|
30
|
+
}, b: {
|
|
31
|
+
title: string;
|
|
32
|
+
summary: string;
|
|
33
|
+
}) => Promise<ClassificationOutcome>): Promise<ClassifyResult>;
|
|
34
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/classify.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,qBAAqB,EAAwB,MAAM,qCAAqC,CAAC;AAGvG,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAE5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAiB/E;AAED,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAMtE;AAED,MAAM,WAAW,cAAc;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAEnH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,qBAAqB,CAAwB,GAChJ,OAAO,CAAC,cAAc,CAAC,CAoCzB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5, Decision 1: `align sync --classify --max N`, the ONLY path that types imported items.
|
|
3
|
+
*
|
|
4
|
+
* Background sync, backfill and every connector import write free `relates` links and never call
|
|
5
|
+
* the paid classifier. This is the on-demand half: the person runs it, sees an estimate first, and
|
|
6
|
+
* confirms (the command asks; `align_sync` can only ESTIMATE). It classifies the same high-confidence
|
|
7
|
+
* candidates ingestOne would have (score >= SIMILARITY_THRESHOLD, at most CAPTURE_CLASSIFY_TOP_K per
|
|
8
|
+
* item), writes through the existing `replaceLink`, and works newest first.
|
|
9
|
+
*
|
|
10
|
+
* "Unclassified" means: has at least one high-confidence `relates` edge as its source, no typed
|
|
11
|
+
* edge on either side, and was not already attempted. The attempt is recorded as an audit note
|
|
12
|
+
* (`sync_classified`) because a classifier verdict of `relates` writes `relates` again, which looks
|
|
13
|
+
* identical to never having been asked: without the note every run would pay for the same items.
|
|
14
|
+
*/
|
|
15
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
16
|
+
import { createLocalDb } from '../local-db.js';
|
|
17
|
+
import { CAPTURE_CLASSIFY_TOP_K } from '../local-ingest.js';
|
|
18
|
+
import { hasConfiguredProvider, preferredProvider } from '../local-llm.js';
|
|
19
|
+
import { PROVIDER_LABEL } from '../llm-providers.js';
|
|
20
|
+
import { classifyRelationship } from '../local-relationship-classifier.js';
|
|
21
|
+
import { SIMILARITY_THRESHOLD } from '../local-thresholds.js';
|
|
22
|
+
export const CLASSIFY_AUDIT_ACTION = 'sync_classified';
|
|
23
|
+
export function unclassifiedItems(dbPath, limit) {
|
|
24
|
+
const db = new DatabaseSync(dbPath);
|
|
25
|
+
try {
|
|
26
|
+
db.exec('PRAGMA busy_timeout = 30000');
|
|
27
|
+
return db.prepare(`SELECT d.id AS id, d.title AS title, d.summary AS summary FROM decisions d
|
|
28
|
+
WHERE EXISTS (SELECT 1 FROM decision_links l WHERE l.source_id = d.id AND l.relation = 'relates' AND l.confidence >= ?)
|
|
29
|
+
AND NOT EXISTS (SELECT 1 FROM decision_links t WHERE (t.source_id = d.id OR t.target_id = d.id) AND t.relation <> 'relates')
|
|
30
|
+
AND NOT EXISTS (SELECT 1 FROM decision_audit a WHERE a.decision_id = d.id AND a.action = ?)
|
|
31
|
+
ORDER BY d.created_at DESC, d.rowid DESC LIMIT ?`).all(SIMILARITY_THRESHOLD, CLASSIFY_AUDIT_ACTION, limit);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
if (/no such table/i.test(e.message))
|
|
35
|
+
return [];
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
db.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function estimateClassify(dbPath, max) {
|
|
43
|
+
const available = unclassifiedItems(dbPath, Number.MAX_SAFE_INTEGER).length;
|
|
44
|
+
const items = Math.min(Math.max(0, max), available);
|
|
45
|
+
const configured = hasConfiguredProvider();
|
|
46
|
+
const preferred = preferredProvider();
|
|
47
|
+
return { items, calls: items * CAPTURE_CLASSIFY_TOP_K, available, provider: configured ? (preferred ? PROVIDER_LABEL[preferred] : 'configured AI provider') : undefined };
|
|
48
|
+
}
|
|
49
|
+
export async function classifyUnclassified(dbPath, max, classify = classifyRelationship) {
|
|
50
|
+
const db = createLocalDb(dbPath);
|
|
51
|
+
const out = { items: 0, calls: 0, typed: 0, unparsed: 0 };
|
|
52
|
+
try {
|
|
53
|
+
for (const item of unclassifiedItems(dbPath, Math.max(0, max))) {
|
|
54
|
+
const candidates = db.listLinks({ relation: 'relates', decisionId: item.id })
|
|
55
|
+
.filter((l) => l.sourceId === item.id && l.confidence >= SIMILARITY_THRESHOLD)
|
|
56
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
57
|
+
.slice(0, CAPTURE_CLASSIFY_TOP_K);
|
|
58
|
+
let stopped = false;
|
|
59
|
+
for (const l of candidates) {
|
|
60
|
+
const existing = db.getDecisionById(l.targetId);
|
|
61
|
+
if (!existing)
|
|
62
|
+
continue;
|
|
63
|
+
out.calls += 1;
|
|
64
|
+
// Same direction as the capture-time pass: the EXISTING decision is the subject, this item the candidate.
|
|
65
|
+
const r = await classify({ title: existing.title, summary: existing.summary }, { title: item.title, summary: item.summary });
|
|
66
|
+
if (r.ok) {
|
|
67
|
+
db.replaceLink({ sourceId: item.id, targetId: l.targetId, relation: r.relationship.type, confidence: r.relationship.confidence });
|
|
68
|
+
out.typed += 1;
|
|
69
|
+
}
|
|
70
|
+
else if (r.failure?.kind === 'provider_stopped') {
|
|
71
|
+
stopped = true;
|
|
72
|
+
out.stopped = 'the AI provider stopped answering (a bad key, no credit or a rate limit)';
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
out.unparsed += 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// A stopped provider says nothing about this item, so it stays eligible for the next run.
|
|
80
|
+
if (stopped)
|
|
81
|
+
break;
|
|
82
|
+
db.insertAudit({ decisionId: item.id, action: CLASSIFY_AUDIT_ACTION, actor: null });
|
|
83
|
+
out.items += 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
db.close();
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/lib/sync/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CaptureSkip } from '../fetchers/capture.js';
|
|
2
|
+
import { drainDiscussion } from '../fetchers/github.js';
|
|
3
|
+
import type { createLocalGatewayClient } from '../local-gateway-client.js';
|
|
4
|
+
export interface DrainResult {
|
|
5
|
+
enriched: number;
|
|
6
|
+
remaining: number;
|
|
7
|
+
skips: CaptureSkip[];
|
|
8
|
+
}
|
|
9
|
+
export interface DrainDeps {
|
|
10
|
+
/** Seam for tests: the chunked SDK drain. */
|
|
11
|
+
drain?: typeof drainDiscussion;
|
|
12
|
+
budget?: number;
|
|
13
|
+
deadlineMs?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function drainGitHub(dbPath: string, client: Pick<ReturnType<typeof createLocalGatewayClient>, 'ingestBatch'>, token: string, deps?: DrainDeps): Promise<DrainResult>;
|
|
16
|
+
//# sourceMappingURL=drain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/drain.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAG3E,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE;AAE1F,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,eAAe,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,EAAE,aAAa,CAAC,EACxE,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CA2BtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { GITHUB_DISCUSSION_BUDGET, SYNC_TIME_BUDGET_MS } from '../import-defaults.js';
|
|
2
|
+
import { drainDiscussion } from '../fetchers/github.js';
|
|
3
|
+
import { clearDetailPending, pendingRows } from './sync-state.js';
|
|
4
|
+
export async function drainGitHub(dbPath, client, token, deps = {}) {
|
|
5
|
+
const rows = pendingRows(dbPath, 'github');
|
|
6
|
+
if (rows.length === 0)
|
|
7
|
+
return { enriched: 0, remaining: 0, skips: [] };
|
|
8
|
+
const byUrl = new Map(rows.map((r) => [r.source_url, r]));
|
|
9
|
+
const items = rows.map((r) => ({
|
|
10
|
+
source_url: r.source_url, platform: 'github', raw_text: r.summary, title: r.title,
|
|
11
|
+
...(r.decided_at !== null ? { created_at: r.decided_at, updated_at: r.decided_at } : {}),
|
|
12
|
+
detail_pending: true,
|
|
13
|
+
}));
|
|
14
|
+
const run = deps.drain ?? drainDiscussion;
|
|
15
|
+
const { items: done, skips } = await run(items, {
|
|
16
|
+
token, budget: deps.budget ?? GITHUB_DISCUSSION_BUDGET, deadlineMs: deps.deadlineMs ?? SYNC_TIME_BUDGET_MS,
|
|
17
|
+
});
|
|
18
|
+
const enriched = done.filter((i) => byUrl.has(i.source_url));
|
|
19
|
+
if (enriched.length > 0) {
|
|
20
|
+
const { snapshots } = await client.ingestBatch(enriched.map((i) => {
|
|
21
|
+
const stored = byUrl.get(i.source_url);
|
|
22
|
+
return {
|
|
23
|
+
source_url: i.source_url, platform: 'github', title: stored.title, raw_text: i.raw_text,
|
|
24
|
+
...(stored.decided_at !== null ? { created_at: stored.decided_at } : {}), detail_pending: false,
|
|
25
|
+
};
|
|
26
|
+
}), { classify: false, keyed: true });
|
|
27
|
+
// An attested row keeps its text (the new text is recorded for review), so its flag would
|
|
28
|
+
// stay set and the row would be read again every run. Its discussion HAS been read.
|
|
29
|
+
clearDetailPending(dbPath, snapshots.map((s) => s.id));
|
|
30
|
+
}
|
|
31
|
+
return { enriched: enriched.length, remaining: rows.length - enriched.length, skips };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=drain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.js","sourceRoot":"","sources":["../../../src/lib/sync/drain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type PurgeResult } from './purge.js';
|
|
2
|
+
export interface ForgetResult {
|
|
3
|
+
syncRowsRemoved: number;
|
|
4
|
+
/** Set only with `purge`. */
|
|
5
|
+
purged?: PurgeResult;
|
|
6
|
+
/** Items of the platform still in the graph afterwards. */
|
|
7
|
+
staying: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function forgetSourceData(dbPath: string | undefined, source: string, o: {
|
|
10
|
+
purge: boolean;
|
|
11
|
+
}): ForgetResult;
|
|
12
|
+
//# sourceMappingURL=forget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/forget.ts"],"names":[],"mappings":"AAWA,OAAO,EAAmC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/E,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CAehH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: what `align local forget <source>` does to the graph, beside dropping the token.
|
|
3
|
+
* Without `--purge`: the source's sync rows and item state go (its window and watermark mean nothing
|
|
4
|
+
* without a token) and the imported items stay; the caller is told how many. With `--purge`: the
|
|
5
|
+
* items nobody has vouched for go too (purge.ts says which are kept and why).
|
|
6
|
+
*
|
|
7
|
+
* ONE transaction: a failure leaves the graph as it was, and the caller drops the token only after
|
|
8
|
+
* this returns, so a failed forget never leaves a token-less source with half its state.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import { createLocalDb } from '../local-db.js';
|
|
12
|
+
import { isPurgeable, previewIn, purgeIn } from './purge.js';
|
|
13
|
+
import { transact } from './sync-state.js';
|
|
14
|
+
export function forgetSourceData(dbPath, source, o) {
|
|
15
|
+
// A graph that does not exist has nothing to forget, and opening it would create it.
|
|
16
|
+
if (dbPath === undefined || !fs.existsSync(dbPath))
|
|
17
|
+
return { syncRowsRemoved: 0, staying: 0, ...(o.purge ? { purged: { deleted: 0, kept: 0 } } : {}) };
|
|
18
|
+
if (o.purge && !isPurgeable(source))
|
|
19
|
+
throw new Error(`"${source.slice(0, 24)}" is not a connector source, so nothing was purged.`);
|
|
20
|
+
// Opening through the one opener migrates an older file (the tables below exist) and refuses a newer one.
|
|
21
|
+
createLocalDb(dbPath).close();
|
|
22
|
+
return transact(dbPath, (db) => {
|
|
23
|
+
const syncRowsRemoved = Number(db.prepare('DELETE FROM source_sync WHERE source_id = ?').run(source).changes);
|
|
24
|
+
db.prepare('DELETE FROM sync_item_state WHERE platform = ?').run(source);
|
|
25
|
+
if (o.purge) {
|
|
26
|
+
const purged = purgeIn(db, source);
|
|
27
|
+
return { syncRowsRemoved, purged, staying: purged.kept };
|
|
28
|
+
}
|
|
29
|
+
return { syncRowsRemoved, staying: previewIn(db, source).total };
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=forget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../../src/lib/sync/forget.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAoB,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAU3C,MAAM,UAAU,gBAAgB,CAAC,MAA0B,EAAE,MAAc,EAAE,CAAqB;IAChG,qFAAqF;IACrF,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACvJ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,qDAAqD,CAAC,CAAC;IACnI,0GAA0G;IAC1G,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9B,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;QAC7B,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9G,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type SyncSummary } from './summary-read.js';
|
|
2
|
+
export declare const BACKGROUND_SYNC_NOTICE = "Align refreshes your connected sources in the background when you start it, at most every 15 minutes per source. Turn off: align sync --off";
|
|
3
|
+
export interface BackgroundSyncConfig {
|
|
4
|
+
isBackgroundSyncOff?(): boolean;
|
|
5
|
+
backgroundSyncNoticeShown?(): boolean;
|
|
6
|
+
markBackgroundSyncNoticeShown?(at: string): void;
|
|
7
|
+
getReauthLineShownAt?(): string | undefined;
|
|
8
|
+
markReauthLineShown?(at: string): void;
|
|
9
|
+
}
|
|
10
|
+
/** The parts that touch the disk or start a process. Tests replace them; the defaults are rooted at the host's env and home. */
|
|
11
|
+
export interface BackgroundSyncIo {
|
|
12
|
+
readSummary(): SyncSummary | undefined;
|
|
13
|
+
/** Is a sync or a backfill running for this source right now? */
|
|
14
|
+
busy(source: string): boolean;
|
|
15
|
+
inCi(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Take the per-source claim for this interval, atomically (an exclusive create). False when another launch holds a
|
|
18
|
+
* fresh one, or the claim cannot be written: then nothing starts for that source. Concurrent launches inside the child's
|
|
19
|
+
* 20 s delay therefore start ONE child, not one each.
|
|
20
|
+
*/
|
|
21
|
+
claim(source: string): boolean;
|
|
22
|
+
releaseClaim(source: string): void;
|
|
23
|
+
/** Fire and forget. The launcher never awaits what this returns. */
|
|
24
|
+
start(sources: string[]): unknown;
|
|
25
|
+
nowMs(): number;
|
|
26
|
+
}
|
|
27
|
+
export interface BackgroundSyncHost {
|
|
28
|
+
env: Record<string, string | undefined>;
|
|
29
|
+
home: string;
|
|
30
|
+
platform: string;
|
|
31
|
+
isTTY: boolean;
|
|
32
|
+
config: BackgroundSyncConfig;
|
|
33
|
+
err(line: string): void;
|
|
34
|
+
io?: Partial<BackgroundSyncIo>;
|
|
35
|
+
}
|
|
36
|
+
export interface BackgroundPlan {
|
|
37
|
+
sources: string[];
|
|
38
|
+
reauth: string[];
|
|
39
|
+
}
|
|
40
|
+
export declare function planBackgroundSync(h: BackgroundSyncHost): BackgroundPlan;
|
|
41
|
+
export declare function applyBackgroundPlan(plan: BackgroundPlan, h: BackgroundSyncHost): void;
|
|
42
|
+
//# sourceMappingURL=launch-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-hook.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/launch-hook.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE,eAAO,MAAM,sBAAsB,gJAC4G,CAAC;AAEhJ,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,IAAI,OAAO,CAAC;IAChC,yBAAyB,CAAC,IAAI,OAAO,CAAC;IACtC,6BAA6B,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,oBAAoB,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC;IAC5C,mBAAmB,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,gIAAgI;AAChI,MAAM,WAAW,gBAAgB;IAC/B,WAAW,IAAI,WAAW,GAAG,SAAS,CAAC;IACvC,iEAAiE;IACjE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,IAAI,IAAI,OAAO,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oEAAoE;IACpE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,KAAK,IAAI,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE;AA2BvE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAuBxE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAkCrF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6: the launch-time background refresh (Decisions 8, 9, 23). Called from launchIfChosen in two
|
|
3
|
+
* halves so the launch cost line stays honest:
|
|
4
|
+
*
|
|
5
|
+
* - `planBackgroundSync` DECIDES. Read-only: one small JSON file, a lock file per due source, nothing
|
|
6
|
+
* else. It runs before the overhead trace line, so its time is in the number the budget gates.
|
|
7
|
+
* - `applyBackgroundPlan` ACTS: prints the two lines, records that it did, and starts the detached
|
|
8
|
+
* child without waiting for it. It runs only after the dry-run exit, because a dry run measures
|
|
9
|
+
* and must not change the machine.
|
|
10
|
+
*
|
|
11
|
+
* Imports are deliberately small (no database layer, no fetcher, no setup.ts):
|
|
12
|
+
* launch-path-imports.test.ts walks them. Nothing here throws into the launcher: a failure to
|
|
13
|
+
* decide or to start means no refresh this time, and the agent opens exactly as it would have.
|
|
14
|
+
*/
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { alignStateDirPath, liveBackfills, pidAlive } from '../backfill-state.js';
|
|
17
|
+
import { inCi } from '../telemetry-ci.js';
|
|
18
|
+
import { claimInForce, releaseClaim, takeClaim } from './bg-claim.js';
|
|
19
|
+
import { lockHolder } from './lock.js';
|
|
20
|
+
import { BACKGROUND_LAUNCH_DELAY_SECONDS, REAUTH_LINE_INTERVAL_MS, reauthSources, shouldBackgroundSync, SYNC_MIN_INTERVAL_MS } from './should-background-sync.js';
|
|
21
|
+
import { startSyncChild } from './spawn-background.js';
|
|
22
|
+
import { readSummary } from './summary-read.js';
|
|
23
|
+
export const BACKGROUND_SYNC_NOTICE = 'Align refreshes your connected sources in the background when you start it, at most every 15 minutes per source. Turn off: align sync --off';
|
|
24
|
+
const EMPTY = { sources: [], reauth: [] };
|
|
25
|
+
const set = (v) => v !== undefined && v !== '';
|
|
26
|
+
function defaultIo(h) {
|
|
27
|
+
const stateDir = alignStateDirPath(h.env, h.home, h.platform);
|
|
28
|
+
// Read once per launch, however many sources are due.
|
|
29
|
+
let backfills;
|
|
30
|
+
const runningBackfills = () => (backfills ??= liveBackfills(path.join(stateDir, 'backfill'), pidAlive));
|
|
31
|
+
return {
|
|
32
|
+
readSummary: () => readSummary(stateDir),
|
|
33
|
+
busy: (source) => lockHolder(`sync-${source}`, { dir: stateDir }) !== undefined
|
|
34
|
+
|| runningBackfills().some((s) => s.source === source)
|
|
35
|
+
|| claimInForce(stateDir, source, Date.now(), SYNC_MIN_INTERVAL_MS),
|
|
36
|
+
inCi: () => inCi(h.env),
|
|
37
|
+
// Skip, never block: a claim that cannot be recorded (an object in the way, an unwritable directory) means no start for that source,
|
|
38
|
+
// and `align sync --status` says why.
|
|
39
|
+
claim: (source) => takeClaim(stateDir, source, Date.now(), SYNC_MIN_INTERVAL_MS).ok,
|
|
40
|
+
releaseClaim: (source) => releaseClaim(stateDir, source, Date.now(), SYNC_MIN_INTERVAL_MS),
|
|
41
|
+
start: (sources) => startSyncChild(sources, { delaySeconds: BACKGROUND_LAUNCH_DELAY_SECONDS, env: h.env, caller: 'launcher' }),
|
|
42
|
+
nowMs: () => Date.now(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const ioOf = (h) => ({ ...defaultIo(h), ...h.io });
|
|
46
|
+
export function planBackgroundSync(h) {
|
|
47
|
+
try {
|
|
48
|
+
// The cheap gates first: most launches outside a terminal, or with the switch set, read nothing.
|
|
49
|
+
if (!h.isTTY || set(h.env['ALIGN_WRAPPED']) || set(h.env['ALIGN_NO_SYNC']))
|
|
50
|
+
return EMPTY;
|
|
51
|
+
if (h.config.isBackgroundSyncOff?.() === true)
|
|
52
|
+
return EMPTY;
|
|
53
|
+
const io = ioOf(h);
|
|
54
|
+
const summary = io.readSummary();
|
|
55
|
+
if (summary === undefined)
|
|
56
|
+
return EMPTY;
|
|
57
|
+
const now = io.nowMs();
|
|
58
|
+
const gates = { isTty: h.isTTY, wrapped: false, noSync: false, disabled: false, summary, now };
|
|
59
|
+
// `ci` is asked only when something is due, and `busy` only for what is due.
|
|
60
|
+
let sources = shouldBackgroundSync({ ...gates, ci: false, minIntervalMs: SYNC_MIN_INTERVAL_MS });
|
|
61
|
+
if (sources.length > 0) {
|
|
62
|
+
const busy = new Set(sources.filter((s) => io.busy(s)));
|
|
63
|
+
sources = io.inCi() ? [] : shouldBackgroundSync({ ...gates, ci: false, minIntervalMs: SYNC_MIN_INTERVAL_MS, busy });
|
|
64
|
+
}
|
|
65
|
+
let reauth = reauthSources({ ...gates, ci: false, lastShownAt: h.config.getReauthLineShownAt?.(), intervalMs: REAUTH_LINE_INTERVAL_MS });
|
|
66
|
+
if (reauth.length > 0 && io.inCi())
|
|
67
|
+
reauth = [];
|
|
68
|
+
return { sources, reauth };
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return EMPTY;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function applyBackgroundPlan(plan, h) {
|
|
75
|
+
try {
|
|
76
|
+
const io = ioOf(h);
|
|
77
|
+
const stamp = () => new Date(io.nowMs()).toISOString();
|
|
78
|
+
// Mark first and print only if the mark held: a config that cannot be written would otherwise repeat the line every launch.
|
|
79
|
+
if (plan.reauth.length > 0) {
|
|
80
|
+
try {
|
|
81
|
+
h.config.markReauthLineShown?.(stamp());
|
|
82
|
+
const s = plan.reauth.length === 1;
|
|
83
|
+
h.err(`Align cannot refresh ${plan.reauth.join(', ')}: ${s ? 'its' : 'their'} saved login stopped working. Reconnect: align connect ${plan.reauth[0]}`);
|
|
84
|
+
}
|
|
85
|
+
catch { /* an unwritable config: no line this time, and no repeat */ }
|
|
86
|
+
}
|
|
87
|
+
if (plan.sources.length === 0)
|
|
88
|
+
return;
|
|
89
|
+
if (h.config.backgroundSyncNoticeShown?.() !== true) {
|
|
90
|
+
try {
|
|
91
|
+
h.config.markBackgroundSyncNoticeShown?.(stamp());
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return; // the first-use line cannot be recorded, so it is not shown and nothing starts undisclosed
|
|
95
|
+
}
|
|
96
|
+
h.err(BACKGROUND_SYNC_NOTICE);
|
|
97
|
+
}
|
|
98
|
+
// Only the sources whose claim THIS launch took: a concurrent launch already started those.
|
|
99
|
+
const claimed = plan.sources.filter((s) => io.claim(s));
|
|
100
|
+
if (claimed.length === 0)
|
|
101
|
+
return;
|
|
102
|
+
// Not awaited: the agent must not wait for a process to be confirmed. A start that fails gives the claim back.
|
|
103
|
+
const release = () => { for (const s of claimed)
|
|
104
|
+
io.releaseClaim(s); };
|
|
105
|
+
try {
|
|
106
|
+
void Promise.resolve(io.start(claimed)).then((r) => { if (r?.ok === false)
|
|
107
|
+
release(); }, release);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
release();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// No refresh this time; the launch goes on.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=launch-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-hook.js","sourceRoot":"","sources":["../../../src/lib/sync/launch-hook.ts"],"names":[],"mappings":"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"}
|