@tinycloud/courier 0.3.3-beta.9 → 0.4.0-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -0
- package/dist/args.js +1 -1
- package/dist/args.js.map +1 -1
- package/dist/authority.d.ts +1 -0
- package/dist/authority.js +1 -1
- package/dist/authority.js.map +1 -1
- package/dist/commands.js +12 -8
- package/dist/commands.js.map +1 -1
- package/dist/guided.d.ts +18 -0
- package/dist/guided.js +92 -0
- package/dist/guided.js.map +1 -0
- package/dist/inbox.js +1 -1
- package/dist/inbox.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/invitation.d.ts +28 -0
- package/dist/invitation.js +406 -0
- package/dist/invitation.js.map +1 -0
- package/dist/keys.d.ts +2 -2
- package/dist/keys.js +5 -4
- package/dist/keys.js.map +1 -1
- package/dist/main.js +13 -0
- package/dist/main.js.map +1 -1
- package/dist/node.js +6 -0
- package/dist/node.js.map +1 -1
- package/dist/pairing.d.ts +11 -8
- package/dist/pairing.js +1 -0
- package/dist/pairing.js.map +1 -1
- package/dist/profile.d.ts +2 -0
- package/dist/profile.js.map +1 -1
- package/dist/watch.js +3 -2
- package/dist/watch.js.map +1 -1
- package/package.json +4 -3
- package/skills/courier/SKILL.md +21 -0
- package/skills/courier/start.md +17 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TinyCloudNode } from '@tinycloud/node-sdk';
|
|
2
|
+
import type { PairArtifact } from './pairing.js';
|
|
3
|
+
import type { AgentKey, Profile } from './profile.js';
|
|
4
|
+
import type { ParsedArgs } from './args.js';
|
|
5
|
+
import type { CourierSession, InvitationMode } from './guided.js';
|
|
6
|
+
export interface CourierInvitation {
|
|
7
|
+
type: 'courier-invitation';
|
|
8
|
+
v: 1;
|
|
9
|
+
id: string;
|
|
10
|
+
issuer: string;
|
|
11
|
+
host: string;
|
|
12
|
+
session: CourierSession;
|
|
13
|
+
mode: InvitationMode;
|
|
14
|
+
recipient?: string;
|
|
15
|
+
expiresAt: string;
|
|
16
|
+
artifact: PairArtifact;
|
|
17
|
+
relay: {
|
|
18
|
+
key: AgentKey;
|
|
19
|
+
delegation: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Strict Courier body codec; generic links do not confer chat authority. */
|
|
23
|
+
export declare function parseInvitation(value: unknown): CourierInvitation;
|
|
24
|
+
/** Serve one durable winner. A restart cannot issue C to a different claimant. */
|
|
25
|
+
export declare function serveInvitation(node: TinyCloudNode, profile: Profile, body: CourierInvitation, wait: number): Promise<void>;
|
|
26
|
+
export declare function cmdInvite(args: ParsedArgs): Promise<void>;
|
|
27
|
+
export declare function joinInvitation(link: string, args: ParsedArgs): Promise<void>;
|
|
28
|
+
export declare function cmdJoin(args: ParsedArgs): Promise<void>;
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createPrivateKey, createPublicKey, sign, verify } from 'node:crypto';
|
|
4
|
+
import { ulid } from 'ulid';
|
|
5
|
+
import { DelegatedAccess, NodeWasmBindings, activateValidatedRuntimeDelegation, deserializeDelegation, serializeDelegation } from '@tinycloud/node-sdk';
|
|
6
|
+
import { activateSessionWithHost } from '@tinycloud/sdk-core';
|
|
7
|
+
import { createLink, resolveLink, signerFromJwk, linkIssuerPublicKey } from '@tinycloud/share-envelope/links';
|
|
8
|
+
import { CourierError } from './errors.js';
|
|
9
|
+
import { canonicalJson, requestHash } from './canonical.js';
|
|
10
|
+
import { assertExactAuthority, assertPeerDelegation, bareDid } from './authority.js';
|
|
11
|
+
import { k, PREFIX, peerReadPermissions } from './keys.js';
|
|
12
|
+
import { artifactA, artifactWithDelegation, parseArtifact, validateArtifactIdentity } from './pairing.js';
|
|
13
|
+
import { loadKey, loadProfile, profileDir, saveProfile, writeSecure } from './profile.js';
|
|
14
|
+
import { courierNode } from './node.js';
|
|
15
|
+
import { getJson, putCreate, putOverwrite } from './store.js';
|
|
16
|
+
import { isRecord } from './a2a.js';
|
|
17
|
+
import { requireFlag } from './args.js';
|
|
18
|
+
import { activateSession, INVITATION_MODES, selectedSession, sessionKey, validSessionId } from './guided.js';
|
|
19
|
+
const DEFAULT_API = 'https://api.tinycloud.xyz';
|
|
20
|
+
const DEFAULT_VIEWER = 'https://courier.tinycloud.xyz';
|
|
21
|
+
const DOMAIN = 'xyz.tinycloud.courier/invitation/v1\0';
|
|
22
|
+
const inviteStateKey = (id) => `${PREFIX}/me/state/invitations/${id}.json`;
|
|
23
|
+
const winnerKey = (id) => `${PREFIX}/me/consumed/invitations/${id}.json`;
|
|
24
|
+
const answerKey = (id) => `${PREFIX}/me/state/invitation-answers/${id}.json`;
|
|
25
|
+
const relayRoot = (id) => `${PREFIX}/to/invite-${id}/pairing/`;
|
|
26
|
+
function refuse(message) { throw new CourierError('bad-invitation', message); }
|
|
27
|
+
function keys(value, required, optional = []) {
|
|
28
|
+
if (required.some((key) => !Object.hasOwn(value, key)) || Object.keys(value).some((key) => !required.includes(key) && !optional.includes(key)))
|
|
29
|
+
refuse('Unexpected invitation fields.');
|
|
30
|
+
}
|
|
31
|
+
function sameIdentity(a, b) { return a.toLowerCase() === b.toLowerCase(); }
|
|
32
|
+
/** Strict Courier body codec; generic links do not confer chat authority. */
|
|
33
|
+
export function parseInvitation(value) {
|
|
34
|
+
if (!isRecord(value))
|
|
35
|
+
refuse('Invitation must be an object.');
|
|
36
|
+
keys(value, ['type', 'v', 'id', 'issuer', 'host', 'session', 'mode', 'expiresAt', 'artifact', 'relay'], ['recipient']);
|
|
37
|
+
if (value.type !== 'courier-invitation' || value.v !== 1 || typeof value.id !== 'string' || !validSessionId(value.id))
|
|
38
|
+
refuse('Unsupported Courier invitation.');
|
|
39
|
+
if (typeof value.issuer !== 'string' || !linkIssuerPublicKey(value.issuer))
|
|
40
|
+
refuse('Invalid invitation signer.');
|
|
41
|
+
if (typeof value.host !== 'string')
|
|
42
|
+
refuse('Missing node origin.');
|
|
43
|
+
let host;
|
|
44
|
+
try {
|
|
45
|
+
host = new URL(value.host);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return refuse('Invalid node origin.');
|
|
49
|
+
}
|
|
50
|
+
if (host.origin !== value.host || (host.protocol !== 'https:' && !(host.protocol === 'http:' && ['127.0.0.1', 'localhost'].includes(host.hostname))))
|
|
51
|
+
refuse('Node must be an HTTPS origin (or a loopback test host).');
|
|
52
|
+
if (!INVITATION_MODES.includes(value.mode))
|
|
53
|
+
refuse('Unknown invitation mode.');
|
|
54
|
+
if (value.mode === 'named') {
|
|
55
|
+
if (typeof value.recipient !== 'string' || !linkIssuerPublicKey(value.recipient))
|
|
56
|
+
refuse('Named invitations require an exact Courier did:key; email identifiers are not supported.');
|
|
57
|
+
}
|
|
58
|
+
else if (value.recipient !== undefined)
|
|
59
|
+
refuse('Unexpected recipient constraint.');
|
|
60
|
+
if (typeof value.expiresAt !== 'string' || !Number.isFinite(Date.parse(value.expiresAt)) || new Date(value.expiresAt).toISOString() !== value.expiresAt)
|
|
61
|
+
refuse('Invalid invitation expiry.');
|
|
62
|
+
if (!isRecord(value.session))
|
|
63
|
+
refuse('Missing intended session.');
|
|
64
|
+
keys(value.session, ['sessionId', 'subject', 'createdAt']);
|
|
65
|
+
if (typeof value.session.sessionId !== 'string' || !validSessionId(value.session.sessionId) || typeof value.session.subject !== 'string'
|
|
66
|
+
|| value.session.subject.length > 1000 || typeof value.session.createdAt !== 'string' || !Number.isFinite(Date.parse(value.session.createdAt)))
|
|
67
|
+
refuse('Invalid intended session.');
|
|
68
|
+
const art = parseArtifact(JSON.stringify(value.artifact));
|
|
69
|
+
validateArtifactIdentity(art);
|
|
70
|
+
if (art.step !== 'A' || art.from.courier !== value.issuer || art.peer !== `chat-${value.id}-recipient` || art.callMe !== `chat-${value.id}-issuer`)
|
|
71
|
+
refuse('Invitation pairing does not match its signer or mailbox.');
|
|
72
|
+
if (!isRecord(value.relay))
|
|
73
|
+
refuse('Missing pairing relay.');
|
|
74
|
+
keys(value.relay, ['key', 'delegation']);
|
|
75
|
+
if (!isRecord(value.relay.key) || value.relay.key.v !== 1 || typeof value.relay.key.did !== 'string' || !isRecord(value.relay.key.jwk)
|
|
76
|
+
|| typeof value.relay.delegation !== 'string')
|
|
77
|
+
refuse('Invalid pairing relay.');
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
function signed(payload, key) {
|
|
81
|
+
const privateKey = createPrivateKey({ key: key.jwk, format: 'jwk' });
|
|
82
|
+
return { payload, signature: sign(null, Buffer.from(DOMAIN + canonicalJson(payload)), privateKey).toString('base64url') };
|
|
83
|
+
}
|
|
84
|
+
function checked(value, did) {
|
|
85
|
+
if (!isRecord(value))
|
|
86
|
+
refuse('Missing signed pairing response.');
|
|
87
|
+
keys(value, ['payload', 'signature']);
|
|
88
|
+
const raw = linkIssuerPublicKey(did);
|
|
89
|
+
if (!raw || typeof value.signature !== 'string' || !/^[A-Za-z0-9_-]{86}$/.test(value.signature))
|
|
90
|
+
refuse('Invalid pairing signature.');
|
|
91
|
+
const key = createPublicKey({ key: { kty: 'OKP', crv: 'Ed25519', x: Buffer.from(raw).toString('base64url') }, format: 'jwk' });
|
|
92
|
+
if (!verify(null, Buffer.from(DOMAIN + canonicalJson(value.payload)), key, Buffer.from(value.signature, 'base64url')))
|
|
93
|
+
refuse('Pairing response signature does not match its agent.');
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
function relayPermissions(body) {
|
|
97
|
+
return [{ service: 'tinycloud.kv', space: body.artifact.spaceId, path: relayRoot(body.id), actions: ['tinycloud.kv/get', 'tinycloud.kv/put'] }];
|
|
98
|
+
}
|
|
99
|
+
/** Verify the inviter's owner→agent chain before granting the inviter any read access. */
|
|
100
|
+
async function relayKv(body, node) {
|
|
101
|
+
const delegation = deserializeDelegation(body.relay.delegation);
|
|
102
|
+
const key = body.relay.key;
|
|
103
|
+
const signer = signerFromJwk(key.jwk);
|
|
104
|
+
if (signer.did !== bareDid(key.did) || bareDid(delegation.delegateDID) !== signer.did || delegation.spaceId !== body.artifact.spaceId
|
|
105
|
+
|| !sameIdentity(delegation.ownerAddress, body.artifact.from.owner.split(':').at(-1)))
|
|
106
|
+
refuse('Relay key, owner or space changed.');
|
|
107
|
+
// This embedded key is only a pairing transport. The ordinary activation endpoint
|
|
108
|
+
// verifies its signed parent chain; it is never installed as the recipient's identity.
|
|
109
|
+
const installed = [];
|
|
110
|
+
const active = await activateValidatedRuntimeDelegation({
|
|
111
|
+
sessionDid: key.did,
|
|
112
|
+
computeDelegationCid: (authorization) => node.computeDelegationCid(authorization),
|
|
113
|
+
async useRuntimeDelegation(candidate) {
|
|
114
|
+
const receipt = await activateSessionWithHost(body.host, candidate.delegationHeader);
|
|
115
|
+
if (!receipt.success)
|
|
116
|
+
refuse('The node refused the inviter owner proof.');
|
|
117
|
+
installed.push(candidate);
|
|
118
|
+
},
|
|
119
|
+
getRuntimePermissionDelegations: () => installed,
|
|
120
|
+
}, delegation, {
|
|
121
|
+
host: body.host,
|
|
122
|
+
authorize: (permissions) => { assertExactAuthority(permissions, relayPermissions(body), 'Pairing relay'); return true; },
|
|
123
|
+
});
|
|
124
|
+
if (bareDid(active.delegation.delegatorDID ?? '') !== body.issuer || active.delegation.spaceId !== body.artifact.spaceId)
|
|
125
|
+
refuse('Relay signer does not match the inviter.');
|
|
126
|
+
const wasm = new NodeWasmBindings();
|
|
127
|
+
const session = {
|
|
128
|
+
address: delegation.ownerAddress, chainId: delegation.chainId, sessionKey: JSON.stringify(key.jwk), jwk: key.jwk,
|
|
129
|
+
spaceId: delegation.spaceId, delegationCid: delegation.cid, delegationHeader: delegation.delegationHeader,
|
|
130
|
+
verificationMethod: key.did, siwe: '', signature: '',
|
|
131
|
+
};
|
|
132
|
+
return new DelegatedAccess(session, delegation, body.host, wasm.invoke, wasm.invokeAny).kv;
|
|
133
|
+
}
|
|
134
|
+
async function validateIncoming(node, profile, body, art) {
|
|
135
|
+
validateArtifactIdentity(art);
|
|
136
|
+
if (art.from.courier === profile.courierDid)
|
|
137
|
+
refuse('Refusing to join this agent identity.');
|
|
138
|
+
const mailbox = art.step === 'B' ? body.artifact.callMe : body.artifact.peer;
|
|
139
|
+
const callMe = art.step === 'B' ? body.artifact.peer : body.artifact.callMe;
|
|
140
|
+
if (art.peer !== mailbox || art.callMe !== callMe || !art.delegation)
|
|
141
|
+
refuse('Pairing mailbox changed.');
|
|
142
|
+
const delegation = deserializeDelegation(art.delegation);
|
|
143
|
+
if (delegation.spaceId !== art.spaceId || !sameIdentity(delegation.ownerAddress, art.from.owner.split(':').at(-1)))
|
|
144
|
+
refuse('Pairing owner or space changed.');
|
|
145
|
+
const expected = { issuer: art.from.courier, audience: profile.courierDid, spaceId: art.spaceId, mailbox: art.peer, sessionId: body.session.sessionId };
|
|
146
|
+
const active = await activateValidatedRuntimeDelegation(node, delegation, {
|
|
147
|
+
host: profile.host,
|
|
148
|
+
authorize: (permissions) => { assertExactAuthority(permissions, peerReadPermissions(expected.mailbox, expected.spaceId, expected.sessionId), 'Session pairing'); return true; },
|
|
149
|
+
});
|
|
150
|
+
assertPeerDelegation(active, expected);
|
|
151
|
+
return active.delegation;
|
|
152
|
+
}
|
|
153
|
+
function installPeer(profile, body, incoming, inbound, outbound) {
|
|
154
|
+
const handle = incoming.callMe;
|
|
155
|
+
const existing = profile.peers[handle];
|
|
156
|
+
if (existing && (existing.courierDid !== incoming.from.courier || existing.sessionId !== body.session.sessionId))
|
|
157
|
+
refuse('Invitation would replace another pairing.');
|
|
158
|
+
const peer = {
|
|
159
|
+
handle, ownerDid: incoming.from.owner, courierDid: incoming.from.courier, spaceId: incoming.spaceId,
|
|
160
|
+
theirHandleForMe: incoming.peer, status: 'paired', sessionId: body.session.sessionId, pairedAt: new Date().toISOString(),
|
|
161
|
+
inbound: { delegation: serializeDelegation(inbound), cid: inbound.cid, expiresAt: inbound.expiry.toISOString() },
|
|
162
|
+
outbound: [{ cid: outbound.cid, expiresAt: outbound.expiry.toISOString(), issuedAt: new Date().toISOString() }],
|
|
163
|
+
};
|
|
164
|
+
profile.peers[handle] = peer;
|
|
165
|
+
saveProfile(profile);
|
|
166
|
+
return peer;
|
|
167
|
+
}
|
|
168
|
+
async function publishSession(node, profile, body) {
|
|
169
|
+
const meta = { threadId: body.session.sessionId, subject: body.session.subject, createdAt: body.session.createdAt,
|
|
170
|
+
startedBy: { owner: body.artifact.from.owner, courier: body.issuer } };
|
|
171
|
+
const handle = profile.courierDid === body.issuer ? body.artifact.peer : body.artifact.callMe;
|
|
172
|
+
const key = k.threadMeta(handle, body.session.sessionId);
|
|
173
|
+
if (!(await getJson(node.kv, key)))
|
|
174
|
+
await putCreate(node.kv, key, meta);
|
|
175
|
+
const stateKey = sessionKey(body.session.sessionId);
|
|
176
|
+
if (!(await getJson(node.kv, stateKey)))
|
|
177
|
+
await putCreate(node.kv, stateKey, body.session);
|
|
178
|
+
activateSession({ ...body.session, peer: handle });
|
|
179
|
+
}
|
|
180
|
+
function expiryCheck(body) {
|
|
181
|
+
if (Date.parse(body.expiresAt) <= Date.now())
|
|
182
|
+
throw new CourierError('invite-expired', 'Invitation expired; no session was created or substituted.');
|
|
183
|
+
}
|
|
184
|
+
function waitSeconds(args) {
|
|
185
|
+
const value = Number(args.get('wait') ?? '300');
|
|
186
|
+
if (!Number.isInteger(value) || value < 1 || value > 604800)
|
|
187
|
+
throw new CourierError('usage', '--wait must be an integer from 1 to 604800 seconds.');
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
const sleep = () => new Promise((resolve) => setTimeout(resolve, 250));
|
|
191
|
+
/** Serve one durable winner. A restart cannot issue C to a different claimant. */
|
|
192
|
+
export async function serveInvitation(node, profile, body, wait) {
|
|
193
|
+
const deadline = Math.min(Date.parse(body.expiresAt), Date.now() + wait * 1000);
|
|
194
|
+
const invitationHash = requestHash(body);
|
|
195
|
+
for (;;) {
|
|
196
|
+
expiryCheck(body);
|
|
197
|
+
let winner = await getJson(node.kv, winnerKey(body.id));
|
|
198
|
+
if (!winner) {
|
|
199
|
+
const candidate = await getJson(node.kv, `${relayRoot(body.id)}claim.json`);
|
|
200
|
+
if (candidate) {
|
|
201
|
+
const art = parseArtifact(JSON.stringify(candidate.value.payload?.artifact));
|
|
202
|
+
const claim = checked(candidate.value, art.from.courier);
|
|
203
|
+
if (claim.payload.invitationId !== body.id || claim.payload.invitationHash !== invitationHash || claim.payload.sessionId !== body.session.sessionId || art.step !== 'B')
|
|
204
|
+
refuse('Claim targets another invitation or session.');
|
|
205
|
+
if (body.mode === 'named' && art.from.courier !== body.recipient)
|
|
206
|
+
refuse('Claim is not from the named recipient.');
|
|
207
|
+
if (body.mode === 'same-owner' && !sameIdentity(art.from.owner, profile.ownerDid))
|
|
208
|
+
refuse('Claim belongs to a different owner.');
|
|
209
|
+
await validateIncoming(node, profile, body, art);
|
|
210
|
+
try {
|
|
211
|
+
await putCreate(node.kv, winnerKey(body.id), claim);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
winner = await getJson(node.kv, winnerKey(body.id));
|
|
218
|
+
if (!winner)
|
|
219
|
+
refuse('Winner reservation was not persisted.');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (winner) {
|
|
223
|
+
const claim = winner.value;
|
|
224
|
+
const artB = parseArtifact(JSON.stringify(claim.payload.artifact));
|
|
225
|
+
checked(claim, artB.from.courier);
|
|
226
|
+
if (claim.payload.invitationId !== body.id || claim.payload.invitationHash !== invitationHash || claim.payload.sessionId !== body.session.sessionId || artB.step !== 'B')
|
|
227
|
+
refuse('Reserved winner does not match this invitation.');
|
|
228
|
+
if (body.mode === 'named' && artB.from.courier !== body.recipient)
|
|
229
|
+
refuse('Reserved winner is not the named recipient.');
|
|
230
|
+
if (body.mode === 'same-owner' && !sameIdentity(artB.from.owner, profile.ownerDid))
|
|
231
|
+
refuse('Reserved winner belongs to a different owner.');
|
|
232
|
+
const inbound = await validateIncoming(node, profile, body, artB);
|
|
233
|
+
let answer = await getJson(node.kv, answerKey(body.id));
|
|
234
|
+
if (!answer) {
|
|
235
|
+
const outbound = await node.delegateTo(artB.from.courier, peerReadPermissions(body.artifact.peer, profile.spaceId, body.session.sessionId), { expiry: Math.min(7 * 86400000, Date.parse(body.expiresAt) - Date.now()), requireActivation: true });
|
|
236
|
+
const artC = artifactWithDelegation('C', profile, outbound.delegation, body.artifact.peer, body.artifact.callMe);
|
|
237
|
+
const response = signed({ invitationId: body.id, invitationHash, sessionId: body.session.sessionId, claimHash: requestHash(claim), artifact: artC }, loadKey());
|
|
238
|
+
try {
|
|
239
|
+
await putCreate(node.kv, answerKey(body.id), response);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
answer = await getJson(node.kv, answerKey(body.id));
|
|
246
|
+
if (!answer)
|
|
247
|
+
refuse('Pairing answer was not persisted.');
|
|
248
|
+
}
|
|
249
|
+
const response = checked(answer.value, body.issuer).payload;
|
|
250
|
+
if (response.invitationId !== body.id || response.invitationHash !== invitationHash || response.sessionId !== body.session.sessionId || response.claimHash !== requestHash(claim))
|
|
251
|
+
refuse('Stored answer does not match the reserved winner.');
|
|
252
|
+
const artC = parseArtifact(JSON.stringify(answer.value.payload.artifact));
|
|
253
|
+
installPeer(profile, body, artB, inbound, deserializeDelegation(artC.delegation));
|
|
254
|
+
await publishSession(node, profile, body);
|
|
255
|
+
await putOverwrite(node.kv, `${relayRoot(body.id)}answer.json`, answer.value);
|
|
256
|
+
console.log(JSON.stringify({ status: 'paired', invitationId: body.id, sessionId: body.session.sessionId, peer: body.artifact.peer }));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (Date.now() >= deadline)
|
|
260
|
+
throw new CourierError('invite-pending', `No claim received. Resume with courier invite serve ${body.id}; the same invitation and winner reservation are preserved.`);
|
|
261
|
+
await sleep();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export async function cmdInvite(args) {
|
|
265
|
+
const profile = loadProfile();
|
|
266
|
+
const node = await courierNode(profile);
|
|
267
|
+
const wait = waitSeconds(args);
|
|
268
|
+
if (args.positional[0] === 'serve') {
|
|
269
|
+
const id = args.positional[1] ?? '';
|
|
270
|
+
if (!validSessionId(id))
|
|
271
|
+
throw new CourierError('usage', 'courier invite serve <invitationId>');
|
|
272
|
+
const state = await getJson(node.kv, inviteStateKey(id));
|
|
273
|
+
if (!state)
|
|
274
|
+
refuse('No invitation issued by this profile.');
|
|
275
|
+
const body = parseInvitation(state.value.body);
|
|
276
|
+
if (body.issuer !== profile.courierDid || !sameIdentity(body.artifact.from.owner, profile.ownerDid) || body.host !== profile.host)
|
|
277
|
+
refuse('Invitation belongs to another issuer.');
|
|
278
|
+
return serveInvitation(node, profile, body, wait);
|
|
279
|
+
}
|
|
280
|
+
const mode = requireFlag(args, 'mode', 'courier invite --session <id> --mode same-owner|anyone|named --consent');
|
|
281
|
+
if (!INVITATION_MODES.includes(mode))
|
|
282
|
+
throw new CourierError('usage', 'Choose exactly one invitation mode: same-owner, anyone, named.');
|
|
283
|
+
if (args.get('consent') !== 'true')
|
|
284
|
+
throw new CourierError('consent-required', 'Owner consent is required: pass --consent to invite a participant to this session.');
|
|
285
|
+
let recipient;
|
|
286
|
+
if (mode === 'named') {
|
|
287
|
+
const target = requireFlag(args, 'recipient', 'Named invitations require --recipient <did:key|verified-peer-handle>.');
|
|
288
|
+
const peer = profile.peers[target];
|
|
289
|
+
recipient = target.startsWith('did:key:') ? target : peer?.status === 'paired' && peer.inbound ? peer.courierDid : undefined;
|
|
290
|
+
if (!recipient || !linkIssuerPublicKey(recipient))
|
|
291
|
+
throw new CourierError('unsupported-recipient', 'Use an exact Courier did:key or a verified paired handle. Email identifiers are not supported.');
|
|
292
|
+
if (recipient === profile.courierDid)
|
|
293
|
+
refuse('Refusing to invite this agent identity.');
|
|
294
|
+
if (peer)
|
|
295
|
+
await validateHandle(node, profile, peer);
|
|
296
|
+
}
|
|
297
|
+
else if (args.has('recipient'))
|
|
298
|
+
throw new CourierError('usage', '--recipient is only valid in named mode.');
|
|
299
|
+
const selected = await selectedSession(node, profile, requireFlag(args, 'session', 'courier invite --session <id>'), args.get('peer'));
|
|
300
|
+
const session = { sessionId: selected.sessionId, subject: selected.subject, createdAt: selected.createdAt };
|
|
301
|
+
const id = ulid();
|
|
302
|
+
const manager = new NodeWasmBindings().createSessionManager();
|
|
303
|
+
const keyId = manager.createSessionKey('courier-relay');
|
|
304
|
+
const key = { v: 1, did: manager.getDID(keyId), jwk: JSON.parse(manager.jwk(keyId)), createdAt: new Date().toISOString() };
|
|
305
|
+
const expiresAt = new Date(Math.floor(Math.min(Date.now() + 86400000, Date.parse(profile.grantExpiresAt)) / 1000) * 1000).toISOString();
|
|
306
|
+
const body = {
|
|
307
|
+
type: 'courier-invitation', v: 1, id, issuer: profile.courierDid, host: profile.host, session, mode: mode,
|
|
308
|
+
...(recipient ? { recipient } : {}), expiresAt, artifact: artifactA(profile, `chat-${id}-recipient`, `chat-${id}-issuer`), relay: { key, delegation: '' },
|
|
309
|
+
};
|
|
310
|
+
const relay = await node.delegateTo(bareDid(key.did), relayPermissions(body), { expiry: Date.parse(expiresAt) - Date.now(), requireActivation: true });
|
|
311
|
+
body.relay.delegation = serializeDelegation(relay.delegation);
|
|
312
|
+
parseInvitation(body);
|
|
313
|
+
await putCreate(node.kv, inviteStateKey(id), { body });
|
|
314
|
+
const result = await createLink({ type: 'courier', issuerKey: signerFromJwk(loadKey().jwk),
|
|
315
|
+
apiOrigin: process.env.COURIER_LINKS_API_ORIGIN ?? DEFAULT_API, linkOrigin: process.env.COURIER_LINK_ORIGIN ?? DEFAULT_VIEWER,
|
|
316
|
+
expiresAt: new Date(expiresAt), plaintext: new TextEncoder().encode(canonicalJson(body)) });
|
|
317
|
+
await putOverwrite(node.kv, inviteStateKey(id), { body, link: result.link });
|
|
318
|
+
console.log(JSON.stringify({ status: 'invitation', invitationId: id, sessionId: session.sessionId, mode, link: result.link, expiresAt }));
|
|
319
|
+
return serveInvitation(node, profile, body, wait);
|
|
320
|
+
}
|
|
321
|
+
async function validateHandle(node, profile, peer) {
|
|
322
|
+
if (!peer.inbound || !peer.theirHandleForMe)
|
|
323
|
+
refuse('Recipient handle is not verified.');
|
|
324
|
+
const active = await activateValidatedRuntimeDelegation(node, deserializeDelegation(peer.inbound.delegation), { host: profile.host });
|
|
325
|
+
assertPeerDelegation(active, { issuer: peer.courierDid, audience: profile.courierDid, spaceId: peer.spaceId, mailbox: peer.theirHandleForMe, sessionId: peer.sessionId });
|
|
326
|
+
}
|
|
327
|
+
export async function joinInvitation(link, args) {
|
|
328
|
+
if (args.get('consent') !== 'true')
|
|
329
|
+
throw new CourierError('consent-required', 'Joining delegates read access to your side of this session. Pass --consent after owner approval.');
|
|
330
|
+
const wait = waitSeconds(args);
|
|
331
|
+
const opened = await resolveLink(link, { apiOrigin: process.env.COURIER_LINKS_API_ORIGIN ?? DEFAULT_API,
|
|
332
|
+
trustedOrigins: [process.env.COURIER_LINK_ORIGIN ?? DEFAULT_VIEWER], validateBody: (type, value) => { if (type !== 'courier')
|
|
333
|
+
refuse('Not a Courier invitation.'); parseInvitation(value); } });
|
|
334
|
+
const body = parseInvitation(opened.value);
|
|
335
|
+
if (opened.header.audience !== (process.env.COURIER_LINKS_API_ORIGIN ?? DEFAULT_API) || opened.header.expiresAt !== body.expiresAt)
|
|
336
|
+
refuse('Invitation audience or expiry changed.');
|
|
337
|
+
expiryCheck(body);
|
|
338
|
+
const profile = loadProfile();
|
|
339
|
+
const node = await courierNode(profile);
|
|
340
|
+
if (body.host !== profile.host)
|
|
341
|
+
refuse('Invitation uses another node host; no setup or session was changed.');
|
|
342
|
+
if (body.issuer === profile.courierDid)
|
|
343
|
+
refuse('Refusing to join this agent identity.');
|
|
344
|
+
if (body.mode === 'same-owner' && !sameIdentity(body.artifact.from.owner, profile.ownerDid))
|
|
345
|
+
refuse('Invitation requires another agent of the same owner.');
|
|
346
|
+
if (body.mode === 'named' && body.recipient !== profile.courierDid)
|
|
347
|
+
refuse('Invitation is addressed to another agent key.');
|
|
348
|
+
const hash = requestHash(body);
|
|
349
|
+
const localFile = path.join(profileDir(), 'invitation-joins', `${body.id}.json`);
|
|
350
|
+
fs.mkdirSync(path.dirname(localFile), { recursive: true, mode: 0o700 });
|
|
351
|
+
let state;
|
|
352
|
+
try {
|
|
353
|
+
state = JSON.parse(fs.readFileSync(localFile, 'utf8'));
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
if (error.code !== 'ENOENT')
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
if (state && (state.invitationHash !== hash || state.joined))
|
|
360
|
+
throw new CourierError('invite-used', 'Invitation already joined or changed. No other session was activated.');
|
|
361
|
+
const relay = await relayKv(body, node);
|
|
362
|
+
if (!state) {
|
|
363
|
+
const outbound = await node.delegateTo(body.issuer, peerReadPermissions(body.artifact.callMe, profile.spaceId, body.session.sessionId), { expiry: Date.parse(body.expiresAt) - Date.now(), requireActivation: true });
|
|
364
|
+
const artB = artifactWithDelegation('B', profile, outbound.delegation, body.artifact.callMe, body.artifact.peer);
|
|
365
|
+
state = { invitationHash: hash, claim: signed({ invitationId: body.id, invitationHash: hash, sessionId: body.session.sessionId, artifact: artB }, loadKey()) };
|
|
366
|
+
writeSecure(localFile, state);
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
await putCreate(relay, `${relayRoot(body.id)}claim.json`, state.claim);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
if (!(error instanceof CourierError && error.code === 'conflict'))
|
|
373
|
+
throw error;
|
|
374
|
+
const existing = await getJson(relay, `${relayRoot(body.id)}claim.json`);
|
|
375
|
+
if (!existing || requestHash(existing.value) !== requestHash(state.claim))
|
|
376
|
+
throw new CourierError('invite-used', 'Another recipient has already claimed this invitation.');
|
|
377
|
+
}
|
|
378
|
+
const deadline = Math.min(Date.parse(body.expiresAt), Date.now() + wait * 1000);
|
|
379
|
+
for (;;) {
|
|
380
|
+
expiryCheck(body);
|
|
381
|
+
const got = await getJson(relay, `${relayRoot(body.id)}answer.json`);
|
|
382
|
+
if (got) {
|
|
383
|
+
const answer = checked(got.value, body.issuer).payload;
|
|
384
|
+
if (answer.invitationId !== body.id || answer.invitationHash !== hash || answer.sessionId !== body.session.sessionId || answer.claimHash !== requestHash(state.claim))
|
|
385
|
+
refuse('Pairing answer belongs to another claim or session.');
|
|
386
|
+
const artC = parseArtifact(JSON.stringify(answer.artifact));
|
|
387
|
+
if (artC.step !== 'C' || artC.from.courier !== body.issuer || artC.from.owner !== body.artifact.from.owner || artC.spaceId !== body.artifact.spaceId)
|
|
388
|
+
refuse('Pairing issuer changed.');
|
|
389
|
+
const inbound = await validateIncoming(node, profile, body, artC);
|
|
390
|
+
const outbound = deserializeDelegation(state.claim.payload.artifact.delegation);
|
|
391
|
+
installPeer(profile, body, artC, inbound, outbound);
|
|
392
|
+
await publishSession(node, profile, body);
|
|
393
|
+
writeSecure(localFile, { ...state, joined: true });
|
|
394
|
+
console.log(JSON.stringify({ status: 'active', invitationId: body.id, session: { ...body.session, peer: body.artifact.callMe } }));
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (Date.now() >= deadline)
|
|
398
|
+
throw new CourierError('invite-pending', 'Issuer has not completed pairing yet. Ask them to resume invite serve, then join the same link; no different session was created.');
|
|
399
|
+
await sleep();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export async function cmdJoin(args) {
|
|
403
|
+
const link = args.positional[0] ?? requireFlag(args, 'link', 'courier join <link> --consent');
|
|
404
|
+
return joinInvitation(link, args);
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=invitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitation.js","sourceRoot":"","sources":["../src/invitation.ts"],"names":[],"mappings":"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"}
|
package/dist/keys.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare const k: {
|
|
|
17
17
|
task: (peer: string, threadId: string, taskId: string) => string;
|
|
18
18
|
file: (peer: string, threadId: string, name: string) => string;
|
|
19
19
|
receipts: (peer: string) => string;
|
|
20
|
-
peerDelegation: (peer: string) => string;
|
|
20
|
+
peerDelegation: (peer: string, sessionId?: string) => string;
|
|
21
21
|
peerRecord: (peer: string) => string;
|
|
22
22
|
orders: (peer: string) => string;
|
|
23
23
|
request: (id: string) => string;
|
|
@@ -41,4 +41,4 @@ export declare const k: {
|
|
|
41
41
|
mePrefix: string;
|
|
42
42
|
};
|
|
43
43
|
/** Peer-read capability entries for `delegateTo`, spec §3/§5 and TC-708. */
|
|
44
|
-
export declare function peerReadPermissions(peer: string, space: string): PermissionEntry[];
|
|
44
|
+
export declare function peerReadPermissions(peer: string, space: string, sessionId?: string): PermissionEntry[];
|
package/dist/keys.js
CHANGED
|
@@ -37,7 +37,7 @@ export const k = {
|
|
|
37
37
|
task: (peer, threadId, taskId) => `${k.threadRoot(peer, threadId)}/task/${taskId}.json`,
|
|
38
38
|
file: (peer, threadId, name) => `${k.threadRoot(peer, threadId)}/files/${name}`,
|
|
39
39
|
receipts: (peer) => `${k.toPeer(peer)}receipts.json`,
|
|
40
|
-
peerDelegation: (peer) => `${k.toPeer(peer)}pairing/delegation.json`,
|
|
40
|
+
peerDelegation: (peer, sessionId) => `${sessionId ? `${k.threadRoot(peer, sessionId)}/` : k.toPeer(peer)}pairing/delegation.json`,
|
|
41
41
|
peerRecord: (peer) => `${PREFIX}/me/peers/${peer}.json`,
|
|
42
42
|
orders: (peer) => `${PREFIX}/me/orders/${peer}.md`,
|
|
43
43
|
request: (id) => `${PREFIX}/me/requests/${id}.json`,
|
|
@@ -61,10 +61,11 @@ export const k = {
|
|
|
61
61
|
mePrefix: `${PREFIX}/me/`,
|
|
62
62
|
};
|
|
63
63
|
/** Peer-read capability entries for `delegateTo`, spec §3/§5 and TC-708. */
|
|
64
|
-
export function peerReadPermissions(peer, space) {
|
|
64
|
+
export function peerReadPermissions(peer, space, sessionId) {
|
|
65
|
+
const root = sessionId ? `${k.threadRoot(peer, sessionId)}/` : k.toPeer(peer);
|
|
65
66
|
return [
|
|
66
|
-
{ space, service: 'tinycloud.kv', path:
|
|
67
|
-
{ space, service: 'tinycloud.hooks', path: `kv/${
|
|
67
|
+
{ space, service: 'tinycloud.kv', path: root, actions: ['tinycloud.kv/get', 'tinycloud.kv/list'] },
|
|
68
|
+
{ space, service: 'tinycloud.hooks', path: `kv/${root.replace(/\/$/, '')}`, actions: ['tinycloud.hooks/subscribe'] },
|
|
68
69
|
];
|
|
69
70
|
}
|
|
70
71
|
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -11,6 +11,8 @@ import { cmdGuard } from './guard/command.js';
|
|
|
11
11
|
import { cmdBroker, cmdRunApproved } from './broker.js';
|
|
12
12
|
import { cmdCredential } from './credential.js';
|
|
13
13
|
import { courierVersion } from './version.js';
|
|
14
|
+
import { cmdStart } from './guided.js';
|
|
15
|
+
import { cmdInvite, cmdJoin } from './invitation.js';
|
|
14
16
|
function usage() {
|
|
15
17
|
const name = programName();
|
|
16
18
|
return `${name} — agent-to-agent threads over TinyCloud (v0)
|
|
@@ -18,6 +20,14 @@ function usage() {
|
|
|
18
20
|
Usage: ${name} <command> [args]
|
|
19
21
|
|
|
20
22
|
Setup & pairing (humans run these):
|
|
23
|
+
start [--new <subject> | --session <id> [--peer p] | --link <invitation> --consent]
|
|
24
|
+
Discover accessible chats; choose new/existing only when chats exist.
|
|
25
|
+
invite --session <id> --mode same-owner|anyone|named [--recipient <did:key|peer>] --consent
|
|
26
|
+
Print one handoff link and serve its signed pairing (default --wait 300).
|
|
27
|
+
invite serve <invitationId> [--wait 300]
|
|
28
|
+
Resume the same invitation and durable winning claim.
|
|
29
|
+
join <invitation-link> --consent [--wait 300]
|
|
30
|
+
Join and activate the link's intended session; never create a substitute.
|
|
21
31
|
init [--request | --grant-file f|- | --paste | --resume] [--host url] [--openkey-host url]
|
|
22
32
|
[--openkey-api-host url] [--label s] [--handle h] [--expiry 30d] [--rotate-key]
|
|
23
33
|
Create/renew the agent key's restricted grant in OpenKey.
|
|
@@ -144,6 +154,9 @@ export async function run(argv) {
|
|
|
144
154
|
const sub = { ...args, positional: args.positional.slice(1) };
|
|
145
155
|
switch (command) {
|
|
146
156
|
case 'init': return cmdInit(sub);
|
|
157
|
+
case 'start': return cmdStart(sub);
|
|
158
|
+
case 'invite': return cmdInvite(sub);
|
|
159
|
+
case 'join': return cmdJoin(sub);
|
|
147
160
|
case 'manifest': return cmdManifest();
|
|
148
161
|
case 'pair': return cmdPair(sub);
|
|
149
162
|
case 'revoke': return cmdRevoke(sub);
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,GAClH,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/node.js
CHANGED
|
@@ -55,6 +55,11 @@ export async function courierNode(profile, home) {
|
|
|
55
55
|
throw new CourierError('bad-grant', `Grant holder ${node.credentialHolderDid} does not match courier key ${profile.courierDid}.`);
|
|
56
56
|
}
|
|
57
57
|
assertAgentGrant(node.getVerifiedSessionCapabilities(), siweTimes(grant.siwe));
|
|
58
|
+
const restored = node.restorableSession;
|
|
59
|
+
const owner = restored ? `did:pkh:eip155:${restored.chainId}:${restored.address}` : '';
|
|
60
|
+
if (profile.ownerDid?.toLowerCase() !== owner.toLowerCase() || profile.spaceId?.toLowerCase() !== restored?.spaceId.toLowerCase()) {
|
|
61
|
+
throw new CourierError('bad-grant', 'Profile owner or space does not match the verified Courier grant.');
|
|
62
|
+
}
|
|
58
63
|
return node;
|
|
59
64
|
}
|
|
60
65
|
export async function peerKv(node, profile, peer) {
|
|
@@ -77,6 +82,7 @@ export async function peerKv(node, profile, peer) {
|
|
|
77
82
|
audience: profile.courierDid,
|
|
78
83
|
spaceId: peer.spaceId,
|
|
79
84
|
mailbox: peer.theirHandleForMe,
|
|
85
|
+
sessionId: peer.sessionId,
|
|
80
86
|
});
|
|
81
87
|
if (activated.cid !== peer.inbound.cid) {
|
|
82
88
|
throw new CourierError('bad-delegation', `Peer delegation CID does not match the stored CID for ${peer.handle}.`);
|