@aligndottech/cli 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +4 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +18 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +24 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +24 -5
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/docs.js +2 -2
- package/dist/commands/import/git.d.ts.map +1 -1
- package/dist/commands/import/git.js +15 -5
- package/dist/commands/import/git.js.map +1 -1
- package/dist/commands/import/github.d.ts.map +1 -1
- package/dist/commands/import/github.js +34 -7
- package/dist/commands/import/github.js.map +1 -1
- package/dist/commands/import/gitlab.d.ts.map +1 -1
- package/dist/commands/import/gitlab.js +10 -5
- package/dist/commands/import/gitlab.js.map +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +10 -5
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/import/linear.d.ts.map +1 -1
- package/dist/commands/import/linear.js +10 -5
- package/dist/commands/import/linear.js.map +1 -1
- package/dist/commands/import/notion.d.ts.map +1 -1
- package/dist/commands/import/notion.js +10 -5
- package/dist/commands/import/notion.js.map +1 -1
- package/dist/commands/import/sessions.js +2 -2
- package/dist/commands/import/slack.d.ts.map +1 -1
- package/dist/commands/import/slack.js +12 -7
- package/dist/commands/import/slack.js.map +1 -1
- package/dist/commands/import/teams.d.ts.map +1 -1
- package/dist/commands/import/teams.js +10 -5
- package/dist/commands/import/teams.js.map +1 -1
- package/dist/commands/import/zoom.d.ts.map +1 -1
- package/dist/commands/import/zoom.js +10 -5
- package/dist/commands/import/zoom.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +43 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +76 -4
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/mark.d.ts +37 -0
- package/dist/commands/mark.d.ts.map +1 -0
- package/dist/commands/mark.js +105 -0
- package/dist/commands/mark.js.map +1 -0
- package/dist/commands/mcp.d.ts +141 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +72 -14
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +8 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.d.ts +39 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +65 -50
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/share.d.ts +7 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/sync.d.ts +55 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +278 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/telemetry.d.ts +3 -3
- package/dist/commands/telemetry.js +6 -6
- package/dist/commands/telemetry.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +6 -1
- package/dist/commands/why.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/backfill-state.d.ts +116 -0
- package/dist/lib/backfill-state.d.ts.map +1 -0
- package/dist/lib/backfill-state.js +342 -0
- package/dist/lib/backfill-state.js.map +1 -0
- package/dist/lib/backup-copy.d.ts +17 -0
- package/dist/lib/backup-copy.d.ts.map +1 -0
- package/dist/lib/backup-copy.js +13 -0
- package/dist/lib/backup-copy.js.map +1 -0
- package/dist/lib/capture-report.d.ts +22 -18
- package/dist/lib/capture-report.d.ts.map +1 -1
- package/dist/lib/capture-report.js +64 -2
- package/dist/lib/capture-report.js.map +1 -1
- package/dist/lib/config.d.ts +31 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +139 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/confirm-timeout.d.ts +8 -0
- package/dist/lib/confirm-timeout.d.ts.map +1 -0
- package/dist/lib/confirm-timeout.js +18 -0
- package/dist/lib/confirm-timeout.js.map +1 -0
- package/dist/lib/curation/check-marks.d.ts +48 -0
- package/dist/lib/curation/check-marks.d.ts.map +1 -0
- package/dist/lib/curation/check-marks.js +81 -0
- package/dist/lib/curation/check-marks.js.map +1 -0
- package/dist/lib/curation/guardrail.d.ts +39 -0
- package/dist/lib/curation/guardrail.d.ts.map +1 -0
- package/dist/lib/curation/guardrail.js +93 -0
- package/dist/lib/curation/guardrail.js.map +1 -0
- package/dist/lib/curation/judge.d.ts +3 -0
- package/dist/lib/curation/judge.d.ts.map +1 -0
- package/dist/lib/curation/judge.js +9 -0
- package/dist/lib/curation/judge.js.map +1 -0
- package/dist/lib/curation/judgements-db.d.ts +96 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -0
- package/dist/lib/curation/judgements-db.js +200 -0
- package/dist/lib/curation/judgements-db.js.map +1 -0
- package/dist/lib/curation/last-check.d.ts +32 -0
- package/dist/lib/curation/last-check.d.ts.map +1 -0
- package/dist/lib/curation/last-check.js +81 -0
- package/dist/lib/curation/last-check.js.map +1 -0
- package/dist/lib/curation/mark.d.ts +76 -0
- package/dist/lib/curation/mark.d.ts.map +1 -0
- package/dist/lib/curation/mark.js +359 -0
- package/dist/lib/curation/mark.js.map +1 -0
- package/dist/lib/curation/text.d.ts +6 -0
- package/dist/lib/curation/text.d.ts.map +1 -0
- package/dist/lib/curation/text.js +35 -0
- package/dist/lib/curation/text.js.map +1 -0
- package/dist/lib/fetchers/capture.d.ts +49 -2
- package/dist/lib/fetchers/capture.d.ts.map +1 -1
- package/dist/lib/fetchers/capture.js +7 -1
- package/dist/lib/fetchers/capture.js.map +1 -1
- package/dist/lib/fetchers/confluence.d.ts +2 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts +1 -0
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +3 -1
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts +44 -5
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +122 -5
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/gitlab.d.ts +2 -2
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
- package/dist/lib/fetchers/gitlab.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +2 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts +2 -2
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts +2 -2
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts +2 -3
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts +2 -2
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts +2 -2
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +34 -0
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +19 -1
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/github-text.d.ts +3 -0
- package/dist/lib/github-text.d.ts.map +1 -0
- package/dist/lib/github-text.js +18 -0
- package/dist/lib/github-text.js.map +1 -0
- package/dist/lib/hook-context.d.ts +10 -0
- package/dist/lib/hook-context.d.ts.map +1 -1
- package/dist/lib/hook-context.js +14 -0
- package/dist/lib/hook-context.js.map +1 -1
- package/dist/lib/import-defaults.d.ts +39 -23
- package/dist/lib/import-defaults.d.ts.map +1 -1
- package/dist/lib/import-defaults.js +28 -26
- package/dist/lib/import-defaults.js.map +1 -1
- package/dist/lib/launch/adapters/aider.d.ts +17 -0
- package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
- package/dist/lib/launch/adapters/aider.js +30 -0
- package/dist/lib/launch/adapters/aider.js.map +1 -0
- package/dist/lib/launch/adapters/auggie.d.ts +18 -0
- package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
- package/dist/lib/launch/adapters/auggie.js +34 -0
- package/dist/lib/launch/adapters/auggie.js.map +1 -0
- package/dist/lib/launch/adapters/cline.d.ts +10 -0
- package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
- package/dist/lib/launch/adapters/cline.js +41 -0
- package/dist/lib/launch/adapters/cline.js.map +1 -0
- package/dist/lib/launch/adapters/continue.d.ts +22 -0
- package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
- package/dist/lib/launch/adapters/continue.js +46 -0
- package/dist/lib/launch/adapters/continue.js.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
- package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
- package/dist/lib/launch/adapters/gemini-cli.js +38 -53
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
- package/dist/lib/launch/adapters/goose.d.ts +20 -0
- package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
- package/dist/lib/launch/adapters/goose.js +47 -0
- package/dist/lib/launch/adapters/goose.js.map +1 -0
- package/dist/lib/launch/adapters/notes.d.ts +7 -0
- package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
- package/dist/lib/launch/adapters/notes.js +5 -0
- package/dist/lib/launch/adapters/notes.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +2 -0
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +3 -1
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/auggie-state.d.ts +25 -0
- package/dist/lib/launch/auggie-state.d.ts.map +1 -0
- package/dist/lib/launch/auggie-state.js +74 -0
- package/dist/lib/launch/auggie-state.js.map +1 -0
- package/dist/lib/launch/cline-state.d.ts +32 -0
- package/dist/lib/launch/cline-state.d.ts.map +1 -0
- package/dist/lib/launch/cline-state.js +108 -0
- package/dist/lib/launch/cline-state.js.map +1 -0
- package/dist/lib/launch/config-writes.d.ts +4 -0
- package/dist/lib/launch/config-writes.d.ts.map +1 -1
- package/dist/lib/launch/config-writes.js +8 -3
- package/dist/lib/launch/config-writes.js.map +1 -1
- package/dist/lib/launch/continue-state.d.ts +41 -0
- package/dist/lib/launch/continue-state.d.ts.map +1 -0
- package/dist/lib/launch/continue-state.js +142 -0
- package/dist/lib/launch/continue-state.js.map +1 -0
- package/dist/lib/launch/detect.d.ts.map +1 -1
- package/dist/lib/launch/detect.js +3 -1
- package/dist/lib/launch/detect.js.map +1 -1
- package/dist/lib/launch/gemini-state.d.ts +26 -20
- package/dist/lib/launch/gemini-state.d.ts.map +1 -1
- package/dist/lib/launch/gemini-state.js +95 -37
- package/dist/lib/launch/gemini-state.js.map +1 -1
- package/dist/lib/launch/gemini-system-file.d.ts +17 -0
- package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
- package/dist/lib/launch/gemini-system-file.js +55 -0
- package/dist/lib/launch/gemini-system-file.js.map +1 -0
- package/dist/lib/launch/gemini-trust.d.ts +3 -1
- package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
- package/dist/lib/launch/gemini-trust.js +10 -3
- package/dist/lib/launch/gemini-trust.js.map +1 -1
- package/dist/lib/launch/goose-state.d.ts +53 -0
- package/dist/lib/launch/goose-state.d.ts.map +1 -0
- package/dist/lib/launch/goose-state.js +137 -0
- package/dist/lib/launch/goose-state.js.map +1 -0
- package/dist/lib/launch/launch-files.d.ts.map +1 -1
- package/dist/lib/launch/launch-files.js +3 -2
- package/dist/lib/launch/launch-files.js.map +1 -1
- package/dist/lib/launch/launch.d.ts +17 -2
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +36 -3
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/mcp-child-env.d.ts +30 -0
- package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
- package/dist/lib/launch/mcp-child-env.js +151 -0
- package/dist/lib/launch/mcp-child-env.js.map +1 -0
- package/dist/lib/launch/pick-agent.d.ts.map +1 -1
- package/dist/lib/launch/pick-agent.js +4 -4
- package/dist/lib/launch/pick-agent.js.map +1 -1
- package/dist/lib/launch/picker-options.d.ts.map +1 -1
- package/dist/lib/launch/picker-options.js +7 -2
- package/dist/lib/launch/picker-options.js.map +1 -1
- package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
- package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/aider.js +13 -0
- package/dist/lib/launch/registry/agents/aider.js.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.js +11 -0
- package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
- package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
- package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/cline.js +19 -0
- package/dist/lib/launch/registry/agents/cline.js.map +1 -0
- package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
- package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/continue.js +20 -0
- package/dist/lib/launch/registry/agents/continue.js.map +1 -0
- package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
- package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
- package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
- package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/goose.js +20 -0
- package/dist/lib/launch/registry/agents/goose.js.map +1 -0
- package/dist/lib/launch/registry/index.d.ts +1 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +7 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +12 -1
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +22 -2
- package/dist/lib/launch/strict-entry.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.js +80 -2
- package/dist/lib/launch/strict-entry.js.map +1 -1
- package/dist/lib/launch/yaml-scan.d.ts +59 -0
- package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
- package/dist/lib/launch/yaml-scan.js +275 -0
- package/dist/lib/launch/yaml-scan.js.map +1 -0
- package/dist/lib/local-db-epoch.d.ts +4 -0
- package/dist/lib/local-db-epoch.d.ts.map +1 -0
- package/dist/lib/local-db-epoch.js +19 -0
- package/dist/lib/local-db-epoch.js.map +1 -0
- package/dist/lib/local-db-migrate.d.ts +85 -0
- package/dist/lib/local-db-migrate.d.ts.map +1 -0
- package/dist/lib/local-db-migrate.js +484 -0
- package/dist/lib/local-db-migrate.js.map +1 -0
- package/dist/lib/local-db-v10.d.ts +28 -0
- package/dist/lib/local-db-v10.d.ts.map +1 -0
- package/dist/lib/local-db-v10.js +49 -0
- package/dist/lib/local-db-v10.js.map +1 -0
- package/dist/lib/local-db-v11.d.ts +24 -0
- package/dist/lib/local-db-v11.d.ts.map +1 -0
- package/dist/lib/local-db-v11.js +25 -0
- package/dist/lib/local-db-v11.js.map +1 -0
- package/dist/lib/local-db-v7.d.ts +30 -0
- package/dist/lib/local-db-v7.d.ts.map +1 -0
- package/dist/lib/local-db-v7.js +285 -0
- package/dist/lib/local-db-v7.js.map +1 -0
- package/dist/lib/local-db-v8.d.ts +22 -0
- package/dist/lib/local-db-v8.d.ts.map +1 -0
- package/dist/lib/local-db-v8.js +33 -0
- package/dist/lib/local-db-v8.js.map +1 -0
- package/dist/lib/local-db-v9.d.ts +10 -0
- package/dist/lib/local-db-v9.d.ts.map +1 -0
- package/dist/lib/local-db-v9.js +8 -0
- package/dist/lib/local-db-v9.js.map +1 -0
- package/dist/lib/local-db.d.ts +61 -11
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +186 -371
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-embeddings.d.ts.map +1 -1
- package/dist/lib/local-embeddings.js +2 -2
- package/dist/lib/local-embeddings.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +30 -87
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +182 -171
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +129 -0
- package/dist/lib/local-ingest.d.ts.map +1 -0
- package/dist/lib/local-ingest.js +81 -0
- package/dist/lib/local-ingest.js.map +1 -0
- package/dist/lib/local-link-pass.d.ts +15 -0
- package/dist/lib/local-link-pass.d.ts.map +1 -0
- package/dist/lib/local-link-pass.js +61 -0
- package/dist/lib/local-link-pass.js.map +1 -0
- package/dist/lib/local-mode.d.ts +4 -1
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +16 -1
- package/dist/lib/local-mode.js.map +1 -1
- package/dist/lib/local-provenance.d.ts +14 -0
- package/dist/lib/local-provenance.d.ts.map +1 -0
- package/dist/lib/local-provenance.js +14 -0
- package/dist/lib/local-provenance.js.map +1 -0
- package/dist/lib/local-thresholds.d.ts +70 -0
- package/dist/lib/local-thresholds.d.ts.map +1 -0
- package/dist/lib/local-thresholds.js +79 -0
- package/dist/lib/local-thresholds.js.map +1 -0
- package/dist/lib/mcp/mark-tool.d.ts +27 -0
- package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
- package/dist/lib/mcp/mark-tool.js +103 -0
- package/dist/lib/mcp/mark-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +46 -0
- package/dist/lib/mcp/share-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-tool.js +68 -0
- package/dist/lib/mcp/share-tool.js.map +1 -0
- package/dist/lib/mcp/tool-rules.d.ts +30 -0
- package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
- package/dist/lib/mcp/tool-rules.js +84 -0
- package/dist/lib/mcp/tool-rules.js.map +1 -0
- package/dist/lib/mcp-backfill.d.ts +89 -0
- package/dist/lib/mcp-backfill.d.ts.map +1 -0
- package/dist/lib/mcp-backfill.js +194 -0
- package/dist/lib/mcp-backfill.js.map +1 -0
- package/dist/lib/mcp-scope.d.ts +90 -0
- package/dist/lib/mcp-scope.d.ts.map +1 -0
- package/dist/lib/mcp-scope.js +125 -0
- package/dist/lib/mcp-scope.js.map +1 -0
- package/dist/lib/mcp-sync.d.ts +64 -0
- package/dist/lib/mcp-sync.d.ts.map +1 -0
- package/dist/lib/mcp-sync.js +183 -0
- package/dist/lib/mcp-sync.js.map +1 -0
- package/dist/lib/personal-import.d.ts +7 -0
- package/dist/lib/personal-import.d.ts.map +1 -1
- package/dist/lib/personal-import.js +13 -1
- package/dist/lib/personal-import.js.map +1 -1
- package/dist/lib/safe-config-write.d.ts.map +1 -1
- package/dist/lib/safe-config-write.js +39 -2
- package/dist/lib/safe-config-write.js.map +1 -1
- package/dist/lib/scope-choices.d.ts +51 -0
- package/dist/lib/scope-choices.d.ts.map +1 -0
- package/dist/lib/scope-choices.js +193 -0
- package/dist/lib/scope-choices.js.map +1 -0
- package/dist/lib/scope-connect.d.ts +82 -0
- package/dist/lib/scope-connect.d.ts.map +1 -0
- package/dist/lib/scope-connect.js +258 -0
- package/dist/lib/scope-connect.js.map +1 -0
- package/dist/lib/scope-defaults.d.ts +3 -0
- package/dist/lib/scope-defaults.d.ts.map +1 -0
- package/dist/lib/scope-defaults.js +42 -0
- package/dist/lib/scope-defaults.js.map +1 -0
- package/dist/lib/scope-real.d.ts +223 -0
- package/dist/lib/scope-real.d.ts.map +1 -0
- package/dist/lib/scope-real.js +58 -0
- package/dist/lib/scope-real.js.map +1 -0
- package/dist/lib/scope-values.d.ts +76 -0
- package/dist/lib/scope-values.d.ts.map +1 -0
- package/dist/lib/scope-values.js +169 -0
- package/dist/lib/scope-values.js.map +1 -0
- package/dist/lib/scope.d.ts +161 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +323 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/share/command.d.ts +32 -0
- package/dist/lib/share/command.d.ts.map +1 -0
- package/dist/lib/share/command.js +136 -0
- package/dist/lib/share/command.js.map +1 -0
- package/dist/lib/share/ledger.d.ts +59 -0
- package/dist/lib/share/ledger.d.ts.map +1 -0
- package/dist/lib/share/ledger.js +135 -0
- package/dist/lib/share/ledger.js.map +1 -0
- package/dist/lib/share/payload.d.ts +92 -0
- package/dist/lib/share/payload.d.ts.map +1 -0
- package/dist/lib/share/payload.js +138 -0
- package/dist/lib/share/payload.js.map +1 -0
- package/dist/lib/share/pending.d.ts +48 -0
- package/dist/lib/share/pending.d.ts.map +1 -0
- package/dist/lib/share/pending.js +130 -0
- package/dist/lib/share/pending.js.map +1 -0
- package/dist/lib/share/preview.d.ts +18 -0
- package/dist/lib/share/preview.d.ts.map +1 -0
- package/dist/lib/share/preview.js +72 -0
- package/dist/lib/share/preview.js.map +1 -0
- package/dist/lib/share/run.d.ts +115 -0
- package/dist/lib/share/run.d.ts.map +1 -0
- package/dist/lib/share/run.js +261 -0
- package/dist/lib/share/run.js.map +1 -0
- package/dist/lib/share/salt.d.ts +2 -0
- package/dist/lib/share/salt.d.ts.map +1 -0
- package/dist/lib/share/salt.js +44 -0
- package/dist/lib/share/salt.js.map +1 -0
- package/dist/lib/share/secret-patterns.json +100 -0
- package/dist/lib/share/secret-scan.d.ts +19 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -0
- package/dist/lib/share/secret-scan.js +75 -0
- package/dist/lib/share/secret-scan.js.map +1 -0
- package/dist/lib/share/tty.d.ts +4 -0
- package/dist/lib/share/tty.d.ts.map +1 -0
- package/dist/lib/share/tty.js +57 -0
- package/dist/lib/share/tty.js.map +1 -0
- package/dist/lib/share/visible.d.ts +4 -0
- package/dist/lib/share/visible.d.ts.map +1 -0
- package/dist/lib/share/visible.js +30 -0
- package/dist/lib/share/visible.js.map +1 -0
- package/dist/lib/share/wire.d.ts +98 -0
- package/dist/lib/share/wire.d.ts.map +1 -0
- package/dist/lib/share/wire.js +43 -0
- package/dist/lib/share/wire.js.map +1 -0
- package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
- package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
- package/dist/lib/similarity/embedding-matrix.js +119 -0
- package/dist/lib/similarity/embedding-matrix.js.map +1 -0
- package/dist/lib/since-flag.d.ts +11 -0
- package/dist/lib/since-flag.d.ts.map +1 -0
- package/dist/lib/since-flag.js +24 -0
- package/dist/lib/since-flag.js.map +1 -0
- package/dist/lib/since.d.ts +59 -0
- package/dist/lib/since.d.ts.map +1 -0
- package/dist/lib/since.js +86 -0
- package/dist/lib/since.js.map +1 -0
- package/dist/lib/source-key.d.ts +13 -0
- package/dist/lib/source-key.d.ts.map +1 -0
- package/dist/lib/source-key.js +60 -0
- package/dist/lib/source-key.js.map +1 -0
- package/dist/lib/source-sync-state.d.ts +12 -0
- package/dist/lib/source-sync-state.d.ts.map +1 -0
- package/dist/lib/source-sync-state.js +43 -0
- package/dist/lib/source-sync-state.js.map +1 -0
- package/dist/lib/startup-backfill-track.d.ts +2 -0
- package/dist/lib/startup-backfill-track.d.ts.map +1 -0
- package/dist/lib/startup-backfill-track.js +6 -0
- package/dist/lib/startup-backfill-track.js.map +1 -0
- package/dist/lib/startup-xdg.d.ts +2 -0
- package/dist/lib/startup-xdg.d.ts.map +1 -0
- package/dist/lib/startup-xdg.js +9 -0
- package/dist/lib/startup-xdg.js.map +1 -0
- package/dist/lib/sync/after-connect.d.ts +2 -0
- package/dist/lib/sync/after-connect.d.ts.map +1 -0
- package/dist/lib/sync/after-connect.js +18 -0
- package/dist/lib/sync/after-connect.js.map +1 -0
- package/dist/lib/sync/bg-claim.d.ts +14 -0
- package/dist/lib/sync/bg-claim.d.ts.map +1 -0
- package/dist/lib/sync/bg-claim.js +97 -0
- package/dist/lib/sync/bg-claim.js.map +1 -0
- package/dist/lib/sync/blocked.d.ts +8 -0
- package/dist/lib/sync/blocked.d.ts.map +1 -0
- package/dist/lib/sync/blocked.js +44 -0
- package/dist/lib/sync/blocked.js.map +1 -0
- package/dist/lib/sync/classify.d.ts +34 -0
- package/dist/lib/sync/classify.d.ts.map +1 -0
- package/dist/lib/sync/classify.js +91 -0
- package/dist/lib/sync/classify.js.map +1 -0
- package/dist/lib/sync/drain.d.ts +16 -0
- package/dist/lib/sync/drain.d.ts.map +1 -0
- package/dist/lib/sync/drain.js +33 -0
- package/dist/lib/sync/drain.js.map +1 -0
- package/dist/lib/sync/forget.d.ts +12 -0
- package/dist/lib/sync/forget.d.ts.map +1 -0
- package/dist/lib/sync/forget.js +32 -0
- package/dist/lib/sync/forget.js.map +1 -0
- package/dist/lib/sync/launch-hook.d.ts +42 -0
- package/dist/lib/sync/launch-hook.d.ts.map +1 -0
- package/dist/lib/sync/launch-hook.js +117 -0
- package/dist/lib/sync/launch-hook.js.map +1 -0
- package/dist/lib/sync/lock.d.ts +35 -0
- package/dist/lib/sync/lock.d.ts.map +1 -0
- package/dist/lib/sync/lock.js +175 -0
- package/dist/lib/sync/lock.js.map +1 -0
- package/dist/lib/sync/purge.d.ts +38 -0
- package/dist/lib/sync/purge.d.ts.map +1 -0
- package/dist/lib/sync/purge.js +61 -0
- package/dist/lib/sync/purge.js.map +1 -0
- package/dist/lib/sync/real-env.d.ts +208 -0
- package/dist/lib/sync/real-env.d.ts.map +1 -0
- package/dist/lib/sync/real-env.js +47 -0
- package/dist/lib/sync/real-env.js.map +1 -0
- package/dist/lib/sync/relink.d.ts +14 -0
- package/dist/lib/sync/relink.d.ts.map +1 -0
- package/dist/lib/sync/relink.js +36 -0
- package/dist/lib/sync/relink.js.map +1 -0
- package/dist/lib/sync/report.d.ts +3 -0
- package/dist/lib/sync/report.d.ts.map +1 -0
- package/dist/lib/sync/report.js +54 -0
- package/dist/lib/sync/report.js.map +1 -0
- package/dist/lib/sync/run-all.d.ts +23 -0
- package/dist/lib/sync/run-all.d.ts.map +1 -0
- package/dist/lib/sync/run-all.js +30 -0
- package/dist/lib/sync/run-all.js.map +1 -0
- package/dist/lib/sync/run-source.d.ts +73 -0
- package/dist/lib/sync/run-source.d.ts.map +1 -0
- package/dist/lib/sync/run-source.js +262 -0
- package/dist/lib/sync/run-source.js.map +1 -0
- package/dist/lib/sync/safe-read.d.ts +4 -0
- package/dist/lib/sync/safe-read.d.ts.map +1 -0
- package/dist/lib/sync/safe-read.js +40 -0
- package/dist/lib/sync/safe-read.js.map +1 -0
- package/dist/lib/sync/should-background-sync.d.ts +31 -0
- package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
- package/dist/lib/sync/should-background-sync.js +69 -0
- package/dist/lib/sync/should-background-sync.js.map +1 -0
- package/dist/lib/sync/source-ids.d.ts +10 -0
- package/dist/lib/sync/source-ids.d.ts.map +1 -0
- package/dist/lib/sync/source-ids.js +9 -0
- package/dist/lib/sync/source-ids.js.map +1 -0
- package/dist/lib/sync/sources.d.ts +33 -0
- package/dist/lib/sync/sources.d.ts.map +1 -0
- package/dist/lib/sync/sources.js +37 -0
- package/dist/lib/sync/sources.js.map +1 -0
- package/dist/lib/sync/spawn-background.d.ts +27 -0
- package/dist/lib/sync/spawn-background.d.ts.map +1 -0
- package/dist/lib/sync/spawn-background.js +66 -0
- package/dist/lib/sync/spawn-background.js.map +1 -0
- package/dist/lib/sync/status.d.ts +57 -0
- package/dist/lib/sync/status.d.ts.map +1 -0
- package/dist/lib/sync/status.js +166 -0
- package/dist/lib/sync/status.js.map +1 -0
- package/dist/lib/sync/summary-read.d.ts +19 -0
- package/dist/lib/sync/summary-read.d.ts.map +1 -0
- package/dist/lib/sync/summary-read.js +39 -0
- package/dist/lib/sync/summary-read.js.map +1 -0
- package/dist/lib/sync/summary.d.ts +10 -0
- package/dist/lib/sync/summary.d.ts.map +1 -0
- package/dist/lib/sync/summary.js +80 -0
- package/dist/lib/sync/summary.js.map +1 -0
- package/dist/lib/sync/sync-state.d.ts +128 -0
- package/dist/lib/sync/sync-state.d.ts.map +1 -0
- package/dist/lib/sync/sync-state.js +253 -0
- package/dist/lib/sync/sync-state.js.map +1 -0
- package/dist/lib/sync/telemetry.d.ts +20 -0
- package/dist/lib/sync/telemetry.d.ts.map +1 -0
- package/dist/lib/sync/telemetry.js +31 -0
- package/dist/lib/sync/telemetry.js.map +1 -0
- package/dist/lib/sync/threads.d.ts +48 -0
- package/dist/lib/sync/threads.d.ts.map +1 -0
- package/dist/lib/sync/threads.js +82 -0
- package/dist/lib/sync/threads.js.map +1 -0
- package/dist/lib/sync/window.d.ts +72 -0
- package/dist/lib/sync/window.d.ts.map +1 -0
- package/dist/lib/sync/window.js +112 -0
- package/dist/lib/sync/window.js.map +1 -0
- package/dist/lib/team-cta.d.ts +11 -0
- package/dist/lib/team-cta.d.ts.map +1 -0
- package/dist/lib/team-cta.js +16 -0
- package/dist/lib/team-cta.js.map +1 -0
- package/dist/lib/telemetry-ci.d.ts +2 -0
- package/dist/lib/telemetry-ci.d.ts.map +1 -0
- package/dist/lib/telemetry-ci.js +21 -0
- package/dist/lib/telemetry-ci.js.map +1 -0
- package/dist/lib/telemetry-consent.d.ts +44 -23
- package/dist/lib/telemetry-consent.d.ts.map +1 -1
- package/dist/lib/telemetry-consent.js +74 -35
- package/dist/lib/telemetry-consent.js.map +1 -1
- package/dist/lib/telemetry-env.d.ts +1 -1
- package/dist/lib/usage-telemetry.d.ts +87 -22
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +263 -74
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/dist/lib/xdg.d.ts +27 -0
- package/dist/lib/xdg.d.ts.map +1 -0
- package/dist/lib/xdg.js +56 -0
- package/dist/lib/xdg.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -98
- package/dist/commands/push.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import './lib/startup-env.js'; // FIRST: snapshot the shell's env before any module can change it
|
|
3
|
+
import './lib/startup-xdg.js'; // SECOND: drop a relative XDG_* before anything computes a directory from it
|
|
4
|
+
import './lib/startup-backfill-track.js'; // THIRD: if align_backfill started this process, record how it ends
|
|
3
5
|
import envPaths from 'env-paths';
|
|
4
6
|
import { migrateConfigDirectory } from './lib/config.js';
|
|
5
7
|
import { legacyLocalDbDir, migrateLocalDb } from './lib/local-mode.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC,CAAC,kEAAkE;AACjG,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,+EAA+E;AAC/E,gFAAgF;AAChF,oEAAoE;AACpE,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAE9C,uFAAuF;AACvF,uFAAuF;AACvF,oFAAoF;AACpF,+EAA+E;AAC/E,kFAAkF;AAClF,uFAAuF;AACvF,IAAI,CAAC;IACH,sBAAsB,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzH,cAAc,CAAC,gBAAgB,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,0FAA0F;AAC1F,oFAAoF;AACpF,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC,CAAC,kEAAkE;AACjG,OAAO,sBAAsB,CAAC,CAAC,6EAA6E;AAC5G,OAAO,iCAAiC,CAAC,CAAC,oEAAoE;AAC9G,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,+EAA+E;AAC/E,gFAAgF;AAChF,oEAAoE;AACpE,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAE9C,uFAAuF;AACvF,uFAAuF;AACvF,oFAAoF;AACpF,+EAA+E;AAC/E,kFAAkF;AAClF,uFAAuF;AACvF,IAAI,CAAC;IACH,sBAAsB,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzH,cAAc,CAAC,gBAAgB,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,0FAA0F;AAC1F,oFAAoF;AACpF,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function columns(db, table) {
|
|
2
|
+
return db.prepare(`PRAGMA table_info(${table})`).all().map((c) => c.name);
|
|
3
|
+
}
|
|
4
|
+
/** The columns both tables have, in the backup table's order. */
|
|
5
|
+
export function sharedColumns(db, source, backup) {
|
|
6
|
+
const have = new Set(columns(db, source));
|
|
7
|
+
return columns(db, backup).filter((c) => have.has(c));
|
|
8
|
+
}
|
|
9
|
+
export function copyRowsToBackup(db, source, backup, keyColumn, key) {
|
|
10
|
+
const cols = sharedColumns(db, source, backup).map((c) => `"${c}"`).join(', ');
|
|
11
|
+
db.prepare(`INSERT INTO ${backup} (${cols}) SELECT ${cols} FROM ${source} WHERE ${keyColumn} = ?`).run(key);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=backup-copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-copy.js","sourceRoot":"","sources":["../../src/lib/backup-copy.ts"],"names":[],"mappings":"AAcA,SAAS,OAAO,CAAC,EAAgB,EAAE,KAAa;IAC9C,OAAQ,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzG,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,MAAc,EAAE,MAAc;IAC5E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,SAAiB,EAAE,GAAW;IAC/G,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,EAAE,CAAC,OAAO,CAAC,eAAe,MAAM,KAAK,IAAI,YAAY,IAAI,SAAS,MAAM,UAAU,SAAS,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9G,CAAC"}
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ALI-827: what an import fetched, and what it could not reach.
|
|
3
|
-
*
|
|
4
|
-
* A thin connector looks like a thin tool. `align setup --local` produced 39 Slack
|
|
5
|
-
* decisions on 2026-09-02 and nothing said why; the number this prints is the number the
|
|
6
|
-
* user was about to ask about, and printing it costs nothing - no model call, no extra
|
|
7
|
-
* request, only the counts the fetch already had in its hands.
|
|
8
|
-
*
|
|
9
|
-
* Pure: a sort and a string builder over plain numbers and strings, no I/O and no chalk,
|
|
10
|
-
* so it is unit-testable without a graph or a terminal (the found-summary.ts shape).
|
|
11
|
-
*
|
|
12
|
-
* It never states a REASON it did not measure. "30 of up to 50 requested" is derived and
|
|
13
|
-
* true; "Zoom caps a page at 30" is a fact owned by the fetcher, and duplicating it here
|
|
14
|
-
* would be a second writer of it (code-style.md). A skip line arrives from whoever
|
|
15
|
-
* measured it and is printed verbatim.
|
|
16
|
-
*/
|
|
17
1
|
import type { CaptureFetchResult, CaptureSkip } from './fetchers/capture.js';
|
|
18
2
|
export interface CaptureSource {
|
|
19
3
|
label: string;
|
|
@@ -28,6 +12,23 @@ export interface CaptureSource {
|
|
|
28
12
|
/** What the caller asked for, when it asked for anything. */
|
|
29
13
|
requested?: number;
|
|
30
14
|
skips: CaptureSkip[];
|
|
15
|
+
/** L3: the window this read covered, as the report prints it ("the last 6 months", from
|
|
16
|
+
* windowLabel). Present only for a windowed read; its presence is what switches the line
|
|
17
|
+
* to the "imported N ... from W" form, so a source without one prints exactly as before. */
|
|
18
|
+
window?: string;
|
|
19
|
+
/** L3: the SDK's `complete`. Anything but `false` reads as a complete windowed read. */
|
|
20
|
+
complete?: boolean;
|
|
21
|
+
/** L3: the oldest `updated_at` the read reached, named on an incomplete line. */
|
|
22
|
+
oldestReached?: string;
|
|
23
|
+
/** L3: what the gateway STORED, and how many batches failed. Absent means unknown, and the
|
|
24
|
+
* line then falls back to `fetched`. "Imported" is never claimed for more than was stored. */
|
|
25
|
+
stored?: number;
|
|
26
|
+
failedBatches?: number;
|
|
27
|
+
/** L3: whose items a team-scope read covered, printed as one line under the source. */
|
|
28
|
+
scopeNote?: string;
|
|
29
|
+
/** L3: GitHub items still without their discussion, of `discussionTotal` that could have had it. */
|
|
30
|
+
discussionPending?: number;
|
|
31
|
+
discussionTotal?: number;
|
|
31
32
|
}
|
|
32
33
|
export declare function renderCaptureReport(sources: CaptureSource[]): string;
|
|
33
34
|
/** The report line's inputs, from one wrapper result. `fetched` is what came BACK, not
|
|
@@ -35,7 +36,10 @@ export declare function renderCaptureReport(sources: CaptureSource[]): string;
|
|
|
35
36
|
export declare function toCaptureSource(source: {
|
|
36
37
|
label: string;
|
|
37
38
|
unit: string;
|
|
38
|
-
}, result: CaptureFetchResult
|
|
39
|
+
}, result: CaptureFetchResult, window?: string, imported?: {
|
|
40
|
+
stored?: number;
|
|
41
|
+
failedBatches?: number;
|
|
42
|
+
}): CaptureSource;
|
|
39
43
|
/**
|
|
40
44
|
* Accumulates sources across the concurrent imports one `align setup` runs, so the report
|
|
41
45
|
* prints once at the end instead of interleaved between spinners. Explicitly passed,
|
|
@@ -43,7 +47,7 @@ export declare function toCaptureSource(source: {
|
|
|
43
47
|
* two commands in one process.
|
|
44
48
|
*/
|
|
45
49
|
export declare function createCaptureCollector(): {
|
|
46
|
-
add(source: CaptureSource):
|
|
50
|
+
add(source: CaptureSource): CaptureSource;
|
|
47
51
|
render(): string;
|
|
48
52
|
};
|
|
49
53
|
//# sourceMappingURL=capture-report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-report.d.ts","sourceRoot":"","sources":["../../src/lib/capture-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capture-report.d.ts","sourceRoot":"","sources":["../../src/lib/capture-report.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd;mCAC+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;wFAEoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB;;iGAE6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;mGAC+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAwCpE;AAED;qFACqF;AACrF,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACvC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,aAAa,CAiBf;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAAC;IAAC,MAAM,IAAI,MAAM,CAAA;CAAE,CAYxG"}
|