@aligndottech/cli 0.48.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +35 -26
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +7 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/ai.d.ts +11 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +121 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +18 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +24 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/default-action.js +2 -2
- package/dist/commands/default-action.js.map +1 -1
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +24 -5
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/docs.js +2 -2
- package/dist/commands/import/git.d.ts.map +1 -1
- package/dist/commands/import/git.js +15 -5
- package/dist/commands/import/git.js.map +1 -1
- package/dist/commands/import/github.d.ts.map +1 -1
- package/dist/commands/import/github.js +34 -7
- package/dist/commands/import/github.js.map +1 -1
- package/dist/commands/import/gitlab.d.ts.map +1 -1
- package/dist/commands/import/gitlab.js +10 -5
- package/dist/commands/import/gitlab.js.map +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +10 -5
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/import/linear.d.ts.map +1 -1
- package/dist/commands/import/linear.js +10 -5
- package/dist/commands/import/linear.js.map +1 -1
- package/dist/commands/import/notion.d.ts.map +1 -1
- package/dist/commands/import/notion.js +10 -5
- package/dist/commands/import/notion.js.map +1 -1
- package/dist/commands/import/sessions.js +2 -2
- package/dist/commands/import/slack.d.ts.map +1 -1
- package/dist/commands/import/slack.js +12 -7
- package/dist/commands/import/slack.js.map +1 -1
- package/dist/commands/import/teams.d.ts.map +1 -1
- package/dist/commands/import/teams.js +10 -5
- package/dist/commands/import/teams.js.map +1 -1
- package/dist/commands/import/zoom.d.ts.map +1 -1
- package/dist/commands/import/zoom.js +10 -5
- package/dist/commands/import/zoom.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +43 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +76 -4
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/mark.d.ts +37 -0
- package/dist/commands/mark.d.ts.map +1 -0
- package/dist/commands/mark.js +105 -0
- package/dist/commands/mark.js.map +1 -0
- package/dist/commands/mcp.d.ts +141 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +72 -14
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +12 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.d.ts +39 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +118 -241
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/share.d.ts +7 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/sync.d.ts +55 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +278 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/telemetry.d.ts +3 -3
- package/dist/commands/telemetry.js +6 -6
- package/dist/commands/telemetry.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +27 -1
- package/dist/commands/why.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ask-key-offer.d.ts +38 -0
- package/dist/lib/ask-key-offer.d.ts.map +1 -0
- package/dist/lib/ask-key-offer.js +130 -0
- package/dist/lib/ask-key-offer.js.map +1 -0
- package/dist/lib/backfill-state.d.ts +116 -0
- package/dist/lib/backfill-state.d.ts.map +1 -0
- package/dist/lib/backfill-state.js +342 -0
- package/dist/lib/backfill-state.js.map +1 -0
- package/dist/lib/backup-copy.d.ts +17 -0
- package/dist/lib/backup-copy.d.ts.map +1 -0
- package/dist/lib/backup-copy.js +13 -0
- package/dist/lib/backup-copy.js.map +1 -0
- package/dist/lib/capture-report.d.ts +22 -18
- package/dist/lib/capture-report.d.ts.map +1 -1
- package/dist/lib/capture-report.js +64 -2
- package/dist/lib/capture-report.js.map +1 -1
- package/dist/lib/config.d.ts +56 -24
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +176 -45
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/confirm-timeout.d.ts +8 -0
- package/dist/lib/confirm-timeout.d.ts.map +1 -0
- package/dist/lib/confirm-timeout.js +18 -0
- package/dist/lib/confirm-timeout.js.map +1 -0
- package/dist/lib/curation/check-marks.d.ts +48 -0
- package/dist/lib/curation/check-marks.d.ts.map +1 -0
- package/dist/lib/curation/check-marks.js +81 -0
- package/dist/lib/curation/check-marks.js.map +1 -0
- package/dist/lib/curation/guardrail.d.ts +39 -0
- package/dist/lib/curation/guardrail.d.ts.map +1 -0
- package/dist/lib/curation/guardrail.js +93 -0
- package/dist/lib/curation/guardrail.js.map +1 -0
- package/dist/lib/curation/judge.d.ts +3 -0
- package/dist/lib/curation/judge.d.ts.map +1 -0
- package/dist/lib/curation/judge.js +9 -0
- package/dist/lib/curation/judge.js.map +1 -0
- package/dist/lib/curation/judgements-db.d.ts +96 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -0
- package/dist/lib/curation/judgements-db.js +200 -0
- package/dist/lib/curation/judgements-db.js.map +1 -0
- package/dist/lib/curation/last-check.d.ts +32 -0
- package/dist/lib/curation/last-check.d.ts.map +1 -0
- package/dist/lib/curation/last-check.js +81 -0
- package/dist/lib/curation/last-check.js.map +1 -0
- package/dist/lib/curation/mark.d.ts +76 -0
- package/dist/lib/curation/mark.d.ts.map +1 -0
- package/dist/lib/curation/mark.js +359 -0
- package/dist/lib/curation/mark.js.map +1 -0
- package/dist/lib/curation/text.d.ts +6 -0
- package/dist/lib/curation/text.d.ts.map +1 -0
- package/dist/lib/curation/text.js +35 -0
- package/dist/lib/curation/text.js.map +1 -0
- package/dist/lib/fetchers/capture.d.ts +49 -2
- package/dist/lib/fetchers/capture.d.ts.map +1 -1
- package/dist/lib/fetchers/capture.js +7 -1
- package/dist/lib/fetchers/capture.js.map +1 -1
- package/dist/lib/fetchers/confluence.d.ts +2 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts +1 -0
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +3 -1
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts +44 -5
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +122 -5
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/gitlab.d.ts +2 -2
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
- package/dist/lib/fetchers/gitlab.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +2 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts +2 -2
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts +2 -2
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts +2 -3
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts +2 -2
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts +2 -2
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +34 -0
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +19 -1
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/github-text.d.ts +3 -0
- package/dist/lib/github-text.d.ts.map +1 -0
- package/dist/lib/github-text.js +18 -0
- package/dist/lib/github-text.js.map +1 -0
- package/dist/lib/hook-context.d.ts +10 -0
- package/dist/lib/hook-context.d.ts.map +1 -1
- package/dist/lib/hook-context.js +14 -0
- package/dist/lib/hook-context.js.map +1 -1
- package/dist/lib/import-defaults.d.ts +39 -23
- package/dist/lib/import-defaults.d.ts.map +1 -1
- package/dist/lib/import-defaults.js +28 -26
- package/dist/lib/import-defaults.js.map +1 -1
- package/dist/lib/launch/adapters/aider.d.ts +17 -0
- package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
- package/dist/lib/launch/adapters/aider.js +30 -0
- package/dist/lib/launch/adapters/aider.js.map +1 -0
- package/dist/lib/launch/adapters/amp.d.ts +18 -0
- package/dist/lib/launch/adapters/amp.d.ts.map +1 -0
- package/dist/lib/launch/adapters/amp.js +29 -0
- package/dist/lib/launch/adapters/amp.js.map +1 -0
- package/dist/lib/launch/adapters/auggie.d.ts +18 -0
- package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
- package/dist/lib/launch/adapters/auggie.js +34 -0
- package/dist/lib/launch/adapters/auggie.js.map +1 -0
- package/dist/lib/launch/adapters/cline.d.ts +10 -0
- package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
- package/dist/lib/launch/adapters/cline.js +41 -0
- package/dist/lib/launch/adapters/cline.js.map +1 -0
- package/dist/lib/launch/adapters/continue.d.ts +22 -0
- package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
- package/dist/lib/launch/adapters/continue.js +46 -0
- package/dist/lib/launch/adapters/continue.js.map +1 -0
- package/dist/lib/launch/adapters/droid.d.ts +19 -0
- package/dist/lib/launch/adapters/droid.d.ts.map +1 -0
- package/dist/lib/launch/adapters/droid.js +38 -0
- package/dist/lib/launch/adapters/droid.js.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
- package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
- package/dist/lib/launch/adapters/gemini-cli.js +38 -53
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
- package/dist/lib/launch/adapters/goose.d.ts +20 -0
- package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
- package/dist/lib/launch/adapters/goose.js +47 -0
- package/dist/lib/launch/adapters/goose.js.map +1 -0
- package/dist/lib/launch/adapters/grok-build.d.ts +16 -0
- package/dist/lib/launch/adapters/grok-build.d.ts.map +1 -0
- package/dist/lib/launch/adapters/grok-build.js +25 -0
- package/dist/lib/launch/adapters/grok-build.js.map +1 -0
- package/dist/lib/launch/adapters/kiro.d.ts +17 -0
- package/dist/lib/launch/adapters/kiro.d.ts.map +1 -0
- package/dist/lib/launch/adapters/kiro.js +25 -0
- package/dist/lib/launch/adapters/kiro.js.map +1 -0
- package/dist/lib/launch/adapters/notes.d.ts +7 -0
- package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
- package/dist/lib/launch/adapters/notes.js +5 -0
- package/dist/lib/launch/adapters/notes.js.map +1 -0
- package/dist/lib/launch/adapters/qwen.d.ts +25 -0
- package/dist/lib/launch/adapters/qwen.d.ts.map +1 -0
- package/dist/lib/launch/adapters/qwen.js +67 -0
- package/dist/lib/launch/adapters/qwen.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +6 -1
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +12 -4
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/amp-state.d.ts +21 -0
- package/dist/lib/launch/amp-state.d.ts.map +1 -0
- package/dist/lib/launch/amp-state.js +61 -0
- package/dist/lib/launch/amp-state.js.map +1 -0
- package/dist/lib/launch/auggie-state.d.ts +25 -0
- package/dist/lib/launch/auggie-state.d.ts.map +1 -0
- package/dist/lib/launch/auggie-state.js +74 -0
- package/dist/lib/launch/auggie-state.js.map +1 -0
- package/dist/lib/launch/cline-state.d.ts +32 -0
- package/dist/lib/launch/cline-state.d.ts.map +1 -0
- package/dist/lib/launch/cline-state.js +108 -0
- package/dist/lib/launch/cline-state.js.map +1 -0
- package/dist/lib/launch/config-writes.d.ts +11 -1
- package/dist/lib/launch/config-writes.d.ts.map +1 -1
- package/dist/lib/launch/config-writes.js +66 -8
- package/dist/lib/launch/config-writes.js.map +1 -1
- package/dist/lib/launch/continue-state.d.ts +41 -0
- package/dist/lib/launch/continue-state.d.ts.map +1 -0
- package/dist/lib/launch/continue-state.js +142 -0
- package/dist/lib/launch/continue-state.js.map +1 -0
- package/dist/lib/launch/detect.d.ts.map +1 -1
- package/dist/lib/launch/detect.js +5 -2
- package/dist/lib/launch/detect.js.map +1 -1
- package/dist/lib/launch/droid-state.d.ts +24 -0
- package/dist/lib/launch/droid-state.d.ts.map +1 -0
- package/dist/lib/launch/droid-state.js +74 -0
- package/dist/lib/launch/droid-state.js.map +1 -0
- package/dist/lib/launch/gemini-state.d.ts +26 -20
- package/dist/lib/launch/gemini-state.d.ts.map +1 -1
- package/dist/lib/launch/gemini-state.js +95 -37
- package/dist/lib/launch/gemini-state.js.map +1 -1
- package/dist/lib/launch/gemini-system-file.d.ts +17 -0
- package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
- package/dist/lib/launch/gemini-system-file.js +55 -0
- package/dist/lib/launch/gemini-system-file.js.map +1 -0
- package/dist/lib/launch/gemini-trust.d.ts +3 -1
- package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
- package/dist/lib/launch/gemini-trust.js +10 -3
- package/dist/lib/launch/gemini-trust.js.map +1 -1
- package/dist/lib/launch/goose-state.d.ts +53 -0
- package/dist/lib/launch/goose-state.d.ts.map +1 -0
- package/dist/lib/launch/goose-state.js +137 -0
- package/dist/lib/launch/goose-state.js.map +1 -0
- package/dist/lib/launch/grok-state.d.ts +42 -0
- package/dist/lib/launch/grok-state.d.ts.map +1 -0
- package/dist/lib/launch/grok-state.js +128 -0
- package/dist/lib/launch/grok-state.js.map +1 -0
- package/dist/lib/launch/kiro-state.d.ts +22 -0
- package/dist/lib/launch/kiro-state.d.ts.map +1 -0
- package/dist/lib/launch/kiro-state.js +59 -0
- package/dist/lib/launch/kiro-state.js.map +1 -0
- package/dist/lib/launch/launch-files.d.ts.map +1 -1
- package/dist/lib/launch/launch-files.js +3 -2
- package/dist/lib/launch/launch-files.js.map +1 -1
- package/dist/lib/launch/launch.d.ts +51 -2
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +70 -6
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/layer-files.d.ts +12 -0
- package/dist/lib/launch/layer-files.d.ts.map +1 -0
- package/dist/lib/launch/layer-files.js +43 -0
- package/dist/lib/launch/layer-files.js.map +1 -0
- package/dist/lib/launch/mcp-child-env.d.ts +30 -0
- package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
- package/dist/lib/launch/mcp-child-env.js +151 -0
- package/dist/lib/launch/mcp-child-env.js.map +1 -0
- package/dist/lib/launch/pick-agent.d.ts.map +1 -1
- package/dist/lib/launch/pick-agent.js +7 -6
- package/dist/lib/launch/pick-agent.js.map +1 -1
- package/dist/lib/launch/picker-options.d.ts.map +1 -1
- package/dist/lib/launch/picker-options.js +7 -2
- package/dist/lib/launch/picker-options.js.map +1 -1
- package/dist/lib/launch/qwen-state.d.ts +30 -0
- package/dist/lib/launch/qwen-state.d.ts.map +1 -0
- package/dist/lib/launch/qwen-state.js +57 -0
- package/dist/lib/launch/qwen-state.js.map +1 -0
- package/dist/lib/launch/qwen-trust.d.ts +24 -0
- package/dist/lib/launch/qwen-trust.d.ts.map +1 -0
- package/dist/lib/launch/qwen-trust.js +100 -0
- package/dist/lib/launch/qwen-trust.js.map +1 -0
- package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
- package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/aider.js +13 -0
- package/dist/lib/launch/registry/agents/aider.js.map +1 -0
- package/dist/lib/launch/registry/agents/amp.d.ts +3 -0
- package/dist/lib/launch/registry/agents/amp.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/amp.js +14 -0
- package/dist/lib/launch/registry/agents/amp.js.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.js +11 -0
- package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
- package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
- package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/cline.js +19 -0
- package/dist/lib/launch/registry/agents/cline.js.map +1 -0
- package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
- package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/continue.js +20 -0
- package/dist/lib/launch/registry/agents/continue.js.map +1 -0
- package/dist/lib/launch/registry/agents/droid.d.ts +3 -0
- package/dist/lib/launch/registry/agents/droid.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/droid.js +13 -0
- package/dist/lib/launch/registry/agents/droid.js.map +1 -0
- package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
- package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
- package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
- package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/goose.js +20 -0
- package/dist/lib/launch/registry/agents/goose.js.map +1 -0
- package/dist/lib/launch/registry/agents/grok-build.d.ts +3 -0
- package/dist/lib/launch/registry/agents/grok-build.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/grok-build.js +14 -0
- package/dist/lib/launch/registry/agents/grok-build.js.map +1 -0
- package/dist/lib/launch/registry/agents/kiro.d.ts +3 -0
- package/dist/lib/launch/registry/agents/kiro.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/kiro.js +11 -0
- package/dist/lib/launch/registry/agents/kiro.js.map +1 -0
- package/dist/lib/launch/registry/agents/qwen.d.ts +3 -0
- package/dist/lib/launch/registry/agents/qwen.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/qwen.js +11 -0
- package/dist/lib/launch/registry/agents/qwen.js.map +1 -0
- package/dist/lib/launch/registry/index.d.ts +4 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +15 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +17 -1
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.d.ts +11 -0
- package/dist/lib/launch/run-agent.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.js +22 -1
- package/dist/lib/launch/run-agent.js.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +22 -2
- package/dist/lib/launch/strict-entry.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.js +82 -2
- package/dist/lib/launch/strict-entry.js.map +1 -1
- package/dist/lib/launch/yaml-scan.d.ts +59 -0
- package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
- package/dist/lib/launch/yaml-scan.js +275 -0
- package/dist/lib/launch/yaml-scan.js.map +1 -0
- package/dist/lib/llm-providers.d.ts +66 -0
- package/dist/lib/llm-providers.d.ts.map +1 -0
- package/dist/lib/llm-providers.js +150 -0
- package/dist/lib/llm-providers.js.map +1 -0
- package/dist/lib/local-db-epoch.d.ts +4 -0
- package/dist/lib/local-db-epoch.d.ts.map +1 -0
- package/dist/lib/local-db-epoch.js +19 -0
- package/dist/lib/local-db-epoch.js.map +1 -0
- package/dist/lib/local-db-migrate.d.ts +85 -0
- package/dist/lib/local-db-migrate.d.ts.map +1 -0
- package/dist/lib/local-db-migrate.js +484 -0
- package/dist/lib/local-db-migrate.js.map +1 -0
- package/dist/lib/local-db-v10.d.ts +28 -0
- package/dist/lib/local-db-v10.d.ts.map +1 -0
- package/dist/lib/local-db-v10.js +49 -0
- package/dist/lib/local-db-v10.js.map +1 -0
- package/dist/lib/local-db-v11.d.ts +24 -0
- package/dist/lib/local-db-v11.d.ts.map +1 -0
- package/dist/lib/local-db-v11.js +25 -0
- package/dist/lib/local-db-v11.js.map +1 -0
- package/dist/lib/local-db-v7.d.ts +30 -0
- package/dist/lib/local-db-v7.d.ts.map +1 -0
- package/dist/lib/local-db-v7.js +285 -0
- package/dist/lib/local-db-v7.js.map +1 -0
- package/dist/lib/local-db-v8.d.ts +22 -0
- package/dist/lib/local-db-v8.d.ts.map +1 -0
- package/dist/lib/local-db-v8.js +33 -0
- package/dist/lib/local-db-v8.js.map +1 -0
- package/dist/lib/local-db-v9.d.ts +10 -0
- package/dist/lib/local-db-v9.d.ts.map +1 -0
- package/dist/lib/local-db-v9.js +8 -0
- package/dist/lib/local-db-v9.js.map +1 -0
- package/dist/lib/local-db.d.ts +61 -11
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +186 -371
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-embeddings.d.ts.map +1 -1
- package/dist/lib/local-embeddings.js +2 -2
- package/dist/lib/local-embeddings.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +30 -87
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +182 -171
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +129 -0
- package/dist/lib/local-ingest.d.ts.map +1 -0
- package/dist/lib/local-ingest.js +81 -0
- package/dist/lib/local-ingest.js.map +1 -0
- package/dist/lib/local-link-pass.d.ts +15 -0
- package/dist/lib/local-link-pass.d.ts.map +1 -0
- package/dist/lib/local-link-pass.js +61 -0
- package/dist/lib/local-link-pass.js.map +1 -0
- package/dist/lib/local-llm.d.ts +63 -12
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +229 -104
- package/dist/lib/local-llm.js.map +1 -1
- package/dist/lib/local-mode.d.ts +4 -1
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +16 -1
- package/dist/lib/local-mode.js.map +1 -1
- package/dist/lib/local-provenance.d.ts +14 -0
- package/dist/lib/local-provenance.d.ts.map +1 -0
- package/dist/lib/local-provenance.js +14 -0
- package/dist/lib/local-provenance.js.map +1 -0
- package/dist/lib/local-thresholds.d.ts +70 -0
- package/dist/lib/local-thresholds.d.ts.map +1 -0
- package/dist/lib/local-thresholds.js +79 -0
- package/dist/lib/local-thresholds.js.map +1 -0
- package/dist/lib/mcp/mark-tool.d.ts +27 -0
- package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
- package/dist/lib/mcp/mark-tool.js +103 -0
- package/dist/lib/mcp/mark-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +46 -0
- package/dist/lib/mcp/share-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-tool.js +68 -0
- package/dist/lib/mcp/share-tool.js.map +1 -0
- package/dist/lib/mcp/tool-rules.d.ts +30 -0
- package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
- package/dist/lib/mcp/tool-rules.js +84 -0
- package/dist/lib/mcp/tool-rules.js.map +1 -0
- package/dist/lib/mcp-backfill.d.ts +89 -0
- package/dist/lib/mcp-backfill.d.ts.map +1 -0
- package/dist/lib/mcp-backfill.js +194 -0
- package/dist/lib/mcp-backfill.js.map +1 -0
- package/dist/lib/mcp-scope.d.ts +90 -0
- package/dist/lib/mcp-scope.d.ts.map +1 -0
- package/dist/lib/mcp-scope.js +125 -0
- package/dist/lib/mcp-scope.js.map +1 -0
- package/dist/lib/mcp-sync.d.ts +64 -0
- package/dist/lib/mcp-sync.d.ts.map +1 -0
- package/dist/lib/mcp-sync.js +183 -0
- package/dist/lib/mcp-sync.js.map +1 -0
- package/dist/lib/personal-import.d.ts +7 -0
- package/dist/lib/personal-import.d.ts.map +1 -1
- package/dist/lib/personal-import.js +13 -1
- package/dist/lib/personal-import.js.map +1 -1
- package/dist/lib/safe-config-write.d.ts +12 -1
- package/dist/lib/safe-config-write.d.ts.map +1 -1
- package/dist/lib/safe-config-write.js +162 -9
- package/dist/lib/safe-config-write.js.map +1 -1
- package/dist/lib/scope-choices.d.ts +51 -0
- package/dist/lib/scope-choices.d.ts.map +1 -0
- package/dist/lib/scope-choices.js +193 -0
- package/dist/lib/scope-choices.js.map +1 -0
- package/dist/lib/scope-connect.d.ts +82 -0
- package/dist/lib/scope-connect.d.ts.map +1 -0
- package/dist/lib/scope-connect.js +258 -0
- package/dist/lib/scope-connect.js.map +1 -0
- package/dist/lib/scope-defaults.d.ts +3 -0
- package/dist/lib/scope-defaults.d.ts.map +1 -0
- package/dist/lib/scope-defaults.js +42 -0
- package/dist/lib/scope-defaults.js.map +1 -0
- package/dist/lib/scope-real.d.ts +223 -0
- package/dist/lib/scope-real.d.ts.map +1 -0
- package/dist/lib/scope-real.js +58 -0
- package/dist/lib/scope-real.js.map +1 -0
- package/dist/lib/scope-values.d.ts +76 -0
- package/dist/lib/scope-values.d.ts.map +1 -0
- package/dist/lib/scope-values.js +169 -0
- package/dist/lib/scope-values.js.map +1 -0
- package/dist/lib/scope.d.ts +161 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +323 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/share/command.d.ts +32 -0
- package/dist/lib/share/command.d.ts.map +1 -0
- package/dist/lib/share/command.js +136 -0
- package/dist/lib/share/command.js.map +1 -0
- package/dist/lib/share/ledger.d.ts +59 -0
- package/dist/lib/share/ledger.d.ts.map +1 -0
- package/dist/lib/share/ledger.js +135 -0
- package/dist/lib/share/ledger.js.map +1 -0
- package/dist/lib/share/payload.d.ts +92 -0
- package/dist/lib/share/payload.d.ts.map +1 -0
- package/dist/lib/share/payload.js +138 -0
- package/dist/lib/share/payload.js.map +1 -0
- package/dist/lib/share/pending.d.ts +48 -0
- package/dist/lib/share/pending.d.ts.map +1 -0
- package/dist/lib/share/pending.js +130 -0
- package/dist/lib/share/pending.js.map +1 -0
- package/dist/lib/share/preview.d.ts +18 -0
- package/dist/lib/share/preview.d.ts.map +1 -0
- package/dist/lib/share/preview.js +72 -0
- package/dist/lib/share/preview.js.map +1 -0
- package/dist/lib/share/run.d.ts +115 -0
- package/dist/lib/share/run.d.ts.map +1 -0
- package/dist/lib/share/run.js +261 -0
- package/dist/lib/share/run.js.map +1 -0
- package/dist/lib/share/salt.d.ts +2 -0
- package/dist/lib/share/salt.d.ts.map +1 -0
- package/dist/lib/share/salt.js +44 -0
- package/dist/lib/share/salt.js.map +1 -0
- package/dist/lib/share/secret-patterns.json +100 -0
- package/dist/lib/share/secret-scan.d.ts +19 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -0
- package/dist/lib/share/secret-scan.js +75 -0
- package/dist/lib/share/secret-scan.js.map +1 -0
- package/dist/lib/share/tty.d.ts +4 -0
- package/dist/lib/share/tty.d.ts.map +1 -0
- package/dist/lib/share/tty.js +57 -0
- package/dist/lib/share/tty.js.map +1 -0
- package/dist/lib/share/visible.d.ts +4 -0
- package/dist/lib/share/visible.d.ts.map +1 -0
- package/dist/lib/share/visible.js +30 -0
- package/dist/lib/share/visible.js.map +1 -0
- package/dist/lib/share/wire.d.ts +98 -0
- package/dist/lib/share/wire.d.ts.map +1 -0
- package/dist/lib/share/wire.js +43 -0
- package/dist/lib/share/wire.js.map +1 -0
- package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
- package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
- package/dist/lib/similarity/embedding-matrix.js +119 -0
- package/dist/lib/similarity/embedding-matrix.js.map +1 -0
- package/dist/lib/since-flag.d.ts +11 -0
- package/dist/lib/since-flag.d.ts.map +1 -0
- package/dist/lib/since-flag.js +24 -0
- package/dist/lib/since-flag.js.map +1 -0
- package/dist/lib/since.d.ts +59 -0
- package/dist/lib/since.d.ts.map +1 -0
- package/dist/lib/since.js +86 -0
- package/dist/lib/since.js.map +1 -0
- package/dist/lib/source-key.d.ts +13 -0
- package/dist/lib/source-key.d.ts.map +1 -0
- package/dist/lib/source-key.js +60 -0
- package/dist/lib/source-key.js.map +1 -0
- package/dist/lib/source-sync-state.d.ts +12 -0
- package/dist/lib/source-sync-state.d.ts.map +1 -0
- package/dist/lib/source-sync-state.js +43 -0
- package/dist/lib/source-sync-state.js.map +1 -0
- package/dist/lib/startup-backfill-track.d.ts +2 -0
- package/dist/lib/startup-backfill-track.d.ts.map +1 -0
- package/dist/lib/startup-backfill-track.js +6 -0
- package/dist/lib/startup-backfill-track.js.map +1 -0
- package/dist/lib/startup-env.d.ts +8 -0
- package/dist/lib/startup-env.d.ts.map +1 -0
- package/dist/lib/startup-env.js +8 -0
- package/dist/lib/startup-env.js.map +1 -0
- package/dist/lib/startup-xdg.d.ts +2 -0
- package/dist/lib/startup-xdg.d.ts.map +1 -0
- package/dist/lib/startup-xdg.js +9 -0
- package/dist/lib/startup-xdg.js.map +1 -0
- package/dist/lib/sync/after-connect.d.ts +2 -0
- package/dist/lib/sync/after-connect.d.ts.map +1 -0
- package/dist/lib/sync/after-connect.js +18 -0
- package/dist/lib/sync/after-connect.js.map +1 -0
- package/dist/lib/sync/bg-claim.d.ts +14 -0
- package/dist/lib/sync/bg-claim.d.ts.map +1 -0
- package/dist/lib/sync/bg-claim.js +97 -0
- package/dist/lib/sync/bg-claim.js.map +1 -0
- package/dist/lib/sync/blocked.d.ts +8 -0
- package/dist/lib/sync/blocked.d.ts.map +1 -0
- package/dist/lib/sync/blocked.js +44 -0
- package/dist/lib/sync/blocked.js.map +1 -0
- package/dist/lib/sync/classify.d.ts +34 -0
- package/dist/lib/sync/classify.d.ts.map +1 -0
- package/dist/lib/sync/classify.js +91 -0
- package/dist/lib/sync/classify.js.map +1 -0
- package/dist/lib/sync/drain.d.ts +16 -0
- package/dist/lib/sync/drain.d.ts.map +1 -0
- package/dist/lib/sync/drain.js +33 -0
- package/dist/lib/sync/drain.js.map +1 -0
- package/dist/lib/sync/forget.d.ts +12 -0
- package/dist/lib/sync/forget.d.ts.map +1 -0
- package/dist/lib/sync/forget.js +32 -0
- package/dist/lib/sync/forget.js.map +1 -0
- package/dist/lib/sync/launch-hook.d.ts +42 -0
- package/dist/lib/sync/launch-hook.d.ts.map +1 -0
- package/dist/lib/sync/launch-hook.js +117 -0
- package/dist/lib/sync/launch-hook.js.map +1 -0
- package/dist/lib/sync/lock.d.ts +35 -0
- package/dist/lib/sync/lock.d.ts.map +1 -0
- package/dist/lib/sync/lock.js +175 -0
- package/dist/lib/sync/lock.js.map +1 -0
- package/dist/lib/sync/purge.d.ts +38 -0
- package/dist/lib/sync/purge.d.ts.map +1 -0
- package/dist/lib/sync/purge.js +61 -0
- package/dist/lib/sync/purge.js.map +1 -0
- package/dist/lib/sync/real-env.d.ts +208 -0
- package/dist/lib/sync/real-env.d.ts.map +1 -0
- package/dist/lib/sync/real-env.js +47 -0
- package/dist/lib/sync/real-env.js.map +1 -0
- package/dist/lib/sync/relink.d.ts +14 -0
- package/dist/lib/sync/relink.d.ts.map +1 -0
- package/dist/lib/sync/relink.js +36 -0
- package/dist/lib/sync/relink.js.map +1 -0
- package/dist/lib/sync/report.d.ts +3 -0
- package/dist/lib/sync/report.d.ts.map +1 -0
- package/dist/lib/sync/report.js +54 -0
- package/dist/lib/sync/report.js.map +1 -0
- package/dist/lib/sync/run-all.d.ts +23 -0
- package/dist/lib/sync/run-all.d.ts.map +1 -0
- package/dist/lib/sync/run-all.js +30 -0
- package/dist/lib/sync/run-all.js.map +1 -0
- package/dist/lib/sync/run-source.d.ts +73 -0
- package/dist/lib/sync/run-source.d.ts.map +1 -0
- package/dist/lib/sync/run-source.js +262 -0
- package/dist/lib/sync/run-source.js.map +1 -0
- package/dist/lib/sync/safe-read.d.ts +4 -0
- package/dist/lib/sync/safe-read.d.ts.map +1 -0
- package/dist/lib/sync/safe-read.js +40 -0
- package/dist/lib/sync/safe-read.js.map +1 -0
- package/dist/lib/sync/should-background-sync.d.ts +31 -0
- package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
- package/dist/lib/sync/should-background-sync.js +69 -0
- package/dist/lib/sync/should-background-sync.js.map +1 -0
- package/dist/lib/sync/source-ids.d.ts +10 -0
- package/dist/lib/sync/source-ids.d.ts.map +1 -0
- package/dist/lib/sync/source-ids.js +9 -0
- package/dist/lib/sync/source-ids.js.map +1 -0
- package/dist/lib/sync/sources.d.ts +33 -0
- package/dist/lib/sync/sources.d.ts.map +1 -0
- package/dist/lib/sync/sources.js +37 -0
- package/dist/lib/sync/sources.js.map +1 -0
- package/dist/lib/sync/spawn-background.d.ts +27 -0
- package/dist/lib/sync/spawn-background.d.ts.map +1 -0
- package/dist/lib/sync/spawn-background.js +66 -0
- package/dist/lib/sync/spawn-background.js.map +1 -0
- package/dist/lib/sync/status.d.ts +57 -0
- package/dist/lib/sync/status.d.ts.map +1 -0
- package/dist/lib/sync/status.js +166 -0
- package/dist/lib/sync/status.js.map +1 -0
- package/dist/lib/sync/summary-read.d.ts +19 -0
- package/dist/lib/sync/summary-read.d.ts.map +1 -0
- package/dist/lib/sync/summary-read.js +39 -0
- package/dist/lib/sync/summary-read.js.map +1 -0
- package/dist/lib/sync/summary.d.ts +10 -0
- package/dist/lib/sync/summary.d.ts.map +1 -0
- package/dist/lib/sync/summary.js +80 -0
- package/dist/lib/sync/summary.js.map +1 -0
- package/dist/lib/sync/sync-state.d.ts +128 -0
- package/dist/lib/sync/sync-state.d.ts.map +1 -0
- package/dist/lib/sync/sync-state.js +253 -0
- package/dist/lib/sync/sync-state.js.map +1 -0
- package/dist/lib/sync/telemetry.d.ts +20 -0
- package/dist/lib/sync/telemetry.d.ts.map +1 -0
- package/dist/lib/sync/telemetry.js +31 -0
- package/dist/lib/sync/telemetry.js.map +1 -0
- package/dist/lib/sync/threads.d.ts +48 -0
- package/dist/lib/sync/threads.d.ts.map +1 -0
- package/dist/lib/sync/threads.js +82 -0
- package/dist/lib/sync/threads.js.map +1 -0
- package/dist/lib/sync/window.d.ts +72 -0
- package/dist/lib/sync/window.d.ts.map +1 -0
- package/dist/lib/sync/window.js +112 -0
- package/dist/lib/sync/window.js.map +1 -0
- package/dist/lib/team-cta.d.ts +11 -0
- package/dist/lib/team-cta.d.ts.map +1 -0
- package/dist/lib/team-cta.js +16 -0
- package/dist/lib/team-cta.js.map +1 -0
- package/dist/lib/telemetry-ci.d.ts +2 -0
- package/dist/lib/telemetry-ci.d.ts.map +1 -0
- package/dist/lib/telemetry-ci.js +21 -0
- package/dist/lib/telemetry-ci.js.map +1 -0
- package/dist/lib/telemetry-consent.d.ts +44 -23
- package/dist/lib/telemetry-consent.d.ts.map +1 -1
- package/dist/lib/telemetry-consent.js +74 -35
- package/dist/lib/telemetry-consent.js.map +1 -1
- package/dist/lib/telemetry-env.d.ts +1 -1
- package/dist/lib/usage-telemetry.d.ts +87 -22
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +263 -74
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/dist/lib/xdg.d.ts +27 -0
- package/dist/lib/xdg.d.ts.map +1 -0
- package/dist/lib/xdg.js +56 -0
- package/dist/lib/xdg.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -98
- package/dist/commands/push.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3: the MCP tool `align_backfill({ source, since })` - read more history from a source the
|
|
3
|
+
* user already connected.
|
|
4
|
+
*
|
|
5
|
+
* What it does, and what it cannot:
|
|
6
|
+
* - A connected, healthy source: record the window in `source_sync` and start the SAME command
|
|
7
|
+
* a person would type (`align connect --env local --source <id> --since <when> --yes --json`) as a
|
|
8
|
+
* detached child (Decision 9). A tool call never runs a bulk fetch in the MCP server's own
|
|
9
|
+
* process, and it returns inside journey 5's 500 ms.
|
|
10
|
+
* - Not connected, or waiting on re-authentication: start nothing and return the exact command
|
|
11
|
+
* for the human. Connecting, re-authenticating and every token or key stay with the person
|
|
12
|
+
* (Decision 16): the input schema is closed, so a `token` property is refused before anything
|
|
13
|
+
* else happens, and no credential is ever read into, echoed by, or passed on argv from here.
|
|
14
|
+
* - It never classifies. `align connect` imports with the classifier off (L1); this adds no
|
|
15
|
+
* other path.
|
|
16
|
+
*
|
|
17
|
+
* Children are capped (one per source, three in all; backfill-state.ts) and leave a status file
|
|
18
|
+
* under the state directory, so none is silently orphaned and `align_sync` (L5) can find them.
|
|
19
|
+
* "Started" is claimed only after the OS confirmed the child, and the window is recorded after.
|
|
20
|
+
*
|
|
21
|
+
* Not here yet (L5): the `align sync --background` child, the lock and the watermark. Until then
|
|
22
|
+
* the child is `align connect --env local`. The import is an upsert, so an overlap costs time and
|
|
23
|
+
* never duplicates a row.
|
|
24
|
+
*/
|
|
25
|
+
import { type BackfillStatus, type Reservation } from './backfill-state.js';
|
|
26
|
+
import type { EnvironmentConfig } from './config.js';
|
|
27
|
+
export declare const BACKFILL_TOOL = "align_backfill";
|
|
28
|
+
/** The sources `align connect --source` takes (the paste-token ones). Equal to
|
|
29
|
+
* `localConnectorIds()` by test; spelled here so the MCP server does not import setup.ts. */
|
|
30
|
+
export declare const BACKFILL_SOURCES: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion"];
|
|
31
|
+
/** The tool as `tools/list` publishes it. Closed (`additionalProperties: false`) so a client that
|
|
32
|
+
* validates sees no place to put a secret, and runBackfill refuses one regardless. A write: it
|
|
33
|
+
* records a window and starts an import (mcp-tool-annotations.test.ts). */
|
|
34
|
+
export declare const BACKFILL_TOOL_SCHEMA: {
|
|
35
|
+
readonly name: "align_backfill";
|
|
36
|
+
readonly annotations: {
|
|
37
|
+
readonly readOnlyHint: false;
|
|
38
|
+
readonly destructiveHint: false;
|
|
39
|
+
};
|
|
40
|
+
readonly description: string;
|
|
41
|
+
readonly inputSchema: {
|
|
42
|
+
readonly type: "object";
|
|
43
|
+
readonly properties: {
|
|
44
|
+
readonly source: {
|
|
45
|
+
readonly type: "string";
|
|
46
|
+
readonly enum: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion"];
|
|
47
|
+
readonly description: "Which connected source to read from";
|
|
48
|
+
};
|
|
49
|
+
readonly since: {
|
|
50
|
+
readonly type: "string";
|
|
51
|
+
readonly description: "How far back: 30d, 2w, 6m, 1y or all. Default 180 days. A ceiling per source still applies";
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
readonly required: readonly ["source"];
|
|
55
|
+
readonly additionalProperties: false;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export interface BackfillDeps {
|
|
59
|
+
now(): Date;
|
|
60
|
+
isConnected(source: string): boolean;
|
|
61
|
+
needsReauth(source: string): boolean;
|
|
62
|
+
/** Is a `align sync` of this source running? The two read and write the same history, so one waits for the other. */
|
|
63
|
+
syncRunning?(source: string): boolean;
|
|
64
|
+
recordWindow(source: string, since: string | null, agent: string): void;
|
|
65
|
+
/** Take a slot SYNCHRONOUSLY (check and take in one tick, no await): MCP does not queue requests,
|
|
66
|
+
* so parallel calls would otherwise all pass the cap. Released when the child is confirmed
|
|
67
|
+
* (its status file then holds the slot) or has failed to start. */
|
|
68
|
+
reserve(source: string): Reservation;
|
|
69
|
+
/** How the previous backfill of this source ended, if it left a status file. */
|
|
70
|
+
lastRun(source: string): BackfillStatus | null;
|
|
71
|
+
/** Start `align <argv>` detached and wait briefly for the OS to confirm it exists. */
|
|
72
|
+
start(source: string, argv: string[]): Promise<{
|
|
73
|
+
ok: boolean;
|
|
74
|
+
pid?: number;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
export interface BackfillResult {
|
|
78
|
+
started: boolean;
|
|
79
|
+
text: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The child's arguments. `--env local` is not optional: for a logged-in user the default env is
|
|
83
|
+
* hosted, where `align connect --since` is refused with exit 2 (the hosted scan takes --from/--to)
|
|
84
|
+
* and, with stdio ignored, nobody would hear. check.ts spawns its child the same way (--env).
|
|
85
|
+
*/
|
|
86
|
+
export declare function backfillArgv(source: string, sinceArg: string): string[];
|
|
87
|
+
export declare function defaultBackfillDeps(env: EnvironmentConfig): BackfillDeps;
|
|
88
|
+
export declare function runBackfill(args: Record<string, unknown> | undefined, env: EnvironmentConfig, injected?: BackfillDeps): Promise<BackfillResult>;
|
|
89
|
+
//# sourceMappingURL=mcp-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-backfill.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAe,KAAK,cAAc,EAAc,KAAK,WAAW,EAA+C,MAAM,qBAAqB,CAAC;AAClJ,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AASrD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C;8FAC8F;AAC9F,eAAO,MAAM,gBAAgB,2FAAgB,CAAC;AAO9C;;4EAE4E;AAC5E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;CAiBvB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,GAAG,IAAI,IAAI,CAAC;IACZ,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,qHAAqH;IACrH,WAAW,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxE;;wEAEoE;IACpE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IACrC,gFAAgF;IAChF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAC/C,sFAAsF;IACtF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,YAAY,CA2BxE;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,GAAG,EAAE,iBAAiB,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,cAAc,CAAC,CAuGzB"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3: the MCP tool `align_backfill({ source, since })` - read more history from a source the
|
|
3
|
+
* user already connected.
|
|
4
|
+
*
|
|
5
|
+
* What it does, and what it cannot:
|
|
6
|
+
* - A connected, healthy source: record the window in `source_sync` and start the SAME command
|
|
7
|
+
* a person would type (`align connect --env local --source <id> --since <when> --yes --json`) as a
|
|
8
|
+
* detached child (Decision 9). A tool call never runs a bulk fetch in the MCP server's own
|
|
9
|
+
* process, and it returns inside journey 5's 500 ms.
|
|
10
|
+
* - Not connected, or waiting on re-authentication: start nothing and return the exact command
|
|
11
|
+
* for the human. Connecting, re-authenticating and every token or key stay with the person
|
|
12
|
+
* (Decision 16): the input schema is closed, so a `token` property is refused before anything
|
|
13
|
+
* else happens, and no credential is ever read into, echoed by, or passed on argv from here.
|
|
14
|
+
* - It never classifies. `align connect` imports with the classifier off (L1); this adds no
|
|
15
|
+
* other path.
|
|
16
|
+
*
|
|
17
|
+
* Children are capped (one per source, three in all; backfill-state.ts) and leave a status file
|
|
18
|
+
* under the state directory, so none is silently orphaned and `align_sync` (L5) can find them.
|
|
19
|
+
* "Started" is claimed only after the OS confirmed the child, and the window is recorded after.
|
|
20
|
+
*
|
|
21
|
+
* Not here yet (L5): the `align sync --background` child, the lock and the watermark. Until then
|
|
22
|
+
* the child is `align connect --env local`. The import is an upsert, so an overlap costs time and
|
|
23
|
+
* never duplicates a row.
|
|
24
|
+
*/
|
|
25
|
+
import { backfillDir, readStatus, reserveSlot, startBackfillChild, statusPath } from './backfill-state.js';
|
|
26
|
+
import { createConfigStore } from './config.js';
|
|
27
|
+
import { SYNC_CEILINGS, SYNC_WINDOW_DEFAULT_DAYS } from './import-defaults.js';
|
|
28
|
+
import { parseSince } from './since.js';
|
|
29
|
+
import { lockHolder } from './sync/lock.js';
|
|
30
|
+
import { KNOWN_SOURCES } from './sync/source-ids.js';
|
|
31
|
+
import { syncChildEnv } from './sync/spawn-background.js';
|
|
32
|
+
import { readSyncStatus, recordWindowSince } from './source-sync-state.js';
|
|
33
|
+
export const BACKFILL_TOOL = 'align_backfill';
|
|
34
|
+
/** The sources `align connect --source` takes (the paste-token ones). Equal to
|
|
35
|
+
* `localConnectorIds()` by test; spelled here so the MCP server does not import setup.ts. */
|
|
36
|
+
export const BACKFILL_SOURCES = KNOWN_SOURCES;
|
|
37
|
+
/** Attribution until LM maps the MCP client's `clientInfo.name` onto the registry's closed list.
|
|
38
|
+
* The closed value, never a free-text client name (Decision 16). */
|
|
39
|
+
const UNKNOWN_AGENT = 'unknown';
|
|
40
|
+
/** The tool as `tools/list` publishes it. Closed (`additionalProperties: false`) so a client that
|
|
41
|
+
* validates sees no place to put a secret, and runBackfill refuses one regardless. A write: it
|
|
42
|
+
* records a window and starts an import (mcp-tool-annotations.test.ts). */
|
|
43
|
+
export const BACKFILL_TOOL_SCHEMA = {
|
|
44
|
+
name: BACKFILL_TOOL,
|
|
45
|
+
annotations: { readOnlyHint: false, destructiveHint: false },
|
|
46
|
+
description: 'Import more history from a source the user has ALREADY connected (for example the last year of GitHub PRs) into the local graph on this machine. ' +
|
|
47
|
+
'Offer it when the user asks for older context than the graph holds. It runs in the background, only reads from the source, and makes no LLM calls. ' +
|
|
48
|
+
'It never takes a token or key: if the source is not connected, or its saved token was refused, nothing starts and the reply gives the exact `align connect <source>` command for the user to run themselves. ' +
|
|
49
|
+
'Do not ask the user to paste a token into the chat.',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
source: { type: 'string', enum: [...BACKFILL_SOURCES], description: 'Which connected source to read from' },
|
|
54
|
+
since: { type: 'string', description: 'How far back: 30d, 2w, 6m, 1y or all. Default 180 days. A ceiling per source still applies' },
|
|
55
|
+
},
|
|
56
|
+
required: ['source'],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* The child's arguments. `--env local` is not optional: for a logged-in user the default env is
|
|
62
|
+
* hosted, where `align connect --since` is refused with exit 2 (the hosted scan takes --from/--to)
|
|
63
|
+
* and, with stdio ignored, nobody would hear. check.ts spawns its child the same way (--env).
|
|
64
|
+
*/
|
|
65
|
+
export function backfillArgv(source, sinceArg) {
|
|
66
|
+
return ['connect', '--env', 'local', '--source', source, '--since', sinceArg, '--yes', '--json'];
|
|
67
|
+
}
|
|
68
|
+
export function defaultBackfillDeps(env) {
|
|
69
|
+
const config = createConfigStore();
|
|
70
|
+
const dbPath = env.localDbPath;
|
|
71
|
+
const need = () => {
|
|
72
|
+
if (!dbPath)
|
|
73
|
+
throw new Error('align_backfill needs the local graph path, and this server has none configured.');
|
|
74
|
+
return dbPath;
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
now: () => new Date(),
|
|
78
|
+
isConnected: (source) => Boolean(config.getConnectorFields('local', source)?.['token']),
|
|
79
|
+
needsReauth: (source) => readSyncStatus(need(), source).needsReauth,
|
|
80
|
+
syncRunning: (source) => lockHolder(`sync-${source}`) !== undefined,
|
|
81
|
+
recordWindow: (source, since, agent) => recordWindowSince(need(), source, since, agent),
|
|
82
|
+
reserve: (source) => {
|
|
83
|
+
const dir = backfillDir();
|
|
84
|
+
return dir ? reserveSlot(dir, source) : { ok: false, reason: 'state', running: [] };
|
|
85
|
+
},
|
|
86
|
+
lastRun: (source) => {
|
|
87
|
+
const dir = backfillDir();
|
|
88
|
+
return dir ? readStatus(statusPath(dir, source)) : null;
|
|
89
|
+
},
|
|
90
|
+
start: async (source, argv) => {
|
|
91
|
+
const dir = backfillDir();
|
|
92
|
+
if (!dir)
|
|
93
|
+
return { ok: false };
|
|
94
|
+
return startBackfillChild(source, argv, statusPath(dir, source), undefined, 'mcp', syncChildEnv(process.env));
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export async function runBackfill(args, env, injected) {
|
|
99
|
+
const input = args ?? {};
|
|
100
|
+
const unknownKeys = Object.keys(input).filter((k) => k !== 'source' && k !== 'since');
|
|
101
|
+
if (unknownKeys.length) {
|
|
102
|
+
// Names the keys, never their values: a rejected token must not be echoed back into the
|
|
103
|
+
// transcript it was typed into.
|
|
104
|
+
const names = unknownKeys.slice(0, 3).map((k) => JSON.stringify(k.slice(0, 16))).join(', ');
|
|
105
|
+
throw new Error(`${BACKFILL_TOOL} takes only "source" and "since", and does not accept ${names}. ` +
|
|
106
|
+
'It never accepts a token or key: the person connects a source themselves with `align connect <source>`.');
|
|
107
|
+
}
|
|
108
|
+
const source = input['source'];
|
|
109
|
+
if (typeof source !== 'string' || !BACKFILL_SOURCES.includes(source)) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
// The value is never echoed: a token pasted into the wrong field fits any slice.
|
|
112
|
+
`${BACKFILL_TOOL} requires "source", one of: ${BACKFILL_SOURCES.join(', ')}. Call it again with one of those.`);
|
|
113
|
+
}
|
|
114
|
+
if (env.mode !== 'local-embedded') {
|
|
115
|
+
throw new Error(`${BACKFILL_TOOL} fills the local graph on this machine, and this server reads a hosted Align graph. ` +
|
|
116
|
+
'Use the local Align server (align mcp --env local), or run the hosted scan with align connect --all.');
|
|
117
|
+
}
|
|
118
|
+
const rawSince = input['since'];
|
|
119
|
+
if (rawSince !== undefined && typeof rawSince !== 'string')
|
|
120
|
+
throw new Error(`${BACKFILL_TOOL}: "since" must be a string such as 6m or 1y.`);
|
|
121
|
+
// Built only now, after every check that needs no config: a refused call opens nothing.
|
|
122
|
+
const deps = injected ?? defaultBackfillDeps(env);
|
|
123
|
+
const now = deps.now();
|
|
124
|
+
const window = parseSince(rawSince, now); // throws SinceError naming the accepted forms
|
|
125
|
+
const sinceArg = rawSince === undefined ? `${SYNC_WINDOW_DEFAULT_DAYS}d` : rawSince.trim().toLowerCase();
|
|
126
|
+
// How the previous run of this source ended, said first: a dead token ended "done" would hide it.
|
|
127
|
+
const prev = deps.lastRun(source);
|
|
128
|
+
const say = (r) => prev?.state === 'failed' && prev.last_line ? { ...r, text: `Last run failed: ${prev.last_line}. ${r.text}` } : r;
|
|
129
|
+
const proceed = async () => {
|
|
130
|
+
if (!deps.isConnected(source)) {
|
|
131
|
+
return {
|
|
132
|
+
started: false,
|
|
133
|
+
text: `${source} is not connected, so nothing was started. Connecting needs a token only the person can supply. Ask them to run: align connect ${source}`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (source === 'teams') {
|
|
137
|
+
// Decision 21: a Graph token lasts about an hour, so a background child would hold a dead one.
|
|
138
|
+
return {
|
|
139
|
+
started: false,
|
|
140
|
+
text: `Teams tokens last about an hour, so a refresh is manual and nothing was started. Ask the person to run: align connect teams --since ${sinceArg}`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (deps.needsReauth(source)) {
|
|
144
|
+
return {
|
|
145
|
+
started: false,
|
|
146
|
+
text: `${source} needs the person to re-authenticate (the provider refused its saved token), so nothing was started. Ask them to run: align connect ${source}`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (deps.syncRunning?.(source)) {
|
|
150
|
+
return { started: false, text: `A sync of ${source} is running and reads the same history, so nothing new was started. Ask again when it has finished.` };
|
|
151
|
+
}
|
|
152
|
+
// Taken in this same synchronous stretch (nothing above awaits): five parallel calls cannot all pass.
|
|
153
|
+
const slot = deps.reserve(source);
|
|
154
|
+
if (!slot.ok) {
|
|
155
|
+
if (slot.reason === 'state') {
|
|
156
|
+
return { started: false, text: `The state directory for backfills could not be used safely, so nothing was started. The person can run it themselves: align connect ${source} --since ${sinceArg}` };
|
|
157
|
+
}
|
|
158
|
+
const names = [...new Set(slot.running.map((r) => r.source))].join(', ');
|
|
159
|
+
return {
|
|
160
|
+
started: false,
|
|
161
|
+
text: slot.reason === 'source'
|
|
162
|
+
? `A backfill for ${source} is already running${slot.running[0]?.pid ? ` (started ${slot.running[0].started_at.slice(0, 16).replace('T', ' ')} UTC)` : ''}, so nothing new was started. It only reads and makes no LLM calls; ask again when it has finished.`
|
|
163
|
+
: `${slot.running.length} backfills are already running (${names}), which is the most at once, so nothing new was started. Ask again when one has finished.`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
let started;
|
|
167
|
+
try {
|
|
168
|
+
started = await deps.start(source, backfillArgv(source, sinceArg));
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
slot.release();
|
|
172
|
+
}
|
|
173
|
+
if (!started.ok) {
|
|
174
|
+
return {
|
|
175
|
+
started: false,
|
|
176
|
+
text: `The background process for ${source} could not start, so nothing was started. The person can run it themselves: align connect ${source} --since ${sinceArg}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Only now: the window is recorded for a child that exists.
|
|
180
|
+
deps.recordWindow(source, window.since ?? null, UNKNOWN_AGENT);
|
|
181
|
+
const reach = window.since === undefined
|
|
182
|
+
? `as far back as the ceiling allows (${SYNC_CEILINGS[source]} items)`
|
|
183
|
+
: `back to ${window.since.slice(0, 10)}`;
|
|
184
|
+
const scope = source === 'github'
|
|
185
|
+
? " Inside a repo it reads everyone's PRs and issues in that repo, as far as their access allows; elsewhere only the person's own."
|
|
186
|
+
: '';
|
|
187
|
+
return {
|
|
188
|
+
started: true,
|
|
189
|
+
text: `Backfill started for ${source} ${reach}. It runs in the background on this machine, only reads, and makes no LLM calls.${scope} New items appear in align_ask as they land.`,
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
return say(await proceed());
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=mcp-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-backfill.js","sourceRoot":"","sources":["../../src/lib/mcp-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L4: the MCP tool `align_scope({ action, source, ... })` - see, or change, what the sources the user already connected read.
|
|
3
|
+
*
|
|
4
|
+
* What it does, and what it cannot:
|
|
5
|
+
* - `view`: each connected source's scope (their own items, or everyone's in a named repo, project, team or space), with no network
|
|
6
|
+
* call and nothing secret.
|
|
7
|
+
* - `set`: changes the scope of a CONNECTED source through `setScope`, the same function `align connect --scope` ends in, so a
|
|
8
|
+
* change by an agent takes exactly the path a person's does. It records `via = 'mcp'` and the agent id on the scope's row, returns
|
|
9
|
+
* the plain-words disclosure and what widening costs (a new scope re-reads the window), and never deletes an item.
|
|
10
|
+
* - Listing choices (is this Jira project visible?) uses the saved token inside this process. The token never appears in a result.
|
|
11
|
+
* - Connecting, re-authenticating and every token or key stay with the person: the input schema is closed, so a `token` or `api_key`
|
|
12
|
+
* property is refused before anything runs, and the reply for an unconnected source is the `align connect <source>` command.
|
|
13
|
+
* - Zoom is only the user's own and says why. Slack, Notion and Teams already read all the token can see and have nothing to set.
|
|
14
|
+
*
|
|
15
|
+
* The server's `instructions` text is at its 2,048-byte budget, so the guidance for when to offer this tool lives here, in its description.
|
|
16
|
+
*/
|
|
17
|
+
import type { EnvironmentConfig } from './config.js';
|
|
18
|
+
import { type ScopeDeps } from './scope.js';
|
|
19
|
+
export declare const SCOPE_TOOL = "align_scope";
|
|
20
|
+
export declare const SCOPE_ACTIONS: readonly ["view", "set"];
|
|
21
|
+
/** Every source that can be connected, so Zoom gets its own honest refusal instead of "unknown source". */
|
|
22
|
+
export declare const SCOPE_SOURCES: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion", "zoom"];
|
|
23
|
+
export declare const SCOPE_TOOL_SCHEMA: {
|
|
24
|
+
readonly name: "align_scope";
|
|
25
|
+
readonly annotations: {
|
|
26
|
+
readonly readOnlyHint: false;
|
|
27
|
+
readonly destructiveHint: false;
|
|
28
|
+
};
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly inputSchema: {
|
|
31
|
+
readonly type: "object";
|
|
32
|
+
readonly properties: {
|
|
33
|
+
readonly action: {
|
|
34
|
+
readonly type: "string";
|
|
35
|
+
readonly enum: readonly ["view", "set"];
|
|
36
|
+
readonly description: "view: show the scopes. set: change one source's scope";
|
|
37
|
+
};
|
|
38
|
+
readonly source: {
|
|
39
|
+
readonly type: "string";
|
|
40
|
+
readonly enum: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion", "zoom"];
|
|
41
|
+
readonly description: "With \"set\": which connected source to change";
|
|
42
|
+
};
|
|
43
|
+
readonly scope: {
|
|
44
|
+
readonly type: "string";
|
|
45
|
+
readonly enum: readonly ["yours", "team"];
|
|
46
|
+
readonly description: "With \"set\": \"yours\" goes back to only the user's own items. \"team\" is implied by passing the source's value below";
|
|
47
|
+
};
|
|
48
|
+
readonly repo: {
|
|
49
|
+
readonly type: "string";
|
|
50
|
+
readonly description: "GitHub: the repo as owner/repo";
|
|
51
|
+
};
|
|
52
|
+
readonly projects: {
|
|
53
|
+
readonly type: "array";
|
|
54
|
+
readonly items: {
|
|
55
|
+
readonly type: "string";
|
|
56
|
+
};
|
|
57
|
+
readonly description: "Jira: project keys, for example [\"ALI\",\"OPS\"]";
|
|
58
|
+
};
|
|
59
|
+
readonly teams: {
|
|
60
|
+
readonly type: "array";
|
|
61
|
+
readonly items: {
|
|
62
|
+
readonly type: "string";
|
|
63
|
+
};
|
|
64
|
+
readonly description: "Linear: team keys, for example [\"ENG\"]";
|
|
65
|
+
};
|
|
66
|
+
readonly gitlab_project: {
|
|
67
|
+
readonly type: "string";
|
|
68
|
+
readonly description: "GitLab: the project id or group/project path";
|
|
69
|
+
};
|
|
70
|
+
readonly spaces: {
|
|
71
|
+
readonly type: "array";
|
|
72
|
+
readonly items: {
|
|
73
|
+
readonly type: "string";
|
|
74
|
+
};
|
|
75
|
+
readonly description: "Confluence: space keys, for example [\"ENG\"]";
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
readonly required: readonly ["action"];
|
|
79
|
+
readonly additionalProperties: false;
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
export interface ScopeToolResult {
|
|
83
|
+
text: string;
|
|
84
|
+
[k: string]: unknown;
|
|
85
|
+
}
|
|
86
|
+
export declare function defaultScopeToolDeps(env: EnvironmentConfig): ScopeDeps;
|
|
87
|
+
export declare function runScopeTool(args: Record<string, unknown> | undefined, env: EnvironmentConfig, injected?: ScopeDeps, o?: {
|
|
88
|
+
agent?: string;
|
|
89
|
+
}): Promise<ScopeToolResult>;
|
|
90
|
+
//# sourceMappingURL=mcp-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-scope.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAqD,MAAM,YAAY,CAAC;AAK/F,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC,eAAO,MAAM,aAAa,0BAA2B,CAAC;AACtD,2GAA2G;AAC3G,eAAO,MAAM,aAAa,mGAAoG,CAAC;AAM/H,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BpB,CAAC;AAEX,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAIvE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,SAAS,CAItE;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,GAAG,EAAE,iBAAiB,EACtB,QAAQ,CAAC,EAAE,SAAS,EACpB,CAAC,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzB,OAAO,CAAC,eAAe,CAAC,CAoB1B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ScopeRefusal, setScope, viewScopes } from './scope.js';
|
|
2
|
+
import { UNKNOWN_AGENT } from './mcp/tool-rules.js';
|
|
3
|
+
import { realScopeDeps } from './scope-real.js';
|
|
4
|
+
import { SCOPED_SOURCES } from './scope-values.js';
|
|
5
|
+
export const SCOPE_TOOL = 'align_scope';
|
|
6
|
+
export const SCOPE_ACTIONS = ['view', 'set'];
|
|
7
|
+
/** Every source that can be connected, so Zoom gets its own honest refusal instead of "unknown source". */
|
|
8
|
+
export const SCOPE_SOURCES = ['github', 'jira', 'confluence', 'slack', 'teams', 'gitlab', 'linear', 'notion', 'zoom'];
|
|
9
|
+
/** The one value property each source takes for a team scope. */
|
|
10
|
+
const VALUE_PROPERTY = { github: 'repo', jira: 'projects', linear: 'teams', gitlab: 'gitlab_project', confluence: 'spaces' };
|
|
11
|
+
const VALUE_PROPERTIES = Object.values(VALUE_PROPERTY);
|
|
12
|
+
export const SCOPE_TOOL_SCHEMA = {
|
|
13
|
+
name: SCOPE_TOOL,
|
|
14
|
+
annotations: { readOnlyHint: false, destructiveHint: false },
|
|
15
|
+
description: 'See, or change, what the sources the user has ALREADY connected read into the local graph on this machine: only their own items, or everyone\'s in one named GitHub repo, Jira project, Linear team, GitLab project or Confluence space that their token can see. ' +
|
|
16
|
+
'action "view" lists each connected source\'s scope (and any change waiting for the person); use it when asked what is read or why teammates\' items are missing. ' +
|
|
17
|
+
'action "set" changes one source; offer it when the user asks to include their team\'s items, or to go back to only their own. ' +
|
|
18
|
+
'Widening re-reads that source\'s history on its next sync (a few minutes; the reply says how far back). ' +
|
|
19
|
+
'It deletes nothing and reads other people\'s items onto this machine only. A team change you make WAITS: nothing reads it, in the background or via align_sync, until a person runs `align sync <source>` at a terminal, which shows what it reads and asks (default No). Tell them so, with the reply\'s disclosure sentence in your own words. That prompt is a speed bump, not proof of consent: an agent with shell access could answer it from a pseudo-terminal, and you must never do that. Narrowing to their own items is immediate. ' +
|
|
20
|
+
'Zoom is only the user\'s own; Slack, Notion and Teams already read all their token can see. ' +
|
|
21
|
+
'It never takes a token or key: for a source that is not connected, or whose saved token was refused, the reply gives the exact `align connect <source>` command for the user to run themselves. Do not ask the user to paste a token into the chat.',
|
|
22
|
+
inputSchema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
action: { type: 'string', enum: [...SCOPE_ACTIONS], description: 'view: show the scopes. set: change one source\'s scope' },
|
|
26
|
+
source: { type: 'string', enum: [...SCOPE_SOURCES], description: 'With "set": which connected source to change' },
|
|
27
|
+
scope: { type: 'string', enum: ['yours', 'team'], description: 'With "set": "yours" goes back to only the user\'s own items. "team" is implied by passing the source\'s value below' },
|
|
28
|
+
repo: { type: 'string', description: 'GitHub: the repo as owner/repo' },
|
|
29
|
+
projects: { type: 'array', items: { type: 'string' }, description: 'Jira: project keys, for example ["ALI","OPS"]' },
|
|
30
|
+
teams: { type: 'array', items: { type: 'string' }, description: 'Linear: team keys, for example ["ENG"]' },
|
|
31
|
+
gitlab_project: { type: 'string', description: 'GitLab: the project id or group/project path' },
|
|
32
|
+
spaces: { type: 'array', items: { type: 'string' }, description: 'Confluence: space keys, for example ["ENG"]' },
|
|
33
|
+
},
|
|
34
|
+
required: ['action'],
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const KNOWN = new Set(Object.keys(SCOPE_TOOL_SCHEMA.inputSchema.properties));
|
|
39
|
+
export function defaultScopeToolDeps(env) {
|
|
40
|
+
const dbPath = env.localDbPath;
|
|
41
|
+
if (!dbPath)
|
|
42
|
+
throw new Error(`${SCOPE_TOOL} needs the local graph path, and this server has none configured.`);
|
|
43
|
+
return realScopeDeps(dbPath);
|
|
44
|
+
}
|
|
45
|
+
export async function runScopeTool(args, env, injected, o = {}) {
|
|
46
|
+
const input = args ?? {};
|
|
47
|
+
const unknownKeys = Object.keys(input).filter((k) => !KNOWN.has(k));
|
|
48
|
+
if (unknownKeys.length) {
|
|
49
|
+
// Neither the values NOR the key names: a token pasted as a property name must not be echoed into the transcript it was typed into.
|
|
50
|
+
throw new Error(`${SCOPE_TOOL} does not accept ${unknownKeys.length === 1 ? 'an unknown property' : `${unknownKeys.length} unknown properties`} (the name is not printed back). It never accepts a token or key: the person connects a source themselves with \`align connect <source>\`.`);
|
|
51
|
+
}
|
|
52
|
+
const action = input['action'];
|
|
53
|
+
if (action !== 'view' && action !== 'set')
|
|
54
|
+
throw new Error(`${SCOPE_TOOL} requires "action", one of: ${SCOPE_ACTIONS.join(', ')}. Call it again with one of those.`);
|
|
55
|
+
if (env.mode !== 'local-embedded') {
|
|
56
|
+
throw new Error(`${SCOPE_TOOL} edits what the local graph on this machine reads, and this server reads a hosted Align graph. ` +
|
|
57
|
+
'Use the local Align server (align mcp --env local); a hosted graph reads what its connectors are set up to read.');
|
|
58
|
+
}
|
|
59
|
+
const deps = injected ?? defaultScopeToolDeps(env);
|
|
60
|
+
if (action === 'view')
|
|
61
|
+
return view(deps);
|
|
62
|
+
return set(input, deps, o.agent ?? UNKNOWN_AGENT);
|
|
63
|
+
}
|
|
64
|
+
async function view(deps) {
|
|
65
|
+
const sources = await viewScopes(deps);
|
|
66
|
+
if (sources.length === 0) {
|
|
67
|
+
return { text: 'No source is connected, so there is no scope to show. Connecting needs a token only the person can supply. Ask them to run: align connect <source>', sources: [] };
|
|
68
|
+
}
|
|
69
|
+
const name = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
70
|
+
const lines = sources.map((s) => `${name(s.source)}: ${s.label}${s.origin === 'detected' ? " (from this folder's git remote)" : ''}.`);
|
|
71
|
+
return { text: lines.join('\n'), sources };
|
|
72
|
+
}
|
|
73
|
+
/** The schema says which are lists (projects, teams, spaces) and which are one text value (repo, gitlab_project): hold the input to it. */
|
|
74
|
+
function valueOf(property, v) {
|
|
75
|
+
const one = property === 'repo' || property === 'gitlab_project';
|
|
76
|
+
if (one && typeof v === 'string')
|
|
77
|
+
return v;
|
|
78
|
+
if (!one && Array.isArray(v) && v.every((x) => typeof x === 'string'))
|
|
79
|
+
return v;
|
|
80
|
+
throw new Error(`${SCOPE_TOOL} "${property}" must be ${one ? 'one text value' : 'a list of text values'}.`);
|
|
81
|
+
}
|
|
82
|
+
async function set(input, deps, agent) {
|
|
83
|
+
const source = input['source'];
|
|
84
|
+
if (source === undefined)
|
|
85
|
+
throw new Error(`${SCOPE_TOOL} requires "source" with action "set", one of: ${SCOPE_SOURCES.join(', ')}.`);
|
|
86
|
+
if (typeof source !== 'string' || !SCOPE_SOURCES.includes(source)) {
|
|
87
|
+
throw new Error(`${SCOPE_TOOL} "source" must be one of: ${SCOPE_SOURCES.join(', ')}.`);
|
|
88
|
+
}
|
|
89
|
+
const scope = input['scope'];
|
|
90
|
+
if (scope !== undefined && scope !== 'yours' && scope !== 'team')
|
|
91
|
+
throw new Error(`${SCOPE_TOOL} "scope" must be "yours" or "team".`);
|
|
92
|
+
const wanted = SCOPED_SOURCES.includes(source) ? VALUE_PROPERTY[source] : undefined;
|
|
93
|
+
const given = VALUE_PROPERTIES.filter((p) => input[p] !== undefined);
|
|
94
|
+
const wrong = given.filter((p) => p !== wanted);
|
|
95
|
+
if (wanted !== undefined && wrong.length > 0)
|
|
96
|
+
throw new Error(`${SCOPE_TOOL} for ${source} takes "${wanted}", not "${wrong[0]}".`);
|
|
97
|
+
let change;
|
|
98
|
+
if (scope === 'yours') {
|
|
99
|
+
if (given.length > 0)
|
|
100
|
+
throw new Error(`${SCOPE_TOOL} takes either scope "yours" or a value to read, not both.`);
|
|
101
|
+
change = { scope: 'yours' };
|
|
102
|
+
}
|
|
103
|
+
else if (wanted === undefined) {
|
|
104
|
+
// Zoom, Slack, Notion, Teams: setScope refuses with the honest reason for that source.
|
|
105
|
+
change = { scope: 'team', values: [] };
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
if (input[wanted] === undefined)
|
|
109
|
+
throw new Error(`${SCOPE_TOOL} for ${source} needs "${wanted}" to name what to read, or scope "yours" to go back to the user's own items.`);
|
|
110
|
+
change = { scope: 'team', values: valueOf(wanted, input[wanted]) };
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const r = await setScope(deps, source, change, { via: 'mcp', agent });
|
|
114
|
+
return {
|
|
115
|
+
text: [r.text, r.disclosure].filter((x) => x !== undefined && x !== '').join(' '),
|
|
116
|
+
source: r.source, scope: r.scope, scope_key: r.scopeKey, new_scope: r.newRow, pending: r.pending === true,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (e instanceof ScopeRefusal)
|
|
121
|
+
throw new Error(e.message);
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=mcp-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-scope.js","sourceRoot":"","sources":["../../src/lib/mcp-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { EnvironmentConfig } from './config.js';
|
|
2
|
+
import { estimateClassify } from './sync/classify.js';
|
|
3
|
+
import { type StatusDeps } from './sync/status.js';
|
|
4
|
+
export declare const SYNC_TOOL = "align_sync";
|
|
5
|
+
export declare const SYNC_ACTIONS: readonly ["status", "run", "classify_estimate"];
|
|
6
|
+
export declare const SYNC_TOOL_SCHEMA: {
|
|
7
|
+
readonly name: "align_sync";
|
|
8
|
+
readonly annotations: {
|
|
9
|
+
readonly readOnlyHint: false;
|
|
10
|
+
readonly destructiveHint: false;
|
|
11
|
+
};
|
|
12
|
+
readonly description: string;
|
|
13
|
+
readonly inputSchema: {
|
|
14
|
+
readonly type: "object";
|
|
15
|
+
readonly properties: {
|
|
16
|
+
readonly action: {
|
|
17
|
+
readonly type: "string";
|
|
18
|
+
readonly enum: readonly ["status", "run", "classify_estimate"];
|
|
19
|
+
readonly description: "What to do";
|
|
20
|
+
};
|
|
21
|
+
readonly source: {
|
|
22
|
+
readonly type: "string";
|
|
23
|
+
readonly enum: readonly ["github", "jira", "confluence", "slack", "teams", "gitlab", "linear", "notion"];
|
|
24
|
+
readonly description: "With \"run\": only this source. Default: every connected source";
|
|
25
|
+
};
|
|
26
|
+
readonly max: {
|
|
27
|
+
readonly type: "integer";
|
|
28
|
+
readonly minimum: 1;
|
|
29
|
+
readonly maximum: 1000;
|
|
30
|
+
readonly description: "With \"classify_estimate\": how many items the person would classify (default 25)";
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
readonly required: readonly ["action"];
|
|
34
|
+
readonly additionalProperties: false;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export interface SyncToolDeps {
|
|
38
|
+
dbPath: string;
|
|
39
|
+
status: StatusDeps;
|
|
40
|
+
needsReauth(source: string): boolean;
|
|
41
|
+
syncRunning(source: string): boolean;
|
|
42
|
+
backfillRunning(source: string): boolean;
|
|
43
|
+
/** Take a slot per source SYNCHRONOUSLY, before the child exists (MCP does not queue calls, so parallel `run`s would all pass
|
|
44
|
+
* the lock check and start a child each). All or none: a refusal names the sources that are taken. */
|
|
45
|
+
reserve?(sources: string[]): {
|
|
46
|
+
ok: true;
|
|
47
|
+
release(): void;
|
|
48
|
+
} | {
|
|
49
|
+
ok: false;
|
|
50
|
+
busy: string[];
|
|
51
|
+
};
|
|
52
|
+
start(sources: string[]): Promise<{
|
|
53
|
+
ok: boolean;
|
|
54
|
+
pid?: number;
|
|
55
|
+
}>;
|
|
56
|
+
estimate: typeof estimateClassify;
|
|
57
|
+
}
|
|
58
|
+
export interface SyncToolResult {
|
|
59
|
+
text: string;
|
|
60
|
+
[k: string]: unknown;
|
|
61
|
+
}
|
|
62
|
+
export declare function defaultSyncDeps(env: EnvironmentConfig): SyncToolDeps;
|
|
63
|
+
export declare function runSyncTool(args: Record<string, unknown> | undefined, env: EnvironmentConfig, injected?: SyncToolDeps): Promise<SyncToolResult>;
|
|
64
|
+
//# sourceMappingURL=mcp-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-sync.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-sync.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,OAAO,EAAkD,KAAK,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAE/G,eAAO,MAAM,SAAS,eAAe,CAAC;AACtC,eAAO,MAAM,YAAY,iDAAkD,CAAC;AAI5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC;2GACuG;IACvG,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,IAAI,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3F,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,OAAO,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAEtE,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,YAAY,CA+BpE;AAMD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDrJ"}
|