@bastani/atomic 0.9.16-alpha.9 → 0.9.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 (191) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/README.md +4 -4
  3. package/dist/builtin/intercom/CHANGELOG.md +42 -0
  4. package/dist/builtin/intercom/README.md +18 -17
  5. package/dist/builtin/intercom/broker/broker.ts +43 -18
  6. package/dist/builtin/intercom/broker/client.ts +138 -7
  7. package/dist/builtin/intercom/broker/group-isolation.ts +3 -3
  8. package/dist/builtin/intercom/broker/group-membership.ts +55 -0
  9. package/dist/builtin/intercom/broker/presence-handler.ts +62 -50
  10. package/dist/builtin/intercom/broker/send-handler.ts +2 -3
  11. package/dist/builtin/intercom/group.ts +40 -0
  12. package/dist/builtin/intercom/index.bundle.mjs +490 -183
  13. package/dist/builtin/intercom/package.json +2 -2
  14. package/dist/builtin/intercom/skills/intercom/SKILL.md +16 -10
  15. package/dist/builtin/intercom/types.ts +24 -2
  16. package/dist/builtin/mcp/index.bundle.mjs +202 -52
  17. package/dist/builtin/mcp/package.json +2 -2
  18. package/dist/builtin/subagents/CHANGELOG.md +51 -0
  19. package/dist/builtin/subagents/README.md +3 -3
  20. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  21. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  22. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  23. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  24. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  25. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  26. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  27. package/dist/builtin/subagents/agents/debugger.md +1 -1
  28. package/dist/builtin/subagents/agents/worker.md +1 -1
  29. package/dist/builtin/subagents/package.json +3 -3
  30. package/dist/builtin/subagents/src/extension/index.bundle.mjs +422 -140
  31. package/dist/builtin/web-access/index.bundle.mjs +202 -52
  32. package/dist/builtin/web-access/package.json +2 -2
  33. package/dist/builtin/workflows/CHANGELOG.md +70 -0
  34. package/dist/builtin/workflows/README.md +2 -2
  35. package/dist/builtin/workflows/builtin/{chunk-h5e65g7g.js → chunk-3y1hmzw6.js} +36 -6
  36. package/dist/builtin/workflows/builtin/{chunk-nqr34qp3.js → chunk-6rbajjf5.js} +7 -1
  37. package/dist/builtin/workflows/builtin/{chunk-qe6bfpbd.js → chunk-bz1c9732.js} +15 -3
  38. package/dist/builtin/workflows/builtin/{chunk-8v8wmb7z.js → chunk-dattsgxg.js} +1 -1
  39. package/dist/builtin/workflows/builtin/{chunk-17zk6ffd.js → chunk-gdx0avpx.js} +355 -67
  40. package/dist/builtin/workflows/builtin/{chunk-rbnj9621.js → chunk-w9c7rkrk.js} +1 -1
  41. package/dist/builtin/workflows/builtin/goal.js +3 -3
  42. package/dist/builtin/workflows/builtin/index.js +5 -5
  43. package/dist/builtin/workflows/builtin/open-claude-design.js +2 -2
  44. package/dist/builtin/workflows/builtin/ralph.js +3 -3
  45. package/dist/builtin/workflows/package.json +2 -2
  46. package/dist/builtin/workflows/src/extension/index.bundle.mjs +531 -143
  47. package/dist/builtin/workflows/src/index.js +212 -72
  48. package/dist/cli/args.js +6 -6
  49. package/dist/cli/args.js.map +1 -1
  50. package/dist/cli/config-selector.d.ts.map +1 -1
  51. package/dist/cli/config-selector.js +2 -1
  52. package/dist/cli/config-selector.js.map +1 -1
  53. package/dist/cli/session-picker.d.ts +2 -1
  54. package/dist/cli/session-picker.d.ts.map +1 -1
  55. package/dist/cli/session-picker.js +3 -2
  56. package/dist/cli/session-picker.js.map +1 -1
  57. package/dist/cli/startup-ui.d.ts.map +1 -1
  58. package/dist/cli/startup-ui.js +2 -1
  59. package/dist/cli/startup-ui.js.map +1 -1
  60. package/dist/core/agent-session-methods.d.ts +1 -0
  61. package/dist/core/agent-session-methods.d.ts.map +1 -1
  62. package/dist/core/agent-session-methods.js.map +1 -1
  63. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  64. package/dist/core/agent-session-post-tool-compaction.js +3 -6
  65. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  66. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  67. package/dist/core/agent-session-prompt.js +3 -1
  68. package/dist/core/agent-session-prompt.js.map +1 -1
  69. package/dist/core/agent-session-services.d.ts.map +1 -1
  70. package/dist/core/agent-session-services.js +6 -3
  71. package/dist/core/agent-session-services.js.map +1 -1
  72. package/dist/core/agent-session-state.d.ts.map +1 -1
  73. package/dist/core/agent-session-state.js +7 -5
  74. package/dist/core/agent-session-state.js.map +1 -1
  75. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  76. package/dist/core/agent-session-tool-hooks.js +37 -23
  77. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  78. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  79. package/dist/core/agent-session-tool-registry.js +9 -2
  80. package/dist/core/agent-session-tool-registry.js.map +1 -1
  81. package/dist/core/agent-session.d.ts +2 -0
  82. package/dist/core/agent-session.d.ts.map +1 -1
  83. package/dist/core/agent-session.js +2 -0
  84. package/dist/core/agent-session.js.map +1 -1
  85. package/dist/core/builtin-packages.d.ts +4 -0
  86. package/dist/core/builtin-packages.d.ts.map +1 -1
  87. package/dist/core/builtin-packages.js +22 -1
  88. package/dist/core/builtin-packages.js.map +1 -1
  89. package/dist/core/callback-activity.d.ts.map +1 -1
  90. package/dist/core/callback-activity.js +6 -3
  91. package/dist/core/callback-activity.js.map +1 -1
  92. package/dist/core/extensions/loader-core.d.ts +1 -0
  93. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  94. package/dist/core/extensions/loader-core.js +11 -1
  95. package/dist/core/extensions/loader-core.js.map +1 -1
  96. package/dist/core/extensions/loader.d.ts +1 -1
  97. package/dist/core/extensions/loader.d.ts.map +1 -1
  98. package/dist/core/extensions/loader.js +1 -1
  99. package/dist/core/extensions/loader.js.map +1 -1
  100. package/dist/core/extensions/runner-registries.d.ts.map +1 -1
  101. package/dist/core/extensions/runner-registries.js +9 -4
  102. package/dist/core/extensions/runner-registries.js.map +1 -1
  103. package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
  104. package/dist/core/extensions/runner-shortcuts.js +1 -0
  105. package/dist/core/extensions/runner-shortcuts.js.map +1 -1
  106. package/dist/core/keybindings.d.ts +5 -0
  107. package/dist/core/keybindings.d.ts.map +1 -1
  108. package/dist/core/keybindings.js +4 -0
  109. package/dist/core/keybindings.js.map +1 -1
  110. package/dist/core/mandatory-resource-loader.d.ts +6 -0
  111. package/dist/core/mandatory-resource-loader.d.ts.map +1 -0
  112. package/dist/core/mandatory-resource-loader.js +94 -0
  113. package/dist/core/mandatory-resource-loader.js.map +1 -0
  114. package/dist/core/mandatory-runtime-tools.d.ts +10 -0
  115. package/dist/core/mandatory-runtime-tools.d.ts.map +1 -0
  116. package/dist/core/mandatory-runtime-tools.js +31 -0
  117. package/dist/core/mandatory-runtime-tools.js.map +1 -0
  118. package/dist/core/model-resolver-defaults.js +1 -1
  119. package/dist/core/model-resolver-defaults.js.map +1 -1
  120. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  121. package/dist/core/resource-loader-reload.js +24 -13
  122. package/dist/core/resource-loader-reload.js.map +1 -1
  123. package/dist/core/sdk.d.ts.map +1 -1
  124. package/dist/core/sdk.js +2 -0
  125. package/dist/core/sdk.js.map +1 -1
  126. package/dist/core/settings-manager-ui-accessors.d.ts +4 -1
  127. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  128. package/dist/core/settings-manager-ui-accessors.js +22 -0
  129. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  130. package/dist/core/settings-types.d.ts +4 -0
  131. package/dist/core/settings-types.d.ts.map +1 -1
  132. package/dist/core/settings-types.js.map +1 -1
  133. package/dist/core/slash-commands.js +1 -1
  134. package/dist/core/slash-commands.js.map +1 -1
  135. package/dist/main-session.d.ts.map +1 -1
  136. package/dist/main-session.js +3 -2
  137. package/dist/main-session.js.map +1 -1
  138. package/dist/main.d.ts.map +1 -1
  139. package/dist/main.js +6 -0
  140. package/dist/main.js.map +1 -1
  141. package/dist/modes/interactive/components/fast-mode-selector.js +2 -2
  142. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  143. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  144. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  145. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  146. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  147. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  148. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  149. package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
  150. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  151. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  152. package/dist/modes/interactive/interactive-agent-events.js +2 -1
  153. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  154. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  155. package/dist/modes/interactive/interactive-deferred-startup.js +1 -0
  156. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  157. package/dist/modes/interactive/interactive-input-handling.js +3 -0
  158. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  159. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  160. package/dist/modes/interactive/interactive-mode-base.js +15 -1
  161. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  162. package/dist/modes/interactive/interactive-mode-surface.d.ts +6 -1
  163. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  164. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  165. package/dist/modes/interactive/interactive-selectors.js +6 -1
  166. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  167. package/dist/modes/interactive/interactive-session-runtime.js +3 -0
  168. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  169. package/dist/modes/interactive/interactive-slash-commands.js +7 -12
  170. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  171. package/dist/modes/interactive/interactive-tui.d.ts +1 -0
  172. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  173. package/dist/modes/interactive/interactive-tui.js +16 -0
  174. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  175. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  176. package/dist/modes/rpc/rpc-session-binding.js +2 -0
  177. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  178. package/docs/compaction.md +1 -1
  179. package/docs/environment-variables.md +2 -0
  180. package/docs/extensions.md +1 -1
  181. package/docs/intercom.md +29 -24
  182. package/docs/keybindings.md +5 -2
  183. package/docs/packages.md +1 -1
  184. package/docs/providers.md +2 -2
  185. package/docs/sdk.md +9 -7
  186. package/docs/settings.md +9 -3
  187. package/docs/subagents.md +2 -2
  188. package/docs/usage.md +7 -6
  189. package/docs/workflows.md +11 -7
  190. package/npm-shrinkwrap.json +59 -77
  191. package/package.json +7 -7
@@ -1126,15 +1126,15 @@ ${chalk.bold("Options:")}
1126
1126
  --name, -n <name> Set session display name
1127
1127
  --models <patterns> Comma-separated model patterns for ctrl+p cycling
1128
1128
  Supports globs (anthropic/*, *sonnet*) and fuzzy matching
1129
- --no-tools, -nt Disable all tools by default (built-in and extension)
1129
+ --no-tools, -nt Disable every tool except mandatory ordinary intercom
1130
1130
  --no-builtin-tools, -nbt Disable built-in tools by default but keep extension/custom tools enabled
1131
- --tools, -t <tools> Comma-separated allowlist of tool names to enable
1132
- Applies to built-in, extension, and custom tools
1133
- --exclude-tools, -xt <tools> Comma-separated denylist of tool names to disable
1134
- Applies to built-in, extension, and custom tools
1131
+ --tools, -t <tools> Comma-separated allowlist of non-mandatory tool names
1132
+ Mandatory ordinary intercom remains available
1133
+ --exclude-tools, -xt <tools> Comma-separated denylist of non-mandatory tool names
1134
+ Mandatory ordinary intercom cannot be excluded
1135
1135
  --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh, max
1136
1136
  --extension, -e <path> Load an extension file (can be used multiple times)
1137
- --no-extensions, -ne Disable extension discovery (explicit -e paths still work)
1137
+ --no-extensions, -ne Disable optional extension discovery; mandatory bundled Intercom remains loaded
1138
1138
  --skill <path> Load a skill file or directory (can be used multiple times)
1139
1139
  --no-skills, -ns Disable skills discovery and loading
1140
1140
  --prompt-template <path> Load a prompt template file or directory (can be used multiple times)
@@ -10019,11 +10019,13 @@ function runSynchronousCallback(descriptor, callback) {
10019
10019
  }
10020
10020
  }
10021
10021
  async function runCallback(descriptor, callback) {
10022
+ if (!reporter)
10023
+ return callback();
10024
+ await yieldToEventLoop();
10022
10025
  const active = beginActivity(descriptor);
10023
10026
  if (!active)
10024
10027
  return callback();
10025
10028
  try {
10026
- await yieldToEventLoop();
10027
10029
  return await callback();
10028
10030
  } finally {
10029
10031
  active.reporter.finished(active.activity.id);
@@ -13013,12 +13015,45 @@ var init_runner_events = __esm(() => {
13013
13015
  init_callback_activity();
13014
13016
  });
13015
13017
 
13018
+ // src/core/mandatory-runtime-tools.ts
13019
+ function markTrustedMandatoryRuntimeExtension(extension) {
13020
+ extension.sourceInfo = { ...extension.sourceInfo, configurationOrigin: "bundled" };
13021
+ for (const registration of extension.tools.values()) {
13022
+ registration.sourceInfo = extension.sourceInfo;
13023
+ if (MANDATORY_TOOL_NAMES.has(registration.definition.name)) {
13024
+ TRUSTED_MANDATORY_DEFINITIONS.add(registration.definition);
13025
+ }
13026
+ }
13027
+ for (const command of extension.commands.values())
13028
+ command.sourceInfo = extension.sourceInfo;
13029
+ }
13030
+ function isTrustedMandatoryRuntimeTool(registration) {
13031
+ return MANDATORY_TOOL_NAMES.has(registration.definition.name) && TRUSTED_MANDATORY_DEFINITIONS.has(registration.definition);
13032
+ }
13033
+ function isMandatoryRuntimeTool(name) {
13034
+ return MANDATORY_TOOL_NAMES.has(name);
13035
+ }
13036
+ function appendRegisteredMandatoryTools(tools, registry) {
13037
+ for (const name of MANDATORY_TOOL_NAMES) {
13038
+ const tool = registry.get(name);
13039
+ if (tool && !tools.some((candidate) => candidate.name === name))
13040
+ tools.push(tool);
13041
+ }
13042
+ return tools;
13043
+ }
13044
+ var MANDATORY_TOOL_NAMES, TRUSTED_MANDATORY_DEFINITIONS;
13045
+ var init_mandatory_runtime_tools = __esm(() => {
13046
+ MANDATORY_TOOL_NAMES = new Set(["intercom"]);
13047
+ TRUSTED_MANDATORY_DEFINITIONS = new WeakSet;
13048
+ });
13049
+
13016
13050
  // src/core/extensions/runner-registries.ts
13017
13051
  function collectRegisteredTools(extensions) {
13018
13052
  const toolsByName = new Map;
13019
13053
  for (const ext of extensions) {
13020
13054
  for (const tool of ext.tools.values()) {
13021
- if (!toolsByName.has(tool.definition.name)) {
13055
+ const existing = toolsByName.get(tool.definition.name);
13056
+ if (!existing || isMandatoryRuntimeTool(tool.definition.name) && isTrustedMandatoryRuntimeTool(tool)) {
13022
13057
  toolsByName.set(tool.definition.name, tool);
13023
13058
  }
13024
13059
  }
@@ -13026,13 +13061,16 @@ function collectRegisteredTools(extensions) {
13026
13061
  return Array.from(toolsByName.values());
13027
13062
  }
13028
13063
  function findToolDefinition(extensions, toolName) {
13064
+ let first;
13029
13065
  for (const ext of extensions) {
13030
13066
  const tool = ext.tools.get(toolName);
13031
- if (tool) {
13067
+ if (!tool)
13068
+ continue;
13069
+ first ??= tool;
13070
+ if (isMandatoryRuntimeTool(toolName) && isTrustedMandatoryRuntimeTool(tool))
13032
13071
  return tool.definition;
13033
- }
13034
13072
  }
13035
- return;
13073
+ return first?.definition;
13036
13074
  }
13037
13075
  function collectFlags(extensions) {
13038
13076
  const allFlags = new Map;
@@ -13100,6 +13138,9 @@ function resolveRegisteredCommands(extensions) {
13100
13138
  return { ...command, invocationName };
13101
13139
  });
13102
13140
  }
13141
+ var init_runner_registries = __esm(() => {
13142
+ init_mandatory_runtime_tools();
13143
+ });
13103
13144
 
13104
13145
  // src/core/extensions/runner-shortcuts.ts
13105
13146
  function resolveExtensionShortcuts(extensions, resolvedKeybindings, hasUI) {
@@ -13163,6 +13204,7 @@ var init_runner_shortcuts = __esm(() => {
13163
13204
  "app.thinking.toggle",
13164
13205
  "app.editor.external",
13165
13206
  "app.message.followUp",
13207
+ "app.message.copy",
13166
13208
  "tui.input.submit",
13167
13209
  "tui.select.confirm",
13168
13210
  "tui.select.cancel",
@@ -13654,6 +13696,7 @@ var init_runner = __esm(() => {
13654
13696
  init_loader_runtime();
13655
13697
  init_runner_context();
13656
13698
  init_runner_events();
13699
+ init_runner_registries();
13657
13700
  init_runner_shortcuts();
13658
13701
  init_runner_ui();
13659
13702
  init_stale_context();
@@ -15886,11 +15929,13 @@ async function _runAgentContinue() {
15886
15929
  }
15887
15930
  async function _continueQueuedAgentMessages() {
15888
15931
  await this._agentEventQueue;
15889
- while (!this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
15932
+ while (!this._stopAfterTurnBlockedContinuation && !this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
15890
15933
  await this.agent.continue();
15891
15934
  await this.waitForRetry();
15892
15935
  await this._agentEventQueue;
15893
15936
  }
15937
+ if (this._stopAfterTurnBlockedContinuation)
15938
+ return;
15894
15939
  await answerAdmittedQueuedMessage(this);
15895
15940
  }
15896
15941
  async function answerAdmittedQueuedMessage(session) {
@@ -17598,14 +17643,13 @@ function getToolDefinition(name) {
17598
17643
  }
17599
17644
  function setActiveToolsByName(toolNames) {
17600
17645
  const tools = [];
17601
- const validToolNames = [];
17602
17646
  for (const name of toolNames) {
17603
17647
  const tool = this._toolRegistry.get(name);
17604
- if (tool) {
17648
+ if (tool)
17605
17649
  tools.push(tool);
17606
- validToolNames.push(name);
17607
- }
17608
17650
  }
17651
+ appendRegisteredMandatoryTools(tools, this._toolRegistry);
17652
+ const validToolNames = tools.map((tool) => tool.name);
17609
17653
  this.agent.state.tools = tools;
17610
17654
  this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
17611
17655
  this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
@@ -17662,7 +17706,7 @@ function _rebuildSystemPrompt(toolNames) {
17662
17706
  customPrompt: loaderSystemPrompt,
17663
17707
  appendSystemPrompt,
17664
17708
  selectedTools: validToolNames,
17665
- excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames) : undefined,
17709
+ excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames).filter((name) => !isMandatoryRuntimeTool(name)) : undefined,
17666
17710
  toolSnippets,
17667
17711
  promptGuidelines
17668
17712
  };
@@ -17675,6 +17719,7 @@ function _refreshBaseSystemPromptFromActiveTools() {
17675
17719
  }
17676
17720
  var agentSessionStateMethods;
17677
17721
  var init_agent_session_state = __esm(() => {
17722
+ init_mandatory_runtime_tools();
17678
17723
  init_skill_catalog();
17679
17724
  init_system_prompt();
17680
17725
  agentSessionStateMethods = {
@@ -18702,6 +18747,17 @@ function _installAgentToolHooks() {
18702
18747
  }
18703
18748
  function _installAgentNextTurnRefresh() {
18704
18749
  const previousPrepareNextTurnWithContext = this.agent.prepareNextTurnWithContext ?? (this.agent.prepareNextTurn ? async (_turn, signal) => await this.agent.prepareNextTurn?.(signal) : undefined);
18750
+ const previousShouldStopAfterTurn = this.agent.shouldStopAfterTurn;
18751
+ this.agent.shouldStopAfterTurn = async (turn, signal) => {
18752
+ const toolCallIds = turn.message.content.filter((part) => part.type === "toolCall").map((part) => part.id);
18753
+ const terminatingBatch = toolCallIds.length > 0 && toolCallIds.every((id) => this._terminatingToolCallIds.has(id));
18754
+ for (const id of toolCallIds)
18755
+ this._terminatingToolCallIds.delete(id);
18756
+ const shouldStop = await previousShouldStopAfterTurn?.(turn, signal) ?? false;
18757
+ this._stopAfterTurnBlockedContinuation = shouldStop;
18758
+ await settleFallbackAfterTurn(this, turn, terminatingBatch);
18759
+ return shouldStop;
18760
+ };
18705
18761
  const previousTransformContext = this.agent.transformContext;
18706
18762
  this.agent.transformContext = async (messages, signal) => {
18707
18763
  const transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;
@@ -18709,24 +18765,17 @@ function _installAgentNextTurnRefresh() {
18709
18765
  assertToolPairingInvariant(guarded);
18710
18766
  return guarded;
18711
18767
  };
18712
- this.agent.prepareNextTurnWithContext = async (turn, signal) => {
18713
- const previousSnapshot = await previousPrepareNextTurnWithContext?.(turn, signal);
18714
- const previousContext = previousSnapshot?.context ?? turn.context;
18715
- const toolCallIds = turn.message.content.filter((part) => part.type === "toolCall").map((part) => part.id);
18716
- const terminatingBatch = toolCallIds.length > 0 && toolCallIds.every((id) => this._terminatingToolCallIds.has(id));
18717
- for (const id of toolCallIds)
18718
- this._terminatingToolCallIds.delete(id);
18719
- const messages = turn.toolResults.length > 0 && !terminatingBatch ? await this._preflightPostToolContext(previousContext.messages, signal) : previousContext.messages;
18720
- const preserveFallbackForFailure = turn.message.role === "assistant" && !this.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || this._isEmptyCompletion?.(turn.message) === true || this._isSafetyRefusal?.(turn.message) === true);
18721
- if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
18722
- await this._agentEventQueue;
18723
- await this._settleFallbackModelScope();
18724
- }
18768
+ const prepareTurn = async (turn, signal) => {
18769
+ const compactedMessages = turn.toolResults.length > 0 ? await this._preflightPostToolContext(turn.context.messages, signal) : turn.context.messages;
18770
+ const compactedContext = compactedMessages === turn.context.messages ? turn.context : { ...turn.context, messages: compactedMessages };
18771
+ const preparedTurn = compactedContext === turn.context ? turn : { ...turn, context: compactedContext };
18772
+ const previousSnapshot = await previousPrepareNextTurnWithContext?.(preparedTurn, signal);
18773
+ const previousContext = previousSnapshot?.context ?? compactedContext;
18725
18774
  return {
18726
18775
  ...previousSnapshot,
18727
18776
  context: {
18728
18777
  ...previousContext,
18729
- messages,
18778
+ messages: previousContext.messages,
18730
18779
  systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
18731
18780
  tools: this.agent.state.tools.slice()
18732
18781
  },
@@ -18734,6 +18783,14 @@ function _installAgentNextTurnRefresh() {
18734
18783
  thinkingLevel: this.agent.state.thinkingLevel
18735
18784
  };
18736
18785
  };
18786
+ this.agent.prepareNextTurnWithContext = prepareTurn;
18787
+ }
18788
+ async function settleFallbackAfterTurn(session, turn, terminatingBatch) {
18789
+ const preserveFallbackForFailure = turn.message.role === "assistant" && !session.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || session._isEmptyCompletion?.(turn.message) === true || session._isSafetyRefusal?.(turn.message) === true);
18790
+ if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
18791
+ await session._agentEventQueue;
18792
+ await session._settleFallbackModelScope();
18793
+ }
18737
18794
  }
18738
18795
  var agentSessionToolHooksMethods;
18739
18796
  var init_agent_session_tool_hooks = __esm(() => {
@@ -19631,6 +19688,14 @@ var init_loader_virtual_modules = __esm(() => {
19631
19688
 
19632
19689
  // src/core/extensions/loader-core.ts
19633
19690
  import * as path7 from "node:path";
19691
+ function getExtensionRuntimeEventBus(runtime) {
19692
+ let eventBus = runtimeEventBuses.get(runtime);
19693
+ if (!eventBus) {
19694
+ eventBus = createEventBus();
19695
+ runtimeEventBuses.set(runtime, eventBus);
19696
+ }
19697
+ return eventBus;
19698
+ }
19634
19699
  function createExtension(extensionPath, resolvedPath) {
19635
19700
  const source = extensionPath.startsWith("<") && extensionPath.endsWith(">") ? extensionPath.slice(1, -1).split(":")[0] || "temporary" : "local";
19636
19701
  const baseDir = extensionPath.startsWith("<") ? undefined : path7.dirname(resolvedPath);
@@ -19696,6 +19761,7 @@ async function loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProv
19696
19761
  const resolvedCwd = cacheToken?.cwd ?? resolvePath(cwd);
19697
19762
  const resolvedEventBus = eventBus ?? createEventBus();
19698
19763
  const resolvedRuntime = runtime ?? createExtensionRuntime();
19764
+ runtimeEventBuses.set(resolvedRuntime, resolvedEventBus);
19699
19765
  let processedExtensionCount = 0;
19700
19766
  let lastYieldAt = Date.now();
19701
19767
  for (const extPath of paths) {
@@ -19727,7 +19793,7 @@ async function loadExtensions(paths, cwd, eventBus, workflowResourceProvider = e
19727
19793
  async function loadExtensionsCached(paths, cwd, eventBus, workflowResourceProvider = emptyWorkflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider) {
19728
19794
  return loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider, true);
19729
19795
  }
19730
- var INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
19796
+ var runtimeEventBuses, INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
19731
19797
  var init_loader_core = __esm(() => {
19732
19798
  init_event_loop();
19733
19799
  init_paths();
@@ -19737,6 +19803,7 @@ var init_loader_core = __esm(() => {
19737
19803
  init_loader_resources();
19738
19804
  init_loader_runtime();
19739
19805
  init_loader_virtual_modules();
19806
+ runtimeEventBuses = new WeakMap;
19740
19807
  });
19741
19808
 
19742
19809
  // src/core/package-manager-manifest.ts
@@ -28275,7 +28342,7 @@ class FastModeSelectorComponent {
28275
28342
  }
28276
28343
  invalidate() {}
28277
28344
  render(width) {
28278
- const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Codex fast mode")), width)];
28345
+ const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Fast mode")), width)];
28279
28346
  for (const line of wrapTextWithAnsi3(DESCRIPTION, Math.max(20, width))) {
28280
28347
  lines.push(theme.fg("muted", line));
28281
28348
  }
@@ -28358,7 +28425,7 @@ class FastModeSelectorComponent {
28358
28425
  return this.getFocusedRow() === row ? theme.fg("muted", text) : theme.fg("dim", text);
28359
28426
  }
28360
28427
  }
28361
- var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "Priority tier for supported OpenAI and shared ChatGPT Codex transports.", ROW_DETAILS;
28428
+ var ROWS, LABEL_WIDTH = 16, DESCRIPTION = "Use faster routing for the selected model when supported by its provider.", ROW_DETAILS;
28362
28429
  var init_fast_mode_selector = __esm(() => {
28363
28430
  init_theme();
28364
28431
  ROWS = ["chat", "workflow"];
@@ -29664,6 +29731,10 @@ var init_keybindings = __esm(() => {
29664
29731
  defaultKeys: windowsKeybindings ? "alt+q" : "alt+up",
29665
29732
  description: "Restore queued messages"
29666
29733
  },
29734
+ "app.message.copy": {
29735
+ defaultKeys: "ctrl+x",
29736
+ description: "Copy fullscreen selection or last agent message"
29737
+ },
29667
29738
  "app.clipboard.pasteImage": {
29668
29739
  defaultKeys: windowsKeybindings ? "alt+v" : "ctrl+v",
29669
29740
  description: "Paste image from clipboard (text fallback)"
@@ -31056,6 +31127,9 @@ function createSettingsChangeHandler(callbacks) {
31056
31127
  case "fullscreen-exit-output":
31057
31128
  callbacks.onFullscreenExitOutputChange(newValue);
31058
31129
  break;
31130
+ case "fullscreen-copy-on-select":
31131
+ callbacks.onFullscreenCopyOnSelectChange(newValue === "true");
31132
+ break;
31059
31133
  case "editor-padding":
31060
31134
  callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
31061
31135
  break;
@@ -31443,6 +31517,13 @@ function insertUiToggles(items, config) {
31443
31517
  values: ["transcript", "resume-hint"]
31444
31518
  });
31445
31519
  insertAfter(items, "fullscreen-exit-output", {
31520
+ id: "fullscreen-copy-on-select",
31521
+ label: "Fullscreen copy on select",
31522
+ description: "Copy selected transcript text automatically on mouse release",
31523
+ currentValue: config.fullscreenCopyOnSelect ? "true" : "false",
31524
+ values: ["true", "false"]
31525
+ });
31526
+ insertAfter(items, "fullscreen-copy-on-select", {
31446
31527
  id: "editor-padding",
31447
31528
  label: "Editor padding",
31448
31529
  description: "Horizontal padding for input editor (0-3)",
@@ -44720,6 +44801,8 @@ function _refreshToolRegistry(options) {
44720
44801
  const allowedToolNames = this._allowedToolNames;
44721
44802
  const excludedToolNames = this._excludedToolNames;
44722
44803
  const isExposedTool = (name) => {
44804
+ if (isMandatoryRuntimeTool(name))
44805
+ return true;
44723
44806
  if (allowedToolNames && !allowedToolNames.has(name)) {
44724
44807
  return false;
44725
44808
  }
@@ -44728,10 +44811,10 @@ function _refreshToolRegistry(options) {
44728
44811
  }
44729
44812
  return true;
44730
44813
  };
44731
- const registeredTools = this._extensionRunner.getAllRegisteredTools();
44814
+ const registeredTools = this._extensionRunner.getAllRegisteredTools().filter((tool) => !isMandatoryRuntimeTool(tool.definition.name) || isTrustedMandatoryRuntimeTool(tool));
44732
44815
  const allCustomTools = [
44733
44816
  ...registeredTools,
44734
- ...this._customTools.map((definition) => ({
44817
+ ...this._customTools.filter((definition) => !isMandatoryRuntimeTool(definition.name)).map((definition) => ({
44735
44818
  definition,
44736
44819
  sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" })
44737
44820
  }))
@@ -44852,6 +44935,7 @@ function _buildRuntime(options) {
44852
44935
  var agentSessionToolRegistryMethods;
44853
44936
  var init_agent_session_tool_registry = __esm(() => {
44854
44937
  init_extensions();
44938
+ init_mandatory_runtime_tools();
44855
44939
  init_model_registry();
44856
44940
  init_tools();
44857
44941
  init_session_temp_dir();
@@ -45694,6 +45778,7 @@ class AgentSessionBase {
45694
45778
  _postToolCompactionPreflightError = undefined;
45695
45779
  _pendingPostToolCompactionGuard = undefined;
45696
45780
  _terminatingToolCallIds = new Set;
45781
+ _stopAfterTurnBlockedContinuation = false;
45697
45782
  _disposed = false;
45698
45783
  _branchSummaryAbortController = undefined;
45699
45784
  _sessionSummaryAbortController = undefined;
@@ -46281,6 +46366,23 @@ function getBuiltinPackagePaths() {
46281
46366
  return packageDir ? [packageDir] : [];
46282
46367
  });
46283
46368
  }
46369
+ function getMandatoryBuiltinPackagePaths() {
46370
+ const context = getBuiltinPackageCandidateContext();
46371
+ return BUILTIN_PACKAGES.filter((descriptor) => descriptor.mandatory).flatMap((descriptor) => {
46372
+ const packageDir = firstExistingPackageDir([...descriptor.sourceCandidates(context), ...distCandidates(context, descriptor)], descriptor);
46373
+ return packageDir ? [packageDir] : [];
46374
+ });
46375
+ }
46376
+ function getMandatoryBuiltinExtensionPaths() {
46377
+ return getMandatoryBuiltinPackagePaths().flatMap((packageDir) => {
46378
+ try {
46379
+ const manifest = JSON.parse(stripBom(readFileSync21(join43(packageDir, "package.json"), "utf-8")));
46380
+ return (manifest.atomic?.extensions ?? manifest.pi?.extensions ?? []).map((entry) => resolve12(packageDir, entry));
46381
+ } catch {
46382
+ return [];
46383
+ }
46384
+ });
46385
+ }
46284
46386
  var WORKSPACE_BUILTINS, BUILTIN_PACKAGES;
46285
46387
  var init_builtin_packages = __esm(() => {
46286
46388
  init_config();
@@ -46291,11 +46393,12 @@ var init_builtin_packages = __esm(() => {
46291
46393
  { packageName: "@bastani/subagents", workspaceDirName: "subagents", distDirName: "subagents" },
46292
46394
  { packageName: "@bastani/mcp", workspaceDirName: "mcp", distDirName: "mcp" },
46293
46395
  { packageName: "@bastani/web-access", workspaceDirName: "web-access", distDirName: "web-access" },
46294
- { packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom" }
46396
+ { packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom", mandatory: true }
46295
46397
  ];
46296
46398
  BUILTIN_PACKAGES = WORKSPACE_BUILTINS.map((spec) => ({
46297
46399
  packageName: spec.packageName,
46298
46400
  distDirName: spec.distDirName,
46401
+ mandatory: spec.mandatory === true,
46299
46402
  requiredEntries: requiredEntriesForBuiltin(spec.distDirName),
46300
46403
  sourceCandidates: ({ here, packageDir, isSourceCheckout }) => isSourceCheckout ? [join43(packageDir, "..", spec.workspaceDirName), join43(here, "..", "..", "..", spec.workspaceDirName)] : []
46301
46404
  }));
@@ -52270,6 +52373,13 @@ function getEnabledResources(resources, metadataByPath) {
52270
52373
  function getEnabledPaths(resources, metadataByPath) {
52271
52374
  return getEnabledResources(resources, metadataByPath).map((r) => r.path);
52272
52375
  }
52376
+ function getBuiltinExtensionPaths(resources, metadataByPath, noExtensions) {
52377
+ for (const resource of resources) {
52378
+ if (!metadataByPath.has(resource.path))
52379
+ metadataByPath.set(resource.path, resource.metadata);
52380
+ }
52381
+ return noExtensions ? [] : resources.filter((resource) => resource.enabled).map((resource) => resource.path);
52382
+ }
52273
52383
  function mapSkillPath(resource, metadataByPath) {
52274
52384
  if (resource.metadata.source !== "auto" && resource.metadata.origin !== "package") {
52275
52385
  return resource.path;
@@ -52313,12 +52423,12 @@ async function loadProjectTrustExtensions(loader) {
52313
52423
  const metadataByPath = new Map;
52314
52424
  const cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);
52315
52425
  const enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);
52316
- const builtinEnabledExtensions = state.noExtensions ? [] : getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);
52426
+ const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
52317
52427
  const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
52318
52428
  state.workflowResources = workflowResources;
52319
52429
  const workflowResourceProvider = createWorkflowResourceProvider(loader);
52320
52430
  const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
52321
- const extensionPaths = state.noExtensions ? cliEnabledExtensions : mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);
52431
+ const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
52322
52432
  const extensionsResult = await loadExtensionsCached(extensionPaths, state.cwd, state.eventBus, workflowResourceProvider, undefined, inheritanceSnapshotProvider);
52323
52433
  const inlineExtensions = await loadExtensionFactories(loader, extensionsResult.runtime, workflowResourceProvider, inheritanceSnapshotProvider);
52324
52434
  extensionsResult.extensions.push(...inlineExtensions.extensions);
@@ -52398,7 +52508,7 @@ async function reloadDefaultResourceLoader(loader, options) {
52398
52508
  const enabledSkillResources = getEnabledResources(resolvedPaths.skills, metadataByPath);
52399
52509
  const enabledPrompts = getEnabledPaths(resolvedPaths.prompts, metadataByPath);
52400
52510
  const enabledThemes = getEnabledPaths(resolvedPaths.themes, metadataByPath);
52401
- const builtinEnabledExtensions = state.noExtensions ? [] : getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);
52511
+ const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
52402
52512
  const builtinEnabledSkillResources = state.noSkills ? [] : getEnabledResources(builtinPackagePaths.skills, metadataByPath);
52403
52513
  const builtinEnabledPrompts = state.noPromptTemplates ? [] : getEnabledPaths(builtinPackagePaths.prompts, metadataByPath);
52404
52514
  const builtinEnabledThemes = state.noThemes ? [] : getEnabledPaths(builtinPackagePaths.themes, metadataByPath);
@@ -52412,9 +52522,13 @@ async function reloadDefaultResourceLoader(loader, options) {
52412
52522
  const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
52413
52523
  state.workflowResources = workflowResources;
52414
52524
  const workflowResourceProvider = createWorkflowResourceProvider(loader);
52415
- const extensionPaths = state.noExtensions ? cliEnabledExtensions : mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);
52525
+ const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
52416
52526
  const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
52417
52527
  const extensionsResult = options?.deferExtensions ? { extensions: [], errors: [], runtime: createExtensionRuntime() } : await loadFinalExtensionSet(loader, extensionPaths, preTrustExtensions, workflowResourceProvider, inheritanceSnapshotProvider);
52528
+ const mandatoryExtensionPaths = new Set(getMandatoryBuiltinExtensionPaths().map((path16) => resolvePath(path16, state.cwd, { normalizeUnicodeSpaces: true })));
52529
+ const loadedMandatoryExtensions = new Set(extensionsResult.extensions.filter((extension) => mandatoryExtensionPaths.has(resolvePath(extension.resolvedPath, state.cwd, { normalizeUnicodeSpaces: true }))));
52530
+ for (const extension of loadedMandatoryExtensions)
52531
+ markTrustedMandatoryRuntimeExtension(extension);
52418
52532
  for (const p of state.additionalExtensionPaths) {
52419
52533
  if (isLocalPath(p)) {
52420
52534
  const resolved = resolveResourcePath(state.cwd, p);
@@ -52425,6 +52539,12 @@ async function reloadDefaultResourceLoader(loader, options) {
52425
52539
  }
52426
52540
  state.extensionsResult = state.extensionsOverride ? state.extensionsOverride(extensionsResult) : extensionsResult;
52427
52541
  applyExtensionSourceInfo(loader, state.extensionsResult.extensions, metadataByPath);
52542
+ for (const extension of state.extensionsResult.extensions) {
52543
+ const registration = extension.tools.get("intercom");
52544
+ if (loadedMandatoryExtensions.has(extension) && registration && isTrustedMandatoryRuntimeTool(registration)) {
52545
+ markTrustedMandatoryRuntimeExtension(extension);
52546
+ }
52547
+ }
52428
52548
  resolveInheritedExtensionOverlaps(state.extensionsResult);
52429
52549
  const skillPaths = state.noSkills ? mergeResourcePaths(state.cwd, cliEnabledSkills, state.additionalSkillPaths) : mergeResourcePaths(state.cwd, [...cliEnabledSkills, ...enabledSkills, ...builtinEnabledSkills], state.additionalSkillPaths);
52430
52550
  state.lastSkillPaths = skillPaths;
@@ -52504,7 +52624,9 @@ async function reloadDefaultResourceLoader(loader, options) {
52504
52624
  var init_resource_loader_reload = __esm(() => {
52505
52625
  init_event_loop();
52506
52626
  init_paths();
52627
+ init_builtin_packages();
52507
52628
  init_loader();
52629
+ init_mandatory_runtime_tools();
52508
52630
  init_resource_loader_assets();
52509
52631
  init_resource_loader_context_files();
52510
52632
  init_resource_loader_discovery();
@@ -53661,6 +53783,28 @@ var init_settings_manager_ui_accessors = __esm(() => {
53661
53783
  state.markModified("fullscreenExitOutput");
53662
53784
  state.save();
53663
53785
  },
53786
+ getFullscreenCopyOnSelect() {
53787
+ return settingsInternals(this).settings.fullscreenCopyOnSelect !== false;
53788
+ },
53789
+ setFullscreenCopyOnSelect(enabled) {
53790
+ const state = settingsInternals(this);
53791
+ state.globalSettings.fullscreenCopyOnSelect = enabled;
53792
+ state.markModified("fullscreenCopyOnSelect");
53793
+ state.save();
53794
+ },
53795
+ getTerminalCapabilityOverrides() {
53796
+ const terminal = settingsInternals(this).settings.terminal;
53797
+ const overrides = {};
53798
+ if (typeof terminal?.hyperlinks === "boolean")
53799
+ overrides.hyperlinks = terminal.hyperlinks;
53800
+ if (terminal?.images === "kitty" || terminal?.images === "iterm2")
53801
+ overrides.images = terminal.images;
53802
+ else if (terminal?.images === false)
53803
+ overrides.images = null;
53804
+ if (typeof terminal?.trueColor === "boolean")
53805
+ overrides.trueColor = terminal.trueColor;
53806
+ return overrides;
53807
+ },
53664
53808
  getEditorPaddingX() {
53665
53809
  return settingsInternals(this).settings.editorPaddingX ?? 0;
53666
53810
  },
@@ -54211,6 +54355,105 @@ function restoreAnthropicReplayThinkingBlocks(payload, sourceMessages, model) {
54211
54355
  return { ...payload, messages: nextPayloadMessages };
54212
54356
  }
54213
54357
 
54358
+ // src/core/mandatory-resource-loader.ts
54359
+ function hasTrustedIntercom(extension) {
54360
+ const registration = extension.tools.get("intercom");
54361
+ return registration !== undefined && isTrustedMandatoryRuntimeTool(registration);
54362
+ }
54363
+ async function restoreMandatoryExtensions(target, cwd) {
54364
+ if (target.extensions.some(hasTrustedIntercom))
54365
+ return target;
54366
+ const loaded = await loadExtensions(getMandatoryBuiltinExtensionPaths(), cwd, getExtensionRuntimeEventBus(target.runtime), undefined, target.runtime);
54367
+ for (const extension of loaded.extensions)
54368
+ markTrustedMandatoryRuntimeExtension(extension);
54369
+ const restored = {
54370
+ ...target,
54371
+ extensions: [...target.extensions, ...loaded.extensions],
54372
+ errors: [...target.errors, ...loaded.errors]
54373
+ };
54374
+ if (!restored.extensions.some(hasTrustedIntercom)) {
54375
+ const detail = loaded.errors.map(({ error }) => error).join("; ") || "extension did not register intercom";
54376
+ throw new Error(`Mandatory bundled Intercom is unavailable: ${detail}`);
54377
+ }
54378
+ return restored;
54379
+ }
54380
+
54381
+ class MandatoryResourceLoader {
54382
+ delegate;
54383
+ cwd;
54384
+ extensionsResult;
54385
+ toolOnly = false;
54386
+ constructor(delegate, cwd, extensionsResult) {
54387
+ this.delegate = delegate;
54388
+ this.cwd = cwd;
54389
+ this.extensionsResult = extensionsResult;
54390
+ }
54391
+ limitToTool() {
54392
+ this.toolOnly = true;
54393
+ this.removeLocalInteractionSurfaces();
54394
+ }
54395
+ removeLocalInteractionSurfaces() {
54396
+ const extension = this.extensionsResult.extensions.find(hasTrustedIntercom);
54397
+ extension?.commands.delete("intercom");
54398
+ extension?.shortcuts.delete("alt+m");
54399
+ }
54400
+ getExtensions() {
54401
+ return this.extensionsResult;
54402
+ }
54403
+ getSkills() {
54404
+ return this.delegate.getSkills();
54405
+ }
54406
+ getSkillCatalog() {
54407
+ return this.delegate.getSkillCatalog?.() ?? buildSkillCatalog(this.delegate.getSkills().skills);
54408
+ }
54409
+ getPrompts() {
54410
+ return this.delegate.getPrompts();
54411
+ }
54412
+ getThemes() {
54413
+ return this.delegate.getThemes();
54414
+ }
54415
+ getAgentsFiles() {
54416
+ return this.delegate.getAgentsFiles();
54417
+ }
54418
+ getSystemPrompt() {
54419
+ return this.delegate.getSystemPrompt();
54420
+ }
54421
+ getSystemPromptSource() {
54422
+ return this.delegate.getSystemPromptSource();
54423
+ }
54424
+ getAppendSystemPrompt() {
54425
+ return this.delegate.getAppendSystemPrompt();
54426
+ }
54427
+ getAppendSystemPromptSources() {
54428
+ return this.delegate.getAppendSystemPromptSources();
54429
+ }
54430
+ extendResources(paths) {
54431
+ return this.delegate.extendResources(paths);
54432
+ }
54433
+ async reload(options) {
54434
+ await this.delegate.reload(options);
54435
+ this.extensionsResult = await restoreMandatoryExtensions(this.delegate.getExtensions(), this.cwd);
54436
+ if (this.toolOnly)
54437
+ this.removeLocalInteractionSurfaces();
54438
+ }
54439
+ }
54440
+ async function withMandatoryResourceLoader(loader, cwd) {
54441
+ if (loader instanceof MandatoryResourceLoader)
54442
+ return loader;
54443
+ const extensionsResult = await restoreMandatoryExtensions(loader.getExtensions(), cwd);
54444
+ return new MandatoryResourceLoader(loader, cwd, extensionsResult);
54445
+ }
54446
+ function limitMandatoryIntercomToTool(loader) {
54447
+ if (loader instanceof MandatoryResourceLoader)
54448
+ loader.limitToTool();
54449
+ }
54450
+ var init_mandatory_resource_loader = __esm(() => {
54451
+ init_builtin_packages();
54452
+ init_loader();
54453
+ init_mandatory_runtime_tools();
54454
+ init_skill_catalog();
54455
+ });
54456
+
54214
54457
  // src/core/model-resolver-defaults.ts
54215
54458
  function findPreferredAvailableModel(availableModels) {
54216
54459
  for (const [provider, defaultId] of Object.entries(defaultModelPerProvider)) {
@@ -54251,7 +54494,7 @@ var init_model_resolver_defaults = __esm(() => {
54251
54494
  huggingface: "moonshotai/Kimi-K2.6",
54252
54495
  fireworks: "accounts/fireworks/models/kimi-k2p6",
54253
54496
  together: "moonshotai/Kimi-K2.6",
54254
- baseten: "zai-org/GLM-5.2",
54497
+ baseten: "zai-org/GLM-5.3",
54255
54498
  opencode: "kimi-k2.6",
54256
54499
  "opencode-go": "kimi-k2.6",
54257
54500
  "kimi-coding": "kimi-for-coding",
@@ -55040,14 +55283,16 @@ async function createAgentSessionServices(options) {
55040
55283
  const settingsSpan = startTimingSpan("createAgentSessionServices.settingsManager");
55041
55284
  const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
55042
55285
  endTimingSpan(settingsSpan);
55043
- const resourceLoader = new DefaultResourceLoader({
55044
- ...options.resourceLoaderOptions ?? {},
55286
+ const resourceLoaderOptions = options.resourceLoaderOptions ?? {};
55287
+ const defaultResourceLoader = new DefaultResourceLoader({
55288
+ ...resourceLoaderOptions,
55045
55289
  cwd,
55046
55290
  agentDir,
55047
55291
  settingsManager
55048
55292
  });
55049
55293
  const reloadSpan = startTimingSpan("createAgentSessionServices.resourceLoader.reload");
55050
- await resourceLoader.reload(options.resourceLoaderReloadOptions);
55294
+ await defaultResourceLoader.reload(options.resourceLoaderReloadOptions);
55295
+ const resourceLoader = await withMandatoryResourceLoader(defaultResourceLoader, cwd);
55051
55296
  endTimingSpan(reloadSpan);
55052
55297
  const diagnostics = [];
55053
55298
  const providerSpan = startTimingSpan("createAgentSessionServices.providerRegistrations");
@@ -55100,6 +55345,7 @@ async function createAgentSessionFromServices(options) {
55100
55345
  var init_agent_session_services = __esm(() => {
55101
55346
  init_config();
55102
55347
  init_paths();
55348
+ init_mandatory_resource_loader();
55103
55349
  init_model_runtime();
55104
55350
  init_resource_loader();
55105
55351
  init_sdk();
@@ -55482,6 +55728,7 @@ async function createAgentSession(options = {}) {
55482
55728
  await resourceLoader.reload();
55483
55729
  time("resourceLoader.reload");
55484
55730
  }
55731
+ resourceLoader = await withMandatoryResourceLoader(resourceLoader, cwd);
55485
55732
  const existingSession = sessionManager.buildSessionContext();
55486
55733
  const repairedMessages = repairOrphanToolResults(existingSession.messages, { repairTrailing: true });
55487
55734
  const existingMessages = options.initialContextTransform ? options.initialContextTransform(repairedMessages) : repairedMessages;
@@ -55707,6 +55954,7 @@ var init_sdk = __esm(() => {
55707
55954
  init_agent_session();
55708
55955
  init_auth_guidance();
55709
55956
  init_codex_fast_mode();
55957
+ init_mandatory_resource_loader();
55710
55958
  init_messages();
55711
55959
  init_model_resolver();
55712
55960
  init_model_runtime();
@@ -56283,8 +56531,14 @@ var init_list_models = __esm(() => {
56283
56531
 
56284
56532
  // src/cli/startup-ui.ts
56285
56533
  import { existsSync as existsSync45 } from "node:fs";
56286
- import { ProcessTerminal, setKeybindings, TuiMainScreen } from "@earendil-works/pi-tui";
56534
+ import {
56535
+ ProcessTerminal,
56536
+ setCapabilityOverrides,
56537
+ setKeybindings,
56538
+ TuiMainScreen
56539
+ } from "@earendil-works/pi-tui";
56287
56540
  function createStartupTui(settingsManager) {
56541
+ setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides());
56288
56542
  initTheme(settingsManager.getTheme());
56289
56543
  setKeybindings(KeybindingsManager.create());
56290
56544
  const ui = new TuiMainScreen(new ProcessTerminal, settingsManager.getShowHardwareCursor(), getAgentDir());
@@ -58114,8 +58368,9 @@ async function applyCliRuntimeApiKey(modelRuntime, providerId, apiKey, signal) {
58114
58368
  }
58115
58369
 
58116
58370
  // src/cli/session-picker.ts
58117
- import { ProcessTerminal as ProcessTerminal2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
58118
- async function selectSession(currentSessionsLoader, allSessionsLoader) {
58371
+ import { ProcessTerminal as ProcessTerminal2, setCapabilityOverrides as setCapabilityOverrides2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
58372
+ async function selectSession(currentSessionsLoader, allSessionsLoader, settingsManager) {
58373
+ setCapabilityOverrides2(settingsManager.getTerminalCapabilityOverrides());
58119
58374
  return new Promise((resolve23) => {
58120
58375
  const ui = new TuiMainScreen2(new ProcessTerminal2, undefined, getAgentDir());
58121
58376
  const keybindings = KeybindingsManager.create();
@@ -58153,7 +58408,7 @@ var init_session_picker = __esm(() => {
58153
58408
 
58154
58409
  // src/main-session.ts
58155
58410
  import { createInterface as createInterface3 } from "node:readline";
58156
- import { ProcessTerminal as ProcessTerminal3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
58411
+ import { ProcessTerminal as ProcessTerminal3, setCapabilityOverrides as setCapabilityOverrides3, setKeybindings as setKeybindings3, TuiMainScreen as TuiMainScreen3 } from "@earendil-works/pi-tui";
58157
58412
  import chalk10 from "chalk";
58158
58413
  async function findLocalSessionByExactId(sessionId, cwd, sessionDir) {
58159
58414
  const localSessions = await SessionManager.list(cwd, sessionDir);
@@ -58292,7 +58547,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
58292
58547
  if (parsed.resume) {
58293
58548
  initTheme(settingsManager.getTheme(), true);
58294
58549
  try {
58295
- const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress));
58550
+ const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), (onProgress) => SessionManager.listAll(sessionDir, onProgress), settingsManager);
58296
58551
  if (!selectedPath) {
58297
58552
  console.log(chalk10.dim("No session selected"));
58298
58553
  process.exit(0);
@@ -58315,6 +58570,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
58315
58570
  return SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });
58316
58571
  }
58317
58572
  async function promptForMissingSessionCwd(issue, settingsManager) {
58573
+ setCapabilityOverrides3(settingsManager.getTerminalCapabilityOverrides());
58318
58574
  initTheme(settingsManager.getTheme());
58319
58575
  setKeybindings3(KeybindingsManager.create());
58320
58576
  return new Promise((resolve23) => {
@@ -61900,7 +62156,7 @@ var init_slash_commands = __esm(() => {
61900
62156
  { name: "tree", description: "Navigate session tree (switch branches)" },
61901
62157
  { name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
61902
62158
  { name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
61903
- { name: "fast", description: "Configure OpenAI fast mode for chat and workflows in supported models" },
62159
+ { name: "fast", description: "Configure fast mode for chat and workflows on supported models" },
61904
62160
  { name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
61905
62161
  { name: "import", description: "Import and resume a session from a JSONL file" },
61906
62162
  { name: "share", description: "Share session as a secret GitHub gist" },
@@ -62536,6 +62792,7 @@ function createFullscreenTui(options) {
62536
62792
  openUrl: openBrowser
62537
62793
  }),
62538
62794
  onRightClickPaste: options.onRightClickPaste,
62795
+ copyOnSelect: options.copyOnSelect,
62539
62796
  copySelection: options.copySelection ?? copySelectionToHostClipboard
62540
62797
  }, options.shouldHandleViewportInput, options.onOverlayUnhandledInput);
62541
62798
  }
@@ -62577,7 +62834,7 @@ function createInteractiveTuiReference(getTui) {
62577
62834
  getPrototypeOf: () => Reflect.getPrototypeOf(getTui())
62578
62835
  });
62579
62836
  }
62580
- var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
62837
+ var viewportInputListeners, viewportInputGates, overlayUnhandledInputHandlers, viewportInputReplays, overlayOwnedSelections, viewportInputSubscriptions, SGR_MOUSE_SEQUENCE, LEFT_MOUSE_MODIFIER_MASK, AtomicTuiAltScreen, AtomicTuiMainScreen;
62581
62838
  var init_interactive_tui = __esm(() => {
62582
62839
  init_clipboard();
62583
62840
  init_open_browser();
@@ -62586,6 +62843,7 @@ var init_interactive_tui = __esm(() => {
62586
62843
  viewportInputGates = new WeakMap;
62587
62844
  overlayUnhandledInputHandlers = new WeakMap;
62588
62845
  viewportInputReplays = new WeakSet;
62846
+ overlayOwnedSelections = new WeakSet;
62589
62847
  viewportInputSubscriptions = new WeakMap;
62590
62848
  SGR_MOUSE_SEQUENCE = /^\x1b\[<(\d+);\d+;\d+([Mm])/;
62591
62849
  LEFT_MOUSE_MODIFIER_MASK = 4 | 8 | 16;
@@ -62601,8 +62859,20 @@ var init_interactive_tui = __esm(() => {
62601
62859
  deferral.shouldDeferViewportInputToOverlay = () => !viewportInputReplays.has(this) && deferToOverlay?.() === true;
62602
62860
  }
62603
62861
  applyLineResets(lines) {
62862
+ if (overlayOwnedSelections.has(this) && !this.isFocusedOverlay())
62863
+ this.clearOverlayOwnedSelection();
62604
62864
  return stripOverlayActiveRowMarker(super.applyLineResets(lines));
62605
62865
  }
62866
+ clearOverlayOwnedSelection() {
62867
+ const selection = this;
62868
+ selection.selectionAnchor = undefined;
62869
+ selection.selectionFocus = undefined;
62870
+ selection.selectionInitialRange = undefined;
62871
+ selection.selectionPressActive = false;
62872
+ selection.selectionDragged = false;
62873
+ selection.lastClick = undefined;
62874
+ overlayOwnedSelections.delete(this);
62875
+ }
62606
62876
  isPiTuiMouseSequence(data) {
62607
62877
  if (parseMouseSequences(data))
62608
62878
  return true;
@@ -62679,6 +62949,7 @@ var init_interactive_tui = __esm(() => {
62679
62949
  if (isLeftMouseButton(sequence))
62680
62950
  viewportListener(sequence.data);
62681
62951
  }
62952
+ overlayOwnedSelections.add(this);
62682
62953
  }
62683
62954
  replayViewportInput(viewportListener, data) {
62684
62955
  viewportInputReplays.add(this);
@@ -62746,7 +63017,11 @@ var init_interactive_tui = __esm(() => {
62746
63017
  });
62747
63018
 
62748
63019
  // src/modes/interactive/interactive-mode-base.ts
62749
- import { isKeyRelease as isKeyRelease3, isViewportTUI } from "@earendil-works/pi-tui";
63020
+ import {
63021
+ isKeyRelease as isKeyRelease3,
63022
+ isViewportTUI,
63023
+ setCapabilityOverrides as setCapabilityOverrides4
63024
+ } from "@earendil-works/pi-tui";
62750
63025
  function isFullscreenViewportAction(data, keybindings) {
62751
63026
  return FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
62752
63027
  }
@@ -62807,6 +63082,18 @@ class InteractiveModeBase {
62807
63082
  return false;
62808
63083
  return this.defaultEditor.handleInput(data);
62809
63084
  }
63085
+ setFullscreenCopyOnSelect(enabled) {
63086
+ if (this.renderer.mode === "fullscreen")
63087
+ this.renderer.setCopyOnSelect(enabled);
63088
+ }
63089
+ getFullscreenCopyOnSelect() {
63090
+ return this.renderer.mode === "fullscreen" ? this.renderer.getCopyOnSelect() : undefined;
63091
+ }
63092
+ async copyActiveFullscreenSelection() {
63093
+ if (this.renderer.mode !== "fullscreen" || !this.renderer.hasActiveSelection())
63094
+ return;
63095
+ return this.renderer.copyActiveSelectionToClipboard();
63096
+ }
62810
63097
  onRightClickPaste = () => {
62811
63098
  this.handleRightClickPaste();
62812
63099
  };
@@ -63006,11 +63293,13 @@ class InteractiveModeBase {
63006
63293
  await this.rebindCurrentSession();
63007
63294
  await this.themeController.applyFromSettings();
63008
63295
  });
63296
+ setCapabilityOverrides4(this.settingsManager.getTerminalCapabilityOverrides());
63009
63297
  this.version = VERSION;
63010
63298
  this.renderer = createInteractiveTui({
63011
63299
  showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
63012
63300
  logDirectory: runtimeHost.services.agentDir,
63013
63301
  terminal: options.terminal,
63302
+ copyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
63014
63303
  onRightClickPaste: this.onRightClickPaste,
63015
63304
  shouldHandleViewportInput: this.shouldHandleViewportInput,
63016
63305
  onOverlayUnhandledInput: this.onOverlayUnhandledInput,
@@ -64133,6 +64422,7 @@ var init_interactive_deferred_startup = __esm(() => {
64133
64422
  try {
64134
64423
  await this.bindCurrentSessionExtensions();
64135
64424
  await this.session.reload({ reason: "startup" });
64425
+ this.applyRuntimeSettings();
64136
64426
  this.rebuildChatFromMessages();
64137
64427
  if (!this.promptTurnWorkingLoaderActive) {
64138
64428
  this.stopWorkingLoader();
@@ -64821,6 +65111,7 @@ ${warningLines}`, 0, 0));
64821
65111
  });
64822
65112
 
64823
65113
  // src/modes/interactive/interactive-session-runtime.ts
65114
+ import { setCapabilityOverrides as setCapabilityOverrides5 } from "@earendil-works/pi-tui";
64824
65115
  var init_interactive_session_runtime = __esm(() => {
64825
65116
  init_interactive_mode_base();
64826
65117
  init_interactive_mode_deps();
@@ -64907,6 +65198,8 @@ var init_interactive_session_runtime = __esm(() => {
64907
65198
  }
64908
65199
  };
64909
65200
  InteractiveModeBase.prototype.applyRuntimeSettings = function() {
65201
+ setCapabilityOverrides5(this.settingsManager.getTerminalCapabilityOverrides());
65202
+ this.setFullscreenCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect());
64910
65203
  this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar());
64911
65204
  this.footer.setSession(this.session);
64912
65205
  this.usageMeter.setSession(this.session);
@@ -66423,6 +66716,9 @@ var init_interactive_input_handling = __esm(() => {
66423
66716
  });
66424
66717
  this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
66425
66718
  this.defaultEditor.onAction("app.message.dequeue", () => this.handleDequeue());
66719
+ this.defaultEditor.onAction("app.message.copy", () => {
66720
+ this.handleCopyCommand({ preferSelection: true });
66721
+ });
66426
66722
  this.defaultEditor.onAction("app.session.new", () => this.handleClearCommand());
66427
66723
  this.defaultEditor.onAction("app.session.tree", () => this.showTreeSelector());
66428
66724
  this.defaultEditor.onAction("app.session.fork", () => this.showUserMessageSelector());
@@ -67330,7 +67626,8 @@ var init_interactive_agent_events = __esm(() => {
67330
67626
  } else if (event.reason === "manual") {
67331
67627
  this.manualCompactionTakeoverPending = false;
67332
67628
  }
67333
- if (!manualTakeoverPending && this.settingsManager.getShowTerminalProgress()) {
67629
+ const resumesActiveRun = event.midTurn && !event.aborted && !event.errorMessage && !manualTakeoverPending;
67630
+ if (!manualTakeoverPending && !resumesActiveRun && this.settingsManager.getShowTerminalProgress()) {
67334
67631
  this.ui.terminal.setProgress(false);
67335
67632
  }
67336
67633
  if (!manualTakeoverPending && this.autoCompactionEscapeHandlerSaved) {
@@ -68346,7 +68643,7 @@ var init_interactive_selectors = __esm(() => {
68346
68643
  };
68347
68644
  InteractiveModeBase.prototype.showFastModeSelector = function() {
68348
68645
  if (!this.hasCodexFastModeSupportedModels()) {
68349
- this.showWarning("Codex fast mode requires a supported OpenAI or shared ChatGPT Codex transport model.");
68646
+ this.showWarning("Fast mode isn't available for any configured model.");
68350
68647
  return;
68351
68648
  }
68352
68649
  this.showSelector((done) => {
@@ -68405,6 +68702,7 @@ var init_interactive_selectors = __esm(() => {
68405
68702
  showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
68406
68703
  fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
68407
68704
  fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
68705
+ fullscreenCopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
68408
68706
  editorPaddingX: this.settingsManager.getEditorPaddingX(),
68409
68707
  outputPad: this.settingsManager.getOutputPad(),
68410
68708
  showCacheMissNotices: this.settingsManager.getShowCacheMissNotices(),
@@ -68522,6 +68820,10 @@ var init_interactive_selectors = __esm(() => {
68522
68820
  onFullscreenExitOutputChange: (output) => {
68523
68821
  this.settingsManager.setFullscreenExitOutput(output);
68524
68822
  },
68823
+ onFullscreenCopyOnSelectChange: (enabled) => {
68824
+ this.settingsManager.setFullscreenCopyOnSelect(enabled);
68825
+ this.setFullscreenCopyOnSelect(enabled);
68826
+ },
68525
68827
  onEditorPaddingXChange: (padding) => {
68526
68828
  this.settingsManager.setEditorPaddingX(padding);
68527
68829
  this.defaultEditor.setPaddingX(padding);
@@ -69508,18 +69810,8 @@ var init_interactive_slash_commands = __esm(() => {
69508
69810
  activeHeader.setExpanded(this.toolOutputExpanded);
69509
69811
  }
69510
69812
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
69511
- this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
69813
+ this.applyRuntimeSettings();
69512
69814
  await this.themeController.applyFromSettings();
69513
- const editorPaddingX = this.settingsManager.getEditorPaddingX();
69514
- const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
69515
- this.defaultEditor.setPaddingX(editorPaddingX);
69516
- this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible);
69517
- if (this.editor !== this.defaultEditor) {
69518
- this.editor.setPaddingX?.(editorPaddingX);
69519
- this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible);
69520
- }
69521
- this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());
69522
- this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
69523
69815
  this.setupAutocompleteProvider();
69524
69816
  const runner = this.session.extensionRunner;
69525
69817
  this.setupExtensionShortcuts(runner);
@@ -69712,7 +70004,12 @@ Gist: ${hyperlink3(gistUrl, gistUrl)}`);
69712
70004
  }
69713
70005
  }
69714
70006
  };
69715
- InteractiveModeBase.prototype.handleCopyCommand = async function() {
70007
+ InteractiveModeBase.prototype.handleCopyCommand = async function(options = {}) {
70008
+ if (options.preferSelection && this.getFullscreenCopyOnSelect() === false) {
70009
+ const selectionCopied = await this.copyActiveFullscreenSelection();
70010
+ if (selectionCopied !== undefined)
70011
+ return;
70012
+ }
69716
70013
  const text = this.session.getLastAssistantText();
69717
70014
  if (!text) {
69718
70015
  this.showError("No agent messages to copy yet.");
@@ -73766,6 +74063,8 @@ var init_rpc_extension_ui = __esm(() => {
73766
74063
  });
73767
74064
 
73768
74065
  // src/modes/rpc/rpc-session-binding.ts
74066
+ import { setCapabilityOverrides as setCapabilityOverrides6 } from "@earendil-works/pi-tui";
74067
+
73769
74068
  class RpcSessionBinding {
73770
74069
  session;
73771
74070
  unsubscribe;
@@ -73809,6 +74108,7 @@ class RpcSessionBinding {
73809
74108
  this.session = this.runtimeHost.session;
73810
74109
  this.disposeSubscriptions();
73811
74110
  const session = this.session;
74111
+ setCapabilityOverrides6(session.settingsManager.getTerminalCapabilityOverrides());
73812
74112
  this.renderService?.bindSession(session);
73813
74113
  this.footerDataProvider = new FooterDataProvider(session.sessionManager.getCwd());
73814
74114
  const models = session.scopedModels.length > 0 ? session.scopedModels.map((scoped) => scoped.model) : session.modelRuntime.getAvailableSnapshot();
@@ -74704,8 +75004,9 @@ var init_config_selector = __esm(() => {
74704
75004
  });
74705
75005
 
74706
75006
  // src/cli/config-selector.ts
74707
- import { ProcessTerminal as ProcessTerminal6, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
75007
+ import { ProcessTerminal as ProcessTerminal6, setCapabilityOverrides as setCapabilityOverrides7, TuiMainScreen as TuiMainScreen8 } from "@earendil-works/pi-tui";
74708
75008
  async function selectConfig(options) {
75009
+ setCapabilityOverrides7(options.settingsManager.getTerminalCapabilityOverrides());
74709
75010
  initTheme(options.settingsManager.getTheme(), true);
74710
75011
  return new Promise((resolve23) => {
74711
75012
  const ui = new TuiMainScreen8(new ProcessTerminal6, undefined, options.agentDir);
@@ -75558,6 +75859,7 @@ var init_package_manager_cli = __esm(() => {
75558
75859
  });
75559
75860
 
75560
75861
  // src/main.ts
75862
+ import { setCapabilityOverrides as setCapabilityOverrides8 } from "@earendil-works/pi-tui";
75561
75863
  import chalk15 from "chalk";
75562
75864
  function authCheckErrorMessage(error) {
75563
75865
  return error instanceof AuthCommandError ? error.message : "Failed to check provider readiness";
@@ -75792,6 +76094,7 @@ async function main(argv, options) {
75792
76094
  startupEarlyInputCapture = undefined;
75793
76095
  }
75794
76096
  const startupSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: startupProjectTrusted });
76097
+ setCapabilityOverrides8(startupSettingsManager.getTerminalCapabilityOverrides());
75795
76098
  const startupSettingsDiagnostics = collectSettingsDiagnostics(startupSettingsManager, "startup session lookup");
75796
76099
  if (appMode === "interactive" && parsed.useTheme !== undefined) {
75797
76100
  startupSettingsManager.applyOverrides({ theme: parsed.useTheme });
@@ -75926,6 +76229,8 @@ async function main(argv, options) {
75926
76229
  extensionFactories: isolateInteractiveHost ? undefined : extensionFactories
75927
76230
  }
75928
76231
  });
76232
+ if (isolateInteractiveHost)
76233
+ limitMandatoryIntercomToTool(services2.resourceLoader);
75929
76234
  const { settingsManager: settingsManager2, modelRuntime: modelRuntime2, resourceLoader: resourceLoader2 } = services2;
75930
76235
  const diagnostics = [
75931
76236
  ...services2.diagnostics,
@@ -75988,6 +76293,7 @@ async function main(argv, options) {
75988
76293
  endTimingSpan(runtimeCreationSpan);
75989
76294
  const { services, session, modelFallbackMessage } = runtime;
75990
76295
  const { settingsManager, modelRuntime, resourceLoader } = services;
76296
+ setCapabilityOverrides8(settingsManager.getTerminalCapabilityOverrides());
75991
76297
  applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);
75992
76298
  configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
75993
76299
  if (parsed.help) {
@@ -76119,6 +76425,7 @@ var init_main = __esm(() => {
76119
76425
  init_auth_storage();
76120
76426
  init_builtin_packages();
76121
76427
  init_http_dispatcher();
76428
+ init_mandatory_resource_loader();
76122
76429
  init_model_resolver();
76123
76430
  init_model_runtime();
76124
76431
  init_output_guard();
@@ -77969,9 +78276,6 @@ function defaultIntercomExtensionDir(agentDir = defaultAgentDir()) {
77969
78276
  function bundledIntercomExtensionDir() {
77970
78277
  return path21.resolve(path21.dirname(fileURLToPath5(import.meta.url)), "..", "..", "..", "intercom");
77971
78278
  }
77972
- function defaultIntercomConfigPath(agentDir = defaultAgentDir()) {
77973
- return path21.join(agentDir, "intercom", "config.json");
77974
- }
77975
78279
  function defaultSubagentConfigDir(agentDir = defaultAgentDir()) {
77976
78280
  return path21.join(agentDir, "extensions", "subagent");
77977
78281
  }
@@ -78021,16 +78325,6 @@ function resolveIntercomBridgeConfig(value) {
78021
78325
  instructionFile: typeof value.instructionFile === "string" ? value.instructionFile : ""
78022
78326
  };
78023
78327
  }
78024
- function intercomConfigStatus(configPath) {
78025
- if (!fs18.existsSync(configPath))
78026
- return { enabled: true };
78027
- try {
78028
- const parsed = JSON.parse(fs18.readFileSync(configPath, "utf-8"));
78029
- return { enabled: parsed.enabled !== false };
78030
- } catch (error) {
78031
- return { enabled: true, error };
78032
- }
78033
- }
78034
78328
  function readJsonBestEffort(filePath) {
78035
78329
  try {
78036
78330
  return JSON.parse(fs18.readFileSync(filePath, "utf-8"));
@@ -78166,25 +78460,6 @@ function resolveIntercomExtensionDir(input2, agentDir) {
78166
78460
  return legacyDir;
78167
78461
  return configuredPiIntercomPackageDir(input2, agentDir) ?? legacyDir;
78168
78462
  }
78169
- function extensionSandboxAllowsIntercom(extensions, extensionDir) {
78170
- if (extensions === undefined)
78171
- return true;
78172
- const intercomDir = path21.resolve(extensionDir).replaceAll("\\", "/").toLowerCase();
78173
- for (const entry of extensions) {
78174
- const normalized = entry.trim().replaceAll("\\", "/").toLowerCase();
78175
- if (normalized === "pi-intercom")
78176
- return true;
78177
- if (normalized === intercomDir)
78178
- return true;
78179
- if (normalized.startsWith(`${intercomDir}/`))
78180
- return true;
78181
- if (normalized.endsWith("/pi-intercom"))
78182
- return true;
78183
- if (normalized.includes("/pi-intercom/"))
78184
- return true;
78185
- }
78186
- return false;
78187
- }
78188
78463
  function expandTilde(filePath) {
78189
78464
  return filePath.startsWith("~/") ? path21.join(os7.homedir(), filePath.slice(2)) : filePath;
78190
78465
  }
@@ -78227,13 +78502,6 @@ function resolveIntercomBridge(input2) {
78227
78502
  if (!fs18.existsSync(extensionDir)) {
78228
78503
  return { active: false, mode, extensionDir, instruction: defaultInstruction };
78229
78504
  }
78230
- const configPath = path21.resolve(input2.configPath ?? defaultIntercomConfigPath(agentDir));
78231
- const intercomStatus = intercomConfigStatus(configPath);
78232
- if (intercomStatus.error)
78233
- console.warn(`Failed to parse intercom config at '${configPath}'. Assuming enabled.`, intercomStatus.error);
78234
- if (!intercomStatus.enabled) {
78235
- return { active: false, mode, extensionDir, instruction: defaultInstruction };
78236
- }
78237
78505
  const instruction = buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir));
78238
78506
  return {
78239
78507
  active: true,
@@ -78246,8 +78514,6 @@ function resolveIntercomBridge(input2) {
78246
78514
  function applyIntercomBridgeToAgent(agent, bridge) {
78247
78515
  if (!bridge.active || !bridge.orchestratorTarget)
78248
78516
  return agent;
78249
- if (!extensionSandboxAllowsIntercom(agent.extensions, bridge.extensionDir))
78250
- return agent;
78251
78517
  const bridgeTools = ["intercom", "contact_supervisor"];
78252
78518
  const tools = agent.tools ? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))] : agent.tools;
78253
78519
  const instruction = bridge.instruction;
@@ -80096,23 +80362,45 @@ function getSubagentCodexFastModeSettings(cwd) {
80096
80362
  return { chat: false, workflow: false };
80097
80363
  }
80098
80364
  }
80099
- function providerFromModelId(model) {
80365
+ function modelIdentityFromModelId(model) {
80100
80366
  if (!model)
80101
80367
  return;
80102
80368
  const { baseModel } = splitKnownThinkingSuffix(model);
80103
- if (!isCodexFastModeCandidateModelId(baseModel))
80369
+ const slash = baseModel.indexOf("/");
80370
+ if (slash <= 0 || slash === baseModel.length - 1)
80104
80371
  return;
80105
- return baseModel.split("/", 1)[0];
80372
+ return { provider: baseModel.slice(0, slash), id: baseModel.slice(slash + 1) };
80373
+ }
80374
+ function resolvedIdentityMatches(resolved, model) {
80375
+ if (!model)
80376
+ return true;
80377
+ const parsed = modelIdentityFromModelId(model);
80378
+ if (!parsed)
80379
+ return false;
80380
+ if (parsed.provider !== resolved.provider)
80381
+ return false;
80382
+ return resolved.id === undefined || parsed.id === resolved.id;
80383
+ }
80384
+ function identityForFastMode(input2) {
80385
+ if (input2.resolvedModel && resolvedIdentityMatches(input2.resolvedModel, input2.model)) {
80386
+ return input2.resolvedModel;
80387
+ }
80388
+ if (input2.model) {
80389
+ const resolved = input2.resolveModel?.(input2.model);
80390
+ if (resolved)
80391
+ return resolved;
80392
+ }
80393
+ return modelIdentityFromModelId(input2.model);
80106
80394
  }
80107
- function resolveSubagentCodexFastModeScope(workflowStageSubagentGuard) {
80108
- return workflowStageSubagentGuard ? "workflow" : "chat";
80395
+ function resolveSubagentCodexFastModeScope(orchestrationContext) {
80396
+ return orchestrationContext?.kind === "workflow-stage" ? "workflow" : "chat";
80109
80397
  }
80110
80398
  function resolveSubagentModelFastMode(input2) {
80111
- const provider = providerFromModelId(input2.model);
80112
- if (!provider)
80399
+ const model = identityForFastMode(input2);
80400
+ if (!model)
80113
80401
  return false;
80114
80402
  const settings = input2.settings ?? getSubagentCodexFastModeSettings(input2.cwd);
80115
- return shouldApplyCodexFastModeForScope({ provider }, settings, input2.scope ?? "chat");
80403
+ return shouldApplyCodexFastModeForScope(model, settings, input2.scope ?? "chat", input2.copilotCredential);
80116
80404
  }
80117
80405
 
80118
80406
  // dist/builtin/subagents/src/shared/jsonl-writer.ts
@@ -80292,10 +80580,11 @@ function thinkingLevelForSession(session) {
80292
80580
  function initialThinkingForAttempt(model, configuredThinking) {
80293
80581
  return resolveEffectiveThinking(model, configuredThinking) ?? configuredThinking;
80294
80582
  }
80295
- function defaultFastModeForChild(cwd, context, workflowStageSubagentGuard) {
80583
+ function defaultFastModeForChild(cwd, context, resolvedModel) {
80296
80584
  const settings = getSubagentCodexFastModeSettings(cwd);
80297
- const scope = resolveSubagentCodexFastModeScope(workflowStageSubagentGuard ?? context?.kind === "workflow-stage");
80298
- return (model) => resolveSubagentModelFastMode({ model, cwd, settings, scope });
80585
+ const scope = resolveSubagentCodexFastModeScope(context);
80586
+ const copilotCredential = readStoredCredential("github-copilot");
80587
+ return (model) => resolveSubagentModelFastMode({ model, resolvedModel, cwd, settings, scope, copilotCredential });
80299
80588
  }
80300
80589
  var EMPTY_STATS = {
80301
80590
  sessionFile: undefined,
@@ -81053,7 +81342,7 @@ class SubagentControlRuntime {
81053
81342
  startAttempt(admitted, candidate, signals, options = {}) {
81054
81343
  const initialModel = modelIdForCandidate(candidate, admitted.policy.model);
81055
81344
  const initialThinking = initialThinkingForAttempt(initialModel, candidate.thinkingLevel ?? admitted.policy.thinkingLevel);
81056
- const fastModeForModel = options.fastModeForModel ?? defaultFastModeForChild(admitted.policy.cwd, admitted.spec.parent?.orchestrationContext, admitted.spec.parent?.workflowStageSubagentGuard);
81345
+ const fastModeForModel = options.fastModeForModel ?? defaultFastModeForChild(admitted.policy.cwd, admitted.spec.parent?.orchestrationContext, candidate.model);
81057
81346
  const running = {
81058
81347
  id: this.nextAttemptId++,
81059
81348
  child: admitted,
@@ -83909,6 +84198,7 @@ ${worktreeSuffix}` : childContent;
83909
84198
  }
83910
84199
 
83911
84200
  // dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts
84201
+ init_src();
83912
84202
  import { existsSync as existsSync63, statSync as statSync21 } from "node:fs";
83913
84203
  import { join as join92 } from "node:path";
83914
84204
 
@@ -84133,17 +84423,12 @@ function progressFor(agent, task, outcome, startedAt, fastMode) {
84133
84423
  ...outcome.status === "interrupted" && isParentCancellation(outcome.cause) ? { cause: outcome.cause } : {}
84134
84424
  };
84135
84425
  }
84136
- function resultFromOutcome(agent, task, outcome, startedAt, artifactPaths, fastMode) {
84426
+ function resultFromOutcome(agent, task, outcome, startedAt, artifactPaths, fastModeForModel) {
84137
84427
  const status = outcome.status;
84138
84428
  const output = outcome.status === "ok" ? outcome.output : outcome.envelope;
84139
84429
  const model = outcome.model;
84140
84430
  const thinking = outcome.thinking;
84141
- const fastModeEnabled = resolveSubagentModelFastMode({
84142
- model,
84143
- cwd: fastMode.cwd,
84144
- settings: fastMode.settings,
84145
- scope: fastMode.scope
84146
- });
84431
+ const fastModeEnabled = fastModeForModel(model);
84147
84432
  const result2 = {
84148
84433
  agent: agent.name,
84149
84434
  task,
@@ -84221,13 +84506,18 @@ async function runSingleInProcess(runtimeCwd, agent, task, options) {
84221
84506
  const inheritsDispatchConfig = agent.model === undefined && (agent.fallbackModels === undefined || agent.fallbackModels.length === 0) && options.modelOverride === undefined;
84222
84507
  const resolvedCandidate = candidate ? options.resolveCandidateModel?.(candidate) : undefined;
84223
84508
  const fastModeSettings = getSubagentCodexFastModeSettings(cwd);
84509
+ const copilotCredential = readStoredCredential("github-copilot");
84224
84510
  const orchestrationContext = workflowOrchestrationContext(options);
84225
- const fastModeScope = resolveSubagentCodexFastModeScope(options.workflowStageSubagentGuard ?? orchestrationContext?.kind === "workflow-stage");
84511
+ const fastModeScope = resolveSubagentCodexFastModeScope(orchestrationContext);
84512
+ const resolveModel = (modelId) => options.resolveCandidateModel?.(modelId)?.model;
84226
84513
  const fastModeForModel = (model) => resolveSubagentModelFastMode({
84227
84514
  model,
84515
+ resolvedModel: resolvedCandidate?.model,
84516
+ resolveModel,
84228
84517
  cwd,
84229
84518
  settings: fastModeSettings,
84230
- scope: fastModeScope
84519
+ scope: fastModeScope,
84520
+ copilotCredential
84231
84521
  });
84232
84522
  const parent = {
84233
84523
  path: options.runId,
@@ -84360,11 +84650,7 @@ ${task}`);
84360
84650
  detachCleanup();
84361
84651
  parentAskCleanup();
84362
84652
  running.promise.then(async (continuedOutcome) => {
84363
- const recovered = resultFromOutcome(agent, task, continuedOutcome, startedAt, artifactPaths, {
84364
- cwd,
84365
- settings: fastModeSettings,
84366
- scope: fastModeScope
84367
- });
84653
+ const recovered = resultFromOutcome(agent, task, continuedOutcome, startedAt, artifactPaths, fastModeForModel);
84368
84654
  await control.deliverChildResult({
84369
84655
  path: continuedOutcome.path,
84370
84656
  status: continuedOutcome.status,
@@ -84426,11 +84712,7 @@ ${task}`);
84426
84712
  detachCleanup();
84427
84713
  parentAskCleanup();
84428
84714
  const outcome = winner.value;
84429
- const result2 = resultFromOutcome(agent, task, outcome, startedAt, artifactPaths, {
84430
- cwd,
84431
- settings: fastModeSettings,
84432
- scope: fastModeScope
84433
- });
84715
+ const result2 = resultFromOutcome(agent, task, outcome, startedAt, artifactPaths, fastModeForModel);
84434
84716
  if (filteredCandidates.skippedAttempts.length)
84435
84717
  result2.modelAttempts = [...filteredCandidates.skippedAttempts, ...result2.modelAttempts ?? []];
84436
84718
  await control.deliverChildResult({