sealbridge 0.0.1 → 0.2.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/NOTICE +43 -0
- package/README.ja.md +397 -0
- package/README.md +567 -1
- package/dist/cli/dist/acp.d.ts +2 -0
- package/dist/cli/dist/acp.js +6 -0
- package/dist/cli/dist/acp.js.map +1 -0
- package/dist/cli/dist/approval-summary.d.ts +2 -0
- package/dist/cli/dist/approval-summary.js +32 -0
- package/dist/cli/dist/approval-summary.js.map +1 -0
- package/dist/cli/dist/board.d.ts +47 -0
- package/dist/cli/dist/board.js +255 -0
- package/dist/cli/dist/board.js.map +1 -0
- package/dist/cli/dist/contacts.d.ts +18 -0
- package/dist/cli/dist/contacts.js +154 -0
- package/dist/cli/dist/contacts.js.map +1 -0
- package/dist/cli/dist/doctor.d.ts +13 -0
- package/dist/cli/dist/doctor.js +30 -0
- package/dist/cli/dist/doctor.js.map +1 -0
- package/dist/cli/dist/error-messages.d.ts +2 -0
- package/dist/cli/dist/error-messages.js +24 -0
- package/dist/cli/dist/error-messages.js.map +1 -0
- package/dist/cli/dist/index.d.ts +2 -0
- package/dist/cli/dist/index.js +194 -0
- package/dist/cli/dist/index.js.map +1 -0
- package/dist/cli/dist/invite-share.d.ts +16 -0
- package/dist/cli/dist/invite-share.js +163 -0
- package/dist/cli/dist/invite-share.js.map +1 -0
- package/dist/cli/dist/mcp.d.ts +17 -0
- package/dist/cli/dist/mcp.js +105 -0
- package/dist/cli/dist/mcp.js.map +1 -0
- package/dist/cli/dist/network.d.ts +1 -0
- package/dist/cli/dist/network.js +396 -0
- package/dist/cli/dist/network.js.map +1 -0
- package/dist/cli/dist/public-settings.d.ts +27 -0
- package/dist/cli/dist/public-settings.js +33 -0
- package/dist/cli/dist/public-settings.js.map +1 -0
- package/dist/cli/dist/receipt.d.ts +39 -0
- package/dist/cli/dist/receipt.js +90 -0
- package/dist/cli/dist/receipt.js.map +1 -0
- package/dist/cli/dist/receive-hook.d.ts +2 -0
- package/dist/cli/dist/receive-hook.js +35 -0
- package/dist/cli/dist/receive-hook.js.map +1 -0
- package/dist/cli/dist/task-input.d.ts +2 -0
- package/dist/cli/dist/task-input.js +19 -0
- package/dist/cli/dist/task-input.js.map +1 -0
- package/dist/cli/dist/wake-hook.d.ts +3 -0
- package/dist/cli/dist/wake-hook.js +32 -0
- package/dist/cli/dist/wake-hook.js.map +1 -0
- package/dist/examples/two-owner-demo/alice-policy.json +4 -0
- package/dist/examples/two-owner-demo/bob-policy.json +4 -0
- package/dist/examples/two-owner-demo/dist/run-demo.d.ts +71 -0
- package/dist/examples/two-owner-demo/dist/run-demo.js +383 -0
- package/dist/examples/two-owner-demo/dist/run-demo.js.map +1 -0
- package/dist/package.json +1 -0
- package/dist/packages/adapters/dist/command.d.ts +122 -0
- package/dist/packages/adapters/dist/command.js +378 -0
- package/dist/packages/adapters/dist/command.js.map +1 -0
- package/dist/packages/adapters/dist/credential-proxy.d.ts +37 -0
- package/dist/packages/adapters/dist/credential-proxy.js +363 -0
- package/dist/packages/adapters/dist/credential-proxy.js.map +1 -0
- package/dist/packages/adapters/dist/index.d.ts +6 -0
- package/dist/packages/adapters/dist/index.js +6 -0
- package/dist/packages/adapters/dist/index.js.map +1 -0
- package/dist/packages/adapters/dist/mcp.d.ts +32 -0
- package/dist/packages/adapters/dist/mcp.js +87 -0
- package/dist/packages/adapters/dist/mcp.js.map +1 -0
- package/dist/packages/adapters/dist/openai.d.ts +23 -0
- package/dist/packages/adapters/dist/openai.js +81 -0
- package/dist/packages/adapters/dist/openai.js.map +1 -0
- package/dist/packages/adapters/dist/sandbox.d.ts +45 -0
- package/dist/packages/adapters/dist/sandbox.js +60 -0
- package/dist/packages/adapters/dist/sandbox.js.map +1 -0
- package/dist/packages/core/dist/capability.d.ts +36 -0
- package/dist/packages/core/dist/capability.js +203 -0
- package/dist/packages/core/dist/capability.js.map +1 -0
- package/dist/packages/core/dist/contract.d.ts +33 -0
- package/dist/packages/core/dist/contract.js +97 -0
- package/dist/packages/core/dist/contract.js.map +1 -0
- package/dist/packages/core/dist/crypto.d.ts +34 -0
- package/dist/packages/core/dist/crypto.js +329 -0
- package/dist/packages/core/dist/crypto.js.map +1 -0
- package/dist/packages/core/dist/discovery.d.ts +129 -0
- package/dist/packages/core/dist/discovery.js +527 -0
- package/dist/packages/core/dist/discovery.js.map +1 -0
- package/dist/packages/core/dist/edge.d.ts +4 -0
- package/dist/packages/core/dist/edge.js +6 -0
- package/dist/packages/core/dist/edge.js.map +1 -0
- package/dist/packages/core/dist/index.d.ts +9 -0
- package/dist/packages/core/dist/index.js +10 -0
- package/dist/packages/core/dist/index.js.map +1 -0
- package/dist/packages/core/dist/receipts.d.ts +9 -0
- package/dist/packages/core/dist/receipts.js +67 -0
- package/dist/packages/core/dist/receipts.js.map +1 -0
- package/dist/packages/core/dist/relay-auth.d.ts +40 -0
- package/dist/packages/core/dist/relay-auth.js +106 -0
- package/dist/packages/core/dist/relay-auth.js.map +1 -0
- package/dist/packages/core/dist/revocation.d.ts +58 -0
- package/dist/packages/core/dist/revocation.js +112 -0
- package/dist/packages/core/dist/revocation.js.map +1 -0
- package/dist/packages/core/dist/schema.d.ts +11 -0
- package/dist/packages/core/dist/schema.js +48 -0
- package/dist/packages/core/dist/schema.js.map +1 -0
- package/dist/packages/core/dist/types.d.ts +172 -0
- package/dist/packages/core/dist/types.js +2 -0
- package/dist/packages/core/dist/types.js.map +1 -0
- package/dist/packages/ledger/dist/index.d.ts +84 -0
- package/dist/packages/ledger/dist/index.js +269 -0
- package/dist/packages/ledger/dist/index.js.map +1 -0
- package/dist/packages/relay/dist/fetch.d.ts +250 -0
- package/dist/packages/relay/dist/fetch.js +1401 -0
- package/dist/packages/relay/dist/fetch.js.map +1 -0
- package/dist/packages/relay/dist/index.d.ts +103 -0
- package/dist/packages/relay/dist/index.js +855 -0
- package/dist/packages/relay/dist/index.js.map +1 -0
- package/dist/packages/relay/dist/journal.d.ts +77 -0
- package/dist/packages/relay/dist/journal.js +339 -0
- package/dist/packages/relay/dist/journal.js.map +1 -0
- package/dist/packages/relay/dist/notifications.d.ts +63 -0
- package/dist/packages/relay/dist/notifications.js +55 -0
- package/dist/packages/relay/dist/notifications.js.map +1 -0
- package/dist/packages/relay/dist/retry.d.ts +12 -0
- package/dist/packages/relay/dist/retry.js +59 -0
- package/dist/packages/relay/dist/retry.js.map +1 -0
- package/dist/packages/relay/dist/ssrf.d.ts +32 -0
- package/dist/packages/relay/dist/ssrf.js +213 -0
- package/dist/packages/relay/dist/ssrf.js.map +1 -0
- package/dist/packages/relay/dist/worker.d.ts +92 -0
- package/dist/packages/relay/dist/worker.js +460 -0
- package/dist/packages/relay/dist/worker.js.map +1 -0
- package/dist/packages/runtime/dist/a2a.d.ts +8 -0
- package/dist/packages/runtime/dist/a2a.js +69 -0
- package/dist/packages/runtime/dist/a2a.js.map +1 -0
- package/dist/packages/runtime/dist/adapter.d.ts +51 -0
- package/dist/packages/runtime/dist/adapter.js +2 -0
- package/dist/packages/runtime/dist/adapter.js.map +1 -0
- package/dist/packages/runtime/dist/approval-providers.d.ts +99 -0
- package/dist/packages/runtime/dist/approval-providers.js +269 -0
- package/dist/packages/runtime/dist/approval-providers.js.map +1 -0
- package/dist/packages/runtime/dist/daily-limit.d.ts +2 -0
- package/dist/packages/runtime/dist/daily-limit.js +54 -0
- package/dist/packages/runtime/dist/daily-limit.js.map +1 -0
- package/dist/packages/runtime/dist/gateway.d.ts +35 -0
- package/dist/packages/runtime/dist/gateway.js +92 -0
- package/dist/packages/runtime/dist/gateway.js.map +1 -0
- package/dist/packages/runtime/dist/inbox.d.ts +10 -0
- package/dist/packages/runtime/dist/inbox.js +24 -0
- package/dist/packages/runtime/dist/inbox.js.map +1 -0
- package/dist/packages/runtime/dist/index.d.ts +13 -0
- package/dist/packages/runtime/dist/index.js +14 -0
- package/dist/packages/runtime/dist/index.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-server.d.ts +90 -0
- package/dist/packages/runtime/dist/mcp-server.js +647 -0
- package/dist/packages/runtime/dist/mcp-server.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +3 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.js +507 -0
- package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -0
- package/dist/packages/runtime/dist/mcp.d.ts +73 -0
- package/dist/packages/runtime/dist/mcp.js +67 -0
- package/dist/packages/runtime/dist/mcp.js.map +1 -0
- package/dist/packages/runtime/dist/policy.d.ts +19 -0
- package/dist/packages/runtime/dist/policy.js +41 -0
- package/dist/packages/runtime/dist/policy.js.map +1 -0
- package/dist/packages/runtime/dist/quota.d.ts +39 -0
- package/dist/packages/runtime/dist/quota.js +147 -0
- package/dist/packages/runtime/dist/quota.js.map +1 -0
- package/dist/packages/runtime/dist/session-audit.d.ts +107 -0
- package/dist/packages/runtime/dist/session-audit.js +520 -0
- package/dist/packages/runtime/dist/session-audit.js.map +1 -0
- package/dist/packages/runtime/dist/session-timeouts.d.ts +33 -0
- package/dist/packages/runtime/dist/session-timeouts.js +62 -0
- package/dist/packages/runtime/dist/session-timeouts.js.map +1 -0
- package/dist/packages/runtime/dist/session.d.ts +323 -0
- package/dist/packages/runtime/dist/session.js +2252 -0
- package/dist/packages/runtime/dist/session.js.map +1 -0
- package/dist/packages/runtime/dist/task-journal.d.ts +36 -0
- package/dist/packages/runtime/dist/task-journal.js +104 -0
- package/dist/packages/runtime/dist/task-journal.js.map +1 -0
- package/dist/packages/runtime/dist/verifier.d.ts +64 -0
- package/dist/packages/runtime/dist/verifier.js +109 -0
- package/dist/packages/runtime/dist/verifier.js.map +1 -0
- package/dist/packages/sandbox/dist/container.d.ts +33 -0
- package/dist/packages/sandbox/dist/container.js +189 -0
- package/dist/packages/sandbox/dist/container.js.map +1 -0
- package/dist/packages/sandbox/dist/index.d.ts +34 -0
- package/dist/packages/sandbox/dist/index.js +179 -0
- package/dist/packages/sandbox/dist/index.js.map +1 -0
- package/dist/packages/sandbox/dist/permission.d.ts +58 -0
- package/dist/packages/sandbox/dist/permission.js +90 -0
- package/dist/packages/sandbox/dist/permission.js.map +1 -0
- package/dist/spec/README.ja.md +76 -0
- package/dist/spec/README.md +135 -0
- package/dist/spec/ack-receipt.schema.json +77 -0
- package/dist/spec/agent-card.schema.json +83 -0
- package/dist/spec/approval-receipt.schema.json +94 -0
- package/dist/spec/audit-entry.schema.json +101 -0
- package/dist/spec/capability-token.schema.json +133 -0
- package/dist/spec/envelope.schema.json +197 -0
- package/dist/spec/examples/sample-ack-receipt.json +16 -0
- package/dist/spec/examples/sample-agent-card.json +35 -0
- package/dist/spec/examples/sample-approval-receipt.json +18 -0
- package/dist/spec/examples/sample-audit-entry.json +37 -0
- package/dist/spec/examples/sample-capability-token.json +39 -0
- package/dist/spec/examples/sample-envelope.json +21 -0
- package/dist/spec/examples/sample-task-manifest.json +141 -0
- package/dist/spec/examples/sample-usage-receipt.json +19 -0
- package/dist/spec/task-manifest.schema.json +422 -0
- package/dist/spec/usage-receipt.schema.json +91 -0
- package/package.json +61 -5
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Json, Signature, AckReceipt, KeyPair, Signed } from '@acp/core';
|
|
2
|
+
export interface AuditBody {
|
|
3
|
+
taskId: string;
|
|
4
|
+
seq: number;
|
|
5
|
+
prevEntryHash: string | null;
|
|
6
|
+
actorDid: string;
|
|
7
|
+
receiverDid: string;
|
|
8
|
+
eventType: string;
|
|
9
|
+
payload: Json;
|
|
10
|
+
}
|
|
11
|
+
export interface AuditEntry {
|
|
12
|
+
body: AuditBody;
|
|
13
|
+
entryHash: string;
|
|
14
|
+
actorSignature: Signature;
|
|
15
|
+
counterSignature: AckReceipt;
|
|
16
|
+
}
|
|
17
|
+
export interface Checkpoint {
|
|
18
|
+
type: 'AuditCheckpoint';
|
|
19
|
+
taskId: string;
|
|
20
|
+
count: number;
|
|
21
|
+
head: string | null;
|
|
22
|
+
actors: [string, string];
|
|
23
|
+
}
|
|
24
|
+
export interface AuditBundle {
|
|
25
|
+
entries: AuditEntry[];
|
|
26
|
+
checkpoint: {
|
|
27
|
+
actor: Signed<Checkpoint>;
|
|
28
|
+
receiver: Signed<Signed<Checkpoint>>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface AuditStore {
|
|
32
|
+
read(): AuditEntry[];
|
|
33
|
+
append(entry: AuditEntry, checkpoint: AuditBundle['checkpoint']): void;
|
|
34
|
+
seal?(checkpoint: AuditBundle['checkpoint']): void;
|
|
35
|
+
}
|
|
36
|
+
export declare class MemoryStore implements AuditStore {
|
|
37
|
+
#private;
|
|
38
|
+
read(): AuditEntry[];
|
|
39
|
+
append(entry: AuditEntry): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class JsonlStore implements AuditStore {
|
|
42
|
+
readonly path: string;
|
|
43
|
+
constructor(path: string);
|
|
44
|
+
private records;
|
|
45
|
+
read(): AuditEntry[];
|
|
46
|
+
append(entry: AuditEntry): void;
|
|
47
|
+
seal(checkpoint: AuditBundle['checkpoint']): void;
|
|
48
|
+
}
|
|
49
|
+
export declare function parseJsonl(text: string): AuditBundle;
|
|
50
|
+
export declare class BilateralLedger {
|
|
51
|
+
readonly taskId: string;
|
|
52
|
+
readonly actors: [string, string];
|
|
53
|
+
readonly store: AuditStore;
|
|
54
|
+
constructor(taskId: string, actors: [string, string], store?: AuditStore);
|
|
55
|
+
private checkpoint;
|
|
56
|
+
append(eventType: string, payload: Json, actor: KeyPair, receiver: KeyPair): AuditEntry;
|
|
57
|
+
bundle(actor: KeyPair, receiver: KeyPair): AuditBundle;
|
|
58
|
+
}
|
|
59
|
+
/** External pin for the bilateral checkpoint. `head` is the checkpoint head. */
|
|
60
|
+
export interface AuditTrustAnchor {
|
|
61
|
+
taskId?: string;
|
|
62
|
+
actors?: [string, string];
|
|
63
|
+
head?: string;
|
|
64
|
+
expectedFinalState?: string;
|
|
65
|
+
expectedLastEntryHash?: string;
|
|
66
|
+
expectedEntryCount?: number;
|
|
67
|
+
}
|
|
68
|
+
export interface AuditVerificationOptions extends AuditTrustAnchor {
|
|
69
|
+
trustAnchor?: AuditTrustAnchor;
|
|
70
|
+
}
|
|
71
|
+
export interface AuditVerificationResult {
|
|
72
|
+
valid: boolean;
|
|
73
|
+
status: 'VALID' | 'INVALID';
|
|
74
|
+
statusLabel: string;
|
|
75
|
+
trustAnchorVerified: boolean;
|
|
76
|
+
truncationChecked: boolean;
|
|
77
|
+
reason?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Intact chain with no external anchor. A hash chain cannot tell a complete
|
|
81
|
+
* older log from the current one, so tail truncation is not checked.
|
|
82
|
+
*/
|
|
83
|
+
export declare const AUDIT_VALID_WITHOUT_TRUST_ANCHOR = "VALID (no trust anchor: truncation not checked)";
|
|
84
|
+
export declare function verifyAudit(bundle: AuditBundle, expected?: AuditVerificationOptions): AuditVerificationResult;
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { appendFileSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { digest, signPayload, signAck, verifySigned, verifySignature, validateSchema, } from '../../core/dist/index.js';
|
|
4
|
+
export class MemoryStore {
|
|
5
|
+
#entries = [];
|
|
6
|
+
read() {
|
|
7
|
+
return structuredClone(this.#entries);
|
|
8
|
+
}
|
|
9
|
+
append(entry) {
|
|
10
|
+
this.#entries.push(structuredClone(entry));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class JsonlStore {
|
|
14
|
+
path;
|
|
15
|
+
constructor(path) {
|
|
16
|
+
this.path = path;
|
|
17
|
+
}
|
|
18
|
+
records() {
|
|
19
|
+
try {
|
|
20
|
+
return readFileSync(this.path, 'utf8')
|
|
21
|
+
.trim()
|
|
22
|
+
.split('\n')
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
.map((l) => JSON.parse(l));
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
if (e.code === 'ENOENT')
|
|
28
|
+
return [];
|
|
29
|
+
throw e;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
read() {
|
|
33
|
+
return this.records()
|
|
34
|
+
.filter((r) => r.entry)
|
|
35
|
+
.map((r) => r.entry);
|
|
36
|
+
}
|
|
37
|
+
append(entry) {
|
|
38
|
+
if (this.records().some((r) => r.checkpoint))
|
|
39
|
+
throw new Error('LEDGER_SEALED');
|
|
40
|
+
appendFileSync(this.path, JSON.stringify({ entry }) + '\n', { mode: 0o600 });
|
|
41
|
+
}
|
|
42
|
+
seal(checkpoint) {
|
|
43
|
+
const old = this.records().at(-1)?.checkpoint;
|
|
44
|
+
if (old) {
|
|
45
|
+
if (digest(old.actor.payload) !== digest(checkpoint.actor.payload))
|
|
46
|
+
throw new Error('LEDGER_SEALED');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
appendFileSync(this.path, JSON.stringify({ checkpoint }) + '\n', { mode: 0o600 });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function parseJsonl(text) {
|
|
53
|
+
const records = text
|
|
54
|
+
.trim()
|
|
55
|
+
.split('\n')
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.map((l) => JSON.parse(l));
|
|
58
|
+
const last = records.pop();
|
|
59
|
+
if (!last?.checkpoint || last.entry || records.some((r) => !r.entry || r.checkpoint))
|
|
60
|
+
throw new Error('MISSING_OR_MISPLACED_CHECKPOINT');
|
|
61
|
+
return { entries: records.map((r) => r.entry), checkpoint: last.checkpoint };
|
|
62
|
+
}
|
|
63
|
+
export class BilateralLedger {
|
|
64
|
+
taskId;
|
|
65
|
+
actors;
|
|
66
|
+
store;
|
|
67
|
+
constructor(taskId, actors, store = new MemoryStore()) {
|
|
68
|
+
this.taskId = taskId;
|
|
69
|
+
this.actors = actors;
|
|
70
|
+
this.store = store;
|
|
71
|
+
if (actors[0] === actors[1])
|
|
72
|
+
throw new Error('DISTINCT_ACTORS_REQUIRED');
|
|
73
|
+
}
|
|
74
|
+
checkpoint(entries, actor, receiver) {
|
|
75
|
+
const payload = {
|
|
76
|
+
type: 'AuditCheckpoint',
|
|
77
|
+
taskId: this.taskId,
|
|
78
|
+
count: entries.length,
|
|
79
|
+
head: entries.at(-1)?.entryHash ?? null,
|
|
80
|
+
actors: this.actors,
|
|
81
|
+
};
|
|
82
|
+
const signed = signPayload(payload, actor);
|
|
83
|
+
return { actor: signed, receiver: signPayload(signed, receiver) };
|
|
84
|
+
}
|
|
85
|
+
append(eventType, payload, actor, receiver) {
|
|
86
|
+
if (actor.did === receiver.did ||
|
|
87
|
+
!this.actors.includes(actor.did) ||
|
|
88
|
+
!this.actors.includes(receiver.did))
|
|
89
|
+
throw new Error('INVALID_LEDGER_PARTIES');
|
|
90
|
+
const entries = this.store.read();
|
|
91
|
+
if (!verifyAudit({ entries, checkpoint: this.checkpoint(entries, actor, receiver) }).valid)
|
|
92
|
+
throw new Error('CORRUPT_EXISTING_LEDGER');
|
|
93
|
+
const body = {
|
|
94
|
+
taskId: this.taskId,
|
|
95
|
+
seq: entries.length,
|
|
96
|
+
prevEntryHash: entries.at(-1)?.entryHash ?? null,
|
|
97
|
+
actorDid: actor.did,
|
|
98
|
+
receiverDid: receiver.did,
|
|
99
|
+
eventType,
|
|
100
|
+
payload,
|
|
101
|
+
};
|
|
102
|
+
const entryHash = digest(body), actorSignature = signPayload(body, actor).signature;
|
|
103
|
+
const counterSignature = signAck({
|
|
104
|
+
type: 'AckReceipt',
|
|
105
|
+
taskId: this.taskId,
|
|
106
|
+
entryHash,
|
|
107
|
+
actorDid: actor.did,
|
|
108
|
+
receiverDid: receiver.did,
|
|
109
|
+
}, receiver);
|
|
110
|
+
const entry = { body, entryHash, actorSignature, counterSignature };
|
|
111
|
+
validateSchema('audit-entry', entry);
|
|
112
|
+
this.store.append(entry, this.checkpoint([...entries, entry], actor, receiver));
|
|
113
|
+
return entry;
|
|
114
|
+
}
|
|
115
|
+
bundle(actor, receiver) {
|
|
116
|
+
const entries = this.store.read();
|
|
117
|
+
const checkpoint = this.checkpoint(entries, actor, receiver);
|
|
118
|
+
this.store.seal?.(checkpoint);
|
|
119
|
+
return { entries, checkpoint };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Intact chain with no external anchor. A hash chain cannot tell a complete
|
|
124
|
+
* older log from the current one, so tail truncation is not checked.
|
|
125
|
+
*/
|
|
126
|
+
export const AUDIT_VALID_WITHOUT_TRUST_ANCHOR = 'VALID (no trust anchor: truncation not checked)';
|
|
127
|
+
function hasText(value) {
|
|
128
|
+
return typeof value === 'string' && value.length > 0;
|
|
129
|
+
}
|
|
130
|
+
function textField(primary, fallback) {
|
|
131
|
+
if (hasText(primary))
|
|
132
|
+
return primary;
|
|
133
|
+
if (hasText(fallback))
|
|
134
|
+
return fallback;
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
function anchorSupplied(options) {
|
|
138
|
+
if (!options)
|
|
139
|
+
return false;
|
|
140
|
+
return [options, options.trustAnchor].some((part) => {
|
|
141
|
+
if (!part)
|
|
142
|
+
return false;
|
|
143
|
+
return (part.taskId !== undefined ||
|
|
144
|
+
part.actors !== undefined ||
|
|
145
|
+
hasText(part.head) ||
|
|
146
|
+
hasText(part.expectedFinalState) ||
|
|
147
|
+
hasText(part.expectedLastEntryHash) ||
|
|
148
|
+
typeof part.expectedEntryCount === 'number');
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function sameAnchorField(left, right) {
|
|
152
|
+
if (left === undefined || right === undefined)
|
|
153
|
+
return true;
|
|
154
|
+
return digest(left) === digest(right);
|
|
155
|
+
}
|
|
156
|
+
function resolveAnchor(options) {
|
|
157
|
+
const nested = options?.trustAnchor;
|
|
158
|
+
if (options &&
|
|
159
|
+
nested &&
|
|
160
|
+
(!sameAnchorField(options.taskId, nested.taskId) ||
|
|
161
|
+
!sameAnchorField(options.actors, nested.actors) ||
|
|
162
|
+
!sameAnchorField(options.head, nested.head) ||
|
|
163
|
+
!sameAnchorField(options.expectedFinalState, nested.expectedFinalState) ||
|
|
164
|
+
!sameAnchorField(options.expectedLastEntryHash, nested.expectedLastEntryHash) ||
|
|
165
|
+
!sameAnchorField(options.expectedEntryCount, nested.expectedEntryCount)))
|
|
166
|
+
throw new Error('trust anchor');
|
|
167
|
+
return {
|
|
168
|
+
taskId: options?.taskId ?? nested?.taskId,
|
|
169
|
+
actors: options?.actors ?? nested?.actors,
|
|
170
|
+
head: textField(options?.head, nested?.head),
|
|
171
|
+
expectedFinalState: textField(options?.expectedFinalState, nested?.expectedFinalState),
|
|
172
|
+
expectedLastEntryHash: textField(options?.expectedLastEntryHash, nested?.expectedLastEntryHash),
|
|
173
|
+
expectedEntryCount: options?.expectedEntryCount ?? nested?.expectedEntryCount,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function assertTrustAnchor(anchor, checkpoint, entries) {
|
|
177
|
+
if (anchor.taskId !== undefined && anchor.taskId !== checkpoint.taskId)
|
|
178
|
+
throw new Error('trust anchor');
|
|
179
|
+
if (anchor.actors !== undefined) {
|
|
180
|
+
if (!Array.isArray(anchor.actors) ||
|
|
181
|
+
anchor.actors.length !== 2 ||
|
|
182
|
+
digest(anchor.actors) !== digest(checkpoint.actors))
|
|
183
|
+
throw new Error('trust anchor');
|
|
184
|
+
}
|
|
185
|
+
const last = entries.at(-1)?.entryHash ?? null;
|
|
186
|
+
if (anchor.head !== undefined && anchor.head !== checkpoint.head)
|
|
187
|
+
throw new Error('trust anchor');
|
|
188
|
+
if (anchor.expectedLastEntryHash !== undefined && anchor.expectedLastEntryHash !== last)
|
|
189
|
+
throw new Error('trust anchor');
|
|
190
|
+
if (anchor.expectedEntryCount !== undefined) {
|
|
191
|
+
if (typeof anchor.expectedEntryCount !== 'number' ||
|
|
192
|
+
!Number.isSafeInteger(anchor.expectedEntryCount) ||
|
|
193
|
+
anchor.expectedEntryCount < 0 ||
|
|
194
|
+
anchor.expectedEntryCount !== checkpoint.count)
|
|
195
|
+
throw new Error('trust anchor');
|
|
196
|
+
}
|
|
197
|
+
if (anchor.expectedFinalState !== undefined &&
|
|
198
|
+
entries.at(-1)?.body.eventType !== anchor.expectedFinalState)
|
|
199
|
+
throw new Error('trust anchor');
|
|
200
|
+
}
|
|
201
|
+
function auditResult(supplied, error) {
|
|
202
|
+
if (error !== undefined)
|
|
203
|
+
return {
|
|
204
|
+
valid: false,
|
|
205
|
+
status: 'INVALID',
|
|
206
|
+
statusLabel: 'INVALID',
|
|
207
|
+
trustAnchorVerified: false,
|
|
208
|
+
truncationChecked: supplied,
|
|
209
|
+
reason: String(error),
|
|
210
|
+
};
|
|
211
|
+
if (!supplied)
|
|
212
|
+
return {
|
|
213
|
+
valid: true,
|
|
214
|
+
status: 'VALID',
|
|
215
|
+
statusLabel: AUDIT_VALID_WITHOUT_TRUST_ANCHOR,
|
|
216
|
+
trustAnchorVerified: false,
|
|
217
|
+
truncationChecked: false,
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
valid: true,
|
|
221
|
+
status: 'VALID',
|
|
222
|
+
statusLabel: 'VALID',
|
|
223
|
+
trustAnchorVerified: true,
|
|
224
|
+
truncationChecked: true,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
export function verifyAudit(bundle, expected) {
|
|
228
|
+
const supplied = anchorSupplied(expected);
|
|
229
|
+
try {
|
|
230
|
+
const { entries, checkpoint } = bundle, c = checkpoint.actor.payload;
|
|
231
|
+
const selfDelegated = Array.isArray(c?.actors) && c.actors.length === 2 && c.actors[0] === c.actors[1];
|
|
232
|
+
if (c.type !== 'AuditCheckpoint' ||
|
|
233
|
+
c.actors.length !== 2 ||
|
|
234
|
+
!c.actors.includes(checkpoint.actor.signature.signerDid) ||
|
|
235
|
+
!c.actors.includes(checkpoint.receiver.signature.signerDid) ||
|
|
236
|
+
(!selfDelegated &&
|
|
237
|
+
checkpoint.actor.signature.signerDid === checkpoint.receiver.signature.signerDid) ||
|
|
238
|
+
!verifySigned(checkpoint.actor) ||
|
|
239
|
+
!verifySigned(checkpoint.receiver) ||
|
|
240
|
+
digest(checkpoint.receiver.payload) !== digest(checkpoint.actor) ||
|
|
241
|
+
c.count !== entries.length ||
|
|
242
|
+
c.head !== (entries.at(-1)?.entryHash ?? null))
|
|
243
|
+
throw new Error('checkpoint');
|
|
244
|
+
assertTrustAnchor(resolveAnchor(expected), c, entries);
|
|
245
|
+
for (let i = 0; i < entries.length; i++) {
|
|
246
|
+
const e = entries[i], b = e.body, a = e.counterSignature;
|
|
247
|
+
validateSchema('audit-entry', e);
|
|
248
|
+
if (b.taskId !== c.taskId ||
|
|
249
|
+
b.seq !== i ||
|
|
250
|
+
b.prevEntryHash !== (entries[i - 1]?.entryHash ?? null) ||
|
|
251
|
+
e.entryHash !== digest(b) ||
|
|
252
|
+
!c.actors.includes(b.actorDid) ||
|
|
253
|
+
!c.actors.includes(b.receiverDid) ||
|
|
254
|
+
(!selfDelegated && b.actorDid === b.receiverDid) ||
|
|
255
|
+
!verifySignature(b, e.actorSignature, b.actorDid) ||
|
|
256
|
+
!verifySigned(a, b.receiverDid) ||
|
|
257
|
+
a.payload.entryHash !== e.entryHash ||
|
|
258
|
+
a.payload.taskId !== b.taskId ||
|
|
259
|
+
a.payload.actorDid !== b.actorDid ||
|
|
260
|
+
a.payload.receiverDid !== b.receiverDid)
|
|
261
|
+
throw new Error('entry ' + i);
|
|
262
|
+
}
|
|
263
|
+
return auditResult(supplied);
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
return auditResult(supplied, e);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import type { SignedEnvelope, SignedAgentCard, RelayAuthAction, KeyPair } from '@acp/core/edge';
|
|
2
|
+
import type { RelayWakeOptions, RelayWakeAttempt, RelayOperation, SignedRelayDeliveryStatus } from './notifications.js';
|
|
3
|
+
export * from './notifications.js';
|
|
4
|
+
export declare function verifyRelayEnvelope(e: SignedEnvelope, recipient?: string): boolean;
|
|
5
|
+
/** Single signed envelope JSON body. Larger bodies are rejected before they are queued. */
|
|
6
|
+
export declare const DEFAULT_MAX_ENVELOPE_BYTES: number;
|
|
7
|
+
/** Unread envelopes kept for one recipient. */
|
|
8
|
+
export declare const DEFAULT_MAX_QUEUE_SIZE = 256;
|
|
9
|
+
/** Sum of queued envelope JSON sizes for one recipient. */
|
|
10
|
+
export declare const DEFAULT_MAX_QUEUE_BYTES_PER_RECIPIENT: number;
|
|
11
|
+
export declare const DEFAULT_ENVELOPE_TTL_MS: number;
|
|
12
|
+
export declare const DEFAULT_SEEN_TTL_MS: number;
|
|
13
|
+
export declare const DEFAULT_AUTH_SEEN_TTL_MS: number;
|
|
14
|
+
export declare const DEFAULT_AGENT_CARD_TTL_MS: number;
|
|
15
|
+
/** Caps the durable replay ring scanned when an inbox object wakes. */
|
|
16
|
+
export declare const DEFAULT_MAX_SEEN_ENTRIES = 4096;
|
|
17
|
+
export declare const DEFAULT_MAX_QUEUES = 10000;
|
|
18
|
+
export declare const DEFAULT_MAX_AGENTS = 10000;
|
|
19
|
+
export interface RelaySnapshot {
|
|
20
|
+
operations?: [string, RelayOperation][];
|
|
21
|
+
queues: [string, SignedEnvelope[]][];
|
|
22
|
+
seen: string[];
|
|
23
|
+
authSeen?: string[];
|
|
24
|
+
agents: SignedAgentCard[];
|
|
25
|
+
envelopeExpiry?: [string, number][];
|
|
26
|
+
leaseExpiry?: [string, number][];
|
|
27
|
+
seenExpiry?: [string, number][];
|
|
28
|
+
authExpiry?: [string, number][];
|
|
29
|
+
agentExpiry?: [string, number][];
|
|
30
|
+
}
|
|
31
|
+
export interface InMemoryRelayOptions {
|
|
32
|
+
notificationKey?: KeyPair;
|
|
33
|
+
wake?: RelayWakeOptions;
|
|
34
|
+
/** Bounded expiry notices and wake deduplication retention; default one hour. */
|
|
35
|
+
notificationTtlMs?: number;
|
|
36
|
+
requireAuth?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Direct and network checks accept a `RelayAuth` token that omits `origin`.
|
|
39
|
+
* A token that includes a different origin is still rejected.
|
|
40
|
+
*/
|
|
41
|
+
allowUnboundRelayAuth?: boolean;
|
|
42
|
+
maxSeenEntries?: number;
|
|
43
|
+
maxAuthSeenEntries?: number;
|
|
44
|
+
maxQueues?: number;
|
|
45
|
+
maxQueueSize?: number;
|
|
46
|
+
maxEnvelopeBytes?: number;
|
|
47
|
+
maxQueueBytesPerRecipient?: number;
|
|
48
|
+
maxEnvelopesPerSender?: number;
|
|
49
|
+
maxAgents?: number;
|
|
50
|
+
envelopeTtlMs?: number;
|
|
51
|
+
seenTtlMs?: number;
|
|
52
|
+
authSeenTtlMs?: number;
|
|
53
|
+
agentCardTtlMs?: number;
|
|
54
|
+
now?: () => number;
|
|
55
|
+
tamper?: (e: SignedEnvelope) => SignedEnvelope;
|
|
56
|
+
}
|
|
57
|
+
export type RelayInboxRole = 'worker' | 'requester';
|
|
58
|
+
export interface RelayReceiveFilter {
|
|
59
|
+
taskId?: string | readonly string[];
|
|
60
|
+
role?: RelayInboxRole;
|
|
61
|
+
peek?: boolean;
|
|
62
|
+
lease?: boolean;
|
|
63
|
+
}
|
|
64
|
+
interface TaskRoleState {
|
|
65
|
+
crossRole: Map<string, RelayInboxRole>;
|
|
66
|
+
lastPrimaryRole?: RelayInboxRole;
|
|
67
|
+
pendingAckRoles: RelayInboxRole[];
|
|
68
|
+
workerSeq: number;
|
|
69
|
+
requesterSeq: number;
|
|
70
|
+
}
|
|
71
|
+
interface NormalizedReceiveFilter {
|
|
72
|
+
taskIds?: Set<string>;
|
|
73
|
+
role?: RelayInboxRole;
|
|
74
|
+
peek: boolean;
|
|
75
|
+
lease?: boolean;
|
|
76
|
+
}
|
|
77
|
+
export declare function classifyEnvelopeRole(envelope: SignedEnvelope, state?: TaskRoleState): RelayInboxRole;
|
|
78
|
+
export declare function normalizeReceiveFilter(filter?: RelayReceiveFilter): NormalizedReceiveFilter;
|
|
79
|
+
export declare function parseReceiveFilterFromUrl(url: URL): RelayReceiveFilter | undefined;
|
|
80
|
+
export declare function inboxRecipientFromRequest(path: string, url: URL): string | undefined;
|
|
81
|
+
export declare function relayLimitsFromEnv(env?: Record<string, unknown>): InMemoryRelayOptions;
|
|
82
|
+
export declare function canonicalRelayPath(pathname: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Registry identity for one owner's registration of one agent.
|
|
85
|
+
* did:key values do not contain "/", so the pair round-trips unambiguously.
|
|
86
|
+
*/
|
|
87
|
+
export declare function agentRegistryKey(ownerDid: string, agentDid: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Use the same verified, deterministic DID selection as requesters.
|
|
90
|
+
*/
|
|
91
|
+
export declare function selectAgentCard(cards: Iterable<SignedAgentCard>, agentDid: string, now?: number): SignedAgentCard | undefined;
|
|
92
|
+
export declare class InMemoryRelay {
|
|
93
|
+
private operations;
|
|
94
|
+
private notificationKey;
|
|
95
|
+
private readonly wake?;
|
|
96
|
+
readonly notificationTtlMs: number;
|
|
97
|
+
private flushing?;
|
|
98
|
+
get notificationDid(): string;
|
|
99
|
+
/** Durable hosts install the persisted relay identity before restoring queues. */
|
|
100
|
+
setNotificationKey(key: KeyPair): void;
|
|
101
|
+
private queues;
|
|
102
|
+
private taskStates;
|
|
103
|
+
private seen;
|
|
104
|
+
private authSeen;
|
|
105
|
+
private agentExpiry;
|
|
106
|
+
private version;
|
|
107
|
+
get mutationVersion(): number;
|
|
108
|
+
private listeners;
|
|
109
|
+
/** Keyed by agentRegistryKey(ownerDid, agentDid). One owner cannot block another. */
|
|
110
|
+
readonly agents: Map<string, SignedAgentCard>;
|
|
111
|
+
readonly tamper?: (e: SignedEnvelope) => SignedEnvelope;
|
|
112
|
+
readonly requireAuth: boolean;
|
|
113
|
+
readonly allowUnboundRelayAuth: boolean;
|
|
114
|
+
readonly maxSeenEntries: number;
|
|
115
|
+
readonly maxAuthSeenEntries: number;
|
|
116
|
+
readonly maxQueues: number;
|
|
117
|
+
readonly maxQueueSize: number;
|
|
118
|
+
readonly maxEnvelopeBytes: number;
|
|
119
|
+
readonly maxQueueBytesPerRecipient: number;
|
|
120
|
+
readonly maxEnvelopesPerSender: number;
|
|
121
|
+
readonly maxAgents: number;
|
|
122
|
+
readonly envelopeTtlMs: number;
|
|
123
|
+
readonly seenTtlMs: number;
|
|
124
|
+
readonly authSeenTtlMs: number;
|
|
125
|
+
readonly agentCardTtlMs: number;
|
|
126
|
+
private readonly now;
|
|
127
|
+
constructor(options?: InMemoryRelayOptions | ((e: SignedEnvelope) => SignedEnvelope));
|
|
128
|
+
private remember;
|
|
129
|
+
authenticate(recipientDid: string, token?: string, action?: RelayAuthAction, check?: RelayAuthContext): boolean;
|
|
130
|
+
private stateForTask;
|
|
131
|
+
/** Authenticate once for a long poll or persistent stream, then read only this inbox. */
|
|
132
|
+
openInbox(recipientDid: string, token?: string, action?: RelayAuthAction, check?: RelayAuthContext, filter?: RelayReceiveFilter): () => SignedEnvelope | undefined;
|
|
133
|
+
private ensureQueue;
|
|
134
|
+
private putOperation;
|
|
135
|
+
registerWake(recipientDid: string, channel: string | null, token?: string, check?: RelayAuthContext): void;
|
|
136
|
+
private queueWake;
|
|
137
|
+
/** Claim inside a durable mutation turn and persist before invoking the channel. */
|
|
138
|
+
claimWakeNotification(): RelayWakeAttempt | undefined;
|
|
139
|
+
/** Run outside the durable mutation turn so notification latency cannot stall inbox delivery. */
|
|
140
|
+
deliverWakeNotification(attempt: RelayWakeAttempt): Promise<boolean>;
|
|
141
|
+
completeWakeNotification(attempt: RelayWakeAttempt, delivered: boolean): void;
|
|
142
|
+
/** In-memory hosts call periodically; durable hosts commit claims and completion separately. */
|
|
143
|
+
flushWakeNotifications(): Promise<void>;
|
|
144
|
+
getDeliveryStatus(recipientDid: string, envelopeId: string, senderDid: string, relay: string, token?: string, check?: RelayAuthContext): SignedRelayDeliveryStatus;
|
|
145
|
+
/** Drop queued envelopes, replay ids, and agent cards whose TTL has elapsed. */
|
|
146
|
+
evictExpired(): void;
|
|
147
|
+
private queuedBytes;
|
|
148
|
+
private senderCount;
|
|
149
|
+
send(envelope: SignedEnvelope): void;
|
|
150
|
+
receive(recipientDid: string, authToken?: string | number, _signal?: AbortSignal, checkOrFilter?: RelayAuthContext | RelayReceiveFilter, maybeFilter?: RelayReceiveFilter): SignedEnvelope | undefined;
|
|
151
|
+
peek(recipientDid: string, authTokenOrFilter?: string | Omit<RelayReceiveFilter, 'peek'>, check?: RelayAuthContext, filter?: Omit<RelayReceiveFilter, 'peek'>): SignedEnvelope | undefined;
|
|
152
|
+
pollInbox(recipientDid: string, authTokenOrFilter?: string | (RelayReceiveFilter & {
|
|
153
|
+
waitMs?: number;
|
|
154
|
+
signal?: AbortSignal;
|
|
155
|
+
}), filter?: RelayReceiveFilter, check?: RelayAuthContext): SignedEnvelope | undefined;
|
|
156
|
+
private dequeue;
|
|
157
|
+
/** Recipient-authenticated removal of one queued envelope. False when it is not queued. */
|
|
158
|
+
acknowledge(recipientDid: string, envelopeId: string, token?: string, check?: RelayAuthContext): boolean;
|
|
159
|
+
/** Seconds until the soonest queued item expires, for Retry-After. */
|
|
160
|
+
retryAfterSeconds(): number;
|
|
161
|
+
nextExpiry(): number | undefined;
|
|
162
|
+
withRecipient(key: KeyPair): {
|
|
163
|
+
send: (e: SignedEnvelope) => void;
|
|
164
|
+
deliveryStatus: (e: SignedEnvelope) => SignedRelayDeliveryStatus;
|
|
165
|
+
receive: (did: string, _waitMs?: number, signal?: AbortSignal, filter?: RelayReceiveFilter) => SignedEnvelope | undefined;
|
|
166
|
+
peek: (did: string, filter?: Omit<RelayReceiveFilter, "peek">) => SignedEnvelope | undefined;
|
|
167
|
+
pollInbox: (did: string, filter?: RelayReceiveFilter & {
|
|
168
|
+
waitMs?: number;
|
|
169
|
+
signal?: AbortSignal;
|
|
170
|
+
}) => SignedEnvelope | undefined;
|
|
171
|
+
register: (card: SignedAgentCard) => void;
|
|
172
|
+
discover: () => SignedAgentCard[];
|
|
173
|
+
};
|
|
174
|
+
subscribe(did: string, fn: () => void): () => void;
|
|
175
|
+
private hasMatching;
|
|
176
|
+
wait(did: string, ms: number, signal?: AbortSignal, filter?: RelayReceiveFilter): Promise<void>;
|
|
177
|
+
snapshot(): RelaySnapshot;
|
|
178
|
+
restore(snapshot: RelaySnapshot): void;
|
|
179
|
+
/** Authenticate even expired cards before allowing restore to discard them. */
|
|
180
|
+
private assertValidAgentSnapshot;
|
|
181
|
+
discover(): SignedAgentCard[];
|
|
182
|
+
register(card: SignedAgentCard): void;
|
|
183
|
+
}
|
|
184
|
+
export interface RelayAuthContext {
|
|
185
|
+
expectedOrigin?: string;
|
|
186
|
+
requireOrigin?: boolean;
|
|
187
|
+
}
|
|
188
|
+
export interface RelayRequestAuthOptions {
|
|
189
|
+
allowQueryAuth?: boolean;
|
|
190
|
+
requireOrigin?: boolean;
|
|
191
|
+
allowUnboundRelayAuth?: boolean;
|
|
192
|
+
}
|
|
193
|
+
export interface RelayFetchOptions extends RelayRequestAuthOptions {
|
|
194
|
+
relay?: InMemoryRelay;
|
|
195
|
+
agentCard?: SignedAgentCard;
|
|
196
|
+
deferNotifications?: boolean;
|
|
197
|
+
}
|
|
198
|
+
/** Defensive headers for any relay URL opened directly in a browser. */
|
|
199
|
+
export declare function relayHttpHeaders(kind?: 'json' | 'empty' | 'sse'): Record<string, string>;
|
|
200
|
+
/**
|
|
201
|
+
* Protocol codes the relay may place in an HTTP or WebSocket error body.
|
|
202
|
+
* A thrown message is returned only when it matches one of these strings exactly.
|
|
203
|
+
* Names that the live relay does not throw today stay listed so a later
|
|
204
|
+
* constant code is not replaced by RELAY_INTERNAL_ERROR.
|
|
205
|
+
*/
|
|
206
|
+
export declare const KNOWN_RELAY_ERROR_CODES: readonly ["INVALID_ENVELOPE", "INVALID_SIGNED_ENVELOPE", "ENVELOPE_EXPIRED", "REPLAYED_ENVELOPE", "DUPLICATE_ENVELOPE_ID", "ENVELOPE_TOO_LARGE", "RELAY_CAPACITY", "RELAY_QUEUE_FULL", "QUEUE_BYTES_EXCEEDED", "QUEUE_LIMIT_EXCEEDED", "RELAY_BYTE_BUDGET_EXCEEDED", "SENDER_QUOTA_EXCEEDED", "INVALID_RECIPIENT_DID", "MISSING_RECIPIENT_DID", "INVALID_DID", "RELAY_TAMPERING_DETECTED", "INVALID_AGENT_CARD", "INVALID_AGENT_SNAPSHOT", "AMBIGUOUS_AGENT_CARD_OWNER", "AGENT_CARD_EXPIRED", "AGENT_CARD_EXPIRY_TOO_LONG", "AGENT_CARD_DELEGATION_REQUIRED", "AGENT_DELEGATION_REQUIRED", "AGENT_CARD_DELEGATION_INVALID", "AGENT_CARD_TOO_LARGE", "AGENT_REGISTRY_FULL", "AGENT_CARD_TTL_INVALID", "AGENT_OWNER_OR_VERSION_MISMATCH", "NO_AGENT_REGISTERED", "RELAY_UNAUTHORIZED", "RELAY_AUTH_REQUIRED", "RELAY_AUTH_INVALID", "RELAY_AUTH_SIGNATURE_INVALID", "RELAY_AUTH_RECIPIENT_MISMATCH", "RELAY_AUTH_ACTION_MISMATCH", "RELAY_AUTH_EXPIRED", "RELAY_AUTH_FUTURE_ISSUED_AT", "RELAY_AUTH_REPLAYED", "RELAY_AUTH_NONCE_INVALID", "RELAY_AUTH_ORIGIN_REQUIRED", "RELAY_AUTH_ORIGIN_MISMATCH", "RELAY_QUERY_AUTH_DISABLED", "INVALID_RELAY_ORIGIN", "RATE_LIMITED", "RATE_LIMITER_UNAVAILABLE", "PAYLOAD_TOO_LARGE", "BODY_TOO_LARGE", "MISSING_BODY", "INVALID_JSON", "INVALID_UNICODE", "INVALID_LIMIT", "INVALID_RELAY_LIMIT", "INVALID_TIMEOUT", "INVALID_WAIT", "MISSING_ENVELOPE_ID", "UNSUPPORTED_METHOD", "NOT_FOUND", "WEBSOCKET_UPGRADE_REQUIRED", "INVALID_REQUEST", "INVALID_RELAY_SNAPSHOT", "RELAY_INTERNAL_ERROR"];
|
|
207
|
+
/**
|
|
208
|
+
* Public error code for an untrusted caller.
|
|
209
|
+
* Parser and URL failures become INVALID_REQUEST. Any other message is returned
|
|
210
|
+
* only when it is an allowlisted code; otherwise the result is the fallback
|
|
211
|
+
* when that fallback is itself allowlisted, or RELAY_INTERNAL_ERROR.
|
|
212
|
+
*/
|
|
213
|
+
export declare function sanitizeRelayErrorCode(error: unknown, fallback?: string): string;
|
|
214
|
+
export interface MappedRelayError {
|
|
215
|
+
status: number;
|
|
216
|
+
error: string;
|
|
217
|
+
}
|
|
218
|
+
/** Status and public code for one relay failure. Internal detail never leaves this function. */
|
|
219
|
+
export declare function mapRelayError(error: unknown): MappedRelayError;
|
|
220
|
+
/** Auth failures that must stay 401s with a stable error code. */
|
|
221
|
+
export declare function relayAuthFailure(error: unknown): string | undefined;
|
|
222
|
+
export declare function relayErrorResponse(error: unknown, relay?: InMemoryRelay): Response;
|
|
223
|
+
/**
|
|
224
|
+
* Bearer credential for a relay request.
|
|
225
|
+
* `?auth=` is ignored unless `allowQueryAuth` is set, so tokens do not land in
|
|
226
|
+
* access logs, proxy logs, or Referer headers by default.
|
|
227
|
+
*/
|
|
228
|
+
export declare function extractRelayAuthToken(request: Request, options?: {
|
|
229
|
+
allowQueryAuth?: boolean;
|
|
230
|
+
}, url?: URL): string | undefined;
|
|
231
|
+
export declare function relayRequestToken(request: Request, url?: URL, options?: {
|
|
232
|
+
allowQueryAuth?: boolean;
|
|
233
|
+
}): string | undefined;
|
|
234
|
+
export declare function relayAuthContext(request: Request, relay: InMemoryRelay, options?: RelayRequestAuthOptions): RelayAuthContext;
|
|
235
|
+
export type DurableLongPoll = {
|
|
236
|
+
mode: 'response';
|
|
237
|
+
response: Response;
|
|
238
|
+
} | {
|
|
239
|
+
mode: 'wait';
|
|
240
|
+
recipient: string;
|
|
241
|
+
waitMs: number;
|
|
242
|
+
filter?: RelayReceiveFilter;
|
|
243
|
+
receive: () => SignedEnvelope | undefined;
|
|
244
|
+
};
|
|
245
|
+
/**
|
|
246
|
+
* Authenticate a long-poll and pop envelopes that are already queued.
|
|
247
|
+
* The caller waits outside the durable-object lock when the inbox is empty.
|
|
248
|
+
*/
|
|
249
|
+
export declare function beginDurableLongPoll(relay: InMemoryRelay, request: Request, auth?: RelayRequestAuthOptions): DurableLongPoll;
|
|
250
|
+
export declare function createRelayFetchHandler(options?: RelayFetchOptions): (request: Request) => Promise<Response>;
|