pi-subagents 0.74.0 → 0.75.0

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 (157) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/docs/agents.md +15 -5
  3. package/docs/configuration.md +10 -0
  4. package/docs/extension-api.md +1 -1
  5. package/docs/missions.md +15 -1
  6. package/docs/models.md +6 -2
  7. package/docs/observability.md +8 -3
  8. package/docs/tool-reference.md +28 -3
  9. package/docs/workflows.md +2 -2
  10. package/package.json +1 -1
  11. package/src/agents/agents.d.ts +1 -0
  12. package/src/agents/agents.d.ts.map +1 -1
  13. package/src/agents/agents.js +65 -3
  14. package/src/agents/agents.js.map +1 -1
  15. package/src/api/preflight.d.ts +1 -1
  16. package/src/api/preflight.d.ts.map +1 -1
  17. package/src/api/preflight.js +44 -1
  18. package/src/api/preflight.js.map +1 -1
  19. package/src/extension/config.d.ts.map +1 -1
  20. package/src/extension/config.js +4 -1
  21. package/src/extension/config.js.map +1 -1
  22. package/src/extension/index.d.ts.map +1 -1
  23. package/src/extension/index.js +26 -19
  24. package/src/extension/index.js.map +1 -1
  25. package/src/extension/public-execution.d.ts.map +1 -1
  26. package/src/extension/public-execution.js +4 -0
  27. package/src/extension/public-execution.js.map +1 -1
  28. package/src/extension/reply-workflow-script.js +1 -1
  29. package/src/extension/reply-workflow-script.js.map +1 -1
  30. package/src/extension/rpc.js +1 -1
  31. package/src/extension/rpc.js.map +1 -1
  32. package/src/extension/schemas.d.ts +1 -0
  33. package/src/extension/schemas.d.ts.map +1 -1
  34. package/src/extension/schemas.js +5 -3
  35. package/src/extension/schemas.js.map +1 -1
  36. package/src/extension/tool-description.js +1 -1
  37. package/src/extension/tool-description.js.map +1 -1
  38. package/src/missions/goal-driver.d.ts +1 -0
  39. package/src/missions/goal-driver.d.ts.map +1 -1
  40. package/src/missions/goal-driver.js +49 -34
  41. package/src/missions/goal-driver.js.map +1 -1
  42. package/src/missions/store.d.ts.map +1 -1
  43. package/src/missions/store.js +11 -1
  44. package/src/missions/store.js.map +1 -1
  45. package/src/profiles/profiles.d.ts +1 -1
  46. package/src/profiles/profiles.d.ts.map +1 -1
  47. package/src/profiles/profiles.js +4 -0
  48. package/src/profiles/profiles.js.map +1 -1
  49. package/src/runs/background/async-execution.d.ts +13 -0
  50. package/src/runs/background/async-execution.d.ts.map +1 -1
  51. package/src/runs/background/async-execution.js +89 -6
  52. package/src/runs/background/async-execution.js.map +1 -1
  53. package/src/runs/background/async-job-tracker.d.ts +1 -0
  54. package/src/runs/background/async-job-tracker.d.ts.map +1 -1
  55. package/src/runs/background/async-job-tracker.js +2 -2
  56. package/src/runs/background/async-job-tracker.js.map +1 -1
  57. package/src/runs/background/await-async-run.d.ts.map +1 -1
  58. package/src/runs/background/await-async-run.js +4 -2
  59. package/src/runs/background/await-async-run.js.map +1 -1
  60. package/src/runs/background/control-channel.d.ts +10 -0
  61. package/src/runs/background/control-channel.d.ts.map +1 -1
  62. package/src/runs/background/control-channel.js +51 -0
  63. package/src/runs/background/control-channel.js.map +1 -1
  64. package/src/runs/background/run-child-session.d.ts.map +1 -1
  65. package/src/runs/background/run-child-session.js +20 -6
  66. package/src/runs/background/run-child-session.js.map +1 -1
  67. package/src/runs/background/runner-aliases.d.ts +1 -0
  68. package/src/runs/background/runner-aliases.d.ts.map +1 -1
  69. package/src/runs/background/runner-aliases.js +6 -2
  70. package/src/runs/background/runner-aliases.js.map +1 -1
  71. package/src/runs/background/scheduled-runs.d.ts +2 -1
  72. package/src/runs/background/scheduled-runs.d.ts.map +1 -1
  73. package/src/runs/background/scheduled-runs.js +28 -11
  74. package/src/runs/background/scheduled-runs.js.map +1 -1
  75. package/src/runs/background/stale-run-reconciler.d.ts +1 -1
  76. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -1
  77. package/src/runs/background/stale-run-reconciler.js +15 -2
  78. package/src/runs/background/stale-run-reconciler.js.map +1 -1
  79. package/src/runs/background/subagent-runner.d.ts.map +1 -1
  80. package/src/runs/background/subagent-runner.js +44 -3
  81. package/src/runs/background/subagent-runner.js.map +1 -1
  82. package/src/runs/foreground/command-action.d.ts +13 -0
  83. package/src/runs/foreground/command-action.d.ts.map +1 -0
  84. package/src/runs/foreground/command-action.js +38 -0
  85. package/src/runs/foreground/command-action.js.map +1 -0
  86. package/src/runs/foreground/execution.d.ts.map +1 -1
  87. package/src/runs/foreground/execution.js +19 -5
  88. package/src/runs/foreground/execution.js.map +1 -1
  89. package/src/runs/foreground/subagent-executor.d.ts +1 -0
  90. package/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  91. package/src/runs/foreground/subagent-executor.js +64 -11
  92. package/src/runs/foreground/subagent-executor.js.map +1 -1
  93. package/src/runs/shared/child-commands.d.ts +28 -0
  94. package/src/runs/shared/child-commands.d.ts.map +1 -0
  95. package/src/runs/shared/child-commands.js +250 -0
  96. package/src/runs/shared/child-commands.js.map +1 -0
  97. package/src/runs/shared/child-session.d.ts +4 -0
  98. package/src/runs/shared/child-session.d.ts.map +1 -1
  99. package/src/runs/shared/child-session.js +97 -20
  100. package/src/runs/shared/child-session.js.map +1 -1
  101. package/src/runs/shared/child-tool-plan.js +1 -1
  102. package/src/runs/shared/child-tool-plan.js.map +1 -1
  103. package/src/runs/shared/claude-code-adapter.d.ts +56 -0
  104. package/src/runs/shared/claude-code-adapter.d.ts.map +1 -1
  105. package/src/runs/shared/claude-code-adapter.js +138 -2
  106. package/src/runs/shared/claude-code-adapter.js.map +1 -1
  107. package/src/runs/shared/dynamic-fanout.js +1 -1
  108. package/src/runs/shared/dynamic-fanout.js.map +1 -1
  109. package/src/runs/shared/external-cli-preflight.d.ts +10 -0
  110. package/src/runs/shared/external-cli-preflight.d.ts.map +1 -1
  111. package/src/runs/shared/external-cli-preflight.js +50 -6
  112. package/src/runs/shared/external-cli-preflight.js.map +1 -1
  113. package/src/runs/shared/external-cli-runner.d.ts.map +1 -1
  114. package/src/runs/shared/external-cli-runner.js +4 -2
  115. package/src/runs/shared/external-cli-runner.js.map +1 -1
  116. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts.map +1 -1
  117. package/src/runs/shared/mcp-direct-tool-allowlist.js +5 -4
  118. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -1
  119. package/src/runs/shared/model-resolution.d.ts +6 -2
  120. package/src/runs/shared/model-resolution.d.ts.map +1 -1
  121. package/src/runs/shared/model-resolution.js +9 -2
  122. package/src/runs/shared/model-resolution.js.map +1 -1
  123. package/src/runs/shared/parallel-utils.d.ts +2 -0
  124. package/src/runs/shared/parallel-utils.d.ts.map +1 -1
  125. package/src/runs/shared/parallel-utils.js.map +1 -1
  126. package/src/runs/shared/run-history.d.ts +47 -0
  127. package/src/runs/shared/run-history.d.ts.map +1 -1
  128. package/src/runs/shared/run-history.js +70 -0
  129. package/src/runs/shared/run-history.js.map +1 -1
  130. package/src/runs/shared/subagent-control.d.ts.map +1 -1
  131. package/src/runs/shared/subagent-control.js +30 -17
  132. package/src/runs/shared/subagent-control.js.map +1 -1
  133. package/src/runs/shared/subagent-prompt-runtime.d.ts +1 -0
  134. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  135. package/src/runs/shared/subagent-prompt-runtime.js +12 -5
  136. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  137. package/src/shared/required-child-extensions.d.ts +16 -1
  138. package/src/shared/required-child-extensions.d.ts.map +1 -1
  139. package/src/shared/required-child-extensions.js +37 -5
  140. package/src/shared/required-child-extensions.js.map +1 -1
  141. package/src/shared/types.d.ts +6 -1
  142. package/src/shared/types.d.ts.map +1 -1
  143. package/src/shared/types.js +1 -1
  144. package/src/shared/types.js.map +1 -1
  145. package/src/slash/subagent-cost.d.ts.map +1 -1
  146. package/src/slash/subagent-cost.js +8 -4
  147. package/src/slash/subagent-cost.js.map +1 -1
  148. package/src/tui/render.d.ts +1 -1
  149. package/src/tui/render.d.ts.map +1 -1
  150. package/src/tui/render.js +4 -4
  151. package/src/tui/render.js.map +1 -1
  152. package/src/workflows/workflow-receipt.js +2 -2
  153. package/src/workflows/workflow-receipt.js.map +1 -1
  154. package/src/workflows/workflow-resources.d.ts +4 -0
  155. package/src/workflows/workflow-resources.d.ts.map +1 -1
  156. package/src/workflows/workflow-resources.js +7 -4
  157. package/src/workflows/workflow-resources.js.map +1 -1
@@ -15,6 +15,7 @@ import { currentCompletionOwnerId } from "../../shared/completion-owner.js";
15
15
  import { planChildLaunch, projectChainOutputSchemas, resolveStepBehavior, suppressProgressForReadOnlyTask } from "../shared/child-launch-plan.js";
16
16
  import { formatHerdrMachineRunnerUnsupported, resolveHerdrMachinePlacement } from "../shared/herdr-machine.js";
17
17
  import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/child-tool-plan.js";
18
+ import { assertClaudeCodeModelScope, isClaudeCodeAdapterId, resolveClaudeCodeOverride } from "../shared/claude-code-adapter.js";
18
19
  import { injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.js";
19
20
  import { applyWatchdogLaunchRules, sendRuleViolationWarning } from "../../watchdog/rules.js";
20
21
  import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadInstructionPaths, resolveExistingReadPaths, writeInitialProgressFile } from "../../shared/settings.js";
@@ -57,7 +58,7 @@ import { resolvePermissionRules } from "../shared/permissions.js";
57
58
  import { normalizeExtensionBindings, omitExtensionBindingsEnv } from "../shared/extension-bindings.js";
58
59
  import { omitGitRoutingEnv } from "../shared/git-environment.js";
59
60
  import { assertWorkflowLaneKey, normalizeWorkflowLaneMetadata } from "../shared/lane-metadata.js";
60
- import { resolveRequiredChildExtensions } from "../../shared/required-child-extensions.js";
61
+ import { assertRequiredChildExtensionsAdmitted, resolveRequiredChildExtensions, writeRetainedRequiredChildExtensions } from "../../shared/required-child-extensions.js";
61
62
  const require = nodeModule.createRequire(import.meta.url);
62
63
  const piPackageRoot = resolveAsyncPiPackageRoot();
63
64
  /**
@@ -629,6 +630,22 @@ function spawnRunner(cfg, suffix, cwd, initialStatus, initialStatusPath, launchP
629
630
  return { error: error instanceof Error ? error.message : String(error) };
630
631
  }
631
632
  }
633
+ /**
634
+ * An explicit `thinking: false` clears the level, so only `undefined` falls
635
+ * through to the agent's own value. Treating `false` as absent would silently
636
+ * apply the agent default the caller just cleared.
637
+ */
638
+ export function resolveClaudeCodeThinking(source, fallback) {
639
+ const value = source === undefined ? fallback : source;
640
+ return typeof value === "string" ? value : undefined;
641
+ }
642
+ /** A pinned Claude Code model cannot survive pane-native saved-machine placement, which
643
+ * owns the remote model registry, so the combination fails instead of losing both flags. */
644
+ export function assertClaudeCodeOverrideIsLocal(agent, machine, override) {
645
+ if (!machine || !override)
646
+ return;
647
+ throw new Error(`Agent '${agent}' requested machine '${machine}', but a Claude Code model or thinking level cannot be honored on a saved machine. Remove the model or thinking request, or run the agent locally.`);
648
+ }
632
649
  function formatAsyncStartError(mode, message) {
633
650
  return {
634
651
  content: [{ type: "text", text: message }],
@@ -725,6 +742,13 @@ export function buildAsyncRunnerSteps(id, params) {
725
742
  const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: a.name, runnerType: a.runner?.type, adapter: a.runner?.type === "external-cli" ? a.runner.adapter : undefined, worktree: s.worktree });
726
743
  if (machineUnsupported)
727
744
  throw new AsyncStartValidationError(machineUnsupported);
745
+ const registeredExtensions = resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
746
+ try {
747
+ assertRequiredChildExtensionsAdmitted([params.requiredExtensions, ctx.childRuntime?.requiredExtensions, registeredExtensions], { agent: a.name, runnerType: a.runner?.type, machine: requestedMachine });
748
+ }
749
+ catch (error) {
750
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
751
+ }
728
752
  let machine;
729
753
  let machineEnv;
730
754
  if (requestedMachine) {
@@ -737,9 +761,12 @@ export function buildAsyncRunnerSteps(id, params) {
737
761
  throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
738
762
  }
739
763
  }
764
+ // A code-owned Claude Code adapter owns its argv, but it does accept an explicit
765
+ // model/thinking request; those become --model/--effort on the launch below.
766
+ const claudeCodeAdapter = a.runner?.type === "external-cli" && isClaudeCodeAdapterId(a.runner.adapter);
740
767
  if (externalRunner) {
741
768
  const unsupported = [];
742
- if (s.model !== undefined)
769
+ if (s.model !== undefined && !claudeCodeAdapter)
743
770
  unsupported.push("model override");
744
771
  if (effectiveBehavior.outputSchema !== undefined)
745
772
  unsupported.push("structured output");
@@ -811,6 +838,24 @@ export function buildAsyncRunnerSteps(id, params) {
811
838
  const primaryModelFromParent = modelOrigin === "inherited";
812
839
  const primaryModel = externalRunner ? undefined : resolveEffectiveSubagentModel(s.model, a.model, ctx.currentModel, availableModels, a.modelProvider ?? ctx.currentModelProvider, { scope: modelScopes, source: modelOrigin === "explicit" ? "explicit" : "inherited" });
813
840
  const thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];
841
+ let claudeCodeOverride;
842
+ if (claudeCodeAdapter) {
843
+ try {
844
+ claudeCodeOverride = resolveClaudeCodeOverride({
845
+ model: typeof s.model === "string" ? s.model : undefined,
846
+ agent: a,
847
+ thinking: resolveClaudeCodeThinking(thinkingOverride, a.thinking),
848
+ thinkingCeiling: intersectThinkingCeilings(params.thinkingCeiling, a.maxThinking, ctx.childRuntime?.thinkingCeiling),
849
+ agentName: a.name,
850
+ runId: id,
851
+ });
852
+ assertClaudeCodeModelScope({ scopes: modelScopes, model: claudeCodeOverride?.model, agent: a.name, runId: id });
853
+ assertClaudeCodeOverrideIsLocal(a.name, machine ? requestedMachine : undefined, claudeCodeOverride);
854
+ }
855
+ catch (error) {
856
+ throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
857
+ }
858
+ }
814
859
  const effectiveThinking = externalRunner ? undefined : thinkingOverride ?? a.thinking;
815
860
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);
816
861
  const contextLimit = model ? findModelInfo(model, availableModels, a.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
@@ -846,7 +891,7 @@ export function buildAsyncRunnerSteps(id, params) {
846
891
  if (launchRuleError)
847
892
  throw new AsyncStartValidationError(launchRuleError);
848
893
  const fast = s.fast ?? params.fast ?? a.fast;
849
- const requiredExtensions = externalRunner ? [] : ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
894
+ const requiredExtensions = externalRunner ? [] : params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? registeredExtensions;
850
895
  const toolPlan = resolvePiLaunchToolPlan({
851
896
  tools: a.tools,
852
897
  excludeTools: a.excludeTools,
@@ -878,6 +923,7 @@ export function buildAsyncRunnerSteps(id, params) {
878
923
  agent: s.agent,
879
924
  task,
880
925
  ...(a.runner ? { runner: a.runner } : {}),
926
+ ...(claudeCodeOverride ? { claudeCodeOverrideArgs: claudeCodeOverride.args } : {}),
881
927
  ...(machine ? { machine } : {}),
882
928
  ...(machineEnv ? { machineEnv } : {}),
883
929
  ...(params.contextForAgent ? { context: params.contextForAgent(s.agent) } : {}),
@@ -1150,6 +1196,7 @@ export function executeAsyncChain(id, params) {
1150
1196
  toolTimeoutMsEnv: params.toolTimeoutMsEnv ?? toolTimeoutFromEnv(),
1151
1197
  capabilityCeiling,
1152
1198
  thinkingCeiling: params.thinkingCeiling,
1199
+ requiredExtensions: params.requiredExtensions,
1153
1200
  });
1154
1201
  if ("error" in built) {
1155
1202
  try {
@@ -1196,6 +1243,13 @@ export function executeAsyncChain(id, params) {
1196
1243
  const initialStatusAt = Date.now();
1197
1244
  const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1198
1245
  const launchParentSessionId = ctx.parentSessionId ?? ctx.currentSessionId;
1246
+ try {
1247
+ writeRetainedRequiredChildExtensions(asyncDir, params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(launchParentSessionId ?? undefined));
1248
+ }
1249
+ catch (error) {
1250
+ fs.rmSync(asyncDir, { recursive: true, force: true });
1251
+ return formatAsyncStartError(resultMode, `Failed to record required child extensions: ${error instanceof Error ? error.message : String(error)}`);
1252
+ }
1199
1253
  let spawnResult = {};
1200
1254
  try {
1201
1255
  spawnResult = spawnRunner({
@@ -1416,13 +1470,16 @@ export function executeAsyncSingle(id, params) {
1416
1470
  const externalRunner = agentConfig.runner?.type === "external-cli" || agentConfig.runner?.type === "external-job";
1417
1471
  const externalRunnerType = agentConfig.runner?.type;
1418
1472
  const permissionRules = resolvePermissionRules(ctx.permissions, agentConfig.permissions);
1473
+ // See the chain path: the Claude Code adapter accepts an explicit model/thinking
1474
+ // request even though no other external runner does.
1475
+ const claudeCodeAdapter = agentConfig.runner?.type === "external-cli" && isClaudeCodeAdapterId(agentConfig.runner.adapter);
1419
1476
  if (externalRunner) {
1420
1477
  const unsupported = [];
1421
- if (params.modelOverride !== undefined)
1478
+ if (params.modelOverride !== undefined && !claudeCodeAdapter)
1422
1479
  unsupported.push("model override");
1423
1480
  if ((params.fast ?? agentConfig.fast) === true)
1424
1481
  unsupported.push("fast mode");
1425
- if (params.thinkingOverride !== undefined)
1482
+ if (params.thinkingOverride !== undefined && !claudeCodeAdapter)
1426
1483
  unsupported.push("thinking override");
1427
1484
  if (params.structuredOutputSchema !== undefined)
1428
1485
  unsupported.push("structured output");
@@ -1453,6 +1510,13 @@ export function executeAsyncSingle(id, params) {
1453
1510
  const machineUnsupported = formatHerdrMachineRunnerUnsupported({ machine: requestedMachine, agentName: agentConfig.name, runnerType: agentConfig.runner?.type, adapter: agentConfig.runner?.type === "external-cli" ? agentConfig.runner.adapter : undefined, worktree: params.worktree });
1454
1511
  if (machineUnsupported)
1455
1512
  return formatAsyncStartError("single", machineUnsupported);
1513
+ const registeredExtensions = resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
1514
+ try {
1515
+ assertRequiredChildExtensionsAdmitted([params.requiredExtensions, ctx.childRuntime?.requiredExtensions, registeredExtensions], { agent: agentConfig.name, runnerType: agentConfig.runner?.type, machine: requestedMachine });
1516
+ }
1517
+ catch (error) {
1518
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1519
+ }
1456
1520
  let machine;
1457
1521
  let machineEnv;
1458
1522
  if (requestedMachine) {
@@ -1546,6 +1610,24 @@ export function executeAsyncSingle(id, params) {
1546
1610
  catch (error) {
1547
1611
  return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1548
1612
  }
1613
+ let singleClaudeCodeOverride;
1614
+ if (claudeCodeAdapter) {
1615
+ try {
1616
+ singleClaudeCodeOverride = resolveClaudeCodeOverride({
1617
+ model: typeof params.modelOverride === "string" ? params.modelOverride : undefined,
1618
+ agent: agentConfig,
1619
+ thinking: resolveClaudeCodeThinking(params.thinkingOverride, agentConfig.thinking),
1620
+ thinkingCeiling: intersectThinkingCeilings(params.thinkingCeiling, agentConfig.maxThinking, ctx.childRuntime?.thinkingCeiling),
1621
+ agentName: agentConfig.name,
1622
+ runId: id,
1623
+ });
1624
+ assertClaudeCodeModelScope({ scopes: modelScopes, model: singleClaudeCodeOverride?.model, agent: agentConfig.name, runId: id });
1625
+ assertClaudeCodeOverrideIsLocal(agentConfig.name, machine ? requestedMachine : undefined, singleClaudeCodeOverride);
1626
+ }
1627
+ catch (error) {
1628
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1629
+ }
1630
+ }
1549
1631
  const effectiveThinking = externalRunner ? undefined : params.thinkingOverride ?? agentConfig.thinking;
1550
1632
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);
1551
1633
  const contextLimit = model ? findModelInfo(model, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
@@ -1599,7 +1681,7 @@ export function executeAsyncSingle(id, params) {
1599
1681
  return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1600
1682
  }
1601
1683
  }
1602
- const requiredExtensions = externalRunner ? [] : params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? resolveRequiredChildExtensions(ctx.parentSessionId ?? ctx.currentSessionId ?? undefined);
1684
+ const requiredExtensions = externalRunner ? [] : params.requiredExtensions ?? ctx.childRuntime?.requiredExtensions ?? registeredExtensions;
1603
1685
  const toolPlan = resolvePiLaunchToolPlan({
1604
1686
  tools: agentConfig.tools,
1605
1687
  excludeTools: agentConfig.excludeTools,
@@ -1725,6 +1807,7 @@ export function executeAsyncSingle(id, params) {
1725
1807
  agent,
1726
1808
  task: taskText,
1727
1809
  ...(agentConfig.runner ? { runner: agentConfig.runner } : {}),
1810
+ ...(singleClaudeCodeOverride ? { claudeCodeOverrideArgs: singleClaudeCodeOverride.args } : {}),
1728
1811
  ...(machine ? { machine } : {}),
1729
1812
  ...(!externalRunner && machine && params.reads !== undefined ? { remoteReads: params.reads } : {}),
1730
1813
  ...(machineEnv ? { machineEnv } : {}),