iosm-cli 0.2.15 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +18 -1
  3. package/dist/cli/args.d.ts +2 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +16 -3
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-profiles.d.ts.map +1 -1
  8. package/dist/core/agent-profiles.js +3 -0
  9. package/dist/core/agent-profiles.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +2 -0
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +26 -10
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/agent-teams.d.ts.map +1 -1
  15. package/dist/core/agent-teams.js +12 -9
  16. package/dist/core/agent-teams.js.map +1 -1
  17. package/dist/core/checkpoint/fs-checkpoint.d.ts +14 -0
  18. package/dist/core/checkpoint/fs-checkpoint.d.ts.map +1 -0
  19. package/dist/core/checkpoint/fs-checkpoint.js +211 -0
  20. package/dist/core/checkpoint/fs-checkpoint.js.map +1 -0
  21. package/dist/core/command-dispatcher.d.ts +2 -0
  22. package/dist/core/command-dispatcher.d.ts.map +1 -1
  23. package/dist/core/command-dispatcher.js +78 -13
  24. package/dist/core/command-dispatcher.js.map +1 -1
  25. package/dist/core/mcp/cli.d.ts.map +1 -1
  26. package/dist/core/mcp/cli.js +26 -0
  27. package/dist/core/mcp/cli.js.map +1 -1
  28. package/dist/core/mcp/config.d.ts.map +1 -1
  29. package/dist/core/mcp/config.js +55 -0
  30. package/dist/core/mcp/config.js.map +1 -1
  31. package/dist/core/mcp/index.d.ts +1 -1
  32. package/dist/core/mcp/index.d.ts.map +1 -1
  33. package/dist/core/mcp/index.js.map +1 -1
  34. package/dist/core/mcp/runtime.d.ts +3 -1
  35. package/dist/core/mcp/runtime.d.ts.map +1 -1
  36. package/dist/core/mcp/runtime.js +21 -2
  37. package/dist/core/mcp/runtime.js.map +1 -1
  38. package/dist/core/mcp/types.d.ts +30 -2
  39. package/dist/core/mcp/types.d.ts.map +1 -1
  40. package/dist/core/mcp/types.js.map +1 -1
  41. package/dist/core/package-manager.d.ts +10 -0
  42. package/dist/core/package-manager.d.ts.map +1 -1
  43. package/dist/core/package-manager.js +100 -2
  44. package/dist/core/package-manager.js.map +1 -1
  45. package/dist/core/policy/engine.d.ts +77 -0
  46. package/dist/core/policy/engine.d.ts.map +1 -0
  47. package/dist/core/policy/engine.js +614 -0
  48. package/dist/core/policy/engine.js.map +1 -0
  49. package/dist/core/policy/index.d.ts +2 -0
  50. package/dist/core/policy/index.d.ts.map +1 -0
  51. package/dist/core/policy/index.js +2 -0
  52. package/dist/core/policy/index.js.map +1 -0
  53. package/dist/core/sandbox/executor.d.ts +13 -0
  54. package/dist/core/sandbox/executor.d.ts.map +1 -0
  55. package/dist/core/sandbox/executor.js +64 -0
  56. package/dist/core/sandbox/executor.js.map +1 -0
  57. package/dist/core/sdk.d.ts +2 -2
  58. package/dist/core/sdk.d.ts.map +1 -1
  59. package/dist/core/sdk.js +3 -3
  60. package/dist/core/sdk.js.map +1 -1
  61. package/dist/core/security/index.d.ts +3 -0
  62. package/dist/core/security/index.d.ts.map +1 -0
  63. package/dist/core/security/index.js +3 -0
  64. package/dist/core/security/index.js.map +1 -0
  65. package/dist/core/security/source-security.d.ts +43 -0
  66. package/dist/core/security/source-security.d.ts.map +1 -0
  67. package/dist/core/security/source-security.js +94 -0
  68. package/dist/core/security/source-security.js.map +1 -0
  69. package/dist/core/security/trust-ledger.d.ts +24 -0
  70. package/dist/core/security/trust-ledger.d.ts.map +1 -0
  71. package/dist/core/security/trust-ledger.js +66 -0
  72. package/dist/core/security/trust-ledger.js.map +1 -0
  73. package/dist/core/session-manager.d.ts.map +1 -1
  74. package/dist/core/session-manager.js +128 -15
  75. package/dist/core/session-manager.js.map +1 -1
  76. package/dist/core/settings-manager.d.ts +6 -0
  77. package/dist/core/settings-manager.d.ts.map +1 -1
  78. package/dist/core/settings-manager.js +22 -1
  79. package/dist/core/settings-manager.js.map +1 -1
  80. package/dist/core/system-prompt.d.ts.map +1 -1
  81. package/dist/core/system-prompt.js +9 -2
  82. package/dist/core/system-prompt.js.map +1 -1
  83. package/dist/core/task-plan.d.ts +1 -0
  84. package/dist/core/task-plan.d.ts.map +1 -1
  85. package/dist/core/task-plan.js +103 -0
  86. package/dist/core/task-plan.js.map +1 -1
  87. package/dist/core/tools/apply-patch.d.ts +29 -0
  88. package/dist/core/tools/apply-patch.d.ts.map +1 -0
  89. package/dist/core/tools/apply-patch.js +167 -0
  90. package/dist/core/tools/apply-patch.js.map +1 -0
  91. package/dist/core/tools/bash.d.ts.map +1 -1
  92. package/dist/core/tools/bash.js +15 -1
  93. package/dist/core/tools/bash.js.map +1 -1
  94. package/dist/core/tools/git-common.d.ts.map +1 -1
  95. package/dist/core/tools/git-common.js +15 -1
  96. package/dist/core/tools/git-common.js.map +1 -1
  97. package/dist/core/tools/index.d.ts +20 -2
  98. package/dist/core/tools/index.d.ts.map +1 -1
  99. package/dist/core/tools/index.js +85 -25
  100. package/dist/core/tools/index.js.map +1 -1
  101. package/dist/core/tools/permissions.d.ts +16 -0
  102. package/dist/core/tools/permissions.d.ts.map +1 -1
  103. package/dist/core/tools/permissions.js +34 -1
  104. package/dist/core/tools/permissions.js.map +1 -1
  105. package/dist/core/tools/task.d.ts.map +1 -1
  106. package/dist/core/tools/task.js +68 -24
  107. package/dist/core/tools/task.js.map +1 -1
  108. package/dist/core/tools/tool-search.d.ts +24 -0
  109. package/dist/core/tools/tool-search.d.ts.map +1 -0
  110. package/dist/core/tools/tool-search.js +85 -0
  111. package/dist/core/tools/tool-search.js.map +1 -0
  112. package/dist/core/tools/tool-suggest.d.ts +18 -0
  113. package/dist/core/tools/tool-suggest.d.ts.map +1 -0
  114. package/dist/core/tools/tool-suggest.js +94 -0
  115. package/dist/core/tools/tool-suggest.js.map +1 -0
  116. package/dist/core/tools/verification-runner.d.ts.map +1 -1
  117. package/dist/core/tools/verification-runner.js +15 -1
  118. package/dist/core/tools/verification-runner.js.map +1 -1
  119. package/dist/core/unified-exec.d.ts +39 -0
  120. package/dist/core/unified-exec.d.ts.map +1 -0
  121. package/dist/core/unified-exec.js +286 -0
  122. package/dist/core/unified-exec.js.map +1 -0
  123. package/dist/main.d.ts.map +1 -1
  124. package/dist/main.js +93 -11
  125. package/dist/main.js.map +1 -1
  126. package/dist/modes/acp/acp-mode.d.ts +17 -0
  127. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  128. package/dist/modes/acp/acp-mode.js +352 -0
  129. package/dist/modes/acp/acp-mode.js.map +1 -0
  130. package/dist/modes/index.d.ts +2 -1
  131. package/dist/modes/index.d.ts.map +1 -1
  132. package/dist/modes/index.js +1 -0
  133. package/dist/modes/index.js.map +1 -1
  134. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  135. package/dist/modes/interactive/components/tool-execution.js +217 -0
  136. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  137. package/dist/modes/interactive/interactive-mode.d.ts +8 -0
  138. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  139. package/dist/modes/interactive/interactive-mode.js +159 -72
  140. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  141. package/dist/modes/rpc/rpc-client.d.ts +25 -1
  142. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  143. package/dist/modes/rpc/rpc-client.js +33 -0
  144. package/dist/modes/rpc/rpc-client.js.map +1 -1
  145. package/dist/modes/rpc/rpc-mode.d.ts +13 -1
  146. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  147. package/dist/modes/rpc/rpc-mode.js +189 -28
  148. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  149. package/dist/modes/rpc/rpc-types.d.ts +54 -1
  150. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-types.js.map +1 -1
  152. package/dist/utils/tools-manager.d.ts.map +1 -1
  153. package/dist/utils/tools-manager.js +96 -9
  154. package/dist/utils/tools-manager.js.map +1 -1
  155. package/docs/README.md +2 -0
  156. package/docs/acp-rpc-mapping.md +38 -0
  157. package/docs/configuration.generated.md +81 -0
  158. package/docs/configuration.md +7 -0
  159. package/package.json +4 -1
@@ -13,7 +13,10 @@
13
13
  import * as crypto from "node:crypto";
14
14
  import * as readline from "readline";
15
15
  import { dispatchBuiltinSlashCommand } from "../../core/command-dispatcher.js";
16
+ import { evaluatePermissionWithPolicy } from "../../core/policy/index.js";
16
17
  import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
18
+ import { UnifiedExecManager } from "../../core/unified-exec.js";
19
+ import { PermissionGrantStore, } from "../../core/tools/index.js";
17
20
  import { theme } from "../interactive/theme/theme.js";
18
21
  // ============================================================================
19
22
  // Input validation
@@ -25,10 +28,11 @@ const VALID_RPC_COMMAND_TYPES = new Set([
25
28
  "set_model", "cycle_model", "get_available_models",
26
29
  "set_thinking_level", "cycle_thinking_level",
27
30
  "set_permission_mode", "get_permission_mode",
31
+ "request_permissions",
28
32
  "set_steering_mode", "set_follow_up_mode",
29
33
  "compact", "set_auto_compaction",
30
34
  "set_auto_retry", "abort_retry",
31
- "bash", "abort_bash",
35
+ "bash", "abort_bash", "exec_command", "write_stdin",
32
36
  "get_session_stats", "export_html", "switch_session", "fork",
33
37
  "get_fork_messages", "get_last_assistant_text", "set_session_name",
34
38
  "get_messages", "get_commands", "get_builtin_commands", "run_builtin_command",
@@ -44,6 +48,7 @@ const REQUIRED_STRING_FIELDS = {
44
48
  set_steering_mode: ["mode"],
45
49
  set_follow_up_mode: ["mode"],
46
50
  bash: ["command"],
51
+ exec_command: ["command"],
47
52
  switch_session: ["sessionPath"],
48
53
  fork: ["entryId"],
49
54
  set_session_name: ["name"],
@@ -54,11 +59,34 @@ const REQUIRED_BOOLEAN_FIELDS = {
54
59
  set_auto_compaction: ["enabled"],
55
60
  set_auto_retry: ["enabled"],
56
61
  };
62
+ /** Fields that must be numbers for specific command types */
63
+ const REQUIRED_NUMBER_FIELDS = {
64
+ write_stdin: ["sessionId"],
65
+ };
66
+ /** Fields that must be objects for specific command types */
67
+ const REQUIRED_OBJECT_FIELDS = {
68
+ request_permissions: ["request"],
69
+ };
70
+ /** Optional fields that must be numbers when present */
71
+ const OPTIONAL_NUMBER_FIELDS = {
72
+ exec_command: ["yieldTimeMs", "maxOutputChars"],
73
+ write_stdin: ["yieldTimeMs", "maxOutputChars"],
74
+ };
75
+ /** Optional fields that must be strings when present */
76
+ const OPTIONAL_STRING_FIELDS = {
77
+ exec_command: ["cwd", "shell"],
78
+ write_stdin: ["chars"],
79
+ request_permissions: ["scope"],
80
+ };
81
+ /** Optional fields that must be booleans when present */
82
+ const OPTIONAL_BOOLEAN_FIELDS = {
83
+ exec_command: ["tty", "login"],
84
+ };
57
85
  /**
58
86
  * Validates a parsed RPC command object at runtime.
59
87
  * Returns an error string if invalid, undefined if valid.
60
88
  */
61
- function validateRpcCommand(parsed) {
89
+ export function validateRpcCommand(parsed) {
62
90
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
63
91
  return "Command must be a JSON object.";
64
92
  }
@@ -80,9 +108,39 @@ function validateRpcCommand(parsed) {
80
108
  return `Command "${type}" requires a boolean field "${field}".`;
81
109
  }
82
110
  }
111
+ for (const field of REQUIRED_NUMBER_FIELDS[type] ?? []) {
112
+ if (typeof obj[field] !== "number" || Number.isNaN(obj[field])) {
113
+ return `Command "${type}" requires a numeric field "${field}".`;
114
+ }
115
+ }
116
+ for (const field of REQUIRED_OBJECT_FIELDS[type] ?? []) {
117
+ if (typeof obj[field] !== "object" || obj[field] === null || Array.isArray(obj[field])) {
118
+ return `Command "${type}" requires an object field "${field}".`;
119
+ }
120
+ }
121
+ for (const field of OPTIONAL_NUMBER_FIELDS[type] ?? []) {
122
+ if (field in obj && obj[field] !== undefined && (typeof obj[field] !== "number" || Number.isNaN(obj[field]))) {
123
+ return `Command "${type}" expects "${field}" to be numeric when provided.`;
124
+ }
125
+ }
126
+ for (const field of OPTIONAL_STRING_FIELDS[type] ?? []) {
127
+ if (field in obj && obj[field] !== undefined && typeof obj[field] !== "string") {
128
+ return `Command "${type}" expects "${field}" to be a string when provided.`;
129
+ }
130
+ }
131
+ for (const field of OPTIONAL_BOOLEAN_FIELDS[type] ?? []) {
132
+ if (field in obj && obj[field] !== undefined && typeof obj[field] !== "boolean") {
133
+ return `Command "${type}" expects "${field}" to be a boolean when provided.`;
134
+ }
135
+ }
136
+ if (type === "request_permissions" && obj.scope !== undefined) {
137
+ if (obj.scope !== "once" && obj.scope !== "turn" && obj.scope !== "session") {
138
+ return 'Command "request_permissions" expects "scope" to be one of: once, turn, session.';
139
+ }
140
+ }
83
141
  return undefined;
84
142
  }
85
- const DANGEROUS_TOOL_NAMES = new Set(["bash", "edit", "write", "git_write", "fs_ops", "db_run"]);
143
+ const DANGEROUS_TOOL_NAMES = new Set(["bash", "edit", "write", "apply_patch", "git_write", "fs_ops", "db_run"]);
86
144
  function matchesPermissionRule(rule, request) {
87
145
  const [ruleToolRaw, ...rest] = rule.split(":");
88
146
  const ruleTool = (ruleToolRaw ?? "").trim();
@@ -97,11 +155,18 @@ function buildPermissionPromptLabel(request) {
97
155
  const sourceLabel = request.toolSource === "extension" ? " extension" : "";
98
156
  return `${request.toolName}${tierLabel}${sourceLabel}: ${request.summary}`;
99
157
  }
158
+ function normalizePermissionGrantScope(value) {
159
+ if (value === "turn" || value === "session" || value === "once") {
160
+ return value;
161
+ }
162
+ return "once";
163
+ }
100
164
  /**
101
165
  * Run in RPC mode.
102
166
  * Listens for JSON commands on stdin, outputs events and responses on stdout.
103
167
  */
104
- export async function runRpcMode(session) {
168
+ export async function runRpcMode(session, options = {}) {
169
+ const execManager = new UnifiedExecManager();
105
170
  const output = (obj) => {
106
171
  console.log(JSON.stringify(obj));
107
172
  };
@@ -116,6 +181,7 @@ export async function runRpcMode(session) {
116
181
  };
117
182
  // Pending extension UI requests waiting for response
118
183
  const pendingExtensionRequests = new Map();
184
+ const permissionGrants = new PermissionGrantStore();
119
185
  // Shutdown request flag
120
186
  let shutdownRequested = false;
121
187
  /** Helper for dialog methods with signal/timeout support */
@@ -161,38 +227,92 @@ export async function runRpcMode(session) {
161
227
  id,
162
228
  message,
163
229
  request,
230
+ scopes: ["once", "turn", "session"],
231
+ defaultScope: "once",
164
232
  });
165
- return createDialogPromise({ timeout: 5 * 60 * 1000 }, false, { method: "confirm_permission", title, message, request, timeout: 5 * 60 * 1000 }, (response) => ("cancelled" in response && response.cancelled ? false : "confirmed" in response ? response.confirmed : false), id);
233
+ return createDialogPromise({ timeout: 5 * 60 * 1000 }, { allowed: false, scope: "once" }, { method: "confirm_permission", title, message, request, timeout: 5 * 60 * 1000 }, (response) => {
234
+ if ("cancelled" in response && response.cancelled) {
235
+ return { allowed: false, scope: "once" };
236
+ }
237
+ if (!("confirmed" in response) || !response.confirmed) {
238
+ return { allowed: false, scope: "once" };
239
+ }
240
+ const scope = response.scope === "turn" || response.scope === "session" || response.scope === "once"
241
+ ? response.scope
242
+ : "once";
243
+ return { allowed: true, scope };
244
+ }, id);
166
245
  }
167
- session.setToolPermissionHandler(async (request) => {
168
- const denyRules = session.settingsManager.getPermissionDenyRules();
169
- for (const rule of denyRules) {
170
- if (matchesPermissionRule(rule, request)) {
171
- return false;
172
- }
246
+ const evaluateRequest = async (request) => {
247
+ if (permissionGrants.isAllowed(request)) {
248
+ return { allowed: true, reason: "Allowed by cached turn/session grant.", effect: "allow" };
173
249
  }
174
- const allowRules = session.settingsManager.getPermissionAllowRules();
175
- for (const rule of allowRules) {
176
- if (matchesPermissionRule(rule, request)) {
177
- return true;
250
+ options.policyEngine?.refresh();
251
+ if (options.policyEngine) {
252
+ const evaluated = evaluatePermissionWithPolicy(options.policyEngine, request, {
253
+ profile: options.profileName,
254
+ runtimeMode: "rpc",
255
+ permissionMode: session.settingsManager.getPermissionMode(),
256
+ strictExtensionToolEnforcement: session.settingsManager.getPermissionExtensionToolEnforcement(),
257
+ });
258
+ if (evaluated.outcome === "allow") {
259
+ return {
260
+ allowed: true,
261
+ reason: evaluated.reason,
262
+ effect: evaluated.decision.effect,
263
+ ruleId: evaluated.decision.rule?.id,
264
+ policyLayer: evaluated.decision.layer,
265
+ };
266
+ }
267
+ if (evaluated.outcome === "deny") {
268
+ return {
269
+ allowed: false,
270
+ reason: evaluated.reason,
271
+ effect: evaluated.decision.effect,
272
+ ruleId: evaluated.decision.rule?.id,
273
+ policyLayer: evaluated.decision.layer,
274
+ };
178
275
  }
179
276
  }
180
- const mode = session.settingsManager.getPermissionMode();
181
- if (mode === "yolo") {
182
- return true;
183
- }
184
- // Non-destructive tools stay non-interactive in RPC mode.
185
- if (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {
186
- return true;
187
- }
188
- if (mode === "auto") {
189
- // Keep parity with interactive defaults: edit/write are auto-approved.
190
- if (request.toolName === "edit" || request.toolName === "write") {
191
- return true;
277
+ else {
278
+ const denyRules = session.settingsManager.getPermissionDenyRules();
279
+ for (const rule of denyRules) {
280
+ if (matchesPermissionRule(rule, request)) {
281
+ return { allowed: false, reason: `Denied by legacy rule: ${rule}`, effect: "deny" };
282
+ }
283
+ }
284
+ const allowRules = session.settingsManager.getPermissionAllowRules();
285
+ for (const rule of allowRules) {
286
+ if (matchesPermissionRule(rule, request)) {
287
+ return { allowed: true, reason: `Allowed by legacy rule: ${rule}`, effect: "allow" };
288
+ }
289
+ }
290
+ const mode = session.settingsManager.getPermissionMode();
291
+ if (mode === "yolo") {
292
+ return { allowed: true, reason: "Permission mode is yolo.", effect: "allow" };
293
+ }
294
+ if (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {
295
+ return { allowed: true, reason: "RPC mode auto-approves non-dangerous tools.", effect: "allow" };
296
+ }
297
+ if (mode === "auto" && (request.toolName === "edit" || request.toolName === "write" || request.toolName === "apply_patch")) {
298
+ return { allowed: true, reason: "Permission mode auto allows edit/write/apply_patch.", effect: "allow" };
192
299
  }
193
300
  }
194
- return requestToolPermissionFromHost(request);
301
+ const confirmed = await requestToolPermissionFromHost(request);
302
+ if (confirmed.allowed) {
303
+ permissionGrants.allow(request, confirmed.scope);
304
+ }
305
+ return {
306
+ allowed: confirmed.allowed,
307
+ reason: confirmed.allowed ? "Confirmed by RPC host." : "Denied by RPC host.",
308
+ effect: "ask",
309
+ };
310
+ };
311
+ session.setToolPermissionHandler(async (request) => {
312
+ const decision = await evaluateRequest(request);
313
+ return decision.allowed;
195
314
  });
315
+ options.mcpRuntime?.setPermissionGuard((request) => evaluateRequest(request));
196
316
  /**
197
317
  * Create an extension UI context that uses the RPC protocol.
198
318
  */
@@ -362,6 +482,9 @@ export async function runRpcMode(session) {
362
482
  });
363
483
  // Output all agent events as JSON
364
484
  session.subscribe((event) => {
485
+ if (event.type === "agent_start") {
486
+ permissionGrants.resetTurn();
487
+ }
365
488
  output(event);
366
489
  });
367
490
  // Handle a single command
@@ -466,6 +589,18 @@ export async function runRpcMode(session) {
466
589
  case "get_permission_mode": {
467
590
  return success(id, "get_permission_mode", { mode: session.settingsManager.getPermissionMode() });
468
591
  }
592
+ case "request_permissions": {
593
+ const decision = await evaluateRequest(command.request);
594
+ const scope = normalizePermissionGrantScope(command.scope);
595
+ if (decision.allowed) {
596
+ permissionGrants.allow(command.request, scope);
597
+ }
598
+ return success(id, "request_permissions", {
599
+ allowed: decision.allowed,
600
+ scope,
601
+ reason: decision.reason,
602
+ });
603
+ }
469
604
  // =================================================================
470
605
  // Queue Modes
471
606
  // =================================================================
@@ -510,6 +645,27 @@ export async function runRpcMode(session) {
510
645
  session.abortBash();
511
646
  return success(id, "abort_bash");
512
647
  }
648
+ case "exec_command": {
649
+ const result = await execManager.execCommand({
650
+ command: command.command,
651
+ cwd: command.cwd,
652
+ tty: command.tty,
653
+ login: command.login,
654
+ shell: command.shell,
655
+ yieldTimeMs: command.yieldTimeMs,
656
+ maxOutputChars: command.maxOutputChars,
657
+ });
658
+ return success(id, "exec_command", result);
659
+ }
660
+ case "write_stdin": {
661
+ const result = await execManager.writeStdin({
662
+ sessionId: command.sessionId,
663
+ chars: command.chars,
664
+ yieldTimeMs: command.yieldTimeMs,
665
+ maxOutputChars: command.maxOutputChars,
666
+ });
667
+ return success(id, "write_stdin", result);
668
+ }
513
669
  // =================================================================
514
670
  // Session
515
671
  // =================================================================
@@ -599,6 +755,7 @@ export async function runRpcMode(session) {
599
755
  const result = await dispatchBuiltinSlashCommand(command.commandText, {
600
756
  session,
601
757
  settingsManager: session.settingsManager,
758
+ policyEngine: options.policyEngine,
602
759
  });
603
760
  return success(id, "run_builtin_command", result);
604
761
  }
@@ -619,6 +776,7 @@ export async function runRpcMode(session) {
619
776
  if (currentRunner?.hasHandlers("session_shutdown")) {
620
777
  await currentRunner.emit({ type: "session_shutdown" });
621
778
  }
779
+ execManager.dispose();
622
780
  // Close readline interface to stop waiting for input
623
781
  rl.close();
624
782
  process.exit(0);
@@ -629,6 +787,9 @@ export async function runRpcMode(session) {
629
787
  output: process.stdout,
630
788
  terminal: false,
631
789
  });
790
+ process.once("exit", () => {
791
+ execManager.dispose();
792
+ });
632
793
  rl.on("line", async (line) => {
633
794
  try {
634
795
  const parsed = JSON.parse(line);
@@ -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 * as readline from \"readline\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport { dispatchBuiltinSlashCommand } from \"../../core/command-dispatcher.js\";\nimport { BUILTIN_SLASH_COMMANDS } from \"../../core/slash-commands.js\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n} from \"../../core/extensions/index.js\";\nimport type { ToolPermissionRequest } from \"../../core/tools/index.js\";\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcRequiresConfirmationEvent,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.js\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcRequiresConfirmationEvent,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Input validation\n// ============================================================================\n\n/** All valid RPC command type strings */\nconst VALID_RPC_COMMAND_TYPES = new Set<string>([\n\t\"prompt\", \"steer\", \"follow_up\", \"abort\", \"new_session\",\n\t\"get_state\",\n\t\"set_model\", \"cycle_model\", \"get_available_models\",\n\t\"set_thinking_level\", \"cycle_thinking_level\",\n\t\"set_permission_mode\", \"get_permission_mode\",\n\t\"set_steering_mode\", \"set_follow_up_mode\",\n\t\"compact\", \"set_auto_compaction\",\n\t\"set_auto_retry\", \"abort_retry\",\n\t\"bash\", \"abort_bash\",\n\t\"get_session_stats\", \"export_html\", \"switch_session\", \"fork\",\n\t\"get_fork_messages\", \"get_last_assistant_text\", \"set_session_name\",\n\t\"get_messages\", \"get_commands\", \"get_builtin_commands\", \"run_builtin_command\",\n]);\n\n/** Fields that must be strings for specific command types */\nconst REQUIRED_STRING_FIELDS: Partial<Record<string, string[]>> = {\n\tprompt: [\"message\"],\n\tsteer: [\"message\"],\n\tfollow_up: [\"message\"],\n\tset_model: [\"provider\", \"modelId\"],\n\tset_thinking_level: [\"level\"],\n\tset_permission_mode: [\"mode\"],\n\tset_steering_mode: [\"mode\"],\n\tset_follow_up_mode: [\"mode\"],\n\tbash: [\"command\"],\n\tswitch_session: [\"sessionPath\"],\n\tfork: [\"entryId\"],\n\tset_session_name: [\"name\"],\n\trun_builtin_command: [\"commandText\"],\n};\n\n/** Fields that must be booleans for specific command types */\nconst REQUIRED_BOOLEAN_FIELDS: Partial<Record<string, string[]>> = {\n\tset_auto_compaction: [\"enabled\"],\n\tset_auto_retry: [\"enabled\"],\n};\n\n/**\n * Validates a parsed RPC command object at runtime.\n * Returns an error string if invalid, undefined if valid.\n */\nfunction validateRpcCommand(parsed: unknown): string | undefined {\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\treturn \"Command must be a JSON object.\";\n\t}\n\n\tconst obj = parsed as Record<string, unknown>;\n\tconst type = obj.type;\n\n\tif (typeof type !== \"string\" || !type) {\n\t\treturn 'Command must have a string \"type\" field.';\n\t}\n\n\tif (!VALID_RPC_COMMAND_TYPES.has(type)) {\n\t\treturn `Unknown command type: \"${type}\".`;\n\t}\n\n\tfor (const field of REQUIRED_STRING_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"string\") {\n\t\t\treturn `Command \"${type}\" requires a string field \"${field}\".`;\n\t\t}\n\t}\n\n\tfor (const field of REQUIRED_BOOLEAN_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"boolean\") {\n\t\t\treturn `Command \"${type}\" requires a boolean field \"${field}\".`;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nconst DANGEROUS_TOOL_NAMES = new Set([\"bash\", \"edit\", \"write\", \"git_write\", \"fs_ops\", \"db_run\"]);\n\nfunction matchesPermissionRule(rule: string, request: ToolPermissionRequest): boolean {\n\tconst [ruleToolRaw, ...rest] = rule.split(\":\");\n\tconst ruleTool = (ruleToolRaw ?? \"\").trim();\n\tconst ruleNeedle = rest.join(\":\").trim().toLowerCase();\n\tconst toolMatches = !ruleTool || ruleTool === \"*\" || ruleTool === request.toolName;\n\tif (!toolMatches) return false;\n\treturn !ruleNeedle || request.summary.toLowerCase().includes(ruleNeedle);\n}\n\nfunction buildPermissionPromptLabel(request: ToolPermissionRequest): string {\n\tconst tierLabel = request.requiredPermission ? ` [${request.requiredPermission}]` : \"\";\n\tconst sourceLabel = request.toolSource === \"extension\" ? \" extension\" : \"\";\n\treturn `${request.toolName}${tierLabel}${sourceLabel}: ${request.summary}`;\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(session: AgentSession): Promise<never> {\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | RpcRequiresConfirmationEvent | object) => {\n\t\tconsole.log(JSON.stringify(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\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\trequestId?: string,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = requestId ?? 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\tasync function requestToolPermissionFromHost(request: ToolPermissionRequest): Promise<boolean> {\n\t\tconst id = crypto.randomUUID();\n\t\tconst title = \"Permission required\";\n\t\tconst message = buildPermissionPromptLabel(request);\n\t\toutput({\n\t\t\ttype: \"requires_confirmation\",\n\t\t\tid,\n\t\t\tmessage,\n\t\t\trequest,\n\t\t} satisfies RpcRequiresConfirmationEvent);\n\n\t\treturn createDialogPromise(\n\t\t\t{ timeout: 5 * 60 * 1000 },\n\t\t\tfalse,\n\t\t\t{ method: \"confirm_permission\", title, message, request, timeout: 5 * 60 * 1000 },\n\t\t\t(response) => (\"cancelled\" in response && response.cancelled ? false : \"confirmed\" in response ? response.confirmed : false),\n\t\t\tid,\n\t\t);\n\t}\n\n\tsession.setToolPermissionHandler(async (request) => {\n\t\tconst denyRules = session.settingsManager.getPermissionDenyRules();\n\t\tfor (const rule of denyRules) {\n\t\t\tif (matchesPermissionRule(rule, request)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tconst allowRules = session.settingsManager.getPermissionAllowRules();\n\t\tfor (const rule of allowRules) {\n\t\t\tif (matchesPermissionRule(rule, request)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst mode = session.settingsManager.getPermissionMode();\n\t\tif (mode === \"yolo\") {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Non-destructive tools stay non-interactive in RPC mode.\n\t\tif (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (mode === \"auto\") {\n\t\t\t// Keep parity with interactive defaults: edit/write are auto-approved.\n\t\t\tif (request.toolName === \"edit\" || request.toolName === \"write\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn requestToolPermissionFromHost(request);\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\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\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\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 new Promise((resolve, reject) => {\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\treject,\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\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\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\t// Set up extensions with RPC-based UI context\n\tawait session.bindExtensions({\n\t\tuiContext: createExtensionUIContext(),\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\tconst success = await session.newSession(options);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tshutdownHandler: () => {\n\t\t\tshutdownRequested = true;\n\t\t},\n\t\tonError: (err) => {\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t},\n\t});\n\n\t// Output all agent events as JSON\n\tsession.subscribe((event) => {\n\t\toutput(event);\n\t});\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\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// Don't await - events will stream\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\n\t\t\t\tsession\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})\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\n\t\t\t\treturn success(id, \"prompt\");\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\tawait session.steer(command.message, command.images);\n\t\t\t\treturn success(id, \"steer\");\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\tawait session.followUp(command.message, command.images);\n\t\t\t\treturn success(id, \"follow_up\");\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 \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst cancelled = !(await session.newSession(options));\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\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\tpermissionMode: session.settingsManager.getPermissionMode(),\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 success(id, \"get_state\", state);\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 = await session.modelRegistry.getAvailable();\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 = await session.modelRegistry.getAvailable();\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 \"set_permission_mode\": {\n\t\t\t\tsession.settingsManager.setPermissionMode(command.mode);\n\t\t\t\treturn success(id, \"set_permission_mode\", { mode: session.settingsManager.getPermissionMode() });\n\t\t\t}\n\n\t\t\tcase \"get_permission_mode\": {\n\t\t\t\treturn success(id, \"get_permission_mode\", { mode: session.settingsManager.getPermissionMode() });\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 result = await session.executeBash(command.command);\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 cancelled = !(await session.switchSession(command.sessionPath));\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await session.fork(command.entryId);\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, 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_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\t// Extension commands\n\t\t\t\tfor (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tpath: extensionPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Prompt templates (source is always \"user\" | \"project\" | \"path\" in coding-agent)\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\tlocation: template.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: template.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Skills (source is always \"user\" | \"project\" | \"path\" in coding-agent)\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\tlocation: skill.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: skill.filePath,\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\tcase \"get_builtin_commands\": {\n\t\t\t\treturn success(id, \"get_builtin_commands\", {\n\t\t\t\t\tcommands: BUILTIN_SLASH_COMMANDS.map((command) => ({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t})),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"run_builtin_command\": {\n\t\t\t\tconst result = await dispatchBuiltinSlashCommand(command.commandText, {\n\t\t\t\t\tsession,\n\t\t\t\t\tsettingsManager: session.settingsManager,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"run_builtin_command\", result);\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(undefined, 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\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\n\t\tconst currentRunner = session.extensionRunner;\n\t\tif (currentRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait currentRunner.emit({ type: \"session_shutdown\" });\n\t\t}\n\n\t\t// Close readline interface to stop waiting for input\n\t\trl.close();\n\t\tprocess.exit(0);\n\t}\n\n\t// Listen for JSON input\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tterminal: false,\n\t});\n\n\trl.on(\"line\", async (line: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(line);\n\n\t\t\t// Handle extension UI responses\n\t\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\t\tif (pending) {\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\t\tpending.resolve(response);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Validate regular commands before processing\n\t\t\tconst validationError = validateRpcCommand(parsed);\n\t\t\tif (validationError) {\n\t\t\t\toutput(error(undefined, \"parse\", validationError));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst command = parsed as RpcCommand;\n\t\t\tconst response = await handleCommand(command);\n\t\t\toutput(response);\n\n\t\t\t// Check for deferred shutdown request (idle between commands)\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (e: any) {\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\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 * as readline from \"readline\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport { dispatchBuiltinSlashCommand } from \"../../core/command-dispatcher.js\";\nimport type { McpPermissionDecision, McpRuntime } from \"../../core/mcp/index.js\";\nimport { evaluatePermissionWithPolicy, type PolicyEngineV2 } from \"../../core/policy/index.js\";\nimport { BUILTIN_SLASH_COMMANDS } from \"../../core/slash-commands.js\";\nimport { UnifiedExecManager } from \"../../core/unified-exec.js\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n} from \"../../core/extensions/index.js\";\nimport {\n\ttype PermissionGrantScope,\n\tPermissionGrantStore,\n\ttype ToolPermissionRequest,\n} from \"../../core/tools/index.js\";\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcRequiresConfirmationEvent,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.js\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcRequiresConfirmationEvent,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Input validation\n// ============================================================================\n\n/** All valid RPC command type strings */\nconst VALID_RPC_COMMAND_TYPES = new Set<string>([\n\t\"prompt\", \"steer\", \"follow_up\", \"abort\", \"new_session\",\n\t\"get_state\",\n\t\"set_model\", \"cycle_model\", \"get_available_models\",\n\t\"set_thinking_level\", \"cycle_thinking_level\",\n\t\"set_permission_mode\", \"get_permission_mode\",\n\t\"request_permissions\",\n\t\"set_steering_mode\", \"set_follow_up_mode\",\n\t\"compact\", \"set_auto_compaction\",\n\t\"set_auto_retry\", \"abort_retry\",\n\t\"bash\", \"abort_bash\", \"exec_command\", \"write_stdin\",\n\t\"get_session_stats\", \"export_html\", \"switch_session\", \"fork\",\n\t\"get_fork_messages\", \"get_last_assistant_text\", \"set_session_name\",\n\t\"get_messages\", \"get_commands\", \"get_builtin_commands\", \"run_builtin_command\",\n]);\n\n/** Fields that must be strings for specific command types */\nconst REQUIRED_STRING_FIELDS: Partial<Record<string, string[]>> = {\n\tprompt: [\"message\"],\n\tsteer: [\"message\"],\n\tfollow_up: [\"message\"],\n\tset_model: [\"provider\", \"modelId\"],\n\tset_thinking_level: [\"level\"],\n\tset_permission_mode: [\"mode\"],\n\tset_steering_mode: [\"mode\"],\n\tset_follow_up_mode: [\"mode\"],\n\tbash: [\"command\"],\n\texec_command: [\"command\"],\n\tswitch_session: [\"sessionPath\"],\n\tfork: [\"entryId\"],\n\tset_session_name: [\"name\"],\n\trun_builtin_command: [\"commandText\"],\n};\n\n/** Fields that must be booleans for specific command types */\nconst REQUIRED_BOOLEAN_FIELDS: Partial<Record<string, string[]>> = {\n\tset_auto_compaction: [\"enabled\"],\n\tset_auto_retry: [\"enabled\"],\n};\n\n/** Fields that must be numbers for specific command types */\nconst REQUIRED_NUMBER_FIELDS: Partial<Record<string, string[]>> = {\n\twrite_stdin: [\"sessionId\"],\n};\n\n/** Fields that must be objects for specific command types */\nconst REQUIRED_OBJECT_FIELDS: Partial<Record<string, string[]>> = {\n\trequest_permissions: [\"request\"],\n};\n\n/** Optional fields that must be numbers when present */\nconst OPTIONAL_NUMBER_FIELDS: Partial<Record<string, string[]>> = {\n\texec_command: [\"yieldTimeMs\", \"maxOutputChars\"],\n\twrite_stdin: [\"yieldTimeMs\", \"maxOutputChars\"],\n};\n\n/** Optional fields that must be strings when present */\nconst OPTIONAL_STRING_FIELDS: Partial<Record<string, string[]>> = {\n\texec_command: [\"cwd\", \"shell\"],\n\twrite_stdin: [\"chars\"],\n\trequest_permissions: [\"scope\"],\n};\n\n/** Optional fields that must be booleans when present */\nconst OPTIONAL_BOOLEAN_FIELDS: Partial<Record<string, string[]>> = {\n\texec_command: [\"tty\", \"login\"],\n};\n\n/**\n * Validates a parsed RPC command object at runtime.\n * Returns an error string if invalid, undefined if valid.\n */\nexport function validateRpcCommand(parsed: unknown): string | undefined {\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\treturn \"Command must be a JSON object.\";\n\t}\n\n\tconst obj = parsed as Record<string, unknown>;\n\tconst type = obj.type;\n\n\tif (typeof type !== \"string\" || !type) {\n\t\treturn 'Command must have a string \"type\" field.';\n\t}\n\n\tif (!VALID_RPC_COMMAND_TYPES.has(type)) {\n\t\treturn `Unknown command type: \"${type}\".`;\n\t}\n\n\tfor (const field of REQUIRED_STRING_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"string\") {\n\t\t\treturn `Command \"${type}\" requires a string field \"${field}\".`;\n\t\t}\n\t}\n\n\tfor (const field of REQUIRED_BOOLEAN_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"boolean\") {\n\t\t\treturn `Command \"${type}\" requires a boolean field \"${field}\".`;\n\t\t}\n\t}\n\n\tfor (const field of REQUIRED_NUMBER_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"number\" || Number.isNaN(obj[field])) {\n\t\t\treturn `Command \"${type}\" requires a numeric field \"${field}\".`;\n\t\t}\n\t}\n\n\tfor (const field of REQUIRED_OBJECT_FIELDS[type] ?? []) {\n\t\tif (typeof obj[field] !== \"object\" || obj[field] === null || Array.isArray(obj[field])) {\n\t\t\treturn `Command \"${type}\" requires an object field \"${field}\".`;\n\t\t}\n\t}\n\n\tfor (const field of OPTIONAL_NUMBER_FIELDS[type] ?? []) {\n\t\tif (field in obj && obj[field] !== undefined && (typeof obj[field] !== \"number\" || Number.isNaN(obj[field]))) {\n\t\t\treturn `Command \"${type}\" expects \"${field}\" to be numeric when provided.`;\n\t\t}\n\t}\n\n\tfor (const field of OPTIONAL_STRING_FIELDS[type] ?? []) {\n\t\tif (field in obj && obj[field] !== undefined && typeof obj[field] !== \"string\") {\n\t\t\treturn `Command \"${type}\" expects \"${field}\" to be a string when provided.`;\n\t\t}\n\t}\n\n\tfor (const field of OPTIONAL_BOOLEAN_FIELDS[type] ?? []) {\n\t\tif (field in obj && obj[field] !== undefined && typeof obj[field] !== \"boolean\") {\n\t\t\treturn `Command \"${type}\" expects \"${field}\" to be a boolean when provided.`;\n\t\t}\n\t}\n\n\tif (type === \"request_permissions\" && obj.scope !== undefined) {\n\t\tif (obj.scope !== \"once\" && obj.scope !== \"turn\" && obj.scope !== \"session\") {\n\t\t\treturn 'Command \"request_permissions\" expects \"scope\" to be one of: once, turn, session.';\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nconst DANGEROUS_TOOL_NAMES = new Set([\"bash\", \"edit\", \"write\", \"apply_patch\", \"git_write\", \"fs_ops\", \"db_run\"]);\n\nfunction matchesPermissionRule(rule: string, request: ToolPermissionRequest): boolean {\n\tconst [ruleToolRaw, ...rest] = rule.split(\":\");\n\tconst ruleTool = (ruleToolRaw ?? \"\").trim();\n\tconst ruleNeedle = rest.join(\":\").trim().toLowerCase();\n\tconst toolMatches = !ruleTool || ruleTool === \"*\" || ruleTool === request.toolName;\n\tif (!toolMatches) return false;\n\treturn !ruleNeedle || request.summary.toLowerCase().includes(ruleNeedle);\n}\n\nfunction buildPermissionPromptLabel(request: ToolPermissionRequest): string {\n\tconst tierLabel = request.requiredPermission ? ` [${request.requiredPermission}]` : \"\";\n\tconst sourceLabel = request.toolSource === \"extension\" ? \" extension\" : \"\";\n\treturn `${request.toolName}${tierLabel}${sourceLabel}: ${request.summary}`;\n}\n\nfunction normalizePermissionGrantScope(value: unknown): PermissionGrantScope {\n\tif (value === \"turn\" || value === \"session\" || value === \"once\") {\n\t\treturn value;\n\t}\n\treturn \"once\";\n}\n\nexport interface RpcModeOptions {\n\tpolicyEngine?: PolicyEngineV2;\n\tmcpRuntime?: McpRuntime;\n\tprofileName?: string;\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(session: AgentSession, options: RpcModeOptions = {}): Promise<never> {\n\tconst execManager = new UnifiedExecManager();\n\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | RpcRequiresConfirmationEvent | object) => {\n\t\tconsole.log(JSON.stringify(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\tconst permissionGrants = new PermissionGrantStore();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\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\trequestId?: string,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = requestId ?? 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\tasync function requestToolPermissionFromHost(\n\t\trequest: ToolPermissionRequest,\n\t): Promise<{ allowed: boolean; scope: PermissionGrantScope }> {\n\t\tconst id = crypto.randomUUID();\n\t\tconst title = \"Permission required\";\n\t\tconst message = buildPermissionPromptLabel(request);\n\t\toutput({\n\t\t\ttype: \"requires_confirmation\",\n\t\t\tid,\n\t\t\tmessage,\n\t\t\trequest,\n\t\t\tscopes: [\"once\", \"turn\", \"session\"],\n\t\t\tdefaultScope: \"once\",\n\t\t} satisfies RpcRequiresConfirmationEvent);\n\n\t\treturn createDialogPromise(\n\t\t\t{ timeout: 5 * 60 * 1000 },\n\t\t\t{ allowed: false, scope: \"once\" as PermissionGrantScope },\n\t\t\t{ method: \"confirm_permission\", title, message, request, timeout: 5 * 60 * 1000 },\n\t\t\t(response) => {\n\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\treturn { allowed: false, scope: \"once\" as PermissionGrantScope };\n\t\t\t\t}\n\t\t\t\tif (!(\"confirmed\" in response) || !response.confirmed) {\n\t\t\t\t\treturn { allowed: false, scope: \"once\" as PermissionGrantScope };\n\t\t\t\t}\n\t\t\t\tconst scope =\n\t\t\t\t\tresponse.scope === \"turn\" || response.scope === \"session\" || response.scope === \"once\"\n\t\t\t\t\t\t? response.scope\n\t\t\t\t\t\t: (\"once\" as PermissionGrantScope);\n\t\t\t\treturn { allowed: true, scope };\n\t\t\t},\n\t\t\tid,\n\t\t);\n\t}\n\n\tconst evaluateRequest = async (request: ToolPermissionRequest): Promise<McpPermissionDecision> => {\n\t\tif (permissionGrants.isAllowed(request)) {\n\t\t\treturn { allowed: true, reason: \"Allowed by cached turn/session grant.\", effect: \"allow\" };\n\t\t}\n\t\toptions.policyEngine?.refresh();\n\t\tif (options.policyEngine) {\n\t\t\tconst evaluated = evaluatePermissionWithPolicy(options.policyEngine, request, {\n\t\t\t\tprofile: options.profileName,\n\t\t\t\truntimeMode: \"rpc\",\n\t\t\t\tpermissionMode: session.settingsManager.getPermissionMode(),\n\t\t\t\tstrictExtensionToolEnforcement: session.settingsManager.getPermissionExtensionToolEnforcement(),\n\t\t\t});\n\t\t\tif (evaluated.outcome === \"allow\") {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: true,\n\t\t\t\t\treason: evaluated.reason,\n\t\t\t\t\teffect: evaluated.decision.effect,\n\t\t\t\t\truleId: evaluated.decision.rule?.id,\n\t\t\t\t\tpolicyLayer: evaluated.decision.layer,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (evaluated.outcome === \"deny\") {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason: evaluated.reason,\n\t\t\t\t\teffect: evaluated.decision.effect,\n\t\t\t\t\truleId: evaluated.decision.rule?.id,\n\t\t\t\t\tpolicyLayer: evaluated.decision.layer,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tconst denyRules = session.settingsManager.getPermissionDenyRules();\n\t\t\tfor (const rule of denyRules) {\n\t\t\t\tif (matchesPermissionRule(rule, request)) {\n\t\t\t\t\treturn { allowed: false, reason: `Denied by legacy rule: ${rule}`, effect: \"deny\" };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst allowRules = session.settingsManager.getPermissionAllowRules();\n\t\t\tfor (const rule of allowRules) {\n\t\t\t\tif (matchesPermissionRule(rule, request)) {\n\t\t\t\t\treturn { allowed: true, reason: `Allowed by legacy rule: ${rule}`, effect: \"allow\" };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mode = session.settingsManager.getPermissionMode();\n\t\t\tif (mode === \"yolo\") {\n\t\t\t\treturn { allowed: true, reason: \"Permission mode is yolo.\", effect: \"allow\" };\n\t\t\t}\n\t\t\tif (!DANGEROUS_TOOL_NAMES.has(request.toolName)) {\n\t\t\t\treturn { allowed: true, reason: \"RPC mode auto-approves non-dangerous tools.\", effect: \"allow\" };\n\t\t\t}\n\t\t\tif (mode === \"auto\" && (request.toolName === \"edit\" || request.toolName === \"write\" || request.toolName === \"apply_patch\")) {\n\t\t\t\treturn { allowed: true, reason: \"Permission mode auto allows edit/write/apply_patch.\", effect: \"allow\" };\n\t\t\t}\n\t\t}\n\n\t\tconst confirmed = await requestToolPermissionFromHost(request);\n\t\tif (confirmed.allowed) {\n\t\t\tpermissionGrants.allow(request, confirmed.scope);\n\t\t}\n\t\treturn {\n\t\t\tallowed: confirmed.allowed,\n\t\t\treason: confirmed.allowed ? \"Confirmed by RPC host.\" : \"Denied by RPC host.\",\n\t\t\teffect: \"ask\",\n\t\t};\n\t};\n\n\tsession.setToolPermissionHandler(async (request) => {\n\t\tconst decision = await evaluateRequest(request);\n\t\treturn decision.allowed;\n\t});\n\toptions.mcpRuntime?.setPermissionGuard((request) => evaluateRequest(request));\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\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\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\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 new Promise((resolve, reject) => {\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\treject,\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\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\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\t// Set up extensions with RPC-based UI context\n\tawait session.bindExtensions({\n\t\tuiContext: createExtensionUIContext(),\n\t\tcommandContextActions: {\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\n\t\t\tnewSession: async (options) => {\n\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\tconst success = await session.newSession(options);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\tfork: async (entryId) => {\n\t\t\t\tconst result = await session.fork(entryId);\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\tlabel: options?.label,\n\t\t\t\t});\n\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t},\n\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\tconst success = await session.switchSession(sessionPath);\n\t\t\t\treturn { cancelled: !success };\n\t\t\t},\n\t\t\treload: async () => {\n\t\t\t\tawait session.reload();\n\t\t\t},\n\t\t},\n\t\tshutdownHandler: () => {\n\t\t\tshutdownRequested = true;\n\t\t},\n\t\tonError: (err) => {\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t},\n\t});\n\n\t// Output all agent events as JSON\n\tsession.subscribe((event) => {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tpermissionGrants.resetTurn();\n\t\t}\n\t\toutput(event);\n\t});\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\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// Don't await - events will stream\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\n\t\t\t\tsession\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})\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\n\t\t\t\treturn success(id, \"prompt\");\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\tawait session.steer(command.message, command.images);\n\t\t\t\treturn success(id, \"steer\");\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\tawait session.followUp(command.message, command.images);\n\t\t\t\treturn success(id, \"follow_up\");\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 \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst cancelled = !(await session.newSession(options));\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\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\tpermissionMode: session.settingsManager.getPermissionMode(),\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 success(id, \"get_state\", state);\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 = await session.modelRegistry.getAvailable();\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 = await session.modelRegistry.getAvailable();\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 \"set_permission_mode\": {\n\t\t\t\tsession.settingsManager.setPermissionMode(command.mode);\n\t\t\t\treturn success(id, \"set_permission_mode\", { mode: session.settingsManager.getPermissionMode() });\n\t\t\t}\n\n\t\t\tcase \"get_permission_mode\": {\n\t\t\t\treturn success(id, \"get_permission_mode\", { mode: session.settingsManager.getPermissionMode() });\n\t\t\t}\n\n\t\t\tcase \"request_permissions\": {\n\t\t\t\tconst decision = await evaluateRequest(command.request);\n\t\t\t\tconst scope = normalizePermissionGrantScope(command.scope);\n\t\t\t\tif (decision.allowed) {\n\t\t\t\t\tpermissionGrants.allow(command.request, scope);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"request_permissions\", {\n\t\t\t\t\tallowed: decision.allowed,\n\t\t\t\t\tscope,\n\t\t\t\t\treason: decision.reason,\n\t\t\t\t});\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 result = await session.executeBash(command.command);\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\tcase \"exec_command\": {\n\t\t\t\tconst result = await execManager.execCommand({\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\tcwd: command.cwd,\n\t\t\t\t\ttty: command.tty,\n\t\t\t\t\tlogin: command.login,\n\t\t\t\t\tshell: command.shell,\n\t\t\t\t\tyieldTimeMs: command.yieldTimeMs,\n\t\t\t\t\tmaxOutputChars: command.maxOutputChars,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"exec_command\", result);\n\t\t\t}\n\n\t\t\tcase \"write_stdin\": {\n\t\t\t\tconst result = await execManager.writeStdin({\n\t\t\t\t\tsessionId: command.sessionId,\n\t\t\t\t\tchars: command.chars,\n\t\t\t\t\tyieldTimeMs: command.yieldTimeMs,\n\t\t\t\t\tmaxOutputChars: command.maxOutputChars,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"write_stdin\", result);\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 cancelled = !(await session.switchSession(command.sessionPath));\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await session.fork(command.entryId);\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, 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_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\t// Extension commands\n\t\t\t\tfor (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tpath: extensionPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Prompt templates (source is always \"user\" | \"project\" | \"path\" in coding-agent)\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\tlocation: template.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: template.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Skills (source is always \"user\" | \"project\" | \"path\" in coding-agent)\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\tlocation: skill.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: skill.filePath,\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\tcase \"get_builtin_commands\": {\n\t\t\t\treturn success(id, \"get_builtin_commands\", {\n\t\t\t\t\tcommands: BUILTIN_SLASH_COMMANDS.map((command) => ({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t})),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"run_builtin_command\": {\n\t\t\t\tconst result = await dispatchBuiltinSlashCommand(command.commandText, {\n\t\t\t\t\tsession,\n\t\t\t\t\tsettingsManager: session.settingsManager,\n\t\t\t\t\tpolicyEngine: options.policyEngine,\n\t\t\t\t});\n\t\t\t\treturn success(id, \"run_builtin_command\", result);\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(undefined, 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\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\n\t\tconst currentRunner = session.extensionRunner;\n\t\tif (currentRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait currentRunner.emit({ type: \"session_shutdown\" });\n\t\t}\n\t\texecManager.dispose();\n\n\t\t// Close readline interface to stop waiting for input\n\t\trl.close();\n\t\tprocess.exit(0);\n\t}\n\n\t// Listen for JSON input\n\tconst rl = readline.createInterface({\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tterminal: false,\n\t});\n\n\tprocess.once(\"exit\", () => {\n\t\texecManager.dispose();\n\t});\n\n\trl.on(\"line\", async (line: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(line);\n\n\t\t\t// Handle extension UI responses\n\t\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\t\tif (pending) {\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\t\tpending.resolve(response);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Validate regular commands before processing\n\t\t\tconst validationError = validateRpcCommand(parsed);\n\t\t\tif (validationError) {\n\t\t\t\toutput(error(undefined, \"parse\", validationError));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst command = parsed as RpcCommand;\n\t\t\tconst response = await handleCommand(command);\n\t\t\toutput(response);\n\n\t\t\t// Check for deferred shutdown request (idle between commands)\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (e: any) {\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\n\t\t}\n\t});\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}