@aligndottech/cli 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +4 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +18 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +24 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +24 -5
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/docs.js +2 -2
- package/dist/commands/import/git.d.ts.map +1 -1
- package/dist/commands/import/git.js +15 -5
- package/dist/commands/import/git.js.map +1 -1
- package/dist/commands/import/github.d.ts.map +1 -1
- package/dist/commands/import/github.js +34 -7
- package/dist/commands/import/github.js.map +1 -1
- package/dist/commands/import/gitlab.d.ts.map +1 -1
- package/dist/commands/import/gitlab.js +10 -5
- package/dist/commands/import/gitlab.js.map +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +10 -5
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/import/linear.d.ts.map +1 -1
- package/dist/commands/import/linear.js +10 -5
- package/dist/commands/import/linear.js.map +1 -1
- package/dist/commands/import/notion.d.ts.map +1 -1
- package/dist/commands/import/notion.js +10 -5
- package/dist/commands/import/notion.js.map +1 -1
- package/dist/commands/import/sessions.js +2 -2
- package/dist/commands/import/slack.d.ts.map +1 -1
- package/dist/commands/import/slack.js +12 -7
- package/dist/commands/import/slack.js.map +1 -1
- package/dist/commands/import/teams.d.ts.map +1 -1
- package/dist/commands/import/teams.js +10 -5
- package/dist/commands/import/teams.js.map +1 -1
- package/dist/commands/import/zoom.d.ts.map +1 -1
- package/dist/commands/import/zoom.js +10 -5
- package/dist/commands/import/zoom.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +43 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +76 -4
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/mark.d.ts +37 -0
- package/dist/commands/mark.d.ts.map +1 -0
- package/dist/commands/mark.js +105 -0
- package/dist/commands/mark.js.map +1 -0
- package/dist/commands/mcp.d.ts +141 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +72 -14
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +8 -2
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.d.ts +39 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +65 -50
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/share.d.ts +7 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/sync.d.ts +55 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +278 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/telemetry.d.ts +3 -3
- package/dist/commands/telemetry.js +6 -6
- package/dist/commands/telemetry.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +6 -1
- package/dist/commands/why.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/backfill-state.d.ts +116 -0
- package/dist/lib/backfill-state.d.ts.map +1 -0
- package/dist/lib/backfill-state.js +342 -0
- package/dist/lib/backfill-state.js.map +1 -0
- package/dist/lib/backup-copy.d.ts +17 -0
- package/dist/lib/backup-copy.d.ts.map +1 -0
- package/dist/lib/backup-copy.js +13 -0
- package/dist/lib/backup-copy.js.map +1 -0
- package/dist/lib/capture-report.d.ts +22 -18
- package/dist/lib/capture-report.d.ts.map +1 -1
- package/dist/lib/capture-report.js +64 -2
- package/dist/lib/capture-report.js.map +1 -1
- package/dist/lib/config.d.ts +31 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +139 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/confirm-timeout.d.ts +8 -0
- package/dist/lib/confirm-timeout.d.ts.map +1 -0
- package/dist/lib/confirm-timeout.js +18 -0
- package/dist/lib/confirm-timeout.js.map +1 -0
- package/dist/lib/curation/check-marks.d.ts +48 -0
- package/dist/lib/curation/check-marks.d.ts.map +1 -0
- package/dist/lib/curation/check-marks.js +81 -0
- package/dist/lib/curation/check-marks.js.map +1 -0
- package/dist/lib/curation/guardrail.d.ts +39 -0
- package/dist/lib/curation/guardrail.d.ts.map +1 -0
- package/dist/lib/curation/guardrail.js +93 -0
- package/dist/lib/curation/guardrail.js.map +1 -0
- package/dist/lib/curation/judge.d.ts +3 -0
- package/dist/lib/curation/judge.d.ts.map +1 -0
- package/dist/lib/curation/judge.js +9 -0
- package/dist/lib/curation/judge.js.map +1 -0
- package/dist/lib/curation/judgements-db.d.ts +96 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -0
- package/dist/lib/curation/judgements-db.js +200 -0
- package/dist/lib/curation/judgements-db.js.map +1 -0
- package/dist/lib/curation/last-check.d.ts +32 -0
- package/dist/lib/curation/last-check.d.ts.map +1 -0
- package/dist/lib/curation/last-check.js +81 -0
- package/dist/lib/curation/last-check.js.map +1 -0
- package/dist/lib/curation/mark.d.ts +76 -0
- package/dist/lib/curation/mark.d.ts.map +1 -0
- package/dist/lib/curation/mark.js +359 -0
- package/dist/lib/curation/mark.js.map +1 -0
- package/dist/lib/curation/text.d.ts +6 -0
- package/dist/lib/curation/text.d.ts.map +1 -0
- package/dist/lib/curation/text.js +35 -0
- package/dist/lib/curation/text.js.map +1 -0
- package/dist/lib/fetchers/capture.d.ts +49 -2
- package/dist/lib/fetchers/capture.d.ts.map +1 -1
- package/dist/lib/fetchers/capture.js +7 -1
- package/dist/lib/fetchers/capture.js.map +1 -1
- package/dist/lib/fetchers/confluence.d.ts +2 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts +1 -0
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +3 -1
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts +44 -5
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +122 -5
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/gitlab.d.ts +2 -2
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
- package/dist/lib/fetchers/gitlab.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +2 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts +2 -2
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts +2 -2
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts +2 -3
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts +2 -2
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts +2 -2
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/gateway-client.d.ts +34 -0
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +19 -1
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/github-text.d.ts +3 -0
- package/dist/lib/github-text.d.ts.map +1 -0
- package/dist/lib/github-text.js +18 -0
- package/dist/lib/github-text.js.map +1 -0
- package/dist/lib/hook-context.d.ts +10 -0
- package/dist/lib/hook-context.d.ts.map +1 -1
- package/dist/lib/hook-context.js +14 -0
- package/dist/lib/hook-context.js.map +1 -1
- package/dist/lib/import-defaults.d.ts +39 -23
- package/dist/lib/import-defaults.d.ts.map +1 -1
- package/dist/lib/import-defaults.js +28 -26
- package/dist/lib/import-defaults.js.map +1 -1
- package/dist/lib/launch/adapters/aider.d.ts +17 -0
- package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
- package/dist/lib/launch/adapters/aider.js +30 -0
- package/dist/lib/launch/adapters/aider.js.map +1 -0
- package/dist/lib/launch/adapters/auggie.d.ts +18 -0
- package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
- package/dist/lib/launch/adapters/auggie.js +34 -0
- package/dist/lib/launch/adapters/auggie.js.map +1 -0
- package/dist/lib/launch/adapters/cline.d.ts +10 -0
- package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
- package/dist/lib/launch/adapters/cline.js +41 -0
- package/dist/lib/launch/adapters/cline.js.map +1 -0
- package/dist/lib/launch/adapters/continue.d.ts +22 -0
- package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
- package/dist/lib/launch/adapters/continue.js +46 -0
- package/dist/lib/launch/adapters/continue.js.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
- package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
- package/dist/lib/launch/adapters/gemini-cli.js +38 -53
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
- package/dist/lib/launch/adapters/goose.d.ts +20 -0
- package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
- package/dist/lib/launch/adapters/goose.js +47 -0
- package/dist/lib/launch/adapters/goose.js.map +1 -0
- package/dist/lib/launch/adapters/notes.d.ts +7 -0
- package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
- package/dist/lib/launch/adapters/notes.js +5 -0
- package/dist/lib/launch/adapters/notes.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +2 -0
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +3 -1
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/auggie-state.d.ts +25 -0
- package/dist/lib/launch/auggie-state.d.ts.map +1 -0
- package/dist/lib/launch/auggie-state.js +74 -0
- package/dist/lib/launch/auggie-state.js.map +1 -0
- package/dist/lib/launch/cline-state.d.ts +32 -0
- package/dist/lib/launch/cline-state.d.ts.map +1 -0
- package/dist/lib/launch/cline-state.js +108 -0
- package/dist/lib/launch/cline-state.js.map +1 -0
- package/dist/lib/launch/config-writes.d.ts +4 -0
- package/dist/lib/launch/config-writes.d.ts.map +1 -1
- package/dist/lib/launch/config-writes.js +8 -3
- package/dist/lib/launch/config-writes.js.map +1 -1
- package/dist/lib/launch/continue-state.d.ts +41 -0
- package/dist/lib/launch/continue-state.d.ts.map +1 -0
- package/dist/lib/launch/continue-state.js +142 -0
- package/dist/lib/launch/continue-state.js.map +1 -0
- package/dist/lib/launch/detect.d.ts.map +1 -1
- package/dist/lib/launch/detect.js +3 -1
- package/dist/lib/launch/detect.js.map +1 -1
- package/dist/lib/launch/gemini-state.d.ts +26 -20
- package/dist/lib/launch/gemini-state.d.ts.map +1 -1
- package/dist/lib/launch/gemini-state.js +95 -37
- package/dist/lib/launch/gemini-state.js.map +1 -1
- package/dist/lib/launch/gemini-system-file.d.ts +17 -0
- package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
- package/dist/lib/launch/gemini-system-file.js +55 -0
- package/dist/lib/launch/gemini-system-file.js.map +1 -0
- package/dist/lib/launch/gemini-trust.d.ts +3 -1
- package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
- package/dist/lib/launch/gemini-trust.js +10 -3
- package/dist/lib/launch/gemini-trust.js.map +1 -1
- package/dist/lib/launch/goose-state.d.ts +53 -0
- package/dist/lib/launch/goose-state.d.ts.map +1 -0
- package/dist/lib/launch/goose-state.js +137 -0
- package/dist/lib/launch/goose-state.js.map +1 -0
- package/dist/lib/launch/launch-files.d.ts.map +1 -1
- package/dist/lib/launch/launch-files.js +3 -2
- package/dist/lib/launch/launch-files.js.map +1 -1
- package/dist/lib/launch/launch.d.ts +17 -2
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +36 -3
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/mcp-child-env.d.ts +30 -0
- package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
- package/dist/lib/launch/mcp-child-env.js +151 -0
- package/dist/lib/launch/mcp-child-env.js.map +1 -0
- package/dist/lib/launch/pick-agent.d.ts.map +1 -1
- package/dist/lib/launch/pick-agent.js +4 -4
- package/dist/lib/launch/pick-agent.js.map +1 -1
- package/dist/lib/launch/picker-options.d.ts.map +1 -1
- package/dist/lib/launch/picker-options.js +7 -2
- package/dist/lib/launch/picker-options.js.map +1 -1
- package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
- package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/aider.js +13 -0
- package/dist/lib/launch/registry/agents/aider.js.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
- package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/auggie.js +11 -0
- package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
- package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
- package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/cline.js +19 -0
- package/dist/lib/launch/registry/agents/cline.js.map +1 -0
- package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
- package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/continue.js +20 -0
- package/dist/lib/launch/registry/agents/continue.js.map +1 -0
- package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
- package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
- package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
- package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/goose.js +20 -0
- package/dist/lib/launch/registry/agents/goose.js.map +1 -0
- package/dist/lib/launch/registry/index.d.ts +1 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +7 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +12 -1
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +22 -2
- package/dist/lib/launch/strict-entry.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.js +80 -2
- package/dist/lib/launch/strict-entry.js.map +1 -1
- package/dist/lib/launch/yaml-scan.d.ts +59 -0
- package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
- package/dist/lib/launch/yaml-scan.js +275 -0
- package/dist/lib/launch/yaml-scan.js.map +1 -0
- package/dist/lib/local-db-epoch.d.ts +4 -0
- package/dist/lib/local-db-epoch.d.ts.map +1 -0
- package/dist/lib/local-db-epoch.js +19 -0
- package/dist/lib/local-db-epoch.js.map +1 -0
- package/dist/lib/local-db-migrate.d.ts +85 -0
- package/dist/lib/local-db-migrate.d.ts.map +1 -0
- package/dist/lib/local-db-migrate.js +484 -0
- package/dist/lib/local-db-migrate.js.map +1 -0
- package/dist/lib/local-db-v10.d.ts +28 -0
- package/dist/lib/local-db-v10.d.ts.map +1 -0
- package/dist/lib/local-db-v10.js +49 -0
- package/dist/lib/local-db-v10.js.map +1 -0
- package/dist/lib/local-db-v11.d.ts +24 -0
- package/dist/lib/local-db-v11.d.ts.map +1 -0
- package/dist/lib/local-db-v11.js +25 -0
- package/dist/lib/local-db-v11.js.map +1 -0
- package/dist/lib/local-db-v7.d.ts +30 -0
- package/dist/lib/local-db-v7.d.ts.map +1 -0
- package/dist/lib/local-db-v7.js +285 -0
- package/dist/lib/local-db-v7.js.map +1 -0
- package/dist/lib/local-db-v8.d.ts +22 -0
- package/dist/lib/local-db-v8.d.ts.map +1 -0
- package/dist/lib/local-db-v8.js +33 -0
- package/dist/lib/local-db-v8.js.map +1 -0
- package/dist/lib/local-db-v9.d.ts +10 -0
- package/dist/lib/local-db-v9.d.ts.map +1 -0
- package/dist/lib/local-db-v9.js +8 -0
- package/dist/lib/local-db-v9.js.map +1 -0
- package/dist/lib/local-db.d.ts +61 -11
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +186 -371
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-embeddings.d.ts.map +1 -1
- package/dist/lib/local-embeddings.js +2 -2
- package/dist/lib/local-embeddings.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +30 -87
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +182 -171
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +129 -0
- package/dist/lib/local-ingest.d.ts.map +1 -0
- package/dist/lib/local-ingest.js +81 -0
- package/dist/lib/local-ingest.js.map +1 -0
- package/dist/lib/local-link-pass.d.ts +15 -0
- package/dist/lib/local-link-pass.d.ts.map +1 -0
- package/dist/lib/local-link-pass.js +61 -0
- package/dist/lib/local-link-pass.js.map +1 -0
- package/dist/lib/local-mode.d.ts +4 -1
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +16 -1
- package/dist/lib/local-mode.js.map +1 -1
- package/dist/lib/local-provenance.d.ts +14 -0
- package/dist/lib/local-provenance.d.ts.map +1 -0
- package/dist/lib/local-provenance.js +14 -0
- package/dist/lib/local-provenance.js.map +1 -0
- package/dist/lib/local-thresholds.d.ts +70 -0
- package/dist/lib/local-thresholds.d.ts.map +1 -0
- package/dist/lib/local-thresholds.js +79 -0
- package/dist/lib/local-thresholds.js.map +1 -0
- package/dist/lib/mcp/mark-tool.d.ts +27 -0
- package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
- package/dist/lib/mcp/mark-tool.js +103 -0
- package/dist/lib/mcp/mark-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +46 -0
- package/dist/lib/mcp/share-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-tool.js +68 -0
- package/dist/lib/mcp/share-tool.js.map +1 -0
- package/dist/lib/mcp/tool-rules.d.ts +30 -0
- package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
- package/dist/lib/mcp/tool-rules.js +84 -0
- package/dist/lib/mcp/tool-rules.js.map +1 -0
- package/dist/lib/mcp-backfill.d.ts +89 -0
- package/dist/lib/mcp-backfill.d.ts.map +1 -0
- package/dist/lib/mcp-backfill.js +194 -0
- package/dist/lib/mcp-backfill.js.map +1 -0
- package/dist/lib/mcp-scope.d.ts +90 -0
- package/dist/lib/mcp-scope.d.ts.map +1 -0
- package/dist/lib/mcp-scope.js +125 -0
- package/dist/lib/mcp-scope.js.map +1 -0
- package/dist/lib/mcp-sync.d.ts +64 -0
- package/dist/lib/mcp-sync.d.ts.map +1 -0
- package/dist/lib/mcp-sync.js +183 -0
- package/dist/lib/mcp-sync.js.map +1 -0
- package/dist/lib/personal-import.d.ts +7 -0
- package/dist/lib/personal-import.d.ts.map +1 -1
- package/dist/lib/personal-import.js +13 -1
- package/dist/lib/personal-import.js.map +1 -1
- package/dist/lib/safe-config-write.d.ts.map +1 -1
- package/dist/lib/safe-config-write.js +39 -2
- package/dist/lib/safe-config-write.js.map +1 -1
- package/dist/lib/scope-choices.d.ts +51 -0
- package/dist/lib/scope-choices.d.ts.map +1 -0
- package/dist/lib/scope-choices.js +193 -0
- package/dist/lib/scope-choices.js.map +1 -0
- package/dist/lib/scope-connect.d.ts +82 -0
- package/dist/lib/scope-connect.d.ts.map +1 -0
- package/dist/lib/scope-connect.js +258 -0
- package/dist/lib/scope-connect.js.map +1 -0
- package/dist/lib/scope-defaults.d.ts +3 -0
- package/dist/lib/scope-defaults.d.ts.map +1 -0
- package/dist/lib/scope-defaults.js +42 -0
- package/dist/lib/scope-defaults.js.map +1 -0
- package/dist/lib/scope-real.d.ts +223 -0
- package/dist/lib/scope-real.d.ts.map +1 -0
- package/dist/lib/scope-real.js +58 -0
- package/dist/lib/scope-real.js.map +1 -0
- package/dist/lib/scope-values.d.ts +76 -0
- package/dist/lib/scope-values.d.ts.map +1 -0
- package/dist/lib/scope-values.js +169 -0
- package/dist/lib/scope-values.js.map +1 -0
- package/dist/lib/scope.d.ts +161 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +323 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/share/command.d.ts +32 -0
- package/dist/lib/share/command.d.ts.map +1 -0
- package/dist/lib/share/command.js +136 -0
- package/dist/lib/share/command.js.map +1 -0
- package/dist/lib/share/ledger.d.ts +59 -0
- package/dist/lib/share/ledger.d.ts.map +1 -0
- package/dist/lib/share/ledger.js +135 -0
- package/dist/lib/share/ledger.js.map +1 -0
- package/dist/lib/share/payload.d.ts +92 -0
- package/dist/lib/share/payload.d.ts.map +1 -0
- package/dist/lib/share/payload.js +138 -0
- package/dist/lib/share/payload.js.map +1 -0
- package/dist/lib/share/pending.d.ts +48 -0
- package/dist/lib/share/pending.d.ts.map +1 -0
- package/dist/lib/share/pending.js +130 -0
- package/dist/lib/share/pending.js.map +1 -0
- package/dist/lib/share/preview.d.ts +18 -0
- package/dist/lib/share/preview.d.ts.map +1 -0
- package/dist/lib/share/preview.js +72 -0
- package/dist/lib/share/preview.js.map +1 -0
- package/dist/lib/share/run.d.ts +115 -0
- package/dist/lib/share/run.d.ts.map +1 -0
- package/dist/lib/share/run.js +261 -0
- package/dist/lib/share/run.js.map +1 -0
- package/dist/lib/share/salt.d.ts +2 -0
- package/dist/lib/share/salt.d.ts.map +1 -0
- package/dist/lib/share/salt.js +44 -0
- package/dist/lib/share/salt.js.map +1 -0
- package/dist/lib/share/secret-patterns.json +100 -0
- package/dist/lib/share/secret-scan.d.ts +19 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -0
- package/dist/lib/share/secret-scan.js +75 -0
- package/dist/lib/share/secret-scan.js.map +1 -0
- package/dist/lib/share/tty.d.ts +4 -0
- package/dist/lib/share/tty.d.ts.map +1 -0
- package/dist/lib/share/tty.js +57 -0
- package/dist/lib/share/tty.js.map +1 -0
- package/dist/lib/share/visible.d.ts +4 -0
- package/dist/lib/share/visible.d.ts.map +1 -0
- package/dist/lib/share/visible.js +30 -0
- package/dist/lib/share/visible.js.map +1 -0
- package/dist/lib/share/wire.d.ts +98 -0
- package/dist/lib/share/wire.d.ts.map +1 -0
- package/dist/lib/share/wire.js +43 -0
- package/dist/lib/share/wire.js.map +1 -0
- package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
- package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
- package/dist/lib/similarity/embedding-matrix.js +119 -0
- package/dist/lib/similarity/embedding-matrix.js.map +1 -0
- package/dist/lib/since-flag.d.ts +11 -0
- package/dist/lib/since-flag.d.ts.map +1 -0
- package/dist/lib/since-flag.js +24 -0
- package/dist/lib/since-flag.js.map +1 -0
- package/dist/lib/since.d.ts +59 -0
- package/dist/lib/since.d.ts.map +1 -0
- package/dist/lib/since.js +86 -0
- package/dist/lib/since.js.map +1 -0
- package/dist/lib/source-key.d.ts +13 -0
- package/dist/lib/source-key.d.ts.map +1 -0
- package/dist/lib/source-key.js +60 -0
- package/dist/lib/source-key.js.map +1 -0
- package/dist/lib/source-sync-state.d.ts +12 -0
- package/dist/lib/source-sync-state.d.ts.map +1 -0
- package/dist/lib/source-sync-state.js +43 -0
- package/dist/lib/source-sync-state.js.map +1 -0
- package/dist/lib/startup-backfill-track.d.ts +2 -0
- package/dist/lib/startup-backfill-track.d.ts.map +1 -0
- package/dist/lib/startup-backfill-track.js +6 -0
- package/dist/lib/startup-backfill-track.js.map +1 -0
- package/dist/lib/startup-xdg.d.ts +2 -0
- package/dist/lib/startup-xdg.d.ts.map +1 -0
- package/dist/lib/startup-xdg.js +9 -0
- package/dist/lib/startup-xdg.js.map +1 -0
- package/dist/lib/sync/after-connect.d.ts +2 -0
- package/dist/lib/sync/after-connect.d.ts.map +1 -0
- package/dist/lib/sync/after-connect.js +18 -0
- package/dist/lib/sync/after-connect.js.map +1 -0
- package/dist/lib/sync/bg-claim.d.ts +14 -0
- package/dist/lib/sync/bg-claim.d.ts.map +1 -0
- package/dist/lib/sync/bg-claim.js +97 -0
- package/dist/lib/sync/bg-claim.js.map +1 -0
- package/dist/lib/sync/blocked.d.ts +8 -0
- package/dist/lib/sync/blocked.d.ts.map +1 -0
- package/dist/lib/sync/blocked.js +44 -0
- package/dist/lib/sync/blocked.js.map +1 -0
- package/dist/lib/sync/classify.d.ts +34 -0
- package/dist/lib/sync/classify.d.ts.map +1 -0
- package/dist/lib/sync/classify.js +91 -0
- package/dist/lib/sync/classify.js.map +1 -0
- package/dist/lib/sync/drain.d.ts +16 -0
- package/dist/lib/sync/drain.d.ts.map +1 -0
- package/dist/lib/sync/drain.js +33 -0
- package/dist/lib/sync/drain.js.map +1 -0
- package/dist/lib/sync/forget.d.ts +12 -0
- package/dist/lib/sync/forget.d.ts.map +1 -0
- package/dist/lib/sync/forget.js +32 -0
- package/dist/lib/sync/forget.js.map +1 -0
- package/dist/lib/sync/launch-hook.d.ts +42 -0
- package/dist/lib/sync/launch-hook.d.ts.map +1 -0
- package/dist/lib/sync/launch-hook.js +117 -0
- package/dist/lib/sync/launch-hook.js.map +1 -0
- package/dist/lib/sync/lock.d.ts +35 -0
- package/dist/lib/sync/lock.d.ts.map +1 -0
- package/dist/lib/sync/lock.js +175 -0
- package/dist/lib/sync/lock.js.map +1 -0
- package/dist/lib/sync/purge.d.ts +38 -0
- package/dist/lib/sync/purge.d.ts.map +1 -0
- package/dist/lib/sync/purge.js +61 -0
- package/dist/lib/sync/purge.js.map +1 -0
- package/dist/lib/sync/real-env.d.ts +208 -0
- package/dist/lib/sync/real-env.d.ts.map +1 -0
- package/dist/lib/sync/real-env.js +47 -0
- package/dist/lib/sync/real-env.js.map +1 -0
- package/dist/lib/sync/relink.d.ts +14 -0
- package/dist/lib/sync/relink.d.ts.map +1 -0
- package/dist/lib/sync/relink.js +36 -0
- package/dist/lib/sync/relink.js.map +1 -0
- package/dist/lib/sync/report.d.ts +3 -0
- package/dist/lib/sync/report.d.ts.map +1 -0
- package/dist/lib/sync/report.js +54 -0
- package/dist/lib/sync/report.js.map +1 -0
- package/dist/lib/sync/run-all.d.ts +23 -0
- package/dist/lib/sync/run-all.d.ts.map +1 -0
- package/dist/lib/sync/run-all.js +30 -0
- package/dist/lib/sync/run-all.js.map +1 -0
- package/dist/lib/sync/run-source.d.ts +73 -0
- package/dist/lib/sync/run-source.d.ts.map +1 -0
- package/dist/lib/sync/run-source.js +262 -0
- package/dist/lib/sync/run-source.js.map +1 -0
- package/dist/lib/sync/safe-read.d.ts +4 -0
- package/dist/lib/sync/safe-read.d.ts.map +1 -0
- package/dist/lib/sync/safe-read.js +40 -0
- package/dist/lib/sync/safe-read.js.map +1 -0
- package/dist/lib/sync/should-background-sync.d.ts +31 -0
- package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
- package/dist/lib/sync/should-background-sync.js +69 -0
- package/dist/lib/sync/should-background-sync.js.map +1 -0
- package/dist/lib/sync/source-ids.d.ts +10 -0
- package/dist/lib/sync/source-ids.d.ts.map +1 -0
- package/dist/lib/sync/source-ids.js +9 -0
- package/dist/lib/sync/source-ids.js.map +1 -0
- package/dist/lib/sync/sources.d.ts +33 -0
- package/dist/lib/sync/sources.d.ts.map +1 -0
- package/dist/lib/sync/sources.js +37 -0
- package/dist/lib/sync/sources.js.map +1 -0
- package/dist/lib/sync/spawn-background.d.ts +27 -0
- package/dist/lib/sync/spawn-background.d.ts.map +1 -0
- package/dist/lib/sync/spawn-background.js +66 -0
- package/dist/lib/sync/spawn-background.js.map +1 -0
- package/dist/lib/sync/status.d.ts +57 -0
- package/dist/lib/sync/status.d.ts.map +1 -0
- package/dist/lib/sync/status.js +166 -0
- package/dist/lib/sync/status.js.map +1 -0
- package/dist/lib/sync/summary-read.d.ts +19 -0
- package/dist/lib/sync/summary-read.d.ts.map +1 -0
- package/dist/lib/sync/summary-read.js +39 -0
- package/dist/lib/sync/summary-read.js.map +1 -0
- package/dist/lib/sync/summary.d.ts +10 -0
- package/dist/lib/sync/summary.d.ts.map +1 -0
- package/dist/lib/sync/summary.js +80 -0
- package/dist/lib/sync/summary.js.map +1 -0
- package/dist/lib/sync/sync-state.d.ts +128 -0
- package/dist/lib/sync/sync-state.d.ts.map +1 -0
- package/dist/lib/sync/sync-state.js +253 -0
- package/dist/lib/sync/sync-state.js.map +1 -0
- package/dist/lib/sync/telemetry.d.ts +20 -0
- package/dist/lib/sync/telemetry.d.ts.map +1 -0
- package/dist/lib/sync/telemetry.js +31 -0
- package/dist/lib/sync/telemetry.js.map +1 -0
- package/dist/lib/sync/threads.d.ts +48 -0
- package/dist/lib/sync/threads.d.ts.map +1 -0
- package/dist/lib/sync/threads.js +82 -0
- package/dist/lib/sync/threads.js.map +1 -0
- package/dist/lib/sync/window.d.ts +72 -0
- package/dist/lib/sync/window.d.ts.map +1 -0
- package/dist/lib/sync/window.js +112 -0
- package/dist/lib/sync/window.js.map +1 -0
- package/dist/lib/team-cta.d.ts +11 -0
- package/dist/lib/team-cta.d.ts.map +1 -0
- package/dist/lib/team-cta.js +16 -0
- package/dist/lib/team-cta.js.map +1 -0
- package/dist/lib/telemetry-ci.d.ts +2 -0
- package/dist/lib/telemetry-ci.d.ts.map +1 -0
- package/dist/lib/telemetry-ci.js +21 -0
- package/dist/lib/telemetry-ci.js.map +1 -0
- package/dist/lib/telemetry-consent.d.ts +44 -23
- package/dist/lib/telemetry-consent.d.ts.map +1 -1
- package/dist/lib/telemetry-consent.js +74 -35
- package/dist/lib/telemetry-consent.js.map +1 -1
- package/dist/lib/telemetry-env.d.ts +1 -1
- package/dist/lib/usage-telemetry.d.ts +87 -22
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +263 -74
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/dist/lib/xdg.d.ts +27 -0
- package/dist/lib/xdg.d.ts.map +1 -0
- package/dist/lib/xdg.js +56 -0
- package/dist/lib/xdg.js.map +1 -0
- package/package.json +3 -2
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -98
- package/dist/commands/push.js.map +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L9: `align share` as a function of injected dependencies, returning an exit code. The commander
|
|
3
|
+
* wrapper (commands/share.ts) wires the real config, gateway client and prompts; tests wire fakes.
|
|
4
|
+
*
|
|
5
|
+
* Who may complete a share: a person at a terminal. EVERY path (a plain `align share` and
|
|
6
|
+
* `align share --confirm <code>`) shows the preview on the CONTROLLING terminal and needs a typed
|
|
7
|
+
* yes there (default No). There is no `--yes`: a flag is exactly what an agent would pass. A caller
|
|
8
|
+
* with no controlling terminal is refused. The known gap (an agent that allocates its own
|
|
9
|
+
* pseudo-terminal) is stated in SECURITY.md.
|
|
10
|
+
*/
|
|
11
|
+
import { visible } from './visible.js';
|
|
12
|
+
import { teamCtaLine } from '../team-cta.js';
|
|
13
|
+
import { combinedHash, consumeCode, lookupCode, sweepPending } from './pending.js';
|
|
14
|
+
import { prepare, ratifiedRows, renderResults, renderTeamText, retract, secretRefusal, send, ShareError } from './run.js';
|
|
15
|
+
const NO_TERMINAL = 'Confirm this in your own terminal: there is no interactive terminal here (an agent shell, a pipe and a hook have none). Nothing was sent.';
|
|
16
|
+
export async function runShare(opts, deps) {
|
|
17
|
+
// Every line this prints can carry text a stranger wrote (a remote id, a tenant name, a server error, a
|
|
18
|
+
// pending file's env). visible() is idempotent, so lines that were already escaped pass through unchanged.
|
|
19
|
+
const out = (l) => deps.out(visible(l, { keepNewline: true }));
|
|
20
|
+
const err = (l) => deps.err(visible(l, { keepNewline: true }));
|
|
21
|
+
if (deps.wrapped) {
|
|
22
|
+
err('align share is not run from inside an agent that align launched. Open a normal terminal of your own and run it there. Nothing was sent.');
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
if (deps.cloudEnv.mode === 'demo') {
|
|
26
|
+
err('align share needs a team account, and this environment is in demo mode. Run: align login');
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
if (deps.cloudEnv.mode === 'local-embedded' || !deps.cloudEnv.authToken) {
|
|
30
|
+
err(`align share sends decisions from your local graph to your team's.\n ${teamCtaLine()}\n Already have a team? Run: align login`);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
if (!deps.localDbPath) {
|
|
34
|
+
err('There is no local graph on this machine to share from. `align setup --local` creates one.');
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
const dbPath = deps.localDbPath;
|
|
38
|
+
sweepPending(); // codes are 10 minutes; a file a day old is leftover
|
|
39
|
+
const ctx = async () => ({ dbPath, envName: opts.envName, client: deps.client(), judge: await deps.judge(), salt: deps.salt, gatewayUrl: deps.cloudEnv.gatewayUrl, defaultGatewayUrl: deps.defaultGatewayUrl });
|
|
40
|
+
try {
|
|
41
|
+
if (opts.retract !== undefined) {
|
|
42
|
+
const r = await retract(await ctx(), opts.retract);
|
|
43
|
+
(r.ok ? out : err)(r.message);
|
|
44
|
+
return r.ok ? 0 : 1;
|
|
45
|
+
}
|
|
46
|
+
let ids = opts.ids;
|
|
47
|
+
let pendingCode;
|
|
48
|
+
if (opts.confirm !== undefined) {
|
|
49
|
+
const found = lookupCode(opts.confirm);
|
|
50
|
+
if (!found.ok) {
|
|
51
|
+
err(found.reason === 'expired' ? 'That confirmation code has expired. Ask your agent to start the share again.' : 'That confirmation code is not valid (unknown, malformed or already used). Nothing was sent.');
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
if (found.pending.envName !== opts.envName) {
|
|
55
|
+
err(`That code was issued for ${found.pending.envName}, not ${opts.envName}. Nothing was sent.`);
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
ids = found.pending.localIds;
|
|
59
|
+
pendingCode = opts.confirm;
|
|
60
|
+
}
|
|
61
|
+
else if (ids.length === 0) {
|
|
62
|
+
if (!opts.allRatified && opts.sinceIso === undefined) {
|
|
63
|
+
err('Name what to share: align share <id> [<id>...], or --all-ratified, or --since <30d|2w|6m>.');
|
|
64
|
+
return 2;
|
|
65
|
+
}
|
|
66
|
+
ids = ratifiedRows(dbPath, { owner: await deps.owner(), sinceIso: opts.sinceIso }).map((r) => r.id);
|
|
67
|
+
if (ids.length === 0) {
|
|
68
|
+
out('Nothing to share: you have no ratified decisions in that range.');
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const c = await ctx();
|
|
73
|
+
const prep = await prepare(c, ids);
|
|
74
|
+
if (prep.secrets.length) {
|
|
75
|
+
err(secretRefusal(prep.secrets));
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
for (const a of prep.already)
|
|
79
|
+
out(`Already shared as ${visible(a.remoteId)}: ${visible(a.title)}`);
|
|
80
|
+
if (prep.payloads.length === 0)
|
|
81
|
+
return 0;
|
|
82
|
+
if (pendingCode !== undefined) {
|
|
83
|
+
const found = lookupCode(pendingCode);
|
|
84
|
+
if (!found.ok) {
|
|
85
|
+
err('That confirmation code is no longer valid. Nothing was sent.');
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
if (found.pending.hash !== combinedHash(prep.payloads, prep)) {
|
|
89
|
+
err('What would be shared, or where it would go (the workspace or the gateway), has changed since your agent previewed it. Nothing was sent. Ask your agent to start again.');
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
const yes = await deps.ttyConfirm(prep.preview, `Share ${prep.payloads.length} decision${prep.payloads.length === 1 ? '' : 's'} with ${visible(prep.dest.workspace)}?`);
|
|
93
|
+
if (yes === null) {
|
|
94
|
+
err(NO_TERMINAL);
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
if (!yes) {
|
|
98
|
+
out('Nothing was sent.');
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
if (!consumeCode(pendingCode)) {
|
|
102
|
+
err('That code was already used. Nothing was sent.');
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const yes = await deps.ttyConfirm(prep.preview, `Share ${prep.payloads.length} decision${prep.payloads.length === 1 ? '' : 's'} with ${visible(prep.dest.workspace)}?`);
|
|
108
|
+
if (yes === null) {
|
|
109
|
+
err(NO_TERMINAL);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
if (!yes) {
|
|
113
|
+
out('Nothing was sent.');
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const results = await send(c, prep, {
|
|
118
|
+
confirmTeamText: async (i) => {
|
|
119
|
+
const shown = `"${visible(i.title)}" is already on your team graph, as:\n${renderTeamText(i.team)}\nYour ratification would put your name on THAT text, not on yours.`;
|
|
120
|
+
return (await deps.ttyConfirm(shown, 'Do you stand behind the team\'s text?')) === true;
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
out(`\n${renderResults(results)}`);
|
|
124
|
+
const failed = results.some((r) => r.outcome.kind === 'refused' || r.outcome.kind === 'unknown');
|
|
125
|
+
return failed ? 1 : 0;
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
if (e instanceof ShareError) {
|
|
129
|
+
err(e.message);
|
|
130
|
+
return e.exitCode;
|
|
131
|
+
}
|
|
132
|
+
err(e.message);
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/lib/share/command.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":"AAYA,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;AAqCpP,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,135 @@
|
|
|
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 { assertSchemaSupported } from '../local-db-migrate.js';
|
|
11
|
+
import { LEDGER_COLUMNS } from '../local-db-v10.js';
|
|
12
|
+
function parseSent(raw) {
|
|
13
|
+
try {
|
|
14
|
+
const v = JSON.parse(raw);
|
|
15
|
+
return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const fromRow = (r) => ({
|
|
22
|
+
localId: r.local_id, env: r.env, tenantId: r.tenant_id, remoteId: r.remote_id, contentHash: r.content_hash,
|
|
23
|
+
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,
|
|
24
|
+
});
|
|
25
|
+
function withDb(dbPath, fn) {
|
|
26
|
+
const db = new DatabaseSync(dbPath);
|
|
27
|
+
try {
|
|
28
|
+
db.exec('PRAGMA busy_timeout = 30000');
|
|
29
|
+
assertSchemaSupported(db.prepare('PRAGMA user_version').get().user_version);
|
|
30
|
+
return fn(db);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
db.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function readDb(dbPath, fallback, fn) {
|
|
37
|
+
if (dbPath === '' || !fs.existsSync(dbPath))
|
|
38
|
+
return fallback;
|
|
39
|
+
return withDb(dbPath, (db) => {
|
|
40
|
+
try {
|
|
41
|
+
return fn(db);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
if (/no such table/i.test(e.message))
|
|
45
|
+
return fallback;
|
|
46
|
+
throw e;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function getPromotion(dbPath, localId, env, tenantId) {
|
|
51
|
+
return readDb(dbPath, null, (db) => {
|
|
52
|
+
const r = db.prepare('SELECT * FROM promotions WHERE local_id = ? AND env = ? AND tenant_id = ?').get(localId, env, tenantId);
|
|
53
|
+
return r ? fromRow(r) : null;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** A row `align push` left before the ledger existed: it names no workspace. */
|
|
57
|
+
export function getLegacyPromotion(dbPath, localId, env) {
|
|
58
|
+
return getPromotion(dbPath, localId, env, 'legacy');
|
|
59
|
+
}
|
|
60
|
+
/** Insert, or replace the hash and remote id of an existing row; a re-share clears an earlier retraction. */
|
|
61
|
+
export function recordPromotion(dbPath, p) {
|
|
62
|
+
withDb(dbPath, (db) => {
|
|
63
|
+
db.prepare(`INSERT INTO promotions (local_id, env, tenant_id, remote_id, content_hash, matched, client_key, sent, confirm_pending) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
64
|
+
ON CONFLICT (local_id, env, tenant_id) DO UPDATE SET
|
|
65
|
+
remote_id = excluded.remote_id, content_hash = excluded.content_hash, matched = excluded.matched,
|
|
66
|
+
client_key = excluded.client_key, sent = excluded.sent, confirm_pending = excluded.confirm_pending,
|
|
67
|
+
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);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const UPSERT = `INSERT INTO promotions (local_id, env, tenant_id, remote_id, content_hash, matched, client_key, sent, confirm_pending) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
71
|
+
ON CONFLICT (local_id, env, tenant_id) DO UPDATE SET
|
|
72
|
+
remote_id = excluded.remote_id, content_hash = excluded.content_hash, matched = excluded.matched,
|
|
73
|
+
client_key = excluded.client_key, sent = excluded.sent, confirm_pending = excluded.confirm_pending,
|
|
74
|
+
shared_at = datetime('now'), retracted_at = NULL`;
|
|
75
|
+
/** Several rows in ONE transaction: all of them land or none do. */
|
|
76
|
+
export function recordPromotions(dbPath, rows) {
|
|
77
|
+
if (rows.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
withDb(dbPath, (db) => {
|
|
80
|
+
const up = db.prepare(UPSERT);
|
|
81
|
+
db.exec('BEGIN IMMEDIATE');
|
|
82
|
+
try {
|
|
83
|
+
for (const p of rows)
|
|
84
|
+
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);
|
|
85
|
+
db.exec('COMMIT');
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
db.exec('ROLLBACK');
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function markRetracted(dbPath, localId, env, tenantId) {
|
|
94
|
+
withDb(dbPath, (db) => {
|
|
95
|
+
db.prepare(`UPDATE promotions SET retracted_at = datetime('now') WHERE local_id = ? AND env = ? AND tenant_id = ?`).run(localId, env, tenantId);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Every live (not retracted) share into one workspace, keyed by local id. */
|
|
99
|
+
export function listPromotions(dbPath, env, tenantId) {
|
|
100
|
+
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)
|
|
101
|
+
.map((r) => [r.local_id, fromRow(r)])));
|
|
102
|
+
}
|
|
103
|
+
/** Every ledger row, raw, so a reset can carry the record of what was shared across a wipe. [] when there is none. */
|
|
104
|
+
export function exportLedger(dbPath) {
|
|
105
|
+
return readDb(dbPath, [], (db) => db.prepare('SELECT * FROM promotions').all());
|
|
106
|
+
}
|
|
107
|
+
/** Put exported rows back (replay-safe: the key is the table's primary key). */
|
|
108
|
+
export function restoreLedger(dbPath, rows) {
|
|
109
|
+
if (rows.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
withDb(dbPath, (db) => {
|
|
112
|
+
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)
|
|
113
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
114
|
+
db.exec('BEGIN IMMEDIATE');
|
|
115
|
+
try {
|
|
116
|
+
for (const r of rows)
|
|
117
|
+
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);
|
|
118
|
+
db.exec('COMMIT');
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
db.exec('ROLLBACK');
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** True when the ledger table has every column this code uses. A share checks it BEFORE any request. */
|
|
127
|
+
export function ledgerReady(dbPath) {
|
|
128
|
+
if (!fs.existsSync(dbPath))
|
|
129
|
+
return false;
|
|
130
|
+
return withDb(dbPath, (db) => {
|
|
131
|
+
const cols = new Set(db.prepare('PRAGMA table_info(promotions)').all().map((c) => c.name));
|
|
132
|
+
return LEDGER_COLUMNS.every((c) => cols.has(c));
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# 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,92 @@
|
|
|
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
|
+
//# 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,138 @@
|
|
|
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
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/lib/share/payload.ts"],"names":[],"mappings":"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"}
|