agent-relay 12.0.0 → 12.1.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.
- package/README.md +64 -0
- package/dist/cli/agent-relay-mcp.d.ts.map +1 -1
- package/dist/cli/agent-relay-mcp.js +177 -28
- package/dist/cli/agent-relay-mcp.js.map +1 -1
- package/dist/cli/commands/core.d.ts +8 -0
- package/dist/cli/commands/core.d.ts.map +1 -1
- package/dist/cli/commands/core.js +4 -0
- package/dist/cli/commands/core.js.map +1 -1
- package/dist/cli/commands/fleet-agent.d.ts +5 -1
- package/dist/cli/commands/fleet-agent.d.ts.map +1 -1
- package/dist/cli/commands/fleet-agent.js +114 -26
- package/dist/cli/commands/fleet-agent.js.map +1 -1
- package/dist/cli/commands/fleet.d.ts.map +1 -1
- package/dist/cli/commands/fleet.js +93 -13
- package/dist/cli/commands/fleet.js.map +1 -1
- package/dist/cli/commands/node.js +4 -0
- package/dist/cli/commands/node.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +7 -3
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/lib/broker-lifecycle.d.ts +2 -0
- package/dist/cli/lib/broker-lifecycle.d.ts.map +1 -1
- package/dist/cli/lib/broker-lifecycle.js +222 -153
- package/dist/cli/lib/broker-lifecycle.js.map +1 -1
- package/dist/cli/lib/broker-process-identity.d.ts +30 -0
- package/dist/cli/lib/broker-process-identity.d.ts.map +1 -0
- package/dist/cli/lib/broker-process-identity.js +229 -0
- package/dist/cli/lib/broker-process-identity.js.map +1 -0
- package/dist/cli/lib/sdk-command.d.ts.map +1 -1
- package/dist/cli/lib/sdk-command.js +20 -2
- package/dist/cli/lib/sdk-command.js.map +1 -1
- package/dist/cli/lib/spawn-lifecycle.d.ts +12 -0
- package/dist/cli/lib/spawn-lifecycle.d.ts.map +1 -0
- package/dist/cli/lib/spawn-lifecycle.js +89 -0
- package/dist/cli/lib/spawn-lifecycle.js.map +1 -0
- package/dist/index.cjs +328 -202
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-command.js","sourceRoot":"","sources":["../../../src/cli/lib/sdk-command.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"sdk-command.js","sourceRoot":"","sources":["../../../src/cli/lib/sdk-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SpawnLifecycleState = 'accepted' | 'ready' | 'unconfirmed_may_be_running' | 'failed';
|
|
2
|
+
export type SpawnDispatchState = 'dispatched' | 'not_dispatched' | 'unknown';
|
|
3
|
+
export declare function spawnLifecycleState(value: Record<string, unknown>): SpawnLifecycleState;
|
|
4
|
+
/**
|
|
5
|
+
* Project an upstream spawn invocation record down to an allowlisted set of
|
|
6
|
+
* lifecycle-evidence fields, dropping raw error text, task payloads, and any
|
|
7
|
+
* other upstream data that should not cross a CLI/MCP serialization
|
|
8
|
+
* boundary unsanitized.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizedSpawnReceipt(value: Record<string, unknown>): Record<string, unknown>;
|
|
11
|
+
export declare function spawnPlacementReceipt(value: Record<string, unknown>): Record<string, unknown>;
|
|
12
|
+
//# sourceMappingURL=spawn-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/spawn-lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,GAAG,4BAA4B,GAAG,QAAQ,CAAC;AACjG,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAAC;AA0B7E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAgBvF;AAiBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB7F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAW7F"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const SUCCESS = new Set(['completed', 'succeeded', 'success']);
|
|
2
|
+
const FAILURE = new Set(['failed', 'error', 'cancelled', 'canceled', 'denied']);
|
|
3
|
+
const DISPATCHED = new Set(['dispatched', 'invoked', 'running']);
|
|
4
|
+
const NOT_DISPATCHED = new Set(['pending', 'queued']);
|
|
5
|
+
function text(value) {
|
|
6
|
+
return typeof value === 'string' && value.trim() ? value : undefined;
|
|
7
|
+
}
|
|
8
|
+
function dispatchEvidence(value) {
|
|
9
|
+
const status = text(value.status)?.toLowerCase();
|
|
10
|
+
if (text(value.dispatchedNodeId) ||
|
|
11
|
+
text(value.dispatched_node_id) ||
|
|
12
|
+
text(value.handlerNodeId) ||
|
|
13
|
+
text(value.handler_node_id) ||
|
|
14
|
+
(status !== undefined && (DISPATCHED.has(status) || SUCCESS.has(status)))) {
|
|
15
|
+
return 'dispatched';
|
|
16
|
+
}
|
|
17
|
+
if (status !== undefined && NOT_DISPATCHED.has(status))
|
|
18
|
+
return 'not_dispatched';
|
|
19
|
+
return 'unknown';
|
|
20
|
+
}
|
|
21
|
+
export function spawnLifecycleState(value) {
|
|
22
|
+
const status = text(value.status)?.toLowerCase();
|
|
23
|
+
if (status && SUCCESS.has(status)) {
|
|
24
|
+
const output = value.output !== null && typeof value.output === 'object'
|
|
25
|
+
? value.output
|
|
26
|
+
: value;
|
|
27
|
+
// A terminal success status without explicit launch and readiness proof is
|
|
28
|
+
// a failed spawn, not a live-but-uncertain one. Genuine uncertainty is
|
|
29
|
+
// reserved for non-terminal acknowledgements and confirmation timeouts.
|
|
30
|
+
return output.spawned === true && output.ready === true ? 'ready' : 'failed';
|
|
31
|
+
}
|
|
32
|
+
if (status && FAILURE.has(status))
|
|
33
|
+
return 'failed';
|
|
34
|
+
if (status === 'accepted')
|
|
35
|
+
return 'accepted';
|
|
36
|
+
if (status && NOT_DISPATCHED.has(status) && dispatchEvidence(value) === 'not_dispatched')
|
|
37
|
+
return 'accepted';
|
|
38
|
+
return 'unconfirmed_may_be_running';
|
|
39
|
+
}
|
|
40
|
+
// Allowlisted keys for a spawn receipt that crosses a CLI/MCP serialization
|
|
41
|
+
// boundary. Upstream invocation records can carry arbitrary broker/handler
|
|
42
|
+
// output (raw error text, task payloads, environment-derived metadata) that
|
|
43
|
+
// is not safe to echo back verbatim — see relay#1563. Only lifecycle
|
|
44
|
+
// evidence (status/ids/readiness) is allowlisted through.
|
|
45
|
+
const SPAWN_RECEIPT_ALLOWED_KEYS = [
|
|
46
|
+
'status',
|
|
47
|
+
'invocation_id',
|
|
48
|
+
'invocationId',
|
|
49
|
+
'dispatched_node_id',
|
|
50
|
+
'dispatchedNodeId',
|
|
51
|
+
'handler_node_id',
|
|
52
|
+
'handlerNodeId',
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* Project an upstream spawn invocation record down to an allowlisted set of
|
|
56
|
+
* lifecycle-evidence fields, dropping raw error text, task payloads, and any
|
|
57
|
+
* other upstream data that should not cross a CLI/MCP serialization
|
|
58
|
+
* boundary unsanitized.
|
|
59
|
+
*/
|
|
60
|
+
export function sanitizedSpawnReceipt(value) {
|
|
61
|
+
const out = {};
|
|
62
|
+
for (const key of SPAWN_RECEIPT_ALLOWED_KEYS) {
|
|
63
|
+
if (value[key] !== undefined)
|
|
64
|
+
out[key] = value[key];
|
|
65
|
+
}
|
|
66
|
+
const output = value.output !== null && typeof value.output === 'object'
|
|
67
|
+
? value.output
|
|
68
|
+
: undefined;
|
|
69
|
+
if (output && (typeof output.spawned === 'boolean' || typeof output.ready === 'boolean')) {
|
|
70
|
+
out.output = {
|
|
71
|
+
...(typeof output.spawned === 'boolean' ? { spawned: output.spawned } : {}),
|
|
72
|
+
...(typeof output.ready === 'boolean' ? { ready: output.ready } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
export function spawnPlacementReceipt(value) {
|
|
78
|
+
const invocationId = text(value.invocationId) ?? text(value.invocation_id);
|
|
79
|
+
const dispatchedNodeId = text(value.dispatchedNodeId) ?? text(value.dispatched_node_id);
|
|
80
|
+
const handlerNodeId = text(value.handlerNodeId) ?? text(value.handler_node_id);
|
|
81
|
+
return {
|
|
82
|
+
state: spawnLifecycleState(value),
|
|
83
|
+
dispatchState: dispatchEvidence(value),
|
|
84
|
+
...(invocationId ? { invocationId } : {}),
|
|
85
|
+
...(dispatchedNodeId ? { dispatchedNodeId } : {}),
|
|
86
|
+
...(handlerNodeId ? { handlerNodeId } : {}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=spawn-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-lifecycle.js","sourceRoot":"","sources":["../../../src/cli/lib/spawn-lifecycle.ts"],"names":[],"mappings":"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"}
|