@tinycloud/courier 0.0.0-stage → 0.1.0-beta.1

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 (55) hide show
  1. package/README.md +135 -2
  2. package/dist/a2a.d.ts +134 -0
  3. package/dist/a2a.js +213 -0
  4. package/dist/a2a.js.map +1 -0
  5. package/dist/args.d.ts +11 -0
  6. package/dist/args.js +53 -0
  7. package/dist/args.js.map +1 -0
  8. package/dist/authority.d.ts +33 -0
  9. package/dist/authority.js +99 -0
  10. package/dist/authority.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +6 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands.d.ts +20 -0
  15. package/dist/commands.js +638 -0
  16. package/dist/commands.js.map +1 -0
  17. package/dist/errors.d.ts +25 -0
  18. package/dist/errors.js +35 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/grant.d.ts +55 -0
  21. package/dist/grant.js +356 -0
  22. package/dist/grant.js.map +1 -0
  23. package/dist/inbox.d.ts +53 -0
  24. package/dist/inbox.js +120 -0
  25. package/dist/inbox.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.js +12 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/keys.d.ts +33 -0
  30. package/dist/keys.js +57 -0
  31. package/dist/keys.js.map +1 -0
  32. package/dist/main.d.ts +9 -0
  33. package/dist/main.js +90 -0
  34. package/dist/main.js.map +1 -0
  35. package/dist/node.d.ts +12 -0
  36. package/dist/node.js +85 -0
  37. package/dist/node.js.map +1 -0
  38. package/dist/orders.d.ts +2 -0
  39. package/dist/orders.js +26 -0
  40. package/dist/orders.js.map +1 -0
  41. package/dist/pairing.d.ts +60 -0
  42. package/dist/pairing.js +88 -0
  43. package/dist/pairing.js.map +1 -0
  44. package/dist/profile.d.ts +67 -0
  45. package/dist/profile.js +104 -0
  46. package/dist/profile.js.map +1 -0
  47. package/dist/program.d.ts +4 -0
  48. package/dist/program.js +13 -0
  49. package/dist/program.js.map +1 -0
  50. package/dist/store.d.ts +14 -0
  51. package/dist/store.js +97 -0
  52. package/dist/store.js.map +1 -0
  53. package/package.json +47 -4
  54. package/skills/courier/SKILL.md +164 -0
  55. package/skills/courier/release.json +16 -0
@@ -0,0 +1,99 @@
1
+ import { extractSiweExpiration } from '@tinycloud/node-sdk';
2
+ import { CourierError } from './errors.js';
3
+ import { AGENT_GRANT, AGENT_GRANT_EXPIRY, peerReadPermissions } from './keys.js';
4
+ import { PEER_DELEGATION_EXPIRY } from './pairing.js';
5
+ const DAY_MS = 24 * 3600 * 1000;
6
+ /** `30d`/`7d`/`1h` → ms; undefined when not `<int><s|m|h|d>`. */
7
+ export function durationMs(value) {
8
+ const match = /^(\d+)([smhd])$/.exec(value);
9
+ if (!match)
10
+ return undefined;
11
+ const factor = { s: 1000, m: 60_000, h: 3_600_000, d: DAY_MS }[match[2]];
12
+ const duration = Number(match[1]) * factor;
13
+ return Number.isFinite(duration) ? duration : undefined;
14
+ }
15
+ export const AGENT_GRANT_MAX_MS = durationMs(AGENT_GRANT_EXPIRY);
16
+ export const PEER_DELEGATION_MAX_MS = durationMs(PEER_DELEGATION_EXPIRY);
17
+ export const CLOCK_SKEW_MS = 5 * 60 * 1000;
18
+ export function bareDid(did) {
19
+ return did.split('#', 1)[0];
20
+ }
21
+ function authorityTuples(entries) {
22
+ const tuples = new Map();
23
+ for (const entry of entries) {
24
+ for (const action of entry.actions) {
25
+ const tuple = { service: entry.service, space: (entry.space ?? '').toLowerCase(), path: entry.path, action };
26
+ tuples.set(JSON.stringify([tuple.service, tuple.space, tuple.path, tuple.action]), tuple);
27
+ }
28
+ }
29
+ return tuples;
30
+ }
31
+ function renderTuples(tuples) {
32
+ const shown = tuples.slice(0, 3).map(({ service, space, path, action }) => `${service} ${space} ${path || '""'} ${action}`);
33
+ if (tuples.length > 3)
34
+ shown.push(`(+${tuples.length - 3} more)`);
35
+ return shown.join('; ');
36
+ }
37
+ /** Require the complete effective authority to equal an explicit allowlist. */
38
+ export function assertExactAuthority(signed, allowed, label) {
39
+ const signedTuples = authorityTuples(signed);
40
+ const allowedTuples = authorityTuples(allowed);
41
+ const extra = [...signedTuples].filter(([tuple]) => !allowedTuples.has(tuple)).map(([, value]) => value);
42
+ if (extra.length) {
43
+ throw new CourierError('grant-too-broad', `${label} carries authority Courier does not allow: ${renderTuples(extra)}`);
44
+ }
45
+ const missing = [...allowedTuples].filter(([tuple]) => !signedTuples.has(tuple)).map(([, value]) => value);
46
+ if (missing.length) {
47
+ throw new CourierError('grant-incomplete', `${label} is missing ${renderTuples(missing)}`);
48
+ }
49
+ }
50
+ function formatDays(ms) {
51
+ const days = (ms / DAY_MS).toFixed(2).replace(/\.?0+$/, '');
52
+ return `${days} days`;
53
+ }
54
+ export function assertLifetime(label, expiresAt, maxMs, now, issuedAt) {
55
+ if (!expiresAt || !Number.isFinite(expiresAt.getTime())) {
56
+ throw new CourierError('bad-grant', `${label} has no signed expiry.`);
57
+ }
58
+ const expiry = expiresAt.getTime();
59
+ if (expiry <= now)
60
+ throw new CourierError('grant-expired', `${label} has expired.`);
61
+ if (issuedAt !== undefined) {
62
+ const issued = issuedAt.getTime();
63
+ if (!Number.isFinite(issued) || issued > now + CLOCK_SKEW_MS) {
64
+ throw new CourierError('bad-grant', `${label} was issued in the future or has an invalid Issued At.`);
65
+ }
66
+ if (expiry - issued > maxMs + CLOCK_SKEW_MS) {
67
+ throw new CourierError('grant-too-long', `${label} is valid for ${formatDays(expiry - issued)}; Courier accepts at most ${formatDays(maxMs).replace(/ days$/, '')}.`);
68
+ }
69
+ }
70
+ if (expiry - now > maxMs + CLOCK_SKEW_MS) {
71
+ throw new CourierError('grant-too-long', `${label} is valid for ${formatDays(expiry - now)}; Courier accepts at most ${formatDays(maxMs).replace(/ days$/, '')}.`);
72
+ }
73
+ }
74
+ export function siweTimes(siwe) {
75
+ const issued = /^Issued At:\s*(.+)$/m.exec(siwe)?.[1];
76
+ const expiresAt = extractSiweExpiration(siwe);
77
+ return {
78
+ ...(issued !== undefined ? { issuedAt: new Date(issued.trim()) } : {}),
79
+ ...(expiresAt ? { expiresAt } : {}),
80
+ };
81
+ }
82
+ export function assertAgentGrant(caps, times, now = Date.now()) {
83
+ assertExactAuthority(caps, AGENT_GRANT, 'OpenKey grant');
84
+ if (!times.issuedAt)
85
+ throw new CourierError('bad-grant', 'OpenKey grant SIWE is missing Issued At.');
86
+ assertLifetime('OpenKey grant', times.expiresAt, AGENT_GRANT_MAX_MS, now, times.issuedAt);
87
+ }
88
+ export function assertPeerDelegation(active, expected, now = Date.now()) {
89
+ const issuer = bareDid(active.delegation.delegatorDID ?? '');
90
+ if (issuer !== expected.issuer) {
91
+ throw new CourierError('bad-delegation', `Peer delegation is signed by ${issuer || 'an unknown issuer'}, not the advertised courier ${expected.issuer}.`);
92
+ }
93
+ if (bareDid(active.audience) !== expected.audience) {
94
+ throw new CourierError('bad-delegation', `Peer delegation audience ${active.audience} does not match ${expected.audience}.`);
95
+ }
96
+ assertExactAuthority(active.effectivePermissions, peerReadPermissions(expected.mailbox, expected.spaceId), 'Peer delegation');
97
+ assertLifetime('Peer delegation', active.expiry, PEER_DELEGATION_MAX_MS, now);
98
+ }
99
+ //# sourceMappingURL=authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { main } from './main.js';
3
+ const code = await main(process.argv.slice(2));
4
+ if (code !== 0)
5
+ process.exit(code);
6
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAI,IAAI,KAAK,CAAC;IAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ParsedArgs } from './args.js';
2
+ export declare function cmdInit(args: ParsedArgs): Promise<void>;
3
+ export declare function cmdManifest(): void;
4
+ export declare function cmdPair(args: ParsedArgs): Promise<void>;
5
+ export declare function cmdRevoke(args: ParsedArgs): Promise<void>;
6
+ export declare function cmdSend(args: ParsedArgs): Promise<void>;
7
+ export declare function cmdInbox(args: ParsedArgs): Promise<void>;
8
+ export interface ThreadEntry {
9
+ kind: 'meta' | 'msg' | 'task';
10
+ id: string;
11
+ side: 'me' | 'peer';
12
+ authority: 'self' | 'counterparty';
13
+ body: unknown;
14
+ invalid?: string[];
15
+ }
16
+ export declare function cmdRead(args: ParsedArgs): Promise<void>;
17
+ export declare function renderThreadText(threadId: string, entries: readonly ThreadEntry[]): string;
18
+ export declare function cmdTask(args: ParsedArgs): Promise<void>;
19
+ export declare function cmdRequest(args: ParsedArgs): Promise<void>;
20
+ export declare function cmdOrders(args: ParsedArgs): Promise<void>;