@tinycloud/courier 0.6.0-beta.17 → 0.6.0-beta.19

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/dist/status.js ADDED
@@ -0,0 +1,86 @@
1
+ import { requireFlag } from './args.js';
2
+ import { CourierError } from './errors.js';
3
+ import { getPeer, loadProfile } from './profile.js';
4
+ import { cmd } from './program.js';
5
+ import { oneLine } from './a2a.js';
6
+ export const EXPIRY_WARNING_MS = 24 * 60 * 60 * 1000;
7
+ /** Local expiry metadata only: this does not verify authority or remote access. */
8
+ export function grantExpiry(expiresAt, now = Date.now()) {
9
+ if (expiresAt === undefined)
10
+ return { state: 'missing', expiresAt: null };
11
+ const end = Date.parse(expiresAt);
12
+ if (!Number.isFinite(end))
13
+ return { state: 'unknown', expiresAt: null };
14
+ return {
15
+ state: end <= now ? 'expired' : end - now <= EXPIRY_WARNING_MS ? 'expiring' : 'current',
16
+ expiresAt: new Date(end).toISOString(),
17
+ };
18
+ }
19
+ export function peerExpiryStatus(peer, now = Date.now()) {
20
+ const inbound = grantExpiry(peer.inbound?.expiresAt, now);
21
+ const outbound = grantExpiry(peer.outbound.at(-1)?.expiresAt, now);
22
+ const live = (g) => g.state === 'current' || g.state === 'expiring';
23
+ const renewalCommand = peer.status === 'paired' && live(inbound) && live(outbound)
24
+ ? cmd(`pair renew ${peer.handle}`) : null;
25
+ const warnings = [];
26
+ for (const [side, grant] of [['inbound', inbound], ['outbound', outbound]]) {
27
+ if (grant.state === 'expiring')
28
+ warnings.push(`The saved ${side} grant for ${oneLine(peer.handle)} expires within 24 hours (${grant.expiresAt}).`);
29
+ if (grant.state === 'expired')
30
+ warnings.push(side === 'inbound'
31
+ ? `Your saved access to ${oneLine(peer.handle)} has expired; the peer must approve a new grant.`
32
+ : `${oneLine(peer.handle)}'s saved access to you has expired; you must approve a new grant.`);
33
+ if (grant.state === 'missing')
34
+ warnings.push(`No saved ${side} grant for ${oneLine(peer.handle)}.`);
35
+ if (grant.state === 'unknown')
36
+ warnings.push(`The saved ${side} grant for ${oneLine(peer.handle)} has no expiry on record.`);
37
+ }
38
+ return {
39
+ peer: peer.handle, pairing: peer.status, inbound, outbound,
40
+ remoteReadability: 'not-checked',
41
+ renewal: { state: 'unknown', command: renewalCommand },
42
+ warnings,
43
+ };
44
+ }
45
+ const statusUsage = () => `Usage: ${cmd('status [--peer <peer>] [--json]')}`;
46
+ /** Works even after grants lapse: never initializes a node, renews, or sends. */
47
+ export function cmdStatus(args) {
48
+ if (args.positional.length || args.all('peer').length > 1)
49
+ throw new CourierError('usage', statusUsage());
50
+ const requested = args.has('peer') ? requireFlag(args, 'peer', statusUsage()) : undefined;
51
+ if (requested !== undefined && !requested.trim())
52
+ throw new CourierError('usage', statusUsage());
53
+ const profile = loadProfile();
54
+ const peers = requested === undefined ? Object.values(profile.peers) : [getPeer(profile, requested)];
55
+ const now = Date.now();
56
+ const output = { source: 'saved-profile', checkedAt: new Date(now).toISOString(), peers: peers.map(peer => peerExpiryStatus(peer, now)) };
57
+ if (args.has('json')) {
58
+ console.log(JSON.stringify(output, null, 2));
59
+ return;
60
+ }
61
+ console.log("Showing saved expiry times.");
62
+ console.log("Inbound: your access to the peer. Outbound: the peer's access to you (latest saved grant).");
63
+ if (!output.peers.length)
64
+ console.log('No saved peers.');
65
+ for (const peer of output.peers) {
66
+ console.log(`${oneLine(peer.peer)} (${peer.pairing})`);
67
+ for (const side of ['inbound', 'outbound']) {
68
+ const grant = peer[side];
69
+ console.log(` ${side}: ${grant.state}${grant.expiresAt ? ` — ${utcTime(grant.expiresAt)}` : ''}`);
70
+ }
71
+ for (const warning of peer.warnings) {
72
+ let text = warning;
73
+ for (const grant of [peer.inbound, peer.outbound]) {
74
+ if (grant.expiresAt)
75
+ text = text.replaceAll(grant.expiresAt, utcTime(grant.expiresAt));
76
+ }
77
+ console.log(` Warning: ${text}`);
78
+ }
79
+ if (peer.renewal.command)
80
+ console.log(` To renew before it expires, run: ${peer.renewal.command}`);
81
+ }
82
+ }
83
+ function utcTime(iso) {
84
+ return `${iso.slice(0, 10)} ${iso.slice(11, 16)} UTC`;
85
+ }
86
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinycloud/courier",
3
- "version": "0.6.0-beta.17",
3
+ "version": "0.6.0-beta.19",
4
4
  "description": "Courier: agent-to-agent threads over TinyCloud (CLI, library and agent skill)",
5
5
  "author": "TinyCloud, Inc.",
6
6
  "type": "module",
@@ -30,10 +30,10 @@
30
30
  "test:live": "tsc -p tsconfig.json && node scripts/happy-path.mjs"
31
31
  },
32
32
  "dependencies": {
33
- "@tinycloud/node-sdk": "3.12.0-beta.16",
34
- "@tinycloud/sdk-core": "3.12.0-beta.16",
35
- "@tinycloud/share-envelope": "1.5.0",
36
- "@tinycloud/share-sdk": "1.5.0-beta.0",
33
+ "@tinycloud/node-sdk": "3.12.0-beta.17",
34
+ "@tinycloud/sdk-core": "3.12.0-beta.17",
35
+ "@tinycloud/share-envelope": "1.6.0-beta.0",
36
+ "@tinycloud/share-sdk": "1.5.0-beta.1",
37
37
  "ulid": "^3.0.2"
38
38
  },
39
39
  "devDependencies": {