@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,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The AI-provider key, asked for where it is used: `align ask` on a terminal, the first time
|
|
3
|
+
* it has nothing to write prose with.
|
|
4
|
+
*
|
|
5
|
+
* It used to be the last step of the first-run wizard (ALI-1284's guided Groq + Gemini
|
|
6
|
+
* offer), immediately before align opened the coding agent. Read in that position, a Groq key
|
|
7
|
+
* looks like something Claude Code needs - it is not. Inside a wrapped agent the agent writes
|
|
8
|
+
* the prose from the MCP results; the key only serves align's own terminal `align ask`. So the
|
|
9
|
+
* wizard no longer asks, and this module asks lazily, with the reason stated first.
|
|
10
|
+
*
|
|
11
|
+
* Secrets: a key is read through a masked password prompt, stored in the 0600 config file
|
|
12
|
+
* (config.setProviderKey, the same store as every other saved credential) and never printed -
|
|
13
|
+
* not in a log line, not in a confirmation. It is never written to process.env either (H1):
|
|
14
|
+
* local-llm reads saved keys as data on every call, so it is live at once, and a child process
|
|
15
|
+
* (the coding agent bare `align` opens) cannot inherit it.
|
|
16
|
+
*/
|
|
17
|
+
import * as p from '@clack/prompts';
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { listConfiguredCredentials, unusedExportedKeys } from './local-llm.js';
|
|
20
|
+
import { PROVIDER_KEY_URL, PROVIDER_LABEL, STORABLE_PROVIDERS, } from './llm-providers.js';
|
|
21
|
+
import { guardedPrompt } from './prompt-guard.js';
|
|
22
|
+
/** The command that re-opens this choice later. */
|
|
23
|
+
export const CHOOSE_PROVIDER_COMMAND = 'align ai';
|
|
24
|
+
/** Masked paste for one provider. null when nothing usable was entered (or the prompt crashed). */
|
|
25
|
+
async function pasteKey(id) {
|
|
26
|
+
p.log.info(`Get one: ${chalk.bold(PROVIDER_KEY_URL[id])}`);
|
|
27
|
+
const key = await guardedPrompt(`${PROVIDER_LABEL[id]} API key`, () => p.password({ message: ` ${PROVIDER_LABEL[id]} API key:` }));
|
|
28
|
+
if (p.isCancel(key))
|
|
29
|
+
return key;
|
|
30
|
+
return typeof key === 'string' && key.trim() ? key.trim() : null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* "Use a key I already have": pick the provider, paste, save. Returns the provider saved, or
|
|
34
|
+
* null when the user backed out or pasted nothing.
|
|
35
|
+
*/
|
|
36
|
+
export async function promptForProviderKey(config) {
|
|
37
|
+
// Keys already exported for a provider align does not use on its own (HF_TOKEN for model
|
|
38
|
+
// downloads, say) come first: picking one saves only the CHOICE, so the key stays in the
|
|
39
|
+
// user's shell and is never copied into align's config.
|
|
40
|
+
const exported = unusedExportedKeys().filter((k) => k.id !== 'custom' && k.id !== 'ollama');
|
|
41
|
+
const choice = await guardedPrompt('Provider', () => p.select({
|
|
42
|
+
message: 'Which provider is the key for?',
|
|
43
|
+
options: [
|
|
44
|
+
...exported.map((k) => ({ value: `env:${k.id}`, label: `${PROVIDER_LABEL[k.id]} (found ${k.envVar} in your shell)` })),
|
|
45
|
+
...STORABLE_PROVIDERS.map((value) => ({ value, label: PROVIDER_LABEL[value] })),
|
|
46
|
+
],
|
|
47
|
+
}));
|
|
48
|
+
if (choice === null || p.isCancel(choice) || typeof choice !== 'string')
|
|
49
|
+
return null;
|
|
50
|
+
if (choice.startsWith('env:')) {
|
|
51
|
+
const id = choice.slice(4);
|
|
52
|
+
config.setLlmPreference({ provider: id });
|
|
53
|
+
p.log.success(`${chalk.bold('align ask')} now uses ${PROVIDER_LABEL[id]} with the key in your shell.`);
|
|
54
|
+
return id;
|
|
55
|
+
}
|
|
56
|
+
const id = choice;
|
|
57
|
+
const key = await pasteKey(id);
|
|
58
|
+
if (key === null || typeof key !== 'string') {
|
|
59
|
+
if (key === null)
|
|
60
|
+
p.log.warn('No key entered - nothing saved.');
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
config.setProviderKey(id, key);
|
|
64
|
+
p.log.success(`Saved your ${PROVIDER_LABEL[id]} key - ${chalk.bold('align ask')} uses it from now on.`);
|
|
65
|
+
return id;
|
|
66
|
+
}
|
|
67
|
+
/** "Get a free Groq key": today's guided path, Gemini backup included. */
|
|
68
|
+
async function freeGroqKey(config) {
|
|
69
|
+
p.log.info(`Groq's free tier needs no card, ever.`);
|
|
70
|
+
const groq = await pasteKey('groq');
|
|
71
|
+
if (typeof groq !== 'string') {
|
|
72
|
+
if (groq === null)
|
|
73
|
+
p.log.warn('No key entered - nothing saved.');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
config.setProviderKey('groq', groq);
|
|
77
|
+
p.log.success(`Saved - ${chalk.bold('align ask')} will use it on this machine from now on.`);
|
|
78
|
+
const wantGemini = await p.confirm({
|
|
79
|
+
message: `Also add a Gemini key as backup for when Groq's daily limit is hit? (also free, no card)`,
|
|
80
|
+
initialValue: true,
|
|
81
|
+
});
|
|
82
|
+
if (p.isCancel(wantGemini) || !wantGemini)
|
|
83
|
+
return true;
|
|
84
|
+
const gemini = await pasteKey('gemini');
|
|
85
|
+
if (typeof gemini === 'string') {
|
|
86
|
+
config.setProviderKey('gemini', gemini);
|
|
87
|
+
p.log.success('Saved as backup.');
|
|
88
|
+
}
|
|
89
|
+
else if (gemini === null) {
|
|
90
|
+
p.log.warn('No key entered - skipping the backup.');
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The first-ask choice. 'configured': a key was saved and is live for the next call - ask again.
|
|
96
|
+
* 'dismissed': "Not now", remembered so `align ask` stops asking. 'cancelled': backed out
|
|
97
|
+
* (Ctrl-C, empty paste) - nothing saved, nothing remembered, the list prints as usual.
|
|
98
|
+
*/
|
|
99
|
+
export async function offerAskProviderKey(config) {
|
|
100
|
+
p.log.info(`${chalk.bold('align ask')} writes answers with an AI model. Inside your coding agent you don't need this - the agent writes them.`);
|
|
101
|
+
const choice = await guardedPrompt('AI model', () => p.select({
|
|
102
|
+
message: `To get answers here in the terminal, pick one (change it any time: ${CHOOSE_PROVIDER_COMMAND}):`,
|
|
103
|
+
options: [
|
|
104
|
+
{ value: 'existing', label: 'Use a key I already have' },
|
|
105
|
+
{ value: 'groq', label: 'Get a free Groq key' },
|
|
106
|
+
{ value: 'later', label: 'Not now - just show matching decisions' },
|
|
107
|
+
],
|
|
108
|
+
initialValue: 'later',
|
|
109
|
+
}));
|
|
110
|
+
if (choice === null || p.isCancel(choice))
|
|
111
|
+
return 'cancelled';
|
|
112
|
+
if (choice === 'later') {
|
|
113
|
+
config.setAskKeyOfferDismissed(true);
|
|
114
|
+
return 'dismissed';
|
|
115
|
+
}
|
|
116
|
+
const saved = choice === 'groq' ? await freeGroqKey(config) : (await promptForProviderKey(config)) !== null;
|
|
117
|
+
return saved ? 'configured' : 'cancelled';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Every provider `align ask` could use right now, in the default order (exported credentials,
|
|
121
|
+
* then saved ones, then Ollama). The Ollama check is the same 2s /api/tags probe the ask path
|
|
122
|
+
* runs, injected so tests never touch the network.
|
|
123
|
+
*/
|
|
124
|
+
export async function detectProviders(probeOllama) {
|
|
125
|
+
const found = listConfiguredCredentials();
|
|
126
|
+
if (await probeOllama())
|
|
127
|
+
found.push({ id: 'ollama', source: 'local' });
|
|
128
|
+
return found;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=ask-key-offer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-key-offer.js","sourceRoot":"","sources":["../../src/lib/ask-key-offer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export declare const BACKFILL_STATUS_ENV = "ALIGN_BACKFILL_STATUS";
|
|
2
|
+
export declare const MAX_PER_SOURCE = 1;
|
|
3
|
+
export declare const MAX_TOTAL = 3;
|
|
4
|
+
export interface BackfillStatus {
|
|
5
|
+
source: string;
|
|
6
|
+
pid: number;
|
|
7
|
+
started_at: string;
|
|
8
|
+
state: 'running' | 'done' | 'failed';
|
|
9
|
+
finished_at?: string;
|
|
10
|
+
exit_code?: number;
|
|
11
|
+
last_line?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Where the state home is, from an explicit environment (the launcher is handed one; tests pass their own). */
|
|
14
|
+
export declare function stateHomeFor(env: Record<string, string | undefined>, home: string, platform: string): string;
|
|
15
|
+
/** `<state home>/align-cli` as a PATH ONLY: nothing is created or checked. For readers (the launch hook) that must not touch the disk. */
|
|
16
|
+
export declare function alignStateDirPath(env: Record<string, string | undefined>, home: string, platform: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* The directory, created private, or null when anything BELOW the state home is not ours and
|
|
19
|
+
* private: `align-cli` and `backfill` are each checked with lstat before anything is created
|
|
20
|
+
* inside them, so a symlink planted at either is refused instead of written through. (The state
|
|
21
|
+
* home itself is the user's own choice and may legitimately sit behind links, as /var does on macOS.)
|
|
22
|
+
*/
|
|
23
|
+
export declare function backfillDir(): string | null;
|
|
24
|
+
/** `<state home>/align-cli`, created private and checked with lstat (L5: the sync lock and the
|
|
25
|
+
* launch summary live beside `backfill/`, and share its refusal of a planted link), or null. */
|
|
26
|
+
export declare function alignStateDir(): string | null;
|
|
27
|
+
export declare function statusPath(dir: string, source: string): string;
|
|
28
|
+
export declare function readStatus(file: string): BackfillStatus | null;
|
|
29
|
+
/** Atomic (write a sibling, rename over): a reader never sees half a file. */
|
|
30
|
+
export declare function writeStatus(file: string, status: BackfillStatus): void;
|
|
31
|
+
/** Is this process alive? EPERM means it exists and is not ours, which is alive. */
|
|
32
|
+
export declare function pidAlive(pid: number): boolean;
|
|
33
|
+
export declare function liveBackfills(dir: string, alive?: (pid: number) => boolean): BackfillStatus[];
|
|
34
|
+
export declare function admit(live: BackfillStatus[], source: string): {
|
|
35
|
+
ok: true;
|
|
36
|
+
} | {
|
|
37
|
+
ok: false;
|
|
38
|
+
reason: 'source' | 'total';
|
|
39
|
+
running: BackfillStatus[];
|
|
40
|
+
};
|
|
41
|
+
export type Reservation = {
|
|
42
|
+
ok: true;
|
|
43
|
+
release(): void;
|
|
44
|
+
} | {
|
|
45
|
+
ok: false;
|
|
46
|
+
reason: 'source' | 'total';
|
|
47
|
+
running: BackfillStatus[];
|
|
48
|
+
}
|
|
49
|
+
/** The state directory could not be used safely, so no slot can be recorded: nothing starts. */
|
|
50
|
+
| {
|
|
51
|
+
ok: false;
|
|
52
|
+
reason: 'state';
|
|
53
|
+
running: [];
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Take a slot for `source`, SYNCHRONOUSLY (no await anywhere in here). Counts what is running
|
|
57
|
+
* (status files), what this process has reserved, and what other server processes have reserved
|
|
58
|
+
* (placeholder `<source>.lock` files made with O_EXCL, so two processes cannot both pass). The
|
|
59
|
+
* caller releases it once the child is confirmed (its status file then holds the slot) or has
|
|
60
|
+
* failed to start.
|
|
61
|
+
*/
|
|
62
|
+
export declare function reserveSlot(dir: string, source: string, alive?: (pid: number) => boolean): Reservation;
|
|
63
|
+
/**
|
|
64
|
+
* How to start `align <argv>` as a child. An npm install runs `node <entry> ...`. A compiled
|
|
65
|
+
* binary (`bun build --compile`) has a bunfs path in argv[1], which is not a user argument, so
|
|
66
|
+
* the child is the executable with the arguments directly (alignDistribution() is decided at
|
|
67
|
+
* build time, not sniffed).
|
|
68
|
+
*/
|
|
69
|
+
export declare function backfillChildCommand(argv: string[], o?: {
|
|
70
|
+
dist?: 'npm' | 'binary';
|
|
71
|
+
execPath?: string;
|
|
72
|
+
argv1?: string | undefined;
|
|
73
|
+
}): {
|
|
74
|
+
command: string;
|
|
75
|
+
args: string[];
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Start the child detached and wait up to ~300 ms for the OS to confirm it exists. "Started" is
|
|
79
|
+
* claimed only on that confirmation: a spawn that fails asynchronously (ENOENT, EMFILE) arrives as
|
|
80
|
+
* an 'error' event, and stdio is ignored, so nothing else would ever say.
|
|
81
|
+
*/
|
|
82
|
+
/**
|
|
83
|
+
* Set on a child an agent's tool call starts, so what the child writes can be attributed to the agent (scope-connect.ts `startedByAgent`).
|
|
84
|
+
* The spawner NAMES its caller: 'mcp' (the default, so existing callers stay as they were) stamps it; 'launcher' (the person's own `align`
|
|
85
|
+
* launch, a background refresh nobody's agent asked for) does not, and also strips a marker inherited from this process.
|
|
86
|
+
*/
|
|
87
|
+
export type ChildCaller = 'mcp' | 'launcher';
|
|
88
|
+
export declare const STARTED_BY_AGENT_ENV = "ALIGN_STARTED_BY";
|
|
89
|
+
/** The environment a child gets: marked as an agent's only when an agent's tool call started it. */
|
|
90
|
+
export declare function stampCaller(env: Record<string, string | undefined>, caller: ChildCaller): Record<string, string | undefined>;
|
|
91
|
+
export declare function startBackfillChild(source: string, argv: string[], file: string | undefined, cmd?: {
|
|
92
|
+
command: string;
|
|
93
|
+
args: string[];
|
|
94
|
+
}, caller?: ChildCaller,
|
|
95
|
+
/** The environment the child inherits. Defaults to this process's own; the sync launch hook passes a reduced one. */
|
|
96
|
+
baseEnv?: Record<string, string | undefined>,
|
|
97
|
+
/** Where the child runs (default: here). The sync launcher passes the home folder, so a folder never picks scope for an unattended run. */
|
|
98
|
+
cwd?: string): Promise<{
|
|
99
|
+
ok: boolean;
|
|
100
|
+
pid?: number;
|
|
101
|
+
}>;
|
|
102
|
+
export interface ChildTrack {
|
|
103
|
+
/** The last thing worth knowing about this run; written into the final status. */
|
|
104
|
+
note(line: string): void;
|
|
105
|
+
/** Write the final state now (idempotent; also runs at process exit). */
|
|
106
|
+
finish(code: number): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The child's side. Reads the status path from the environment, but only trusts one inside the
|
|
110
|
+
* backfill directory: the variable is not a way to make this process overwrite another file.
|
|
111
|
+
* Writes `running` now and the final state at exit (the exit code, and the last line it noted).
|
|
112
|
+
* Called at the very top of the entry point (startup-backfill-track.ts) so a run that dies before
|
|
113
|
+
* any command code - a bad flag, a parse error - still records that it failed. Memoised per file.
|
|
114
|
+
*/
|
|
115
|
+
export declare function trackChildFromEnv(env?: Record<string, string | undefined>): ChildTrack | null;
|
|
116
|
+
//# sourceMappingURL=backfill-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-state.d.ts","sourceRoot":"","sources":["../../src/lib/backfill-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3: the on-disk record of `align_backfill` children, so the tool can cap them and `align_sync`
|
|
3
|
+
* (L5) can find them later. One small JSON file per source under
|
|
4
|
+
* `$XDG_STATE_HOME/align-cli/backfill/<source>.json` (default ~/.local/state; %LOCALAPPDATA% on
|
|
5
|
+
* Windows). Written by the parent when the child has started and by the child when it ends.
|
|
6
|
+
*
|
|
7
|
+
* Caps: at most one running child per source and three in all. "Running" means the file says so
|
|
8
|
+
* AND the pid is alive: a child that was killed leaves a file behind, and that must not block
|
|
9
|
+
* the next backfill. A pid can be reused, so a finished file is never counted as running.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import os from 'node:os';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import { alignDistribution } from './distribution.js';
|
|
16
|
+
import { readRegularFile } from './sync/safe-read.js';
|
|
17
|
+
import { absoluteXdg } from './xdg.js';
|
|
18
|
+
export const BACKFILL_STATUS_ENV = 'ALIGN_BACKFILL_STATUS';
|
|
19
|
+
export const MAX_PER_SOURCE = 1;
|
|
20
|
+
export const MAX_TOTAL = 3;
|
|
21
|
+
/** How long the parent waits for the OS to confirm the child exists before saying it could not start. */
|
|
22
|
+
const START_CONFIRM_MS = 300;
|
|
23
|
+
/** Where the state home is, from an explicit environment (the launcher is handed one; tests pass their own). */
|
|
24
|
+
export function stateHomeFor(env, home, platform) {
|
|
25
|
+
const xdg = absoluteXdg(env, 'XDG_STATE_HOME');
|
|
26
|
+
if (xdg)
|
|
27
|
+
return xdg;
|
|
28
|
+
if (platform === 'win32')
|
|
29
|
+
return env['LOCALAPPDATA'] ?? path.join(home, 'AppData', 'Local');
|
|
30
|
+
return path.join(home, '.local', 'state');
|
|
31
|
+
}
|
|
32
|
+
function stateHome() {
|
|
33
|
+
return stateHomeFor(process.env, os.homedir(), process.platform);
|
|
34
|
+
}
|
|
35
|
+
/** `<state home>/align-cli` as a PATH ONLY: nothing is created or checked. For readers (the launch hook) that must not touch the disk. */
|
|
36
|
+
export function alignStateDirPath(env, home, platform) {
|
|
37
|
+
return path.join(stateHomeFor(env, home, platform), 'align-cli');
|
|
38
|
+
}
|
|
39
|
+
/** One directory of the chain: a real directory (never a link someone planted), ours, private. */
|
|
40
|
+
function ensureOwnPrivateDir(d) {
|
|
41
|
+
try {
|
|
42
|
+
let st = fs.lstatSync(d, { throwIfNoEntry: false });
|
|
43
|
+
if (!st) {
|
|
44
|
+
fs.mkdirSync(d, { mode: 0o700 });
|
|
45
|
+
st = fs.lstatSync(d);
|
|
46
|
+
}
|
|
47
|
+
if (!st.isDirectory() || st.isSymbolicLink())
|
|
48
|
+
return false;
|
|
49
|
+
if (typeof process.getuid === 'function') {
|
|
50
|
+
if (st.uid !== process.getuid())
|
|
51
|
+
return false;
|
|
52
|
+
// Ours but open to the group or the world: tighten it. If that fails, do not trust it.
|
|
53
|
+
if ((st.mode & 0o077) !== 0)
|
|
54
|
+
fs.chmodSync(d, 0o700);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The directory, created private, or null when anything BELOW the state home is not ours and
|
|
64
|
+
* private: `align-cli` and `backfill` are each checked with lstat before anything is created
|
|
65
|
+
* inside them, so a symlink planted at either is refused instead of written through. (The state
|
|
66
|
+
* home itself is the user's own choice and may legitimately sit behind links, as /var does on macOS.)
|
|
67
|
+
*/
|
|
68
|
+
export function backfillDir() {
|
|
69
|
+
try {
|
|
70
|
+
const base = alignStateDir();
|
|
71
|
+
if (base === null)
|
|
72
|
+
return null;
|
|
73
|
+
const dir = path.join(base, 'backfill');
|
|
74
|
+
return ensureOwnPrivateDir(dir) ? dir : null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** `<state home>/align-cli`, created private and checked with lstat (L5: the sync lock and the
|
|
81
|
+
* launch summary live beside `backfill/`, and share its refusal of a planted link), or null. */
|
|
82
|
+
export function alignStateDir() {
|
|
83
|
+
try {
|
|
84
|
+
const home = stateHome();
|
|
85
|
+
fs.mkdirSync(home, { recursive: true });
|
|
86
|
+
const base = path.join(home, 'align-cli');
|
|
87
|
+
return ensureOwnPrivateDir(base) ? base : null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function statusPath(dir, source) {
|
|
94
|
+
return path.join(dir, `${source}.json`);
|
|
95
|
+
}
|
|
96
|
+
export function readStatus(file) {
|
|
97
|
+
try {
|
|
98
|
+
const text = readRegularFile(file, 65_536);
|
|
99
|
+
if (text === undefined)
|
|
100
|
+
return null;
|
|
101
|
+
const raw = JSON.parse(text);
|
|
102
|
+
if (typeof raw.source !== 'string' || !Number.isInteger(raw.pid) || typeof raw.started_at !== 'string')
|
|
103
|
+
return null;
|
|
104
|
+
if (raw.state !== 'running' && raw.state !== 'done' && raw.state !== 'failed')
|
|
105
|
+
return null;
|
|
106
|
+
return raw;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Atomic (write a sibling, rename over): a reader never sees half a file. */
|
|
113
|
+
export function writeStatus(file, status) {
|
|
114
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
115
|
+
fs.writeFileSync(tmp, JSON.stringify(status), { mode: 0o600 });
|
|
116
|
+
fs.renameSync(tmp, file);
|
|
117
|
+
}
|
|
118
|
+
/** Is this process alive? EPERM means it exists and is not ours, which is alive. */
|
|
119
|
+
export function pidAlive(pid) {
|
|
120
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
121
|
+
return false;
|
|
122
|
+
try {
|
|
123
|
+
process.kill(pid, 0);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
return e.code === 'EPERM';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** A "running" file older than this is a leftover (SIGKILL, OOM, reboot), whatever its pid says now:
|
|
131
|
+
* pids are reused, and a backfill that has run for a day is not running. */
|
|
132
|
+
const STALE_RUNNING_MS = 24 * 3_600_000;
|
|
133
|
+
export function liveBackfills(dir, alive = pidAlive) {
|
|
134
|
+
let names;
|
|
135
|
+
try {
|
|
136
|
+
names = fs.readdirSync(dir).filter((n) => n.endsWith('.json'));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
return names
|
|
142
|
+
.map((n) => readStatus(path.join(dir, n)))
|
|
143
|
+
.filter((s) => s !== null && s.state === 'running' && !isStale(s) && alive(s.pid));
|
|
144
|
+
}
|
|
145
|
+
function isStale(s) {
|
|
146
|
+
const started = Date.parse(s.started_at);
|
|
147
|
+
return Number.isNaN(started) || Date.now() - started > STALE_RUNNING_MS;
|
|
148
|
+
}
|
|
149
|
+
export function admit(live, source) {
|
|
150
|
+
const same = live.filter((s) => s.source === source);
|
|
151
|
+
if (same.length >= MAX_PER_SOURCE)
|
|
152
|
+
return { ok: false, reason: 'source', running: same };
|
|
153
|
+
if (live.length >= MAX_TOTAL)
|
|
154
|
+
return { ok: false, reason: 'total', running: live };
|
|
155
|
+
return { ok: true };
|
|
156
|
+
}
|
|
157
|
+
/** Sources whose slot THIS process has taken and not yet handed over to a status file. MCP does not
|
|
158
|
+
* queue requests, so five tool calls can be in flight at once; the check and the take happen in
|
|
159
|
+
* one synchronous stretch, before any await, or all five pass. */
|
|
160
|
+
const reservedHere = new Set();
|
|
161
|
+
/** A placeholder older than this, or whose process is gone, is a leftover. */
|
|
162
|
+
const LOCK_FRESH_MS = 60_000;
|
|
163
|
+
function lockHolderActive(file, alive) {
|
|
164
|
+
try {
|
|
165
|
+
const raw = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
166
|
+
return typeof raw.pid === 'number' && typeof raw.at === 'number' && Date.now() - raw.at < LOCK_FRESH_MS && alive(raw.pid);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Take a slot for `source`, SYNCHRONOUSLY (no await anywhere in here). Counts what is running
|
|
174
|
+
* (status files), what this process has reserved, and what other server processes have reserved
|
|
175
|
+
* (placeholder `<source>.lock` files made with O_EXCL, so two processes cannot both pass). The
|
|
176
|
+
* caller releases it once the child is confirmed (its status file then holds the slot) or has
|
|
177
|
+
* failed to start.
|
|
178
|
+
*/
|
|
179
|
+
export function reserveSlot(dir, source, alive = pidAlive) {
|
|
180
|
+
const lock = path.join(dir, `${source}.lock`);
|
|
181
|
+
const held = new Map();
|
|
182
|
+
for (const s of liveBackfills(dir, alive))
|
|
183
|
+
held.set(s.source, s);
|
|
184
|
+
for (const r of reservedHere)
|
|
185
|
+
held.set(r, held.get(r) ?? { source: r, pid: process.pid, started_at: new Date().toISOString(), state: 'running' });
|
|
186
|
+
try {
|
|
187
|
+
for (const n of fs.readdirSync(dir)) {
|
|
188
|
+
if (!n.endsWith('.lock'))
|
|
189
|
+
continue;
|
|
190
|
+
const src = n.slice(0, -'.lock'.length);
|
|
191
|
+
if (lockHolderActive(path.join(dir, n), alive))
|
|
192
|
+
held.set(src, held.get(src) ?? { source: src, pid: 0, started_at: new Date().toISOString(), state: 'running' });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch { /* an unreadable directory counts as empty; the exclusive create below still decides */ }
|
|
196
|
+
const admission = admit([...held.values()], source);
|
|
197
|
+
if (!admission.ok)
|
|
198
|
+
return admission;
|
|
199
|
+
const take = () => {
|
|
200
|
+
try {
|
|
201
|
+
fs.writeFileSync(lock, JSON.stringify({ pid: process.pid, at: Date.now() }), { flag: 'wx', mode: 0o600 });
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
if (e.code !== 'EEXIST')
|
|
206
|
+
return true; // cannot make the file: the in-process set still holds
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
if (!take()) {
|
|
211
|
+
if (lockHolderActive(lock, alive))
|
|
212
|
+
return { ok: false, reason: 'source', running: [held.get(source) ?? { source, pid: 0, started_at: new Date().toISOString(), state: 'running' }] };
|
|
213
|
+
try {
|
|
214
|
+
fs.unlinkSync(lock);
|
|
215
|
+
}
|
|
216
|
+
catch { /* raced with another process's cleanup */ }
|
|
217
|
+
if (!take())
|
|
218
|
+
return { ok: false, reason: 'source', running: [] };
|
|
219
|
+
}
|
|
220
|
+
reservedHere.add(source);
|
|
221
|
+
return {
|
|
222
|
+
ok: true,
|
|
223
|
+
release: () => {
|
|
224
|
+
reservedHere.delete(source);
|
|
225
|
+
try {
|
|
226
|
+
fs.unlinkSync(lock);
|
|
227
|
+
}
|
|
228
|
+
catch { /* already gone */ }
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* How to start `align <argv>` as a child. An npm install runs `node <entry> ...`. A compiled
|
|
234
|
+
* binary (`bun build --compile`) has a bunfs path in argv[1], which is not a user argument, so
|
|
235
|
+
* the child is the executable with the arguments directly (alignDistribution() is decided at
|
|
236
|
+
* build time, not sniffed).
|
|
237
|
+
*/
|
|
238
|
+
export function backfillChildCommand(argv, o = {}) {
|
|
239
|
+
const dist = o.dist ?? alignDistribution();
|
|
240
|
+
const execPath = o.execPath ?? process.execPath;
|
|
241
|
+
if (dist === 'binary')
|
|
242
|
+
return { command: execPath, args: argv };
|
|
243
|
+
const argv1 = 'argv1' in o ? o.argv1 : process.argv[1];
|
|
244
|
+
return { command: execPath, args: [argv1 ?? 'align', ...argv] };
|
|
245
|
+
}
|
|
246
|
+
function withoutStatusEnv(env) {
|
|
247
|
+
const { [BACKFILL_STATUS_ENV]: _drop, ...rest } = env;
|
|
248
|
+
return rest;
|
|
249
|
+
}
|
|
250
|
+
export const STARTED_BY_AGENT_ENV = 'ALIGN_STARTED_BY';
|
|
251
|
+
/** The environment a child gets: marked as an agent's only when an agent's tool call started it. */
|
|
252
|
+
export function stampCaller(env, caller) {
|
|
253
|
+
const { [STARTED_BY_AGENT_ENV]: _drop, ...rest } = env;
|
|
254
|
+
return caller === 'mcp' ? { ...rest, [STARTED_BY_AGENT_ENV]: 'mcp' } : rest;
|
|
255
|
+
}
|
|
256
|
+
export function startBackfillChild(source, argv, file, cmd = backfillChildCommand(argv), caller = 'mcp',
|
|
257
|
+
/** The environment the child inherits. Defaults to this process's own; the sync launch hook passes a reduced one. */
|
|
258
|
+
baseEnv = process.env,
|
|
259
|
+
/** Where the child runs (default: here). The sync launcher passes the home folder, so a folder never picks scope for an unattended run. */
|
|
260
|
+
cwd) {
|
|
261
|
+
const { command, args } = cmd;
|
|
262
|
+
return new Promise((resolve) => {
|
|
263
|
+
let settled = false;
|
|
264
|
+
const done = (r) => { if (!settled) {
|
|
265
|
+
settled = true;
|
|
266
|
+
resolve(r);
|
|
267
|
+
} };
|
|
268
|
+
let child;
|
|
269
|
+
try {
|
|
270
|
+
child = spawn(command, args, {
|
|
271
|
+
detached: true,
|
|
272
|
+
stdio: 'ignore',
|
|
273
|
+
windowsHide: true,
|
|
274
|
+
// L5: a sync child has no status file (the sync lock and source_sync record it), so it must
|
|
275
|
+
// not inherit one from this process either.
|
|
276
|
+
...(cwd !== undefined ? { cwd } : {}),
|
|
277
|
+
env: stampCaller(file === undefined ? withoutStatusEnv(baseEnv) : { ...baseEnv, [BACKFILL_STATUS_ENV]: file }, caller),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return done({ ok: false });
|
|
282
|
+
}
|
|
283
|
+
const confirm = () => {
|
|
284
|
+
const pid = child.pid;
|
|
285
|
+
if (pid === undefined)
|
|
286
|
+
return done({ ok: false });
|
|
287
|
+
try {
|
|
288
|
+
if (file !== undefined)
|
|
289
|
+
writeStatus(file, { source, pid, started_at: new Date().toISOString(), state: 'running' });
|
|
290
|
+
}
|
|
291
|
+
catch { /* the child still runs; only the cap loses sight of it */ }
|
|
292
|
+
child.unref();
|
|
293
|
+
done({ ok: true, pid });
|
|
294
|
+
};
|
|
295
|
+
child.on('error', () => done({ ok: false }));
|
|
296
|
+
child.on('spawn', confirm);
|
|
297
|
+
setTimeout(() => { if (!settled)
|
|
298
|
+
(child.pid !== undefined ? confirm : () => done({ ok: false }))(); }, START_CONFIRM_MS).unref();
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
const tracks = new Map();
|
|
302
|
+
/**
|
|
303
|
+
* The child's side. Reads the status path from the environment, but only trusts one inside the
|
|
304
|
+
* backfill directory: the variable is not a way to make this process overwrite another file.
|
|
305
|
+
* Writes `running` now and the final state at exit (the exit code, and the last line it noted).
|
|
306
|
+
* Called at the very top of the entry point (startup-backfill-track.ts) so a run that dies before
|
|
307
|
+
* any command code - a bad flag, a parse error - still records that it failed. Memoised per file.
|
|
308
|
+
*/
|
|
309
|
+
export function trackChildFromEnv(env = process.env) {
|
|
310
|
+
const file = env[BACKFILL_STATUS_ENV];
|
|
311
|
+
const dir = backfillDir();
|
|
312
|
+
if (!file || !dir)
|
|
313
|
+
return null;
|
|
314
|
+
if (path.resolve(path.dirname(file)) !== path.resolve(dir) || !file.endsWith('.json'))
|
|
315
|
+
return null;
|
|
316
|
+
const known = tracks.get(file);
|
|
317
|
+
if (known)
|
|
318
|
+
return known;
|
|
319
|
+
const source = path.basename(file, '.json');
|
|
320
|
+
const started_at = readStatus(file)?.started_at ?? new Date().toISOString();
|
|
321
|
+
let last;
|
|
322
|
+
try {
|
|
323
|
+
writeStatus(file, { source, pid: process.pid, started_at, state: 'running' });
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const finish = (code) => {
|
|
329
|
+
try {
|
|
330
|
+
writeStatus(file, {
|
|
331
|
+
source, pid: process.pid, started_at, state: code === 0 ? 'done' : 'failed',
|
|
332
|
+
finished_at: new Date().toISOString(), exit_code: code, ...(last !== undefined ? { last_line: last.slice(0, 200) } : {}),
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
catch { /* nothing to report to */ }
|
|
336
|
+
};
|
|
337
|
+
process.on('exit', (code) => finish(code));
|
|
338
|
+
const track = { note: (line) => { last = line; }, finish };
|
|
339
|
+
tracks.set(file, track);
|
|
340
|
+
return track;
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=backfill-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-state.js","sourceRoot":"","sources":["../../src/lib/backfill-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,yGAAyG;AACzG,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAY7B,gHAAgH;AAChH,MAAM,UAAU,YAAY,CAAC,GAAuC,EAAE,IAAY,EAAE,QAAgB;IAClG,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,0IAA0I;AAC1I,MAAM,UAAU,iBAAiB,CAAC,GAAuC,EAAE,IAAY,EAAE,QAAgB;IACvG,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;AACnE,CAAC;AAED,kGAAkG;AAClG,SAAS,mBAAmB,CAAC,CAAS;IACpC,IAAI,CAAC;QACH,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC9C,uFAAuF;YACvF,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;iGACiG;AACjG,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAc;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpH,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3F,OAAO,GAAqB,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAsB;IAC9D,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAQ,CAAuB,CAAC,IAAI,KAAK,OAAO,CAAC;IACnD,CAAC;AACH,CAAC;AAED;6EAC6E;AAC7E,MAAM,gBAAgB,GAAG,EAAE,GAAG,SAAS,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,QAAkC,QAAQ;IACnF,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5F,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;SACzC,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,OAAO,CAAC,CAAiB;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAsB,EACtB,MAAc;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,MAAM,IAAI,cAAc;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzF,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;mEAEmE;AACnE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AACvC,8EAA8E;AAC9E,MAAM,aAAa,GAAG,MAAM,CAAC;AAQ7B,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAA+B;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkC,CAAC;QACvF,OAAO,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAc,EAAE,QAAkC,QAAQ;IACjG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAClJ,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClK,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,uFAAuF,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,GAAY,EAAE;QACzB,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1G,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAAuB,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,CAAC,uDAAuD;YACpH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACZ,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACrL,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,0CAA0C,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnE,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAc,EACd,IAAgF,EAAE;IAElF,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAChD,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuC;IAC/D,MAAM,EAAE,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAaD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,oGAAoG;AACpG,MAAM,UAAU,WAAW,CAAC,GAAuC,EAAE,MAAmB;IACtF,MAAM,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACvD,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,IAAc,EACd,IAAwB,EACxB,MAA2C,oBAAoB,CAAC,IAAI,CAAC,EACrE,SAAsB,KAAK;AAC3B,qHAAqH;AACrH,UAA8C,OAAO,CAAC,GAAG;AACzD,2IAA2I;AAC3I,GAAY;IAEZ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,CAAgC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC;QACrG,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;gBAC3B,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,IAAI;gBACjB,4FAA4F;gBAC5F,4CAA4C;gBAC5C,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,GAAG,EAAE,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC;aACvH,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACtB,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,IAAI,IAAI,KAAK,SAAS;oBAAE,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACrH,CAAC;YAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;YACtE,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3B,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO;YAAE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;IACnI,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnG,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5E,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;QACpC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,EAAE;gBAChB,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gBAC3E,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzH,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAe,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACvE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy rows into a `*_backup` table by column NAME, never by position.
|
|
3
|
+
*
|
|
4
|
+
* The backup tables (`decisions_merged_backup`, `decisions_purged_backup`, ...) are created with
|
|
5
|
+
* `CREATE TABLE ... AS SELECT * ... WHERE 0`, so they carry the columns their source had on the day
|
|
6
|
+
* of the migration. A later migration that adds a column to `decisions` would make a positional
|
|
7
|
+
* `INSERT INTO backup SELECT * FROM decisions` fail ("table has N columns but M values were
|
|
8
|
+
* supplied") on every purge and on EVERY ingest that folds a twin. Naming the columns keeps both
|
|
9
|
+
* working; the columns the backup lacks are then the only thing not backed up, and
|
|
10
|
+
* backup-copy.test.ts fails the build when that set is not empty, so the migration that adds the
|
|
11
|
+
* column must add it to the backup table too.
|
|
12
|
+
*/
|
|
13
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
14
|
+
/** The columns both tables have, in the backup table's order. */
|
|
15
|
+
export declare function sharedColumns(db: DatabaseSync, source: string, backup: string): string[];
|
|
16
|
+
export declare function copyRowsToBackup(db: DatabaseSync, source: string, backup: string, keyColumn: string, key: string): void;
|
|
17
|
+
//# sourceMappingURL=backup-copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-copy.d.ts","sourceRoot":"","sources":["../../src/lib/backup-copy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGxF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGvH"}
|