@gajae-code/coding-agent 0.18.11 → 0.18.12

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 (270) hide show
  1. package/CHANGELOG.md +293 -0
  2. package/dist/types/async/job-manager.d.ts +7 -3
  3. package/dist/types/async/result-formatting.d.ts +2 -0
  4. package/dist/types/autoresearch/git.d.ts +1 -1
  5. package/dist/types/capability/fs.d.ts +2 -2
  6. package/dist/types/cli/accounts-cli.d.ts +2 -2
  7. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  8. package/dist/types/cli/install-activation.d.ts +10 -4
  9. package/dist/types/cli/public-command-errors.d.ts +1 -0
  10. package/dist/types/cli/update-cli.d.ts +14 -1
  11. package/dist/types/cli-ordinary.d.ts +2 -2
  12. package/dist/types/commands/accounts.d.ts +2 -1
  13. package/dist/types/commands/migrate.d.ts +1 -1
  14. package/dist/types/commands/sdk.d.ts +5 -0
  15. package/dist/types/commit/changelog/index.d.ts +1 -0
  16. package/dist/types/config/autorouting-tier-map.d.ts +30 -0
  17. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  18. package/dist/types/config/config-hot-reload.d.ts +39 -0
  19. package/dist/types/config/file-lock.d.ts +8 -1
  20. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  21. package/dist/types/config/model-profile-activation.d.ts +62 -6
  22. package/dist/types/config/model-registry.d.ts +56 -5
  23. package/dist/types/config/model-resolver.d.ts +2 -0
  24. package/dist/types/config/models-config-schema.d.ts +10 -0
  25. package/dist/types/config/settings-schema.d.ts +46 -3
  26. package/dist/types/config/settings.d.ts +33 -1
  27. package/dist/types/dap/config.d.ts +8 -4
  28. package/dist/types/debug/system-info.d.ts +6 -1
  29. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  30. package/dist/types/edit/modes/patch.d.ts +5 -0
  31. package/dist/types/edit/modes/replace.d.ts +3 -0
  32. package/dist/types/exec/bash-executor.d.ts +12 -0
  33. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  35. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  36. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  37. package/dist/types/migrate/adapters/index.d.ts +10 -1
  38. package/dist/types/migrate/executor.d.ts +3 -1
  39. package/dist/types/migrate/types.d.ts +15 -3
  40. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  41. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  42. package/dist/types/modes/theme/theme.d.ts +1 -0
  43. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  44. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  45. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  46. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  47. package/dist/types/sdk/broker/broker-exit.d.ts +2 -2
  48. package/dist/types/sdk/broker/broker.d.ts +7 -1
  49. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  50. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  51. package/dist/types/sdk/broker/ensure.d.ts +136 -7
  52. package/dist/types/sdk/broker/hop.d.ts +36 -0
  53. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  54. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +4 -1
  56. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  57. package/dist/types/sdk/bus/index.d.ts +23 -0
  58. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  59. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  60. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  61. package/dist/types/sdk/host/session-runtime.d.ts +32 -0
  62. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  63. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  64. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  65. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  66. package/dist/types/sdk/session-list.d.ts +1 -1
  67. package/dist/types/session/agent-session.d.ts +58 -2
  68. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  69. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  70. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  71. package/dist/types/session/messages.d.ts +5 -1
  72. package/dist/types/session/session-manager.d.ts +13 -3
  73. package/dist/types/session/startup-auth-config.d.ts +24 -2
  74. package/dist/types/session/streaming-output.d.ts +11 -0
  75. package/dist/types/session/terminal-abort.d.ts +3 -1
  76. package/dist/types/session-import/service.d.ts +1 -1
  77. package/dist/types/skill-state/workflow-mutation-guard.d.ts +7 -3
  78. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  79. package/dist/types/task/executor.d.ts +19 -2
  80. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  81. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  82. package/dist/types/tools/bash-allowed-prefixes.d.ts +11 -0
  83. package/dist/types/tools/descriptors.d.ts +2 -0
  84. package/dist/types/tools/fetch.d.ts +1 -1
  85. package/dist/types/tools/index.d.ts +2 -0
  86. package/dist/types/tools/python.d.ts +1 -1
  87. package/dist/types/tools/report-issue.d.ts +41 -0
  88. package/dist/types/tools/subagent.d.ts +23 -0
  89. package/dist/types/web/scrapers/types.d.ts +8 -1
  90. package/dist/types/web/search/providers/insane.d.ts +7 -1
  91. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  92. package/package.json +8 -8
  93. package/scripts/build-binary.ts +2 -1
  94. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  95. package/scripts/generate-docs-index.ts +8 -1
  96. package/scripts/generate-sdk-operation-inventory.ts +22 -4
  97. package/src/async/job-manager.ts +356 -56
  98. package/src/async/result-formatting.ts +40 -0
  99. package/src/autoresearch/git.ts +9 -2
  100. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  101. package/src/capability/fs.ts +27 -19
  102. package/src/capability/index.ts +2 -2
  103. package/src/cli/accounts-cli.ts +176 -8
  104. package/src/cli/auth-broker-cli.ts +21 -11
  105. package/src/cli/doctor/install-repairs.ts +35 -5
  106. package/src/cli/fast-help.ts +1 -1
  107. package/src/cli/install-activation.ts +47 -4
  108. package/src/cli/migrate-cli.ts +7 -5
  109. package/src/cli/public-command-errors.ts +4 -0
  110. package/src/cli/root-flags.ts +2 -2
  111. package/src/cli/stats-cli.ts +9 -5
  112. package/src/cli/update-cli.ts +224 -7
  113. package/src/cli-ordinary.ts +7 -2
  114. package/src/commands/accounts.ts +10 -5
  115. package/src/commands/migrate.ts +3 -3
  116. package/src/commands/sdk.ts +199 -42
  117. package/src/commands/ultragoal.ts +16 -8
  118. package/src/commit/changelog/index.ts +39 -1
  119. package/src/commit/message.ts +10 -3
  120. package/src/config/autorouting-tier-map.ts +30 -0
  121. package/src/config/config-hot-reload-trust.ts +148 -0
  122. package/src/config/config-hot-reload.ts +734 -0
  123. package/src/config/file-lock.ts +216 -56
  124. package/src/config/model-bindings-applier.ts +85 -47
  125. package/src/config/model-discovery-manager.ts +10 -0
  126. package/src/config/model-profile-activation.ts +716 -113
  127. package/src/config/model-registry.ts +1334 -158
  128. package/src/config/model-resolver.ts +3 -1
  129. package/src/config/models-config-schema.ts +6 -0
  130. package/src/config/settings-schema.ts +60 -3
  131. package/src/config/settings.ts +458 -24
  132. package/src/coordinator-mcp/policy.ts +26 -1
  133. package/src/crash/sanitize.ts +4 -0
  134. package/src/customization/import.ts +3 -1
  135. package/src/dap/config.ts +31 -11
  136. package/src/dap/defaults.json +1 -1
  137. package/src/debug/crash-diagnostics.ts +2 -1
  138. package/src/debug/report-bundle.ts +19 -0
  139. package/src/debug/system-info.ts +8 -3
  140. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  141. package/src/discovery/agents-md.ts +1 -1
  142. package/src/discovery/helpers.ts +1 -2
  143. package/src/discovery/mcp-compat.ts +120 -17
  144. package/src/edit/apply-patch/index.ts +12 -1
  145. package/src/edit/index.ts +13 -17
  146. package/src/edit/modes/patch.ts +187 -8
  147. package/src/edit/modes/replace.ts +136 -0
  148. package/src/eval/js/context-manager.ts +29 -3
  149. package/src/eval/js/worker-entry.ts +51 -18
  150. package/src/eval/py/executor.ts +14 -4
  151. package/src/eval/py/runner.py +144 -5
  152. package/src/exec/bash-executor.ts +81 -4
  153. package/src/exec/bash-shell-guardian.ts +4 -1
  154. package/src/exec/bash-shell-supervisor.ts +8 -4
  155. package/src/exec/isolated-shell.ts +5 -1
  156. package/src/export/html/index.ts +46 -6
  157. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  158. package/src/extensibility/extensions/loader.ts +8 -1
  159. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  160. package/src/gjc-runtime/gc-runtime.ts +33 -6
  161. package/src/gjc-runtime/launch-tmux.ts +7 -2
  162. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  163. package/src/gjc-runtime/launch-worktree.ts +101 -14
  164. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  165. package/src/gjc-runtime/session-resolution.ts +38 -6
  166. package/src/gjc-runtime/session-state-lock.ts +59 -14
  167. package/src/gjc-runtime/state-runtime.ts +23 -19
  168. package/src/hooks/native-skill-hook.ts +14 -11
  169. package/src/internal-urls/docs-index.generated.ts +14 -13
  170. package/src/internal-urls/local-protocol.ts +142 -8
  171. package/src/lsp/index.ts +29 -0
  172. package/src/lsp/workspace-path.ts +23 -0
  173. package/src/migrate/action-planner.ts +57 -0
  174. package/src/migrate/adapters/claude-code.ts +23 -4
  175. package/src/migrate/adapters/codex.ts +22 -4
  176. package/src/migrate/adapters/index.ts +22 -4
  177. package/src/migrate/adapters/opencode.ts +6 -1
  178. package/src/migrate/executor.ts +84 -7
  179. package/src/migrate/report.ts +19 -2
  180. package/src/migrate/types.ts +14 -4
  181. package/src/modes/DESIGN.md +51 -0
  182. package/src/modes/acp/permission-mode.ts +18 -1
  183. package/src/modes/components/assistant-message.ts +55 -1
  184. package/src/modes/components/settings-selector.ts +103 -37
  185. package/src/modes/controllers/command-controller.ts +38 -2
  186. package/src/modes/controllers/plan-mode-controller.ts +17 -7
  187. package/src/modes/controllers/selector-controller.ts +62 -6
  188. package/src/modes/interactive-mode.ts +68 -0
  189. package/src/modes/theme/theme.ts +15 -0
  190. package/src/prompts/tools/debug.md +1 -1
  191. package/src/prompts/tools/read.md +1 -1
  192. package/src/prompts/tools/report-issue.md +13 -0
  193. package/src/prompts/tools/task.md +1 -1
  194. package/src/runtime-credential-selector.ts +2 -2
  195. package/src/runtime-mcp/content-limits.ts +7 -0
  196. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  197. package/src/runtime-mcp/manager.ts +32 -0
  198. package/src/runtime-mcp/oauth-flow.ts +32 -6
  199. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  200. package/src/runtime-mcp/render.ts +16 -1
  201. package/src/runtime-mcp/tool-bridge.ts +126 -17
  202. package/src/sdk/broker/broker-exit.ts +8 -5
  203. package/src/sdk/broker/broker.ts +342 -82
  204. package/src/sdk/broker/daemon-entry.ts +338 -116
  205. package/src/sdk/broker/doctor-restart.ts +2 -1
  206. package/src/sdk/broker/ensure.ts +1143 -265
  207. package/src/sdk/broker/hop.ts +274 -0
  208. package/src/sdk/broker/lifecycle-ledger.ts +35 -11
  209. package/src/sdk/broker/lock-host-identity.ts +29 -0
  210. package/src/sdk/broker/session-index.ts +62 -12
  211. package/src/sdk/bus/chat-command-policy.ts +16 -3
  212. package/src/sdk/bus/index.ts +52 -21
  213. package/src/sdk/bus/reconciliation-store.ts +201 -8
  214. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  215. package/src/sdk/cli/session-cli.ts +21 -6
  216. package/src/sdk/host/session-runtime.test.ts +118 -23
  217. package/src/sdk/host/session-runtime.ts +352 -47
  218. package/src/sdk/lifecycle/service.ts +1 -0
  219. package/src/sdk/prompt-deadline-flush.ts +78 -5
  220. package/src/sdk/prompt-deadline-manager.ts +68 -14
  221. package/src/sdk/protocol/adapter-validation.ts +53 -11
  222. package/src/sdk/protocol/operation-inventory.generated.json +101 -2
  223. package/src/sdk/reconciliation-extensions.ts +1 -0
  224. package/src/sdk/session-list.ts +1 -0
  225. package/src/sdk/session.ts +114 -61
  226. package/src/session/agent-session.ts +1043 -81
  227. package/src/session/internal/managed-session-scope.ts +126 -39
  228. package/src/session/internal/managed-session-storage.ts +14 -11
  229. package/src/session/internal/native-publish-outcome.ts +5 -1
  230. package/src/session/messages.ts +47 -6
  231. package/src/session/session-manager.ts +236 -14
  232. package/src/session/startup-auth-config.ts +116 -8
  233. package/src/session/streaming-output.ts +262 -4
  234. package/src/session/terminal-abort.ts +14 -2
  235. package/src/session-import/service.ts +1 -0
  236. package/src/skill-state/workflow-mutation-guard.ts +491 -32
  237. package/src/slash-commands/builtin-registry.ts +15 -3
  238. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  239. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  240. package/src/task/executor.ts +103 -12
  241. package/src/task/index.ts +389 -175
  242. package/src/tools/ast-edit-write-path.ts +64 -0
  243. package/src/tools/ast-edit.ts +18 -1
  244. package/src/tools/atomic-file-write.ts +46 -15
  245. package/src/tools/auto-generated-guard.ts +3 -0
  246. package/src/tools/bash-allowed-prefixes.ts +153 -5
  247. package/src/tools/bash-interactive.ts +14 -2
  248. package/src/tools/bash.ts +14 -0
  249. package/src/tools/debug.ts +7 -6
  250. package/src/tools/descriptors.test.ts +44 -0
  251. package/src/tools/descriptors.ts +34 -2
  252. package/src/tools/fetch.ts +3 -2
  253. package/src/tools/index.ts +2 -0
  254. package/src/tools/output-meta.ts +23 -2
  255. package/src/tools/python.ts +1 -1
  256. package/src/tools/read.ts +17 -35
  257. package/src/tools/report-issue.ts +184 -0
  258. package/src/tools/subagent-render.ts +114 -12
  259. package/src/tools/subagent.ts +108 -1
  260. package/src/tools/todo-write.ts +41 -3
  261. package/src/tools/tool-catalog.generated.ts +31 -3
  262. package/src/tools/write.ts +35 -3
  263. package/src/utils/commit-message-generator.ts +9 -2
  264. package/src/utils/file-mentions.ts +29 -1
  265. package/src/utils/title-generator.ts +7 -2
  266. package/src/web/scrapers/index.ts +3 -1
  267. package/src/web/scrapers/types.ts +8 -0
  268. package/src/web/scrapers/youtube.ts +3 -2
  269. package/src/web/search/providers/insane.ts +91 -28
  270. package/src/web/search/providers/searxng.ts +62 -10
@@ -51,6 +51,7 @@ import { buildSkillPromptMessage, type Skill } from "../extensibility/skills";
51
51
  import { sessionRoot } from "../gjc-runtime/session-layout";
52
52
  import type { HindsightSessionState } from "../hindsight/state";
53
53
  import type { LocalProtocolOptions } from "../internal-urls";
54
+ import type { PlanModeState } from "../plan-mode/state";
54
55
  import subagentSystemPromptTemplate from "../prompts/system/subagent-system-prompt.md" with { type: "text" };
55
56
  import subagentUserPromptTemplate from "../prompts/system/subagent-user-prompt.md" with { type: "text" };
56
57
  import submitReminderTemplate from "../prompts/system/subagent-yield-reminder.md" with { type: "text" };
@@ -59,6 +60,7 @@ import { discoverAuthStorage } from "../sdk";
59
60
  import type { AgentSession, AgentSessionEvent, ForkContextSeed } from "../session/agent-session";
60
61
  import { ArtifactManager } from "../session/artifacts";
61
62
  import type { AuthStorage } from "../session/auth-storage";
63
+ import type { ClientBridge } from "../session/client-bridge";
62
64
  import { SKILL_PROMPT_MESSAGE_TYPE } from "../session/messages";
63
65
  import { SessionManager, type SessionMemoryMode } from "../session/session-manager";
64
66
  import { FileSessionStorage } from "../session/session-storage";
@@ -300,6 +302,21 @@ export interface ExecutorOptions {
300
302
  * the same immutable child settings snapshot.
301
303
  */
302
304
  inheritedServiceTier?: ServiceTier;
305
+ /**
306
+ * Parent ACP/SDK approval mode. `deny` and `prompt` replace the child
307
+ * default (`allow`) before the first prompt. `allow` is that default.
308
+ */
309
+ sdkPermissionMode?: "prompt" | "allow" | "deny";
310
+ /**
311
+ * Parent plan-mode state. Copied onto the child before the first prompt so
312
+ * `enforcePlanModeWrite` still refuses product-file writes.
313
+ */
314
+ planModeState?: PlanModeState;
315
+ /**
316
+ * Parent client bridge. Only `requestPermission` is copied onto the child.
317
+ * Terminal, filesystem, and deferAgentInitiatedTurns stay on the parent.
318
+ */
319
+ clientBridge?: ClientBridge;
303
320
  /** Override local:// protocol options so subagent shares parent's local:// root */
304
321
  localProtocolOptions?: LocalProtocolOptions;
305
322
  /**
@@ -342,28 +359,32 @@ export interface ExecutorOptions {
342
359
  export class ManagedTaskPersistence {
343
360
  readonly #artifacts: ArtifactManager;
344
361
  readonly #taskId: string;
362
+ readonly #getArtifacts: () => ArtifactManager;
345
363
 
346
- constructor(artifacts: ArtifactManager, taskId: string) {
364
+ constructor(artifacts: ArtifactManager, taskId: string, getArtifacts: () => ArtifactManager = () => artifacts) {
347
365
  this.#artifacts = artifacts;
348
366
  this.#taskId = validateAllocatedTaskId(taskId);
367
+ this.#getArtifacts = getArtifacts;
349
368
  if (!artifacts.getManagedSubtreeRootAuthority())
350
369
  throw new Error("Managed task persistence authority is unavailable");
351
370
  }
352
371
 
353
372
  async openSession(cwd: string, sessionMemoryMode: SessionMemoryMode = "shadow"): Promise<SessionManager> {
354
- const store = this.#artifacts.getManagedStore();
373
+ const artifacts = this.#getArtifacts();
374
+ const store = artifacts.getManagedStore();
355
375
  if (!store) throw new Error("Managed task persistence authority is unavailable");
356
- this.#artifacts.assertManagedBinding();
357
- const sessionFile = path.join(this.#artifacts.dir, `${this.#taskId}.jsonl`);
376
+ artifacts.assertManagedBinding();
377
+ const sessionFile = path.join(artifacts.dir, `${this.#taskId}.jsonl`);
358
378
  const session = await SessionManager.openNestedManaged(
359
379
  sessionFile,
360
- SessionManager.nestedManagedDestination(store, this.#artifacts.dir),
380
+ SessionManager.nestedManagedDestination(store, artifacts.dir),
361
381
  store,
362
382
  undefined,
363
383
  cwd,
364
384
  sessionMemoryMode,
365
385
  );
366
- this.#artifacts.assertManagedBinding();
386
+ artifacts.assertManagedBinding();
387
+ session.registerManagedTranscriptRelocationResolver(this.#getArtifacts);
367
388
  return session;
368
389
  }
369
390
  async openStagedSession(attemptId = this.#taskId): Promise<SessionManager> {
@@ -385,8 +406,10 @@ export class ManagedTaskPersistence {
385
406
  }
386
407
 
387
408
  async publishOutput(rawOutput: string, metadata: Uint8Array): Promise<void> {
388
- await withArtifactManagerFinalizationTurn(this.#artifacts, () =>
389
- this.#artifacts.publishManagedOutputGeneration(
409
+ const artifacts = this.#getArtifacts();
410
+ artifacts.assertManagedBinding();
411
+ await withArtifactManagerFinalizationTurn(artifacts, () =>
412
+ artifacts.publishManagedOutputGeneration(
390
413
  `${this.#taskId}.md.selector.json`,
391
414
  `${this.#taskId}.md`,
392
415
  Buffer.from(rawOutput, "utf8"),
@@ -396,8 +419,12 @@ export class ManagedTaskPersistence {
396
419
  }
397
420
  }
398
421
 
399
- export function createManagedTaskPersistence(artifacts: ArtifactManager, taskId: string): ManagedTaskPersistence {
400
- return new ManagedTaskPersistence(artifacts, taskId);
422
+ export function createManagedTaskPersistence(
423
+ artifacts: ArtifactManager,
424
+ taskId: string,
425
+ getArtifacts?: () => ArtifactManager,
426
+ ): ManagedTaskPersistence {
427
+ return new ManagedTaskPersistence(artifacts, taskId, getArtifacts);
401
428
  }
402
429
 
403
430
  const MAX_REVIEW_FINDINGS_ARTIFACT_BYTES = 16 * 1024 * 1024;
@@ -1006,6 +1033,16 @@ function autoroutingAttemptDisposition(failure: AutoroutingPreflightFailure): {
1006
1033
  return { code: "unclassified_terminal", advance: false };
1007
1034
  }
1008
1035
 
1036
+ /** Permission callback only. Terminal, filesystem, and defer flags stay on the parent. */
1037
+ function permissionOnlyBridge(bridge: ClientBridge | undefined): ClientBridge | undefined {
1038
+ if (!bridge?.requestPermission || bridge.capabilities.requestPermission !== true) return undefined;
1039
+ const requestPermission = bridge.requestPermission.bind(bridge);
1040
+ return {
1041
+ capabilities: { requestPermission: true },
1042
+ requestPermission: (toolCall, options, signal) => requestPermission(toolCall, options, signal),
1043
+ };
1044
+ }
1045
+
1009
1046
  export async function runSubprocessOnce(options: ExecutorOptions): Promise<SingleResult> {
1010
1047
  const {
1011
1048
  cwd,
@@ -1739,9 +1776,14 @@ export async function runSubprocessOnce(options: ExecutorOptions): Promise<Singl
1739
1776
  });
1740
1777
  let modelRegistry = options.modelRegistry ?? ownedModelRegistry!;
1741
1778
  const authStorage = modelRegistry.authStorage;
1742
- if (options.authStorage && options.authStorage !== authStorage) {
1779
+ // Reject if both authStorage and modelRegistry are provided with different instances.
1780
+ if (
1781
+ options.authStorage !== undefined &&
1782
+ options.modelRegistry !== undefined &&
1783
+ options.authStorage !== authStorage
1784
+ ) {
1743
1785
  throw new Error(
1744
- "options.authStorage and options.modelRegistry.authStorage must be the same instance when both are provided",
1786
+ "options.authStorage and options.modelRegistry.authStorage must be the same instance or one must be omitted",
1745
1787
  );
1746
1788
  }
1747
1789
  checkAbort();
@@ -2101,6 +2143,22 @@ export async function runSubprocessOnce(options: ExecutorOptions): Promise<Singl
2101
2143
  );
2102
2144
 
2103
2145
  activeSession = session;
2146
+ // Plan mode is session state, not a tool-list filter. Copy it before the
2147
+ // first prompt so product writes hit the same read-only guard as the parent.
2148
+ if (options.planModeState?.enabled) {
2149
+ session.setPlanModeState({
2150
+ enabled: true,
2151
+ planFilePath: options.planModeState.planFilePath,
2152
+ ...(options.planModeState.workflow ? { workflow: options.planModeState.workflow } : {}),
2153
+ ...(options.planModeState.reentry !== undefined ? { reentry: options.planModeState.reentry } : {}),
2154
+ });
2155
+ }
2156
+ // `allow` is the child default. deny/prompt must be copied before the first prompt.
2157
+ if (options.sdkPermissionMode === "deny" || options.sdkPermissionMode === "prompt") {
2158
+ session.setSdkPermissionMode(options.sdkPermissionMode);
2159
+ }
2160
+ const approvalBridge = permissionOnlyBridge(options.clientBridge);
2161
+ if (approvalBridge) session.setClientBridge(approvalBridge);
2104
2162
  const configuredChildChain = parentFallbackSelector ? [parentFallbackSelector] : modelPatterns;
2105
2163
  session.setConfiguredModelChain("default", configuredChildChain, "subagent", agent.name, true);
2106
2164
  if (!parentFallbackSelector) {
@@ -2881,6 +2939,39 @@ function preflightTerminalResult(
2881
2939
 
2882
2940
  /** Run routed initial tasks through the bounded probe/durable candidate ledger. */
2883
2941
  export async function runSubprocess(options: ExecutorOptions): Promise<SingleResult> {
2942
+ // Resume routing resolves credentials before dispatch; do not let an unexpected
2943
+ // lookup exception bypass terminalization just because the initial probe ledger is off.
2944
+ if (
2945
+ (options.runMode ?? "initial") !== "initial" &&
2946
+ options.autoroutingCandidates &&
2947
+ options.autoroutingPreflightErrors
2948
+ ) {
2949
+ const failedSelector = options.autoroutingCandidates.find(selector =>
2950
+ options.autoroutingPreflightErrors?.has(selector),
2951
+ );
2952
+ if (failedSelector) {
2953
+ const preflightError = options.autoroutingPreflightErrors.get(failedSelector);
2954
+ const failure = classifyAutoroutingPreflightFailure(preflightError, "auth_resolve");
2955
+ const { code } = autoroutingAttemptDisposition(failure);
2956
+ const skips = buildBoundedRoutingSkips(options.autoroutingSkips);
2957
+ const routedOptions = options.routing ? { ...options.routing, ...skips } : options.routing;
2958
+ return preflightTerminalResult(
2959
+ { ...options, routing: routedOptions },
2960
+ [{ selector: failedSelector, phase: "probe", code }],
2961
+ "preflight_exhausted",
2962
+ );
2963
+ }
2964
+ }
2965
+ if ((options.runMode ?? "initial") !== "initial" && options.autoroutingCandidates?.length === 0 && options.routing) {
2966
+ const skippedCandidates = options.autoroutingSkips?.filter(skip => skip.code === "credential_unavailable") ?? [];
2967
+ return preflightTerminalResult(
2968
+ { ...options, routing: { ...options.routing, ...buildBoundedRoutingSkips(options.autoroutingSkips) } },
2969
+ skippedCandidates
2970
+ .slice(0, 6)
2971
+ .map(skip => ({ selector: skip.selector, phase: "probe", code: "credential_unavailable" })),
2972
+ "all_candidates_skipped",
2973
+ );
2974
+ }
2884
2975
  if (
2885
2976
  !options.autoroutingPreflight ||
2886
2977
  (options.runMode ?? "initial") !== "initial" ||