@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
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { isAuthExpiry } from '../errors.js';
|
|
2
|
+
import { SYNC_TIME_BUDGET_MS } from '../import-defaults.js';
|
|
3
|
+
import { describeScopeKey } from '../scope-values.js';
|
|
4
|
+
import { connectorItemKey } from '../source-key.js';
|
|
5
|
+
import { drainGitHub } from './drain.js';
|
|
6
|
+
import { advanceHighWater, beginRun, markNeedsReauth, readRows, recordActivity, saveRun, storedByKey, threadRows, } from './sync-state.js';
|
|
7
|
+
import { HOT_THREAD_DAYS, mergePartialThread, selectHotThreads } from './threads.js';
|
|
8
|
+
import { ascendingByUpdated, finishRun, inheritedWindowSince, later, newestUpdated, nextWindow, PERSISTENT_HOLE_RUNS, plausible } from './window.js';
|
|
9
|
+
const BATCH = 50;
|
|
10
|
+
/**
|
|
11
|
+
* Which incompleteness is a DATE-ORDERED CUT, per source. A cut is only safe to resume with `until = oldestReached` when the fetcher
|
|
12
|
+
* read ONE listing, newest first, and stopped: then everything newer than the oldest item it returned was read. Anything else leaves
|
|
13
|
+
* a gap that no date describes (a space, a team, a channel, a second query, a slice that was never reached), and resuming "below
|
|
14
|
+
* the oldest item" would skip it for good. Read from the SDK (node_modules/@aligndottech/connector-core/dist/fetchers), verified one by one:
|
|
15
|
+
*
|
|
16
|
+
* - jira: jira.js:52 `ORDER BY updated DESC`, one JQL, one page token chain. Its stops, `time_budget` (:141) and `page_cap` (:146), both say
|
|
17
|
+
* "older issues not read". With the item limit it emits no skip at all (:182): a cut with no skip kinds.
|
|
18
|
+
* - notion: notion.js:171-197 one search sorted last_edited_time descending. `time_budget` (:238) stops it. Its `page_cap` (:158, :235) is a
|
|
19
|
+
* page BODY cut, not a listing stop, so it is a hole.
|
|
20
|
+
* - gitlab: gitlab.js:58-112 one merge-request listing, updated_at descending; `time_budget` (:112) stops it. An unreadable page is an
|
|
21
|
+
* `error` skip and is a hole.
|
|
22
|
+
*
|
|
23
|
+
* Everything else is a hole, by reading, not by guessing:
|
|
24
|
+
* - github: github.js:306-329 runs SEVERAL searches (involves, reviewed-by, issues, or repo PRs and issues), each month-sliced newest first
|
|
25
|
+
* (githubSearch.js:104-129), then `interleave`s them and trims to the limit (:327). The kept items are a prefix of EACH list, not of
|
|
26
|
+
* the merged one, so `oldestReached` is the oldest of the shortest prefix and the longer list's items below it are unread.
|
|
27
|
+
* Its `vendor_cap` (githubSearch.js:146) is a per-slice ceiling with older slices still read.
|
|
28
|
+
* - linear: linear.js:176 two parallel streams (assigned, created); confluence.js:206 one listing per space, `time_budget` ends the loop
|
|
29
|
+
* with whole spaces unread; teams.js:211-222 team by team, channel by channel; zoom.js:181 30-day windows; slack walks channels.
|
|
30
|
+
*/
|
|
31
|
+
const CUT_KINDS_BY_SOURCE = {
|
|
32
|
+
jira: new Set(['time_budget', 'page_cap']),
|
|
33
|
+
notion: new Set(['time_budget']),
|
|
34
|
+
gitlab: new Set(['time_budget']),
|
|
35
|
+
};
|
|
36
|
+
/** Platforms whose partial items are threads of messages (Slack hot threads, Teams reply caps). */
|
|
37
|
+
const MERGEABLE = new Set(['slack', 'teams']);
|
|
38
|
+
const none = (source, state, message) => ({ source, state, read: 0, created: 0, updated: 0, skips: [], message });
|
|
39
|
+
export async function syncSource(source, env,
|
|
40
|
+
/** `minIntervalMs` applies to a background run only: a launch's child that finds the source tried more recently than this stops, so the interval holds across launches. */
|
|
41
|
+
o = { trigger: 'cli' }) {
|
|
42
|
+
const tokens = env.tokens(source);
|
|
43
|
+
if (tokens === null || !tokens['token'])
|
|
44
|
+
return none(source, 'not_connected', `${source} is not connected. Run: align connect ${source}`);
|
|
45
|
+
// Decision 21: a Teams token lasts about an hour, so a background run would hold a dead one.
|
|
46
|
+
if (source === 'teams' && o.trigger === 'background')
|
|
47
|
+
return none(source, 'manual', 'Teams is refreshed by hand: align connect teams');
|
|
48
|
+
const lock = env.lock(`sync-${source}`);
|
|
49
|
+
if (!lock.ok)
|
|
50
|
+
return none(source, 'locked', `already syncing${lock.holder ? ` (started ${lock.holder.started_at.slice(0, 16).replace('T', ' ')} UTC)` : ''}`);
|
|
51
|
+
try {
|
|
52
|
+
if (o.trigger === 'background' && o.minIntervalMs !== undefined) {
|
|
53
|
+
// Re-read AFTER taking the lock: the launcher's decision is older than the 20 s the child waited, and another child may have just finished.
|
|
54
|
+
const nowMs = env.now().getTime();
|
|
55
|
+
const tried = readRows(env.dbPath, source).flatMap((r) => [r.last_success_at, r.last_attempt_at])
|
|
56
|
+
.map((t) => (t === null ? Number.NaN : Date.parse(t))).filter((t) => !Number.isNaN(t) && t <= nowMs);
|
|
57
|
+
if (tried.length > 0 && nowMs - Math.max(...tried) < o.minIntervalMs)
|
|
58
|
+
return none(source, 'recent', `${source} was refreshed less than ${Math.round(o.minIntervalMs / 60_000)} minutes ago`);
|
|
59
|
+
}
|
|
60
|
+
if (env.backfillRunning(source))
|
|
61
|
+
return none(source, 'backfill_running', `a backfill of ${source} is running; it is reading the same history`);
|
|
62
|
+
return await run(source, tokens, env, lock, o);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
lock.release();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function run(source, tokens, env, lock, o) {
|
|
69
|
+
const now = env.now();
|
|
70
|
+
const nowIso = now.toISOString();
|
|
71
|
+
let scope = await env.scopeOf(source, { trigger: o.trigger });
|
|
72
|
+
// A source that must not be read until the person acts (Confluence with no spaces): no request, no row, the command to run.
|
|
73
|
+
if (scope.blocked !== undefined)
|
|
74
|
+
return none(source, 'manual', scope.blocked);
|
|
75
|
+
if (scope.activates && scope.disclosure !== undefined) {
|
|
76
|
+
// An agent's waiting scope offered to a person: it is read only after an explicit Yes. Anything else reads what was in force.
|
|
77
|
+
env.announce?.(source, scope.disclosure);
|
|
78
|
+
const yes = env.announce !== undefined && env.confirm !== undefined && await env.confirm(source, `Read ${describeScopeKey(source, scope.scopeKey, 'team')} now? No keeps your current scope.`);
|
|
79
|
+
if (yes)
|
|
80
|
+
env.markDisclosed?.(source, scope.scopeKey);
|
|
81
|
+
else
|
|
82
|
+
scope = await env.scopeOf(source, { trigger: 'background' });
|
|
83
|
+
if (scope.blocked !== undefined)
|
|
84
|
+
return none(source, 'manual', scope.blocked);
|
|
85
|
+
}
|
|
86
|
+
else if (scope.disclosure !== undefined && env.announce) {
|
|
87
|
+
env.announce(source, scope.disclosure);
|
|
88
|
+
env.markDisclosed?.(source, scope.scopeKey);
|
|
89
|
+
}
|
|
90
|
+
const key = { source, scopeKey: scope.scopeKey, scope: scope.scope };
|
|
91
|
+
const rows = readRows(env.dbPath, source);
|
|
92
|
+
// A new scope inherits the depth the person asked for on this source ("all" stays all).
|
|
93
|
+
const row = beginRun(env.dbPath, key, inheritedWindowSince(rows, now), nowIso);
|
|
94
|
+
if (row.status === 'needs_reauth') {
|
|
95
|
+
return { ...none(source, 'needs_reauth', `${source} needs the person to re-authenticate. Run: align connect ${source}`), scope: scope.scope };
|
|
96
|
+
}
|
|
97
|
+
const win = nextWindow(row, now);
|
|
98
|
+
const skips = [];
|
|
99
|
+
let hotThreads;
|
|
100
|
+
if (source === 'slack' && win.since !== undefined) {
|
|
101
|
+
const sel = selectHotThreads(threadRows(env.dbPath, 'slack'), now);
|
|
102
|
+
if (sel.hot.length > 0)
|
|
103
|
+
hotThreads = sel.hot;
|
|
104
|
+
if (sel.quiet > 0) {
|
|
105
|
+
skips.push({ kind: 'shape', count: sel.quiet, detail: `threads quiet for more than ${HOT_THREAD_DAYS} days are not re-read, so a late reply to one is not picked up` });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let fetched;
|
|
109
|
+
try {
|
|
110
|
+
fetched = await env.fetch(source, tokens, { ...win, ...(hotThreads ? { hotThreads } : {}) }, scope);
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
return failed(source, key, row.window_since, env, e);
|
|
114
|
+
}
|
|
115
|
+
const { items, report } = fetched;
|
|
116
|
+
// Only a THROWN refusal of the token (above) marks a source needs_reauth. An auth SKIP is one repo, one channel or one
|
|
117
|
+
// project the token cannot see: it stays a skip of this scope and blocks nothing else.
|
|
118
|
+
skips.push(...report.skips);
|
|
119
|
+
const complete = report.complete === true;
|
|
120
|
+
// A cut needs ONE newest-first listing AND nothing but cut-kind skips beside it: any error, auth or other skip means
|
|
121
|
+
// something was unreadable in a place no date describes, and that makes the whole run a hole (see CUT_KINDS_BY_SOURCE).
|
|
122
|
+
const cutKinds = CUT_KINDS_BY_SOURCE[source];
|
|
123
|
+
const cut = !complete && cutKinds !== undefined && report.oldestReached !== undefined
|
|
124
|
+
&& report.skips.every((k) => k.kind === 'shape' || (k.kind !== undefined && cutKinds.has(k.kind)));
|
|
125
|
+
const holeSkips = complete || cut ? [] : report.skips.filter((k) => k.kind !== 'shape');
|
|
126
|
+
const holeSig = holeSkips.length === 0 ? null : [...new Set(holeSkips.map((k) => `${k.kind}: ${k.detail.replace(/\d+/g, '#')}`))].sort().join(' | ').slice(0, 400);
|
|
127
|
+
const holeStreak = holeSig === null ? 0 : holeSig === row.hole_sig ? row.hole_streak + 1 : 1;
|
|
128
|
+
const persistent = holeStreak >= PERSISTENT_HOLE_RUNS;
|
|
129
|
+
const lostLock = () => none(source, 'locked', 'stopped: another sync took over this source while this one was paused. Nothing more was written.');
|
|
130
|
+
const size = env.batchSize ?? BATCH;
|
|
131
|
+
const wholeReads = { deadline: now.getTime() + WHOLE_THREAD_BUDGET_MS, kept: 0 };
|
|
132
|
+
const ordered = ascendingByUpdated(items);
|
|
133
|
+
let created = 0;
|
|
134
|
+
let updated = 0;
|
|
135
|
+
try {
|
|
136
|
+
for (let at = 0; at < ordered.length; at += size) {
|
|
137
|
+
// A holder that slept past the lock's lifetime may no longer be THE holder: check before every batch.
|
|
138
|
+
if (!lock.owned())
|
|
139
|
+
return lostLock();
|
|
140
|
+
const batch = ordered.slice(at, at + size);
|
|
141
|
+
const texts = await prepareBatch(env, tokens, batch, wholeReads);
|
|
142
|
+
const { snapshots } = await env.client.ingestBatch(batch.map((item, i) => ({
|
|
143
|
+
source_url: item.source_url, platform: item.platform, ...texts[i],
|
|
144
|
+
...(item.created_at !== undefined ? { created_at: item.created_at } : {}),
|
|
145
|
+
...(item.detail_pending === true ? { detail_pending: true } : {}),
|
|
146
|
+
})), { classify: false, keyed: true });
|
|
147
|
+
for (const s of snapshots) {
|
|
148
|
+
if (s.created)
|
|
149
|
+
created += 1;
|
|
150
|
+
else if (s.changed)
|
|
151
|
+
updated += 1;
|
|
152
|
+
}
|
|
153
|
+
recordActivity(env.dbPath, key.scopeKey, batch.flatMap((item, i) => (plausible(item.updated_at, now) !== undefined && snapshots[i] ? [{ decisionId: snapshots[i].id, platform: item.platform, updatedAt: item.updated_at }] : [])));
|
|
154
|
+
// Oldest first, so every older item is committed: this stamp is safe to resume from. Only a
|
|
155
|
+
// complete read may move it; an incomplete one is settled by finishRun once the cycle ends.
|
|
156
|
+
const committed = newestUpdated(batch, now);
|
|
157
|
+
if (complete && committed !== undefined)
|
|
158
|
+
advanceHighWater(env.dbPath, key, committed, now);
|
|
159
|
+
lock.touch();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
return failed(source, key, row.window_since, env, e, { created, updated, read: items.length });
|
|
164
|
+
}
|
|
165
|
+
if (wholeReads.kept > 0) {
|
|
166
|
+
skips.push({ kind: 'shape', count: wholeReads.kept, detail: `thread${wholeReads.kept === 1 ? '' : 's'} kept as partial and merged by appending: the whole thread could not be re-read (${wholeReads.reason ?? 'unknown'})` });
|
|
167
|
+
}
|
|
168
|
+
if (!lock.owned())
|
|
169
|
+
return lostLock();
|
|
170
|
+
// The row as it stands now: batches of a complete read have moved high_water already.
|
|
171
|
+
const current = readRows(env.dbPath, source).find((r) => r.scope_key === key.scopeKey) ?? row;
|
|
172
|
+
const fin = finishRun({ high_water: current.high_water, pending_until: row.pending_until }, {
|
|
173
|
+
complete, cut, persistent,
|
|
174
|
+
...(report.highWater !== undefined ? { highWater: report.highWater } : {}),
|
|
175
|
+
...(report.oldestReached !== undefined ? { oldestReached: report.oldestReached } : {}),
|
|
176
|
+
// The last run of a cycle a ceiling split: its own highWater is clamped to its `until`, so the
|
|
177
|
+
// cycle's top comes from THIS scope's own row, never from another scope's items.
|
|
178
|
+
...(row.pending_until !== null && row.cycle_top !== null ? { cycleNewest: row.cycle_top } : {}),
|
|
179
|
+
now,
|
|
180
|
+
});
|
|
181
|
+
const cycleTop = cut ? later(row.cycle_top, plausible(report.highWater, now)) : null;
|
|
182
|
+
const persist = (more) => saveRun(env.dbPath, key, {
|
|
183
|
+
...fin, cycle_top: cycleTop, hole_sig: holeSig, hole_streak: holeStreak, items: items.length, skips: [...skips, ...more],
|
|
184
|
+
attemptAt: env.now().toISOString(),
|
|
185
|
+
// Success is a COMPLETE read. A partial one is an attempt, and must not make the source look freshly synced.
|
|
186
|
+
...(fin.status === 'ok' ? { successAt: env.now().toISOString() } : {}),
|
|
187
|
+
});
|
|
188
|
+
persist([]);
|
|
189
|
+
let drain;
|
|
190
|
+
if (source === 'github') {
|
|
191
|
+
const elapsed = env.now().getTime() - now.getTime();
|
|
192
|
+
const deadlineMs = Math.max(30_000, SYNC_TIME_BUDGET_MS - elapsed);
|
|
193
|
+
drain = await (env.drain ? env.drain(tokens['token'], deadlineMs) : drainGitHub(env.dbPath, env.client, tokens['token'], { deadlineMs }));
|
|
194
|
+
if (drain.skips.length > 0)
|
|
195
|
+
persist(drain.skips);
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
source, state: fin.status, read: items.length, created, updated, skips: [...skips, ...(drain?.skips ?? [])], scope: scope.scope,
|
|
199
|
+
...(win.since !== undefined ? { since: win.since } : {}),
|
|
200
|
+
...(cut && report.oldestReached !== undefined ? { reachedBack: report.oldestReached } : {}),
|
|
201
|
+
...(drain ? { drain } : {}),
|
|
202
|
+
...(persistent && holeSig !== null ? { persistentHole: holeSig } : {}),
|
|
203
|
+
...(report.scopeNote ? { scopeNote: report.scopeNote } : {}),
|
|
204
|
+
...(scope.note !== undefined ? { scopeLine: scope.note } : {}),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/** Whole-thread re-reads run three at a time, and all of a run's together get this long, outside the SDK's own budget. */
|
|
208
|
+
const WHOLE_THREAD_CONCURRENCY = 3;
|
|
209
|
+
const WHOLE_THREAD_BUDGET_MS = 90_000;
|
|
210
|
+
async function prepareBatch(env, tokens, batch, whole) {
|
|
211
|
+
const out = [];
|
|
212
|
+
for (let at = 0; at < batch.length; at += WHOLE_THREAD_CONCURRENCY) {
|
|
213
|
+
out.push(...await Promise.all(batch.slice(at, at + WHOLE_THREAD_CONCURRENCY).map((item) => prepared(env, tokens, item, whole))));
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
async function prepared(env, tokens, item, whole) {
|
|
218
|
+
if (item.partial !== true || !MERGEABLE.has(item.platform))
|
|
219
|
+
return { raw_text: item.raw_text, title: item.title };
|
|
220
|
+
const key = item.source_key ?? connectorItemKey(item.platform, item.source_url);
|
|
221
|
+
const stored = key === undefined ? undefined : storedByKey(env.dbPath, key.startsWith(`${item.platform}|`) ? key : `${item.platform}|${key}`);
|
|
222
|
+
if (stored === undefined)
|
|
223
|
+
return { raw_text: item.raw_text, title: item.title };
|
|
224
|
+
const merge = () => ({ raw_text: mergePartialThread(stored.summary, item.raw_text), title: stored.title });
|
|
225
|
+
// The text carries no message times or authors, so an EDITED message cannot be told from a new one by
|
|
226
|
+
// comparing lines. When the thread can be read whole (one or two requests), the whole thread replaces the
|
|
227
|
+
// stored one; only a thread that cannot be read whole is merged by appending, and every such fallback is counted.
|
|
228
|
+
if (env.fetchWhole === undefined)
|
|
229
|
+
return merge();
|
|
230
|
+
if (env.now().getTime() > whole.deadline) {
|
|
231
|
+
whole.kept += 1;
|
|
232
|
+
whole.reason ??= 'the time allowed for re-reading whole threads ran out';
|
|
233
|
+
return merge();
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const full = await env.fetchWhole(item.platform, tokens, item.source_url);
|
|
237
|
+
if (full === undefined)
|
|
238
|
+
return merge(); // this platform has no whole-thread read: nothing was attempted
|
|
239
|
+
if (full.partial !== true)
|
|
240
|
+
return { raw_text: full.raw_text, title: stored.title };
|
|
241
|
+
whole.kept += 1;
|
|
242
|
+
whole.reason ??= 'the thread is longer than one read returns';
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
whole.kept += 1;
|
|
246
|
+
whole.reason ??= (e instanceof Error ? e.message : String(e)).slice(0, 100);
|
|
247
|
+
}
|
|
248
|
+
return merge();
|
|
249
|
+
}
|
|
250
|
+
function failed(source, key, window, env, e, partial) {
|
|
251
|
+
const message = (e instanceof Error ? e.message : String(e)).slice(0, 200);
|
|
252
|
+
const row = readRows(env.dbPath, source).find((r) => r.scope_key === key.scopeKey);
|
|
253
|
+
if (isAuthExpiry(e)) {
|
|
254
|
+
markNeedsReauth(env.dbPath, key, window, env.now().toISOString());
|
|
255
|
+
saveRun(env.dbPath, key, { status: 'needs_reauth', high_water: row?.high_water ?? null, pending_until: row?.pending_until ?? null, cycle_top: row?.cycle_top ?? null, hole_sig: row?.hole_sig ?? null, hole_streak: row?.hole_streak ?? 0, attemptAt: env.now().toISOString(), items: 0, skips: [{ kind: 'auth', count: 1, detail: message }] });
|
|
256
|
+
return { ...none(source, 'needs_reauth', `${source} refused the saved token (${message}). Run: align connect ${source}`), skips: [{ kind: 'auth', count: 1, detail: message }], scope: key.scope };
|
|
257
|
+
}
|
|
258
|
+
const skip = { kind: 'error', count: 1, detail: message };
|
|
259
|
+
saveRun(env.dbPath, key, { status: 'error', high_water: row?.high_water ?? null, pending_until: row?.pending_until ?? null, cycle_top: row?.cycle_top ?? null, hole_sig: row?.hole_sig ?? null, hole_streak: row?.hole_streak ?? 0, attemptAt: env.now().toISOString(), items: partial?.read ?? 0, skips: [skip] });
|
|
260
|
+
return { source, state: 'error', read: partial?.read ?? 0, created: partial?.created ?? 0, updated: partial?.updated ?? 0, skips: [skip], message, scope: key.scope };
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=run-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-source.js","sourceRoot":"","sources":["../../../src/lib/sync/run-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function readRegularFile(file: string, maxBytes?: number): string | undefined;
|
|
2
|
+
/** What is at this path: 'none', a regular file, or something else (a directory, a FIFO, a link) that a claim must not be built on. */
|
|
3
|
+
export declare function kindAt(file: string): 'none' | 'file' | 'other';
|
|
4
|
+
//# sourceMappingURL=safe-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-read.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/safe-read.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,MAAM,GAAG,SAAS,CActF;AAED,uIAAuI;AACvI,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAO9D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a small file the launch path does not control (the state directory is writable by anything running as the user,
|
|
3
|
+
* so a FIFO or a link can sit where a file is expected). Opens without following a link and without blocking, requires a
|
|
4
|
+
* REGULAR file, and caps the size. Anything else reads as "not there": the launcher then does nothing, and never hangs.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
export function readRegularFile(file, maxBytes = 1_048_576) {
|
|
8
|
+
let fd;
|
|
9
|
+
try {
|
|
10
|
+
// Read inside the function, not at import: this module is on the launch path.
|
|
11
|
+
const C = fs.constants;
|
|
12
|
+
fd = fs.openSync(file, C.O_RDONLY | (C.O_NONBLOCK ?? 0) | (C.O_NOFOLLOW ?? 0));
|
|
13
|
+
const st = fs.fstatSync(fd);
|
|
14
|
+
if (!st.isFile() || st.size > maxBytes)
|
|
15
|
+
return undefined;
|
|
16
|
+
return fs.readFileSync(fd, 'utf8');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
if (fd !== undefined) {
|
|
23
|
+
try {
|
|
24
|
+
fs.closeSync(fd);
|
|
25
|
+
}
|
|
26
|
+
catch { /* nothing to close */ }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** What is at this path: 'none', a regular file, or something else (a directory, a FIFO, a link) that a claim must not be built on. */
|
|
31
|
+
export function kindAt(file) {
|
|
32
|
+
try {
|
|
33
|
+
const st = fs.lstatSync(file);
|
|
34
|
+
return st.isFile() ? 'file' : 'other';
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return e.code === 'ENOENT' ? 'none' : 'other';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=safe-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-read.js","sourceRoot":"","sources":["../../../src/lib/sync/safe-read.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAQ,GAAG,SAAS;IAChE,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,8EAA8E;QAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QACvB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzD,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,uIAAuI;AACvI,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAQ,CAAuB,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SyncSummary } from './summary-read.js';
|
|
2
|
+
/** Decision 23: at most one background read per source per 15 minutes. One constant. */
|
|
3
|
+
export declare const SYNC_MIN_INTERVAL_MS: number;
|
|
4
|
+
/** The child waits this long before its first request, so it does not compete with the agent's own start-up. */
|
|
5
|
+
export declare const BACKGROUND_LAUNCH_DELAY_SECONDS = 20;
|
|
6
|
+
/** The "reconnect this source" line is shown at most this often. */
|
|
7
|
+
export declare const REAUTH_LINE_INTERVAL_MS: number;
|
|
8
|
+
export interface BackgroundSyncGates {
|
|
9
|
+
isTty: boolean;
|
|
10
|
+
/** Already inside a launched agent (ALIGN_WRAPPED). */
|
|
11
|
+
wrapped: boolean;
|
|
12
|
+
/** ALIGN_NO_SYNC. */
|
|
13
|
+
noSync: boolean;
|
|
14
|
+
ci: boolean;
|
|
15
|
+
/** `align sync --off`. */
|
|
16
|
+
disabled: boolean;
|
|
17
|
+
summary: SyncSummary | undefined;
|
|
18
|
+
now: number;
|
|
19
|
+
}
|
|
20
|
+
export interface BackgroundSyncInput extends BackgroundSyncGates {
|
|
21
|
+
minIntervalMs: number;
|
|
22
|
+
/** Sources with a sync or a backfill running right now. */
|
|
23
|
+
busy?: ReadonlySet<string>;
|
|
24
|
+
}
|
|
25
|
+
export declare function shouldBackgroundSync(i: BackgroundSyncInput): string[];
|
|
26
|
+
/** Eligible sources whose token stopped working, when the "reconnect" line is due. Same gates as the spawn. */
|
|
27
|
+
export declare function reauthSources(i: BackgroundSyncGates & {
|
|
28
|
+
lastShownAt: string | undefined;
|
|
29
|
+
intervalMs: number;
|
|
30
|
+
}): string[];
|
|
31
|
+
//# sourceMappingURL=should-background-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"should-background-sync.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/should-background-sync.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,gHAAgH;AAChH,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAKtD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,0BAA0B;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC5B;AA4BD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAcrE;AAED,+GAA+G;AAC/G,wBAAgB,aAAa,CAAC,CAAC,EAAE,mBAAmB,GAAG;IAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAKxH"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6 (Decisions 8, 9, 23): the launch decision, pure. It reads nothing itself: the caller hands in
|
|
3
|
+
* what `sync-summary.json` said, so the launch path opens no database, makes no network call and
|
|
4
|
+
* loads no fetcher to decide. Every gate fails toward "do not start anything".
|
|
5
|
+
*/
|
|
6
|
+
import { isKnownSource } from './source-ids.js';
|
|
7
|
+
/** Decision 23: at most one background read per source per 15 minutes. One constant. */
|
|
8
|
+
export const SYNC_MIN_INTERVAL_MS = 15 * 60_000;
|
|
9
|
+
/** The child waits this long before its first request, so it does not compete with the agent's own start-up. */
|
|
10
|
+
export const BACKGROUND_LAUNCH_DELAY_SECONDS = 20;
|
|
11
|
+
/** The "reconnect this source" line is shown at most this often. */
|
|
12
|
+
export const REAUTH_LINE_INTERVAL_MS = 24 * 3_600_000;
|
|
13
|
+
/** What reaches argv. The summary is a file on disk, so an id must be one of the sources a sync reads (which also rules out a flag or a second word). */
|
|
14
|
+
const SAFE_SOURCE_ID = { test: isKnownSource };
|
|
15
|
+
function gatesClosed(i) {
|
|
16
|
+
return !i.isTty || i.wrapped || i.noSync || i.ci || i.disabled || !i.summary;
|
|
17
|
+
}
|
|
18
|
+
function parsed(iso) {
|
|
19
|
+
if (iso === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
const t = Date.parse(iso);
|
|
22
|
+
return Number.isNaN(t) ? undefined : t;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The latest moment this source was tried, or undefined when no readable timestamp exists. A stamp
|
|
26
|
+
* LATER than now is ignored (a clock that moved back, or a damaged file): otherwise it would read
|
|
27
|
+
* as "tried in the future" and, with the age negative, make the source due on every launch. When
|
|
28
|
+
* every stamp is in the future the source counts as tried when the summary was written, so it is
|
|
29
|
+
* retried once the interval has passed, not on every launch.
|
|
30
|
+
*/
|
|
31
|
+
function lastTried(s, now, generatedAt) {
|
|
32
|
+
const all = [parsed(s.lastSuccessAt), parsed(s.lastAttemptAt)].filter((t) => t !== undefined);
|
|
33
|
+
const past = all.filter((t) => t <= now);
|
|
34
|
+
if (past.length > 0)
|
|
35
|
+
return Math.max(...past);
|
|
36
|
+
if (all.length === 0)
|
|
37
|
+
return undefined;
|
|
38
|
+
const written = parsed(generatedAt);
|
|
39
|
+
return written !== undefined && written <= now ? written : undefined;
|
|
40
|
+
}
|
|
41
|
+
export function shouldBackgroundSync(i) {
|
|
42
|
+
if (gatesClosed(i))
|
|
43
|
+
return [];
|
|
44
|
+
const due = new Set();
|
|
45
|
+
for (const s of i.summary.sources) {
|
|
46
|
+
// `never`: connected but never read by a person (no manual sync or backfill yet), so nothing is read unattended for it.
|
|
47
|
+
// `manual` and `not_connected`: a run cannot get further until a person acts, and writes no timestamp, so it would respawn every interval.
|
|
48
|
+
if (!s.backgroundEligible || s.status === 'needs_reauth' || s.status === 'never' || s.status === 'manual' || s.status === 'not_connected')
|
|
49
|
+
continue;
|
|
50
|
+
if (!SAFE_SOURCE_ID.test(s.id) || i.busy?.has(s.id))
|
|
51
|
+
continue;
|
|
52
|
+
const tried = lastTried(s, i.now, i.summary.generated_at);
|
|
53
|
+
// No readable timestamp: stale, never fresh.
|
|
54
|
+
const age = tried === undefined ? Number.POSITIVE_INFINITY : i.now - tried;
|
|
55
|
+
if (age >= i.minIntervalMs)
|
|
56
|
+
due.add(s.id);
|
|
57
|
+
}
|
|
58
|
+
return [...due];
|
|
59
|
+
}
|
|
60
|
+
/** Eligible sources whose token stopped working, when the "reconnect" line is due. Same gates as the spawn. */
|
|
61
|
+
export function reauthSources(i) {
|
|
62
|
+
if (gatesClosed(i))
|
|
63
|
+
return [];
|
|
64
|
+
const shown = parsed(i.lastShownAt);
|
|
65
|
+
if (shown !== undefined && i.now - shown >= 0 && i.now - shown < i.intervalMs)
|
|
66
|
+
return [];
|
|
67
|
+
return [...new Set(i.summary.sources.filter((s) => s.backgroundEligible && s.status === 'needs_reauth' && SAFE_SOURCE_ID.test(s.id)).map((s) => s.id))];
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=should-background-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"should-background-sync.js","sourceRoot":"","sources":["../../../src/lib/sync/should-background-sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,MAAM,CAAC;AAChD,gHAAgH;AAChH,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAClD,oEAAoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,SAAS,CAAC;AAEtD,yJAAyJ;AACzJ,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AAqB/C,SAAS,WAAW,CAAC,CAAsB;IACzC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/E,CAAC;AAED,SAAS,MAAM,CAAC,GAAuB;IACrC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,CAAgB,EAAE,GAAW,EAAE,WAAmB;IACnE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACpC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAsB;IACzD,IAAI,WAAW,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,wHAAwH;QACxH,2IAA2I;QAC3I,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe;YAAE,SAAS;QACpJ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAQ,CAAC,YAAY,CAAC,CAAC;QAC3D,6CAA6C;QAC7C,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;QAC3E,IAAI,GAAG,IAAI,CAAC,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,aAAa,CAAC,CAAgF;IAC5G,IAAI,WAAW,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IACzF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3J,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sources a sync can read, in a module with no imports so the launch path may name them
|
|
3
|
+
* (mcp-backfill.ts re-exports it; localConnectorIds() equals it by test). One list: the launcher
|
|
4
|
+
* filters a summary file's ids against it, and the sync command refuses (or, in the background,
|
|
5
|
+
* skips) anything else.
|
|
6
|
+
*/
|
|
7
|
+
export declare const KNOWN_SOURCES: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion"];
|
|
8
|
+
export type KnownSource = (typeof KNOWN_SOURCES)[number];
|
|
9
|
+
export declare const isKnownSource: (id: string) => id is KnownSource;
|
|
10
|
+
//# sourceMappingURL=source-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-ids.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/source-ids.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,2FAA4F,CAAC;AACvH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,EAAE,IAAI,WAAgE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sources a sync can read, in a module with no imports so the launch path may name them
|
|
3
|
+
* (mcp-backfill.ts re-exports it; localConnectorIds() equals it by test). One list: the launcher
|
|
4
|
+
* filters a summary file's ids against it, and the sync command refuses (or, in the background,
|
|
5
|
+
* skips) anything else.
|
|
6
|
+
*/
|
|
7
|
+
export const KNOWN_SOURCES = ['github', 'jira', 'confluence', 'slack', 'teams', 'gitlab', 'linear', 'notion'];
|
|
8
|
+
export const isKnownSource = (id) => KNOWN_SOURCES.includes(id);
|
|
9
|
+
//# sourceMappingURL=source-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-ids.js","sourceRoot":"","sources":["../../../src/lib/sync/source-ids.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAEvH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAU,EAAqB,EAAE,CAAE,aAAmC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L5: how a sync reads one source. The connectors that `align connect` already knows how to read
|
|
3
|
+
* keep their one definition in setup.ts (`buildSources`): this file only adds the two things a
|
|
4
|
+
* sync needs that connect does not, a scope key per source and GitHub's items-only list read.
|
|
5
|
+
* Imported only by the sync command (it pulls setup.ts in); the MCP server never loads it.
|
|
6
|
+
*/
|
|
7
|
+
import type { CaptureFetchResult } from '../fetchers/capture.js';
|
|
8
|
+
import { type ResolvedScope, type ScopeDeps } from '../scope.js';
|
|
9
|
+
/**
|
|
10
|
+
* The scope a run reads a source under (L4: scope.ts decides). `blocked` means do not read at all; `note` is worth saying to the
|
|
11
|
+
* person; `disclosure` is the one-time team-scope line, set only for a foreground run (the sync prints it before the first request).
|
|
12
|
+
*/
|
|
13
|
+
export type SyncScope = Pick<ResolvedScope, 'scopeKey' | 'scope'> & Partial<Pick<ResolvedScope, 'repo' | 'extras' | 'blocked' | 'note' | 'disclosure' | 'activates'>>;
|
|
14
|
+
/** The scope this machine reads a source under, decided before the fetch so its watermark can be found. Chosen scopes, the folder's
|
|
15
|
+
* repo (GitHub, GitLab) and the "yours" fallbacks are all scope.ts's: the same answer `align connect` and `align_scope` give. */
|
|
16
|
+
export declare function scopeOf(source: string, o?: {
|
|
17
|
+
trigger: 'cli' | 'background';
|
|
18
|
+
}, deps?: ScopeDeps): Promise<SyncScope>;
|
|
19
|
+
export interface SourceWindow {
|
|
20
|
+
since?: string;
|
|
21
|
+
until?: string;
|
|
22
|
+
hotThreads?: Array<{
|
|
23
|
+
channel: string;
|
|
24
|
+
ts: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export declare function fetchSource(source: string, tokens: Record<string, string>, win: SourceWindow, scope: SyncScope): Promise<CaptureFetchResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Re-read one stored thread whole, for merging a partial Slack re-read without guessing which lines are new.
|
|
30
|
+
* The URL comes from a stored row, never from a person or an agent; Slack's fetchOne also holds it to a slack.com host.
|
|
31
|
+
*/
|
|
32
|
+
export declare function fetchWhole(source: string, tokens: Record<string, string>, url: string): Promise<CaptureFetchResult['items'][number] | undefined>;
|
|
33
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/sources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,KAAK,aAAa,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAI/E;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC;AAEtK;kIACkI;AAClI,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAE;IAAE,OAAO,EAAE,KAAK,GAAG,YAAY,CAAA;CAAuB,EAAE,IAAI,GAAE,SAAoC,GAAG,OAAO,CAAC,SAAS,CAAC,CAEvK;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;AAErH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAWlJ;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAOtJ"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { fetchGitHubItemsOnly } from '../fetchers/github.js';
|
|
2
|
+
import { resolveScope } from '../scope.js';
|
|
3
|
+
import { realScopeDeps } from '../scope-real.js';
|
|
4
|
+
import { fetchWindow, windowExtras } from '../since.js';
|
|
5
|
+
/** The scope this machine reads a source under, decided before the fetch so its watermark can be found. Chosen scopes, the folder's
|
|
6
|
+
* repo (GitHub, GitLab) and the "yours" fallbacks are all scope.ts's: the same answer `align connect` and `align_scope` give. */
|
|
7
|
+
export async function scopeOf(source, o = { trigger: 'cli' }, deps = realScopeDeps(undefined)) {
|
|
8
|
+
return resolveScope(source, deps, { foreground: o.trigger === 'cli' });
|
|
9
|
+
}
|
|
10
|
+
export async function fetchSource(source, tokens, win, scope) {
|
|
11
|
+
if (source === 'github') {
|
|
12
|
+
return fetchGitHubItemsOnly({
|
|
13
|
+
token: tokens['token'], ...fetchWindow('github', win.since !== undefined ? { since: win.since } : {}), ...windowExtras(win),
|
|
14
|
+
...(scope.repo ? { repo: scope.repo, scope: scope.scope } : {}),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const { buildSources } = await import('../../commands/setup.js');
|
|
18
|
+
const def = buildSources(false).find((s) => s.id === source);
|
|
19
|
+
if (!def)
|
|
20
|
+
throw new Error(`align sync does not know how to read "${source}".`);
|
|
21
|
+
return def.fetch(tokens, win.since !== undefined ? { since: win.since } : {}, { ...windowExtras(win), ...windowExtras(scope.extras) });
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Re-read one stored thread whole, for merging a partial Slack re-read without guessing which lines are new.
|
|
25
|
+
* The URL comes from a stored row, never from a person or an agent; Slack's fetchOne also holds it to a slack.com host.
|
|
26
|
+
*/
|
|
27
|
+
export async function fetchWhole(source, tokens, url) {
|
|
28
|
+
if (source !== 'slack')
|
|
29
|
+
return undefined;
|
|
30
|
+
const { SlackFetcher } = await import('@aligndottech/connector-core');
|
|
31
|
+
const r = await new SlackFetcher().fetchOne(url, { token: tokens['token'] });
|
|
32
|
+
// A skip (429, 404, a channel it cannot see, time) is a reason the caller counts, never a silent "no".
|
|
33
|
+
if (!r.item)
|
|
34
|
+
throw new Error(r.skip?.detail ?? 'the thread could not be read');
|
|
35
|
+
return r.item;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/lib/sync/sources.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAsB,YAAY,EAAkB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD;kIACkI;AAClI,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,IAAuC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAkB,aAAa,CAAC,SAAS,CAAC;IACjJ,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,MAA8B,EAAE,GAAiB,EAAE,KAAgB;IACnH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,oBAAoB,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAE,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;YAC5H,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,IAAI,CAAC,CAAC;IAC/E,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzI,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,MAA8B,EAAE,GAAW;IAC1F,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC;IAC9E,uGAAuG;IACvG,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,8BAA8B,CAAC,CAAC;IAC/E,OAAO,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ChildCaller, startBackfillChild } from '../backfill-state.js';
|
|
2
|
+
/** `--delay 0`: an on-demand run (the person or their agent just asked) has no agent start-up to stay out of the way of. */
|
|
3
|
+
export declare function syncChildArgv(sources: readonly string[], o?: {
|
|
4
|
+
delaySeconds?: number;
|
|
5
|
+
}): string[];
|
|
6
|
+
/**
|
|
7
|
+
* The ALIGN_* names a sync child reads, and nothing else (checked against src/ by a parity test).
|
|
8
|
+
* No ALIGN_LLM_*, ALIGN_TOKEN or provider setting: a sync makes no LLM call and takes connector tokens from the config file.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SYNC_CHILD_ALIGN_NAMES: readonly ["ALIGN_ENV", "ALIGN_GATEWAY_URL", "ALIGN_MODEL_CACHE", "ALIGN_TELEMETRY", "ALIGN_INGEST_CONCURRENCY", "ALIGN_DEBUG"];
|
|
11
|
+
/**
|
|
12
|
+
* The environment a background sync child gets: an allow-list, not a copy, and the one list of
|
|
13
|
+
* value rules is mcp-child-env.ts's (so a credentialed proxy URL or a relative certificate path is
|
|
14
|
+
* dropped here exactly as it is for an MCP server). A name that is not listed is not passed, and
|
|
15
|
+
* an empty value is omitted.
|
|
16
|
+
*/
|
|
17
|
+
export declare function syncChildEnv(env: Record<string, string | undefined>): Record<string, string>;
|
|
18
|
+
export declare function startSyncChild(sources: readonly string[], o?: {
|
|
19
|
+
delaySeconds?: number;
|
|
20
|
+
start?: typeof startBackfillChild;
|
|
21
|
+
env?: Record<string, string | undefined>;
|
|
22
|
+
caller?: ChildCaller;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
ok: boolean;
|
|
25
|
+
pid?: number;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=spawn-background.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-background.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/spawn-background.ts"],"names":[],"mappings":"AAaA,OAAO,EAAwB,KAAK,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAKlG,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,EAAE,CAErG;AAUD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,gIAAiI,CAAC;AAKrK;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU5F;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,CAAC,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,kBAAkB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACnI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKxC"}
|