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
@@ -0,0 +1,65 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { digest } from './crypto.js';
3
+ import { validateSchema } from './schema.js';
4
+ export const CONTEXT_GRANT_MAX_BYTES = 64 * 1024;
5
+ export const CONTEXT_GRANT_MAX_LIFETIME_MS = 7 * 24 * 60 * 60 * 1000;
6
+ export const CONTEXT_GRANT_DEFAULT_LIFETIME_MS = 24 * 60 * 60 * 1000;
7
+ /** Time-independent contract checks also apply when verifying historical evidence. */
8
+ export function validateContextGrant(grant, createdAt) {
9
+ validateSchema('context-grant', grant);
10
+ const g = grant;
11
+ if (g.inputRetentionAllowed === true)
12
+ throw new Error('CONTEXT_GRANT_INPUT_RETENTION_UNAVAILABLE');
13
+ const start = Date.parse(createdAt), end = Date.parse(g.expiresAt);
14
+ if (!Number.isFinite(start) || end <= start || end - start > CONTEXT_GRANT_MAX_LIFETIME_MS)
15
+ throw new Error('CONTEXT_GRANT_EXPIRY_INVALID');
16
+ const denied = new Set(g.fieldsDenied);
17
+ if (g.fieldsAllowed?.some(field => denied.has(field)))
18
+ throw new Error('CONTEXT_GRANT_FIELDS_CONFLICT');
19
+ }
20
+ export function validateManifestContextGrant(manifest) {
21
+ const grant = manifest.contextGrant;
22
+ if (!grant)
23
+ return;
24
+ validateContextGrant(grant, manifest.createdAt);
25
+ if (manifest.protocolVersion !== '0.2.0')
26
+ throw new Error('CONTEXT_GRANT_PROTOCOL_UNSUPPORTED');
27
+ if (manifest.permissions.maxDelegationDepth !== (grant.deliveryMode === 'approval_redelegation' ? 1 : 0))
28
+ throw new Error('CONTEXT_GRANT_DEPTH_CONFLICT');
29
+ if (grant.deliveryMode !== 'hand_over' && manifest.sandboxPolicy.filesystemScope !== 'ephemeral_workspace_only')
30
+ throw new Error('CONTEXT_GRANT_FILESYSTEM_CONFLICT');
31
+ }
32
+ /** Check live use separately so expired grants remain verifiable in historical contracts. */
33
+ export function validateContextGrantUse(manifest, input, now = Date.now()) {
34
+ validateManifestContextGrant(manifest);
35
+ const grant = manifest.contextGrant;
36
+ if (!grant)
37
+ return;
38
+ if (!Number.isFinite(now) || Date.parse(grant.expiresAt) <= now)
39
+ throw new Error('CONTEXT_GRANT_EXPIRED');
40
+ const bytes = JSON.stringify(input);
41
+ if (bytes === undefined || Buffer.byteLength(bytes, 'utf8') > grant.maxBytes)
42
+ throw new Error('CONTEXT_GRANT_MAX_BYTES_EXCEEDED');
43
+ }
44
+ /** Defaults are opt-in and never widen a supplied declaration. */
45
+ export function buildContextGrant(options, createdAt = new Date().toISOString()) {
46
+ const mode = options.deliveryMode === undefined ? 'view_only' : options.deliveryMode;
47
+ const grant = structuredClone({
48
+ ...options,
49
+ deliveryMode: mode,
50
+ expiresAt: options.expiresAt === undefined
51
+ ? new Date(Date.parse(createdAt) + CONTEXT_GRANT_DEFAULT_LIFETIME_MS).toISOString() : options.expiresAt,
52
+ maxBytes: options.maxBytes === undefined ? CONTEXT_GRANT_MAX_BYTES : options.maxBytes,
53
+ retention: options.retention === undefined
54
+ ? mode === 'hand_over' ? 'keep_deliverable' : 'ephemeral_view' : options.retention,
55
+ inputRetentionAllowed: options.inputRetentionAllowed === undefined ? false : options.inputRetentionAllowed,
56
+ });
57
+ validateContextGrant(grant, createdAt);
58
+ return grant;
59
+ }
60
+ /** Only these two fields enter context lifecycle audit payloads. */
61
+ export function contextGrantAuditPayload(grant) {
62
+ validateSchema('context-grant', grant);
63
+ return { grantDigest: digest(grant), deliveryMode: grant.deliveryMode };
64
+ }
65
+ //# sourceMappingURL=context-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-grant.js","sourceRoot":"","sources":["../src/context-grant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TaskContract } from './contract.js';
2
+ import type { DelegationLink, DelegationProof, KeyPair, TaskManifest } from './types.js';
3
+ /** Literal declaration comparison only; it does not interpret selectors or inspect provenance. */
4
+ export declare function assertDelegationAttenuation(parent: TaskManifest, child: TaskManifest): void;
5
+ /** Historical verification has no implicit current clock. Siblings are separate one-edge chains. */
6
+ export declare function verifyDelegationChain(input: {
7
+ rootContract: TaskContract;
8
+ chain: readonly DelegationProof[];
9
+ }): {
10
+ depthRemaining: number;
11
+ delegateeOwnerDids: string[];
12
+ };
13
+ export declare function createDelegationLink(input: {
14
+ parentContract: TaskContract;
15
+ childContract: TaskContract;
16
+ issuedAt?: string;
17
+ }, delegator: KeyPair): DelegationLink;
@@ -0,0 +1,126 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { digest, signPayload, verifySigned } from './crypto.js';
3
+ import { verifyContract } from './contract.js';
4
+ import { validateManifest, validateSchema } from './schema.js';
5
+ const maxima = ['maxInputTokens', 'maxOutputTokens', 'maxToolInvocations', 'maxWallClockSeconds'];
6
+ const equal = (a, b) => digest(a) === digest(b);
7
+ function fail(code = 'DELEGATION_INVALID') { throw new Error(code); }
8
+ function time(value) {
9
+ const n = Date.parse(value);
10
+ if (!Number.isFinite(n))
11
+ fail();
12
+ return n;
13
+ }
14
+ function root(manifest) {
15
+ if (manifest.protocolVersion !== '0.2.0' || manifest.contextGrant?.deliveryMode !== 'approval_redelegation')
16
+ fail('DELEGATION_INVALID');
17
+ if (manifest.permissions.maxDelegationDepth !== 1)
18
+ fail('DELEGATION_INVALID');
19
+ }
20
+ /** Literal declaration comparison only; it does not interpret selectors or inspect provenance. */
21
+ export function assertDelegationAttenuation(parent, child) {
22
+ root(parent);
23
+ try {
24
+ validateManifest(parent);
25
+ validateManifest(child);
26
+ }
27
+ catch {
28
+ fail();
29
+ }
30
+ const p = parent.contextGrant, c = child.contextGrant;
31
+ if (!c || c.deliveryMode !== 'view_only' || c.retention !== 'ephemeral_view' || c.inputRetentionAllowed === true)
32
+ fail('DELEGATION_INVALID');
33
+ if (child.permissions.maxDelegationDepth !== 0)
34
+ fail('DELEGATION_INVALID');
35
+ if (child.permissions.grantedCapabilities.length)
36
+ fail('DELEGATION_INVALID');
37
+ if (time(child.createdAt) < time(parent.createdAt) || time(child.deadline) <= time(child.createdAt) ||
38
+ time(parent.deadline) <= time(parent.createdAt))
39
+ fail();
40
+ if (time(child.deadline) > time(parent.deadline) || time(c.expiresAt) > time(p.expiresAt) || c.maxBytes > p.maxBytes)
41
+ fail('DELEGATION_INVALID');
42
+ for (const name of maxima)
43
+ if (child.budget[name] > parent.budget[name])
44
+ fail('DELEGATION_INVALID');
45
+ const withoutMaxima = (m) => Object.fromEntries(Object.entries(m.budget).filter(([k]) => !maxima.includes(k)));
46
+ if (!equal(withoutMaxima(parent), withoutMaxima(child)) || !equal(parent.sandboxPolicy, child.sandboxPolicy) ||
47
+ !equal(parent.verification, child.verification))
48
+ fail('DELEGATION_INVALID');
49
+ if (!c.selectors.length || c.selectors.some(s => !p.selectors.includes(s)) ||
50
+ p.fieldsAllowed && (!c.fieldsAllowed?.length || c.fieldsAllowed.some(f => !p.fieldsAllowed.includes(f))) ||
51
+ c.fieldsAllowed && !c.fieldsAllowed.length ||
52
+ p.fieldsDenied?.some(f => !c.fieldsDenied?.includes(f)) ||
53
+ p.outputSchema !== undefined && (c.outputSchema === undefined || !equal(p.outputSchema, c.outputSchema)))
54
+ fail('DELEGATION_INVALID');
55
+ const narrower = c.selectors.length < p.selectors.length ||
56
+ (p.fieldsAllowed ? !!c.fieldsAllowed && c.fieldsAllowed.length < p.fieldsAllowed.length : !!c.fieldsAllowed?.length);
57
+ if (!narrower)
58
+ fail('DELEGATION_INVALID');
59
+ }
60
+ function actualLimits(child) {
61
+ return structuredClone({ deadline: child.deadline, expiresAt: child.contextGrant.expiresAt,
62
+ budget: child.budget, sandboxPolicy: child.sandboxPolicy, verification: child.verification,
63
+ depthRemaining: child.permissions.maxDelegationDepth });
64
+ }
65
+ /** Historical verification has no implicit current clock. Siblings are separate one-edge chains. */
66
+ export function verifyDelegationChain(input) {
67
+ const { rootContract: parent, chain } = input;
68
+ if (!verifyContract(parent))
69
+ fail();
70
+ root(parent.manifest);
71
+ if (!Array.isArray(chain) || !chain.length)
72
+ fail('DELEGATION_PROOF_REQUIRED');
73
+ if (chain.length > 1 || chain.length > parent.manifest.permissions.maxDelegationDepth)
74
+ fail('DELEGATION_INVALID');
75
+ const proof = chain[0];
76
+ try {
77
+ validateSchema('delegation-attachment', { parentContract: parent, children: [proof] });
78
+ }
79
+ catch {
80
+ fail();
81
+ }
82
+ const child = proof.childContract, link = proof.link, l = link.payload;
83
+ if (!verifyContract(child))
84
+ fail();
85
+ const a = parent.manifest.requester.ownerDid, b = parent.manifest.worker.ownerDid, c = child.manifest.worker.ownerDid;
86
+ if (new Set([a, b, c]).size !== 3 || b !== child.manifest.requester.ownerDid ||
87
+ parent.manifest.taskId === child.manifest.taskId || !verifySigned(link, b) ||
88
+ l.delegatorOwnerDid !== b || l.delegateeOwnerDid !== c || l.parentTaskId !== parent.manifest.taskId ||
89
+ l.childTaskId !== child.manifest.taskId || l.parentContractDigest !== parent.contractDigest ||
90
+ l.childContractDigest !== child.contractDigest || l.prevLinkDigest !== null)
91
+ fail();
92
+ const remaining = parent.manifest.permissions.maxDelegationDepth - 1;
93
+ if (l.depthRemaining !== remaining || l.limits.depthRemaining !== remaining || child.manifest.permissions.maxDelegationDepth !== remaining)
94
+ fail('DELEGATION_INVALID');
95
+ assertDelegationAttenuation(parent.manifest, child.manifest);
96
+ if (!equal(l.limits, actualLimits(child.manifest)))
97
+ fail('DELEGATION_INVALID');
98
+ const issued = time(l.issuedAt);
99
+ if (l.issuedAt !== link.signature.signedAt || time(child.acceptance.signature.signedAt) > issued ||
100
+ time(child.manifest.createdAt) > time(child.acceptance.signature.signedAt) ||
101
+ [parent.manifest, child.manifest].some(m => issued >= time(m.deadline) || issued >= time(m.contextGrant.expiresAt)))
102
+ fail();
103
+ return { depthRemaining: remaining, delegateeOwnerDids: [c] };
104
+ }
105
+ export function createDelegationLink(input, delegator) {
106
+ const { parentContract: parent, childContract: child } = input;
107
+ if (!verifyContract(parent) || !verifyContract(child))
108
+ fail();
109
+ assertDelegationAttenuation(parent.manifest, child.manifest);
110
+ const issuedAt = input.issuedAt ?? new Date().toISOString();
111
+ time(issuedAt);
112
+ let link;
113
+ try {
114
+ link = signPayload({ type: 'DelegationLink', parentTaskId: parent.manifest.taskId,
115
+ parentContractDigest: parent.contractDigest, childTaskId: child.manifest.taskId,
116
+ childContractDigest: child.contractDigest, delegatorOwnerDid: delegator.did,
117
+ delegateeOwnerDid: child.manifest.worker.ownerDid, depthRemaining: 0, limits: actualLimits(child.manifest),
118
+ issuedAt, prevLinkDigest: null }, delegator, issuedAt);
119
+ }
120
+ catch {
121
+ fail();
122
+ }
123
+ verifyDelegationChain({ rootContract: parent, chain: [{ link, childContract: child }] });
124
+ return link;
125
+ }
126
+ //# sourceMappingURL=delegation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.js","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export * from './types.js';
2
2
  export * from './crypto.js';
3
3
  export * from './discovery.js';
4
+ export * from './invite-link.js';
5
+ export * from './invite-sas.js';
4
6
  export * from './relay-auth.js';
5
7
  export * from './delivery-status.js';
@@ -2,6 +2,8 @@
2
2
  export * from './types.js';
3
3
  export * from './crypto.js';
4
4
  export * from './discovery.js';
5
+ export * from './invite-link.js';
6
+ export * from './invite-sas.js';
5
7
  export * from './relay-auth.js';
6
8
  export * from './delivery-status.js';
7
9
  //# sourceMappingURL=edge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './types.js';
2
+ export * from './context-grant.js';
2
3
  export * from './crypto.js';
3
4
  export * from './schema.js';
4
5
  export * from './protocol.js';
@@ -6,7 +7,10 @@ export * from './capability.js';
6
7
  export * from './receipts.js';
7
8
  export * from './contract.js';
8
9
  export * from './discovery.js';
10
+ export * from './invite-link.js';
11
+ export * from './invite-sas.js';
9
12
  export * from './connection.js';
10
13
  export * from './relay-auth.js';
11
14
  export * from './revocation.js';
12
15
  export * from './delivery-status.js';
16
+ export * from './delegation.js';
@@ -1,4 +1,5 @@
1
1
  export * from './types.js';
2
+ export * from './context-grant.js';
2
3
  export * from './crypto.js';
3
4
  export * from './schema.js';
4
5
  export * from './protocol.js';
@@ -6,8 +7,11 @@ export * from './capability.js';
6
7
  export * from './receipts.js';
7
8
  export * from './contract.js';
8
9
  export * from './discovery.js';
10
+ export * from './invite-link.js';
11
+ export * from './invite-sas.js';
9
12
  export * from './connection.js';
10
13
  export * from './relay-auth.js';
11
14
  export * from './revocation.js';
12
15
  export * from './delivery-status.js';
16
+ export * from './delegation.js';
13
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { RelayEndpointPolicy } from './discovery.js';
2
+ export declare const INVITE_LINK_CONTEXT = "sealbridge/invite-link/v1";
3
+ /** UTF-8 info labels; each HKDF uses K as IKM and an empty salt (RFC 5869). */
4
+ export declare const INVITE_LINK_HKDF_INFO: Readonly<{
5
+ id: string;
6
+ encKey: string;
7
+ accessKey: string;
8
+ }>;
9
+ export declare const INVITE_LINK_PAD_BLOCK_BYTES = 4096;
10
+ export declare const INVITE_LINK_MAX_PADDED_BYTES = 16384;
11
+ export declare const INVITE_LINK_DEFAULT_TTL_MS: number;
12
+ export declare const INVITE_LINK_MAX_TTL_MS: number;
13
+ export declare const INVITE_LINK_TOKEN_GRACE_MS: number;
14
+ export interface InviteLinkKeys {
15
+ id: Buffer;
16
+ encKey: Buffer;
17
+ accessKey: Buffer;
18
+ }
19
+ export interface InviteLinkCiphertext {
20
+ id: Uint8Array;
21
+ /** Encrypted padded plaintext followed by the 16-byte GCM authentication tag. */
22
+ ciphertext: Uint8Array;
23
+ nonce: Uint8Array;
24
+ expiresAt: string;
25
+ }
26
+ /** Relay storage encoding. No K, plaintext, claim tag, or verification number. */
27
+ export interface InviteLinkStorage {
28
+ id: string;
29
+ ciphertext: string;
30
+ nonce: string;
31
+ expiresAt: string;
32
+ }
33
+ export interface InviteLinkRelayPolicy extends RelayEndpointPolicy {
34
+ /** Same URL comparison as application relay allow-lists (origin + pathname). */
35
+ allowedRelayUrls?: readonly string[];
36
+ }
37
+ export interface ParsedInviteLink {
38
+ v: 1;
39
+ k: string;
40
+ relayOrigin: string;
41
+ }
42
+ /** Returns the link deadline and the inner token deadline (link + 24 hours). */
43
+ export declare function inviteLinkExpiry(now?: number, ttlMs?: number): {
44
+ expiresAt: string;
45
+ tokenExpiresAt: string;
46
+ };
47
+ /** The returned k is exactly 43 unpadded base64url characters encoding 32 random bytes. */
48
+ export declare function generateInviteLinkKey(): string;
49
+ export declare function deriveInviteLinkKeys(k: string): InviteLinkKeys;
50
+ /** Exact bytes: HMAC-SHA256(accessKey, UTF8("claim") || raw 16-byte id). */
51
+ export declare function inviteLinkClaimTag(accessKey: Uint8Array, id: Uint8Array): Buffer;
52
+ /**
53
+ * AAD = UTF8(context) || raw id || UTF8(normalizeRelayOrigin(relayOrigin)) ||
54
+ * UTF8(expiresAt). No separators, length prefixes, JSON, or terminating NULs.
55
+ * The origin has no path, trailing slash, or default port; ws(s) maps to http(s).
56
+ */
57
+ export declare function inviteLinkAad(id: Uint8Array, relayOrigin: string, expiresAt: string): Buffer;
58
+ /** Four-byte big-endian UTF-8 byte length, token bytes, then zero padding. */
59
+ export declare function padInviteLinkToken(token: string): Buffer;
60
+ export declare function unpadInviteLinkToken(padded: Uint8Array): string;
61
+ export declare function packInviteLinkCiphertext(value: InviteLinkCiphertext): InviteLinkStorage;
62
+ /** Strict local decoding of an untrusted relay response, without contacting a relay. */
63
+ export declare function unpackInviteLinkCiphertext(value: unknown): InviteLinkCiphertext;
64
+ /** Opaque token wrapping only. Signature/card/relay verification remains the caller's next step. */
65
+ export declare function encryptInviteLink(token: string, k: string, options: {
66
+ relayOrigin: string;
67
+ expiresAt: string;
68
+ now?: number;
69
+ }): InviteLinkCiphertext;
70
+ export declare function decryptInviteLink(value: InviteLinkCiphertext, k: string, relayOrigin: string, now?: number): string;
71
+ /** Only the two v1 fragment forms are accepted. Parsing performs no network I/O. */
72
+ export declare function parseInviteLink(uri: string, policy?: InviteLinkRelayPolicy): ParsedInviteLink;
@@ -0,0 +1,225 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { createCipheriv, createDecipheriv, createHmac, hkdfSync, randomBytes } from 'node:crypto';
3
+ import { DEFAULT_CLOCK_SKEW_MS, validateRelayEndpointUrl } from './discovery.js';
4
+ import { normalizeRelayOrigin } from './relay-auth.js';
5
+ export const INVITE_LINK_CONTEXT = 'sealbridge/invite-link/v1';
6
+ /** UTF-8 info labels; each HKDF uses K as IKM and an empty salt (RFC 5869). */
7
+ export const INVITE_LINK_HKDF_INFO = Object.freeze({
8
+ id: INVITE_LINK_CONTEXT + '/id',
9
+ encKey: INVITE_LINK_CONTEXT + '/enc-key',
10
+ accessKey: INVITE_LINK_CONTEXT + '/access-key',
11
+ });
12
+ export const INVITE_LINK_PAD_BLOCK_BYTES = 4096;
13
+ export const INVITE_LINK_MAX_PADDED_BYTES = 16384;
14
+ export const INVITE_LINK_DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
15
+ export const INVITE_LINK_MAX_TTL_MS = 72 * 60 * 60 * 1000;
16
+ export const INVITE_LINK_TOKEN_GRACE_MS = 24 * 60 * 60 * 1000;
17
+ const NONCE_BYTES = 12;
18
+ const AUTH_TAG_BYTES = 16;
19
+ const MAX_LINK_CHARS = 2048;
20
+ const DEFAULT_RELAY = 'https://relay.sealbridge.dev';
21
+ function decodeBase64url(value, minBytes, maxBytes = minBytes) {
22
+ if (typeof value !== 'string' || value.length > Math.ceil(maxBytes * 4 / 3) ||
23
+ !/^[A-Za-z0-9_-]+$/.test(value))
24
+ throw new Error('INVALID_INVITE_LINK_ENCODING');
25
+ const bytes = Buffer.from(value, 'base64url');
26
+ if (bytes.length < minBytes || bytes.length > maxBytes || bytes.toString('base64url') !== value)
27
+ throw new Error('INVALID_INVITE_LINK_ENCODING');
28
+ return bytes;
29
+ }
30
+ function assertBytes(value, length) {
31
+ if (!(value instanceof Uint8Array) || value.byteLength !== length)
32
+ throw new Error('INVALID_INVITE_LINK_BYTES');
33
+ }
34
+ /** Expiries on the storage boundary must be UTC ISO strings with milliseconds. */
35
+ function canonicalExpiry(expiresAt) {
36
+ if (typeof expiresAt !== 'string' || expiresAt.length !== 24 || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(expiresAt) ||
37
+ !Number.isFinite(Date.parse(expiresAt)) || new Date(expiresAt).toISOString() !== expiresAt)
38
+ throw new Error('INVALID_INVITE_LINK_EXPIRY');
39
+ return expiresAt;
40
+ }
41
+ /** Returns the link deadline and the inner token deadline (link + 24 hours). */
42
+ export function inviteLinkExpiry(now = Date.now(), ttlMs = INVITE_LINK_DEFAULT_TTL_MS) {
43
+ if (!Number.isSafeInteger(now) || !Number.isSafeInteger(ttlMs) || ttlMs <= 0 || ttlMs > INVITE_LINK_MAX_TTL_MS)
44
+ throw new Error('INVALID_INVITE_LINK_EXPIRY');
45
+ try {
46
+ return {
47
+ expiresAt: canonicalExpiry(new Date(now + ttlMs).toISOString()),
48
+ tokenExpiresAt: canonicalExpiry(new Date(now + ttlMs + INVITE_LINK_TOKEN_GRACE_MS).toISOString()),
49
+ };
50
+ }
51
+ catch {
52
+ throw new Error('INVALID_INVITE_LINK_EXPIRY');
53
+ }
54
+ }
55
+ /** The returned k is exactly 43 unpadded base64url characters encoding 32 random bytes. */
56
+ export function generateInviteLinkKey() {
57
+ return randomBytes(32).toString('base64url');
58
+ }
59
+ export function deriveInviteLinkKeys(k) {
60
+ const key = decodeBase64url(k, 32);
61
+ const derive = (info, length) => Buffer.from(hkdfSync('sha256', key, Buffer.alloc(0), info, length));
62
+ return {
63
+ id: derive(INVITE_LINK_HKDF_INFO.id, 16),
64
+ encKey: derive(INVITE_LINK_HKDF_INFO.encKey, 32),
65
+ accessKey: derive(INVITE_LINK_HKDF_INFO.accessKey, 32),
66
+ };
67
+ }
68
+ /** Exact bytes: HMAC-SHA256(accessKey, UTF8("claim") || raw 16-byte id). */
69
+ export function inviteLinkClaimTag(accessKey, id) {
70
+ assertBytes(accessKey, 32);
71
+ assertBytes(id, 16);
72
+ return createHmac('sha256', accessKey).update('claim', 'utf8').update(id).digest();
73
+ }
74
+ /**
75
+ * AAD = UTF8(context) || raw id || UTF8(normalizeRelayOrigin(relayOrigin)) ||
76
+ * UTF8(expiresAt). No separators, length prefixes, JSON, or terminating NULs.
77
+ * The origin has no path, trailing slash, or default port; ws(s) maps to http(s).
78
+ */
79
+ export function inviteLinkAad(id, relayOrigin, expiresAt) {
80
+ assertBytes(id, 16);
81
+ return Buffer.concat([Buffer.from(INVITE_LINK_CONTEXT), id,
82
+ Buffer.from(normalizeRelayOrigin(relayOrigin)), Buffer.from(canonicalExpiry(expiresAt))]);
83
+ }
84
+ /** Four-byte big-endian UTF-8 byte length, token bytes, then zero padding. */
85
+ export function padInviteLinkToken(token) {
86
+ if (typeof token !== 'string' || !token)
87
+ throw new Error('INVALID_INVITE_LINK_PLAINTEXT');
88
+ if (token.length > INVITE_LINK_MAX_PADDED_BYTES - 4)
89
+ throw new Error('INVITE_LINK_TOO_LARGE');
90
+ const size = Buffer.byteLength(token, 'utf8');
91
+ if (size > INVITE_LINK_MAX_PADDED_BYTES - 4)
92
+ throw new Error('INVITE_LINK_TOO_LARGE');
93
+ if (Buffer.from(token, 'utf8').toString('utf8') !== token)
94
+ throw new Error('INVALID_INVITE_LINK_PLAINTEXT');
95
+ const padded = Buffer.alloc(Math.ceil((size + 4) / INVITE_LINK_PAD_BLOCK_BYTES) * INVITE_LINK_PAD_BLOCK_BYTES);
96
+ padded.writeUInt32BE(size);
97
+ padded.write(token, 4, size, 'utf8');
98
+ return padded;
99
+ }
100
+ export function unpadInviteLinkToken(padded) {
101
+ if (!(padded instanceof Uint8Array) || !validPaddedSize(padded.byteLength))
102
+ throw new Error('INVALID_INVITE_LINK_PLAINTEXT');
103
+ const bytes = Buffer.from(padded), size = bytes.readUInt32BE();
104
+ if (!size || size > bytes.length - 4 ||
105
+ Math.ceil((size + 4) / INVITE_LINK_PAD_BLOCK_BYTES) * INVITE_LINK_PAD_BLOCK_BYTES !== bytes.length ||
106
+ bytes.subarray(4 + size).some(byte => byte !== 0))
107
+ throw new Error('INVALID_INVITE_LINK_PLAINTEXT');
108
+ const tokenBytes = bytes.subarray(4, 4 + size), token = tokenBytes.toString('utf8');
109
+ if (!Buffer.from(token, 'utf8').equals(tokenBytes))
110
+ throw new Error('INVALID_INVITE_LINK_PLAINTEXT');
111
+ return token;
112
+ }
113
+ function validPaddedSize(size) {
114
+ return size >= INVITE_LINK_PAD_BLOCK_BYTES && size <= INVITE_LINK_MAX_PADDED_BYTES &&
115
+ size % INVITE_LINK_PAD_BLOCK_BYTES === 0;
116
+ }
117
+ function validateCiphertext(value) {
118
+ assertBytes(value.id, 16);
119
+ assertBytes(value.nonce, NONCE_BYTES);
120
+ if (!(value.ciphertext instanceof Uint8Array) || !validPaddedSize(value.ciphertext.byteLength - AUTH_TAG_BYTES))
121
+ throw new Error('INVALID_INVITE_LINK_CIPHERTEXT');
122
+ canonicalExpiry(value.expiresAt);
123
+ }
124
+ export function packInviteLinkCiphertext(value) {
125
+ validateCiphertext(value);
126
+ return {
127
+ id: Buffer.from(value.id).toString('base64url'),
128
+ ciphertext: Buffer.from(value.ciphertext).toString('base64url'),
129
+ nonce: Buffer.from(value.nonce).toString('base64url'),
130
+ expiresAt: value.expiresAt,
131
+ };
132
+ }
133
+ /** Strict local decoding of an untrusted relay response, without contacting a relay. */
134
+ export function unpackInviteLinkCiphertext(value) {
135
+ if (!value || typeof value !== 'object' || Array.isArray(value) ||
136
+ Object.keys(value).length !== 4 ||
137
+ !['id', 'ciphertext', 'nonce', 'expiresAt'].every(key => Object.hasOwn(value, key)))
138
+ throw new Error('INVALID_INVITE_LINK_STORAGE');
139
+ const record = value;
140
+ const decoded = {
141
+ id: decodeBase64url(record.id, 16),
142
+ ciphertext: decodeBase64url(record.ciphertext, INVITE_LINK_PAD_BLOCK_BYTES + AUTH_TAG_BYTES, INVITE_LINK_MAX_PADDED_BYTES + AUTH_TAG_BYTES),
143
+ nonce: decodeBase64url(record.nonce, NONCE_BYTES),
144
+ expiresAt: canonicalExpiry(record.expiresAt),
145
+ };
146
+ validateCiphertext(decoded);
147
+ return decoded;
148
+ }
149
+ /** Opaque token wrapping only. Signature/card/relay verification remains the caller's next step. */
150
+ export function encryptInviteLink(token, k, options) {
151
+ const now = options.now ?? Date.now(), deadline = Date.parse(canonicalExpiry(options.expiresAt));
152
+ if (!Number.isSafeInteger(now) || deadline <= now || deadline - now > INVITE_LINK_MAX_TTL_MS)
153
+ throw new Error('INVALID_INVITE_LINK_EXPIRY');
154
+ const keys = deriveInviteLinkKeys(k), nonce = randomBytes(NONCE_BYTES);
155
+ const cipher = createCipheriv('aes-256-gcm', keys.encKey, nonce, { authTagLength: AUTH_TAG_BYTES });
156
+ cipher.setAAD(inviteLinkAad(keys.id, options.relayOrigin, options.expiresAt));
157
+ const ciphertext = Buffer.concat([cipher.update(padInviteLinkToken(token)), cipher.final(), cipher.getAuthTag()]);
158
+ return { id: keys.id, nonce, ciphertext, expiresAt: options.expiresAt };
159
+ }
160
+ export function decryptInviteLink(value, k, relayOrigin, now = Date.now()) {
161
+ try {
162
+ validateCiphertext(value);
163
+ if (!Number.isSafeInteger(now) || Date.parse(value.expiresAt) <= now - DEFAULT_CLOCK_SKEW_MS)
164
+ throw new Error();
165
+ const keys = deriveInviteLinkKeys(k);
166
+ if (!keys.id.equals(value.id))
167
+ throw new Error();
168
+ const ciphertext = Buffer.from(value.ciphertext);
169
+ const decipher = createDecipheriv('aes-256-gcm', keys.encKey, value.nonce, { authTagLength: AUTH_TAG_BYTES });
170
+ decipher.setAAD(inviteLinkAad(value.id, relayOrigin, value.expiresAt));
171
+ decipher.setAuthTag(ciphertext.subarray(-AUTH_TAG_BYTES));
172
+ return unpadInviteLinkToken(Buffer.concat([decipher.update(ciphertext.subarray(0, -AUTH_TAG_BYTES)), decipher.final()]));
173
+ }
174
+ catch {
175
+ throw new Error('INVITE_LINK_DECRYPTION_FAILED');
176
+ }
177
+ }
178
+ function normalizeAllowlistUrl(value, policy) {
179
+ validateRelayEndpointUrl(value, policy);
180
+ const url = new URL(value);
181
+ return url.origin + url.pathname.replace(/\/+$/, '');
182
+ }
183
+ /** Only the two v1 fragment forms are accepted. Parsing performs no network I/O. */
184
+ export function parseInviteLink(uri, policy = {}) {
185
+ if (typeof uri !== 'string' || uri.length > MAX_LINK_CHARS || /\s/.test(uri))
186
+ throw new Error('INVALID_INVITE_LINK');
187
+ // Match the literal URL prefix: URL normalization must not erase a query,
188
+ // credentials, default port, dot-segment path, control character, or extra slash.
189
+ const match = /^(?:https:\/\/sealbridge\.app\/j|sealbridge:\/\/join)#([^\s#?]+)$/.exec(uri);
190
+ if (!match)
191
+ throw new Error('INVALID_INVITE_LINK');
192
+ const fields = new Map();
193
+ for (const field of match[1].split('&')) {
194
+ const part = /^(v|k|r)=([^=]+)$/.exec(field);
195
+ if (!part || fields.has(part[1]))
196
+ throw new Error('INVALID_INVITE_LINK');
197
+ fields.set(part[1], part[2]);
198
+ }
199
+ if (fields.get('v') !== '1' || !fields.has('k'))
200
+ throw new Error('INVALID_INVITE_LINK');
201
+ const k = fields.get('k');
202
+ decodeBase64url(k, 32);
203
+ let relayOrigin = DEFAULT_RELAY;
204
+ if (fields.has('r')) {
205
+ let host;
206
+ try {
207
+ host = decodeURIComponent(fields.get('r'));
208
+ }
209
+ catch {
210
+ throw new Error('INVALID_INVITE_LINK');
211
+ }
212
+ // r is a host[:port], including bracketed IPv6, never a URL or a path.
213
+ if (/\s/.test(host) || !/^[A-Za-z0-9.\[\]:-]+$/.test(host))
214
+ throw new Error('INVALID_INVITE_LINK');
215
+ const relay = 'https://' + host;
216
+ validateRelayEndpointUrl(relay, policy);
217
+ relayOrigin = normalizeRelayOrigin(relay);
218
+ }
219
+ validateRelayEndpointUrl(relayOrigin, policy);
220
+ if (policy.allowedRelayUrls !== undefined &&
221
+ !policy.allowedRelayUrls.map(value => normalizeAllowlistUrl(value, policy)).includes(relayOrigin))
222
+ throw new Error('INVITE_LINK_RELAY_NOT_ALLOWED');
223
+ return { v: 1, k, relayOrigin };
224
+ }
225
+ //# sourceMappingURL=invite-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-link.js","sourceRoot":"","sources":["../src/invite-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Link-path verification number. inviteDigest is the existing canonical
3
+ * `sha256:<64 lowercase hex digits>` string (digest of the verified Invite),
4
+ * encoded as UTF-8 including the prefix, not decoded hex or a hash of token text.
5
+ * Read the first four SHA-256 bytes as an unsigned big-endian integer.
6
+ */
7
+ export declare function inviteLinkVerificationNumber(inviteDigest: string): string;