@aligndottech/cli 0.49.0 → 0.51.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 +5 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +32 -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/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +33 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect-agents.d.ts.map +1 -1
- package/dist/commands/connect-agents.js +3 -1
- package/dist/commands/connect-agents.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/env.d.ts.map +1 -1
- package/dist/commands/env.js +11 -0
- package/dist/commands/env.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/invite.d.ts +8 -18
- package/dist/commands/invite.d.ts.map +1 -1
- package/dist/commands/invite.js +23 -46
- package/dist/commands/invite.js.map +1 -1
- package/dist/commands/join.d.ts +5 -0
- package/dist/commands/join.d.ts.map +1 -0
- package/dist/commands/join.js +49 -0
- package/dist/commands/join.js.map +1 -0
- package/dist/commands/local-relink.d.ts +35 -0
- package/dist/commands/local-relink.d.ts.map +1 -0
- package/dist/commands/local-relink.js +72 -0
- package/dist/commands/local-relink.js.map +1 -0
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +113 -4
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +21 -2
- package/dist/commands/login.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 +149 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +80 -15
- 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 +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 +129 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +10 -0
- package/dist/commands/status.js.map +1 -1
- 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/detector/detector-version.d.ts +16 -0
- package/dist/detector/detector-version.d.ts.map +1 -0
- package/dist/detector/detector-version.js +36 -0
- package/dist/detector/detector-version.js.map +1 -0
- package/dist/detector/relationship-contract.d.ts +30 -0
- package/dist/detector/relationship-contract.d.ts.map +1 -0
- package/dist/detector/relationship-contract.js +120 -0
- package/dist/detector/relationship-contract.js.map +1 -0
- package/dist/detector/relationship-contract.v1.json +53 -0
- package/dist/detector/relationship-prompt.d.ts +20 -0
- package/dist/detector/relationship-prompt.d.ts.map +1 -0
- package/dist/detector/relationship-prompt.js +55 -0
- package/dist/detector/relationship-prompt.js.map +1 -0
- package/dist/detector/relationship-prompt.v1.json +13 -0
- package/dist/detector/resolve-pair.d.ts +39 -0
- package/dist/detector/resolve-pair.d.ts.map +1 -0
- package/dist/detector/resolve-pair.js +345 -0
- package/dist/detector/resolve-pair.js.map +1 -0
- package/dist/detector/similar-item.d.ts +20 -0
- package/dist/detector/similar-item.d.ts.map +1 -0
- package/dist/detector/similar-item.js +16 -0
- package/dist/detector/similar-item.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/advisory-dedup.d.ts.map +1 -1
- package/dist/lib/advisory-dedup.js +16 -8
- package/dist/lib/advisory-dedup.js.map +1 -1
- package/dist/lib/advisory-verdict.d.ts +19 -0
- package/dist/lib/advisory-verdict.d.ts.map +1 -1
- package/dist/lib/advisory-verdict.js +6 -3
- package/dist/lib/advisory-verdict.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/backup-exclusion.d.ts +10 -0
- package/dist/lib/backup-exclusion.d.ts.map +1 -0
- package/dist/lib/backup-exclusion.js +58 -0
- package/dist/lib/backup-exclusion.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/cli-oauth.d.ts +2 -0
- package/dist/lib/cli-oauth.d.ts.map +1 -1
- package/dist/lib/cli-oauth.js +61 -10
- package/dist/lib/cli-oauth.js.map +1 -1
- package/dist/lib/config.d.ts +72 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +245 -1
- 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 +95 -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 +97 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -0
- package/dist/lib/curation/judgements-db.js +206 -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 +361 -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/destination-name.d.ts +24 -0
- package/dist/lib/destination-name.d.ts.map +1 -0
- package/dist/lib/destination-name.js +39 -0
- package/dist/lib/destination-name.js.map +1 -0
- package/dist/lib/destination-summary.d.ts +6 -0
- package/dist/lib/destination-summary.d.ts.map +1 -0
- package/dist/lib/destination-summary.js +27 -0
- package/dist/lib/destination-summary.js.map +1 -0
- package/dist/lib/destination-trust.d.ts +54 -0
- package/dist/lib/destination-trust.d.ts.map +1 -0
- package/dist/lib/destination-trust.js +107 -0
- package/dist/lib/destination-trust.js.map +1 -0
- package/dist/lib/env-resolver.d.ts.map +1 -1
- package/dist/lib/env-resolver.js +3 -0
- package/dist/lib/env-resolver.js.map +1 -1
- package/dist/lib/fatal.d.ts +11 -0
- package/dist/lib/fatal.d.ts.map +1 -0
- package/dist/lib/fatal.js +22 -0
- package/dist/lib/fatal.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 +40 -14
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +47 -19
- 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/invite-prompt.d.ts +4 -4
- package/dist/lib/invite-prompt.d.ts.map +1 -1
- package/dist/lib/invite-prompt.js +4 -4
- package/dist/lib/invite-prompt.js.map +1 -1
- package/dist/lib/invite-settings.d.ts +18 -0
- package/dist/lib/invite-settings.d.ts.map +1 -0
- package/dist/lib/invite-settings.js +29 -0
- package/dist/lib/invite-settings.js.map +1 -0
- package/dist/lib/join-flow.d.ts +60 -0
- package/dist/lib/join-flow.d.ts.map +1 -0
- package/dist/lib/join-flow.js +282 -0
- package/dist/lib/join-flow.js.map +1 -0
- 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 +154 -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/lead-prompt.d.ts +106 -0
- package/dist/lib/lead-prompt.d.ts.map +1 -0
- package/dist/lib/lead-prompt.js +175 -0
- package/dist/lib/lead-prompt.js.map +1 -0
- package/dist/lib/local-candidate-classify.d.ts +26 -0
- package/dist/lib/local-candidate-classify.d.ts.map +1 -0
- package/dist/lib/local-candidate-classify.js +53 -0
- package/dist/lib/local-candidate-classify.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 +528 -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-v12.d.ts +17 -0
- package/dist/lib/local-db-v12.d.ts.map +1 -0
- package/dist/lib/local-db-v12.js +8 -0
- package/dist/lib/local-db-v12.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 +73 -23
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +225 -375
- 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 +31 -87
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +209 -187
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +131 -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 +57 -0
- package/dist/lib/local-link-pass.js.map +1 -0
- package/dist/lib/local-llm.d.ts +1 -1
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +3 -2
- package/dist/lib/local-llm.js.map +1 -1
- package/dist/lib/local-mode.d.ts +9 -2
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +27 -7
- 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-relationship-classifier.d.ts +4 -0
- package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
- package/dist/lib/local-relationship-classifier.js +9 -4
- package/dist/lib/local-relationship-classifier.js.map +1 -1
- package/dist/lib/local-relink.d.ts +59 -0
- package/dist/lib/local-relink.d.ts.map +1 -0
- package/dist/lib/local-relink.js +171 -0
- package/dist/lib/local-relink.js.map +1 -0
- package/dist/lib/local-set-classifier.d.ts +36 -0
- package/dist/lib/local-set-classifier.d.ts.map +1 -0
- package/dist/lib/local-set-classifier.js +81 -0
- package/dist/lib/local-set-classifier.js.map +1 -0
- package/dist/lib/local-snapshot-loader.d.ts +29 -0
- package/dist/lib/local-snapshot-loader.d.ts.map +1 -0
- package/dist/lib/local-snapshot-loader.js +108 -0
- package/dist/lib/local-snapshot-loader.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/login-flow.d.ts +15 -0
- package/dist/lib/login-flow.d.ts.map +1 -1
- package/dist/lib/login-flow.js +80 -4
- package/dist/lib/login-flow.js.map +1 -1
- 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-status-tool.d.ts +13 -0
- package/dist/lib/mcp/share-status-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-status-tool.js +116 -0
- package/dist/lib/mcp/share-status-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +50 -0
- package/dist/lib/mcp/share-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-tool.js +174 -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/model-cache.d.ts +10 -0
- package/dist/lib/model-cache.d.ts.map +1 -0
- package/dist/lib/model-cache.js +35 -0
- package/dist/lib/model-cache.js.map +1 -0
- package/dist/lib/next-step.d.ts.map +1 -1
- package/dist/lib/next-step.js +2 -1
- package/dist/lib/next-step.js.map +1 -1
- 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/private-files.d.ts +33 -0
- package/dist/lib/private-files.d.ts.map +1 -0
- package/dist/lib/private-files.js +96 -0
- package/dist/lib/private-files.js.map +1 -0
- package/dist/lib/redaction-notice.d.ts +7 -0
- package/dist/lib/redaction-notice.d.ts.map +1 -0
- package/dist/lib/redaction-notice.js +32 -0
- package/dist/lib/redaction-notice.js.map +1 -0
- package/dist/lib/relink-estimate.d.ts +16 -0
- package/dist/lib/relink-estimate.d.ts.map +1 -0
- package/dist/lib/relink-estimate.js +30 -0
- package/dist/lib/relink-estimate.js.map +1 -0
- package/dist/lib/resolve-env.d.ts +15 -1
- package/dist/lib/resolve-env.d.ts.map +1 -1
- package/dist/lib/resolve-env.js +27 -7
- package/dist/lib/resolve-env.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 +44 -0
- package/dist/lib/scope-defaults.js.map +1 -0
- package/dist/lib/scope-real.d.ts +280 -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/setup-route.d.ts +4 -2
- package/dist/lib/setup-route.d.ts.map +1 -1
- package/dist/lib/setup-route.js +12 -6
- package/dist/lib/setup-route.js.map +1 -1
- package/dist/lib/share/approval.d.ts +71 -0
- package/dist/lib/share/approval.d.ts.map +1 -0
- package/dist/lib/share/approval.js +139 -0
- package/dist/lib/share/approval.js.map +1 -0
- package/dist/lib/share/approve-link.d.ts +31 -0
- package/dist/lib/share/approve-link.d.ts.map +1 -0
- package/dist/lib/share/approve-link.js +46 -0
- package/dist/lib/share/approve-link.js.map +1 -0
- package/dist/lib/share/browser-flow.d.ts +85 -0
- package/dist/lib/share/browser-flow.d.ts.map +1 -0
- package/dist/lib/share/browser-flow.js +168 -0
- package/dist/lib/share/browser-flow.js.map +1 -0
- package/dist/lib/share/command.d.ts +65 -0
- package/dist/lib/share/command.d.ts.map +1 -0
- package/dist/lib/share/command.js +278 -0
- package/dist/lib/share/command.js.map +1 -0
- package/dist/lib/share/delivery-options.d.ts +15 -0
- package/dist/lib/share/delivery-options.d.ts.map +1 -0
- package/dist/lib/share/delivery-options.js +16 -0
- package/dist/lib/share/delivery-options.js.map +1 -0
- package/dist/lib/share/delivery.d.ts +83 -0
- package/dist/lib/share/delivery.d.ts.map +1 -0
- package/dist/lib/share/delivery.js +134 -0
- package/dist/lib/share/delivery.js.map +1 -0
- package/dist/lib/share/envelope.d.ts +61 -0
- package/dist/lib/share/envelope.d.ts.map +1 -0
- package/dist/lib/share/envelope.js +99 -0
- package/dist/lib/share/envelope.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 +137 -0
- package/dist/lib/share/ledger.js.map +1 -0
- package/dist/lib/share/payload.d.ts +101 -0
- package/dist/lib/share/payload.d.ts.map +1 -0
- package/dist/lib/share/payload.js +147 -0
- package/dist/lib/share/payload.js.map +1 -0
- package/dist/lib/share/pending.d.ts +94 -0
- package/dist/lib/share/pending.d.ts.map +1 -0
- package/dist/lib/share/pending.js +256 -0
- package/dist/lib/share/pending.js.map +1 -0
- package/dist/lib/share/preview.d.ts +22 -0
- package/dist/lib/share/preview.d.ts.map +1 -0
- package/dist/lib/share/preview.js +74 -0
- package/dist/lib/share/preview.js.map +1 -0
- package/dist/lib/share/qr.d.ts +13 -0
- package/dist/lib/share/qr.d.ts.map +1 -0
- package/dist/lib/share/qr.js +77 -0
- package/dist/lib/share/qr.js.map +1 -0
- package/dist/lib/share/requests-client.d.ts +63 -0
- package/dist/lib/share/requests-client.d.ts.map +1 -0
- package/dist/lib/share/requests-client.js +69 -0
- package/dist/lib/share/requests-client.js.map +1 -0
- package/dist/lib/share/run.d.ts +134 -0
- package/dist/lib/share/run.d.ts.map +1 -0
- package/dist/lib/share/run.js +278 -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 +24 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -0
- package/dist/lib/share/secret-scan.js +116 -0
- package/dist/lib/share/secret-scan.js.map +1 -0
- package/dist/lib/share/target.d.ts +38 -0
- package/dist/lib/share/target.d.ts.map +1 -0
- package/dist/lib/share/target.js +80 -0
- package/dist/lib/share/target.js.map +1 -0
- package/dist/lib/share/tty.d.ts +12 -0
- package/dist/lib/share/tty.d.ts.map +1 -0
- package/dist/lib/share/tty.js +102 -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 +45 -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 +45 -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 +93 -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 +265 -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 +255 -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 +89 -24
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +283 -76
- 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 +6 -3
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -98
- package/dist/commands/push.js.map +0 -1
- package/dist/lib/personal-email-domains.d.ts +0 -8
- package/dist/lib/personal-email-domains.d.ts.map +0 -1
- package/dist/lib/personal-email-domains.js +0 -39
- package/dist/lib/personal-email-domains.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { SharePayload } from './payload.js';
|
|
2
|
+
/** The envelope column holds 262,144 bytes; IV and tag take 28 of them. */
|
|
3
|
+
export declare const MAX_ENVELOPE_BYTES = 262144;
|
|
4
|
+
export declare const ENVELOPE_OVERHEAD_BYTES = 28;
|
|
5
|
+
export declare const MAX_PLAINTEXT_BYTES: number;
|
|
6
|
+
export declare class PlaintextTooLargeError extends Error {
|
|
7
|
+
readonly bytes: number;
|
|
8
|
+
constructor(bytes: number);
|
|
9
|
+
}
|
|
10
|
+
export declare class UnkeyedItemError extends Error {
|
|
11
|
+
constructor(title: string);
|
|
12
|
+
}
|
|
13
|
+
/** The gateway's team-text hash: a lowercase hex SHA-256. Anything else is not one, and is never staged. */
|
|
14
|
+
export declare const TEAM_TEXT_HASH_RE: RegExp;
|
|
15
|
+
export declare class InvalidTeamTextHashError extends Error {
|
|
16
|
+
constructor();
|
|
17
|
+
}
|
|
18
|
+
export interface Binding {
|
|
19
|
+
envelopeId: string;
|
|
20
|
+
tenantId: string;
|
|
21
|
+
userId: string;
|
|
22
|
+
kind: RequestKind;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The AAD joins ids with `|`, so an id that contains one would make `v1|a|b|c|d` ambiguous (a tenant of `T|U` and a user of
|
|
26
|
+
* `V` would bind the same bytes as a tenant of `T` and a user of `U|V`). Real ids are UUIDs; this accepts any plain token with
|
|
27
|
+
* no separator, space or control character, and refuses everything else before anything is sealed.
|
|
28
|
+
*/
|
|
29
|
+
export declare const BINDING_PART_RE: RegExp;
|
|
30
|
+
export declare class InvalidBindingError extends Error {
|
|
31
|
+
constructor(field: string);
|
|
32
|
+
}
|
|
33
|
+
export declare function aadFor(b: Binding): Buffer;
|
|
34
|
+
export interface Sealed {
|
|
35
|
+
/** iv || ciphertext || tag, standard base64: what the server stores. */
|
|
36
|
+
envelopeB64: string;
|
|
37
|
+
/** 32 random bytes, 43 base64url characters: goes ONLY in the link's fragment and the local pending file. */
|
|
38
|
+
keyB64Url: string;
|
|
39
|
+
/** Lowercase hex SHA-256 of the plaintext bytes. */
|
|
40
|
+
sha256: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function seal(plaintext: Buffer, bind: Binding): Sealed;
|
|
43
|
+
export type RequestKind = 'share' | 'confirm_team_text';
|
|
44
|
+
export interface PlaintextInput {
|
|
45
|
+
kind: RequestKind;
|
|
46
|
+
tenantId: string;
|
|
47
|
+
gatewayUrl: string;
|
|
48
|
+
payloads: readonly SharePayload[];
|
|
49
|
+
/** For kind confirm_team_text: the team decision whose text the person confirms, and the hash the judgements carry. */
|
|
50
|
+
confirm?: {
|
|
51
|
+
remoteId: string;
|
|
52
|
+
teamTextHash: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The plaintext (v1). `decisions` is the exact /ingest/batch decisions array; `display` is labels only (counterpart
|
|
57
|
+
* titles, who relayed each judgement, what stays local), so a lying display can mislabel a counterpart but cannot
|
|
58
|
+
* hide or add text that is sent. `tenant_id` and `gateway_url` let the page refuse a link aimed elsewhere.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildPlaintext(input: PlaintextInput): Buffer;
|
|
61
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/lib/share/envelope.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,mBAAmB,QAA+C,CAAC;AAEhF,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAInC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,KAAK,EAAE,MAAM;CAI1B;AAED,4GAA4G;AAC5G,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAElD,qBAAa,wBAAyB,SAAQ,KAAK;;CAKlD;AAED,MAAM,WAAW,OAAO;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE;AAEpG;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAwC,CAAC;AAErE,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,KAAK,EAAE,MAAM;CAI1B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKzC;AAED,MAAM,WAAW,MAAM;IACrB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6GAA6G;IAC7G,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAS7D;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,uHAAuH;IACvH,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAoB5D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ALI-1540: seal what a share would send, so the team server holds only ciphertext until a person approves.
|
|
3
|
+
*
|
|
4
|
+
* The CLI seals the exact plaintext bytes with AES-256-GCM under a random 32-byte key the server never sees:
|
|
5
|
+
* the key travels only in the approve link's `#k=` fragment, which a browser does not send. The AAD is
|
|
6
|
+
* `v1|<envelope id>|<tenant id>|<user id>|<kind>`, so a ciphertext swapped onto another request, workspace, user or
|
|
7
|
+
* kind fails to open. The envelope id is made HERE, before sealing, and sent with the request; the gateway keeps its
|
|
8
|
+
* own row id (it is not the primary key, so a chosen id cannot squat a row or probe for one across tenants). The hash is over the plaintext bytes as sealed, never over a re-serialised object.
|
|
9
|
+
*
|
|
10
|
+
* Layout: iv (12) || ciphertext || tag (16). That is the order WebCrypto wants (it takes the tag appended to the
|
|
11
|
+
* ciphertext), so the browser opens it with no reshaping (spike S1: parity with Node and real Chromium).
|
|
12
|
+
*/
|
|
13
|
+
import { createCipheriv, createHash, randomBytes } from 'node:crypto';
|
|
14
|
+
import { toBatchDecisions } from './payload.js';
|
|
15
|
+
/** The envelope column holds 262,144 bytes; IV and tag take 28 of them. */
|
|
16
|
+
export const MAX_ENVELOPE_BYTES = 262_144;
|
|
17
|
+
export const ENVELOPE_OVERHEAD_BYTES = 28;
|
|
18
|
+
export const MAX_PLAINTEXT_BYTES = MAX_ENVELOPE_BYTES - ENVELOPE_OVERHEAD_BYTES;
|
|
19
|
+
export class PlaintextTooLargeError extends Error {
|
|
20
|
+
bytes;
|
|
21
|
+
constructor(bytes) {
|
|
22
|
+
super(`This share is ${bytes} bytes once sealed, over the ${MAX_PLAINTEXT_BYTES} byte limit for one approval.`);
|
|
23
|
+
this.bytes = bytes;
|
|
24
|
+
this.name = 'PlaintextTooLargeError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class UnkeyedItemError extends Error {
|
|
28
|
+
constructor(title) {
|
|
29
|
+
super(`"${title.slice(0, 80)}" has no client_key, so it cannot be staged for approval (a share item always carries one). Nothing was staged.`);
|
|
30
|
+
this.name = 'UnkeyedItemError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The gateway's team-text hash: a lowercase hex SHA-256. Anything else is not one, and is never staged. */
|
|
34
|
+
export const TEAM_TEXT_HASH_RE = /^[0-9a-f]{64}$/;
|
|
35
|
+
export class InvalidTeamTextHashError extends Error {
|
|
36
|
+
constructor() {
|
|
37
|
+
super('The team text hash the gateway sent is not a 64-character lowercase hex SHA-256, so the confirmation was not staged.');
|
|
38
|
+
this.name = 'InvalidTeamTextHashError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The AAD joins ids with `|`, so an id that contains one would make `v1|a|b|c|d` ambiguous (a tenant of `T|U` and a user of
|
|
43
|
+
* `V` would bind the same bytes as a tenant of `T` and a user of `U|V`). Real ids are UUIDs; this accepts any plain token with
|
|
44
|
+
* no separator, space or control character, and refuses everything else before anything is sealed.
|
|
45
|
+
*/
|
|
46
|
+
export const BINDING_PART_RE = /^[0-9A-Za-z][0-9A-Za-z_.:-]{0,127}$/;
|
|
47
|
+
export class InvalidBindingError extends Error {
|
|
48
|
+
constructor(field) {
|
|
49
|
+
super(`The ${field} the gateway reported is not a plain identifier, so a request cannot be sealed to it. Nothing was staged.`);
|
|
50
|
+
this.name = 'InvalidBindingError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function aadFor(b) {
|
|
54
|
+
for (const [field, v] of [['envelope id', b.envelopeId], ['workspace id', b.tenantId], ['user id', b.userId]]) {
|
|
55
|
+
if (!BINDING_PART_RE.test(v))
|
|
56
|
+
throw new InvalidBindingError(field);
|
|
57
|
+
}
|
|
58
|
+
return Buffer.from(`v1|${b.envelopeId}|${b.tenantId}|${b.userId}|${b.kind}`, 'utf8');
|
|
59
|
+
}
|
|
60
|
+
export function seal(plaintext, bind) {
|
|
61
|
+
if (plaintext.length > MAX_PLAINTEXT_BYTES)
|
|
62
|
+
throw new PlaintextTooLargeError(plaintext.length);
|
|
63
|
+
const key = randomBytes(32);
|
|
64
|
+
const iv = randomBytes(12);
|
|
65
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
66
|
+
cipher.setAAD(aadFor(bind));
|
|
67
|
+
const body = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
68
|
+
const envelope = Buffer.concat([iv, body, cipher.getAuthTag()]);
|
|
69
|
+
return { envelopeB64: envelope.toString('base64'), keyB64Url: key.toString('base64url'), sha256: createHash('sha256').update(plaintext).digest('hex') };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The plaintext (v1). `decisions` is the exact /ingest/batch decisions array; `display` is labels only (counterpart
|
|
73
|
+
* titles, who relayed each judgement, what stays local), so a lying display can mislabel a counterpart but cannot
|
|
74
|
+
* hide or add text that is sent. `tenant_id` and `gateway_url` let the page refuse a link aimed elsewhere.
|
|
75
|
+
*/
|
|
76
|
+
export function buildPlaintext(input) {
|
|
77
|
+
// Only a KEYED item is promoted as written; one without a client_key can be rewritten by synthesis or upserted onto
|
|
78
|
+
// a teammate's row. Every share item carries one today, and anything else is refused here rather than staged.
|
|
79
|
+
if (input.confirm && !TEAM_TEXT_HASH_RE.test(input.confirm.teamTextHash))
|
|
80
|
+
throw new InvalidTeamTextHashError();
|
|
81
|
+
for (const p of input.payloads) {
|
|
82
|
+
if (typeof p.item.client_key !== 'string' || p.item.client_key === '')
|
|
83
|
+
throw new UnkeyedItemError(p.item.title);
|
|
84
|
+
}
|
|
85
|
+
const body = {
|
|
86
|
+
v: 1,
|
|
87
|
+
kind: input.kind,
|
|
88
|
+
tenant_id: input.tenantId,
|
|
89
|
+
gateway_url: input.gatewayUrl,
|
|
90
|
+
...(input.confirm ? { confirm: { decision_id: input.confirm.remoteId, team_text_hash: input.confirm.teamTextHash } } : {}),
|
|
91
|
+
decisions: toBatchDecisions(input.payloads.map((p) => ({ ...p.item }))),
|
|
92
|
+
display: input.payloads.map((p) => ({
|
|
93
|
+
judgements: p.shown.map((s) => ({ via: s.via, agent: s.agentId, counterpart_title: s.counterpartTitle })),
|
|
94
|
+
left_local: p.leftLocal.map((l) => ({ kind: l.kind, why: l.why, counterpart_title: l.counterpartTitle })),
|
|
95
|
+
})),
|
|
96
|
+
};
|
|
97
|
+
return Buffer.from(JSON.stringify(body), 'utf8');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../src/lib/share/envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface Promotion {
|
|
2
|
+
localId: string;
|
|
3
|
+
env: string;
|
|
4
|
+
tenantId: string;
|
|
5
|
+
remoteId: string;
|
|
6
|
+
contentHash: string;
|
|
7
|
+
/** The share attached to a decision the team already held. Retracting it must NOT archive that decision. */
|
|
8
|
+
matched: boolean;
|
|
9
|
+
/** The opaque idempotency key sent as `client_key` at the first share; reused for every later one. */
|
|
10
|
+
clientKey: string;
|
|
11
|
+
/** Hashes of judgements already stored in that workspace. */
|
|
12
|
+
sent: string[];
|
|
13
|
+
/** A matched share whose ratify/supersede still waits for the person to confirm the team's text. */
|
|
14
|
+
confirmPending: boolean;
|
|
15
|
+
sharedAt: string;
|
|
16
|
+
retractedAt: string | null;
|
|
17
|
+
}
|
|
18
|
+
/** The write side of a ledger row: the clock columns are the database's. */
|
|
19
|
+
export interface PromotionWrite {
|
|
20
|
+
localId: string;
|
|
21
|
+
env: string;
|
|
22
|
+
tenantId: string;
|
|
23
|
+
remoteId: string;
|
|
24
|
+
contentHash: string;
|
|
25
|
+
matched: boolean;
|
|
26
|
+
clientKey: string;
|
|
27
|
+
sent: string[];
|
|
28
|
+
confirmPending: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface LedgerRow {
|
|
31
|
+
local_id: string;
|
|
32
|
+
env: string;
|
|
33
|
+
tenant_id: string;
|
|
34
|
+
remote_id: string;
|
|
35
|
+
content_hash: string;
|
|
36
|
+
matched: number;
|
|
37
|
+
client_key: string;
|
|
38
|
+
sent: string;
|
|
39
|
+
confirm_pending: number;
|
|
40
|
+
shared_at: string;
|
|
41
|
+
retracted_at: string | null;
|
|
42
|
+
}
|
|
43
|
+
export declare function getPromotion(dbPath: string, localId: string, env: string, tenantId: string): Promotion | null;
|
|
44
|
+
/** A row `align push` left before the ledger existed: it names no workspace. */
|
|
45
|
+
export declare function getLegacyPromotion(dbPath: string, localId: string, env: string): Promotion | null;
|
|
46
|
+
/** Insert, or replace the hash and remote id of an existing row; a re-share clears an earlier retraction. */
|
|
47
|
+
export declare function recordPromotion(dbPath: string, p: PromotionWrite): void;
|
|
48
|
+
/** Several rows in ONE transaction: all of them land or none do. */
|
|
49
|
+
export declare function recordPromotions(dbPath: string, rows: readonly PromotionWrite[]): void;
|
|
50
|
+
export declare function markRetracted(dbPath: string, localId: string, env: string, tenantId: string): void;
|
|
51
|
+
/** Every live (not retracted) share into one workspace, keyed by local id. */
|
|
52
|
+
export declare function listPromotions(dbPath: string, env: string, tenantId: string): Map<string, Promotion>;
|
|
53
|
+
/** Every ledger row, raw, so a reset can carry the record of what was shared across a wipe. [] when there is none. */
|
|
54
|
+
export declare function exportLedger(dbPath: string): LedgerRow[];
|
|
55
|
+
/** Put exported rows back (replay-safe: the key is the table's primary key). */
|
|
56
|
+
export declare function restoreLedger(dbPath: string, rows: readonly LedgerRow[]): void;
|
|
57
|
+
/** True when the ledger table has every column this code uses. A share checks it BEFORE any request. */
|
|
58
|
+
export declare function ledgerReady(dbPath: string): boolean;
|
|
59
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/lib/share/ledger.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,4GAA4G;IAC5G,OAAO,EAAE,OAAO,CAAC;IACjB,sGAAsG;IACtG,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oGAAoG;IACpG,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAsCpP,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAK7G;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjG;AAED,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,CAUvE;AAQD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAUtF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIlG;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAKpG;AAED,sHAAsH;AACtH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAExD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAa9E;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L9: reads and writes of `promotions` (schema v10), the record of what this machine shared where.
|
|
3
|
+
*
|
|
4
|
+
* Same pattern as curation/judgements-db.ts: every function opens its own short-lived handle so the
|
|
5
|
+
* MCP server, a sync child and the share command can all be live, and a reader never creates a
|
|
6
|
+
* missing graph file. A pre-v10 file reads as "nothing shared".
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
10
|
+
import { tightenGraphFiles } from '../private-files.js';
|
|
11
|
+
import { assertSchemaSupported } from '../local-db-migrate.js';
|
|
12
|
+
import { LEDGER_COLUMNS } from '../local-db-v10.js';
|
|
13
|
+
function parseSent(raw) {
|
|
14
|
+
try {
|
|
15
|
+
const v = JSON.parse(raw);
|
|
16
|
+
return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const fromRow = (r) => ({
|
|
23
|
+
localId: r.local_id, env: r.env, tenantId: r.tenant_id, remoteId: r.remote_id, contentHash: r.content_hash,
|
|
24
|
+
matched: r.matched === 1, clientKey: r.client_key, sent: parseSent(r.sent), confirmPending: r.confirm_pending === 1, sharedAt: r.shared_at, retractedAt: r.retracted_at,
|
|
25
|
+
});
|
|
26
|
+
function withDb(dbPath, fn) {
|
|
27
|
+
tightenGraphFiles(dbPath); // owner-only on every open (private-files.ts)
|
|
28
|
+
const db = new DatabaseSync(dbPath);
|
|
29
|
+
try {
|
|
30
|
+
db.exec('PRAGMA busy_timeout = 30000');
|
|
31
|
+
assertSchemaSupported(db.prepare('PRAGMA user_version').get().user_version, db);
|
|
32
|
+
return fn(db);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
db.close();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function readDb(dbPath, fallback, fn) {
|
|
39
|
+
if (dbPath === '' || !fs.existsSync(dbPath))
|
|
40
|
+
return fallback;
|
|
41
|
+
return withDb(dbPath, (db) => {
|
|
42
|
+
try {
|
|
43
|
+
return fn(db);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
if (/no such table/i.test(e.message))
|
|
47
|
+
return fallback;
|
|
48
|
+
throw e;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export function getPromotion(dbPath, localId, env, tenantId) {
|
|
53
|
+
return readDb(dbPath, null, (db) => {
|
|
54
|
+
const r = db.prepare('SELECT * FROM promotions WHERE local_id = ? AND env = ? AND tenant_id = ?').get(localId, env, tenantId);
|
|
55
|
+
return r ? fromRow(r) : null;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** A row `align push` left before the ledger existed: it names no workspace. */
|
|
59
|
+
export function getLegacyPromotion(dbPath, localId, env) {
|
|
60
|
+
return getPromotion(dbPath, localId, env, 'legacy');
|
|
61
|
+
}
|
|
62
|
+
/** Insert, or replace the hash and remote id of an existing row; a re-share clears an earlier retraction. */
|
|
63
|
+
export function recordPromotion(dbPath, p) {
|
|
64
|
+
withDb(dbPath, (db) => {
|
|
65
|
+
db.prepare(`INSERT INTO promotions (local_id, env, tenant_id, remote_id, content_hash, matched, client_key, sent, confirm_pending) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
66
|
+
ON CONFLICT (local_id, env, tenant_id) DO UPDATE SET
|
|
67
|
+
remote_id = excluded.remote_id, content_hash = excluded.content_hash, matched = excluded.matched,
|
|
68
|
+
client_key = excluded.client_key, sent = excluded.sent, confirm_pending = excluded.confirm_pending,
|
|
69
|
+
shared_at = datetime('now'), retracted_at = NULL`).run(p.localId, p.env, p.tenantId, p.remoteId, p.contentHash, p.matched ? 1 : 0, p.clientKey, JSON.stringify([...new Set(p.sent)]), p.confirmPending ? 1 : 0);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const UPSERT = `INSERT INTO promotions (local_id, env, tenant_id, remote_id, content_hash, matched, client_key, sent, confirm_pending) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
73
|
+
ON CONFLICT (local_id, env, tenant_id) DO UPDATE SET
|
|
74
|
+
remote_id = excluded.remote_id, content_hash = excluded.content_hash, matched = excluded.matched,
|
|
75
|
+
client_key = excluded.client_key, sent = excluded.sent, confirm_pending = excluded.confirm_pending,
|
|
76
|
+
shared_at = datetime('now'), retracted_at = NULL`;
|
|
77
|
+
/** Several rows in ONE transaction: all of them land or none do. */
|
|
78
|
+
export function recordPromotions(dbPath, rows) {
|
|
79
|
+
if (rows.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
withDb(dbPath, (db) => {
|
|
82
|
+
const up = db.prepare(UPSERT);
|
|
83
|
+
db.exec('BEGIN IMMEDIATE');
|
|
84
|
+
try {
|
|
85
|
+
for (const p of rows)
|
|
86
|
+
up.run(p.localId, p.env, p.tenantId, p.remoteId, p.contentHash, p.matched ? 1 : 0, p.clientKey, JSON.stringify([...new Set(p.sent)]), p.confirmPending ? 1 : 0);
|
|
87
|
+
db.exec('COMMIT');
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
db.exec('ROLLBACK');
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function markRetracted(dbPath, localId, env, tenantId) {
|
|
96
|
+
withDb(dbPath, (db) => {
|
|
97
|
+
db.prepare(`UPDATE promotions SET retracted_at = datetime('now') WHERE local_id = ? AND env = ? AND tenant_id = ?`).run(localId, env, tenantId);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/** Every live (not retracted) share into one workspace, keyed by local id. */
|
|
101
|
+
export function listPromotions(dbPath, env, tenantId) {
|
|
102
|
+
return readDb(dbPath, new Map(), (db) => new Map(db.prepare('SELECT * FROM promotions WHERE env = ? AND tenant_id = ? AND retracted_at IS NULL').all(env, tenantId)
|
|
103
|
+
.map((r) => [r.local_id, fromRow(r)])));
|
|
104
|
+
}
|
|
105
|
+
/** Every ledger row, raw, so a reset can carry the record of what was shared across a wipe. [] when there is none. */
|
|
106
|
+
export function exportLedger(dbPath) {
|
|
107
|
+
return readDb(dbPath, [], (db) => db.prepare('SELECT * FROM promotions').all());
|
|
108
|
+
}
|
|
109
|
+
/** Put exported rows back (replay-safe: the key is the table's primary key). */
|
|
110
|
+
export function restoreLedger(dbPath, rows) {
|
|
111
|
+
if (rows.length === 0)
|
|
112
|
+
return;
|
|
113
|
+
withDb(dbPath, (db) => {
|
|
114
|
+
const ins = db.prepare(`INSERT OR REPLACE INTO promotions (local_id, env, tenant_id, remote_id, content_hash, matched, client_key, sent, confirm_pending, shared_at, retracted_at)
|
|
115
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
116
|
+
db.exec('BEGIN IMMEDIATE');
|
|
117
|
+
try {
|
|
118
|
+
for (const r of rows)
|
|
119
|
+
ins.run(r.local_id, r.env, r.tenant_id, r.remote_id, r.content_hash, r.matched, r.client_key, r.sent, r.confirm_pending, r.shared_at, r.retracted_at);
|
|
120
|
+
db.exec('COMMIT');
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
db.exec('ROLLBACK');
|
|
124
|
+
throw e;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/** True when the ledger table has every column this code uses. A share checks it BEFORE any request. */
|
|
129
|
+
export function ledgerReady(dbPath) {
|
|
130
|
+
if (!fs.existsSync(dbPath))
|
|
131
|
+
return false;
|
|
132
|
+
return withDb(dbPath, (db) => {
|
|
133
|
+
const cols = new Set(db.prepare('PRAGMA table_info(promotions)').all().map((c) => c.name));
|
|
134
|
+
return LEDGER_COLUMNS.every((c) => cols.has(c));
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/lib/share/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { DecisionRow } from '../local-db.js';
|
|
2
|
+
import type { JudgementRow } from '../curation/judgements-db.js';
|
|
3
|
+
/** The gateway's per-item cap (MAX_JUDGEMENTS_PER_ITEM). Over it the batch is refused whole, so we cut first. */
|
|
4
|
+
export declare const MAX_SHARED_JUDGEMENTS = 50;
|
|
5
|
+
export type WireKind = 'ratify' | 'conflict_verdict' | 'check_verdict' | 'supersede' | 'not_a_decision' | 'note';
|
|
6
|
+
export interface WireJudgement {
|
|
7
|
+
kind: WireKind;
|
|
8
|
+
value?: 'true_positive' | 'false_positive';
|
|
9
|
+
note?: string;
|
|
10
|
+
counterpart_id?: string;
|
|
11
|
+
judged_at: string;
|
|
12
|
+
origin: 'local_share' | 'local_share_mcp';
|
|
13
|
+
agent?: string;
|
|
14
|
+
confirm_team_text_hash?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WireItem {
|
|
17
|
+
source_url: string;
|
|
18
|
+
platform: string;
|
|
19
|
+
title: string;
|
|
20
|
+
/** Sent explicitly: the server keeps the caller's summary only when it is given (its extraction may rewrite the title). */
|
|
21
|
+
summary: string;
|
|
22
|
+
raw_text: string;
|
|
23
|
+
client_key: string;
|
|
24
|
+
created_at?: string;
|
|
25
|
+
judgements: WireJudgement[];
|
|
26
|
+
}
|
|
27
|
+
/** A judgement as the preview lists it: the wire form plus what a person needs to read it. */
|
|
28
|
+
export interface ShownJudgement {
|
|
29
|
+
wire: WireJudgement;
|
|
30
|
+
/** Identity of this judgement for "already sent" (never includes the confirmation hash). */
|
|
31
|
+
hash: string;
|
|
32
|
+
via: 'cli' | 'mcp';
|
|
33
|
+
agentId: string | null;
|
|
34
|
+
counterpartTitle: string | null;
|
|
35
|
+
}
|
|
36
|
+
export interface LeftLocal {
|
|
37
|
+
kind: WireKind;
|
|
38
|
+
why: 'counterpart_not_shared' | 'over_limit';
|
|
39
|
+
counterpartTitle: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface SharePayload {
|
|
42
|
+
localId: string;
|
|
43
|
+
item: WireItem;
|
|
44
|
+
shown: ShownJudgement[];
|
|
45
|
+
leftLocal: LeftLocal[];
|
|
46
|
+
/** Pair judgements whose counterpart is not on the team graph YET: sendable once it is. */
|
|
47
|
+
deferredPairs: Array<{
|
|
48
|
+
row: JudgementRow;
|
|
49
|
+
counterpartLocalId: string;
|
|
50
|
+
}>;
|
|
51
|
+
/** Hash of the item AS SENT (only judgements not already sent). Binds a confirmation code. */
|
|
52
|
+
hash: string;
|
|
53
|
+
/** Hash of the item with EVERY judgement: what the ledger remembers, so an unchanged share is "already shared". */
|
|
54
|
+
fullHash: string;
|
|
55
|
+
}
|
|
56
|
+
export interface BuildInput {
|
|
57
|
+
row: DecisionRow;
|
|
58
|
+
/** This judge's rows that name the decision (either end), tombstones already excluded by the reader. */
|
|
59
|
+
judgements: JudgementRow[];
|
|
60
|
+
/** The team graph's id for a local decision this machine already shared, if any. */
|
|
61
|
+
remoteIdOf: (localId: string) => string | undefined;
|
|
62
|
+
titleOf: (localId: string) => string | null;
|
|
63
|
+
/** The opaque idempotency key: the one stored at the first share, else clientKeyFor(...). */
|
|
64
|
+
clientKey: string;
|
|
65
|
+
/** The install's private share salt, for the opaque local-only source URL. */
|
|
66
|
+
salt: string;
|
|
67
|
+
/** Hashes of judgements this workspace already stored; they are not sent (or shown) again. */
|
|
68
|
+
alreadySent: ReadonlySet<string>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The idempotency key the server wants (a UUID), as an opaque hash of this install's secret salt and the
|
|
72
|
+
* local id. The raw local id never leaves the machine and two installs cannot be linked by it. It is
|
|
73
|
+
* derived ONCE: the caller stores it in the ledger at the first share and reuses that value, so a later
|
|
74
|
+
* change of local id (a twin fold) cannot mint a second key and a second team decision.
|
|
75
|
+
*/
|
|
76
|
+
export declare function clientKeyFor(salt: string, localId: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* A local row with no source URL still needs one on the wire. The raw local id never leaves the machine, so it is
|
|
79
|
+
* `align-local://decision/<hash of the share salt and the id>`. Matching by source key ignores this form (it names
|
|
80
|
+
* no connector item), and the server's identity for a share is (workspace, user, client_key), not the URL, so
|
|
81
|
+
* changing this form from the older raw-id one cannot mint a second team decision for a decision shared before.
|
|
82
|
+
*/
|
|
83
|
+
export declare function shareSourceUrl(row: {
|
|
84
|
+
id: string;
|
|
85
|
+
sourceUrl: string | null;
|
|
86
|
+
}, salt: string): string;
|
|
87
|
+
/** sha256 of the item with its keys sorted: the same payload hashes the same wherever it was built. */
|
|
88
|
+
export declare function hashItem(item: WireItem): string;
|
|
89
|
+
/** A judgement's identity for "already sent": its wire form without the confirmation hash. */
|
|
90
|
+
export declare function judgementHash(w: WireJudgement): string;
|
|
91
|
+
export declare function buildSharePayload(input: BuildInput): SharePayload;
|
|
92
|
+
/**
|
|
93
|
+
* The `decisions` array of POST /ingest/batch for share items: verbatim except the one rename `created_at` ->
|
|
94
|
+
* `decided_at` (the gateway's schema takes the second and strips the first). The ONE place that rename happens
|
|
95
|
+
* for a share: `shareBatch` (the typed path) and the sealed request (the browser path) both call it, so the
|
|
96
|
+
* bytes a person approves are the bytes the gateway ingests.
|
|
97
|
+
*/
|
|
98
|
+
export declare function toBatchDecisions(items: ReadonlyArray<Record<string, unknown> & {
|
|
99
|
+
created_at?: string;
|
|
100
|
+
}>): Array<Record<string, unknown>>;
|
|
101
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/lib/share/payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L9: the ONE builder of what `align share` sends. The preview, the confirmation code's hash and
|
|
3
|
+
* the request body all come from the object this returns, so the preview cannot show something other
|
|
4
|
+
* than what is sent (a test compares the previewed JSON with the ingest argument).
|
|
5
|
+
*
|
|
6
|
+
* What leaves the machine, per decision: the title, the text (the summary, sent as `raw_text`), the
|
|
7
|
+
* source URL and platform, when it was decided, and the judgements below. What never does:
|
|
8
|
+
* - `judge_id` and `judge_label` (the git email): the server takes the person from the token, and a
|
|
9
|
+
* label is personal data nobody asked for (Decision 11).
|
|
10
|
+
* - `context_key`, file paths, or a check verdict's scope: a check verdict goes as kind, value, time.
|
|
11
|
+
* - the local id as such: `client_key` is an OPAQUE key, a hash of this install's secret salt and the id (see
|
|
12
|
+
* clientKeyFor), stored at the first share and reused, so the team graph cannot link a share back to a local id.
|
|
13
|
+
* - a verdict whose other decision is not on the team graph (it stays local, and the preview says so).
|
|
14
|
+
* - a tombstone (a verdict taken back, `value` NULL): the person withdrew it.
|
|
15
|
+
*
|
|
16
|
+
* Judgement mapping: local `real` is `true_positive`, `false` is `false_positive`. Ratification is
|
|
17
|
+
* read from the decision's own columns (Decision 14), never from `local_judgements`. A row an agent
|
|
18
|
+
* relayed goes as `origin: local_share_mcp` with the registry id as `agent`; the id 'unknown' is omitted.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from 'node:crypto';
|
|
21
|
+
/** The gateway's per-item cap (MAX_JUDGEMENTS_PER_ITEM). Over it the batch is refused whole, so we cut first. */
|
|
22
|
+
export const MAX_SHARED_JUDGEMENTS = 50;
|
|
23
|
+
/**
|
|
24
|
+
* The idempotency key the server wants (a UUID), as an opaque hash of this install's secret salt and the
|
|
25
|
+
* local id. The raw local id never leaves the machine and two installs cannot be linked by it. It is
|
|
26
|
+
* derived ONCE: the caller stores it in the ledger at the first share and reuses that value, so a later
|
|
27
|
+
* change of local id (a twin fold) cannot mint a second key and a second team decision.
|
|
28
|
+
*/
|
|
29
|
+
export function clientKeyFor(salt, localId) {
|
|
30
|
+
const h = createHash('sha256').update(`align-share-key\n${salt}\n${localId}`).digest('hex');
|
|
31
|
+
return `${h.slice(0, 8)}-${h.slice(8, 12)}-5${h.slice(13, 16)}-a${h.slice(17, 20)}-${h.slice(20, 32)}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A local row with no source URL still needs one on the wire. The raw local id never leaves the machine, so it is
|
|
35
|
+
* `align-local://decision/<hash of the share salt and the id>`. Matching by source key ignores this form (it names
|
|
36
|
+
* no connector item), and the server's identity for a share is (workspace, user, client_key), not the URL, so
|
|
37
|
+
* changing this form from the older raw-id one cannot mint a second team decision for a decision shared before.
|
|
38
|
+
*/
|
|
39
|
+
export function shareSourceUrl(row, salt) {
|
|
40
|
+
if (row.sourceUrl !== null)
|
|
41
|
+
return row.sourceUrl;
|
|
42
|
+
return `align-local://decision/${createHash('sha256').update(`align-share-url\n${salt}\n${row.id}`).digest('hex').slice(0, 32)}`;
|
|
43
|
+
}
|
|
44
|
+
const VALUE = { real: 'true_positive', false: 'false_positive' };
|
|
45
|
+
function canonical(v) {
|
|
46
|
+
if (Array.isArray(v))
|
|
47
|
+
return `[${v.map(canonical).join(',')}]`;
|
|
48
|
+
if (v && typeof v === 'object') {
|
|
49
|
+
return `{${Object.entries(v).filter(([, x]) => x !== undefined).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)).map(([k, x]) => `${JSON.stringify(k)}:${canonical(x)}`).join(',')}}`;
|
|
50
|
+
}
|
|
51
|
+
return JSON.stringify(v) ?? 'null';
|
|
52
|
+
}
|
|
53
|
+
/** sha256 of the item with its keys sorted: the same payload hashes the same wherever it was built. */
|
|
54
|
+
export function hashItem(item) {
|
|
55
|
+
return createHash('sha256').update(canonical(item)).digest('hex');
|
|
56
|
+
}
|
|
57
|
+
/** A judgement's identity for "already sent": its wire form without the confirmation hash. */
|
|
58
|
+
export function judgementHash(w) {
|
|
59
|
+
const { confirm_team_text_hash: _c, ...rest } = w;
|
|
60
|
+
return createHash('sha256').update(canonical(rest)).digest('hex');
|
|
61
|
+
}
|
|
62
|
+
function wireFor(r, counterpart) {
|
|
63
|
+
const mcp = r.via === 'mcp';
|
|
64
|
+
const agent = mcp && r.agent_id && r.agent_id !== 'unknown' ? r.agent_id : undefined;
|
|
65
|
+
return {
|
|
66
|
+
kind: r.kind,
|
|
67
|
+
...(r.value ? { value: VALUE[r.value] } : {}),
|
|
68
|
+
...(r.kind === 'note' && r.note ? { note: r.note } : {}),
|
|
69
|
+
...(counterpart ? { counterpart_id: counterpart } : {}),
|
|
70
|
+
judged_at: r.judged_at,
|
|
71
|
+
origin: mcp ? 'local_share_mcp' : 'local_share',
|
|
72
|
+
...(agent ? { agent } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function shownOf(wire, via, agentId, counterpartTitle) {
|
|
76
|
+
return { wire, hash: judgementHash(wire), via, agentId, counterpartTitle };
|
|
77
|
+
}
|
|
78
|
+
export function buildSharePayload(input) {
|
|
79
|
+
const { row } = input;
|
|
80
|
+
const shown = [];
|
|
81
|
+
const leftLocal = [];
|
|
82
|
+
const deferredPairs = [];
|
|
83
|
+
if (row.ratifiedAt) {
|
|
84
|
+
shown.push(shownOf({ kind: 'ratify', judged_at: row.ratifiedAt, origin: 'local_share' }, 'cli', null, null));
|
|
85
|
+
}
|
|
86
|
+
const rows = [...input.judgements].sort((a, b) => (a.judged_at < b.judged_at ? -1 : a.judged_at > b.judged_at ? 1 : a.id < b.id ? -1 : 1));
|
|
87
|
+
for (const r of rows) {
|
|
88
|
+
// A withdrawn verdict is no verdict, whatever reader produced the list.
|
|
89
|
+
if (r.value === null && (r.kind === 'conflict_verdict' || r.kind === 'check_verdict'))
|
|
90
|
+
continue;
|
|
91
|
+
if (r.kind === 'conflict_verdict' || r.kind === 'supersede') {
|
|
92
|
+
if (r.counterpart_id === null)
|
|
93
|
+
continue;
|
|
94
|
+
// A supersede is directional: "decision_id replaces counterpart_id". It travels with the NEWER decision's share.
|
|
95
|
+
if (r.kind === 'supersede' && r.decision_id !== row.id)
|
|
96
|
+
continue;
|
|
97
|
+
const other = r.decision_id === row.id ? r.counterpart_id : r.decision_id;
|
|
98
|
+
const remote = input.remoteIdOf(other);
|
|
99
|
+
const counterpartTitle = input.titleOf(other);
|
|
100
|
+
if (!remote) {
|
|
101
|
+
leftLocal.push({ kind: r.kind, why: 'counterpart_not_shared', counterpartTitle });
|
|
102
|
+
deferredPairs.push({ row: r, counterpartLocalId: other });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
shown.push(shownOf(wireFor(r, remote), r.via, r.agent_id, counterpartTitle));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (r.decision_id !== row.id)
|
|
109
|
+
continue;
|
|
110
|
+
shown.push(shownOf(wireFor(r), r.via, r.agent_id, null));
|
|
111
|
+
}
|
|
112
|
+
// Everything the person has judged, whether or not it was sent before: the ledger's "unchanged" test reads this.
|
|
113
|
+
const everything = shown.map((x) => x.wire);
|
|
114
|
+
// What is SENT (and shown): only what this workspace has not stored yet, so a note is never posted twice.
|
|
115
|
+
const fresh = shown.filter((x) => !input.alreadySent.has(x.hash));
|
|
116
|
+
// The gateway refuses a whole batch over the cap, so cut here: the ratification first, then the newest.
|
|
117
|
+
let sending = fresh;
|
|
118
|
+
if (fresh.length > MAX_SHARED_JUDGEMENTS) {
|
|
119
|
+
const ratify = fresh.filter((x) => x.wire.kind === 'ratify');
|
|
120
|
+
const rest = fresh.filter((x) => x.wire.kind !== 'ratify');
|
|
121
|
+
const keep = new Set([...ratify, ...rest.slice(-(MAX_SHARED_JUDGEMENTS - ratify.length))]);
|
|
122
|
+
for (const dropped of fresh.filter((x) => !keep.has(x)))
|
|
123
|
+
leftLocal.push({ kind: dropped.wire.kind, why: 'over_limit', counterpartTitle: dropped.counterpartTitle });
|
|
124
|
+
sending = fresh.filter((x) => keep.has(x));
|
|
125
|
+
}
|
|
126
|
+
const base = {
|
|
127
|
+
source_url: shareSourceUrl(row, input.salt),
|
|
128
|
+
platform: row.platform,
|
|
129
|
+
title: row.title,
|
|
130
|
+
summary: row.summary,
|
|
131
|
+
raw_text: row.summary || row.title,
|
|
132
|
+
client_key: input.clientKey,
|
|
133
|
+
...(row.decidedAt ? { created_at: row.decidedAt } : {}),
|
|
134
|
+
};
|
|
135
|
+
const item = { ...base, judgements: sending.map((x) => x.wire) };
|
|
136
|
+
return { localId: row.id, item, shown: sending, leftLocal, deferredPairs, hash: hashItem(item), fullHash: hashItem({ ...base, judgements: everything }) };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The `decisions` array of POST /ingest/batch for share items: verbatim except the one rename `created_at` ->
|
|
140
|
+
* `decided_at` (the gateway's schema takes the second and strips the first). The ONE place that rename happens
|
|
141
|
+
* for a share: `shareBatch` (the typed path) and the sealed request (the browser path) both call it, so the
|
|
142
|
+
* bytes a person approves are the bytes the gateway ingests.
|
|
143
|
+
*/
|
|
144
|
+
export function toBatchDecisions(items) {
|
|
145
|
+
return items.map(({ created_at, ...rest }) => ({ ...rest, ...(created_at ? { decided_at: created_at } : {}) }));
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=payload.js.map
|