@humain/humain-code 0.3.8 → 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 +45 -0
- package/dist/bundle/agent-monitor.js +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +45 -39
- package/dist/bundle/chunks/{chunk-REZ7FW4X.js → chunk-2KKLZK2N.js} +1 -1
- package/dist/bundle/chunks/{chunk-3ZYKCI45.js → chunk-3ZI2TEVB.js} +1 -1
- package/dist/bundle/chunks/{chunk-WQN4VIAM.js → chunk-7LDXR4AN.js} +424 -378
- package/dist/bundle/chunks/{chunk-YEG6NREY.js → chunk-DUZY4PDA.js} +16 -16
- package/dist/bundle/chunks/{chunk-QJZ5QYKE.js → chunk-E22S6D55.js} +1 -1
- package/dist/bundle/chunks/{chunk-74L7EWMA.js → chunk-E7WGCXWK.js} +1 -1
- package/dist/bundle/chunks/{chunk-MNB52OYZ.js → chunk-ERT2BD7V.js} +36 -36
- package/dist/bundle/chunks/{chunk-2KVH67UZ.js → chunk-H5CZL7M5.js} +1 -1
- package/dist/bundle/chunks/{chunk-TEOX3AWC.js → chunk-ICLZNV4V.js} +2 -2
- package/dist/bundle/chunks/{chunk-VHVY22A2.js → chunk-JQZ7BIAI.js} +2 -13
- package/dist/bundle/chunks/{chunk-HL54JCNV.js → chunk-KMMH6Z2Y.js} +3 -3
- package/dist/bundle/chunks/{chunk-6HQRNHO7.js → chunk-N23FFKJU.js} +40 -25
- package/dist/bundle/chunks/{chunk-X5JUC5RE.js → chunk-OXJXKCLB.js} +1 -1
- package/dist/bundle/chunks/{chunk-QWB2GGVH.js → chunk-OYDXJK4L.js} +731 -736
- package/dist/bundle/chunks/{chunk-7CYWKPFS.js → chunk-UBQSONVR.js} +9 -8
- package/dist/bundle/chunks/{chunk-6MMGBL46.js → chunk-VZV7GLZT.js} +2 -2
- package/dist/bundle/chunks/{chunk-FF26YENK.js → chunk-W2QRCQBX.js} +4 -3
- package/dist/bundle/chunks/{cli-5NYUGRWC.js → cli-5YRA5PFB.js} +2 -2
- package/dist/bundle/chunks/{compat-UPJNJCGF.js → compat-GXD2ZGMZ.js} +1 -1
- package/dist/bundle/chunks/dist-IKSCGVMG.js +1953 -0
- package/dist/bundle/chunks/{easter-egg-3d-XUJ4HNAR.js → easter-egg-3d-ARXMB2RN.js} +1 -1
- package/dist/bundle/chunks/{esm-763X2IA7.js → esm-NCUV2DF7.js} +1 -1
- package/dist/bundle/chunks/{event-streams-4Q22QRY2.js → event-streams-CGCQQL5M.js} +1 -1
- package/dist/bundle/chunks/{execute-IAU7EI3P.js → execute-KEUC5IWA.js} +1 -1
- package/dist/bundle/chunks/{extract-QIC545HI.js → extract-WUAT5T4V.js} +4 -4
- package/dist/bundle/chunks/{google-generative-ai-ICWD4YIE.js → google-generative-ai-MDUVUFFQ.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-XIACVW6H.js → google-vertex-UQGG6LEW.js} +1 -1
- package/dist/bundle/chunks/{host-QBIXSMNN.js → host-SPBJ4YAA.js} +1 -1
- package/dist/bundle/chunks/{node-W47VUEGE.js → node-XGNY74WT.js} +1 -1
- package/dist/bundle/chunks/{runtime-NBGMTCI6.js → runtime-HBWXEJT3.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-P2MH665T.js → virtual-modules-BYOLP3HY.js} +2 -2
- package/dist/bundle/cli-runtime.js +2 -2
- package/dist/bundle/flow/agents/.gitkeep +0 -0
- package/dist/bundle/flow/agents/orch-architect.md +33 -0
- package/dist/bundle/flow/agents/orch-implementation-fast.md +13 -0
- package/dist/bundle/flow/agents/orch-implementation-strong.md +28 -0
- package/dist/bundle/flow/agents/orch-qa-agent.md +29 -0
- package/dist/bundle/flow/agents/orch-scout.md +35 -0
- package/dist/bundle/flow/agents/orch-security-review.md +28 -0
- package/dist/bundle/flow/agents/orch-technical-lead.md +37 -0
- package/dist/bundle/flow/agents/orch-technical-review.md +28 -0
- package/dist/bundle/flow/agents/orch-worker.md +13 -0
- package/dist/bundle/flow/agents/orchestrator-lead.md +55 -0
- package/dist/bundle/flow/assets/.gitkeep +0 -0
- package/dist/bundle/flow/assets/contract.json +84 -0
- package/dist/bundle/flow/assets/forge-protocol-schema.sha256 +1 -0
- package/dist/bundle/flow/assets/method.json +193 -0
- package/dist/bundle/flow/assets/orchestrator-profiles.json +131 -0
- package/dist/bundle/flow/assets/profiles/anthropic.json +189 -0
- package/dist/bundle/flow/assets/profiles/openai.json +177 -0
- package/dist/bundle/flow/assets/profiles/oss-first.json +236 -0
- package/dist/bundle/flow/assets/profiles/premium.json +203 -0
- package/dist/bundle/flow/package.json +48 -0
- package/dist/bundle/index.js +5 -5
- package/dist/bundle/rpc-entry.js +2 -2
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/core/tools/subagent.d.ts +20 -0
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +124 -12
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/humain/flow-loader.d.ts +62 -0
- package/dist/humain/flow-loader.d.ts.map +1 -0
- package/dist/humain/flow-loader.js +291 -0
- package/dist/humain/flow-loader.js.map +1 -0
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js +2 -0
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/trace-capture/child-launch.d.ts +1 -0
- package/dist/humain/trace-capture/child-launch.d.ts.map +1 -1
- package/dist/humain/trace-capture/child-launch.js +2 -1
- package/dist/humain/trace-capture/child-launch.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +136 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/docs/docs.json +8 -0
- package/docs/environment-variables.md +1 -0
- package/docs/flow-profiles.md +173 -0
- package/docs/flow.md +112 -0
- package/docs/index.md +2 -0
- package/npm-shrinkwrap.json +6 -6
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAc/E,OAAO,EAGN,wBAAwB,EACxB,MAAM,uCAAuC,CAAC;AAa/C,OAAO,KAAK,EAKX,WAAW,EACX,eAAe,EAEf,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACX,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,eAAe,GACf,MAAM,gBAAgB,CAAC;AAmIxB;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,GAAG,SAAS,GAC5C,WAAW,CA6Bb;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CAo/BjF"}
|
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
* - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
|
|
12
12
|
*/
|
|
13
13
|
import * as crypto from "node:crypto";
|
|
14
|
+
import { parseFlowControlCommandV1, } from "@humain/humain-code-contracts/flow-control";
|
|
14
15
|
import { MAX_GET_STATE_RESPONSE_CODE_UNITS, MAX_GET_STATE_RESPONSE_UTF8_BYTES, MAX_RPC_FRAME_LENGTH, } from "@humain/humain-code-contracts/rpc";
|
|
15
16
|
import { trackUserWait } from "../../agent-monitor/user-wait.js";
|
|
16
17
|
import { flushRawStdout, takeOverStdout, waitForRawStdoutBackpressure, writeRawStdout, } from "../../core/output-guard.js";
|
|
17
18
|
import { DISABLED_SUBAGENT_RUN_OBSERVER, SubagentProgressRegistry, } from "../../core/tools/subagent-progress.js";
|
|
19
|
+
import { getFlowRpcControl, loadFlowRpcControl, setFlowRpcFollowUp, setFlowRpcOutput, } from "../../humain/flow-loader.js";
|
|
18
20
|
import { closeSessionFlowControl } from "../../humain/trace-capture/control-host.js";
|
|
19
21
|
import { killTrackedDetachedChildren, killTrackedDetachedChildrenAsync } from "../../utils/shell.js";
|
|
20
22
|
import { theme } from "../interactive/theme/theme.js";
|
|
@@ -26,6 +28,26 @@ const MAX_RPC_INPUT_LINE_LENGTH = MAX_RPC_FRAME_LENGTH;
|
|
|
26
28
|
function isRecord(value) {
|
|
27
29
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
30
|
}
|
|
31
|
+
// Mirrors FLOW_COMMAND_TYPES in @humain/humain-code-contracts/rpc (not exported there).
|
|
32
|
+
const FLOW_RPC_COMMAND_TYPES = new Set(["flow_status", "flow_pause", "flow_resume", "flow_cancel", "flow_message"]);
|
|
33
|
+
// Concurrent flow_* handlers (cancel can wait seconds for confirmation); beyond this, commands are rejected.
|
|
34
|
+
const MAX_INFLIGHT_FLOW_COMMANDS = 32;
|
|
35
|
+
const MAX_QUEUED_FLOW_FOLLOW_UPS = 64;
|
|
36
|
+
/** Rejected receipt for a flow_* command that cannot be served (Flow not loaded or saturated). */
|
|
37
|
+
function rejectedFlowReceipt(command, reason = "config_invalid") {
|
|
38
|
+
if (command.type === "flow_message") {
|
|
39
|
+
return {
|
|
40
|
+
type: "response",
|
|
41
|
+
id: command.id,
|
|
42
|
+
command: "flow_message",
|
|
43
|
+
messageId: command.messageId,
|
|
44
|
+
state: "rejected",
|
|
45
|
+
reason,
|
|
46
|
+
disposition: "rejected",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { type: "response", id: command.id, command: command.type, state: "rejected", reason };
|
|
50
|
+
}
|
|
29
51
|
function invalidRpcCommand(command) {
|
|
30
52
|
if (command.id !== undefined && typeof command.id !== "string")
|
|
31
53
|
return "id must be a string";
|
|
@@ -179,6 +201,25 @@ export async function runRpcMode(runtimeHost) {
|
|
|
179
201
|
const output = (obj) => {
|
|
180
202
|
writeRawStdout(serializeJsonLine(obj));
|
|
181
203
|
};
|
|
204
|
+
// Flow's run-control hook writes flow_event frames through the same stdout path.
|
|
205
|
+
// Returning the completion lets the frame sink / emitter apply their backpressure bound.
|
|
206
|
+
setFlowRpcOutput((frame) => {
|
|
207
|
+
output(frame);
|
|
208
|
+
return waitForRawStdoutBackpressure();
|
|
209
|
+
});
|
|
210
|
+
// Direct-mode flow_message (no Flow run): Flow queues host follow-ups through this, bounded by the pending count.
|
|
211
|
+
let reservedFollowUps = 0;
|
|
212
|
+
setFlowRpcFollowUp(async (text) => {
|
|
213
|
+
if (session.getFollowUpMessages().length + reservedFollowUps >= MAX_QUEUED_FLOW_FOLLOW_UPS)
|
|
214
|
+
throw new Error("follow-up queue full");
|
|
215
|
+
reservedFollowUps++;
|
|
216
|
+
try {
|
|
217
|
+
await session.followUp(text, undefined, { source: "rpc" });
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
reservedFollowUps--;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
182
223
|
const success = (id, command, data) => {
|
|
183
224
|
if (data === undefined) {
|
|
184
225
|
return { id, type: "response", command, success: true };
|
|
@@ -528,7 +569,39 @@ export async function runRpcMode(runtimeHost) {
|
|
|
528
569
|
return success(id, "follow_up", { disposition });
|
|
529
570
|
}
|
|
530
571
|
case "abort": {
|
|
531
|
-
|
|
572
|
+
// An active Flow run is cancelled too (flow_cancel{reason:"user"}), not just the native session turn.
|
|
573
|
+
const flowRunId = getFlowRpcControl()?.activeRunId();
|
|
574
|
+
const cancelFlow = async () => {
|
|
575
|
+
if (!flowRunId)
|
|
576
|
+
return undefined;
|
|
577
|
+
if (abortFlowWaiters >= MAX_INFLIGHT_FLOW_COMMANDS)
|
|
578
|
+
return "Flow cancel rejected (internal)";
|
|
579
|
+
// One in-flight Flow cancel per run, admitted through the bounded flow_* limit.
|
|
580
|
+
let pending = abortFlowCancels.get(flowRunId);
|
|
581
|
+
if (!pending) {
|
|
582
|
+
pending = submitFlowCommand({
|
|
583
|
+
id: `abort-${crypto.randomUUID()}`,
|
|
584
|
+
type: "flow_cancel",
|
|
585
|
+
runId: flowRunId,
|
|
586
|
+
reason: "user",
|
|
587
|
+
}).finally(() => abortFlowCancels.delete(flowRunId));
|
|
588
|
+
abortFlowCancels.set(flowRunId, pending);
|
|
589
|
+
}
|
|
590
|
+
abortFlowWaiters++;
|
|
591
|
+
try {
|
|
592
|
+
const { receipt } = await pending;
|
|
593
|
+
return receipt.state === "rejected" ? `Flow cancel rejected (${receipt.reason})` : undefined;
|
|
594
|
+
}
|
|
595
|
+
catch (flowError) {
|
|
596
|
+
return flowError instanceof Error ? flowError.message : String(flowError);
|
|
597
|
+
}
|
|
598
|
+
finally {
|
|
599
|
+
abortFlowWaiters--;
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
const [, flowFailure] = await Promise.all([session.abort(), cancelFlow()]);
|
|
603
|
+
if (flowFailure)
|
|
604
|
+
return error(id, "abort", flowFailure);
|
|
532
605
|
return success(id, "abort");
|
|
533
606
|
}
|
|
534
607
|
case "clear_queue": {
|
|
@@ -806,6 +879,64 @@ export async function runRpcMode(runtimeHost) {
|
|
|
806
879
|
return;
|
|
807
880
|
await shutdown();
|
|
808
881
|
}
|
|
882
|
+
let inflightFlowCommands = 0;
|
|
883
|
+
let flowRpcControlPromise;
|
|
884
|
+
let abortFlowWaiters = 0;
|
|
885
|
+
const abortFlowCancels = new Map();
|
|
886
|
+
// Flow is never imported here: without a loaded Flow the hook is absent and the command is rejected.
|
|
887
|
+
// "Not loaded" and "saturated" rejections are transient (state of this process, not of the command), so they
|
|
888
|
+
// bypass Flow's replay store and may succeed on a retry under the same id.
|
|
889
|
+
const submitFlowCommand = async (command) => {
|
|
890
|
+
if (inflightFlowCommands >= MAX_INFLIGHT_FLOW_COMMANDS)
|
|
891
|
+
return { receipt: rejectedFlowReceipt(command, "internal") };
|
|
892
|
+
inflightFlowCommands++;
|
|
893
|
+
try {
|
|
894
|
+
// flow_message with no Flow loaded loads it so Flow's handler owns replay, targeting and queueing.
|
|
895
|
+
const loadedFlow = getFlowRpcControl();
|
|
896
|
+
if (!loadedFlow && command.type === "flow_message")
|
|
897
|
+
flowRpcControlPromise ??= loadFlowRpcControl();
|
|
898
|
+
const flow = loadedFlow ?? (flowRpcControlPromise ? await flowRpcControlPromise : undefined);
|
|
899
|
+
if (flow)
|
|
900
|
+
return await flow.handle(command);
|
|
901
|
+
return { receipt: rejectedFlowReceipt(command) };
|
|
902
|
+
}
|
|
903
|
+
finally {
|
|
904
|
+
inflightFlowCommands--;
|
|
905
|
+
}
|
|
906
|
+
};
|
|
907
|
+
const handleFlowCommand = async (parsed) => {
|
|
908
|
+
let command;
|
|
909
|
+
try {
|
|
910
|
+
command = parseFlowControlCommandV1(parsed);
|
|
911
|
+
}
|
|
912
|
+
catch (parseError) {
|
|
913
|
+
// A well-formed flow_message whose only defect is empty/over-max text is a refusal, not a malformed command.
|
|
914
|
+
if (parsed.type === "flow_message" && typeof parsed.text === "string") {
|
|
915
|
+
try {
|
|
916
|
+
const probe = parseFlowControlCommandV1({ ...parsed, text: "x" });
|
|
917
|
+
output(rejectedFlowReceipt(probe));
|
|
918
|
+
await waitForRawStdoutBackpressure();
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
catch {
|
|
922
|
+
// Another field is invalid: fall through to the error response.
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
output(error(typeof parsed.id === "string" ? parsed.id : undefined, String(parsed.type), `Invalid command: ${parseError instanceof Error ? parseError.message : String(parseError)}`));
|
|
926
|
+
await waitForRawStdoutBackpressure();
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
try {
|
|
930
|
+
const result = await submitFlowCommand(command);
|
|
931
|
+
output(result.receipt);
|
|
932
|
+
if (result.status)
|
|
933
|
+
output({ type: "flow_status", status: result.status });
|
|
934
|
+
}
|
|
935
|
+
catch (flowError) {
|
|
936
|
+
output(error(command.id, command.type, flowError instanceof Error ? flowError.message : String(flowError)));
|
|
937
|
+
}
|
|
938
|
+
await waitForRawStdoutBackpressure();
|
|
939
|
+
};
|
|
809
940
|
const handleInputLine = async (line) => {
|
|
810
941
|
let parsed;
|
|
811
942
|
try {
|
|
@@ -836,6 +967,10 @@ export async function runRpcMode(runtimeHost) {
|
|
|
836
967
|
}
|
|
837
968
|
return;
|
|
838
969
|
}
|
|
970
|
+
if (typeof parsed.type === "string" && FLOW_RPC_COMMAND_TYPES.has(parsed.type)) {
|
|
971
|
+
await handleFlowCommand(parsed);
|
|
972
|
+
return;
|
|
973
|
+
}
|
|
839
974
|
const invalid = invalidRpcCommand(parsed);
|
|
840
975
|
if (invalid) {
|
|
841
976
|
output(error(typeof parsed.id === "string" ? parsed.id : undefined, typeof parsed.type === "string" ? parsed.type : "parse", `Invalid command: ${invalid}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport {\n\tMAX_GET_STATE_RESPONSE_CODE_UNITS,\n\tMAX_GET_STATE_RESPONSE_UTF8_BYTES,\n\tMAX_RPC_FRAME_LENGTH,\n} from \"@humain/humain-code-contracts/rpc\";\nimport { trackUserWait } from \"../../agent-monitor/user-wait.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tWorkingIndicatorOptions,\n} from \"../../core/extensions/index.ts\";\nimport type { ExtensionRunner } from \"../../core/extensions/runner.ts\";\nimport {\n\tflushRawStdout,\n\ttakeOverStdout,\n\twaitForRawStdoutBackpressure,\n\twriteRawStdout,\n} from \"../../core/output-guard.ts\";\nimport {\n\tDISABLED_SUBAGENT_RUN_OBSERVER,\n\ttype SubagentProgressCapability,\n\tSubagentProgressRegistry,\n} from \"../../core/tools/subagent-progress.ts\";\nimport { closeSessionFlowControl } from \"../../humain/trace-capture/control-host.ts\";\nimport { killTrackedDetachedChildren, killTrackedDetachedChildrenAsync } from \"../../utils/shell.ts\";\nimport { type Theme, theme } from \"../interactive/theme/theme.ts\";\nimport { toJsonEvent } from \"../json-event.ts\";\nimport { exitAfterSignalShutdown } from \"../signal-shutdown.ts\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.ts\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcReadyEvent,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcReadyEvent,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\n\n// Bounds the UTF-16 string retained by the JSONL reader for one persistent RPC command.\nconst MAX_RPC_INPUT_LINE_LENGTH = MAX_RPC_FRAME_LENGTH;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction invalidRpcCommand(command: Record<string, unknown>): string | undefined {\n\tif (command.id !== undefined && typeof command.id !== \"string\") return \"id must be a string\";\n\tif (typeof command.type !== \"string\" || command.type.length === 0) return \"expected a non-empty string type\";\n\n\tconst requireString = (field: string): string | undefined =>\n\t\ttypeof command[field] === \"string\" ? undefined : `${command.type}.${field} must be a string`;\n\tconst requireOptionalString = (field: string): string | undefined =>\n\t\tcommand[field] === undefined || typeof command[field] === \"string\"\n\t\t\t? undefined\n\t\t\t: `${command.type}.${field} must be a string`;\n\tconst requireBoolean = (field: string): string | undefined =>\n\t\ttypeof command[field] === \"boolean\" ? undefined : `${command.type}.${field} must be a boolean`;\n\n\tswitch (command.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\trequireString(\"message\") ??\n\t\t\t\t(command.images === undefined || Array.isArray(command.images)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"prompt.images must be an array\") ??\n\t\t\t\t(command.streamingBehavior === undefined ||\n\t\t\t\tcommand.streamingBehavior === \"steer\" ||\n\t\t\t\tcommand.streamingBehavior === \"followUp\"\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"prompt.streamingBehavior must be steer or followUp\")\n\t\t\t);\n\t\tcase \"steer\":\n\t\tcase \"follow_up\":\n\t\t\treturn (\n\t\t\t\trequireString(\"message\") ??\n\t\t\t\t(command.images === undefined || Array.isArray(command.images)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: `${command.type}.images must be an array`)\n\t\t\t);\n\t\tcase \"new_session\":\n\t\t\treturn requireOptionalString(\"parentSession\");\n\t\tcase \"set_model\":\n\t\t\treturn requireString(\"provider\") ?? requireString(\"modelId\");\n\t\tcase \"set_thinking_level\":\n\t\t\treturn requireString(\"level\");\n\t\tcase \"set_steering_mode\":\n\t\tcase \"set_follow_up_mode\":\n\t\t\treturn command.mode === \"all\" || command.mode === \"one-at-a-time\"\n\t\t\t\t? undefined\n\t\t\t\t: `${command.type}.mode must be all or one-at-a-time`;\n\t\tcase \"compact\":\n\t\t\treturn requireOptionalString(\"customInstructions\");\n\t\tcase \"set_auto_compaction\":\n\t\tcase \"set_auto_retry\":\n\t\t\treturn requireBoolean(\"enabled\");\n\t\tcase \"bash\":\n\t\t\treturn (\n\t\t\t\trequireString(\"command\") ??\n\t\t\t\t(command.excludeFromContext === undefined || typeof command.excludeFromContext === \"boolean\"\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"bash.excludeFromContext must be a boolean\")\n\t\t\t);\n\t\tcase \"export_html\":\n\t\t\treturn requireOptionalString(\"outputPath\");\n\t\tcase \"switch_session\":\n\t\t\treturn requireString(\"sessionPath\");\n\t\tcase \"fork\":\n\t\t\treturn requireString(\"entryId\");\n\t\tcase \"get_entries\":\n\t\t\treturn requireOptionalString(\"since\");\n\t\tcase \"set_session_name\":\n\t\t\treturn requireString(\"name\");\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction isRpcExtensionUIResponse(value: Record<string, unknown>): value is RpcExtensionUIResponse {\n\treturn (\n\t\tvalue.type === \"extension_ui_response\" &&\n\t\ttypeof value.id === \"string\" &&\n\t\t(typeof value.value === \"string\" || typeof value.confirmed === \"boolean\" || value.cancelled === true)\n\t);\n}\n\nconst GET_STATE_FRAME_TOO_LARGE = \"FRAME_TOO_LARGE\";\n\n/** True when the serialized response, excluding the JSONL line feed, is within both get_state limits. */\nfunction fitsGetStateLimits(response: object): boolean {\n\tconst text = JSON.stringify(response);\n\treturn (\n\t\tBuffer.byteLength(text, \"utf8\") <= MAX_GET_STATE_RESPONSE_UTF8_BYTES &&\n\t\ttext.length <= MAX_GET_STATE_RESPONSE_CODE_UNITS\n\t);\n}\n\n/**\n * Build the get_state response, limiting the full serialized response (request id, metadata and state)\n * to the get_state byte and code-unit caps. `JSON.stringify` of the response is exactly what\n * serializeJsonLine writes minus the trailing LF. Base state fields are never trimmed.\n *\n * Fallbacks, in order:\n * 1. Projection over the limit: mark the registry incomplete (sticky) and send an empty-runs envelope.\n * 2. Still over: omit `subagentProgress` (absence means unavailable; the registry stays incomplete).\n * 3. Base response alone over the limit: the existing error shape with a fixed FRAME_TOO_LARGE message\n * and no state.\n * 4. If that error response does not fit because the request id is oversized, drop the id. This is the\n * only case where the correlation id is lost; a client cannot match such a response by id.\n */\nexport function buildGetStateResponse(\n\tid: string | undefined,\n\tstate: RpcSessionState,\n\tregistry: SubagentProgressRegistry | undefined,\n): RpcResponse {\n\tconst succeed = (data: RpcSessionState): RpcResponse => ({\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: \"get_state\",\n\t\tsuccess: true,\n\t\tdata,\n\t});\n\n\tif (registry) {\n\t\tconst full = succeed({ ...state, subagentProgress: registry.snapshot() });\n\t\tif (fitsGetStateLimits(full)) return full;\n\t\tregistry.markIncomplete();\n\t\tconst empty = succeed({ ...state, subagentProgress: registry.snapshot({ includeRuns: false }) });\n\t\tif (fitsGetStateLimits(empty)) return empty;\n\t}\n\n\tconst base = succeed(state);\n\tif (fitsGetStateLimits(base)) return base;\n\n\tconst tooLarge: RpcResponse = {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: \"get_state\",\n\t\tsuccess: false,\n\t\terror: GET_STATE_FRAME_TOO_LARGE,\n\t};\n\tif (fitsGetStateLimits(tooLarge)) return tooLarge;\n\treturn { type: \"response\", command: \"get_state\", success: false, error: GET_STATE_FRAME_TOO_LARGE };\n}\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(runtimeHost: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\tlet session = runtimeHost.session;\n\t// One registry per RPC runtime: the runtime id is fixed here, the session epoch rotates on replacement.\n\tconst subagentProgress = new SubagentProgressRegistry();\n\t// A context may capture its capability, so revocation must live in the capability itself: each\n\t// injection is revocable individually (reload keeps the epoch) and is also bound to the epoch\n\t// current when it was created, so a session replacement invalidates it too. Admitted runs persist.\n\tlet revokeActiveCapability: (() => void) | undefined;\n\tlet capabilityRunner: ExtensionRunner | undefined;\n\tconst installSubagentCapability = (runner: ExtensionRunner): void => {\n\t\trevokeActiveCapability?.();\n\t\tconst epochAtCreation = subagentProgress.sessionEpoch;\n\t\tlet revoked = false;\n\t\trevokeActiveCapability = () => {\n\t\t\trevoked = true;\n\t\t};\n\t\tconst capability: SubagentProgressCapability = {\n\t\t\tadmitRun: (meta) =>\n\t\t\t\t!revoked && subagentProgress.sessionEpoch === epochAtCreation\n\t\t\t\t\t? subagentProgress.admitRun(meta)\n\t\t\t\t\t: DISABLED_SUBAGENT_RUN_OBSERVER,\n\t\t};\n\t\trunner.setSubagentProgressCapability(capability);\n\t\tcapabilityRunner = runner;\n\t};\n\tlet boundSession: AgentSession | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\twriteRawStdout(serializeJsonLine(obj));\n\t};\n\n\tconst success = <T extends RpcCommand[\"type\"]>(\n\t\tid: string | undefined,\n\t\tcommand: T,\n\t\tdata?: object | null,\n\t): RpcResponse => {\n\t\tif (data === undefined) {\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t\t}\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n\t};\n\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\n\t\treturn { id, type: \"response\", command, success: false, error: message };\n\t};\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\n\t>();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\tlet shutdownPromise: Promise<never> | undefined;\n\tlet pendingSignalExitCode: number | undefined;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t\t),\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t\t),\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(\n\t\t\t\t\topts,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ method: \"input\", title, placeholder, timeout: opts?.timeout },\n\t\t\t\t\t(r) => (\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined),\n\t\t\t\t),\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tonTerminalInput(): () => void {\n\t\t\t// Raw terminal input not supported in RPC mode\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tsetWorkingMessage(_message?: string): void {\n\t\t\t// Working message not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingVisible(_visible: boolean): void {\n\t\t\t// Working visibility not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingIndicator(_options?: WorkingIndicatorOptions): void {\n\t\t\t// Working indicator customization not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetHiddenThinkingLabel(_label?: string): void {\n\t\t\t// Hidden thinking label not supported in RPC mode - requires TUI message rendering access\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\n\t\t\t// Only support string arrays in RPC mode - factory functions are ignored\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\t// Component factories are not supported in RPC mode - would need TUI access\n\t\t},\n\n\t\tsetFooter(_factory: unknown): void {\n\t\t\t// Custom footer not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetHeader(_factory: unknown): void {\n\t\t\t// Custom header not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tpasteToEditor(text: string): void {\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\n\t\t\tthis.setEditorText(text);\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn trackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tnew Promise<string | undefined>((resolve, reject) => {\n\t\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject,\n\t\t\t\t\t});\n\t\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\taddAutocompleteProvider(): void {\n\t\t\t// Autocomplete provider composition is not supported in RPC mode\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tsetEditorAccent: () => {},\n\t\tonEditorChange: () => () => {},\n\n\t\tgetEditorComponent() {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t\treturn undefined;\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn [];\n\t\t},\n\n\t\tgetTheme(_name: string) {\n\t\t\treturn undefined;\n\t\t},\n\n\t\tsetTheme(_theme: string | Theme) {\n\t\t\t// Theme switching not supported in RPC mode\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\n\t\t},\n\n\t\tgetToolsExpanded() {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t\treturn false;\n\t\t},\n\n\t\tsetToolsExpanded(_expanded: boolean) {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t},\n\t});\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\t// Successful replacements call this twice (runtime callback, then the command case), so rotate\n\t\t// on session identity: exactly once per replacement, never on the initial bind, and never for\n\t\t// cancelled or thrown replacements, which leave the session unchanged and skip rebinding.\n\t\tif (boundSession !== undefined && boundSession !== session) {\n\t\t\ttry {\n\t\t\t\tboundSession.extensionRunner.setSubagentProgressCapability(undefined);\n\t\t\t} catch {\n\t\t\t\t// The replaced session is already torn down; the epoch rotation below still invalidates it.\n\t\t\t}\n\t\t\tsubagentProgress.resetEpoch();\n\t\t}\n\t\t// The duplicate rebind of one replacement keeps the capability session_start handlers already hold.\n\t\tif (capabilityRunner !== session.extensionRunner) installSubagentCapability(session.extensionRunner);\n\t\tboundSession = session;\n\t\tawait session.bindExtensions({\n\t\t\tuiContext: createExtensionUIContext(),\n\t\t\tmode: \"rpc\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (options) => runtimeHost.newSession(options),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, options) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, options);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\t// reload() builds a new ExtensionRunner that starts without the capability and emits\n\t\t\t\t\t// session_start before returning, so inject from beforeSessionStart.\n\t\t\t\t\t// session.reload() invalidates the old runner before awaiting resources, so revoke the\n\t\t\t\t\t// installed capability first; a failed reload must not leave it live.\n\t\t\t\t\trevokeActiveCapability?.();\n\t\t\t\t\tlet injected = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait session.reload({\n\t\t\t\t\t\t\tbeforeSessionStart: () => {\n\t\t\t\t\t\t\t\tinstallSubagentCapability(session.extensionRunner);\n\t\t\t\t\t\t\t\tinjected = true;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\t// Covers reload() skipping beforeSessionStart or rejecting before it: the current\n\t\t\t\t\t\t// runner always ends with exactly one live capability.\n\t\t\t\t\t\tif (!injected) installSubagentCapability(session.extensionRunner);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tshutdownHandler: () => {\n\t\t\t\tshutdownRequested = true;\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\toutput(\n\t\t\t\ttoJsonEvent(\n\t\t\t\t\tevent,\n\t\t\t\t\t(snapshot) => subagentProgress.isIssuedProjection(snapshot),\n\t\t\t\t\t() => subagentProgress.complete,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\tvoid checkShutdownRequested();\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure = session.agent.subscribe(async () => {\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t});\n\n\t\t// This is the explicit process-readiness boundary for resident hosts. It\n\t\t// is emitted only after runtime/session extension binding has completed,\n\t\t// so a host can safely submit its first prompt after observing this frame.\n\t\toutput({\n\t\t\ttype: \"ready\",\n\t\t\tprotocolVersion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tpid: process.pid,\n\t\t} satisfies RpcReadyEvent);\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\", \"SIGINT\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tconst exitCode = signal === \"SIGINT\" ? 130 : signal === \"SIGHUP\" ? 129 : 143;\n\t\t\t\tif (pendingSignalExitCode !== undefined) {\n\t\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\t\tprocess.exit(exitCode);\n\t\t\t\t}\n\t\t\t\tpendingSignalExitCode = exitCode;\n\t\t\t\tvoid exitAfterSignalShutdown(shutdown(exitCode, signal), exitCode);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tawait rebindSession();\n\tregisterSignalHandlers();\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse | undefined> => {\n\t\tconst id = command.id;\n\n\t\tswitch (command.type) {\n\t\t\t// =================================================================\n\t\t\t// Prompting\n\t\t\t// =================================================================\n\n\t\t\tcase \"prompt\": {\n\t\t\t\t// Start prompt handling immediately, but emit the authoritative response only after\n\t\t\t\t// prompt preflight succeeds. Queued and immediately handled prompts also count as success.\n\t\t\t\tlet preflightSucceeded = false;\n\t\t\t\tvoid session\n\t\t\t\t\t.prompt(command.message, {\n\t\t\t\t\t\timages: command.images,\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t\tpreflightResult: (disposition) => {\n\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\toutput(success(id, \"prompt\", { disposition }));\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\t\toutput(error(id, \"prompt\", e.message));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\tconst disposition = await session.steer(command.message, command.images, { source: \"rpc\" });\n\t\t\t\treturn success(id, \"steer\", { disposition });\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\tconst disposition = await session.followUp(command.message, command.images, { source: \"rpc\" });\n\t\t\t\treturn success(id, \"follow_up\", { disposition });\n\t\t\t}\n\n\t\t\tcase \"abort\": {\n\t\t\t\tawait session.abort();\n\t\t\t\treturn success(id, \"abort\");\n\t\t\t}\n\n\t\t\tcase \"clear_queue\": {\n\t\t\t\treturn success(id, \"clear_queue\", session.clearQueue());\n\t\t\t}\n\n\t\t\tcase \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst result = await runtimeHost.newSession(options);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"new_session\", result);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// State\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_state\": {\n\t\t\t\tconst state: RpcSessionState = {\n\t\t\t\t\tmodel: session.model,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionName: session.sessionName,\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t};\n\t\t\t\treturn buildGetStateResponse(id, state, subagentProgress);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Model\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_model\": {\n\t\t\t\tconst models = session.modelRuntime.getAvailableSnapshot();\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t\t}\n\t\t\t\tawait session.setModel(model);\n\t\t\t\treturn success(id, \"set_model\", model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel();\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_model\", result);\n\t\t\t}\n\n\t\t\tcase \"get_available_models\": {\n\t\t\t\tconst models = session.modelRuntime.getAvailableSnapshot();\n\t\t\t\treturn success(id, \"get_available_models\", { models });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Thinking\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_thinking_level\": {\n\t\t\t\tsession.setThinkingLevel(command.level);\n\t\t\t\treturn success(id, \"set_thinking_level\");\n\t\t\t}\n\n\t\t\tcase \"cycle_thinking_level\": {\n\t\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\t\tif (!level) {\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\n\t\t\t}\n\n\t\t\tcase \"get_available_thinking_levels\": {\n\t\t\t\tconst levels = session.getAvailableThinkingLevels();\n\t\t\t\treturn success(id, \"get_available_thinking_levels\", { levels });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Queue Modes\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_steering_mode\": {\n\t\t\t\tsession.setSteeringMode(command.mode);\n\t\t\t\treturn success(id, \"set_steering_mode\");\n\t\t\t}\n\n\t\t\tcase \"set_follow_up_mode\": {\n\t\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Compaction\n\t\t\t// =================================================================\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact(command.customInstructions);\n\t\t\t\treturn success(id, \"compact\", result);\n\t\t\t}\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Retry\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_auto_retry\": {\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_retry\");\n\t\t\t}\n\n\t\t\tcase \"abort_retry\": {\n\t\t\t\tsession.abortRetry();\n\t\t\t\treturn success(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Bash\n\t\t\t// =================================================================\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst eventResult = await session.extensionRunner.emitUserBash({\n\t\t\t\t\ttype: \"user_bash\",\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\texcludeFromContext: command.excludeFromContext ?? false,\n\t\t\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\t\t});\n\n\t\t\t\tif (eventResult?.result) {\n\t\t\t\t\tsession.recordBashResult(command.command, eventResult.result, {\n\t\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\t});\n\t\t\t\t\treturn success(id, \"bash\", eventResult.result);\n\t\t\t\t}\n\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\tid,\n\t\t\t\t\toperations: eventResult?.operations,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn success(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Session\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\n\t\t\t}\n\n\t\t\tcase \"export_html\": {\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\t\treturn success(id, \"export_html\", { path });\n\t\t\t}\n\n\t\t\tcase \"switch_session\": {\n\t\t\t\tconst result = await runtimeHost.switchSession(command.sessionPath);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"switch_session\", result);\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await runtimeHost.fork(command.entryId);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"clone\": {\n\t\t\t\tconst leafId = session.sessionManager.getLeafId();\n\t\t\t\tif (!leafId) {\n\t\t\t\t\treturn error(id, \"clone\", \"Cannot clone session: no current entry selected\");\n\t\t\t\t}\n\t\t\t\tconst result = await runtimeHost.fork(leafId, { position: \"at\" });\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"clone\", { cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"get_fork_messages\": {\n\t\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_entries\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\tlet entries = sessionManager.getEntries();\n\t\t\t\tif (command.since !== undefined) {\n\t\t\t\t\tconst sinceIndex = entries.findIndex((e) => e.id === command.since);\n\t\t\t\t\tif (sinceIndex === -1) {\n\t\t\t\t\t\treturn error(id, \"get_entries\", `Entry not found: ${command.since}`);\n\t\t\t\t\t}\n\t\t\t\t\tentries = entries.slice(sinceIndex + 1);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"get_entries\", { entries, leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_tree\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\treturn success(id, \"get_tree\", { tree: sessionManager.getTree(), leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_last_assistant_text\": {\n\t\t\t\tconst text = session.getLastAssistantText();\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\n\t\t\t}\n\n\t\t\tcase \"set_session_name\": {\n\t\t\t\tconst name = command.name.trim();\n\t\t\t\tif (!name) {\n\t\t\t\t\treturn error(id, \"set_session_name\", \"Session name cannot be empty\");\n\t\t\t\t}\n\t\t\t\tsession.setSessionName(name);\n\t\t\t\treturn success(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Messages\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Commands (available for invocation via prompt)\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_commands\": {\n\t\t\t\tconst commands: RpcSlashCommand[] = [];\n\n\t\t\t\tfor (const command of session.extensionRunner.getRegisteredCommands()) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.invocationName,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tfor (const template of session.promptTemplates) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: template.name,\n\t\t\t\t\t\tdescription: template.description,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn success(id, \"get_commands\", { commands });\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst unknownCommand = command as { type: string };\n\t\t\t\treturn error(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tlet detachInput = () => {};\n\n\tfunction shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tshutdownPromise ??= (async () => {\n\t\t\tawait closeSessionFlowControl(session);\n\t\t\tconst termination = killTrackedDetachedChildrenAsync();\n\t\t\tunsubscribe?.();\n\t\t\tunsubscribeBackpressure?.();\n\t\t\ttry {\n\t\t\t\tawait runtimeHost.dispose();\n\t\t\t} finally {\n\t\t\t\tawait termination;\n\t\t\t\tdetachInput();\n\t\t\t\tprocess.stdin.pause();\n\t\t\t\tif (signal !== \"SIGTERM\") await flushRawStdout();\n\t\t\t\tfor (const cleanup of signalCleanupHandlers) cleanup();\n\t\t\t\tprocess.exit(pendingSignalExitCode ?? exitCode);\n\t\t\t}\n\t\t})();\n\t\treturn shutdownPromise;\n\t}\n\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\t\tawait shutdown();\n\t}\n\n\tconst handleInputLine = async (line: string) => {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line);\n\t\t} catch (parseError: unknown) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"parse\",\n\t\t\t\t\t`Failed to parse command: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!isRecord(parsed)) {\n\t\t\toutput(error(undefined, \"parse\", \"Invalid command: expected a JSON object\"));\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle extension UI responses\n\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\tif (!isRpcExtensionUIResponse(parsed)) {\n\t\t\t\toutput(\n\t\t\t\t\terror(\n\t\t\t\t\t\ttypeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\t\t\t\t\"extension_ui_response\",\n\t\t\t\t\t\t\"Invalid command: malformed extension_ui_response\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = parsed;\n\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\tif (pending) {\n\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\tpending.resolve(response);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst invalid = invalidRpcCommand(parsed);\n\t\tif (invalid) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\ttypeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\t\t\ttypeof parsed.type === \"string\" ? parsed.type : \"parse\",\n\t\t\t\t\t`Invalid command: ${invalid}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\tconst command = parsed as RpcCommand;\n\t\ttry {\n\t\t\tconst response = await handleCommand(command);\n\t\t\tif (response) {\n\t\t\t\toutput(response);\n\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t}\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (commandError: unknown) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\tcommand.id,\n\t\t\t\t\tcommand.type,\n\t\t\t\t\tcommandError instanceof Error ? commandError.message : String(commandError),\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t}\n\t};\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst detachJsonl = attachJsonlLineReader(\n\t\t\tprocess.stdin,\n\t\t\t(line) => {\n\t\t\t\tvoid handleInputLine(line);\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxLineLength: MAX_RPC_INPUT_LINE_LENGTH,\n\t\t\t\tonLineTooLong: () => {\n\t\t\t\t\toutput(\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\"parse\",\n\t\t\t\t\t\t\t`RPC command exceeds the ${MAX_RPC_INPUT_LINE_LENGTH}-character input limit`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tvoid waitForRawStdoutBackpressure();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport {\n\ttype FlowControlCommandV1,\n\ttype FlowControlReceiptV1,\n\ttype FlowMessageReceiptV1,\n\tparseFlowControlCommandV1,\n} from \"@humain/humain-code-contracts/flow-control\";\nimport {\n\tMAX_GET_STATE_RESPONSE_CODE_UNITS,\n\tMAX_GET_STATE_RESPONSE_UTF8_BYTES,\n\tMAX_RPC_FRAME_LENGTH,\n} from \"@humain/humain-code-contracts/rpc\";\nimport { trackUserWait } from \"../../agent-monitor/user-wait.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tWorkingIndicatorOptions,\n} from \"../../core/extensions/index.ts\";\nimport type { ExtensionRunner } from \"../../core/extensions/runner.ts\";\nimport {\n\tflushRawStdout,\n\ttakeOverStdout,\n\twaitForRawStdoutBackpressure,\n\twriteRawStdout,\n} from \"../../core/output-guard.ts\";\nimport {\n\tDISABLED_SUBAGENT_RUN_OBSERVER,\n\ttype SubagentProgressCapability,\n\tSubagentProgressRegistry,\n} from \"../../core/tools/subagent-progress.ts\";\nimport {\n\tgetFlowRpcControl,\n\tloadFlowRpcControl,\n\tsetFlowRpcFollowUp,\n\tsetFlowRpcOutput,\n} from \"../../humain/flow-loader.ts\";\nimport { closeSessionFlowControl } from \"../../humain/trace-capture/control-host.ts\";\nimport { killTrackedDetachedChildren, killTrackedDetachedChildrenAsync } from \"../../utils/shell.ts\";\nimport { type Theme, theme } from \"../interactive/theme/theme.ts\";\nimport { toJsonEvent } from \"../json-event.ts\";\nimport { exitAfterSignalShutdown } from \"../signal-shutdown.ts\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.ts\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcReadyEvent,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcReadyEvent,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\n\n// Bounds the UTF-16 string retained by the JSONL reader for one persistent RPC command.\nconst MAX_RPC_INPUT_LINE_LENGTH = MAX_RPC_FRAME_LENGTH;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n// Mirrors FLOW_COMMAND_TYPES in @humain/humain-code-contracts/rpc (not exported there).\nconst FLOW_RPC_COMMAND_TYPES = new Set([\"flow_status\", \"flow_pause\", \"flow_resume\", \"flow_cancel\", \"flow_message\"]);\n\n// Concurrent flow_* handlers (cancel can wait seconds for confirmation); beyond this, commands are rejected.\nconst MAX_INFLIGHT_FLOW_COMMANDS = 32;\nconst MAX_QUEUED_FLOW_FOLLOW_UPS = 64;\n\n/** Rejected receipt for a flow_* command that cannot be served (Flow not loaded or saturated). */\nfunction rejectedFlowReceipt(\n\tcommand: FlowControlCommandV1,\n\treason: \"config_invalid\" | \"internal\" = \"config_invalid\",\n): FlowControlReceiptV1 | FlowMessageReceiptV1 {\n\tif (command.type === \"flow_message\") {\n\t\treturn {\n\t\t\ttype: \"response\",\n\t\t\tid: command.id,\n\t\t\tcommand: \"flow_message\",\n\t\t\tmessageId: command.messageId,\n\t\t\tstate: \"rejected\",\n\t\t\treason,\n\t\t\tdisposition: \"rejected\",\n\t\t};\n\t}\n\treturn { type: \"response\", id: command.id, command: command.type, state: \"rejected\", reason };\n}\n\ntype FlowCommandResult = {\n\treceipt: FlowControlReceiptV1 | FlowMessageReceiptV1;\n\tstatus?: unknown;\n};\n\nfunction invalidRpcCommand(command: Record<string, unknown>): string | undefined {\n\tif (command.id !== undefined && typeof command.id !== \"string\") return \"id must be a string\";\n\tif (typeof command.type !== \"string\" || command.type.length === 0) return \"expected a non-empty string type\";\n\n\tconst requireString = (field: string): string | undefined =>\n\t\ttypeof command[field] === \"string\" ? undefined : `${command.type}.${field} must be a string`;\n\tconst requireOptionalString = (field: string): string | undefined =>\n\t\tcommand[field] === undefined || typeof command[field] === \"string\"\n\t\t\t? undefined\n\t\t\t: `${command.type}.${field} must be a string`;\n\tconst requireBoolean = (field: string): string | undefined =>\n\t\ttypeof command[field] === \"boolean\" ? undefined : `${command.type}.${field} must be a boolean`;\n\n\tswitch (command.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\trequireString(\"message\") ??\n\t\t\t\t(command.images === undefined || Array.isArray(command.images)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"prompt.images must be an array\") ??\n\t\t\t\t(command.streamingBehavior === undefined ||\n\t\t\t\tcommand.streamingBehavior === \"steer\" ||\n\t\t\t\tcommand.streamingBehavior === \"followUp\"\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"prompt.streamingBehavior must be steer or followUp\")\n\t\t\t);\n\t\tcase \"steer\":\n\t\tcase \"follow_up\":\n\t\t\treturn (\n\t\t\t\trequireString(\"message\") ??\n\t\t\t\t(command.images === undefined || Array.isArray(command.images)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: `${command.type}.images must be an array`)\n\t\t\t);\n\t\tcase \"new_session\":\n\t\t\treturn requireOptionalString(\"parentSession\");\n\t\tcase \"set_model\":\n\t\t\treturn requireString(\"provider\") ?? requireString(\"modelId\");\n\t\tcase \"set_thinking_level\":\n\t\t\treturn requireString(\"level\");\n\t\tcase \"set_steering_mode\":\n\t\tcase \"set_follow_up_mode\":\n\t\t\treturn command.mode === \"all\" || command.mode === \"one-at-a-time\"\n\t\t\t\t? undefined\n\t\t\t\t: `${command.type}.mode must be all or one-at-a-time`;\n\t\tcase \"compact\":\n\t\t\treturn requireOptionalString(\"customInstructions\");\n\t\tcase \"set_auto_compaction\":\n\t\tcase \"set_auto_retry\":\n\t\t\treturn requireBoolean(\"enabled\");\n\t\tcase \"bash\":\n\t\t\treturn (\n\t\t\t\trequireString(\"command\") ??\n\t\t\t\t(command.excludeFromContext === undefined || typeof command.excludeFromContext === \"boolean\"\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"bash.excludeFromContext must be a boolean\")\n\t\t\t);\n\t\tcase \"export_html\":\n\t\t\treturn requireOptionalString(\"outputPath\");\n\t\tcase \"switch_session\":\n\t\t\treturn requireString(\"sessionPath\");\n\t\tcase \"fork\":\n\t\t\treturn requireString(\"entryId\");\n\t\tcase \"get_entries\":\n\t\t\treturn requireOptionalString(\"since\");\n\t\tcase \"set_session_name\":\n\t\t\treturn requireString(\"name\");\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction isRpcExtensionUIResponse(value: Record<string, unknown>): value is RpcExtensionUIResponse {\n\treturn (\n\t\tvalue.type === \"extension_ui_response\" &&\n\t\ttypeof value.id === \"string\" &&\n\t\t(typeof value.value === \"string\" || typeof value.confirmed === \"boolean\" || value.cancelled === true)\n\t);\n}\n\nconst GET_STATE_FRAME_TOO_LARGE = \"FRAME_TOO_LARGE\";\n\n/** True when the serialized response, excluding the JSONL line feed, is within both get_state limits. */\nfunction fitsGetStateLimits(response: object): boolean {\n\tconst text = JSON.stringify(response);\n\treturn (\n\t\tBuffer.byteLength(text, \"utf8\") <= MAX_GET_STATE_RESPONSE_UTF8_BYTES &&\n\t\ttext.length <= MAX_GET_STATE_RESPONSE_CODE_UNITS\n\t);\n}\n\n/**\n * Build the get_state response, limiting the full serialized response (request id, metadata and state)\n * to the get_state byte and code-unit caps. `JSON.stringify` of the response is exactly what\n * serializeJsonLine writes minus the trailing LF. Base state fields are never trimmed.\n *\n * Fallbacks, in order:\n * 1. Projection over the limit: mark the registry incomplete (sticky) and send an empty-runs envelope.\n * 2. Still over: omit `subagentProgress` (absence means unavailable; the registry stays incomplete).\n * 3. Base response alone over the limit: the existing error shape with a fixed FRAME_TOO_LARGE message\n * and no state.\n * 4. If that error response does not fit because the request id is oversized, drop the id. This is the\n * only case where the correlation id is lost; a client cannot match such a response by id.\n */\nexport function buildGetStateResponse(\n\tid: string | undefined,\n\tstate: RpcSessionState,\n\tregistry: SubagentProgressRegistry | undefined,\n): RpcResponse {\n\tconst succeed = (data: RpcSessionState): RpcResponse => ({\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: \"get_state\",\n\t\tsuccess: true,\n\t\tdata,\n\t});\n\n\tif (registry) {\n\t\tconst full = succeed({ ...state, subagentProgress: registry.snapshot() });\n\t\tif (fitsGetStateLimits(full)) return full;\n\t\tregistry.markIncomplete();\n\t\tconst empty = succeed({ ...state, subagentProgress: registry.snapshot({ includeRuns: false }) });\n\t\tif (fitsGetStateLimits(empty)) return empty;\n\t}\n\n\tconst base = succeed(state);\n\tif (fitsGetStateLimits(base)) return base;\n\n\tconst tooLarge: RpcResponse = {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: \"get_state\",\n\t\tsuccess: false,\n\t\terror: GET_STATE_FRAME_TOO_LARGE,\n\t};\n\tif (fitsGetStateLimits(tooLarge)) return tooLarge;\n\treturn { type: \"response\", command: \"get_state\", success: false, error: GET_STATE_FRAME_TOO_LARGE };\n}\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(runtimeHost: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\tlet session = runtimeHost.session;\n\t// One registry per RPC runtime: the runtime id is fixed here, the session epoch rotates on replacement.\n\tconst subagentProgress = new SubagentProgressRegistry();\n\t// A context may capture its capability, so revocation must live in the capability itself: each\n\t// injection is revocable individually (reload keeps the epoch) and is also bound to the epoch\n\t// current when it was created, so a session replacement invalidates it too. Admitted runs persist.\n\tlet revokeActiveCapability: (() => void) | undefined;\n\tlet capabilityRunner: ExtensionRunner | undefined;\n\tconst installSubagentCapability = (runner: ExtensionRunner): void => {\n\t\trevokeActiveCapability?.();\n\t\tconst epochAtCreation = subagentProgress.sessionEpoch;\n\t\tlet revoked = false;\n\t\trevokeActiveCapability = () => {\n\t\t\trevoked = true;\n\t\t};\n\t\tconst capability: SubagentProgressCapability = {\n\t\t\tadmitRun: (meta) =>\n\t\t\t\t!revoked && subagentProgress.sessionEpoch === epochAtCreation\n\t\t\t\t\t? subagentProgress.admitRun(meta)\n\t\t\t\t\t: DISABLED_SUBAGENT_RUN_OBSERVER,\n\t\t};\n\t\trunner.setSubagentProgressCapability(capability);\n\t\tcapabilityRunner = runner;\n\t};\n\tlet boundSession: AgentSession | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\twriteRawStdout(serializeJsonLine(obj));\n\t};\n\n\t// Flow's run-control hook writes flow_event frames through the same stdout path.\n\t// Returning the completion lets the frame sink / emitter apply their backpressure bound.\n\tsetFlowRpcOutput((frame) => {\n\t\toutput(frame);\n\t\treturn waitForRawStdoutBackpressure();\n\t});\n\n\t// Direct-mode flow_message (no Flow run): Flow queues host follow-ups through this, bounded by the pending count.\n\tlet reservedFollowUps = 0;\n\tsetFlowRpcFollowUp(async (text) => {\n\t\tif (session.getFollowUpMessages().length + reservedFollowUps >= MAX_QUEUED_FLOW_FOLLOW_UPS)\n\t\t\tthrow new Error(\"follow-up queue full\");\n\t\treservedFollowUps++;\n\t\ttry {\n\t\t\tawait session.followUp(text, undefined, { source: \"rpc\" });\n\t\t} finally {\n\t\t\treservedFollowUps--;\n\t\t}\n\t});\n\n\tconst success = <T extends RpcCommand[\"type\"]>(\n\t\tid: string | undefined,\n\t\tcommand: T,\n\t\tdata?: object | null,\n\t): RpcResponse => {\n\t\tif (data === undefined) {\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t\t}\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n\t};\n\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\n\t\treturn { id, type: \"response\", command, success: false, error: message };\n\t};\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\n\t>();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\tlet shutdownPromise: Promise<never> | undefined;\n\tlet pendingSignalExitCode: number | undefined;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t\t),\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t\t),\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\ttrackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tcreateDialogPromise(\n\t\t\t\t\topts,\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ method: \"input\", title, placeholder, timeout: opts?.timeout },\n\t\t\t\t\t(r) => (\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined),\n\t\t\t\t),\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tonTerminalInput(): () => void {\n\t\t\t// Raw terminal input not supported in RPC mode\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tsetWorkingMessage(_message?: string): void {\n\t\t\t// Working message not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingVisible(_visible: boolean): void {\n\t\t\t// Working visibility not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingIndicator(_options?: WorkingIndicatorOptions): void {\n\t\t\t// Working indicator customization not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetHiddenThinkingLabel(_label?: string): void {\n\t\t\t// Hidden thinking label not supported in RPC mode - requires TUI message rendering access\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\n\t\t\t// Only support string arrays in RPC mode - factory functions are ignored\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\t// Component factories are not supported in RPC mode - would need TUI access\n\t\t},\n\n\t\tsetFooter(_factory: unknown): void {\n\t\t\t// Custom footer not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetHeader(_factory: unknown): void {\n\t\t\t// Custom header not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tpasteToEditor(text: string): void {\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\n\t\t\tthis.setEditorText(text);\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn trackUserWait(\n\t\t\t\ttitle,\n\t\t\t\tnew Promise<string | undefined>((resolve, reject) => {\n\t\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject,\n\t\t\t\t\t});\n\t\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\n\t\taddAutocompleteProvider(): void {\n\t\t\t// Autocomplete provider composition is not supported in RPC mode\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tsetEditorAccent: () => {},\n\t\tonEditorChange: () => () => {},\n\n\t\tgetEditorComponent() {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t\treturn undefined;\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn [];\n\t\t},\n\n\t\tgetTheme(_name: string) {\n\t\t\treturn undefined;\n\t\t},\n\n\t\tsetTheme(_theme: string | Theme) {\n\t\t\t// Theme switching not supported in RPC mode\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\n\t\t},\n\n\t\tgetToolsExpanded() {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t\treturn false;\n\t\t},\n\n\t\tsetToolsExpanded(_expanded: boolean) {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t},\n\t});\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\t// Successful replacements call this twice (runtime callback, then the command case), so rotate\n\t\t// on session identity: exactly once per replacement, never on the initial bind, and never for\n\t\t// cancelled or thrown replacements, which leave the session unchanged and skip rebinding.\n\t\tif (boundSession !== undefined && boundSession !== session) {\n\t\t\ttry {\n\t\t\t\tboundSession.extensionRunner.setSubagentProgressCapability(undefined);\n\t\t\t} catch {\n\t\t\t\t// The replaced session is already torn down; the epoch rotation below still invalidates it.\n\t\t\t}\n\t\t\tsubagentProgress.resetEpoch();\n\t\t}\n\t\t// The duplicate rebind of one replacement keeps the capability session_start handlers already hold.\n\t\tif (capabilityRunner !== session.extensionRunner) installSubagentCapability(session.extensionRunner);\n\t\tboundSession = session;\n\t\tawait session.bindExtensions({\n\t\t\tuiContext: createExtensionUIContext(),\n\t\t\tmode: \"rpc\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (options) => runtimeHost.newSession(options),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, options) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, options);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\t// reload() builds a new ExtensionRunner that starts without the capability and emits\n\t\t\t\t\t// session_start before returning, so inject from beforeSessionStart.\n\t\t\t\t\t// session.reload() invalidates the old runner before awaiting resources, so revoke the\n\t\t\t\t\t// installed capability first; a failed reload must not leave it live.\n\t\t\t\t\trevokeActiveCapability?.();\n\t\t\t\t\tlet injected = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait session.reload({\n\t\t\t\t\t\t\tbeforeSessionStart: () => {\n\t\t\t\t\t\t\t\tinstallSubagentCapability(session.extensionRunner);\n\t\t\t\t\t\t\t\tinjected = true;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\t// Covers reload() skipping beforeSessionStart or rejecting before it: the current\n\t\t\t\t\t\t// runner always ends with exactly one live capability.\n\t\t\t\t\t\tif (!injected) installSubagentCapability(session.extensionRunner);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tshutdownHandler: () => {\n\t\t\t\tshutdownRequested = true;\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\toutput(\n\t\t\t\ttoJsonEvent(\n\t\t\t\t\tevent,\n\t\t\t\t\t(snapshot) => subagentProgress.isIssuedProjection(snapshot),\n\t\t\t\t\t() => subagentProgress.complete,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\tvoid checkShutdownRequested();\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure = session.agent.subscribe(async () => {\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t});\n\n\t\t// This is the explicit process-readiness boundary for resident hosts. It\n\t\t// is emitted only after runtime/session extension binding has completed,\n\t\t// so a host can safely submit its first prompt after observing this frame.\n\t\toutput({\n\t\t\ttype: \"ready\",\n\t\t\tprotocolVersion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tpid: process.pid,\n\t\t} satisfies RpcReadyEvent);\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\", \"SIGINT\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tconst exitCode = signal === \"SIGINT\" ? 130 : signal === \"SIGHUP\" ? 129 : 143;\n\t\t\t\tif (pendingSignalExitCode !== undefined) {\n\t\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\t\tprocess.exit(exitCode);\n\t\t\t\t}\n\t\t\t\tpendingSignalExitCode = exitCode;\n\t\t\t\tvoid exitAfterSignalShutdown(shutdown(exitCode, signal), exitCode);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tawait rebindSession();\n\tregisterSignalHandlers();\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse | undefined> => {\n\t\tconst id = command.id;\n\n\t\tswitch (command.type) {\n\t\t\t// =================================================================\n\t\t\t// Prompting\n\t\t\t// =================================================================\n\n\t\t\tcase \"prompt\": {\n\t\t\t\t// Start prompt handling immediately, but emit the authoritative response only after\n\t\t\t\t// prompt preflight succeeds. Queued and immediately handled prompts also count as success.\n\t\t\t\tlet preflightSucceeded = false;\n\t\t\t\tvoid session\n\t\t\t\t\t.prompt(command.message, {\n\t\t\t\t\t\timages: command.images,\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t\tpreflightResult: (disposition) => {\n\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\toutput(success(id, \"prompt\", { disposition }));\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\t\toutput(error(id, \"prompt\", e.message));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\tconst disposition = await session.steer(command.message, command.images, { source: \"rpc\" });\n\t\t\t\treturn success(id, \"steer\", { disposition });\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\tconst disposition = await session.followUp(command.message, command.images, { source: \"rpc\" });\n\t\t\t\treturn success(id, \"follow_up\", { disposition });\n\t\t\t}\n\n\t\t\tcase \"abort\": {\n\t\t\t\t// An active Flow run is cancelled too (flow_cancel{reason:\"user\"}), not just the native session turn.\n\t\t\t\tconst flowRunId = getFlowRpcControl()?.activeRunId();\n\t\t\t\tconst cancelFlow = async (): Promise<string | undefined> => {\n\t\t\t\t\tif (!flowRunId) return undefined;\n\t\t\t\t\tif (abortFlowWaiters >= MAX_INFLIGHT_FLOW_COMMANDS) return \"Flow cancel rejected (internal)\";\n\t\t\t\t\t// One in-flight Flow cancel per run, admitted through the bounded flow_* limit.\n\t\t\t\t\tlet pending = abortFlowCancels.get(flowRunId);\n\t\t\t\t\tif (!pending) {\n\t\t\t\t\t\tpending = submitFlowCommand({\n\t\t\t\t\t\t\tid: `abort-${crypto.randomUUID()}`,\n\t\t\t\t\t\t\ttype: \"flow_cancel\",\n\t\t\t\t\t\t\trunId: flowRunId,\n\t\t\t\t\t\t\treason: \"user\",\n\t\t\t\t\t\t}).finally(() => abortFlowCancels.delete(flowRunId));\n\t\t\t\t\t\tabortFlowCancels.set(flowRunId, pending);\n\t\t\t\t\t}\n\t\t\t\t\tabortFlowWaiters++;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { receipt } = await pending;\n\t\t\t\t\t\treturn receipt.state === \"rejected\" ? `Flow cancel rejected (${receipt.reason})` : undefined;\n\t\t\t\t\t} catch (flowError: unknown) {\n\t\t\t\t\t\treturn flowError instanceof Error ? flowError.message : String(flowError);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tabortFlowWaiters--;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst [, flowFailure] = await Promise.all([session.abort(), cancelFlow()]);\n\t\t\t\tif (flowFailure) return error(id, \"abort\", flowFailure);\n\t\t\t\treturn success(id, \"abort\");\n\t\t\t}\n\n\t\t\tcase \"clear_queue\": {\n\t\t\t\treturn success(id, \"clear_queue\", session.clearQueue());\n\t\t\t}\n\n\t\t\tcase \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst result = await runtimeHost.newSession(options);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"new_session\", result);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// State\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_state\": {\n\t\t\t\tconst state: RpcSessionState = {\n\t\t\t\t\tmodel: session.model,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionName: session.sessionName,\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t};\n\t\t\t\treturn buildGetStateResponse(id, state, subagentProgress);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Model\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_model\": {\n\t\t\t\tconst models = session.modelRuntime.getAvailableSnapshot();\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t\t}\n\t\t\t\tawait session.setModel(model);\n\t\t\t\treturn success(id, \"set_model\", model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel();\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_model\", result);\n\t\t\t}\n\n\t\t\tcase \"get_available_models\": {\n\t\t\t\tconst models = session.modelRuntime.getAvailableSnapshot();\n\t\t\t\treturn success(id, \"get_available_models\", { models });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Thinking\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_thinking_level\": {\n\t\t\t\tsession.setThinkingLevel(command.level);\n\t\t\t\treturn success(id, \"set_thinking_level\");\n\t\t\t}\n\n\t\t\tcase \"cycle_thinking_level\": {\n\t\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\t\tif (!level) {\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\n\t\t\t}\n\n\t\t\tcase \"get_available_thinking_levels\": {\n\t\t\t\tconst levels = session.getAvailableThinkingLevels();\n\t\t\t\treturn success(id, \"get_available_thinking_levels\", { levels });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Queue Modes\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_steering_mode\": {\n\t\t\t\tsession.setSteeringMode(command.mode);\n\t\t\t\treturn success(id, \"set_steering_mode\");\n\t\t\t}\n\n\t\t\tcase \"set_follow_up_mode\": {\n\t\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Compaction\n\t\t\t// =================================================================\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact(command.customInstructions);\n\t\t\t\treturn success(id, \"compact\", result);\n\t\t\t}\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Retry\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_auto_retry\": {\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_retry\");\n\t\t\t}\n\n\t\t\tcase \"abort_retry\": {\n\t\t\t\tsession.abortRetry();\n\t\t\t\treturn success(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Bash\n\t\t\t// =================================================================\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst eventResult = await session.extensionRunner.emitUserBash({\n\t\t\t\t\ttype: \"user_bash\",\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\texcludeFromContext: command.excludeFromContext ?? false,\n\t\t\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\t\t});\n\n\t\t\t\tif (eventResult?.result) {\n\t\t\t\t\tsession.recordBashResult(command.command, eventResult.result, {\n\t\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\t});\n\t\t\t\t\treturn success(id, \"bash\", eventResult.result);\n\t\t\t\t}\n\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\tid,\n\t\t\t\t\toperations: eventResult?.operations,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn success(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Session\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\n\t\t\t}\n\n\t\t\tcase \"export_html\": {\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\t\treturn success(id, \"export_html\", { path });\n\t\t\t}\n\n\t\t\tcase \"switch_session\": {\n\t\t\t\tconst result = await runtimeHost.switchSession(command.sessionPath);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"switch_session\", result);\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await runtimeHost.fork(command.entryId);\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"clone\": {\n\t\t\t\tconst leafId = session.sessionManager.getLeafId();\n\t\t\t\tif (!leafId) {\n\t\t\t\t\treturn error(id, \"clone\", \"Cannot clone session: no current entry selected\");\n\t\t\t\t}\n\t\t\t\tconst result = await runtimeHost.fork(leafId, { position: \"at\" });\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn success(id, \"clone\", { cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"get_fork_messages\": {\n\t\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_entries\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\tlet entries = sessionManager.getEntries();\n\t\t\t\tif (command.since !== undefined) {\n\t\t\t\t\tconst sinceIndex = entries.findIndex((e) => e.id === command.since);\n\t\t\t\t\tif (sinceIndex === -1) {\n\t\t\t\t\t\treturn error(id, \"get_entries\", `Entry not found: ${command.since}`);\n\t\t\t\t\t}\n\t\t\t\t\tentries = entries.slice(sinceIndex + 1);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"get_entries\", { entries, leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_tree\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\treturn success(id, \"get_tree\", { tree: sessionManager.getTree(), leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_last_assistant_text\": {\n\t\t\t\tconst text = session.getLastAssistantText();\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\n\t\t\t}\n\n\t\t\tcase \"set_session_name\": {\n\t\t\t\tconst name = command.name.trim();\n\t\t\t\tif (!name) {\n\t\t\t\t\treturn error(id, \"set_session_name\", \"Session name cannot be empty\");\n\t\t\t\t}\n\t\t\t\tsession.setSessionName(name);\n\t\t\t\treturn success(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Messages\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Commands (available for invocation via prompt)\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_commands\": {\n\t\t\t\tconst commands: RpcSlashCommand[] = [];\n\n\t\t\t\tfor (const command of session.extensionRunner.getRegisteredCommands()) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.invocationName,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tfor (const template of session.promptTemplates) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: template.name,\n\t\t\t\t\t\tdescription: template.description,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn success(id, \"get_commands\", { commands });\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst unknownCommand = command as { type: string };\n\t\t\t\treturn error(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tlet detachInput = () => {};\n\n\tfunction shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tshutdownPromise ??= (async () => {\n\t\t\tawait closeSessionFlowControl(session);\n\t\t\tconst termination = killTrackedDetachedChildrenAsync();\n\t\t\tunsubscribe?.();\n\t\t\tunsubscribeBackpressure?.();\n\t\t\ttry {\n\t\t\t\tawait runtimeHost.dispose();\n\t\t\t} finally {\n\t\t\t\tawait termination;\n\t\t\t\tdetachInput();\n\t\t\t\tprocess.stdin.pause();\n\t\t\t\tif (signal !== \"SIGTERM\") await flushRawStdout();\n\t\t\t\tfor (const cleanup of signalCleanupHandlers) cleanup();\n\t\t\t\tprocess.exit(pendingSignalExitCode ?? exitCode);\n\t\t\t}\n\t\t})();\n\t\treturn shutdownPromise;\n\t}\n\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\t\tawait shutdown();\n\t}\n\n\tlet inflightFlowCommands = 0;\n\tlet flowRpcControlPromise: ReturnType<typeof loadFlowRpcControl> | undefined;\n\tlet abortFlowWaiters = 0;\n\tconst abortFlowCancels = new Map<string, Promise<FlowCommandResult>>();\n\t// Flow is never imported here: without a loaded Flow the hook is absent and the command is rejected.\n\t// \"Not loaded\" and \"saturated\" rejections are transient (state of this process, not of the command), so they\n\t// bypass Flow's replay store and may succeed on a retry under the same id.\n\tconst submitFlowCommand = async (command: FlowControlCommandV1): Promise<FlowCommandResult> => {\n\t\tif (inflightFlowCommands >= MAX_INFLIGHT_FLOW_COMMANDS)\n\t\t\treturn { receipt: rejectedFlowReceipt(command, \"internal\") };\n\t\tinflightFlowCommands++;\n\t\ttry {\n\t\t\t// flow_message with no Flow loaded loads it so Flow's handler owns replay, targeting and queueing.\n\t\t\tconst loadedFlow = getFlowRpcControl();\n\t\t\tif (!loadedFlow && command.type === \"flow_message\") flowRpcControlPromise ??= loadFlowRpcControl();\n\t\t\tconst flow = loadedFlow ?? (flowRpcControlPromise ? await flowRpcControlPromise : undefined);\n\t\t\tif (flow) return await flow.handle(command);\n\t\t\treturn { receipt: rejectedFlowReceipt(command) };\n\t\t} finally {\n\t\t\tinflightFlowCommands--;\n\t\t}\n\t};\n\tconst handleFlowCommand = async (parsed: Record<string, unknown>): Promise<void> => {\n\t\tlet command: FlowControlCommandV1;\n\t\ttry {\n\t\t\tcommand = parseFlowControlCommandV1(parsed);\n\t\t} catch (parseError: unknown) {\n\t\t\t// A well-formed flow_message whose only defect is empty/over-max text is a refusal, not a malformed command.\n\t\t\tif (parsed.type === \"flow_message\" && typeof parsed.text === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst probe = parseFlowControlCommandV1({ ...parsed, text: \"x\" });\n\t\t\t\t\toutput(rejectedFlowReceipt(probe));\n\t\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\t// Another field is invalid: fall through to the error response.\n\t\t\t\t}\n\t\t\t}\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\ttypeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\t\t\tString(parsed.type),\n\t\t\t\t\t`Invalid command: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst result = await submitFlowCommand(command);\n\t\t\toutput(result.receipt);\n\t\t\tif (result.status) output({ type: \"flow_status\", status: result.status });\n\t\t} catch (flowError: unknown) {\n\t\t\toutput(error(command.id, command.type, flowError instanceof Error ? flowError.message : String(flowError)));\n\t\t}\n\t\tawait waitForRawStdoutBackpressure();\n\t};\n\n\tconst handleInputLine = async (line: string) => {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line);\n\t\t} catch (parseError: unknown) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"parse\",\n\t\t\t\t\t`Failed to parse command: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!isRecord(parsed)) {\n\t\t\toutput(error(undefined, \"parse\", \"Invalid command: expected a JSON object\"));\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle extension UI responses\n\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\tif (!isRpcExtensionUIResponse(parsed)) {\n\t\t\t\toutput(\n\t\t\t\t\terror(\n\t\t\t\t\t\ttypeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\t\t\t\t\"extension_ui_response\",\n\t\t\t\t\t\t\"Invalid command: malformed extension_ui_response\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = parsed;\n\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\tif (pending) {\n\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\tpending.resolve(response);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof parsed.type === \"string\" && FLOW_RPC_COMMAND_TYPES.has(parsed.type)) {\n\t\t\tawait handleFlowCommand(parsed);\n\t\t\treturn;\n\t\t}\n\n\t\tconst invalid = invalidRpcCommand(parsed);\n\t\tif (invalid) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\ttypeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\t\t\ttypeof parsed.type === \"string\" ? parsed.type : \"parse\",\n\t\t\t\t\t`Invalid command: ${invalid}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\tconst command = parsed as RpcCommand;\n\t\ttry {\n\t\t\tconst response = await handleCommand(command);\n\t\t\tif (response) {\n\t\t\t\toutput(response);\n\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t}\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (commandError: unknown) {\n\t\t\toutput(\n\t\t\t\terror(\n\t\t\t\t\tcommand.id,\n\t\t\t\t\tcommand.type,\n\t\t\t\t\tcommandError instanceof Error ? commandError.message : String(commandError),\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait waitForRawStdoutBackpressure();\n\t\t}\n\t};\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst detachJsonl = attachJsonlLineReader(\n\t\t\tprocess.stdin,\n\t\t\t(line) => {\n\t\t\t\tvoid handleInputLine(line);\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxLineLength: MAX_RPC_INPUT_LINE_LENGTH,\n\t\t\t\tonLineTooLong: () => {\n\t\t\t\t\toutput(\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\"parse\",\n\t\t\t\t\t\t\t`RPC command exceeds the ${MAX_RPC_INPUT_LINE_LENGTH}-character input limit`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tvoid waitForRawStdoutBackpressure();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
|
package/docs/docs.json
CHANGED
|
@@ -138,6 +138,14 @@
|
|
|
138
138
|
"title": "HUMAIN Code CLI",
|
|
139
139
|
"path": "humain-code.md"
|
|
140
140
|
},
|
|
141
|
+
{
|
|
142
|
+
"title": "Run Flow",
|
|
143
|
+
"path": "flow.md"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"title": "Configure Flow Profiles",
|
|
147
|
+
"path": "flow-profiles.md"
|
|
148
|
+
},
|
|
141
149
|
{
|
|
142
150
|
"title": "HUMAIN Code / Forge Architecture",
|
|
143
151
|
"path": "humain-code-forge-architecture.md"
|
|
@@ -82,6 +82,7 @@ These variables are read by HUMAIN Code CLI itself:
|
|
|
82
82
|
| Variable | Description |
|
|
83
83
|
|----------|-------------|
|
|
84
84
|
| `HUMAIN_TERMINAL_CODING_AGENT_DIR` | Override the config directory; default is `~/.humain-terminal/agent` |
|
|
85
|
+
| `HUMAIN_TERMINAL_TRUSTED_AGENTS_DIR` | Absolute directory of trusted packaged subagent definitions; loaded below user agents, above project agents, which cannot shadow its names. Agents in this directory load with user-level trust in every session where the variable is set. Flow sets it for its own children. Launchers that accept untrusted environment input must strip it |
|
|
85
86
|
| `HUMAIN_TERMINAL_CODING_AGENT_SESSION_DIR` | Override session storage; overridden by `--session-dir` |
|
|
86
87
|
| `HUMAIN_TERMINAL_PACKAGE_DIR` | Override the package directory, useful for Nix/Guix store paths |
|
|
87
88
|
| `HUMAIN_TERMINAL_OFFLINE` | Disable startup network operations, including update checks, package updates, and install/update telemetry |
|