sealbridge 0.4.2 → 0.5.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.
Files changed (115) hide show
  1. package/README.ja.md +4 -2
  2. package/README.md +6 -2
  3. package/dist/cli/dist/accept.d.ts +2 -1
  4. package/dist/cli/dist/accept.js +18 -7
  5. package/dist/cli/dist/accept.js.map +1 -1
  6. package/dist/cli/dist/index.js +46 -13
  7. package/dist/cli/dist/index.js.map +1 -1
  8. package/dist/cli/dist/invite-links.d.ts +14 -0
  9. package/dist/cli/dist/invite-links.js +263 -0
  10. package/dist/cli/dist/invite-links.js.map +1 -0
  11. package/dist/cli/dist/invite-output.d.ts +1 -1
  12. package/dist/cli/dist/invite-output.js +3 -2
  13. package/dist/cli/dist/invite-output.js.map +1 -1
  14. package/dist/cli/dist/network.js +16 -23
  15. package/dist/cli/dist/network.js.map +1 -1
  16. package/dist/cli/dist/receipt.d.ts +12 -2
  17. package/dist/cli/dist/receipt.js +6 -5
  18. package/dist/cli/dist/receipt.js.map +1 -1
  19. package/dist/cli/dist/sdk.d.ts +6 -4
  20. package/dist/cli/dist/sdk.js +3 -2
  21. package/dist/cli/dist/sdk.js.map +1 -1
  22. package/dist/examples/two-owner-demo/dist/run-demo.js +3 -1
  23. package/dist/examples/two-owner-demo/dist/run-demo.js.map +1 -1
  24. package/dist/package.json +1 -1
  25. package/dist/packages/core/dist/context-grant.d.ts +13 -0
  26. package/dist/packages/core/dist/context-grant.js +65 -0
  27. package/dist/packages/core/dist/context-grant.js.map +1 -0
  28. package/dist/packages/core/dist/delegation.d.ts +17 -0
  29. package/dist/packages/core/dist/delegation.js +126 -0
  30. package/dist/packages/core/dist/delegation.js.map +1 -0
  31. package/dist/packages/core/dist/edge.d.ts +2 -0
  32. package/dist/packages/core/dist/edge.js +2 -0
  33. package/dist/packages/core/dist/edge.js.map +1 -1
  34. package/dist/packages/core/dist/index.d.ts +4 -0
  35. package/dist/packages/core/dist/index.js +4 -0
  36. package/dist/packages/core/dist/index.js.map +1 -1
  37. package/dist/packages/core/dist/invite-link.d.ts +72 -0
  38. package/dist/packages/core/dist/invite-link.js +225 -0
  39. package/dist/packages/core/dist/invite-link.js.map +1 -0
  40. package/dist/packages/core/dist/invite-sas.d.ts +7 -0
  41. package/dist/packages/core/dist/invite-sas.js +15 -0
  42. package/dist/packages/core/dist/invite-sas.js.map +1 -0
  43. package/dist/packages/core/dist/relay-auth.d.ts +1 -1
  44. package/dist/packages/core/dist/relay-auth.js +1 -1
  45. package/dist/packages/core/dist/relay-auth.js.map +1 -1
  46. package/dist/packages/core/dist/schema.d.ts +1 -1
  47. package/dist/packages/core/dist/schema.js +4 -0
  48. package/dist/packages/core/dist/schema.js.map +1 -1
  49. package/dist/packages/core/dist/types.d.ts +52 -0
  50. package/dist/packages/ledger/dist/index.d.ts +70 -2
  51. package/dist/packages/ledger/dist/index.js +404 -26
  52. package/dist/packages/ledger/dist/index.js.map +1 -1
  53. package/dist/packages/relay/dist/fetch.js +4 -0
  54. package/dist/packages/relay/dist/fetch.js.map +1 -1
  55. package/dist/packages/relay/dist/invites.d.ts +42 -0
  56. package/dist/packages/relay/dist/invites.js +347 -0
  57. package/dist/packages/relay/dist/invites.js.map +1 -0
  58. package/dist/packages/relay/dist/worker.d.ts +3 -0
  59. package/dist/packages/relay/dist/worker.js +21 -0
  60. package/dist/packages/relay/dist/worker.js.map +1 -1
  61. package/dist/packages/runtime/dist/a2a.js +1 -1
  62. package/dist/packages/runtime/dist/adapter.d.ts +1 -0
  63. package/dist/packages/runtime/dist/approval-providers.d.ts +4 -0
  64. package/dist/packages/runtime/dist/approval-providers.js +3 -0
  65. package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
  66. package/dist/packages/runtime/dist/connection-persistence.d.ts +1 -1
  67. package/dist/packages/runtime/dist/context-grant-audit.d.ts +8 -0
  68. package/dist/packages/runtime/dist/context-grant-audit.js +41 -0
  69. package/dist/packages/runtime/dist/context-grant-audit.js.map +1 -0
  70. package/dist/packages/runtime/dist/delegation.d.ts +37 -0
  71. package/dist/packages/runtime/dist/delegation.js +125 -0
  72. package/dist/packages/runtime/dist/delegation.js.map +1 -0
  73. package/dist/packages/runtime/dist/gateway.d.ts +1 -0
  74. package/dist/packages/runtime/dist/gateway.js.map +1 -1
  75. package/dist/packages/runtime/dist/index.d.ts +2 -0
  76. package/dist/packages/runtime/dist/index.js +2 -0
  77. package/dist/packages/runtime/dist/index.js.map +1 -1
  78. package/dist/packages/runtime/dist/mcp-server.js +22 -8
  79. package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
  80. package/dist/packages/runtime/dist/mcp-tool-catalog.js +44 -5
  81. package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
  82. package/dist/packages/runtime/dist/session-audit.d.ts +6 -1
  83. package/dist/packages/runtime/dist/session-audit.js +35 -4
  84. package/dist/packages/runtime/dist/session-audit.js.map +1 -1
  85. package/dist/packages/runtime/dist/session.d.ts +21 -1
  86. package/dist/packages/runtime/dist/session.js +427 -62
  87. package/dist/packages/runtime/dist/session.js.map +1 -1
  88. package/dist/packages/runtime/dist/task-journal.d.ts +10 -1
  89. package/dist/packages/runtime/dist/task-journal.js +26 -1
  90. package/dist/packages/runtime/dist/task-journal.js.map +1 -1
  91. package/dist/packages/runtime/dist/verifier.d.ts +5 -2
  92. package/dist/packages/runtime/dist/verifier.js +14 -4
  93. package/dist/packages/runtime/dist/verifier.js.map +1 -1
  94. package/dist/spec/audit-entry.schema.json +25 -1
  95. package/dist/spec/audit-evidence.schema.json +179 -0
  96. package/dist/spec/audit-file-record.schema.json +177 -0
  97. package/dist/spec/audit-interruption.schema.json +110 -0
  98. package/dist/spec/context-grant-audit-payload.schema.json +24 -0
  99. package/dist/spec/context-grant.schema.json +146 -0
  100. package/dist/spec/delegation-attachment.schema.json +167 -0
  101. package/dist/spec/delegation-link.schema.json +141 -0
  102. package/dist/spec/examples/context-pooling/approval_redelegation/sample-delegation-attachment.json +413 -0
  103. package/dist/spec/examples/context-pooling/hand_over/sample-context-grant.json +18 -0
  104. package/dist/spec/examples/context-pooling/hand_over/sample-task-manifest.0.2.0.json +94 -0
  105. package/dist/spec/examples/context-pooling/sample-context-grant-audit-payload.json +4 -0
  106. package/dist/spec/examples/context-pooling/view_only/sample-context-grant.json +18 -0
  107. package/dist/spec/examples/context-pooling/view_only/sample-task-manifest.0.2.0.json +94 -0
  108. package/dist/spec/examples/sample-audit-evidence.json +138 -0
  109. package/dist/spec/examples/sample-audit-file-record.json +31 -0
  110. package/dist/spec/examples/sample-audit-interruption.json +29 -0
  111. package/dist/spec/task-manifest.0.2.0.schema.json +87 -1
  112. package/docs/context-grants.md +221 -0
  113. package/docs/sdk.ja.md +4 -0
  114. package/docs/sdk.md +4 -0
  115. package/package.json +3 -2
package/README.ja.md CHANGED
@@ -14,7 +14,7 @@ Windows PowerShell:
14
14
  irm https://sealbridge.dev/install.ps1 | iex
15
15
  ```
16
16
 
17
- インストーラーは sealbridge 0.4.2 を固定指定しています。Node 22以上があれば `npm i -g sealbridge` または `npx sealbridge@latest` も使えます。
17
+ インストーラーは npm で公開待ちの sealbridge 0.5.0 を固定指定しています。更新したインストーラーは sealbridge@0.5.0 の npm 公開後にのみデプロイしてください。Node 22以上があれば `npm i -g sealbridge` または `npx sealbridge@latest` も使えます。
18
18
 
19
19
  Node 22 以上と同じインストール先の npm が正常に動く場合は再利用します。それ以外は既存の Node を変更せず、npm 同梱の Node をユーザー専用ディレクトリに導入します。Nodeが必要な場合は公式Node 22.22.0のチェックサムを検証します。秘密情報の入力・テレメトリー・管理者権限・Git・pnpmは不要です。macOS/Linuxでは新しいターミナルを開くか `. "$HOME/.profile"` を実行してください(パイプ実行では親シェルのPATHを変更できません)。Windowsでは現在と次回のPATHを設定します。`sealbridge doctor`、`sealbridge demo` で確認できます。doctorは中継器のヘルスチェックを1回行います。オフライン警告があってもインストールは保持します。
20
20
 
@@ -49,7 +49,7 @@ Node 22 以上と同じインストール先の npm が正常に動く場合は
49
49
 
50
50
  30秒のデモ、音声なし — [MP4を見る](docs/media/sealbridge-demo.mp4)。
51
51
 
52
- > **ステータス**: Sealbridge `v0.4.2` は 2026-11-05 UTC 付けの現行リリースです。Sealbridge `v0.4.1` は 2026-11-05 UTC に npm パッケージ `sealbridge` として公開されました。Sealbridge `v0.4.0` は 2026-11-05 UTC に npm パッケージ `sealbridge` として公開されました。Sealbridge `v0.3.0` は 2026-11-03 UTC に npm パッケージ `sealbridge` として公開されました。以前の `v1.0.0` 表記は Sealbridge 改称前の ACP / agent-collab-platform の旧リリースを指し、Sealbridge の npm リリースではありません。
52
+ > **ステータス**: Sealbridge `v0.5.0` を 2026-11-06 UTC 付けのリリースとして npm パッケージ `sealbridge` で準備中で、公開待ちです。Sealbridge `v0.4.1` は 2026-11-05 UTC に npm パッケージ `sealbridge` として公開されました。Sealbridge `v0.4.0` は 2026-11-05 UTC に npm パッケージ `sealbridge` として公開されました。Sealbridge `v0.3.0` は 2026-11-03 UTC に npm パッケージ `sealbridge` として公開されました。以前の `v1.0.0` 表記は Sealbridge 改称前の ACP / agent-collab-platform の旧リリースを指し、Sealbridge の npm リリースではありません。
53
53
  > **目的**: 異なる所有者の自律エージェントが、相手のランタイムや認証情報を信頼せずに、仕事の分割・委譲・実行・検証・検収を行うためのオープンソースのプロトコルと参照実装です。
54
54
  > **作成者**: [@takapon01234](https://x.com/takapon01234)
55
55
 
@@ -905,3 +905,5 @@ relay のデプロイは不要です。
905
905
  受信側の主張は双方向監査とは別で、引き渡しは既読・実行の証明ではありません。
906
906
  委任結果のキャッシュや保留の明示的な再依頼とは別の読み取りです。relay の配備は不要で、
907
907
  詳細な観測には相手の C4 対応が必要です。[relay の動作](docs/relay-reliability.ja.md)を参照してください。
908
+
909
+ ワーカーの `--audit-interruption-format 1`(`WorkerNodeOptions.auditInterruptionFormat: 1`)で、PROPOSE 一件だけの承認待ちに対する単独署名の中断終端を明示的に有効化できます。先に監査の読み取り側を更新してください。検証結果は `UNILATERALLY_CLOSED`・`valid:false`・`audit-verify` 終了コード 2 となり、双方の完了合意を表しません。[形式・復元・照合規則(英語)](docs/audit-interruption.md)を参照してください。
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Sealbridge
2
2
 
3
+ Optional context selections and delivery modes: [Context grants (CP1)](docs/context-grants.md).
4
+
3
5
  ## Install
4
6
 
5
7
  macOS / Linux:
@@ -14,7 +16,7 @@ Windows PowerShell:
14
16
  irm https://sealbridge.dev/install.ps1 | iex
15
17
  ```
16
18
 
17
- The installers pin sealbridge 0.4.2. With Node 22+, you can also use `npm i -g sealbridge` or `npx sealbridge@latest`.
19
+ The installers pin sealbridge 0.5.0, pending publication on npm. Deploy the updated installers only after sealbridge@0.5.0 is on npm. With Node 22+, you can also use `npm i -g sealbridge` or `npx sealbridge@latest`.
18
20
 
19
21
  The installer reuses Node 22 or newer only when its co-installed npm runs successfully; otherwise it installs Node with bundled npm in a user-local directory without changing the existing Node. It verifies the official Node 22.22.0 archive checksum when Node is needed, and asks for no secrets. No telemetry, sudo, Git or pnpm is required. On macOS/Linux open a new terminal or run `. "$HOME/.profile"` after installing; a piped shell cannot change its parent shell's PATH. Windows updates the current session and user PATH. Run `sealbridge doctor`, then `sealbridge demo`. Doctor makes one relay health request; offline warnings do not undo installation.
20
22
 
@@ -51,7 +53,7 @@ To uninstall, download the same script and run `sh install.sh --uninstall` or `&
51
53
 
52
54
  30-second demo, no audio — [watch the MP4](docs/media/sealbridge-demo.mp4).
53
55
 
54
- > **Status**: Sealbridge `v0.4.2` is the current release, dated 2026-11-05 UTC. Sealbridge `v0.4.1` was published on npm as `sealbridge` on 2026-11-05 UTC. Sealbridge `v0.4.0` was published on npm as `sealbridge` on 2026-11-05 UTC. Sealbridge `v0.3.0` was published on npm as `sealbridge` on 2026-11-03 UTC. The earlier `v1.0.0` label refers to the legacy pre-Sealbridge ACP / agent-collab-platform release, not a Sealbridge npm release.
56
+ > **Status**: Sealbridge `v0.5.0` is being prepared for release dated 2026-11-06 UTC on npm as `sealbridge`; publication is pending. Sealbridge `v0.4.1` was published on npm as `sealbridge` on 2026-11-05 UTC. Sealbridge `v0.4.0` was published on npm as `sealbridge` on 2026-11-05 UTC. Sealbridge `v0.3.0` was published on npm as `sealbridge` on 2026-11-03 UTC. The earlier `v1.0.0` label refers to the legacy pre-Sealbridge ACP / agent-collab-platform release, not a Sealbridge npm release.
55
57
  > **Target**: An open-source protocol and reference implementation that lets autonomous agents owned by different people split, delegate, run, verify, and accept work without trusting each other's runtimes or credentials.
56
58
  > **Author**: [@takapon01234](https://x.com/takapon01234)
57
59
 
@@ -314,6 +316,8 @@ The file is created or restricted to mode `0600`; rejected proposals are omitted
314
316
  and write failures stop execution. Treat this file as private task data, and keep
315
317
  it outside your repository. This also works with the default sandbox echo worker.
316
318
 
319
+ Workers can opt into PROPOSE-only local interruption terminals with `--audit-interruption-format 1` (`WorkerNodeOptions.auditInterruptionFormat: 1`) after updating readers. A verified worker-only terminal is `UNILATERALLY_CLOSED`, `valid:false`, and `audit-verify` exit 2; it does not establish bilateral completion. See [audit interruption format and recovery](docs/audit-interruption.md).
320
+
317
321
  Worker restart recovery is enabled automatically when `--inbox` or `--audit` is
318
322
  configured (`WorkerNodeOptions.inboxPath` / `auditPath`). The worker writes private,
319
323
  signed, fsynced task checkpoints to `<inboxPath>.tasks.jsonl`, or
@@ -6,8 +6,9 @@ interface AcceptOptions extends InviteStoreOptions, IdentityStoreOptions {
6
6
  unref?: () => unknown;
7
7
  };
8
8
  output?: Writable;
9
+ fetch?: typeof fetch;
9
10
  readPaste?: () => Promise<string>;
10
11
  }
11
- /** User-operated import; no relay, DNS, or contact operations. */
12
+ /** User-operated import. Only short links contact the relay; import grants no consent. */
12
13
  export declare function acceptCommand(command: 'accept' | 'invites', args: string[], options?: AcceptOptions): Promise<void>;
13
14
  export {};
@@ -1,7 +1,9 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
+ import { claimInviteLink } from './invite-links.js';
3
+ import { digest, parseAndVerifyInviteToken, inviteLinkVerificationNumber } from '../../packages/core/dist/index.js';
2
4
  import { createInterface } from 'node:readline';
3
5
  import { InviteStore, inspectStoredIdentity, resolveStoredIdentity } from '../../packages/runtime/dist/index.js';
4
- const USAGE = 'Usage: sealbridge accept <link> [--alias <slug>] [--allow-private-relay] | accept --paste [--alias <slug>] [--allow-private-relay] | accept --stdin [--alias <slug>] [--allow-private-relay] | invites list | invites remove <alias-or-ref>';
6
+ const USAGE = 'Usage: sealbridge accept <link> [--alias <slug>] [--allow-private-relay] [--no-network] | accept --paste [--alias <slug>] [--allow-private-relay] | accept --stdin [--alias <slug>] [--allow-private-relay] | invites list | invites remove <alias-or-ref>';
5
7
  // Allow the existing 64 KiB token bound plus link framing and whitespace.
6
8
  const MAX_STDIN_BYTES = 68 * 1024;
7
9
  const STDIN_TIMEOUT_MS = 10_000;
@@ -72,11 +74,11 @@ async function paste(options) {
72
74
  reader.once('error', () => { reject(new Error('INVITE_INPUT_UNAVAILABLE')); reader.close(); });
73
75
  });
74
76
  }
75
- /** User-operated import; no relay, DNS, or contact operations. */
77
+ /** User-operated import. Only short links contact the relay; import grants no consent. */
76
78
  export async function acceptCommand(command, args, options = {}) {
77
79
  if (args.includes('--help') || args.includes('-h')) {
78
80
  console.log(USAGE + (command === 'accept'
79
- ? '\n--stdin reads one link from a pipe or file until EOF (68 KiB, 10 seconds); TTY input is rejected. Use --paste at a terminal. Output is token-free JSON.\n--allow-private-relay permits loopback/private relay invitations for this import; blocked by default.' : ''));
81
+ ? '\n--stdin reads one link from a pipe or file until EOF (68 KiB, 10 seconds); TTY input is rejected. Use --paste at a terminal. Output is token-free JSON with verificationNumber and relayContacted. --no-network refuses short links requiring relay access.\n--allow-private-relay permits loopback/private relay invitations for this import; blocked by default.' : ''));
80
82
  return;
81
83
  }
82
84
  if (command === 'invites') {
@@ -89,7 +91,7 @@ export async function acceptCommand(command, args, options = {}) {
89
91
  ? { invites: store?.list() ?? [] } : { removed: store?.remove(args[1]) ?? false }));
90
92
  return;
91
93
  }
92
- let alias, link, usePaste = false, useStdin = false, allowPrivateRelay = false;
94
+ let alias, link, usePaste = false, useStdin = false, allowPrivateRelay = false, noNetwork = false;
93
95
  for (let i = 0; i < args.length; i++) {
94
96
  const arg = args[i];
95
97
  if (arg === '--alias' && alias === undefined && args[i + 1] && !args[i + 1].startsWith('--'))
@@ -98,6 +100,8 @@ export async function acceptCommand(command, args, options = {}) {
98
100
  usePaste = true;
99
101
  else if (arg === '--stdin' && !useStdin)
100
102
  useStdin = true;
103
+ else if (arg === '--no-network' && !noNetwork)
104
+ noNetwork = true;
101
105
  else if (arg === '--allow-private-relay' && !allowPrivateRelay)
102
106
  allowPrivateRelay = true;
103
107
  else if (!arg.startsWith('--') && link === undefined)
@@ -111,9 +115,16 @@ export async function acceptCommand(command, args, options = {}) {
111
115
  link = (await paste(options)).trim();
112
116
  if (useStdin)
113
117
  link = await readStdin(options);
118
+ const shortLink = /^(?:https:\/\/sealbridge\.app\/j|sealbridge:\/\/join)/.test(link);
119
+ if (shortLink && noNetwork)
120
+ throw new Error('INVITE_LINK_NETWORK_REQUIRED: this invitation requires the relay; --no-network refused it');
121
+ const relayPolicy = { ...options.relayPolicy, allowPrivateRelay };
122
+ if (shortLink)
123
+ link = await claimInviteLink(link, { ...options, relayPolicy });
124
+ const invite = parseAndVerifyInviteToken(link, options.now?.() ?? Date.now(), relayPolicy);
125
+ const verificationNumber = inviteLinkVerificationNumber(digest(invite));
114
126
  const owner = await resolveStoredIdentity('requester', options);
115
- console.log(JSON.stringify((await InviteStore.open(owner, {
116
- ...options, relayPolicy: { ...options.relayPolicy, allowPrivateRelay },
117
- })).import(link, alias)));
127
+ const result = await (await InviteStore.open(owner, { ...options, relayPolicy })).import(link, alias, shortLink ? { pendingConfirmation: true } : undefined);
128
+ console.log(JSON.stringify({ ...result, verificationNumber, relayContacted: shortLink }));
118
129
  }
119
130
  //# sourceMappingURL=accept.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accept.js","sourceRoot":"","sources":["../src/accept.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../src/accept.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
4
4
  import { generateKeyPair, validateSchema, signApproval } from '../../packages/core/dist/index.js';
5
- import { parseJsonl, verifyAudit } from '../../packages/ledger/dist/index.js';
5
+ import { parseAuditJsonl, verifyAuditEvidence } from '../../packages/ledger/dist/index.js';
6
6
  import { runDemo } from '../../examples/two-owner-demo/dist/run-demo.js';
7
7
  import { networkCommand } from './network.js';
8
8
  import { mcpServerCommand } from './mcp.js';
@@ -20,9 +20,19 @@ import { acceptCommand } from './accept.js';
20
20
  import { invitesMigrateCommand } from './invites-migrate.js';
21
21
  import { formatCliError } from './error-messages.js';
22
22
  const read = (path) => JSON.parse(readFileSync(path, 'utf8'));
23
+ function parseAuditJson(text) {
24
+ try {
25
+ return JSON.parse(text);
26
+ }
27
+ catch {
28
+ // Parser messages may quote input. JSON bundles and anchors have no JSONL location.
29
+ throw new SyntaxError('Invalid JSON');
30
+ }
31
+ }
23
32
  const USAGE = 'Usage: sealbridge <setup|config|doctor|keygen|validate|approve|audit-verify|receipt|contacts|connections|requests|tasks|pending|board|demo|relay|worker|delegate|discover|invite|accept|invites|mcp-server>';
24
33
  const AUDIT_VERIFY_USAGE = 'Usage: sealbridge audit-verify <audit.jsonl|bundle.json> [trust-anchor.json] ' +
25
- '[--expect-final-state <state>] [--expect-last-hash <hash>] [--expect-entry-count <n>]';
34
+ '[--expect-final-state <state>] [--expect-last-hash <hash>] [--expect-entry-count <n>] [--expect-closure-kind bilateral|interruption] [--expect-interruption-hash <hash>]\n' +
35
+ 'Exit codes: 0 bilateral VALID; 2 UNILATERALLY_CLOSED (valid:false); 1 invalid or unreadable.';
26
36
  function auditVerifyFlag(args, index, name) {
27
37
  const value = args[index + 1];
28
38
  if (!value || value.startsWith('--'))
@@ -34,6 +44,8 @@ function parseAuditVerifyArgs(args) {
34
44
  let expectedFinalState;
35
45
  let expectedLastEntryHash;
36
46
  let expectedEntryCount;
47
+ let expectedClosureKind;
48
+ let expectedInterruptionHash;
37
49
  for (let i = 0; i < args.length; i++) {
38
50
  const arg = args[i];
39
51
  if (arg === '--expect-final-state') {
@@ -50,6 +62,21 @@ function parseAuditVerifyArgs(args) {
50
62
  i++;
51
63
  continue;
52
64
  }
65
+ if (arg === '--expect-closure-kind') {
66
+ if (expectedClosureKind !== undefined)
67
+ throw new Error('Duplicate option: ' + arg);
68
+ const value = auditVerifyFlag(args, i++, arg);
69
+ if (value !== 'bilateral' && value !== 'interruption')
70
+ throw new Error('INVALID_EXPECT_CLOSURE_KIND');
71
+ expectedClosureKind = value;
72
+ continue;
73
+ }
74
+ if (arg === '--expect-interruption-hash') {
75
+ if (expectedInterruptionHash !== undefined)
76
+ throw new Error('Duplicate option: ' + arg);
77
+ expectedInterruptionHash = auditVerifyFlag(args, i++, arg);
78
+ continue;
79
+ }
53
80
  if (arg === '--expect-entry-count') {
54
81
  if (expectedEntryCount !== undefined)
55
82
  throw new Error('Duplicate option: ' + arg);
@@ -75,6 +102,8 @@ function parseAuditVerifyArgs(args) {
75
102
  expectedFinalState,
76
103
  expectedLastEntryHash,
77
104
  expectedEntryCount,
105
+ expectedClosureKind,
106
+ expectedInterruptionHash,
78
107
  };
79
108
  }
80
109
  function save(path, value, privateFile = false) {
@@ -205,20 +234,22 @@ async function main(args) {
205
234
  const parsed = parseAuditVerifyArgs(rest);
206
235
  const input = readFileSync(parsed.input, 'utf8');
207
236
  const bundle = parsed.input.endsWith('.jsonl')
208
- ? parseJsonl(input)
209
- : JSON.parse(input);
237
+ ? parseAuditJsonl(input)
238
+ : parseAuditJson(input);
210
239
  const options = {};
211
240
  if (parsed.anchorPath) {
212
- const file = read(parsed.anchorPath);
241
+ const file = parseAuditJson(readFileSync(parsed.anchorPath, 'utf8'));
213
242
  if (!file || typeof file !== 'object' || Array.isArray(file))
214
243
  throw new Error('INVALID_TRUST_ANCHOR');
215
244
  // A positional trust-anchor file still pins taskId and actors, as before.
216
245
  options.trustAnchor = file;
217
- options.taskId = typeof file.taskId === 'string' ? file.taskId : '';
218
- options.actors =
219
- Array.isArray(file.actors) && file.actors.length === 2
220
- ? file.actors
221
- : ['', ''];
246
+ if (!bundle || typeof bundle !== 'object' || !('interruption' in bundle)) {
247
+ options.taskId = typeof file.taskId === 'string' ? file.taskId : '';
248
+ options.actors =
249
+ Array.isArray(file.actors) && file.actors.length === 2
250
+ ? file.actors
251
+ : ['', ''];
252
+ }
222
253
  if (typeof file.head === 'string')
223
254
  options.head = file.head;
224
255
  }
@@ -228,14 +259,16 @@ async function main(args) {
228
259
  options.expectedLastEntryHash = parsed.expectedLastEntryHash;
229
260
  if (parsed.expectedEntryCount !== undefined)
230
261
  options.expectedEntryCount = parsed.expectedEntryCount;
262
+ options.expectedClosureKind = parsed.expectedClosureKind;
263
+ options.expectedInterruptionHash = parsed.expectedInterruptionHash;
231
264
  const anchored = parsed.anchorPath !== undefined ||
232
265
  parsed.expectedFinalState !== undefined ||
233
266
  parsed.expectedLastEntryHash !== undefined ||
234
- parsed.expectedEntryCount !== undefined;
235
- const result = verifyAudit(bundle, anchored ? options : undefined);
267
+ parsed.expectedEntryCount !== undefined || parsed.expectedClosureKind !== undefined || parsed.expectedInterruptionHash !== undefined;
268
+ const result = verifyAuditEvidence(bundle, anchored ? options : undefined);
236
269
  console.log(JSON.stringify(result));
237
270
  if (!result.valid)
238
- process.exitCode = 1;
271
+ process.exitCode = result.status === 'UNILATERALLY_CLOSED' ? 2 : 1;
239
272
  break;
240
273
  }
241
274
  case 'demo': {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { KeyPair, RevocationList } from '../../packages/core/dist/index.js';
2
+ import type { IdentityStoreOptions, InviteStoreOptions } from '../../packages/runtime/dist/index.js';
3
+ export declare const SHORT_INVITE_USAGE = "Usage: sealbridge invite create [--share token|link] [--key FILE] [--relay URL] [--name TEXT] [--expires-in SECONDS] [--link-expires-in 300..259200] [--output stdout|file:PATH|fd:N] [--qr terminal|none] [--png FILE] [--svg FILE] [--allow-private-relay]\n sealbridge invite links list | cancel <linkRef> [--key FILE]";
4
+ export interface LinkCommandOptions {
5
+ identityOptions?: IdentityStoreOptions;
6
+ fetch?: typeof fetch;
7
+ }
8
+ /** Reread signed cancellation notices for running CLI workers on each admission check. */
9
+ export declare function linkRevocations(owner: KeyPair, options?: IdentityStoreOptions): RevocationList;
10
+ export declare function claimInviteLink(value: string, options?: InviteStoreOptions & {
11
+ fetch?: typeof fetch;
12
+ }): Promise<string>;
13
+ export declare function createInviteCommand(args: string[], options?: LinkCommandOptions): Promise<void>;
14
+ export declare function inviteLinksCommand(args: string[], options?: LinkCommandOptions): Promise<void>;
@@ -0,0 +1,263 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import * as fs from 'node:fs';
3
+ import { join, dirname } from 'node:path';
4
+ import { createHash, randomBytes } from 'node:crypto';
5
+ import QRCode from 'qrcode';
6
+ import { createInviteToken, createSignedAgentCard, createRelayAuthToken, generateInviteLinkKey, deriveInviteLinkKeys, inviteLinkClaimTag, inviteLinkExpiry, encryptInviteLink, packInviteLinkCiphertext, parseInviteLink, unpackInviteLinkCiphertext, decryptInviteLink, parseAndVerifyInviteToken, digest, normalizeRelayOrigin, inviteLinkVerificationNumber, signPayload, verifySigned, createRevocationNotice, RevocationRegistry } from '../../packages/core/dist/index.js';
7
+ import { HttpRelayClient } from '../../packages/relay/dist/index.js';
8
+ import { LiveProtocol, readApplicationConfig } from '../../packages/runtime/dist/index.js';
9
+ import { resolveDataRoot, ensurePrivateDirectory, inspectPrivateDirectory, writePrivateFile, readPrivateFile } from '../../packages/runtime/dist/local-identity.js';
10
+ import { commandIdentity } from './command-identity.js';
11
+ import { parseInviteOutput, deliverInvite } from './invite-output.js';
12
+ export const SHORT_INVITE_USAGE = 'Usage: sealbridge invite create [--share token|link] [--key FILE] [--relay URL] [--name TEXT] [--expires-in SECONDS] [--link-expires-in 300..259200] [--output stdout|file:PATH|fd:N] [--qr terminal|none] [--png FILE] [--svg FILE] [--allow-private-relay]\n sealbridge invite links list | cancel <linkRef> [--key FILE]';
13
+ const UNSUPPORTED = 'INVITE_LINK_UNSUPPORTED_RELAY: この relay は短いリンクを受け付けませんでした。古い relay か、わざと断っているのかは区別できません。ほかの relay を使うか、--share token を自分で選んでください';
14
+ const UNAVAILABLE = 'INVITE_LINK_UNAVAILABLE: このリンクは使えません。期限切れ、使用済み、または途中が欠けています。送ってくれた人に、新しいリンクを頼んでください。';
15
+ function directory(owner, options) {
16
+ return join(resolveDataRoot(options), 'invite-links', createHash('sha256').update(owner.did).digest('hex'));
17
+ }
18
+ function saveRecord(owner, record, options) {
19
+ const dir = directory(owner, options);
20
+ ensurePrivateDirectory(dir, fs);
21
+ writePrivateFile(join(dir, record.id + '.json'), Buffer.from(JSON.stringify(signPayload(record, owner))), fs);
22
+ }
23
+ function records(owner, options) {
24
+ const dir = directory(owner, options);
25
+ if (!fs.existsSync(dir))
26
+ return [];
27
+ inspectPrivateDirectory(dir, fs);
28
+ return fs.readdirSync(dir).filter(n => /^[A-Za-z0-9_-]{22}\.json$/.test(n)).map(name => {
29
+ const data = JSON.parse(readPrivateFile(join(dir, name), fs, 8192));
30
+ if (!verifySigned(data, owner.did) || data.payload.type !== 'CreatedInviteLink' || data.payload.ownerDid !== owner.did || data.payload.id + '.json' !== name ||
31
+ !/^sha256:[a-f0-9]{64}$/.test(data.payload.inviteDigest))
32
+ throw new Error('INVITE_LINK_STORE_INVALID');
33
+ return data.payload;
34
+ });
35
+ }
36
+ /** Reread signed cancellation notices for running CLI workers on each admission check. */
37
+ export function linkRevocations(owner, options = {}) {
38
+ const registry = (targetType, targetId) => {
39
+ const result = new RevocationRegistry();
40
+ if (targetType !== 'invite' || !/^sha256:[a-f0-9]{64}$/.test(targetId))
41
+ return result;
42
+ const path = join(directory(owner, options), 'revoked', targetId.slice(7) + '.json');
43
+ const text = readPrivateFile(path, fs, 16384);
44
+ if (text)
45
+ result.revoke(JSON.parse(text), owner.did);
46
+ return result;
47
+ };
48
+ return { isRevoked: (type, id) => registry(type, id).isRevoked(type, id),
49
+ assertNotRevoked: (type, id) => registry(type, id).assertNotRevoked(type, id),
50
+ noticesFor: (type, id) => registry(type, id).noticesFor(type, id) };
51
+ }
52
+ function transport(relay, options, allowPrivateRelay = false) {
53
+ return new HttpRelayClient(relay, options.fetch ?? fetch, { allowPrivateRelay }).fetcher;
54
+ }
55
+ async function requestJson(fetcher, relay, path, method, owner, body) {
56
+ let response;
57
+ try {
58
+ response = await fetcher(relay + path, { method, redirect: 'error', signal: AbortSignal.timeout(15000),
59
+ headers: { ...(owner ? { authorization: 'Bearer ' + createRelayAuthToken(owner, { action: 'invite-manage', origin: relay }) } : {}),
60
+ ...(body === undefined ? {} : { 'content-type': 'application/json' }) },
61
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }) });
62
+ }
63
+ catch {
64
+ throw new Error('INVITE_LINK_RELAY_UNAVAILABLE');
65
+ }
66
+ if (response.status === 404) {
67
+ throw new Error(path === '/v1/capabilities' || path === '/v1/invites' ? UNSUPPORTED : UNAVAILABLE);
68
+ }
69
+ if (!response.ok)
70
+ throw new Error(response.status === 429 ? 'INVITE_LINK_RATE_LIMITED' : 'INVITE_LINK_RELAY_REJECTED');
71
+ // Bound untrusted responses independently of Content-Length.
72
+ const reader = response.body?.getReader();
73
+ if (!reader)
74
+ throw new Error('INVALID_INVITE_LINK_RESPONSE');
75
+ const chunks = [];
76
+ let size = 0;
77
+ try {
78
+ for (;;) {
79
+ const { value, done } = await reader.read();
80
+ if (done)
81
+ break;
82
+ size += value.length;
83
+ if (size > 24000) {
84
+ await reader.cancel();
85
+ throw new Error();
86
+ }
87
+ chunks.push(value);
88
+ }
89
+ return JSON.parse(Buffer.concat(chunks).toString());
90
+ }
91
+ catch {
92
+ throw new Error('INVALID_INVITE_LINK_RESPONSE');
93
+ }
94
+ finally {
95
+ reader.releaseLock();
96
+ }
97
+ }
98
+ export async function claimInviteLink(value, options = {}) {
99
+ const parsed = parseInviteLink(value, options.relayPolicy), keys = deriveInviteLinkKeys(parsed.k);
100
+ const fetcher = transport(parsed.relayOrigin, { fetch: options.fetch }, options.relayPolicy?.allowPrivateRelay);
101
+ const capabilities = await requestJson(fetcher, parsed.relayOrigin, '/v1/capabilities', 'GET');
102
+ if (capabilities?.inviteLinks !== 1)
103
+ throw new Error(UNSUPPORTED);
104
+ const claim = { id: keys.id.toString('base64url'), tag: inviteLinkClaimTag(keys.accessKey, keys.id).toString('base64url'), claimNonce: randomBytes(32).toString('base64url') };
105
+ let response;
106
+ try {
107
+ response = await requestJson(fetcher, parsed.relayOrigin, '/v1/invites/claim', 'POST', undefined, claim);
108
+ }
109
+ catch (error) {
110
+ // A lost reply may follow a successful claim. Reuse the same nonce once,
111
+ // inside the relay's 120-second recovery window; terminal refusals stay terminal.
112
+ if (!(error instanceof Error) || !['INVITE_LINK_RELAY_UNAVAILABLE', 'INVALID_INVITE_LINK_RESPONSE'].includes(error.message))
113
+ throw error;
114
+ response = await requestJson(fetcher, parsed.relayOrigin, '/v1/invites/claim', 'POST', undefined, claim);
115
+ }
116
+ const encrypted = unpackInviteLinkCiphertext(response);
117
+ const token = decryptInviteLink(encrypted, parsed.k, parsed.relayOrigin);
118
+ const invite = parseAndVerifyInviteToken(token, Date.now(), options.relayPolicy);
119
+ if (normalizeRelayOrigin(invite.relayUrl) !== parsed.relayOrigin)
120
+ throw new Error('INVITE_LINK_RELAY_MISMATCH');
121
+ return token;
122
+ }
123
+ function flags(args) {
124
+ const result = new Map();
125
+ for (let i = 0; i < args.length; i++) {
126
+ const arg = args[i];
127
+ if (result.has(arg) || !['--key', '--relay', '--name', '--expires-in', '--share', '--link-expires-in', '--output', '--qr', '--png', '--svg', '--allow-private-relay'].includes(arg))
128
+ throw new Error('INVALID_INVITE_OPTION');
129
+ if (arg === '--allow-private-relay')
130
+ result.set(arg, 'true');
131
+ else {
132
+ if (!args[i + 1] || args[i + 1].startsWith('--'))
133
+ throw new Error('INVALID_INVITE_OPTION');
134
+ result.set(arg, args[++i]);
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+ export async function createInviteCommand(args, options = {}) {
140
+ if (args.includes('--help') || args.includes('-h')) {
141
+ console.log(SHORT_INVITE_USAGE);
142
+ return;
143
+ }
144
+ const f = flags(args), share = f.get('--share') ?? 'token';
145
+ if (share !== 'token' && share !== 'link')
146
+ throw new Error('INVALID_INVITE_SHARE');
147
+ if (share === 'token' && ['--link-expires-in', '--qr', '--png', '--svg'].some(n => f.has(n)))
148
+ throw new Error('INVITE_LINK_OPTIONS_REQUIRE_LINK');
149
+ const output = parseInviteOutput(f.get('--output'));
150
+ const ttl = Number(f.get('--link-expires-in') ?? 86400), qr = f.get('--qr') ?? 'terminal';
151
+ if (share === 'link' && (!Number.isInteger(ttl) || ttl < 300 || ttl > 259200 || !['terminal', 'none'].includes(qr)))
152
+ throw new Error('INVALID_INVITE_LINK_OPTION');
153
+ const tokenTtl = Number(f.get('--expires-in') ?? (share === 'link' ? ttl + 86400 : 3600));
154
+ if (!Number.isInteger(tokenTtl) || tokenTtl < 1 || tokenTtl > 2592000)
155
+ throw new Error('INVALID_EXPIRES_IN');
156
+ const relay = f.get('--relay') ?? readApplicationConfig({ ...options.identityOptions, allowPrivateRelay: f.has('--allow-private-relay') }).relays[0];
157
+ const relayOrigin = normalizeRelayOrigin(relay);
158
+ if (share === 'link' && (new URL(relay).protocol !== 'https:' || new URL(relay).pathname !== '/' || new URL(relay).search || new URL(relay).hash || new URL(relay).username || new URL(relay).password))
159
+ throw new Error('INVALID_INVITE_LINK_RELAY');
160
+ const now = Date.now(), expiresAt = new Date(now + tokenTtl * 1000).toISOString();
161
+ const owner = (await commandIdentity('worker', f.get('--key'), options.identityOptions ?? {}));
162
+ const card = createSignedAgentCard({ name: f.get('--name') ?? 'Sealbridge Worker', agentDid: owner.did,
163
+ relayEndpoint: relay, skills: [{ id: 'json-task', name: 'JSON task' }], protocolVersions: new LiveProtocol().receiveVersions(),
164
+ now, ...(share === 'link' ? { expiresAt } : {}) }, owner);
165
+ const token = createInviteToken({ agentCard: card, issuedAt: new Date(now).toISOString(), expiresInSeconds: tokenTtl }, owner);
166
+ // Token creation only signs locally; private-relay opt-in applies when dialing.
167
+ // Link creation contacts the relay and must retain the caller's network policy.
168
+ const inviteDigest = digest(parseAndVerifyInviteToken(token, now, { allowPrivateRelay: share === 'token' || f.has('--allow-private-relay') }));
169
+ const verificationNumber = inviteLinkVerificationNumber(inviteDigest);
170
+ if (share === 'token') {
171
+ deliverInvite(output, token, true);
172
+ console.error(JSON.stringify({ verificationNumber, expiresAt }));
173
+ return;
174
+ }
175
+ const deadline = inviteLinkExpiry(now, ttl * 1000).expiresAt, k = generateInviteLinkKey(), keys = deriveInviteLinkKeys(k);
176
+ const link = 'https://sealbridge.app/j#v=1&k=' + k + (relayOrigin === 'https://relay.sealbridge.dev' ? '' : '&r=' + encodeURIComponent(new URL(relayOrigin).host));
177
+ parseInviteLink(link, { allowPrivateRelay: f.has('--allow-private-relay') });
178
+ const encrypted = packInviteLinkCiphertext(encryptInviteLink(token, k, { relayOrigin, expiresAt: deadline, now }));
179
+ const linkRef = encrypted.id;
180
+ const fetcher = transport(relayOrigin, options, f.has('--allow-private-relay'));
181
+ const capabilities = await requestJson(fetcher, relayOrigin, '/v1/capabilities', 'GET');
182
+ if (capabilities?.inviteLinks !== 1)
183
+ throw new Error(UNSUPPORTED);
184
+ // Persist only cancellation/status metadata before admission, including when
185
+ // the admission reply is interrupted and its outcome cannot be determined.
186
+ saveRecord(owner, { type: 'CreatedInviteLink', ownerDid: owner.did, id: linkRef, relayOrigin, inviteDigest, expiresAt: deadline }, options.identityOptions ?? {});
187
+ await requestJson(fetcher, relayOrigin, '/v1/invites', 'POST', owner, { ...encrypted,
188
+ tagHash: createHash('sha256').update(inviteLinkClaimTag(keys.accessKey, keys.id)).digest('base64url') });
189
+ deliverInvite(output, link, true);
190
+ console.error(JSON.stringify({ verificationNumber, linkRef, expiresAt: deadline }));
191
+ if (qr === 'terminal' && process.stderr.isTTY)
192
+ process.stderr.write(await QRCode.toString(link, { type: 'terminal', errorCorrectionLevel: 'L', margin: 4 }));
193
+ else if (qr === 'terminal')
194
+ console.error('QR は端末でだけ出します');
195
+ for (const format of ['png', 'svg'])
196
+ if (f.has('--' + format)) {
197
+ const path = f.get('--' + format);
198
+ inspectPrivateDirectory(dirname(path), fs);
199
+ const data = format === 'png' ? await QRCode.toBuffer(link, { errorCorrectionLevel: 'L', margin: 4 }) : Buffer.from(await QRCode.toString(link, { type: 'svg', errorCorrectionLevel: 'L', margin: 4 }));
200
+ try {
201
+ writePrivateFile(path, data, fs);
202
+ }
203
+ catch {
204
+ throw new Error('INVITE_OUTPUT_UNAVAILABLE');
205
+ }
206
+ }
207
+ }
208
+ export async function inviteLinksCommand(args, options = {}) {
209
+ if (args.includes('--help') || args.includes('-h')) {
210
+ console.log(SHORT_INVITE_USAGE);
211
+ return;
212
+ }
213
+ const [action, ...rest] = args;
214
+ const linkRef = action === 'cancel' ? rest.shift() : undefined;
215
+ if (!['list', 'cancel'].includes(action) || (action === 'cancel' && !/^[A-Za-z0-9_-]{22}$/.test(linkRef ?? '')))
216
+ throw new Error(SHORT_INVITE_USAGE);
217
+ const f = flags(rest);
218
+ if ([...f.keys()].some(k => !['--key', '--allow-private-relay'].includes(k)))
219
+ throw new Error('INVALID_INVITE_OPTION');
220
+ const owner = await commandIdentity('worker', f.get('--key'), options.identityOptions ?? {}, false);
221
+ if (!owner) {
222
+ if (action === 'cancel')
223
+ throw new Error('INVITE_LINK_NOT_FOUND');
224
+ console.log(JSON.stringify({ links: [] }));
225
+ return;
226
+ }
227
+ const saved = records(owner, options.identityOptions ?? {});
228
+ if (action === 'list') {
229
+ const links = [];
230
+ for (const r of saved) {
231
+ const fetcher = transport(r.relayOrigin, options, f.has('--allow-private-relay'));
232
+ let value;
233
+ try {
234
+ value = await requestJson(fetcher, r.relayOrigin, '/v1/invites/' + r.id + '/status', 'GET', owner);
235
+ }
236
+ catch (error) {
237
+ if (!(error instanceof Error) || error.message !== UNAVAILABLE)
238
+ throw error;
239
+ // An interrupted/failed creation can leave only the local cancellation
240
+ // record. Keep other links inspectable even when this ID is absent.
241
+ links.push({ linkRef: r.id, relay: r.relayOrigin, error: 'INVITE_LINK_UNAVAILABLE' });
242
+ continue;
243
+ }
244
+ if (!value || value.id !== r.id || value.expiresAt !== r.expiresAt || !['unused', 'claimed', 'expired', 'cancelled', 'locked_out'].includes(String(value.status)) ||
245
+ (value.claimedAt !== undefined && (typeof value.claimedAt !== 'string' || !Number.isFinite(Date.parse(value.claimedAt)))))
246
+ throw new Error('INVALID_INVITE_LINK_RESPONSE');
247
+ const status = { id: r.id, status: value.status, expiresAt: r.expiresAt, ...(value.claimedAt ? { claimedAt: new Date(value.claimedAt).toISOString() } : {}) };
248
+ links.push({ linkRef: r.id, relay: r.relayOrigin, status });
249
+ }
250
+ console.log(JSON.stringify({ links }));
251
+ return;
252
+ }
253
+ const r = saved.find(r => r.id === linkRef);
254
+ if (!r)
255
+ throw new Error('INVITE_LINK_NOT_FOUND');
256
+ const path = join(directory(owner, options.identityOptions ?? {}), 'revoked', r.inviteDigest.slice(7) + '.json');
257
+ ensurePrivateDirectory(dirname(path), fs);
258
+ if (!readPrivateFile(path, fs, 16384))
259
+ writePrivateFile(path, Buffer.from(JSON.stringify(createRevocationNotice({ targetType: 'invite', targetId: r.inviteDigest, reason: 'Invite link cancelled' }, owner))), fs);
260
+ await requestJson(transport(r.relayOrigin, options, f.has('--allow-private-relay')), r.relayOrigin, '/v1/invites/' + r.id, 'DELETE', owner);
261
+ console.log(JSON.stringify({ linkRef: r.id, cancelled: true, tokenRevoked: true }));
262
+ }
263
+ //# sourceMappingURL=invite-links.js.map