@humain/humain-code-contracts 0.3.3 → 0.4.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/CHANGELOG.md +10 -4
- package/dist/flow-admission.d.ts +209 -0
- package/dist/flow-admission.d.ts.map +1 -0
- package/dist/flow-admission.js +59 -0
- package/dist/flow-admission.js.map +1 -0
- package/dist/flow-common.d.ts +103 -0
- package/dist/flow-common.d.ts.map +1 -0
- package/dist/flow-common.js +282 -0
- package/dist/flow-common.js.map +1 -0
- package/dist/flow-control.d.ts +107 -0
- package/dist/flow-control.d.ts.map +1 -0
- package/dist/flow-control.js +144 -0
- package/dist/flow-control.js.map +1 -0
- package/dist/flow-events.d.ts +345 -0
- package/dist/flow-events.d.ts.map +1 -0
- package/dist/flow-events.js +147 -0
- package/dist/flow-events.js.map +1 -0
- package/dist/flow-profile.d.ts +200 -0
- package/dist/flow-profile.d.ts.map +1 -0
- package/dist/flow-profile.js +89 -0
- package/dist/flow-profile.js.map +1 -0
- package/dist/flow-sizing.d.ts +30 -0
- package/dist/flow-sizing.d.ts.map +1 -0
- package/dist/flow-sizing.js +568 -0
- package/dist/flow-sizing.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rpc.d.ts +27 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +283 -18
- package/dist/rpc.js.map +1 -1
- package/dist/trace-artifact.d.ts +1 -1
- package/dist/trace-artifact.d.ts.map +1 -1
- package/dist/trace-artifact.js +18 -2
- package/dist/trace-artifact.js.map +1 -1
- package/package.json +25 -1
package/dist/rpc.js
CHANGED
|
@@ -7,10 +7,206 @@ export const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;
|
|
|
7
7
|
export const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;
|
|
8
8
|
export const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;
|
|
9
9
|
export const SUBAGENT_PROGRESS_FIELD = "subagentProgress";
|
|
10
|
+
const FLOW_COMMAND_TYPES = ["flow_status", "flow_pause", "flow_resume", "flow_cancel", "flow_message"];
|
|
11
|
+
const FLOW_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,127}$/;
|
|
12
|
+
const FLOW_MESSAGE_MAX_LENGTH = 16_000;
|
|
13
|
+
const FLOW_RECEIPT_STATES = ["accepted", "applied", "rejected"];
|
|
14
|
+
const FLOW_CANCEL_REASONS = ["user", "budget", "shutdown", "kill_switch"];
|
|
15
|
+
const FLOW_DISPOSITIONS = ["live", "queued", "rejected"];
|
|
16
|
+
// Mirrors FLOW_FAILURE_CLASSES + "size_underestimated" and FLOW_ROLES in ./flow-common (rpc.ts must stay import-free);
|
|
17
|
+
// test/rpc.test.ts keeps the lists in sync.
|
|
18
|
+
const FLOW_REASON_CLASSES = [
|
|
19
|
+
"provider_error",
|
|
20
|
+
"rate_limit",
|
|
21
|
+
"timeout",
|
|
22
|
+
"check_failed",
|
|
23
|
+
"review_rejected",
|
|
24
|
+
"qa_failed",
|
|
25
|
+
"budget_stop",
|
|
26
|
+
"cancelled",
|
|
27
|
+
"crash",
|
|
28
|
+
"unsafe_scope",
|
|
29
|
+
"stalled",
|
|
30
|
+
"config_invalid",
|
|
31
|
+
"internal",
|
|
32
|
+
"size_underestimated",
|
|
33
|
+
];
|
|
34
|
+
const FLOW_ROLE_NAMES = [
|
|
35
|
+
"scout",
|
|
36
|
+
"worker",
|
|
37
|
+
"implementer",
|
|
38
|
+
"lead",
|
|
39
|
+
"lead_large",
|
|
40
|
+
"architect",
|
|
41
|
+
"reviewer",
|
|
42
|
+
"security_reviewer",
|
|
43
|
+
"qa",
|
|
44
|
+
"triage",
|
|
45
|
+
];
|
|
46
|
+
const INVALID_FRAME_MESSAGE = "Invalid HUMAIN Code CLI RPC frame";
|
|
47
|
+
const INVALID_COMMAND_MESSAGE = "Invalid HUMAIN Code CLI RPC command";
|
|
48
|
+
const MAX_SNAPSHOT_DEPTH = 16;
|
|
49
|
+
const MAX_SNAPSHOT_NODES = 10_000;
|
|
50
|
+
// The snapshot string cap must never be below any field limit; per-field limits are enforced after the snapshot.
|
|
51
|
+
const MAX_SNAPSHOT_STRING = Math.max(MAX_IDENTIFIER_LENGTH, MAX_MESSAGE_LENGTH, MAX_ERROR_LENGTH, MAX_SESSION_PATH_LENGTH, FLOW_MESSAGE_MAX_LENGTH);
|
|
10
52
|
export function encodeRpcWireCommand(command) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
53
|
+
const type = readOwnDiscriminant(command, "type", INVALID_COMMAND_MESSAGE);
|
|
54
|
+
if (typeof type !== "string" || !type.startsWith("flow_")) {
|
|
55
|
+
// Legacy commands keep the contracts 0.3.3 validate-then-stringify behavior.
|
|
56
|
+
if (!isRpcWireCommand(command))
|
|
57
|
+
throw new Error(INVALID_COMMAND_MESSAGE);
|
|
58
|
+
const encoded = JSON.stringify(command);
|
|
59
|
+
// A proxy can answer differently per read; the serialized type must be the classified one.
|
|
60
|
+
if (JSON.parse(encoded).type !== type)
|
|
61
|
+
throw new Error(INVALID_COMMAND_MESSAGE);
|
|
62
|
+
return `${encoded}\n`;
|
|
63
|
+
}
|
|
64
|
+
// Flow commands: validate and serialize one plain-data snapshot so getters/proxies cannot change between check and write.
|
|
65
|
+
let snapshot;
|
|
66
|
+
try {
|
|
67
|
+
snapshot = snapshotPlainData(command, 0, { nodes: 0 });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new Error(INVALID_COMMAND_MESSAGE);
|
|
71
|
+
}
|
|
72
|
+
if (!isRpcWireCommand(snapshot))
|
|
73
|
+
throw new Error(INVALID_COMMAND_MESSAGE);
|
|
74
|
+
return `${JSON.stringify(snapshot)}\n`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Reads a discriminant once as an OWN DATA property. Inherited or accessor discriminants throw: this is an
|
|
78
|
+
* intentional, security-motivated exception to contracts 0.3.3 parity (a changing/inherited discriminant could
|
|
79
|
+
* select the unvalidated path). Absent returns undefined. Non-records throw.
|
|
80
|
+
*/
|
|
81
|
+
function readOwnDiscriminant(target, key, message) {
|
|
82
|
+
if (!isRecord(target))
|
|
83
|
+
throw new Error(message);
|
|
84
|
+
let descriptor;
|
|
85
|
+
let inherited = false;
|
|
86
|
+
try {
|
|
87
|
+
descriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
88
|
+
inherited = descriptor === undefined && key in target;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new Error(message);
|
|
92
|
+
}
|
|
93
|
+
if (inherited || (descriptor !== undefined && !("value" in descriptor)))
|
|
94
|
+
throw new Error(message);
|
|
95
|
+
return descriptor?.value;
|
|
96
|
+
}
|
|
97
|
+
/** Same rules as `snapshotFlowData` in ./flow-common (duplicated: this entry must not import anything). */
|
|
98
|
+
function snapshotPlainData(value, depth, budget) {
|
|
99
|
+
budget.nodes += 1;
|
|
100
|
+
if (depth > MAX_SNAPSHOT_DEPTH || budget.nodes > MAX_SNAPSHOT_NODES)
|
|
101
|
+
throw new Error("bounds");
|
|
102
|
+
if (value === null || typeof value === "boolean")
|
|
103
|
+
return value;
|
|
104
|
+
if (typeof value === "string") {
|
|
105
|
+
if (value.length > MAX_SNAPSHOT_STRING || !value.isWellFormed())
|
|
106
|
+
throw new Error("string");
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
if (typeof value === "number") {
|
|
110
|
+
if (!Number.isFinite(value))
|
|
111
|
+
throw new Error("number");
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
if (typeof value !== "object")
|
|
115
|
+
throw new Error("type");
|
|
116
|
+
if (Array.isArray(value)) {
|
|
117
|
+
const length = value.length;
|
|
118
|
+
if (length > MAX_SNAPSHOT_NODES)
|
|
119
|
+
throw new Error("bounds");
|
|
120
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
121
|
+
if (typeof key !== "string" ||
|
|
122
|
+
(key !== "length" &&
|
|
123
|
+
!(Number.isInteger(Number(key)) &&
|
|
124
|
+
Number(key) >= 0 &&
|
|
125
|
+
Number(key) < length &&
|
|
126
|
+
String(Number(key)) === key))) {
|
|
127
|
+
throw new Error("array");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const out = [];
|
|
131
|
+
for (let index = 0; index < length; index += 1) {
|
|
132
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
133
|
+
if (descriptor === undefined || !("value" in descriptor))
|
|
134
|
+
throw new Error("array");
|
|
135
|
+
out.push(snapshotPlainData(descriptor.value, depth + 1, budget));
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
const proto = Object.getPrototypeOf(value);
|
|
140
|
+
if (proto !== null && Object.getPrototypeOf(proto) !== null)
|
|
141
|
+
throw new Error("prototype");
|
|
142
|
+
const out = {};
|
|
143
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
144
|
+
if (typeof key !== "string" || !key.isWellFormed())
|
|
145
|
+
throw new Error("key");
|
|
146
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
147
|
+
if (descriptor === undefined || !("value" in descriptor) || descriptor.enumerable !== true)
|
|
148
|
+
throw new Error("property");
|
|
149
|
+
if (descriptor.value === undefined)
|
|
150
|
+
continue;
|
|
151
|
+
Object.defineProperty(out, key, {
|
|
152
|
+
value: snapshotPlainData(descriptor.value, depth + 1, budget),
|
|
153
|
+
enumerable: true,
|
|
154
|
+
writable: true,
|
|
155
|
+
configurable: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* One-level snapshot of a frame: own enumerable string-keyed DATA properties are copied (each read once); an
|
|
162
|
+
* accessor, a throwing trap or a non-record is the constant invalid-frame error. Discriminants are read only from
|
|
163
|
+
* the copy. Nested values are untouched here (native events pass through; flow frames are deep-snapshotted later).
|
|
164
|
+
*/
|
|
165
|
+
function copyFrameData(frame) {
|
|
166
|
+
try {
|
|
167
|
+
if (!isRecord(frame))
|
|
168
|
+
throw new Error("record");
|
|
169
|
+
const out = {};
|
|
170
|
+
for (const key of Reflect.ownKeys(frame)) {
|
|
171
|
+
if (typeof key !== "string")
|
|
172
|
+
continue;
|
|
173
|
+
const descriptor = Object.getOwnPropertyDescriptor(frame, key);
|
|
174
|
+
if (descriptor === undefined || descriptor.enumerable !== true)
|
|
175
|
+
continue;
|
|
176
|
+
if (!("value" in descriptor))
|
|
177
|
+
throw new Error("accessor");
|
|
178
|
+
Object.defineProperty(out, key, {
|
|
179
|
+
value: descriptor.value,
|
|
180
|
+
enumerable: true,
|
|
181
|
+
writable: true,
|
|
182
|
+
configurable: true,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
throw new Error(INVALID_FRAME_MESSAGE);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Deep plain snapshot of an (already copied) flow frame. */
|
|
192
|
+
function snapshotFlowFrame(frame) {
|
|
193
|
+
try {
|
|
194
|
+
return snapshotPlainData(frame, 0, { nodes: 0 });
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
throw new Error(INVALID_FRAME_MESSAGE);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function validateFlowFrame(frame) {
|
|
201
|
+
if (frame.type === "flow_event" || frame.type === "flow_status") {
|
|
202
|
+
const payload = frame.type === "flow_event" ? "event" : "status";
|
|
203
|
+
if (!hasExactKeys(frame, ["type", payload], []) || !isRecord(frame[payload]))
|
|
204
|
+
throw new Error(INVALID_FRAME_MESSAGE);
|
|
205
|
+
return frame;
|
|
206
|
+
}
|
|
207
|
+
if (!isFlowReceiptFrame(frame))
|
|
208
|
+
throw new Error(INVALID_FRAME_MESSAGE);
|
|
209
|
+
return frame;
|
|
14
210
|
}
|
|
15
211
|
export function parseRpcWireFrame(input) {
|
|
16
212
|
if (typeof input === "string" && input.length > MAX_RPC_FRAME_LENGTH) {
|
|
@@ -25,28 +221,41 @@ export function parseRpcWireFrame(input) {
|
|
|
25
221
|
throw new Error("Invalid HUMAIN Code CLI RPC frame");
|
|
26
222
|
}
|
|
27
223
|
}
|
|
28
|
-
|
|
224
|
+
// ponytail: proxy frames are not defended (limit: in-process code building a proxy already controls the process).
|
|
225
|
+
const type = readOwnDiscriminant(frame, "type", INVALID_FRAME_MESSAGE);
|
|
226
|
+
const record = frame;
|
|
227
|
+
const command = type === "response" ? readOwnDiscriminant(record, "command", INVALID_FRAME_MESSAGE) : undefined;
|
|
228
|
+
const success = type === "response" ? readOwnDiscriminant(record, "success", INVALID_FRAME_MESSAGE) : undefined;
|
|
229
|
+
// HC emits `{success:false,error}` for invalid flow_* commands and Flow handler exceptions; keep the legacy path.
|
|
230
|
+
const isLegacyErrorResponse = () => success === false && typeof Object.getOwnPropertyDescriptor(record, "error")?.value === "string";
|
|
231
|
+
if (type === "flow_event" ||
|
|
232
|
+
type === "flow_status" ||
|
|
233
|
+
(type === "response" && typeof command === "string" && command.startsWith("flow_") && !isLegacyErrorResponse())) {
|
|
234
|
+
const flowFrame = snapshotFlowFrame(copyFrameData(record));
|
|
235
|
+
return validateFlowFrame(flowFrame);
|
|
236
|
+
}
|
|
237
|
+
if (typeof type !== "string" || type.length === 0) {
|
|
29
238
|
throw new Error("Invalid HUMAIN Code CLI RPC frame");
|
|
30
239
|
}
|
|
31
|
-
if (
|
|
32
|
-
if (!hasOnlyKeys(
|
|
33
|
-
|
|
34
|
-
!isNonemptyBoundedString(
|
|
35
|
-
!Number.isSafeInteger(
|
|
36
|
-
|
|
240
|
+
if (type === "ready") {
|
|
241
|
+
if (!hasOnlyKeys(record, ["type", "protocolVersion", "sessionId", "pid"]) ||
|
|
242
|
+
record.protocolVersion !== 1 ||
|
|
243
|
+
!isNonemptyBoundedString(record.sessionId, MAX_IDENTIFIER_LENGTH) ||
|
|
244
|
+
!Number.isSafeInteger(record.pid) ||
|
|
245
|
+
record.pid <= 0) {
|
|
37
246
|
throw new Error("Invalid HUMAIN Code CLI RPC frame");
|
|
38
247
|
}
|
|
39
|
-
return
|
|
248
|
+
return record;
|
|
40
249
|
}
|
|
41
|
-
if (
|
|
42
|
-
if (!hasOnlyKeys(
|
|
43
|
-
(
|
|
44
|
-
!isNonemptyBoundedString(
|
|
45
|
-
typeof
|
|
46
|
-
(
|
|
250
|
+
if (type === "response") {
|
|
251
|
+
if (!hasOnlyKeys(record, ["type", "id", "command", "success", "error", "data"]) ||
|
|
252
|
+
(record.id !== undefined && !isNonemptyBoundedString(record.id, MAX_IDENTIFIER_LENGTH)) ||
|
|
253
|
+
!isNonemptyBoundedString(command, MAX_IDENTIFIER_LENGTH) ||
|
|
254
|
+
typeof success !== "boolean" ||
|
|
255
|
+
(record.error !== undefined && !isBoundedString(record.error, MAX_ERROR_LENGTH))) {
|
|
47
256
|
throw new Error("Invalid HUMAIN Code CLI RPC frame");
|
|
48
257
|
}
|
|
49
|
-
return
|
|
258
|
+
return record;
|
|
50
259
|
}
|
|
51
260
|
return frame;
|
|
52
261
|
}
|
|
@@ -124,10 +333,66 @@ function isRpcWireCommand(value) {
|
|
|
124
333
|
return (hasOnlyKeys(value, ["id", "type", "sessionPath"]) &&
|
|
125
334
|
isNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&
|
|
126
335
|
isNonemptyBoundedString(value.sessionPath, MAX_SESSION_PATH_LENGTH));
|
|
336
|
+
case "flow_status":
|
|
337
|
+
return (hasExactKeys(value, ["id", "type"], ["runId"]) &&
|
|
338
|
+
isFlowId(value.id) &&
|
|
339
|
+
(!("runId" in value) || isFlowId(value.runId)));
|
|
340
|
+
case "flow_pause":
|
|
341
|
+
case "flow_resume":
|
|
342
|
+
return hasExactKeys(value, ["id", "type", "runId"], []) && isFlowId(value.id) && isFlowId(value.runId);
|
|
343
|
+
case "flow_cancel":
|
|
344
|
+
return (hasExactKeys(value, ["id", "type", "runId", "reason"], []) &&
|
|
345
|
+
isFlowId(value.id) &&
|
|
346
|
+
isFlowId(value.runId) &&
|
|
347
|
+
FLOW_CANCEL_REASONS.includes(value.reason));
|
|
348
|
+
case "flow_message":
|
|
349
|
+
return (hasExactKeys(value, ["id", "type", "runId", "messageId", "text"], ["target"]) &&
|
|
350
|
+
isFlowId(value.id) &&
|
|
351
|
+
isFlowId(value.runId) &&
|
|
352
|
+
isFlowId(value.messageId) &&
|
|
353
|
+
isNonemptyBoundedString(value.text, FLOW_MESSAGE_MAX_LENGTH) &&
|
|
354
|
+
(value.target === undefined ||
|
|
355
|
+
value.target === "lead" ||
|
|
356
|
+
(isRecord(value.target) && hasExactKeys(value.target, ["taskId"], []) && isFlowId(value.target.taskId))));
|
|
127
357
|
default:
|
|
128
358
|
return false;
|
|
129
359
|
}
|
|
130
360
|
}
|
|
361
|
+
function isFlowCommandType(value) {
|
|
362
|
+
return FLOW_COMMAND_TYPES.includes(value);
|
|
363
|
+
}
|
|
364
|
+
function isFlowId(value) {
|
|
365
|
+
return typeof value === "string" && FLOW_ID_PATTERN.test(value);
|
|
366
|
+
}
|
|
367
|
+
function hasExactKeys(value, required, optional) {
|
|
368
|
+
return (Object.keys(value).every((key) => required.includes(key) || optional.includes(key)) &&
|
|
369
|
+
required.every((key) => key in value));
|
|
370
|
+
}
|
|
371
|
+
/** Full receipt validation (state, reason, terminationConfirmed only for cancel, disposition/deliveredTo only for messages). */
|
|
372
|
+
function isFlowReceiptFrame(frame) {
|
|
373
|
+
const message = frame.command === "flow_message";
|
|
374
|
+
const cancel = frame.command === "flow_cancel";
|
|
375
|
+
if (!hasExactKeys(frame, ["type", "id", "command", "state", ...(message ? ["messageId", "disposition"] : [])], ["reason", ...(message ? ["deliveredTo"] : cancel ? ["terminationConfirmed"] : [])]) ||
|
|
376
|
+
frame.type !== "response" ||
|
|
377
|
+
!isFlowCommandType(frame.command) ||
|
|
378
|
+
!isFlowId(frame.id) ||
|
|
379
|
+
!FLOW_RECEIPT_STATES.includes(frame.state) ||
|
|
380
|
+
(frame.reason !== undefined && !FLOW_REASON_CLASSES.includes(frame.reason))) {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
if (cancel)
|
|
384
|
+
return frame.terminationConfirmed === undefined || typeof frame.terminationConfirmed === "boolean";
|
|
385
|
+
if (!message)
|
|
386
|
+
return true;
|
|
387
|
+
const delivered = frame.deliveredTo;
|
|
388
|
+
return (isFlowId(frame.messageId) &&
|
|
389
|
+
FLOW_DISPOSITIONS.includes(frame.disposition) &&
|
|
390
|
+
(delivered === undefined ||
|
|
391
|
+
(isRecord(delivered) &&
|
|
392
|
+
hasExactKeys(delivered, ["taskId", "role"], []) &&
|
|
393
|
+
isFlowId(delivered.taskId) &&
|
|
394
|
+
FLOW_ROLE_NAMES.includes(delivered.role))));
|
|
395
|
+
}
|
|
131
396
|
function isRecord(value) {
|
|
132
397
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
133
398
|
}
|
package/dist/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseSubagentProgressSnapshot, type SubagentProgressSnapshot } from \"./subagent-progress.ts\";\n\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst MAX_MESSAGE_LENGTH = 100_000;\nconst MAX_ERROR_LENGTH = 10_000;\nconst MAX_SESSION_PATH_LENGTH = 4_096;\nexport const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;\nexport const SUBAGENT_PROGRESS_FIELD = \"subagentProgress\" as const;\n\nexport type RpcWireCommand =\n\t| { id: string; type: \"prompt\"; message: string }\n\t| { id: string; type: \"abort\" }\n\t| { id: string; type: \"get_state\" }\n\t| { type: \"set_model\"; provider: string; modelId: string }\n\t| { id: string; type: \"switch_session\"; sessionPath: string };\n\nexport type RpcReadyFrame = {\n\ttype: \"ready\";\n\tprotocolVersion: 1;\n\tsessionId: string;\n\tpid: number;\n};\n\nexport type RpcResponseFrame = {\n\ttype: \"response\";\n\tid?: string;\n\tcommand: string;\n\tsuccess: boolean;\n\terror?: string;\n\tdata?: unknown;\n};\n\nexport type RpcNativeEventFrame = { type: string; [key: string]: unknown };\nexport type RpcSubagentProgressMetadata = { subagentProgress?: SubagentProgressSnapshot };\nexport type RpcToolExecutionUpdateProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_update\";\n} & RpcSubagentProgressMetadata;\nexport type RpcToolExecutionEndProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_end\";\n} & RpcSubagentProgressMetadata;\nexport type RpcGetStateProgressData = Record<string, unknown> & RpcSubagentProgressMetadata;\nexport type RpcWireFrame = RpcReadyFrame | RpcResponseFrame | RpcNativeEventFrame;\n\nexport function encodeRpcWireCommand(command: RpcWireCommand): string {\n\tif (!isRpcWireCommand(command)) throw new Error(\"Invalid HUMAIN Code CLI RPC command\");\n\treturn `${JSON.stringify(command)}\\n`;\n}\n\nexport function parseRpcWireFrame(input: unknown): RpcWireFrame {\n\tif (typeof input === \"string\" && input.length > MAX_RPC_FRAME_LENGTH) {\n\t\tthrow new Error(`HUMAIN Code CLI RPC frame exceeds the ${MAX_RPC_FRAME_LENGTH}-character limit`);\n\t}\n\tlet frame: unknown = input;\n\tif (typeof input === \"string\") {\n\t\ttry {\n\t\t\tframe = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t}\n\tif (!isRecord(frame) || typeof frame.type !== \"string\" || frame.type.length === 0) {\n\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t}\n\tif (frame.type === \"ready\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(frame, [\"type\", \"protocolVersion\", \"sessionId\", \"pid\"]) ||\n\t\t\tframe.protocolVersion !== 1 ||\n\t\t\t!isNonemptyBoundedString(frame.sessionId, MAX_IDENTIFIER_LENGTH) ||\n\t\t\t!Number.isSafeInteger(frame.pid) ||\n\t\t\t(frame.pid as number) <= 0\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn frame as RpcReadyFrame;\n\t}\n\tif (frame.type === \"response\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(frame, [\"type\", \"id\", \"command\", \"success\", \"error\", \"data\"]) ||\n\t\t\t(frame.id !== undefined && !isNonemptyBoundedString(frame.id, MAX_IDENTIFIER_LENGTH)) ||\n\t\t\t!isNonemptyBoundedString(frame.command, MAX_IDENTIFIER_LENGTH) ||\n\t\t\ttypeof frame.success !== \"boolean\" ||\n\t\t\t(frame.error !== undefined && !isBoundedString(frame.error, MAX_ERROR_LENGTH))\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn frame as RpcResponseFrame;\n\t}\n\treturn frame as RpcNativeEventFrame;\n}\n\n/**\n * Reads optional subagent progress metadata. Absent field means unsupported/unavailable\n * (returns undefined); a present field is strictly parsed and throws when invalid.\n * Update/end piggyback envelopes must carry exactly one run (0 or 2+ throws); get_state accepts 0..64 runs.\n * No other frame fields are inspected or validated.\n */\nexport function readRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\ttry {\n\t\treturn extractRpcSubagentProgress(frame);\n\t} catch {\n\t\tthrow new Error(INVALID_PROGRESS_MESSAGE);\n\t}\n}\n\nconst INVALID_PROGRESS_MESSAGE = \"Invalid subagent progress snapshot\";\n\n/** Own data property lookup: never invokes getters; `inherited` is true when only a non-own property exists. */\nfunction readOwnData(target: object, key: string): { found: boolean; value?: unknown; inherited: boolean } {\n\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\tif (descriptor === undefined) return { found: false, inherited: key in target };\n\tif (!(\"value\" in descriptor)) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn { found: true, value: descriptor.value, inherited: false };\n}\n\nfunction extractRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\tif (!isRecord(frame)) return undefined;\n\tconst type = readOwnData(frame, \"type\").value;\n\tlet carrier: unknown;\n\tlet singleRun = false;\n\tif (type === \"tool_execution_update\" || type === \"tool_execution_end\") {\n\t\tcarrier = frame;\n\t\tsingleRun = true;\n\t} else if (type === \"response\") {\n\t\tif (readOwnData(frame, \"command\").value !== \"get_state\" || readOwnData(frame, \"success\").value !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcarrier = readOwnData(frame, \"data\").value;\n\t} else {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(carrier)) return undefined;\n\tconst field = readOwnData(carrier, SUBAGENT_PROGRESS_FIELD);\n\tif (field.inherited) throw new Error(INVALID_PROGRESS_MESSAGE);\n\tif (!field.found) return undefined;\n\tconst snapshot = parseSubagentProgressSnapshot(field.value);\n\tif (singleRun && snapshot.runs.length !== 1) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn snapshot;\n}\n\nfunction isRpcWireCommand(value: unknown): value is RpcWireCommand {\n\tif (!isRecord(value)) return false;\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"message\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.message, MAX_MESSAGE_LENGTH)\n\t\t\t);\n\t\tcase \"abort\":\n\t\tcase \"get_state\":\n\t\t\treturn hasOnlyKeys(value, [\"id\", \"type\"]) && isNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"type\", \"provider\", \"modelId\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.provider, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.modelId, MAX_IDENTIFIER_LENGTH)\n\t\t\t);\n\t\tcase \"switch_session\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"sessionPath\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.sessionPath, MAX_SESSION_PATH_LENGTH)\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonemptyBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length > 0 && value.length <= maxLength;\n}\n\nfunction isBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length <= maxLength;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst keys = Object.keys(value);\n\treturn keys.every((key) => allowed.includes(key)) && allowed.every((key) => key in value || isOptionalKey(key));\n}\n\nfunction isOptionalKey(key: string): boolean {\n\treturn key === \"id\" || key === \"error\" || key === \"data\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAiC,MAAM,wBAAwB,CAAC;AAEtG,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAA2B,CAAC;AAEnE,MAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,CAAU,CAAC;AAEhH,MAAM,eAAe,GAAG,+BAA+B,CAAC;AACxD,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAChE,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACzD,uHAAuH;AACvH,4CAA4C;AAC5C,MAAM,mBAAmB,GAAG;IAC3B,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,WAAW;IACX,aAAa;IACb,WAAW;IACX,OAAO;IACP,cAAc;IACd,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,qBAAqB;CACrB,CAAC;AACF,MAAM,eAAe,GAAG;IACvB,OAAO;IACP,QAAQ;IACR,aAAa;IACb,MAAM;IACN,YAAY;IACZ,WAAW;IACX,UAAU;IACV,mBAAmB;IACnB,IAAI;IACJ,QAAQ;CACR,CAAC;AACF,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAClE,MAAM,uBAAuB,GAAG,qCAAqC,CAAC;AACtE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,iHAAiH;AACjH,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CACnC,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,CACvB,CAAC;AA2DF,MAAM,UAAU,oBAAoB,CAAC,OAAuB;IAC3D,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC3E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,6EAA6E;QAC7E,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,2FAA2F;QAC3F,IAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACxG,OAAO,GAAG,OAAO,IAAI,CAAC;IACvB,CAAC;IACD,0HAA0H;IAC1H,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1E,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAe,EAAE,GAAW,EAAE,OAAe;IACzE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,UAA0C,CAAC;IAC/C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACJ,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,SAAS,GAAG,UAAU,KAAK,SAAS,IAAI,GAAG,IAAI,MAAM,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAClG,OAAO,UAAU,EAAE,KAAK,CAAC;AAC1B,CAAC;AAED,2GAA2G;AAC3G,SAAS,iBAAiB,CAAC,KAAc,EAAE,KAAa,EAAE,MAAyB;IAClF,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,kBAAkB,IAAI,MAAM,CAAC,KAAK,GAAG,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/F,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,mBAAmB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3F,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,MAAM,GAAG,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,IACC,OAAO,GAAG,KAAK,QAAQ;gBACvB,CAAC,GAAG,KAAK,QAAQ;oBAChB,CAAC,CACA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;wBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;wBACpB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAC3B,CAAC,EACF,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;QACD,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1F,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI;YACzF,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QAC7C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;YAC/B,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC;YAC7D,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,SAAS;YACtC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI;gBAAE,SAAS;YACzE,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;gBAC/B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;aAClB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC;AACF,CAAC;AAED,6DAA6D;AAC7D,SAAS,iBAAiB,CAAC,KAA8B;IACxD,IAAI,CAAC;QACJ,OAAO,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAA4B,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CACzB,KAA8B;IAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,OAAO,KAA+C,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACvE,OAAO,KAA4B,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,yCAAyC,oBAAoB,kBAAkB,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,GAAY,KAAK,CAAC;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IACD,kHAAkH;IAClH,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,MAAM,OAAO,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,kHAAkH;IAClH,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAClC,OAAO,KAAK,KAAK,IAAI,OAAO,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC;IAClG,IACC,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,aAAa;QACtB,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,EAC9G,CAAC;QACF,MAAM,SAAS,GAAG,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACtB,IACC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACrE,MAAM,CAAC,eAAe,KAAK,CAAC;YAC5B,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;YACjE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YAChC,MAAM,CAAC,GAAc,IAAI,CAAC,EAC1B,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAuB,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACzB,IACC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3E,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACvF,CAAC,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,CAAC;YACxD,OAAO,OAAO,KAAK,SAAS;YAC5B,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAC/E,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAA0B,CAAC;IACnC,CAAC;IACD,OAAO,KAA4B,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAmB;IAC1D,IAAI,CAAC;QACJ,OAAO,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;AACF,CAAC;AAED,MAAM,wBAAwB,GAAG,oCAAoC,CAAC;AAEtE,gHAAgH;AAChH,SAAS,WAAW,CAAC,MAAc,EAAE,GAAW;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChE,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC;IAChF,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAmB;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC;IAC9C,IAAI,OAAgB,CAAC;IACrB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,IAAI,KAAK,uBAAuB,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACvE,OAAO,GAAG,KAAK,CAAC;QAChB,SAAS,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzG,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;SAAM,CAAC;QACP,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvF,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACZ,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7C,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,qBAAqB,CAAC;gBACxD,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAC1D,CAAC;QACH,KAAK,OAAO,CAAC;QACb,KAAK,WAAW;YACf,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACvG,KAAK,WAAW;YACf,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACnD,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC;gBAC9D,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAC7D,CAAC;QACH,KAAK,gBAAgB;YACpB,OAAO,CACN,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;gBACjD,uBAAuB,CAAC,KAAK,CAAC,EAAE,EAAE,qBAAqB,CAAC;gBACxD,uBAAuB,CAAC,KAAK,CAAC,WAAW,EAAE,uBAAuB,CAAC,CACnE,CAAC;QACH,KAAK,aAAa;YACjB,OAAO,CACN,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC;QACH,KAAK,YAAY,CAAC;QAClB,KAAK,aAAa;YACjB,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxG,KAAK,aAAa;YACjB,OAAO,CACN,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;gBACrB,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAgB,CAAC,CACpD,CAAC;QACH,KAAK,cAAc;YAClB,OAAO,CACN,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;gBACrB,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;gBACzB,uBAAuB,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC;gBAC5D,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;oBAC1B,KAAK,CAAC,MAAM,KAAK,MAAM;oBACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CACzG,CAAC;QACH;YACC,OAAO,KAAK,CAAC;IACf,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACxC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,KAAwB,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CACpB,KAA8B,EAC9B,QAA2B,EAC3B,QAA2B;IAE3B,OAAO,CACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnF,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CACrC,CAAC;AACH,CAAC;AAED,gIAAgI;AAChI,SAAS,kBAAkB,CAAC,KAA8B;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,aAAa,CAAC;IAC/C,IACC,CAAC,YAAY,CACZ,KAAK,EACL,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACpF,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACnF;QACD,KAAK,CAAC,IAAI,KAAK,UAAU;QACzB,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC;QACjC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAe,CAAC;QACpD,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC,EACpF,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC,oBAAoB,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC;IAC/G,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;IACpC,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QACzB,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAqB,CAAC;QACvD,CAAC,SAAS,KAAK,SAAS;YACvB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACnB,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC/C,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC1B,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC,CAAC,CACtD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAE,SAAiB;IACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;AACnF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,SAAiB;IACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,KAA8B,EAAE,OAA0B;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IACjC,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,CAAC;AAC1D,CAAC","sourcesContent":["import type { FlowControlCommandV1 } from \"./flow-control.ts\";\nimport { parseSubagentProgressSnapshot, type SubagentProgressSnapshot } from \"./subagent-progress.ts\";\n\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst MAX_MESSAGE_LENGTH = 100_000;\nconst MAX_ERROR_LENGTH = 10_000;\nconst MAX_SESSION_PATH_LENGTH = 4_096;\nexport const MAX_RPC_FRAME_LENGTH = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_UTF8_BYTES = 16 * 1024 * 1024;\nexport const MAX_GET_STATE_RESPONSE_CODE_UNITS = 16 * 1024 * 1024;\nexport const SUBAGENT_PROGRESS_FIELD = \"subagentProgress\" as const;\n\nconst FLOW_COMMAND_TYPES = [\"flow_status\", \"flow_pause\", \"flow_resume\", \"flow_cancel\", \"flow_message\"] as const;\ntype FlowCommandType = (typeof FLOW_COMMAND_TYPES)[number];\nconst FLOW_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,127}$/;\nconst FLOW_MESSAGE_MAX_LENGTH = 16_000;\nconst FLOW_RECEIPT_STATES = [\"accepted\", \"applied\", \"rejected\"];\nconst FLOW_CANCEL_REASONS = [\"user\", \"budget\", \"shutdown\", \"kill_switch\"];\nconst FLOW_DISPOSITIONS = [\"live\", \"queued\", \"rejected\"];\n// Mirrors FLOW_FAILURE_CLASSES + \"size_underestimated\" and FLOW_ROLES in ./flow-common (rpc.ts must stay import-free);\n// test/rpc.test.ts keeps the lists in sync.\nconst FLOW_REASON_CLASSES = [\n\t\"provider_error\",\n\t\"rate_limit\",\n\t\"timeout\",\n\t\"check_failed\",\n\t\"review_rejected\",\n\t\"qa_failed\",\n\t\"budget_stop\",\n\t\"cancelled\",\n\t\"crash\",\n\t\"unsafe_scope\",\n\t\"stalled\",\n\t\"config_invalid\",\n\t\"internal\",\n\t\"size_underestimated\",\n];\nconst FLOW_ROLE_NAMES = [\n\t\"scout\",\n\t\"worker\",\n\t\"implementer\",\n\t\"lead\",\n\t\"lead_large\",\n\t\"architect\",\n\t\"reviewer\",\n\t\"security_reviewer\",\n\t\"qa\",\n\t\"triage\",\n];\nconst INVALID_FRAME_MESSAGE = \"Invalid HUMAIN Code CLI RPC frame\";\nconst INVALID_COMMAND_MESSAGE = \"Invalid HUMAIN Code CLI RPC command\";\nconst MAX_SNAPSHOT_DEPTH = 16;\nconst MAX_SNAPSHOT_NODES = 10_000;\n// The snapshot string cap must never be below any field limit; per-field limits are enforced after the snapshot.\nconst MAX_SNAPSHOT_STRING = Math.max(\n\tMAX_IDENTIFIER_LENGTH,\n\tMAX_MESSAGE_LENGTH,\n\tMAX_ERROR_LENGTH,\n\tMAX_SESSION_PATH_LENGTH,\n\tFLOW_MESSAGE_MAX_LENGTH,\n);\n\nexport type RpcWireCommand =\n\t| { id: string; type: \"prompt\"; message: string }\n\t| { id: string; type: \"abort\" }\n\t| { id: string; type: \"get_state\" }\n\t| { type: \"set_model\"; provider: string; modelId: string }\n\t| { id: string; type: \"switch_session\"; sessionPath: string }\n\t| FlowControlCommandV1;\n\nexport type RpcReadyFrame = {\n\ttype: \"ready\";\n\tprotocolVersion: 1;\n\tsessionId: string;\n\tpid: number;\n};\n\nexport type RpcResponseFrame = {\n\ttype: \"response\";\n\tid?: string;\n\tcommand: string;\n\tsuccess: boolean;\n\terror?: string;\n\tdata?: unknown;\n};\n\n/** Flow receipt: a `response` frame without `success`. Fully validated by `parseRpcWireFrame` (no TypeBox needed). */\nexport type RpcFlowReceiptFrame = {\n\ttype: \"response\";\n\tid: string;\n\tcommand: FlowCommandType;\n\tstate: \"accepted\" | \"applied\" | \"rejected\";\n\t[key: string]: unknown;\n};\n/**\n * Pushed flow frames: `parseRpcWireFrame` validates the ENVELOPE only (exactly `{type, event}` / `{type, status}`\n * with a plain-object payload) because rpc.ts must stay TypeBox-free. Consumers MUST pass `event` to\n * `parseFlowEventV1` (./flow-events) and `status` to `parseFlowStatusV1` (./flow-control) before using it.\n */\nexport type RpcFlowEventFrame = { type: \"flow_event\"; event: Record<string, unknown> };\nexport type RpcFlowStatusFrame = { type: \"flow_status\"; status: Record<string, unknown> };\n\nexport type RpcNativeEventFrame = { type: string; [key: string]: unknown };\nexport type RpcSubagentProgressMetadata = { subagentProgress?: SubagentProgressSnapshot };\nexport type RpcToolExecutionUpdateProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_update\";\n} & RpcSubagentProgressMetadata;\nexport type RpcToolExecutionEndProgressFrame = RpcNativeEventFrame & {\n\ttype: \"tool_execution_end\";\n} & RpcSubagentProgressMetadata;\nexport type RpcGetStateProgressData = Record<string, unknown> & RpcSubagentProgressMetadata;\nexport type RpcWireFrame =\n\t| RpcReadyFrame\n\t| RpcResponseFrame\n\t| RpcFlowReceiptFrame\n\t| RpcFlowEventFrame\n\t| RpcFlowStatusFrame\n\t| RpcNativeEventFrame;\n\nexport function encodeRpcWireCommand(command: RpcWireCommand): string {\n\tconst type = readOwnDiscriminant(command, \"type\", INVALID_COMMAND_MESSAGE);\n\tif (typeof type !== \"string\" || !type.startsWith(\"flow_\")) {\n\t\t// Legacy commands keep the contracts 0.3.3 validate-then-stringify behavior.\n\t\tif (!isRpcWireCommand(command)) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\tconst encoded = JSON.stringify(command);\n\t\t// A proxy can answer differently per read; the serialized type must be the classified one.\n\t\tif ((JSON.parse(encoded) as { type?: unknown }).type !== type) throw new Error(INVALID_COMMAND_MESSAGE);\n\t\treturn `${encoded}\\n`;\n\t}\n\t// Flow commands: validate and serialize one plain-data snapshot so getters/proxies cannot change between check and write.\n\tlet snapshot: unknown;\n\ttry {\n\t\tsnapshot = snapshotPlainData(command, 0, { nodes: 0 });\n\t} catch {\n\t\tthrow new Error(INVALID_COMMAND_MESSAGE);\n\t}\n\tif (!isRpcWireCommand(snapshot)) throw new Error(INVALID_COMMAND_MESSAGE);\n\treturn `${JSON.stringify(snapshot)}\\n`;\n}\n\n/**\n * Reads a discriminant once as an OWN DATA property. Inherited or accessor discriminants throw: this is an\n * intentional, security-motivated exception to contracts 0.3.3 parity (a changing/inherited discriminant could\n * select the unvalidated path). Absent returns undefined. Non-records throw.\n */\nfunction readOwnDiscriminant(target: unknown, key: string, message: string): unknown {\n\tif (!isRecord(target)) throw new Error(message);\n\tlet descriptor: PropertyDescriptor | undefined;\n\tlet inherited = false;\n\ttry {\n\t\tdescriptor = Object.getOwnPropertyDescriptor(target, key);\n\t\tinherited = descriptor === undefined && key in target;\n\t} catch {\n\t\tthrow new Error(message);\n\t}\n\tif (inherited || (descriptor !== undefined && !(\"value\" in descriptor))) throw new Error(message);\n\treturn descriptor?.value;\n}\n\n/** Same rules as `snapshotFlowData` in ./flow-common (duplicated: this entry must not import anything). */\nfunction snapshotPlainData(value: unknown, depth: number, budget: { nodes: number }): unknown {\n\tbudget.nodes += 1;\n\tif (depth > MAX_SNAPSHOT_DEPTH || budget.nodes > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\tif (value === null || typeof value === \"boolean\") return value;\n\tif (typeof value === \"string\") {\n\t\tif (value.length > MAX_SNAPSHOT_STRING || !value.isWellFormed()) throw new Error(\"string\");\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new Error(\"number\");\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") throw new Error(\"type\");\n\tif (Array.isArray(value)) {\n\t\tconst length = value.length;\n\t\tif (length > MAX_SNAPSHOT_NODES) throw new Error(\"bounds\");\n\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\tif (\n\t\t\t\ttypeof key !== \"string\" ||\n\t\t\t\t(key !== \"length\" &&\n\t\t\t\t\t!(\n\t\t\t\t\t\tNumber.isInteger(Number(key)) &&\n\t\t\t\t\t\tNumber(key) >= 0 &&\n\t\t\t\t\t\tNumber(key) < length &&\n\t\t\t\t\t\tString(Number(key)) === key\n\t\t\t\t\t))\n\t\t\t) {\n\t\t\t\tthrow new Error(\"array\");\n\t\t\t}\n\t\t}\n\t\tconst out: unknown[] = [];\n\t\tfor (let index = 0; index < length; index += 1) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\t\tif (descriptor === undefined || !(\"value\" in descriptor)) throw new Error(\"array\");\n\t\t\tout.push(snapshotPlainData(descriptor.value, depth + 1, budget));\n\t\t}\n\t\treturn out;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== null && Object.getPrototypeOf(proto) !== null) throw new Error(\"prototype\");\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of Reflect.ownKeys(value)) {\n\t\tif (typeof key !== \"string\" || !key.isWellFormed()) throw new Error(\"key\");\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\tif (descriptor === undefined || !(\"value\" in descriptor) || descriptor.enumerable !== true)\n\t\t\tthrow new Error(\"property\");\n\t\tif (descriptor.value === undefined) continue;\n\t\tObject.defineProperty(out, key, {\n\t\t\tvalue: snapshotPlainData(descriptor.value, depth + 1, budget),\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\treturn out;\n}\n\n/**\n * One-level snapshot of a frame: own enumerable string-keyed DATA properties are copied (each read once); an\n * accessor, a throwing trap or a non-record is the constant invalid-frame error. Discriminants are read only from\n * the copy. Nested values are untouched here (native events pass through; flow frames are deep-snapshotted later).\n */\nfunction copyFrameData(frame: unknown): Record<string, unknown> {\n\ttry {\n\t\tif (!isRecord(frame)) throw new Error(\"record\");\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const key of Reflect.ownKeys(frame)) {\n\t\t\tif (typeof key !== \"string\") continue;\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(frame, key);\n\t\t\tif (descriptor === undefined || descriptor.enumerable !== true) continue;\n\t\t\tif (!(\"value\" in descriptor)) throw new Error(\"accessor\");\n\t\t\tObject.defineProperty(out, key, {\n\t\t\t\tvalue: descriptor.value,\n\t\t\t\tenumerable: true,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\n/** Deep plain snapshot of an (already copied) flow frame. */\nfunction snapshotFlowFrame(frame: Record<string, unknown>): Record<string, unknown> {\n\ttry {\n\t\treturn snapshotPlainData(frame, 0, { nodes: 0 }) as Record<string, unknown>;\n\t} catch {\n\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t}\n}\n\nfunction validateFlowFrame(\n\tframe: Record<string, unknown>,\n): RpcFlowReceiptFrame | RpcFlowEventFrame | RpcFlowStatusFrame {\n\tif (frame.type === \"flow_event\" || frame.type === \"flow_status\") {\n\t\tconst payload = frame.type === \"flow_event\" ? \"event\" : \"status\";\n\t\tif (!hasExactKeys(frame, [\"type\", payload], []) || !isRecord(frame[payload]))\n\t\t\tthrow new Error(INVALID_FRAME_MESSAGE);\n\t\treturn frame as RpcFlowEventFrame | RpcFlowStatusFrame;\n\t}\n\tif (!isFlowReceiptFrame(frame)) throw new Error(INVALID_FRAME_MESSAGE);\n\treturn frame as RpcFlowReceiptFrame;\n}\n\nexport function parseRpcWireFrame(input: unknown): RpcWireFrame {\n\tif (typeof input === \"string\" && input.length > MAX_RPC_FRAME_LENGTH) {\n\t\tthrow new Error(`HUMAIN Code CLI RPC frame exceeds the ${MAX_RPC_FRAME_LENGTH}-character limit`);\n\t}\n\tlet frame: unknown = input;\n\tif (typeof input === \"string\") {\n\t\ttry {\n\t\t\tframe = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t}\n\t// ponytail: proxy frames are not defended (limit: in-process code building a proxy already controls the process).\n\tconst type = readOwnDiscriminant(frame, \"type\", INVALID_FRAME_MESSAGE);\n\tconst record = frame as Record<string, unknown>;\n\tconst command = type === \"response\" ? readOwnDiscriminant(record, \"command\", INVALID_FRAME_MESSAGE) : undefined;\n\tconst success = type === \"response\" ? readOwnDiscriminant(record, \"success\", INVALID_FRAME_MESSAGE) : undefined;\n\t// HC emits `{success:false,error}` for invalid flow_* commands and Flow handler exceptions; keep the legacy path.\n\tconst isLegacyErrorResponse = () =>\n\t\tsuccess === false && typeof Object.getOwnPropertyDescriptor(record, \"error\")?.value === \"string\";\n\tif (\n\t\ttype === \"flow_event\" ||\n\t\ttype === \"flow_status\" ||\n\t\t(type === \"response\" && typeof command === \"string\" && command.startsWith(\"flow_\") && !isLegacyErrorResponse())\n\t) {\n\t\tconst flowFrame = snapshotFlowFrame(copyFrameData(record));\n\t\treturn validateFlowFrame(flowFrame);\n\t}\n\tif (typeof type !== \"string\" || type.length === 0) {\n\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t}\n\tif (type === \"ready\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"protocolVersion\", \"sessionId\", \"pid\"]) ||\n\t\t\trecord.protocolVersion !== 1 ||\n\t\t\t!isNonemptyBoundedString(record.sessionId, MAX_IDENTIFIER_LENGTH) ||\n\t\t\t!Number.isSafeInteger(record.pid) ||\n\t\t\t(record.pid as number) <= 0\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcReadyFrame;\n\t}\n\tif (type === \"response\") {\n\t\tif (\n\t\t\t!hasOnlyKeys(record, [\"type\", \"id\", \"command\", \"success\", \"error\", \"data\"]) ||\n\t\t\t(record.id !== undefined && !isNonemptyBoundedString(record.id, MAX_IDENTIFIER_LENGTH)) ||\n\t\t\t!isNonemptyBoundedString(command, MAX_IDENTIFIER_LENGTH) ||\n\t\t\ttypeof success !== \"boolean\" ||\n\t\t\t(record.error !== undefined && !isBoundedString(record.error, MAX_ERROR_LENGTH))\n\t\t) {\n\t\t\tthrow new Error(\"Invalid HUMAIN Code CLI RPC frame\");\n\t\t}\n\t\treturn record as RpcResponseFrame;\n\t}\n\treturn frame as RpcNativeEventFrame;\n}\n\n/**\n * Reads optional subagent progress metadata. Absent field means unsupported/unavailable\n * (returns undefined); a present field is strictly parsed and throws when invalid.\n * Update/end piggyback envelopes must carry exactly one run (0 or 2+ throws); get_state accepts 0..64 runs.\n * No other frame fields are inspected or validated.\n */\nexport function readRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\ttry {\n\t\treturn extractRpcSubagentProgress(frame);\n\t} catch {\n\t\tthrow new Error(INVALID_PROGRESS_MESSAGE);\n\t}\n}\n\nconst INVALID_PROGRESS_MESSAGE = \"Invalid subagent progress snapshot\";\n\n/** Own data property lookup: never invokes getters; `inherited` is true when only a non-own property exists. */\nfunction readOwnData(target: object, key: string): { found: boolean; value?: unknown; inherited: boolean } {\n\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\tif (descriptor === undefined) return { found: false, inherited: key in target };\n\tif (!(\"value\" in descriptor)) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn { found: true, value: descriptor.value, inherited: false };\n}\n\nfunction extractRpcSubagentProgress(frame: RpcWireFrame): SubagentProgressSnapshot | undefined {\n\tif (!isRecord(frame)) return undefined;\n\tconst type = readOwnData(frame, \"type\").value;\n\tlet carrier: unknown;\n\tlet singleRun = false;\n\tif (type === \"tool_execution_update\" || type === \"tool_execution_end\") {\n\t\tcarrier = frame;\n\t\tsingleRun = true;\n\t} else if (type === \"response\") {\n\t\tif (readOwnData(frame, \"command\").value !== \"get_state\" || readOwnData(frame, \"success\").value !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcarrier = readOwnData(frame, \"data\").value;\n\t} else {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(carrier)) return undefined;\n\tconst field = readOwnData(carrier, SUBAGENT_PROGRESS_FIELD);\n\tif (field.inherited) throw new Error(INVALID_PROGRESS_MESSAGE);\n\tif (!field.found) return undefined;\n\tconst snapshot = parseSubagentProgressSnapshot(field.value);\n\tif (singleRun && snapshot.runs.length !== 1) throw new Error(INVALID_PROGRESS_MESSAGE);\n\treturn snapshot;\n}\n\nfunction isRpcWireCommand(value: unknown): value is RpcWireCommand {\n\tif (!isRecord(value)) return false;\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"message\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.message, MAX_MESSAGE_LENGTH)\n\t\t\t);\n\t\tcase \"abort\":\n\t\tcase \"get_state\":\n\t\t\treturn hasOnlyKeys(value, [\"id\", \"type\"]) && isNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"type\", \"provider\", \"modelId\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.provider, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.modelId, MAX_IDENTIFIER_LENGTH)\n\t\t\t);\n\t\tcase \"switch_session\":\n\t\t\treturn (\n\t\t\t\thasOnlyKeys(value, [\"id\", \"type\", \"sessionPath\"]) &&\n\t\t\t\tisNonemptyBoundedString(value.id, MAX_IDENTIFIER_LENGTH) &&\n\t\t\t\tisNonemptyBoundedString(value.sessionPath, MAX_SESSION_PATH_LENGTH)\n\t\t\t);\n\t\tcase \"flow_status\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\"], [\"runId\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\t(!(\"runId\" in value) || isFlowId(value.runId))\n\t\t\t);\n\t\tcase \"flow_pause\":\n\t\tcase \"flow_resume\":\n\t\t\treturn hasExactKeys(value, [\"id\", \"type\", \"runId\"], []) && isFlowId(value.id) && isFlowId(value.runId);\n\t\tcase \"flow_cancel\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"reason\"], []) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tFLOW_CANCEL_REASONS.includes(value.reason as string)\n\t\t\t);\n\t\tcase \"flow_message\":\n\t\t\treturn (\n\t\t\t\thasExactKeys(value, [\"id\", \"type\", \"runId\", \"messageId\", \"text\"], [\"target\"]) &&\n\t\t\t\tisFlowId(value.id) &&\n\t\t\t\tisFlowId(value.runId) &&\n\t\t\t\tisFlowId(value.messageId) &&\n\t\t\t\tisNonemptyBoundedString(value.text, FLOW_MESSAGE_MAX_LENGTH) &&\n\t\t\t\t(value.target === undefined ||\n\t\t\t\t\tvalue.target === \"lead\" ||\n\t\t\t\t\t(isRecord(value.target) && hasExactKeys(value.target, [\"taskId\"], []) && isFlowId(value.target.taskId)))\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isFlowCommandType(value: unknown): value is FlowCommandType {\n\treturn FLOW_COMMAND_TYPES.includes(value as FlowCommandType);\n}\n\nfunction isFlowId(value: unknown): value is string {\n\treturn typeof value === \"string\" && FLOW_ID_PATTERN.test(value);\n}\n\nfunction hasExactKeys(\n\tvalue: Record<string, unknown>,\n\trequired: readonly string[],\n\toptional: readonly string[],\n): boolean {\n\treturn (\n\t\tObject.keys(value).every((key) => required.includes(key) || optional.includes(key)) &&\n\t\trequired.every((key) => key in value)\n\t);\n}\n\n/** Full receipt validation (state, reason, terminationConfirmed only for cancel, disposition/deliveredTo only for messages). */\nfunction isFlowReceiptFrame(frame: Record<string, unknown>): boolean {\n\tconst message = frame.command === \"flow_message\";\n\tconst cancel = frame.command === \"flow_cancel\";\n\tif (\n\t\t!hasExactKeys(\n\t\t\tframe,\n\t\t\t[\"type\", \"id\", \"command\", \"state\", ...(message ? [\"messageId\", \"disposition\"] : [])],\n\t\t\t[\"reason\", ...(message ? [\"deliveredTo\"] : cancel ? [\"terminationConfirmed\"] : [])],\n\t\t) ||\n\t\tframe.type !== \"response\" ||\n\t\t!isFlowCommandType(frame.command) ||\n\t\t!isFlowId(frame.id) ||\n\t\t!FLOW_RECEIPT_STATES.includes(frame.state as string) ||\n\t\t(frame.reason !== undefined && !FLOW_REASON_CLASSES.includes(frame.reason as string))\n\t) {\n\t\treturn false;\n\t}\n\tif (cancel) return frame.terminationConfirmed === undefined || typeof frame.terminationConfirmed === \"boolean\";\n\tif (!message) return true;\n\tconst delivered = frame.deliveredTo;\n\treturn (\n\t\tisFlowId(frame.messageId) &&\n\t\tFLOW_DISPOSITIONS.includes(frame.disposition as string) &&\n\t\t(delivered === undefined ||\n\t\t\t(isRecord(delivered) &&\n\t\t\t\thasExactKeys(delivered, [\"taskId\", \"role\"], []) &&\n\t\t\t\tisFlowId(delivered.taskId) &&\n\t\t\t\tFLOW_ROLE_NAMES.includes(delivered.role as string)))\n\t);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonemptyBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length > 0 && value.length <= maxLength;\n}\n\nfunction isBoundedString(value: unknown, maxLength: number): value is string {\n\treturn typeof value === \"string\" && value.length <= maxLength;\n}\n\nfunction hasOnlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst keys = Object.keys(value);\n\treturn keys.every((key) => allowed.includes(key)) && allowed.every((key) => key in value || isOptionalKey(key));\n}\n\nfunction isOptionalKey(key: string): boolean {\n\treturn key === \"id\" || key === \"error\" || key === \"data\";\n}\n"]}
|
package/dist/trace-artifact.d.ts
CHANGED
|
@@ -60,7 +60,7 @@ export declare function assertDhCapabilityAction(input: unknown, target: DhCapab
|
|
|
60
60
|
export declare const parseDhContractArtifact: (value: unknown) => {
|
|
61
61
|
readonly schema: "dh.contract-artifact/1";
|
|
62
62
|
readonly packageName: "@humain/humain-code-contracts";
|
|
63
|
-
readonly packageVersion:
|
|
63
|
+
readonly packageVersion: string;
|
|
64
64
|
readonly contractVersion: 1;
|
|
65
65
|
readonly tarballFile: string;
|
|
66
66
|
readonly sha256: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-artifact.d.ts","sourceRoot":"","sources":["../src/trace-artifact.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB;iCACd,0BAA0B;+BAC5B,wBAAwB;EAChC,CAAC;AACZ,oFAAoF;AACpF,wBAAgB,yBAAyB,IAAI,SAAS,MAAM,EAAE,CAiB7D;AAUD,eAAO,MAAM,qBAAqB,YACjC,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,CACH,CAAC;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAyCxE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAepC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACpC,oBAAoB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EACxC,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,CAC/C,CAAC;AACF,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,kBAAkB,GACxB,oBAAoB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAqBzE;AAMD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"trace-artifact.d.ts","sourceRoot":"","sources":["../src/trace-artifact.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB;iCACd,0BAA0B;+BAC5B,wBAAwB;EAChC,CAAC;AACZ,oFAAoF;AACpF,wBAAgB,yBAAyB,IAAI,SAAS,MAAM,EAAE,CAiB7D;AAUD,eAAO,MAAM,qBAAqB,YACjC,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,CACH,CAAC;AACX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAyCxE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAepC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACpC,oBAAoB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EACxC,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,CAC/C,CAAC;AACF,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,kBAAkB,GACxB,oBAAoB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAqBzE;AAMD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;CA0BnC,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC5E,sGAAsG;AACtG,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAChG,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC5C;AAiBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,4BAA4B,GAAG,IAAI,CAmCvG"}
|
package/dist/trace-artifact.js
CHANGED
|
@@ -122,7 +122,8 @@ const relativeFile = Type.String({
|
|
|
122
122
|
export const parseDhContractArtifact = dhStrictDtoParser("contract artifact", () => strict({
|
|
123
123
|
schema: Type.Literal(DH_ARTIFACT_SCHEMA_IDS.contractArtifact),
|
|
124
124
|
packageName: Type.Literal("@humain/humain-code-contracts"),
|
|
125
|
-
|
|
125
|
+
// Recorded frozen 0.3.3 artifact, or any stable 0.4.x (additive ./flow-* exports); patch releases need no edit.
|
|
126
|
+
packageVersion: Type.String({ pattern: "^(?:0\\.3\\.3|0\\.4\\.(?:0|[1-9]\\d*))$" }),
|
|
126
127
|
contractVersion: Type.Literal(1),
|
|
127
128
|
tarballFile: relativeFile,
|
|
128
129
|
sha256: digest,
|
|
@@ -138,6 +139,21 @@ export const parseDhContractArtifact = dhStrictDtoParser("contract artifact", ()
|
|
|
138
139
|
`humain-code-contracts-${artifact.sha256}.capabilities.json`)
|
|
139
140
|
throw new DhContractError("schema_invalid");
|
|
140
141
|
});
|
|
142
|
+
const FLOW_EXPORT = /^\.\/flow-([a-z][a-z0-9-]*)$/;
|
|
143
|
+
/** Trace-era exports must match exactly; the only additions allowed are `./flow-<name>` -> `./dist/flow-<name>.{d.ts,js}`. */
|
|
144
|
+
function exportsAreCompatible(actual, required) {
|
|
145
|
+
const rest = { ...actual };
|
|
146
|
+
for (const [subpath, target] of Object.entries(required)) {
|
|
147
|
+
if (rest[subpath] === undefined || dhCanonicalText(rest[subpath]) !== dhCanonicalText(target))
|
|
148
|
+
return false;
|
|
149
|
+
delete rest[subpath];
|
|
150
|
+
}
|
|
151
|
+
return Object.entries(rest).every(([subpath, target]) => {
|
|
152
|
+
const name = FLOW_EXPORT.exec(subpath)?.[0].slice(2);
|
|
153
|
+
return (name !== undefined &&
|
|
154
|
+
dhCanonicalText(target) === dhCanonicalText({ types: `./dist/${name}.d.ts`, import: `./dist/${name}.js` }));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
141
157
|
export function assertDhContractArtifact(input, inspection) {
|
|
142
158
|
const artifact = parseDhContractArtifact(input);
|
|
143
159
|
assertDhPlainData(inspection);
|
|
@@ -157,7 +173,7 @@ export function assertDhContractArtifact(input, inspection) {
|
|
|
157
173
|
inspection.packageVersion !== artifact.packageVersion ||
|
|
158
174
|
inspection.contractVersion !== 1 ||
|
|
159
175
|
inspection.conformanceVectorSha256 !== artifact.conformanceVectorSha256 ||
|
|
160
|
-
|
|
176
|
+
!exportsAreCompatible(inspection.exports, exports))
|
|
161
177
|
throw new DhContractError("contract_incompatible");
|
|
162
178
|
assertRegistry(inspection.schemaIds);
|
|
163
179
|
const manifest = parseDhCapabilityManifest(inspection.capabilityManifest);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-artifact.js","sourceRoot":"","sources":["../src/trace-artifact.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { assertDhPlainData, DhContractError, dhCanonicalText } from \"./trace-canonical.ts\";\nimport { DH_HTTP_SCHEMA_IDS, dhStrictDtoParser } from \"./trace-http.ts\";\nimport { DH_PAYLOAD_SCHEMA_IDS } from \"./trace-payload.ts\";\nimport { DH_RECORDS_SCHEMA_IDS } from \"./trace-records.ts\";\n\nexport const DH_ARTIFACT_SCHEMA_IDS = Object.freeze({\n\tcapabilityManifest: \"dh.capability-manifest/1\",\n\tcontractArtifact: \"dh.contract-artifact/1\",\n} as const);\n/** Literal implemented IDs only; lazy to preserve /trace entry-order neutrality. */\nexport function getDhImplementedSchemaIds(): readonly string[] {\n\treturn Object.freeze(\n\t\t[\n\t\t\t\"dh.event/1\",\n\t\t\t\"dh.artifact/1\",\n\t\t\t\"dh.ack/1\",\n\t\t\t\"dh.batch/1-proposal\",\n\t\t\t\"dh.canonical-jcs/1\",\n\t\t\t\"dh.export-download/2\",\n\t\t\t\"dh.bundle-frame/1\",\n\t\t\t\"dh.bundle-seal/1\",\n\t\t\t...Object.values(DH_HTTP_SCHEMA_IDS),\n\t\t\t...Object.values(DH_PAYLOAD_SCHEMA_IDS),\n\t\t\t...Object.values(DH_RECORDS_SCHEMA_IDS),\n\t\t\t...Object.values(DH_ARTIFACT_SCHEMA_IDS),\n\t\t].sort(),\n\t);\n}\nconst strict = <const T extends Parameters<typeof Type.Object>[0]>(properties: T) =>\n\tType.Object(properties, { additionalProperties: false });\nconst digest = Type.String({ pattern: \"^[a-f0-9]{64}$\" });\nconst ref = Type.String({ minLength: 1, maxLength: 128, pattern: \"^[A-Za-z0-9_.-]+$\" });\nconst schemaIds = Type.Array(Type.String({ minLength: 1, maxLength: 128 }), {\n\tminItems: 1,\n\tmaxItems: 128,\n\tuniqueItems: true,\n});\nexport const DH_CAPABILITY_ACTIONS = [\n\t\"backgroundStatus\",\n\t\"cancelSelected\",\n\t\"cancelWholeRun\",\n\t\"continueLive\",\n\t\"retryFresh\",\n] as const;\nexport type DhCapabilityAction = (typeof DH_CAPABILITY_ACTIONS)[number];\nfunction actionSupportSchema() {\n\treturn strict({\n\t\tstatus: Type.Enum([\"supported\", \"unsupported\", \"unknown\"] as const),\n\t\tchannel: Type.Enum([\"unix-socket\", \"inherited-fd3\", \"in-process\", \"native-executor\", \"none\"] as const),\n\t\tqualificationSha256: Type.Optional(digest),\n\t\treasonCode: Type.Optional(ref),\n\t});\n}\nfunction capabilitySchema() {\n\treturn strict({\n\t\tschema: Type.Literal(DH_ARTIFACT_SCHEMA_IDS.capabilityManifest),\n\t\tpackageName: Type.Literal(\"@humain/humain-code-contracts\"),\n\t\tpackageVersion: Type.String({ minLength: 1, maxLength: 64 }),\n\t\tcontractVersion: Type.Literal(1),\n\t\tartifactSha256: digest,\n\t\tcanonicalProfile: Type.Literal(\"dh.canonical-jcs/1\"),\n\t\tschemaIds,\n\t\tconformanceVectorSha256: digest,\n\t\truntimes: Type.Array(\n\t\t\tstrict({\n\t\t\t\truntime: Type.Enum([\"cli-node\", \"cli-bun\", \"flow\", \"forge-native\"] as const),\n\t\t\t\tbuildSha256: digest,\n\t\t\t\tmode: ref,\n\t\t\t\tplatform: Type.Enum([\"darwin\", \"linux\", \"win32\"] as const),\n\t\t\t\tactions: strict({\n\t\t\t\t\tbackgroundStatus: actionSupportSchema(),\n\t\t\t\t\tcancelSelected: actionSupportSchema(),\n\t\t\t\t\tcancelWholeRun: actionSupportSchema(),\n\t\t\t\t\tcontinueLive: actionSupportSchema(),\n\t\t\t\t\tretryFresh: actionSupportSchema(),\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t{ maxItems: 128 },\n\t\t),\n\t});\n}\nfunction assertRegistry(ids: readonly string[]): void {\n\tif (dhCanonicalText([...ids].sort()) !== dhCanonicalText(getDhImplementedSchemaIds()))\n\t\tthrow new DhContractError(\"contract_incompatible\");\n}\nexport const parseDhCapabilityManifest = dhStrictDtoParser(\"capability manifest\", capabilitySchema, (manifest) => {\n\tassertRegistry(manifest.schemaIds);\n\tconst targets = new Set<string>();\n\tfor (const runtime of manifest.runtimes) {\n\t\tconst key = dhCanonicalText([runtime.runtime, runtime.buildSha256, runtime.mode, runtime.platform]);\n\t\tif (targets.has(key)) throw new DhContractError(\"schema_invalid\");\n\t\ttargets.add(key);\n\t\tfor (const support of Object.values(runtime.actions)) {\n\t\t\tif (support.status === \"supported\") {\n\t\t\t\tif (support.channel === \"none\" || support.qualificationSha256 === undefined)\n\t\t\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t\t\t} else if (support.reasonCode === undefined || support.qualificationSha256 !== undefined)\n\t\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t\t}\n\t}\n});\nexport type DhCapabilityManifest = ReturnType<typeof parseDhCapabilityManifest>;\nexport type DhCapabilityTarget = Pick<\n\tDhCapabilityManifest[\"runtimes\"][number],\n\t\"runtime\" | \"buildSha256\" | \"mode\" | \"platform\"\n>;\nexport function assertDhCapabilityAction(\n\tinput: unknown,\n\ttarget: DhCapabilityTarget,\n\taction: DhCapabilityAction,\n): DhCapabilityManifest[\"runtimes\"][number][\"actions\"][DhCapabilityAction] {\n\tconst manifest = parseDhCapabilityManifest(input);\n\tassertDhPlainData(target);\n\tif (!(DH_CAPABILITY_ACTIONS as readonly string[]).includes(action)) throw new DhContractError(\"capability_unknown\");\n\tconst runtime = manifest.runtimes.find(\n\t\t(value) =>\n\t\t\tvalue.runtime === target.runtime &&\n\t\t\tvalue.buildSha256 === target.buildSha256 &&\n\t\t\tvalue.mode === target.mode &&\n\t\t\tvalue.platform === target.platform,\n\t);\n\tif (!runtime) throw new DhContractError(\"capability_unknown\");\n\tconst support = runtime.actions[action];\n\tif (\n\t\tsupport.status === \"unsupported\" ||\n\t\ttarget.platform === \"win32\" ||\n\t\t[\"agent-exec-workflow\", \"experimental-transport\"].includes(target.mode)\n\t)\n\t\tthrow new DhContractError(\"capability_unsupported\");\n\tif (support.status !== \"supported\") throw new DhContractError(\"capability_unknown\");\n\treturn support;\n}\nconst relativeFile = Type.String({\n\tminLength: 1,\n\tmaxLength: 512,\n\tpattern: \"^(?!/)(?!.*(?:^|/)\\\\.\\\\.?(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$\",\n});\nexport const parseDhContractArtifact = dhStrictDtoParser(\n\t\"contract artifact\",\n\t() =>\n\t\tstrict({\n\t\t\tschema: Type.Literal(DH_ARTIFACT_SCHEMA_IDS.contractArtifact),\n\t\t\tpackageName: Type.Literal(\"@humain/humain-code-contracts\"),\n\t\t\tpackageVersion: Type.Literal(\"0.3.3\"),\n\t\t\tcontractVersion: Type.Literal(1),\n\t\t\ttarballFile: relativeFile,\n\t\t\tsha256: digest,\n\t\t\tnpmIntegrity: Type.String({ minLength: 1, maxLength: 128, pattern: \"^sha512-[A-Za-z0-9+/]{85}[AQgw]==$\" }),\n\t\t\tcapabilityManifestFile: relativeFile,\n\t\t\tcapabilityManifestSha256: digest,\n\t\t\tconformanceVectorSha256: digest,\n\t\t\tschemaIds,\n\t\t}),\n\t(artifact) => {\n\t\tassertRegistry(artifact.schemaIds);\n\t\tif (\n\t\t\tartifact.tarballFile.split(\"/\").at(-1) !== `humain-code-contracts-${artifact.sha256}.tgz` ||\n\t\t\tartifact.capabilityManifestFile.split(\"/\").at(-1) !==\n\t\t\t\t`humain-code-contracts-${artifact.sha256}.capabilities.json`\n\t\t)\n\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t},\n);\nexport type DhContractArtifact = ReturnType<typeof parseDhContractArtifact>;\n/** Actual file/digest/export inspection is owned by the installer, not inferred from a descriptor. */\nexport interface DhContractArtifactInspection {\n\treadonly packageName: string;\n\treadonly packageVersion: string;\n\treadonly contractVersion: number;\n\treadonly exports: Readonly<Record<string, { readonly types: string; readonly import: string }>>;\n\treadonly distPresent: boolean;\n\treadonly sha256: string;\n\treadonly npmIntegrity: string;\n\treadonly capabilityManifest: unknown;\n\treadonly capabilityManifestSha256: string;\n\treadonly conformanceVectorSha256: string;\n\treadonly schemaIds: readonly string[];\n\treadonly tarballSymlink: boolean;\n\treadonly capabilityManifestSymlink: boolean;\n}\nexport function assertDhContractArtifact(input: unknown, inspection: DhContractArtifactInspection): void {\n\tconst artifact = parseDhContractArtifact(input);\n\tassertDhPlainData(inspection);\n\tif (inspection.distPresent !== true) throw new DhContractError(\"artifact_unbuilt\");\n\tif (\n\t\tinspection.tarballSymlink !== false ||\n\t\tinspection.capabilityManifestSymlink !== false ||\n\t\tinspection.sha256 !== artifact.sha256 ||\n\t\tinspection.npmIntegrity !== artifact.npmIntegrity ||\n\t\tinspection.capabilityManifestSha256 !== artifact.capabilityManifestSha256\n\t)\n\t\tthrow new DhContractError(\"artifact_integrity\");\n\tconst exports = Object.fromEntries(\n\t\t[\"index\", \"orchestration\", \"rpc\", \"trace\", \"testing\"].map((name) => [\n\t\t\tname === \"index\" ? \".\" : `./${name}`,\n\t\t\t{ types: `./dist/${name}.d.ts`, import: `./dist/${name}.js` },\n\t\t]),\n\t);\n\tif (\n\t\tinspection.packageName !== artifact.packageName ||\n\t\tinspection.packageVersion !== artifact.packageVersion ||\n\t\tinspection.contractVersion !== 1 ||\n\t\tinspection.conformanceVectorSha256 !== artifact.conformanceVectorSha256 ||\n\t\tdhCanonicalText(inspection.exports) !== dhCanonicalText(exports)\n\t)\n\t\tthrow new DhContractError(\"contract_incompatible\");\n\tassertRegistry(inspection.schemaIds);\n\tconst manifest = parseDhCapabilityManifest(inspection.capabilityManifest);\n\tif (\n\t\tmanifest.artifactSha256 !== artifact.sha256 ||\n\t\tmanifest.packageVersion !== artifact.packageVersion ||\n\t\tmanifest.conformanceVectorSha256 !== artifact.conformanceVectorSha256 ||\n\t\tdhCanonicalText([...manifest.schemaIds].sort()) !== dhCanonicalText([...artifact.schemaIds].sort())\n\t)\n\t\tthrow new DhContractError(\"contract_incompatible\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"trace-artifact.js","sourceRoot":"","sources":["../src/trace-artifact.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { assertDhPlainData, DhContractError, dhCanonicalText } from \"./trace-canonical.ts\";\nimport { DH_HTTP_SCHEMA_IDS, dhStrictDtoParser } from \"./trace-http.ts\";\nimport { DH_PAYLOAD_SCHEMA_IDS } from \"./trace-payload.ts\";\nimport { DH_RECORDS_SCHEMA_IDS } from \"./trace-records.ts\";\n\nexport const DH_ARTIFACT_SCHEMA_IDS = Object.freeze({\n\tcapabilityManifest: \"dh.capability-manifest/1\",\n\tcontractArtifact: \"dh.contract-artifact/1\",\n} as const);\n/** Literal implemented IDs only; lazy to preserve /trace entry-order neutrality. */\nexport function getDhImplementedSchemaIds(): readonly string[] {\n\treturn Object.freeze(\n\t\t[\n\t\t\t\"dh.event/1\",\n\t\t\t\"dh.artifact/1\",\n\t\t\t\"dh.ack/1\",\n\t\t\t\"dh.batch/1-proposal\",\n\t\t\t\"dh.canonical-jcs/1\",\n\t\t\t\"dh.export-download/2\",\n\t\t\t\"dh.bundle-frame/1\",\n\t\t\t\"dh.bundle-seal/1\",\n\t\t\t...Object.values(DH_HTTP_SCHEMA_IDS),\n\t\t\t...Object.values(DH_PAYLOAD_SCHEMA_IDS),\n\t\t\t...Object.values(DH_RECORDS_SCHEMA_IDS),\n\t\t\t...Object.values(DH_ARTIFACT_SCHEMA_IDS),\n\t\t].sort(),\n\t);\n}\nconst strict = <const T extends Parameters<typeof Type.Object>[0]>(properties: T) =>\n\tType.Object(properties, { additionalProperties: false });\nconst digest = Type.String({ pattern: \"^[a-f0-9]{64}$\" });\nconst ref = Type.String({ minLength: 1, maxLength: 128, pattern: \"^[A-Za-z0-9_.-]+$\" });\nconst schemaIds = Type.Array(Type.String({ minLength: 1, maxLength: 128 }), {\n\tminItems: 1,\n\tmaxItems: 128,\n\tuniqueItems: true,\n});\nexport const DH_CAPABILITY_ACTIONS = [\n\t\"backgroundStatus\",\n\t\"cancelSelected\",\n\t\"cancelWholeRun\",\n\t\"continueLive\",\n\t\"retryFresh\",\n] as const;\nexport type DhCapabilityAction = (typeof DH_CAPABILITY_ACTIONS)[number];\nfunction actionSupportSchema() {\n\treturn strict({\n\t\tstatus: Type.Enum([\"supported\", \"unsupported\", \"unknown\"] as const),\n\t\tchannel: Type.Enum([\"unix-socket\", \"inherited-fd3\", \"in-process\", \"native-executor\", \"none\"] as const),\n\t\tqualificationSha256: Type.Optional(digest),\n\t\treasonCode: Type.Optional(ref),\n\t});\n}\nfunction capabilitySchema() {\n\treturn strict({\n\t\tschema: Type.Literal(DH_ARTIFACT_SCHEMA_IDS.capabilityManifest),\n\t\tpackageName: Type.Literal(\"@humain/humain-code-contracts\"),\n\t\tpackageVersion: Type.String({ minLength: 1, maxLength: 64 }),\n\t\tcontractVersion: Type.Literal(1),\n\t\tartifactSha256: digest,\n\t\tcanonicalProfile: Type.Literal(\"dh.canonical-jcs/1\"),\n\t\tschemaIds,\n\t\tconformanceVectorSha256: digest,\n\t\truntimes: Type.Array(\n\t\t\tstrict({\n\t\t\t\truntime: Type.Enum([\"cli-node\", \"cli-bun\", \"flow\", \"forge-native\"] as const),\n\t\t\t\tbuildSha256: digest,\n\t\t\t\tmode: ref,\n\t\t\t\tplatform: Type.Enum([\"darwin\", \"linux\", \"win32\"] as const),\n\t\t\t\tactions: strict({\n\t\t\t\t\tbackgroundStatus: actionSupportSchema(),\n\t\t\t\t\tcancelSelected: actionSupportSchema(),\n\t\t\t\t\tcancelWholeRun: actionSupportSchema(),\n\t\t\t\t\tcontinueLive: actionSupportSchema(),\n\t\t\t\t\tretryFresh: actionSupportSchema(),\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t{ maxItems: 128 },\n\t\t),\n\t});\n}\nfunction assertRegistry(ids: readonly string[]): void {\n\tif (dhCanonicalText([...ids].sort()) !== dhCanonicalText(getDhImplementedSchemaIds()))\n\t\tthrow new DhContractError(\"contract_incompatible\");\n}\nexport const parseDhCapabilityManifest = dhStrictDtoParser(\"capability manifest\", capabilitySchema, (manifest) => {\n\tassertRegistry(manifest.schemaIds);\n\tconst targets = new Set<string>();\n\tfor (const runtime of manifest.runtimes) {\n\t\tconst key = dhCanonicalText([runtime.runtime, runtime.buildSha256, runtime.mode, runtime.platform]);\n\t\tif (targets.has(key)) throw new DhContractError(\"schema_invalid\");\n\t\ttargets.add(key);\n\t\tfor (const support of Object.values(runtime.actions)) {\n\t\t\tif (support.status === \"supported\") {\n\t\t\t\tif (support.channel === \"none\" || support.qualificationSha256 === undefined)\n\t\t\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t\t\t} else if (support.reasonCode === undefined || support.qualificationSha256 !== undefined)\n\t\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t\t}\n\t}\n});\nexport type DhCapabilityManifest = ReturnType<typeof parseDhCapabilityManifest>;\nexport type DhCapabilityTarget = Pick<\n\tDhCapabilityManifest[\"runtimes\"][number],\n\t\"runtime\" | \"buildSha256\" | \"mode\" | \"platform\"\n>;\nexport function assertDhCapabilityAction(\n\tinput: unknown,\n\ttarget: DhCapabilityTarget,\n\taction: DhCapabilityAction,\n): DhCapabilityManifest[\"runtimes\"][number][\"actions\"][DhCapabilityAction] {\n\tconst manifest = parseDhCapabilityManifest(input);\n\tassertDhPlainData(target);\n\tif (!(DH_CAPABILITY_ACTIONS as readonly string[]).includes(action)) throw new DhContractError(\"capability_unknown\");\n\tconst runtime = manifest.runtimes.find(\n\t\t(value) =>\n\t\t\tvalue.runtime === target.runtime &&\n\t\t\tvalue.buildSha256 === target.buildSha256 &&\n\t\t\tvalue.mode === target.mode &&\n\t\t\tvalue.platform === target.platform,\n\t);\n\tif (!runtime) throw new DhContractError(\"capability_unknown\");\n\tconst support = runtime.actions[action];\n\tif (\n\t\tsupport.status === \"unsupported\" ||\n\t\ttarget.platform === \"win32\" ||\n\t\t[\"agent-exec-workflow\", \"experimental-transport\"].includes(target.mode)\n\t)\n\t\tthrow new DhContractError(\"capability_unsupported\");\n\tif (support.status !== \"supported\") throw new DhContractError(\"capability_unknown\");\n\treturn support;\n}\nconst relativeFile = Type.String({\n\tminLength: 1,\n\tmaxLength: 512,\n\tpattern: \"^(?!/)(?!.*(?:^|/)\\\\.\\\\.?(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$\",\n});\nexport const parseDhContractArtifact = dhStrictDtoParser(\n\t\"contract artifact\",\n\t() =>\n\t\tstrict({\n\t\t\tschema: Type.Literal(DH_ARTIFACT_SCHEMA_IDS.contractArtifact),\n\t\t\tpackageName: Type.Literal(\"@humain/humain-code-contracts\"),\n\t\t\t// Recorded frozen 0.3.3 artifact, or any stable 0.4.x (additive ./flow-* exports); patch releases need no edit.\n\t\t\tpackageVersion: Type.String({ pattern: \"^(?:0\\\\.3\\\\.3|0\\\\.4\\\\.(?:0|[1-9]\\\\d*))$\" }),\n\t\t\tcontractVersion: Type.Literal(1),\n\t\t\ttarballFile: relativeFile,\n\t\t\tsha256: digest,\n\t\t\tnpmIntegrity: Type.String({ minLength: 1, maxLength: 128, pattern: \"^sha512-[A-Za-z0-9+/]{85}[AQgw]==$\" }),\n\t\t\tcapabilityManifestFile: relativeFile,\n\t\t\tcapabilityManifestSha256: digest,\n\t\t\tconformanceVectorSha256: digest,\n\t\t\tschemaIds,\n\t\t}),\n\t(artifact) => {\n\t\tassertRegistry(artifact.schemaIds);\n\t\tif (\n\t\t\tartifact.tarballFile.split(\"/\").at(-1) !== `humain-code-contracts-${artifact.sha256}.tgz` ||\n\t\t\tartifact.capabilityManifestFile.split(\"/\").at(-1) !==\n\t\t\t\t`humain-code-contracts-${artifact.sha256}.capabilities.json`\n\t\t)\n\t\t\tthrow new DhContractError(\"schema_invalid\");\n\t},\n);\nexport type DhContractArtifact = ReturnType<typeof parseDhContractArtifact>;\n/** Actual file/digest/export inspection is owned by the installer, not inferred from a descriptor. */\nexport interface DhContractArtifactInspection {\n\treadonly packageName: string;\n\treadonly packageVersion: string;\n\treadonly contractVersion: number;\n\treadonly exports: Readonly<Record<string, { readonly types: string; readonly import: string }>>;\n\treadonly distPresent: boolean;\n\treadonly sha256: string;\n\treadonly npmIntegrity: string;\n\treadonly capabilityManifest: unknown;\n\treadonly capabilityManifestSha256: string;\n\treadonly conformanceVectorSha256: string;\n\treadonly schemaIds: readonly string[];\n\treadonly tarballSymlink: boolean;\n\treadonly capabilityManifestSymlink: boolean;\n}\nconst FLOW_EXPORT = /^\\.\\/flow-([a-z][a-z0-9-]*)$/;\n/** Trace-era exports must match exactly; the only additions allowed are `./flow-<name>` -> `./dist/flow-<name>.{d.ts,js}`. */\nfunction exportsAreCompatible(actual: DhContractArtifactInspection[\"exports\"], required: typeof actual): boolean {\n\tconst rest: Record<string, (typeof actual)[string]> = { ...actual };\n\tfor (const [subpath, target] of Object.entries(required)) {\n\t\tif (rest[subpath] === undefined || dhCanonicalText(rest[subpath]) !== dhCanonicalText(target)) return false;\n\t\tdelete rest[subpath];\n\t}\n\treturn Object.entries(rest).every(([subpath, target]) => {\n\t\tconst name = FLOW_EXPORT.exec(subpath)?.[0].slice(2);\n\t\treturn (\n\t\t\tname !== undefined &&\n\t\t\tdhCanonicalText(target) === dhCanonicalText({ types: `./dist/${name}.d.ts`, import: `./dist/${name}.js` })\n\t\t);\n\t});\n}\nexport function assertDhContractArtifact(input: unknown, inspection: DhContractArtifactInspection): void {\n\tconst artifact = parseDhContractArtifact(input);\n\tassertDhPlainData(inspection);\n\tif (inspection.distPresent !== true) throw new DhContractError(\"artifact_unbuilt\");\n\tif (\n\t\tinspection.tarballSymlink !== false ||\n\t\tinspection.capabilityManifestSymlink !== false ||\n\t\tinspection.sha256 !== artifact.sha256 ||\n\t\tinspection.npmIntegrity !== artifact.npmIntegrity ||\n\t\tinspection.capabilityManifestSha256 !== artifact.capabilityManifestSha256\n\t)\n\t\tthrow new DhContractError(\"artifact_integrity\");\n\tconst exports = Object.fromEntries(\n\t\t[\"index\", \"orchestration\", \"rpc\", \"trace\", \"testing\"].map((name) => [\n\t\t\tname === \"index\" ? \".\" : `./${name}`,\n\t\t\t{ types: `./dist/${name}.d.ts`, import: `./dist/${name}.js` },\n\t\t]),\n\t);\n\tif (\n\t\tinspection.packageName !== artifact.packageName ||\n\t\tinspection.packageVersion !== artifact.packageVersion ||\n\t\tinspection.contractVersion !== 1 ||\n\t\tinspection.conformanceVectorSha256 !== artifact.conformanceVectorSha256 ||\n\t\t!exportsAreCompatible(inspection.exports, exports)\n\t)\n\t\tthrow new DhContractError(\"contract_incompatible\");\n\tassertRegistry(inspection.schemaIds);\n\tconst manifest = parseDhCapabilityManifest(inspection.capabilityManifest);\n\tif (\n\t\tmanifest.artifactSha256 !== artifact.sha256 ||\n\t\tmanifest.packageVersion !== artifact.packageVersion ||\n\t\tmanifest.conformanceVectorSha256 !== artifact.conformanceVectorSha256 ||\n\t\tdhCanonicalText([...manifest.schemaIds].sort()) !== dhCanonicalText([...artifact.schemaIds].sort())\n\t)\n\t\tthrow new DhContractError(\"contract_incompatible\");\n}\n"]}
|