@bastani/atomic 0.9.16-alpha.8 → 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 (212) hide show
  1. package/CHANGELOG.md +126 -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 +556 -185
  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 +268 -54
  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 +488 -142
  31. package/dist/builtin/web-access/index.bundle.mjs +268 -54
  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-zf28603f.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-v04c5qmd.js → chunk-bz1c9732.js} +15 -3
  38. package/dist/builtin/workflows/builtin/{chunk-cdtd3m3w.js → chunk-dattsgxg.js} +1 -1
  39. package/dist/builtin/workflows/builtin/{chunk-5n10x7j2.js → chunk-gdx0avpx.js} +421 -69
  40. package/dist/builtin/workflows/builtin/{chunk-hdpj1dkw.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 +597 -145
  47. package/dist/builtin/workflows/src/index.js +278 -74
  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/agent-events.d.ts +15 -0
  93. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  94. package/dist/core/extensions/agent-events.js.map +1 -1
  95. package/dist/core/extensions/api-types.d.ts +3 -1
  96. package/dist/core/extensions/api-types.d.ts.map +1 -1
  97. package/dist/core/extensions/api-types.js.map +1 -1
  98. package/dist/core/extensions/event-types.d.ts +2 -2
  99. package/dist/core/extensions/event-types.d.ts.map +1 -1
  100. package/dist/core/extensions/event-types.js.map +1 -1
  101. package/dist/core/extensions/index.d.ts +1 -1
  102. package/dist/core/extensions/index.d.ts.map +1 -1
  103. package/dist/core/extensions/index.js.map +1 -1
  104. package/dist/core/extensions/loader-core.d.ts +1 -0
  105. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  106. package/dist/core/extensions/loader-core.js +11 -1
  107. package/dist/core/extensions/loader-core.js.map +1 -1
  108. package/dist/core/extensions/loader.d.ts +1 -1
  109. package/dist/core/extensions/loader.d.ts.map +1 -1
  110. package/dist/core/extensions/loader.js +1 -1
  111. package/dist/core/extensions/loader.js.map +1 -1
  112. package/dist/core/extensions/runner-registries.d.ts.map +1 -1
  113. package/dist/core/extensions/runner-registries.js +9 -4
  114. package/dist/core/extensions/runner-registries.js.map +1 -1
  115. package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
  116. package/dist/core/extensions/runner-shortcuts.js +1 -0
  117. package/dist/core/extensions/runner-shortcuts.js.map +1 -1
  118. package/dist/core/extensions/runner.d.ts +6 -0
  119. package/dist/core/extensions/runner.d.ts.map +1 -1
  120. package/dist/core/extensions/runner.js +65 -1
  121. package/dist/core/extensions/runner.js.map +1 -1
  122. package/dist/core/keybindings.d.ts +5 -0
  123. package/dist/core/keybindings.d.ts.map +1 -1
  124. package/dist/core/keybindings.js +4 -0
  125. package/dist/core/keybindings.js.map +1 -1
  126. package/dist/core/mandatory-resource-loader.d.ts +6 -0
  127. package/dist/core/mandatory-resource-loader.d.ts.map +1 -0
  128. package/dist/core/mandatory-resource-loader.js +94 -0
  129. package/dist/core/mandatory-resource-loader.js.map +1 -0
  130. package/dist/core/mandatory-runtime-tools.d.ts +10 -0
  131. package/dist/core/mandatory-runtime-tools.d.ts.map +1 -0
  132. package/dist/core/mandatory-runtime-tools.js +31 -0
  133. package/dist/core/mandatory-runtime-tools.js.map +1 -0
  134. package/dist/core/model-resolver-defaults.js +1 -1
  135. package/dist/core/model-resolver-defaults.js.map +1 -1
  136. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  137. package/dist/core/resource-loader-reload.js +24 -13
  138. package/dist/core/resource-loader-reload.js.map +1 -1
  139. package/dist/core/sdk.d.ts.map +1 -1
  140. package/dist/core/sdk.js +2 -0
  141. package/dist/core/sdk.js.map +1 -1
  142. package/dist/core/settings-manager-ui-accessors.d.ts +4 -1
  143. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  144. package/dist/core/settings-manager-ui-accessors.js +22 -0
  145. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  146. package/dist/core/settings-types.d.ts +4 -0
  147. package/dist/core/settings-types.d.ts.map +1 -1
  148. package/dist/core/settings-types.js.map +1 -1
  149. package/dist/core/slash-commands.js +1 -1
  150. package/dist/core/slash-commands.js.map +1 -1
  151. package/dist/index-extensions.d.ts +1 -1
  152. package/dist/index-extensions.d.ts.map +1 -1
  153. package/dist/index-extensions.js.map +1 -1
  154. package/dist/main-session.d.ts.map +1 -1
  155. package/dist/main-session.js +3 -2
  156. package/dist/main-session.js.map +1 -1
  157. package/dist/main.d.ts.map +1 -1
  158. package/dist/main.js +6 -0
  159. package/dist/main.js.map +1 -1
  160. package/dist/modes/interactive/components/fast-mode-selector.js +2 -2
  161. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  162. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  164. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  165. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  167. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  168. package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
  169. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  170. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  171. package/dist/modes/interactive/interactive-agent-events.js +2 -1
  172. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  173. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  174. package/dist/modes/interactive/interactive-deferred-startup.js +1 -0
  175. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  176. package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
  177. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  178. package/dist/modes/interactive/interactive-input-handling.js +3 -0
  179. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  180. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  181. package/dist/modes/interactive/interactive-mode-base.js +15 -1
  182. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  183. package/dist/modes/interactive/interactive-mode-surface.d.ts +6 -1
  184. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  185. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  186. package/dist/modes/interactive/interactive-selectors.js +6 -1
  187. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  188. package/dist/modes/interactive/interactive-session-runtime.js +3 -0
  189. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  190. package/dist/modes/interactive/interactive-slash-commands.js +7 -12
  191. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  192. package/dist/modes/interactive/interactive-tui.d.ts +1 -0
  193. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  194. package/dist/modes/interactive/interactive-tui.js +16 -0
  195. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  196. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  197. package/dist/modes/rpc/rpc-session-binding.js +2 -0
  198. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  199. package/docs/compaction.md +1 -1
  200. package/docs/environment-variables.md +2 -0
  201. package/docs/extensions.md +20 -1
  202. package/docs/intercom.md +29 -24
  203. package/docs/keybindings.md +5 -2
  204. package/docs/packages.md +1 -1
  205. package/docs/providers.md +2 -2
  206. package/docs/sdk.md +9 -7
  207. package/docs/settings.md +9 -3
  208. package/docs/subagents.md +2 -2
  209. package/docs/usage.md +7 -6
  210. package/docs/workflows.md +11 -7
  211. package/npm-shrinkwrap.json +59 -77
  212. 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",
@@ -13317,6 +13359,8 @@ class ExtensionRunner {
13317
13359
  shortcutDiagnostics = [];
13318
13360
  commandDiagnostics = [];
13319
13361
  staleMessage;
13362
+ uiPromptBinding = 0;
13363
+ activeUIPrompt;
13320
13364
  constructor(extensions, runtime, cwd, sessionManager, modelRegistry, orchestrationContext, subagentPolicy) {
13321
13365
  this.extensions = extensions;
13322
13366
  this.runtime = runtime;
@@ -13411,9 +13455,71 @@ class ExtensionRunner {
13411
13455
  this.reloadHandler = async () => {};
13412
13456
  }
13413
13457
  setUIContext(uiContext, mode = "print") {
13414
- this.uiContext = uiContext ?? noOpUIContext;
13458
+ this.endActiveUIPrompt();
13459
+ const binding = ++this.uiPromptBinding;
13460
+ this.uiContext = uiContext ? this.wrapUIPromptContext(uiContext, binding) : noOpUIContext;
13415
13461
  this.mode = mode;
13416
13462
  }
13463
+ wrapUIPromptContext(ui, binding) {
13464
+ return {
13465
+ ...ui,
13466
+ select: (title, options, opts) => this.withUIPrompt(binding, "select", title, () => ui.select(title, options, opts)),
13467
+ confirm: (title, message, opts) => this.withUIPrompt(binding, "confirm", title, () => ui.confirm(title, message, opts)),
13468
+ input: (title, placeholder, opts) => this.withUIPrompt(binding, "input", title, () => ui.input(title, placeholder, opts)),
13469
+ editor: (title, prefill, opts) => this.withUIPrompt(binding, "editor", title, () => ui.editor(title, prefill, opts)),
13470
+ custom: (factory, options) => this.withUIPrompt(binding, "custom", undefined, () => ui.custom(factory, options))
13471
+ };
13472
+ }
13473
+ withUIPrompt(binding, kind, title, run) {
13474
+ if (binding !== this.uiPromptBinding)
13475
+ return run();
13476
+ let prompt = this.activeUIPrompt;
13477
+ if (!prompt) {
13478
+ prompt = { depth: 0, kind, title };
13479
+ this.activeUIPrompt = prompt;
13480
+ this.emitUIPromptEvent({
13481
+ type: "ui_prompt_start",
13482
+ reason: "ui_prompt",
13483
+ kind,
13484
+ ...title === undefined ? {} : { title }
13485
+ });
13486
+ }
13487
+ prompt.depth += 1;
13488
+ let finished = false;
13489
+ const finish = () => {
13490
+ if (finished)
13491
+ return;
13492
+ finished = true;
13493
+ if (this.activeUIPrompt !== prompt)
13494
+ return;
13495
+ prompt.depth -= 1;
13496
+ if (prompt.depth === 0)
13497
+ this.endActiveUIPrompt(prompt);
13498
+ };
13499
+ try {
13500
+ return run().finally(finish);
13501
+ } catch (error) {
13502
+ finish();
13503
+ throw error;
13504
+ }
13505
+ }
13506
+ endActiveUIPrompt(prompt = this.activeUIPrompt) {
13507
+ if (!prompt || this.activeUIPrompt !== prompt)
13508
+ return;
13509
+ this.activeUIPrompt = undefined;
13510
+ prompt.depth = 0;
13511
+ this.emitUIPromptEvent({
13512
+ type: "ui_prompt_end",
13513
+ reason: "ui_prompt",
13514
+ kind: prompt.kind,
13515
+ ...prompt.title === undefined ? {} : { title: prompt.title }
13516
+ });
13517
+ }
13518
+ emitUIPromptEvent(event) {
13519
+ queueMicrotask(() => {
13520
+ this.emit(event);
13521
+ });
13522
+ }
13417
13523
  getUIContext() {
13418
13524
  return this.uiContext;
13419
13525
  }
@@ -13590,6 +13696,7 @@ var init_runner = __esm(() => {
13590
13696
  init_loader_runtime();
13591
13697
  init_runner_context();
13592
13698
  init_runner_events();
13699
+ init_runner_registries();
13593
13700
  init_runner_shortcuts();
13594
13701
  init_runner_ui();
13595
13702
  init_stale_context();
@@ -15822,11 +15929,13 @@ async function _runAgentContinue() {
15822
15929
  }
15823
15930
  async function _continueQueuedAgentMessages() {
15824
15931
  await this._agentEventQueue;
15825
- while (!this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
15932
+ while (!this._stopAfterTurnBlockedContinuation && !this._queuedMessagesPaused && this.agent.hasQueuedMessages()) {
15826
15933
  await this.agent.continue();
15827
15934
  await this.waitForRetry();
15828
15935
  await this._agentEventQueue;
15829
15936
  }
15937
+ if (this._stopAfterTurnBlockedContinuation)
15938
+ return;
15830
15939
  await answerAdmittedQueuedMessage(this);
15831
15940
  }
15832
15941
  async function answerAdmittedQueuedMessage(session) {
@@ -17534,14 +17643,13 @@ function getToolDefinition(name) {
17534
17643
  }
17535
17644
  function setActiveToolsByName(toolNames) {
17536
17645
  const tools = [];
17537
- const validToolNames = [];
17538
17646
  for (const name of toolNames) {
17539
17647
  const tool = this._toolRegistry.get(name);
17540
- if (tool) {
17648
+ if (tool)
17541
17649
  tools.push(tool);
17542
- validToolNames.push(name);
17543
- }
17544
17650
  }
17651
+ appendRegisteredMandatoryTools(tools, this._toolRegistry);
17652
+ const validToolNames = tools.map((tool) => tool.name);
17545
17653
  this.agent.state.tools = tools;
17546
17654
  this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
17547
17655
  this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
@@ -17598,7 +17706,7 @@ function _rebuildSystemPrompt(toolNames) {
17598
17706
  customPrompt: loaderSystemPrompt,
17599
17707
  appendSystemPrompt,
17600
17708
  selectedTools: validToolNames,
17601
- excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames) : undefined,
17709
+ excludedTools: this._excludedToolNames ? Array.from(this._excludedToolNames).filter((name) => !isMandatoryRuntimeTool(name)) : undefined,
17602
17710
  toolSnippets,
17603
17711
  promptGuidelines
17604
17712
  };
@@ -17611,6 +17719,7 @@ function _refreshBaseSystemPromptFromActiveTools() {
17611
17719
  }
17612
17720
  var agentSessionStateMethods;
17613
17721
  var init_agent_session_state = __esm(() => {
17722
+ init_mandatory_runtime_tools();
17614
17723
  init_skill_catalog();
17615
17724
  init_system_prompt();
17616
17725
  agentSessionStateMethods = {
@@ -18638,6 +18747,17 @@ function _installAgentToolHooks() {
18638
18747
  }
18639
18748
  function _installAgentNextTurnRefresh() {
18640
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
+ };
18641
18761
  const previousTransformContext = this.agent.transformContext;
18642
18762
  this.agent.transformContext = async (messages, signal) => {
18643
18763
  const transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;
@@ -18645,24 +18765,17 @@ function _installAgentNextTurnRefresh() {
18645
18765
  assertToolPairingInvariant(guarded);
18646
18766
  return guarded;
18647
18767
  };
18648
- this.agent.prepareNextTurnWithContext = async (turn, signal) => {
18649
- const previousSnapshot = await previousPrepareNextTurnWithContext?.(turn, signal);
18650
- const previousContext = previousSnapshot?.context ?? turn.context;
18651
- const toolCallIds = turn.message.content.filter((part) => part.type === "toolCall").map((part) => part.id);
18652
- const terminatingBatch = toolCallIds.length > 0 && toolCallIds.every((id) => this._terminatingToolCallIds.has(id));
18653
- for (const id of toolCallIds)
18654
- this._terminatingToolCallIds.delete(id);
18655
- const messages = turn.toolResults.length > 0 && !terminatingBatch ? await this._preflightPostToolContext(previousContext.messages, signal) : previousContext.messages;
18656
- const preserveFallbackForFailure = turn.message.role === "assistant" && !this.agent.hasQueuedMessages() && (turn.message.stopReason === "length" || this._isEmptyCompletion?.(turn.message) === true || this._isSafetyRefusal?.(turn.message) === true);
18657
- if (!preserveFallbackForFailure && (turn.toolResults.length === 0 || terminatingBatch)) {
18658
- await this._agentEventQueue;
18659
- await this._settleFallbackModelScope();
18660
- }
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;
18661
18774
  return {
18662
18775
  ...previousSnapshot,
18663
18776
  context: {
18664
18777
  ...previousContext,
18665
- messages,
18778
+ messages: previousContext.messages,
18666
18779
  systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
18667
18780
  tools: this.agent.state.tools.slice()
18668
18781
  },
@@ -18670,6 +18783,14 @@ function _installAgentNextTurnRefresh() {
18670
18783
  thinkingLevel: this.agent.state.thinkingLevel
18671
18784
  };
18672
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
+ }
18673
18794
  }
18674
18795
  var agentSessionToolHooksMethods;
18675
18796
  var init_agent_session_tool_hooks = __esm(() => {
@@ -19567,6 +19688,14 @@ var init_loader_virtual_modules = __esm(() => {
19567
19688
 
19568
19689
  // src/core/extensions/loader-core.ts
19569
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
+ }
19570
19699
  function createExtension(extensionPath, resolvedPath) {
19571
19700
  const source = extensionPath.startsWith("<") && extensionPath.endsWith(">") ? extensionPath.slice(1, -1).split(":")[0] || "temporary" : "local";
19572
19701
  const baseDir = extensionPath.startsWith("<") ? undefined : path7.dirname(resolvedPath);
@@ -19632,6 +19761,7 @@ async function loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProv
19632
19761
  const resolvedCwd = cacheToken?.cwd ?? resolvePath(cwd);
19633
19762
  const resolvedEventBus = eventBus ?? createEventBus();
19634
19763
  const resolvedRuntime = runtime ?? createExtensionRuntime();
19764
+ runtimeEventBuses.set(resolvedRuntime, resolvedEventBus);
19635
19765
  let processedExtensionCount = 0;
19636
19766
  let lastYieldAt = Date.now();
19637
19767
  for (const extPath of paths) {
@@ -19663,7 +19793,7 @@ async function loadExtensions(paths, cwd, eventBus, workflowResourceProvider = e
19663
19793
  async function loadExtensionsCached(paths, cwd, eventBus, workflowResourceProvider = emptyWorkflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider) {
19664
19794
  return loadExtensionsInternal(paths, cwd, eventBus, workflowResourceProvider, runtime, resourceLoaderInheritanceSnapshotProvider, true);
19665
19795
  }
19666
- var INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
19796
+ var runtimeEventBuses, INTER_EXTENSION_YIELD_THRESHOLD_MS = 16;
19667
19797
  var init_loader_core = __esm(() => {
19668
19798
  init_event_loop();
19669
19799
  init_paths();
@@ -19673,6 +19803,7 @@ var init_loader_core = __esm(() => {
19673
19803
  init_loader_resources();
19674
19804
  init_loader_runtime();
19675
19805
  init_loader_virtual_modules();
19806
+ runtimeEventBuses = new WeakMap;
19676
19807
  });
19677
19808
 
19678
19809
  // src/core/package-manager-manifest.ts
@@ -28211,7 +28342,7 @@ class FastModeSelectorComponent {
28211
28342
  }
28212
28343
  invalidate() {}
28213
28344
  render(width) {
28214
- const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Codex fast mode")), width)];
28345
+ const lines = [truncateToWidth10(theme.bold(theme.fg("accent", "Fast mode")), width)];
28215
28346
  for (const line of wrapTextWithAnsi3(DESCRIPTION, Math.max(20, width))) {
28216
28347
  lines.push(theme.fg("muted", line));
28217
28348
  }
@@ -28294,7 +28425,7 @@ class FastModeSelectorComponent {
28294
28425
  return this.getFocusedRow() === row ? theme.fg("muted", text) : theme.fg("dim", text);
28295
28426
  }
28296
28427
  }
28297
- 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;
28298
28429
  var init_fast_mode_selector = __esm(() => {
28299
28430
  init_theme();
28300
28431
  ROWS = ["chat", "workflow"];
@@ -29600,6 +29731,10 @@ var init_keybindings = __esm(() => {
29600
29731
  defaultKeys: windowsKeybindings ? "alt+q" : "alt+up",
29601
29732
  description: "Restore queued messages"
29602
29733
  },
29734
+ "app.message.copy": {
29735
+ defaultKeys: "ctrl+x",
29736
+ description: "Copy fullscreen selection or last agent message"
29737
+ },
29603
29738
  "app.clipboard.pasteImage": {
29604
29739
  defaultKeys: windowsKeybindings ? "alt+v" : "ctrl+v",
29605
29740
  description: "Paste image from clipboard (text fallback)"
@@ -30992,6 +31127,9 @@ function createSettingsChangeHandler(callbacks) {
30992
31127
  case "fullscreen-exit-output":
30993
31128
  callbacks.onFullscreenExitOutputChange(newValue);
30994
31129
  break;
31130
+ case "fullscreen-copy-on-select":
31131
+ callbacks.onFullscreenCopyOnSelectChange(newValue === "true");
31132
+ break;
30995
31133
  case "editor-padding":
30996
31134
  callbacks.onEditorPaddingXChange(parseInt(newValue, 10));
30997
31135
  break;
@@ -31379,6 +31517,13 @@ function insertUiToggles(items, config) {
31379
31517
  values: ["transcript", "resume-hint"]
31380
31518
  });
31381
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", {
31382
31527
  id: "editor-padding",
31383
31528
  label: "Editor padding",
31384
31529
  description: "Horizontal padding for input editor (0-3)",
@@ -44656,6 +44801,8 @@ function _refreshToolRegistry(options) {
44656
44801
  const allowedToolNames = this._allowedToolNames;
44657
44802
  const excludedToolNames = this._excludedToolNames;
44658
44803
  const isExposedTool = (name) => {
44804
+ if (isMandatoryRuntimeTool(name))
44805
+ return true;
44659
44806
  if (allowedToolNames && !allowedToolNames.has(name)) {
44660
44807
  return false;
44661
44808
  }
@@ -44664,10 +44811,10 @@ function _refreshToolRegistry(options) {
44664
44811
  }
44665
44812
  return true;
44666
44813
  };
44667
- const registeredTools = this._extensionRunner.getAllRegisteredTools();
44814
+ const registeredTools = this._extensionRunner.getAllRegisteredTools().filter((tool) => !isMandatoryRuntimeTool(tool.definition.name) || isTrustedMandatoryRuntimeTool(tool));
44668
44815
  const allCustomTools = [
44669
44816
  ...registeredTools,
44670
- ...this._customTools.map((definition) => ({
44817
+ ...this._customTools.filter((definition) => !isMandatoryRuntimeTool(definition.name)).map((definition) => ({
44671
44818
  definition,
44672
44819
  sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" })
44673
44820
  }))
@@ -44788,6 +44935,7 @@ function _buildRuntime(options) {
44788
44935
  var agentSessionToolRegistryMethods;
44789
44936
  var init_agent_session_tool_registry = __esm(() => {
44790
44937
  init_extensions();
44938
+ init_mandatory_runtime_tools();
44791
44939
  init_model_registry();
44792
44940
  init_tools();
44793
44941
  init_session_temp_dir();
@@ -45630,6 +45778,7 @@ class AgentSessionBase {
45630
45778
  _postToolCompactionPreflightError = undefined;
45631
45779
  _pendingPostToolCompactionGuard = undefined;
45632
45780
  _terminatingToolCallIds = new Set;
45781
+ _stopAfterTurnBlockedContinuation = false;
45633
45782
  _disposed = false;
45634
45783
  _branchSummaryAbortController = undefined;
45635
45784
  _sessionSummaryAbortController = undefined;
@@ -46217,6 +46366,23 @@ function getBuiltinPackagePaths() {
46217
46366
  return packageDir ? [packageDir] : [];
46218
46367
  });
46219
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
+ }
46220
46386
  var WORKSPACE_BUILTINS, BUILTIN_PACKAGES;
46221
46387
  var init_builtin_packages = __esm(() => {
46222
46388
  init_config();
@@ -46227,11 +46393,12 @@ var init_builtin_packages = __esm(() => {
46227
46393
  { packageName: "@bastani/subagents", workspaceDirName: "subagents", distDirName: "subagents" },
46228
46394
  { packageName: "@bastani/mcp", workspaceDirName: "mcp", distDirName: "mcp" },
46229
46395
  { packageName: "@bastani/web-access", workspaceDirName: "web-access", distDirName: "web-access" },
46230
- { packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom" }
46396
+ { packageName: "@bastani/intercom", workspaceDirName: "intercom", distDirName: "intercom", mandatory: true }
46231
46397
  ];
46232
46398
  BUILTIN_PACKAGES = WORKSPACE_BUILTINS.map((spec) => ({
46233
46399
  packageName: spec.packageName,
46234
46400
  distDirName: spec.distDirName,
46401
+ mandatory: spec.mandatory === true,
46235
46402
  requiredEntries: requiredEntriesForBuiltin(spec.distDirName),
46236
46403
  sourceCandidates: ({ here, packageDir, isSourceCheckout }) => isSourceCheckout ? [join43(packageDir, "..", spec.workspaceDirName), join43(here, "..", "..", "..", spec.workspaceDirName)] : []
46237
46404
  }));
@@ -52206,6 +52373,13 @@ function getEnabledResources(resources, metadataByPath) {
52206
52373
  function getEnabledPaths(resources, metadataByPath) {
52207
52374
  return getEnabledResources(resources, metadataByPath).map((r) => r.path);
52208
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
+ }
52209
52383
  function mapSkillPath(resource, metadataByPath) {
52210
52384
  if (resource.metadata.source !== "auto" && resource.metadata.origin !== "package") {
52211
52385
  return resource.path;
@@ -52249,12 +52423,12 @@ async function loadProjectTrustExtensions(loader) {
52249
52423
  const metadataByPath = new Map;
52250
52424
  const cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions, metadataByPath);
52251
52425
  const enabledExtensions = getEnabledPaths(resolvedPaths.extensions, metadataByPath);
52252
- const builtinEnabledExtensions = state.noExtensions ? [] : getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);
52426
+ const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
52253
52427
  const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
52254
52428
  state.workflowResources = workflowResources;
52255
52429
  const workflowResourceProvider = createWorkflowResourceProvider(loader);
52256
52430
  const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
52257
- const extensionPaths = state.noExtensions ? cliEnabledExtensions : mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);
52431
+ const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
52258
52432
  const extensionsResult = await loadExtensionsCached(extensionPaths, state.cwd, state.eventBus, workflowResourceProvider, undefined, inheritanceSnapshotProvider);
52259
52433
  const inlineExtensions = await loadExtensionFactories(loader, extensionsResult.runtime, workflowResourceProvider, inheritanceSnapshotProvider);
52260
52434
  extensionsResult.extensions.push(...inlineExtensions.extensions);
@@ -52334,7 +52508,7 @@ async function reloadDefaultResourceLoader(loader, options) {
52334
52508
  const enabledSkillResources = getEnabledResources(resolvedPaths.skills, metadataByPath);
52335
52509
  const enabledPrompts = getEnabledPaths(resolvedPaths.prompts, metadataByPath);
52336
52510
  const enabledThemes = getEnabledPaths(resolvedPaths.themes, metadataByPath);
52337
- const builtinEnabledExtensions = state.noExtensions ? [] : getEnabledPaths(builtinPackagePaths.extensions, metadataByPath);
52511
+ const builtinEnabledExtensions = getBuiltinExtensionPaths(builtinPackagePaths.extensions, metadataByPath, state.noExtensions);
52338
52512
  const builtinEnabledSkillResources = state.noSkills ? [] : getEnabledResources(builtinPackagePaths.skills, metadataByPath);
52339
52513
  const builtinEnabledPrompts = state.noPromptTemplates ? [] : getEnabledPaths(builtinPackagePaths.prompts, metadataByPath);
52340
52514
  const builtinEnabledThemes = state.noThemes ? [] : getEnabledPaths(builtinPackagePaths.themes, metadataByPath);
@@ -52348,9 +52522,13 @@ async function reloadDefaultResourceLoader(loader, options) {
52348
52522
  const workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);
52349
52523
  state.workflowResources = workflowResources;
52350
52524
  const workflowResourceProvider = createWorkflowResourceProvider(loader);
52351
- const extensionPaths = state.noExtensions ? cliEnabledExtensions : mergeResourcePaths(state.cwd, cliEnabledExtensions, [...enabledExtensions, ...builtinEnabledExtensions]);
52525
+ const extensionPaths = mergeResourcePaths(state.cwd, cliEnabledExtensions, state.noExtensions ? builtinEnabledExtensions : [...enabledExtensions, ...builtinEnabledExtensions]);
52352
52526
  const inheritanceSnapshotProvider = createInheritanceSnapshotProvider(loader);
52353
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);
52354
52532
  for (const p of state.additionalExtensionPaths) {
52355
52533
  if (isLocalPath(p)) {
52356
52534
  const resolved = resolveResourcePath(state.cwd, p);
@@ -52361,6 +52539,12 @@ async function reloadDefaultResourceLoader(loader, options) {
52361
52539
  }
52362
52540
  state.extensionsResult = state.extensionsOverride ? state.extensionsOverride(extensionsResult) : extensionsResult;
52363
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
+ }
52364
52548
  resolveInheritedExtensionOverlaps(state.extensionsResult);
52365
52549
  const skillPaths = state.noSkills ? mergeResourcePaths(state.cwd, cliEnabledSkills, state.additionalSkillPaths) : mergeResourcePaths(state.cwd, [...cliEnabledSkills, ...enabledSkills, ...builtinEnabledSkills], state.additionalSkillPaths);
52366
52550
  state.lastSkillPaths = skillPaths;
@@ -52440,7 +52624,9 @@ async function reloadDefaultResourceLoader(loader, options) {
52440
52624
  var init_resource_loader_reload = __esm(() => {
52441
52625
  init_event_loop();
52442
52626
  init_paths();
52627
+ init_builtin_packages();
52443
52628
  init_loader();
52629
+ init_mandatory_runtime_tools();
52444
52630
  init_resource_loader_assets();
52445
52631
  init_resource_loader_context_files();
52446
52632
  init_resource_loader_discovery();
@@ -53597,6 +53783,28 @@ var init_settings_manager_ui_accessors = __esm(() => {
53597
53783
  state.markModified("fullscreenExitOutput");
53598
53784
  state.save();
53599
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
+ },
53600
53808
  getEditorPaddingX() {
53601
53809
  return settingsInternals(this).settings.editorPaddingX ?? 0;
53602
53810
  },
@@ -54147,6 +54355,105 @@ function restoreAnthropicReplayThinkingBlocks(payload, sourceMessages, model) {
54147
54355
  return { ...payload, messages: nextPayloadMessages };
54148
54356
  }
54149
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
+
54150
54457
  // src/core/model-resolver-defaults.ts
54151
54458
  function findPreferredAvailableModel(availableModels) {
54152
54459
  for (const [provider, defaultId] of Object.entries(defaultModelPerProvider)) {
@@ -54187,7 +54494,7 @@ var init_model_resolver_defaults = __esm(() => {
54187
54494
  huggingface: "moonshotai/Kimi-K2.6",
54188
54495
  fireworks: "accounts/fireworks/models/kimi-k2p6",
54189
54496
  together: "moonshotai/Kimi-K2.6",
54190
- baseten: "zai-org/GLM-5.2",
54497
+ baseten: "zai-org/GLM-5.3",
54191
54498
  opencode: "kimi-k2.6",
54192
54499
  "opencode-go": "kimi-k2.6",
54193
54500
  "kimi-coding": "kimi-for-coding",
@@ -54976,14 +55283,16 @@ async function createAgentSessionServices(options) {
54976
55283
  const settingsSpan = startTimingSpan("createAgentSessionServices.settingsManager");
54977
55284
  const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
54978
55285
  endTimingSpan(settingsSpan);
54979
- const resourceLoader = new DefaultResourceLoader({
54980
- ...options.resourceLoaderOptions ?? {},
55286
+ const resourceLoaderOptions = options.resourceLoaderOptions ?? {};
55287
+ const defaultResourceLoader = new DefaultResourceLoader({
55288
+ ...resourceLoaderOptions,
54981
55289
  cwd,
54982
55290
  agentDir,
54983
55291
  settingsManager
54984
55292
  });
54985
55293
  const reloadSpan = startTimingSpan("createAgentSessionServices.resourceLoader.reload");
54986
- await resourceLoader.reload(options.resourceLoaderReloadOptions);
55294
+ await defaultResourceLoader.reload(options.resourceLoaderReloadOptions);
55295
+ const resourceLoader = await withMandatoryResourceLoader(defaultResourceLoader, cwd);
54987
55296
  endTimingSpan(reloadSpan);
54988
55297
  const diagnostics = [];
54989
55298
  const providerSpan = startTimingSpan("createAgentSessionServices.providerRegistrations");
@@ -55036,6 +55345,7 @@ async function createAgentSessionFromServices(options) {
55036
55345
  var init_agent_session_services = __esm(() => {
55037
55346
  init_config();
55038
55347
  init_paths();
55348
+ init_mandatory_resource_loader();
55039
55349
  init_model_runtime();
55040
55350
  init_resource_loader();
55041
55351
  init_sdk();
@@ -55418,6 +55728,7 @@ async function createAgentSession(options = {}) {
55418
55728
  await resourceLoader.reload();
55419
55729
  time("resourceLoader.reload");
55420
55730
  }
55731
+ resourceLoader = await withMandatoryResourceLoader(resourceLoader, cwd);
55421
55732
  const existingSession = sessionManager.buildSessionContext();
55422
55733
  const repairedMessages = repairOrphanToolResults(existingSession.messages, { repairTrailing: true });
55423
55734
  const existingMessages = options.initialContextTransform ? options.initialContextTransform(repairedMessages) : repairedMessages;
@@ -55643,6 +55954,7 @@ var init_sdk = __esm(() => {
55643
55954
  init_agent_session();
55644
55955
  init_auth_guidance();
55645
55956
  init_codex_fast_mode();
55957
+ init_mandatory_resource_loader();
55646
55958
  init_messages();
55647
55959
  init_model_resolver();
55648
55960
  init_model_runtime();
@@ -56219,8 +56531,14 @@ var init_list_models = __esm(() => {
56219
56531
 
56220
56532
  // src/cli/startup-ui.ts
56221
56533
  import { existsSync as existsSync45 } from "node:fs";
56222
- 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";
56223
56540
  function createStartupTui(settingsManager) {
56541
+ setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides());
56224
56542
  initTheme(settingsManager.getTheme());
56225
56543
  setKeybindings(KeybindingsManager.create());
56226
56544
  const ui = new TuiMainScreen(new ProcessTerminal, settingsManager.getShowHardwareCursor(), getAgentDir());
@@ -58050,8 +58368,9 @@ async function applyCliRuntimeApiKey(modelRuntime, providerId, apiKey, signal) {
58050
58368
  }
58051
58369
 
58052
58370
  // src/cli/session-picker.ts
58053
- import { ProcessTerminal as ProcessTerminal2, setKeybindings as setKeybindings2, TuiMainScreen as TuiMainScreen2 } from "@earendil-works/pi-tui";
58054
- 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());
58055
58374
  return new Promise((resolve23) => {
58056
58375
  const ui = new TuiMainScreen2(new ProcessTerminal2, undefined, getAgentDir());
58057
58376
  const keybindings = KeybindingsManager.create();
@@ -58089,7 +58408,7 @@ var init_session_picker = __esm(() => {
58089
58408
 
58090
58409
  // src/main-session.ts
58091
58410
  import { createInterface as createInterface3 } from "node:readline";
58092
- 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";
58093
58412
  import chalk10 from "chalk";
58094
58413
  async function findLocalSessionByExactId(sessionId, cwd, sessionDir) {
58095
58414
  const localSessions = await SessionManager.list(cwd, sessionDir);
@@ -58228,7 +58547,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
58228
58547
  if (parsed.resume) {
58229
58548
  initTheme(settingsManager.getTheme(), true);
58230
58549
  try {
58231
- 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);
58232
58551
  if (!selectedPath) {
58233
58552
  console.log(chalk10.dim("No session selected"));
58234
58553
  process.exit(0);
@@ -58251,6 +58570,7 @@ async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
58251
58570
  return SessionManager.create(cwd, sessionDir, { id: parsed.sessionId });
58252
58571
  }
58253
58572
  async function promptForMissingSessionCwd(issue, settingsManager) {
58573
+ setCapabilityOverrides3(settingsManager.getTerminalCapabilityOverrides());
58254
58574
  initTheme(settingsManager.getTheme());
58255
58575
  setKeybindings3(KeybindingsManager.create());
58256
58576
  return new Promise((resolve23) => {
@@ -61836,7 +62156,7 @@ var init_slash_commands = __esm(() => {
61836
62156
  { name: "tree", description: "Navigate session tree (switch branches)" },
61837
62157
  { name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
61838
62158
  { name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
61839
- { 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" },
61840
62160
  { name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
61841
62161
  { name: "import", description: "Import and resume a session from a JSONL file" },
61842
62162
  { name: "share", description: "Share session as a secret GitHub gist" },
@@ -62472,6 +62792,7 @@ function createFullscreenTui(options) {
62472
62792
  openUrl: openBrowser
62473
62793
  }),
62474
62794
  onRightClickPaste: options.onRightClickPaste,
62795
+ copyOnSelect: options.copyOnSelect,
62475
62796
  copySelection: options.copySelection ?? copySelectionToHostClipboard
62476
62797
  }, options.shouldHandleViewportInput, options.onOverlayUnhandledInput);
62477
62798
  }
@@ -62513,7 +62834,7 @@ function createInteractiveTuiReference(getTui) {
62513
62834
  getPrototypeOf: () => Reflect.getPrototypeOf(getTui())
62514
62835
  });
62515
62836
  }
62516
- 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;
62517
62838
  var init_interactive_tui = __esm(() => {
62518
62839
  init_clipboard();
62519
62840
  init_open_browser();
@@ -62522,6 +62843,7 @@ var init_interactive_tui = __esm(() => {
62522
62843
  viewportInputGates = new WeakMap;
62523
62844
  overlayUnhandledInputHandlers = new WeakMap;
62524
62845
  viewportInputReplays = new WeakSet;
62846
+ overlayOwnedSelections = new WeakSet;
62525
62847
  viewportInputSubscriptions = new WeakMap;
62526
62848
  SGR_MOUSE_SEQUENCE = /^\x1b\[<(\d+);\d+;\d+([Mm])/;
62527
62849
  LEFT_MOUSE_MODIFIER_MASK = 4 | 8 | 16;
@@ -62537,8 +62859,20 @@ var init_interactive_tui = __esm(() => {
62537
62859
  deferral.shouldDeferViewportInputToOverlay = () => !viewportInputReplays.has(this) && deferToOverlay?.() === true;
62538
62860
  }
62539
62861
  applyLineResets(lines) {
62862
+ if (overlayOwnedSelections.has(this) && !this.isFocusedOverlay())
62863
+ this.clearOverlayOwnedSelection();
62540
62864
  return stripOverlayActiveRowMarker(super.applyLineResets(lines));
62541
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
+ }
62542
62876
  isPiTuiMouseSequence(data) {
62543
62877
  if (parseMouseSequences(data))
62544
62878
  return true;
@@ -62615,6 +62949,7 @@ var init_interactive_tui = __esm(() => {
62615
62949
  if (isLeftMouseButton(sequence))
62616
62950
  viewportListener(sequence.data);
62617
62951
  }
62952
+ overlayOwnedSelections.add(this);
62618
62953
  }
62619
62954
  replayViewportInput(viewportListener, data) {
62620
62955
  viewportInputReplays.add(this);
@@ -62682,7 +63017,11 @@ var init_interactive_tui = __esm(() => {
62682
63017
  });
62683
63018
 
62684
63019
  // src/modes/interactive/interactive-mode-base.ts
62685
- 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";
62686
63025
  function isFullscreenViewportAction(data, keybindings) {
62687
63026
  return FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
62688
63027
  }
@@ -62743,6 +63082,18 @@ class InteractiveModeBase {
62743
63082
  return false;
62744
63083
  return this.defaultEditor.handleInput(data);
62745
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
+ }
62746
63097
  onRightClickPaste = () => {
62747
63098
  this.handleRightClickPaste();
62748
63099
  };
@@ -62942,11 +63293,13 @@ class InteractiveModeBase {
62942
63293
  await this.rebindCurrentSession();
62943
63294
  await this.themeController.applyFromSettings();
62944
63295
  });
63296
+ setCapabilityOverrides4(this.settingsManager.getTerminalCapabilityOverrides());
62945
63297
  this.version = VERSION;
62946
63298
  this.renderer = createInteractiveTui({
62947
63299
  showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
62948
63300
  logDirectory: runtimeHost.services.agentDir,
62949
63301
  terminal: options.terminal,
63302
+ copyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
62950
63303
  onRightClickPaste: this.onRightClickPaste,
62951
63304
  shouldHandleViewportInput: this.shouldHandleViewportInput,
62952
63305
  onOverlayUnhandledInput: this.onOverlayUnhandledInput,
@@ -64069,6 +64422,7 @@ var init_interactive_deferred_startup = __esm(() => {
64069
64422
  try {
64070
64423
  await this.bindCurrentSessionExtensions();
64071
64424
  await this.session.reload({ reason: "startup" });
64425
+ this.applyRuntimeSettings();
64072
64426
  this.rebuildChatFromMessages();
64073
64427
  if (!this.promptTurnWorkingLoaderActive) {
64074
64428
  this.stopWorkingLoader();
@@ -64757,6 +65111,7 @@ ${warningLines}`, 0, 0));
64757
65111
  });
64758
65112
 
64759
65113
  // src/modes/interactive/interactive-session-runtime.ts
65114
+ import { setCapabilityOverrides as setCapabilityOverrides5 } from "@earendil-works/pi-tui";
64760
65115
  var init_interactive_session_runtime = __esm(() => {
64761
65116
  init_interactive_mode_base();
64762
65117
  init_interactive_mode_deps();
@@ -64843,6 +65198,8 @@ var init_interactive_session_runtime = __esm(() => {
64843
65198
  }
64844
65199
  };
64845
65200
  InteractiveModeBase.prototype.applyRuntimeSettings = function() {
65201
+ setCapabilityOverrides5(this.settingsManager.getTerminalCapabilityOverrides());
65202
+ this.setFullscreenCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect());
64846
65203
  this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar());
64847
65204
  this.footer.setSession(this.session);
64848
65205
  this.usageMeter.setSession(this.session);
@@ -64912,7 +65269,7 @@ var init_interactive_extension_runtime = __esm(() => {
64912
65269
  if (shortcuts.size === 0)
64913
65270
  return;
64914
65271
  const createContext = () => ({
64915
- ui: this.createExtensionUIContext(),
65272
+ ui: extensionRunner.getUIContext(),
64916
65273
  mode: "tui",
64917
65274
  hasUI: true,
64918
65275
  cwd: this.sessionManager.getCwd(),
@@ -66359,6 +66716,9 @@ var init_interactive_input_handling = __esm(() => {
66359
66716
  });
66360
66717
  this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
66361
66718
  this.defaultEditor.onAction("app.message.dequeue", () => this.handleDequeue());
66719
+ this.defaultEditor.onAction("app.message.copy", () => {
66720
+ this.handleCopyCommand({ preferSelection: true });
66721
+ });
66362
66722
  this.defaultEditor.onAction("app.session.new", () => this.handleClearCommand());
66363
66723
  this.defaultEditor.onAction("app.session.tree", () => this.showTreeSelector());
66364
66724
  this.defaultEditor.onAction("app.session.fork", () => this.showUserMessageSelector());
@@ -67266,7 +67626,8 @@ var init_interactive_agent_events = __esm(() => {
67266
67626
  } else if (event.reason === "manual") {
67267
67627
  this.manualCompactionTakeoverPending = false;
67268
67628
  }
67269
- if (!manualTakeoverPending && this.settingsManager.getShowTerminalProgress()) {
67629
+ const resumesActiveRun = event.midTurn && !event.aborted && !event.errorMessage && !manualTakeoverPending;
67630
+ if (!manualTakeoverPending && !resumesActiveRun && this.settingsManager.getShowTerminalProgress()) {
67270
67631
  this.ui.terminal.setProgress(false);
67271
67632
  }
67272
67633
  if (!manualTakeoverPending && this.autoCompactionEscapeHandlerSaved) {
@@ -68282,7 +68643,7 @@ var init_interactive_selectors = __esm(() => {
68282
68643
  };
68283
68644
  InteractiveModeBase.prototype.showFastModeSelector = function() {
68284
68645
  if (!this.hasCodexFastModeSupportedModels()) {
68285
- 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.");
68286
68647
  return;
68287
68648
  }
68288
68649
  this.showSelector((done) => {
@@ -68341,6 +68702,7 @@ var init_interactive_selectors = __esm(() => {
68341
68702
  showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
68342
68703
  fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
68343
68704
  fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
68705
+ fullscreenCopyOnSelect: this.settingsManager.getFullscreenCopyOnSelect(),
68344
68706
  editorPaddingX: this.settingsManager.getEditorPaddingX(),
68345
68707
  outputPad: this.settingsManager.getOutputPad(),
68346
68708
  showCacheMissNotices: this.settingsManager.getShowCacheMissNotices(),
@@ -68458,6 +68820,10 @@ var init_interactive_selectors = __esm(() => {
68458
68820
  onFullscreenExitOutputChange: (output) => {
68459
68821
  this.settingsManager.setFullscreenExitOutput(output);
68460
68822
  },
68823
+ onFullscreenCopyOnSelectChange: (enabled) => {
68824
+ this.settingsManager.setFullscreenCopyOnSelect(enabled);
68825
+ this.setFullscreenCopyOnSelect(enabled);
68826
+ },
68461
68827
  onEditorPaddingXChange: (padding) => {
68462
68828
  this.settingsManager.setEditorPaddingX(padding);
68463
68829
  this.defaultEditor.setPaddingX(padding);
@@ -69444,18 +69810,8 @@ var init_interactive_slash_commands = __esm(() => {
69444
69810
  activeHeader.setExpanded(this.toolOutputExpanded);
69445
69811
  }
69446
69812
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
69447
- this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
69813
+ this.applyRuntimeSettings();
69448
69814
  await this.themeController.applyFromSettings();
69449
- const editorPaddingX = this.settingsManager.getEditorPaddingX();
69450
- const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
69451
- this.defaultEditor.setPaddingX(editorPaddingX);
69452
- this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible);
69453
- if (this.editor !== this.defaultEditor) {
69454
- this.editor.setPaddingX?.(editorPaddingX);
69455
- this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible);
69456
- }
69457
- this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());
69458
- this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
69459
69815
  this.setupAutocompleteProvider();
69460
69816
  const runner = this.session.extensionRunner;
69461
69817
  this.setupExtensionShortcuts(runner);
@@ -69648,7 +70004,12 @@ Gist: ${hyperlink3(gistUrl, gistUrl)}`);
69648
70004
  }
69649
70005
  }
69650
70006
  };
69651
- 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
+ }
69652
70013
  const text = this.session.getLastAssistantText();
69653
70014
  if (!text) {
69654
70015
  this.showError("No agent messages to copy yet.");
@@ -73702,6 +74063,8 @@ var init_rpc_extension_ui = __esm(() => {
73702
74063
  });
73703
74064
 
73704
74065
  // src/modes/rpc/rpc-session-binding.ts
74066
+ import { setCapabilityOverrides as setCapabilityOverrides6 } from "@earendil-works/pi-tui";
74067
+
73705
74068
  class RpcSessionBinding {
73706
74069
  session;
73707
74070
  unsubscribe;
@@ -73745,6 +74108,7 @@ class RpcSessionBinding {
73745
74108
  this.session = this.runtimeHost.session;
73746
74109
  this.disposeSubscriptions();
73747
74110
  const session = this.session;
74111
+ setCapabilityOverrides6(session.settingsManager.getTerminalCapabilityOverrides());
73748
74112
  this.renderService?.bindSession(session);
73749
74113
  this.footerDataProvider = new FooterDataProvider(session.sessionManager.getCwd());
73750
74114
  const models = session.scopedModels.length > 0 ? session.scopedModels.map((scoped) => scoped.model) : session.modelRuntime.getAvailableSnapshot();
@@ -74640,8 +75004,9 @@ var init_config_selector = __esm(() => {
74640
75004
  });
74641
75005
 
74642
75006
  // src/cli/config-selector.ts
74643
- 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";
74644
75008
  async function selectConfig(options) {
75009
+ setCapabilityOverrides7(options.settingsManager.getTerminalCapabilityOverrides());
74645
75010
  initTheme(options.settingsManager.getTheme(), true);
74646
75011
  return new Promise((resolve23) => {
74647
75012
  const ui = new TuiMainScreen8(new ProcessTerminal6, undefined, options.agentDir);
@@ -75494,6 +75859,7 @@ var init_package_manager_cli = __esm(() => {
75494
75859
  });
75495
75860
 
75496
75861
  // src/main.ts
75862
+ import { setCapabilityOverrides as setCapabilityOverrides8 } from "@earendil-works/pi-tui";
75497
75863
  import chalk15 from "chalk";
75498
75864
  function authCheckErrorMessage(error) {
75499
75865
  return error instanceof AuthCommandError ? error.message : "Failed to check provider readiness";
@@ -75728,6 +76094,7 @@ async function main(argv, options) {
75728
76094
  startupEarlyInputCapture = undefined;
75729
76095
  }
75730
76096
  const startupSettingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: startupProjectTrusted });
76097
+ setCapabilityOverrides8(startupSettingsManager.getTerminalCapabilityOverrides());
75731
76098
  const startupSettingsDiagnostics = collectSettingsDiagnostics(startupSettingsManager, "startup session lookup");
75732
76099
  if (appMode === "interactive" && parsed.useTheme !== undefined) {
75733
76100
  startupSettingsManager.applyOverrides({ theme: parsed.useTheme });
@@ -75862,6 +76229,8 @@ async function main(argv, options) {
75862
76229
  extensionFactories: isolateInteractiveHost ? undefined : extensionFactories
75863
76230
  }
75864
76231
  });
76232
+ if (isolateInteractiveHost)
76233
+ limitMandatoryIntercomToTool(services2.resourceLoader);
75865
76234
  const { settingsManager: settingsManager2, modelRuntime: modelRuntime2, resourceLoader: resourceLoader2 } = services2;
75866
76235
  const diagnostics = [
75867
76236
  ...services2.diagnostics,
@@ -75924,6 +76293,7 @@ async function main(argv, options) {
75924
76293
  endTimingSpan(runtimeCreationSpan);
75925
76294
  const { services, session, modelFallbackMessage } = runtime;
75926
76295
  const { settingsManager, modelRuntime, resourceLoader } = services;
76296
+ setCapabilityOverrides8(settingsManager.getTerminalCapabilityOverrides());
75927
76297
  applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);
75928
76298
  configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
75929
76299
  if (parsed.help) {
@@ -76055,6 +76425,7 @@ var init_main = __esm(() => {
76055
76425
  init_auth_storage();
76056
76426
  init_builtin_packages();
76057
76427
  init_http_dispatcher();
76428
+ init_mandatory_resource_loader();
76058
76429
  init_model_resolver();
76059
76430
  init_model_runtime();
76060
76431
  init_output_guard();
@@ -92594,6 +92965,7 @@ function serializePendingStageMessages(messages2) {
92594
92965
  id: entry.from.id,
92595
92966
  ...entry.from.name !== undefined ? { name: entry.from.name } : {},
92596
92967
  ...entry.from.group !== undefined ? { group: entry.from.group } : {},
92968
+ ...entry.from.groups !== undefined ? { groups: [...entry.from.groups] } : {},
92597
92969
  ...entry.from.cwd !== undefined ? { cwd: entry.from.cwd } : {},
92598
92970
  ...entry.from.model !== undefined ? { model: entry.from.model } : {},
92599
92971
  ...entry.from.pid !== undefined ? { pid: entry.from.pid } : {},
@@ -92635,7 +93007,7 @@ function isPendingStageMessage(value) {
92635
93007
  return typeof value.id === "string" && typeof value.runId === "string" && typeof value.stageKey === "string" && (value.stageId === undefined || typeof value.stageId === "string") && (value.stageReplayKey === undefined || typeof value.stageReplayKey === "string") && (value.senderRegistrationName === undefined || typeof value.senderRegistrationName === "string") && (value.senderReturnAddress === undefined || typeof value.senderReturnAddress === "string") && typeof value.queuedAt === "string" && (value.admissionOrder === undefined || typeof value.admissionOrder === "number" && Number.isSafeInteger(value.admissionOrder) && value.admissionOrder > 0) && (value.status === "queued" || value.status === "delivered" || value.status === "undeliverable") && (value.deliveredAt === undefined || typeof value.deliveredAt === "string") && (value.undeliverableReason === undefined || typeof value.undeliverableReason === "string") && (value.undeliverableNotificationId === undefined || typeof value.undeliverableNotificationId === "string") && (value.undeliverableNotifiedAt === undefined || typeof value.undeliverableNotifiedAt === "string") && isPendingStageSender(value.from) && isPendingStageIntercomMessage(value.message);
92636
93008
  }
92637
93009
  function isPendingStageSender(value) {
92638
- return isSerializableObject(value) && typeof value.id === "string" && (value.name === undefined || typeof value.name === "string") && (value.group === undefined || typeof value.group === "string") && (value.cwd === undefined || typeof value.cwd === "string") && (value.model === undefined || typeof value.model === "string") && (value.pid === undefined || typeof value.pid === "number") && (value.startedAt === undefined || typeof value.startedAt === "number") && (value.lastActivity === undefined || typeof value.lastActivity === "number") && (value.status === undefined || typeof value.status === "string");
93010
+ return isSerializableObject(value) && typeof value.id === "string" && (value.name === undefined || typeof value.name === "string") && (value.group === undefined || typeof value.group === "string") && (value.groups === undefined || Array.isArray(value.groups) && value.groups.every((group) => typeof group === "string")) && (value.cwd === undefined || typeof value.cwd === "string") && (value.model === undefined || typeof value.model === "string") && (value.pid === undefined || typeof value.pid === "number") && (value.startedAt === undefined || typeof value.startedAt === "number") && (value.lastActivity === undefined || typeof value.lastActivity === "number") && (value.status === undefined || typeof value.status === "string");
92639
93011
  }
92640
93012
  function isPendingStageIntercomMessage(value) {
92641
93013
  if (!isSerializableObject(value) || typeof value.id !== "string" || typeof value.timestamp !== "number")
@@ -93169,8 +93541,8 @@ class DbosDurableBackend {
93169
93541
  locallyRegistered = new Set;
93170
93542
  promptReservations;
93171
93543
  executorId;
93172
- writeQueue = Promise.resolve();
93173
- writeErrors = [];
93544
+ writeQueues = new Map;
93545
+ writeErrors = new Map;
93174
93546
  constructor(sdk, options) {
93175
93547
  this.sdk = sdk;
93176
93548
  this.executorId = options?.executorId ?? getAtomicExecutorId();
@@ -93178,7 +93550,7 @@ class DbosDurableBackend {
93178
93550
  pendingPrompts: (workflowId) => this.mem.getWorkflow(workflowId)?.pendingPrompts ?? 0,
93179
93551
  adjustPendingPrompts: (workflowId, delta) => this.mem.adjustPendingPrompts(workflowId, delta),
93180
93552
  persist: (workflowId, stepName, output) => {
93181
- this.enqueueWrite(() => this.sdk.recordStepOutput(workflowId, stepName, output));
93553
+ this.enqueueWrite(workflowId, () => this.sdk.recordStepOutput(workflowId, stepName, output));
93182
93554
  }
93183
93555
  });
93184
93556
  }
@@ -93191,14 +93563,14 @@ class DbosDurableBackend {
93191
93563
  this.locallyRegistered.add(handle.workflowId);
93192
93564
  const pendingPrompts2 = this.promptReservations.registerWorkflow(handle.workflowId, handle.pendingPrompts, this.mem.getWorkflow(handle.workflowId)?.pendingPrompts ?? 0);
93193
93565
  this.mem.registerWorkflow({ ...handle, pendingPrompts: pendingPrompts2 });
93194
- this.enqueueWrite(async () => {
93566
+ this.enqueueWrite(handle.workflowId, async () => {
93195
93567
  await this.sdk.startWorkflow(handle.workflowId, handle.name, handle.inputs);
93196
93568
  await this.writeMetadata(handle.workflowId);
93197
93569
  });
93198
93570
  }
93199
93571
  async persistPendingStageMessages(workflowId, messages2, logicalRunId = workflowId) {
93200
93572
  let persisted = false;
93201
- await this.enqueueWrite(async () => {
93573
+ await this.enqueueWrite(workflowId, async () => {
93202
93574
  if (!this.isWorkflowLoadable(workflowId))
93203
93575
  return;
93204
93576
  const handle = this.mem.getWorkflow(workflowId);
@@ -93223,7 +93595,7 @@ class DbosDurableBackend {
93223
93595
  if (!this.isWorkflowLoadable(checkpoint.workflowId))
93224
93596
  return;
93225
93597
  this.mem.recordCheckpoint(checkpoint);
93226
- this.enqueueWrite(() => this.persistCheckpoint(checkpoint));
93598
+ this.enqueueWrite(checkpoint.workflowId, () => this.persistCheckpoint(checkpoint));
93227
93599
  }
93228
93600
  async recordCheckpointAsync(checkpoint, options) {
93229
93601
  if (!this.isWorkflowLoadable(checkpoint.workflowId))
@@ -93231,7 +93603,7 @@ class DbosDurableBackend {
93231
93603
  const signal = options?.signal;
93232
93604
  if (signal?.aborted)
93233
93605
  throw abortSignalReason(signal);
93234
- await this.enqueueWrite(async () => {
93606
+ await this.enqueueWrite(checkpoint.workflowId, async () => {
93235
93607
  if (signal?.aborted || !this.isWorkflowLoadable(checkpoint.workflowId))
93236
93608
  return;
93237
93609
  const persist = (async () => {
@@ -93268,7 +93640,7 @@ class DbosDurableBackend {
93268
93640
  if (!this.isWorkflowLoadable(checkpoint.workflowId))
93269
93641
  return true;
93270
93642
  const encoded = encodeCheckpoint(checkpoint);
93271
- return await this.enqueueBestEffortWrite(async () => {
93643
+ return await this.enqueueBestEffortWrite(checkpoint.workflowId, async () => {
93272
93644
  if (!this.isWorkflowLoadable(checkpoint.workflowId))
93273
93645
  return;
93274
93646
  await this.sdk.recordStepOutput(checkpoint.workflowId, checkpoint.checkpointId, encoded);
@@ -93313,7 +93685,7 @@ class DbosDurableBackend {
93313
93685
  this.promptReservations.setBaseline(workflowId, pendingPrompts2);
93314
93686
  }
93315
93687
  this.mem.setWorkflowStatus(workflowId, status, pendingPrompts2, resumable, failure2);
93316
- this.enqueueWrite(async () => {
93688
+ this.enqueueWrite(workflowId, async () => {
93317
93689
  if (!this.isWorkflowLoadable(workflowId))
93318
93690
  return;
93319
93691
  if (status === "cancelled")
@@ -93327,14 +93699,14 @@ class DbosDurableBackend {
93327
93699
  return await transitionDbosWorkflowStatus({
93328
93700
  expectedStatuses: expected,
93329
93701
  status,
93330
- flush: () => this.flush(),
93702
+ flush: () => this.flush(workflowId),
93331
93703
  local: () => this.getLoadableWorkflow(workflowId),
93332
93704
  read: async () => classifyLatestMetadata(await this.sdk.listStepRecords(workflowId), workflowId),
93333
93705
  reconcile: (entry) => this.mem.setWorkflowStatus(workflowId, entry.status, undefined, entry.resumable),
93334
93706
  claim: (authoritative, generation) => this.claimStatusTransition(workflowId, authoritative, generation, status, pendingPrompts2, resumable),
93335
93707
  write: async () => {
93336
93708
  this.setWorkflowStatus(workflowId, status, pendingPrompts2, resumable);
93337
- await this.flush();
93709
+ await this.flush(workflowId);
93338
93710
  }
93339
93711
  });
93340
93712
  }
@@ -93396,13 +93768,13 @@ class DbosDurableBackend {
93396
93768
  this.locallyRegistered.delete(workflowId);
93397
93769
  this.promptReservations.delete(workflowId);
93398
93770
  await this.mem.deleteWorkflow(workflowId);
93399
- await this.enqueueWrite(async () => {
93771
+ await this.enqueueWrite(workflowId, async () => {
93400
93772
  await this.sdk.deleteWorkflowData(workflowId);
93401
93773
  await this.sdk.recordStepOutput(workflowId, DBOS_DELETION_STEP, encodeDbosDeletionTombstone(workflowId));
93402
93774
  });
93403
93775
  }
93404
93776
  async deleteWorkflowIfInactive(workflowId) {
93405
- await this.flush();
93777
+ await this.flush(workflowId);
93406
93778
  await this.hydrateWorkflow(workflowId);
93407
93779
  const handle = this.getLoadableWorkflow(workflowId);
93408
93780
  if (handle === undefined)
@@ -93413,7 +93785,7 @@ class DbosDurableBackend {
93413
93785
  if (!guarded)
93414
93786
  return { ok: false, reason: "running" };
93415
93787
  await this.deleteWorkflow(workflowId);
93416
- await this.flush();
93788
+ await this.flush(workflowId);
93417
93789
  return { ok: true };
93418
93790
  }
93419
93791
  isWorkflowLoadable(workflowId) {
@@ -93425,16 +93797,19 @@ class DbosDurableBackend {
93425
93797
  this.current.clear();
93426
93798
  this.locallyRegistered.clear();
93427
93799
  this.promptReservations.clear();
93428
- this.writeQueue = Promise.resolve();
93429
- this.writeErrors = [];
93430
- }
93431
- async flush() {
93432
- await this.writeQueue;
93433
- if (this.writeErrors.length === 0)
93434
- return;
93435
- const [first] = this.writeErrors;
93436
- this.writeErrors = [];
93437
- throw first;
93800
+ this.writeQueues.clear();
93801
+ this.writeErrors.clear();
93802
+ }
93803
+ async flush(workflowId) {
93804
+ const workflowIds = workflowId === undefined ? [...new Set([...this.writeQueues.keys(), ...this.writeErrors.keys()])] : [workflowId];
93805
+ await Promise.all(workflowIds.map(async (id) => await this.writeQueues.get(id)));
93806
+ for (const id of workflowIds) {
93807
+ const errors = this.writeErrors.get(id);
93808
+ if (errors === undefined || errors.length === 0)
93809
+ continue;
93810
+ this.writeErrors.delete(id);
93811
+ throw errors[0];
93812
+ }
93438
93813
  }
93439
93814
  async hydrateWorkflow(workflowId) {
93440
93815
  await this.hydrateWorkflowForInspection(workflowId);
@@ -93528,21 +93903,33 @@ class DbosDurableBackend {
93528
93903
  this.promptReservations.delete(workflowId);
93529
93904
  await this.mem.deleteWorkflow(workflowId);
93530
93905
  }
93531
- enqueueWrite(fn) {
93532
- const next = this.writeQueue.then(fn, fn);
93533
- this.writeQueue = next.catch((err) => {
93906
+ enqueueWrite(workflowId, fn) {
93907
+ const previous2 = this.writeQueues.get(workflowId) ?? Promise.resolve();
93908
+ const next = previous2.then(fn, fn);
93909
+ const tracked = next.catch((err) => {
93534
93910
  const error = err instanceof Error ? err : new Error(String(err));
93535
- this.writeErrors.push(error);
93911
+ const errors = this.writeErrors.get(workflowId) ?? [];
93912
+ errors.push(error);
93913
+ this.writeErrors.set(workflowId, errors);
93536
93914
  });
93915
+ this.trackWriteQueue(workflowId, tracked);
93537
93916
  return next;
93538
93917
  }
93539
- async enqueueBestEffortWrite(fn) {
93540
- const next = this.writeQueue.then(fn, fn);
93541
- this.writeQueue = next.catch(() => {
93918
+ async enqueueBestEffortWrite(workflowId, fn) {
93919
+ const previous2 = this.writeQueues.get(workflowId) ?? Promise.resolve();
93920
+ const next = previous2.then(fn, fn);
93921
+ this.trackWriteQueue(workflowId, next.catch(() => {
93542
93922
  return;
93543
- });
93923
+ }));
93544
93924
  return await next.then(() => true, () => false);
93545
93925
  }
93926
+ trackWriteQueue(workflowId, queue) {
93927
+ this.writeQueues.set(workflowId, queue);
93928
+ queue.finally(() => {
93929
+ if (this.writeQueues.get(workflowId) === queue)
93930
+ this.writeQueues.delete(workflowId);
93931
+ });
93932
+ }
93546
93933
  async writeMetadata(workflowId) {
93547
93934
  const value = this.mem.toMetadata(workflowId);
93548
93935
  if (value === undefined)
@@ -96546,7 +96933,7 @@ async function markDurableQuit(runId, run) {
96546
96933
  if (!transitioned)
96547
96934
  return "refused";
96548
96935
  recordRunTimingCheckpoint(backend, run);
96549
- await backend.flush();
96936
+ await backend.flush(runId);
96550
96937
  return "transitioned";
96551
96938
  }
96552
96939
  function discoverDurableQuitBackend(runId) {
@@ -96774,7 +97161,7 @@ async function markDurableResumed(runId) {
96774
97161
  const authoritative = getLoadableDurableWorkflow(backend, runId);
96775
97162
  return authoritative?.status === "running" ? "not_needed" : "refused";
96776
97163
  }
96777
- await backend.flush();
97164
+ await backend.flush(runId);
96778
97165
  pending.delete(runId);
96779
97166
  return "transitioned";
96780
97167
  } catch (error) {
@@ -101072,6 +101459,10 @@ var orchestratorModelConfig = {
101072
101459
  "github-copilot/grok-4.6:xhigh",
101073
101460
  "zai/glm-5.3:high",
101074
101461
  "zai-coding-cn/glm-5.3:high",
101462
+ "zai/glm-5.3-flash:high",
101463
+ "zai-coding-cn/glm-5.3-flash:high",
101464
+ "baseten/zai-org/GLM-5.3:high",
101465
+ "baseten/zai-org/GLM-5.3-Flash:high",
101075
101466
  "openrouter/anthropic/claude-opus-5:high",
101076
101467
  "openrouter/openai/gpt-5.6-sol:xhigh",
101077
101468
  "openrouter/anthropic/claude-fable-5:high",
@@ -101079,7 +101470,9 @@ var orchestratorModelConfig = {
101079
101470
  "openrouter/sakana/fugu-ultra:high",
101080
101471
  "openrouter/openai/gpt-5.5:xhigh",
101081
101472
  "openrouter/anthropic/claude-opus-4-8:high",
101082
- "openrouter/x-ai/grok-4.6"
101473
+ "openrouter/x-ai/grok-4.6",
101474
+ "openrouter/z-ai/glm-5.3:high",
101475
+ "openrouter/z-ai/glm-5.3-flash:high"
101083
101476
  ],
101084
101477
  excludedTools: ["ask_user_question"]
101085
101478
  };
@@ -101104,6 +101497,10 @@ var reviewerModelConfig = {
101104
101497
  "github-copilot/grok-4.6:xhigh",
101105
101498
  "zai/glm-5.3:high",
101106
101499
  "zai-coding-cn/glm-5.3:high",
101500
+ "zai/glm-5.3-flash:high",
101501
+ "zai-coding-cn/glm-5.3-flash:high",
101502
+ "baseten/zai-org/GLM-5.3:high",
101503
+ "baseten/zai-org/GLM-5.3-Flash:high",
101107
101504
  "openrouter/anthropic/claude-opus-5:high",
101108
101505
  "openrouter/anthropic/claude-fable-5:high",
101109
101506
  "openrouter/openai/gpt-5.6-sol:xhigh",
@@ -101111,7 +101508,9 @@ var reviewerModelConfig = {
101111
101508
  "openrouter/sakana/fugu-ultra:high",
101112
101509
  "openrouter/openai/gpt-5.5:xhigh",
101113
101510
  "openrouter/anthropic/claude-opus-4-8:high",
101114
- "openrouter/x-ai/grok-4.6"
101511
+ "openrouter/x-ai/grok-4.6",
101512
+ "openrouter/z-ai/glm-5.3:high",
101513
+ "openrouter/z-ai/glm-5.3-flash:high"
101115
101514
  ],
101116
101515
  excludedTools: ["ask_user_question"],
101117
101516
  schema: reviewDecisionSchema
@@ -103207,13 +103606,19 @@ async function runOpenClaudeDesignWorkflow(ctx) {
103207
103606
  "github-copilot/grok-4.6:xhigh",
103208
103607
  "zai/glm-5.3:high",
103209
103608
  "zai-coding-cn/glm-5.3:high",
103609
+ "zai/glm-5.3-flash:high",
103610
+ "zai-coding-cn/glm-5.3-flash:high",
103611
+ "baseten/zai-org/GLM-5.3:high",
103612
+ "baseten/zai-org/GLM-5.3-Flash:high",
103210
103613
  "openrouter/anthropic/claude-opus-5:high",
103211
103614
  "openrouter/anthropic/claude-fable-5:high",
103212
103615
  "openrouter/anthropic/claude-opus-4-8:high",
103213
103616
  "openrouter/moonshotai/kimi-k3:max",
103214
103617
  "openrouter/openai/gpt-5.6-sol:xhigh",
103215
103618
  "openrouter/sakana/fugu-ultra:high",
103216
- "openrouter/x-ai/grok-4.6"
103619
+ "openrouter/x-ai/grok-4.6",
103620
+ "openrouter/z-ai/glm-5.3:high",
103621
+ "openrouter/z-ai/glm-5.3-flash:high"
103217
103622
  ]
103218
103623
  };
103219
103624
  const frontDoor = await runDiscoveryAndInit({
@@ -104234,6 +104639,10 @@ var promptEngineerModelConfig = {
104234
104639
  "github-copilot/grok-4.6:xhigh",
104235
104640
  "zai/glm-5.3:high",
104236
104641
  "zai-coding-cn/glm-5.3:high",
104642
+ "zai/glm-5.3-flash:high",
104643
+ "zai-coding-cn/glm-5.3-flash:high",
104644
+ "baseten/zai-org/GLM-5.3:high",
104645
+ "baseten/zai-org/GLM-5.3-Flash:high",
104237
104646
  "openrouter/anthropic/claude-opus-5:high",
104238
104647
  "openrouter/anthropic/claude-fable-5:high",
104239
104648
  "openrouter/openai/gpt-5.6-sol:xhigh",
@@ -104241,7 +104650,9 @@ var promptEngineerModelConfig = {
104241
104650
  "openrouter/sakana/fugu-ultra:high",
104242
104651
  "openrouter/openai/gpt-5.5:xhigh",
104243
104652
  "openrouter/anthropic/claude-opus-4-8:high",
104244
- "openrouter/x-ai/grok-4.6"
104653
+ "openrouter/x-ai/grok-4.6",
104654
+ "openrouter/z-ai/glm-5.3:high",
104655
+ "openrouter/z-ai/glm-5.3-flash:high"
104245
104656
  ],
104246
104657
  excludedTools: ["ask_user_question"]
104247
104658
  };
@@ -104266,6 +104677,10 @@ var researchModelConfig = {
104266
104677
  "github-copilot/grok-4.6:xhigh",
104267
104678
  "zai/glm-5.3:high",
104268
104679
  "zai-coding-cn/glm-5.3:high",
104680
+ "zai/glm-5.3-flash:high",
104681
+ "zai-coding-cn/glm-5.3-flash:high",
104682
+ "baseten/zai-org/GLM-5.3:high",
104683
+ "baseten/zai-org/GLM-5.3-Flash:high",
104269
104684
  "openrouter/anthropic/claude-opus-5:high",
104270
104685
  "openrouter/openai/gpt-5.6-sol:xhigh",
104271
104686
  "openrouter/anthropic/claude-fable-5:high",
@@ -104273,7 +104688,9 @@ var researchModelConfig = {
104273
104688
  "openrouter/sakana/fugu-ultra:high",
104274
104689
  "openrouter/openai/gpt-5.5:xhigh",
104275
104690
  "openrouter/anthropic/claude-opus-4-8:high",
104276
- "openrouter/x-ai/grok-4.6"
104691
+ "openrouter/x-ai/grok-4.6",
104692
+ "openrouter/z-ai/glm-5.3:high",
104693
+ "openrouter/z-ai/glm-5.3-flash:high"
104277
104694
  ],
104278
104695
  excludedTools: ["ask_user_question"]
104279
104696
  };
@@ -104298,6 +104715,10 @@ var orchestratorModelConfig2 = {
104298
104715
  "github-copilot/grok-4.6:xhigh",
104299
104716
  "zai/glm-5.3:high",
104300
104717
  "zai-coding-cn/glm-5.3:high",
104718
+ "zai/glm-5.3-flash:high",
104719
+ "zai-coding-cn/glm-5.3-flash:high",
104720
+ "baseten/zai-org/GLM-5.3:high",
104721
+ "baseten/zai-org/GLM-5.3-Flash:high",
104301
104722
  "openrouter/anthropic/claude-opus-5:high",
104302
104723
  "openrouter/openai/gpt-5.6-sol:xhigh",
104303
104724
  "openrouter/anthropic/claude-fable-5:high",
@@ -104305,7 +104726,9 @@ var orchestratorModelConfig2 = {
104305
104726
  "openrouter/sakana/fugu-ultra:high",
104306
104727
  "openrouter/openai/gpt-5.5:xhigh",
104307
104728
  "openrouter/anthropic/claude-opus-4-8:high",
104308
- "openrouter/x-ai/grok-4.6"
104729
+ "openrouter/x-ai/grok-4.6",
104730
+ "openrouter/z-ai/glm-5.3:high",
104731
+ "openrouter/z-ai/glm-5.3-flash:high"
104309
104732
  ],
104310
104733
  excludedTools: ["ask_user_question"]
104311
104734
  };
@@ -104330,6 +104753,10 @@ var reviewerAModelConfig = {
104330
104753
  "github-copilot/grok-4.6:xhigh",
104331
104754
  "zai/glm-5.3:high",
104332
104755
  "zai-coding-cn/glm-5.3:high",
104756
+ "zai/glm-5.3-flash:high",
104757
+ "zai-coding-cn/glm-5.3-flash:high",
104758
+ "baseten/zai-org/GLM-5.3:high",
104759
+ "baseten/zai-org/GLM-5.3-Flash:high",
104333
104760
  "openrouter/anthropic/claude-opus-5:high",
104334
104761
  "openrouter/anthropic/claude-fable-5:high",
104335
104762
  "openrouter/moonshotai/kimi-k3:max",
@@ -104337,7 +104764,9 @@ var reviewerAModelConfig = {
104337
104764
  "openrouter/sakana/fugu-ultra:high",
104338
104765
  "openrouter/openai/gpt-5.5:xhigh",
104339
104766
  "openrouter/anthropic/claude-opus-4-8:high",
104340
- "openrouter/x-ai/grok-4.6"
104767
+ "openrouter/x-ai/grok-4.6",
104768
+ "openrouter/z-ai/glm-5.3:high",
104769
+ "openrouter/z-ai/glm-5.3-flash:high"
104341
104770
  ],
104342
104771
  excludedTools: ["ask_user_question"],
104343
104772
  schema: reviewDecisionSchema2
@@ -104363,6 +104792,10 @@ var reviewerBModelConfig = {
104363
104792
  "github-copilot/grok-4.6:xhigh",
104364
104793
  "zai/glm-5.3:high",
104365
104794
  "zai-coding-cn/glm-5.3:high",
104795
+ "zai/glm-5.3-flash:high",
104796
+ "zai-coding-cn/glm-5.3-flash:high",
104797
+ "baseten/zai-org/GLM-5.3:high",
104798
+ "baseten/zai-org/GLM-5.3-Flash:high",
104366
104799
  "openrouter/openai/gpt-5.6-sol:xhigh",
104367
104800
  "openrouter/anthropic/claude-opus-5:high",
104368
104801
  "openrouter/anthropic/claude-fable-5:high",
@@ -104370,7 +104803,9 @@ var reviewerBModelConfig = {
104370
104803
  "openrouter/openai/gpt-5.5:xhigh",
104371
104804
  "openrouter/sakana/fugu-ultra:high",
104372
104805
  "openrouter/anthropic/claude-opus-4-8:high",
104373
- "openrouter/x-ai/grok-4.6"
104806
+ "openrouter/x-ai/grok-4.6",
104807
+ "openrouter/z-ai/glm-5.3:high",
104808
+ "openrouter/z-ai/glm-5.3-flash:high"
104374
104809
  ],
104375
104810
  excludedTools: ["ask_user_question"],
104376
104811
  schema: reviewDecisionSchema2
@@ -105428,6 +105863,8 @@ import { extname as extname2, isAbsolute as isAbsolute20, join as join100, resol
105428
105863
  // dist/builtin/workflows/src/extension/workflow-module-loader.ts
105429
105864
  import { createJiti as createJiti2 } from "jiti/static";
105430
105865
  import * as typeboxModule from "typebox";
105866
+ import * as typeboxCompileModule from "typebox/compile";
105867
+ import * as typeboxValueModule from "typebox/value";
105431
105868
 
105432
105869
  // dist/builtin/workflows/src/sdk-surface.ts
105433
105870
  var exports_sdk_surface = {};
@@ -106766,8 +107203,8 @@ class ScopedDurableBackend {
106766
107203
  async recordAdditiveCheckpointBestEffort(checkpoint) {
106767
107204
  return await this.inner.recordAdditiveCheckpointBestEffort(this.remap(checkpoint));
106768
107205
  }
106769
- flush() {
106770
- return this.inner.flush();
107206
+ flush(workflowId) {
107207
+ return workflowId === undefined ? this.inner.flush() : this.inner.flush(this.scope.rootWorkflowId);
106771
107208
  }
106772
107209
  getToolOutput(_workflowId, argsHash) {
106773
107210
  return this.inner.getToolOutput(this.scope.rootWorkflowId, this.scopeKey(argsHash));
@@ -110121,17 +110558,7 @@ function resolveStageGroup(stageOptions, workflowGroup) {
110121
110558
  const trimmed = group.trim();
110122
110559
  return trimmed.length > 0 ? trimmed : undefined;
110123
110560
  }
110124
- function stageHasIntercomAccess(stageOptions) {
110125
- if (!stageOptions)
110126
- return true;
110127
- if (stageOptions.noTools === "all")
110128
- return false;
110129
- const tools = stageOptions.tools;
110130
- if (Array.isArray(tools) && !tools.includes("intercom"))
110131
- return false;
110132
- const excluded = stageOptions.excludedTools;
110133
- if (Array.isArray(excluded) && excluded.includes("intercom"))
110134
- return false;
110561
+ function stageHasIntercomAccess(_stageOptions) {
110135
110562
  return true;
110136
110563
  }
110137
110564
  function stageCanUseWorkflowPendingStageRoute(stageOptions, workflowGroup) {
@@ -110555,11 +110982,11 @@ function wrapUiWithDurable(base, deps) {
110555
110982
  };
110556
110983
  const releasePending = async (identity, token) => {
110557
110984
  releaseDurablePrompt(deps.backend, deps.workflowId, identity.hash, token);
110558
- await deps.backend.flush();
110985
+ await deps.backend.flush(deps.workflowId);
110559
110986
  };
110560
110987
  const beginPending = (identity) => {
110561
110988
  const token = reserveDurablePrompt(deps.backend, deps.workflowId, identity.hash);
110562
- const write = deps.backend.flush();
110989
+ const write = deps.backend.flush(deps.workflowId);
110563
110990
  return { token, write };
110564
110991
  };
110565
110992
  const waitForPendingWrite = async (identity, pending) => {
@@ -110570,7 +110997,7 @@ function wrapUiWithDurable(base, deps) {
110570
110997
  } catch (error) {
110571
110998
  releaseDurablePrompt(deps.backend, deps.workflowId, identity.hash, pending.token);
110572
110999
  try {
110573
- await deps.backend.flush();
111000
+ await deps.backend.flush(deps.workflowId);
110574
111001
  } catch {}
110575
111002
  throw error;
110576
111003
  }
@@ -110867,7 +111294,7 @@ async function admitDurableRootRun(args) {
110867
111294
  args.backend.setWorkflowStatus(args.runId, "running");
110868
111295
  }
110869
111296
  if (!args.isChildRun)
110870
- await args.backend.flush();
111297
+ await args.backend.flush(args.runId);
110871
111298
  }
110872
111299
 
110873
111300
  // dist/builtin/workflows/src/engine/run-durable-finalize.ts
@@ -110898,7 +111325,7 @@ async function finalizeDurableTerminalStatus(input2) {
110898
111325
  } : undefined;
110899
111326
  input2.durableBackend.setWorkflowStatus(input2.runId, durableStatus, undefined, input2.runSnapshot.resumable, failure2);
110900
111327
  }
110901
- await input2.durableBackend.flush();
111328
+ await input2.durableBackend.flush(input2.runId);
110902
111329
  }
110903
111330
  function toDurableStatus(status) {
110904
111331
  switch (status) {
@@ -111453,7 +111880,7 @@ async function resumeDurableWorkflow(workflowId, deps, catalog) {
111453
111880
  });
111454
111881
  } catch (error) {
111455
111882
  backend.setWorkflowStatus(resolved.workflowId, handle.status, handle.pendingPrompts, handle.resumable);
111456
- await backend.flush();
111883
+ await backend.flush(resolved.workflowId);
111457
111884
  return {
111458
111885
  ok: false,
111459
111886
  reason: "startup_failed",
@@ -111467,7 +111894,7 @@ async function resumeDurableWorkflow(workflowId, deps, catalog) {
111467
111894
  const error = workflowStartupFailureMessage(admission, snapshot2?.error, `Workflow ${resolved.workflowId} ended before startup admission`);
111468
111895
  deps.baseRunOpts.store?.removeRun(accepted2.runId);
111469
111896
  backend.setWorkflowStatus(resolved.workflowId, handle.status, handle.pendingPrompts, handle.resumable);
111470
- await backend.flush();
111897
+ await backend.flush(resolved.workflowId);
111471
111898
  return {
111472
111899
  ok: false,
111473
111900
  reason: "startup_failed",
@@ -117418,7 +117845,7 @@ async function run(def, inputs, opts = {}) {
117418
117845
  const result = normalizeWorkflowRunOutput(def.name, rawResult);
117419
117846
  assertWorkflowRunOutputs(def.name, result, def.outputs);
117420
117847
  assertWorkflowCreatedExecution(runSnapshot);
117421
- await durableBackend.flush();
117848
+ await durableBackend.flush(runId);
117422
117849
  const returned = classifyReturnedRunStatus(result, runSnapshot);
117423
117850
  const recorded = activeStore.recordRunEnd(runId, returned.status, result, returned.error, returned.metadata);
117424
117851
  appendRunEndWhenRecorded(opts.persistence, recorded, {
@@ -117434,7 +117861,7 @@ async function run(def, inputs, opts = {}) {
117434
117861
  if (opts.parentRun === undefined)
117435
117862
  recordRunTimingCheckpoint(durableBackend, runSnapshot);
117436
117863
  durableBackend.setWorkflowStatus(runId, returned.status, undefined, returned.metadata?.resumable);
117437
- await durableBackend.flush();
117864
+ await durableBackend.flush(runId);
117438
117865
  return reconcileTerminalRunResult(runId, runSnapshot, activeStore, { status: returned.status, result, error: returned.error }, opts.onRunEnd);
117439
117866
  } catch (err) {
117440
117867
  terminalEvents.selectFailure(err);
@@ -117591,10 +118018,21 @@ function createWorkflowVirtualModules(moduleSpecifier) {
117591
118018
  [`${builtinModuleSpecifier}/steering-context`]: exports_steering_context
117592
118019
  };
117593
118020
  }
118021
+ var TYPEBOX_COMPILE_MODULE = {
118022
+ ...typeboxCompileModule
118023
+ };
118024
+ var TYPEBOX_VALUE_MODULE = {
118025
+ ...typeboxValueModule
118026
+ };
117594
118027
  var WORKFLOWS_VIRTUAL_MODULES = {
117595
118028
  ...createWorkflowVirtualModules(WORKFLOWS_MODULE_SPECIFIER),
117596
118029
  ...createWorkflowVirtualModules(LEGACY_WORKFLOWS_MODULE_SPECIFIER),
117597
- [TYPEBOX_MODULE_SPECIFIER]: TYPEBOX_MODULE
118030
+ [TYPEBOX_MODULE_SPECIFIER]: TYPEBOX_MODULE,
118031
+ "typebox/compile": TYPEBOX_COMPILE_MODULE,
118032
+ "typebox/value": TYPEBOX_VALUE_MODULE,
118033
+ "@sinclair/typebox": TYPEBOX_MODULE,
118034
+ "@sinclair/typebox/compile": TYPEBOX_COMPILE_MODULE,
118035
+ "@sinclair/typebox/value": TYPEBOX_VALUE_MODULE
117598
118036
  };
117599
118037
  var workflowModuleLoader = createJiti2(import.meta.url, {
117600
118038
  moduleCache: false,
@@ -117971,7 +118409,7 @@ async function discardUnadmittedRun(runId, activeStore) {
117971
118409
  const handle = backend.getWorkflow(runId);
117972
118410
  if (handle?.status === "running") {
117973
118411
  backend.setWorkflowStatus(runId, "failed", handle.pendingPrompts, false);
117974
- await backend.flush();
118412
+ await backend.flush(runId);
117975
118413
  }
117976
118414
  const deleted = await backend.deleteWorkflowIfInactive(runId);
117977
118415
  if (!deleted.ok && deleted.reason !== "not_found") {
@@ -118134,7 +118572,7 @@ async function discardFailedActiveBlockedContinuation(backend, runId, store2) {
118134
118572
  const handle = backend.getWorkflow(runId);
118135
118573
  if (handle?.status === "running") {
118136
118574
  backend.setWorkflowStatus(runId, "failed", handle.pendingPrompts, false);
118137
- await backend.flush();
118575
+ await backend.flush(runId);
118138
118576
  }
118139
118577
  const deleted = await backend.deleteWorkflowIfInactive(runId);
118140
118578
  if (!deleted.ok && deleted.reason !== "not_found") {
@@ -118968,7 +119406,7 @@ function formatWorkflowHeartbeatNoticeText(details) {
118968
119406
  const workflowName = escapeQuotedText3(details.workflowName);
118969
119407
  const elapsed = formatWorkflowHeartbeatElapsed(details);
118970
119408
  const cadence = formatWorkflowHeartbeatCadence(details.intervalMinutes);
118971
- return `${WORKFLOW_HEARTBEAT_GLYPH} Workflow "${workflowName}" heartbeat (run ${details.runId}) — still running` + `${elapsed === undefined ? "" : ` after ${elapsed}`}, on a ${cadence} cadence. ` + "This is a periodic alignment check. Review whether the run is still on goal. " + "When steering or communication is useful, use Intercom. Consider the expanded workflow topology and match " + "each update's reach to its impact: send a local update to its affected stage; when shared scope or acceptance " + "criteria change, send the same authoritative Intercom update to every relevant live and known unstarted " + "`<runId>:<stageKey>`, including each worker-to-reviewer loop. Intercom delivers immediately to live stages and " + "queues updates for known stages that have not started, delivering them before their first model turn, so workers " + "and reviewers begin with one consistent contract. " + "Use `ask` once the target has a live session that can reply. " + "Use workflow pause, resume, interrupt, or quit for run control. " + "Continue the progressing run when no intervention is needed, or ask the user when a decision is needed. " + `Inspect: /workflow status ${details.runId}`;
119409
+ return `${WORKFLOW_HEARTBEAT_GLYPH} Workflow "${workflowName}" heartbeat (run ${details.runId}) — still running` + `${elapsed === undefined ? "" : ` after ${elapsed}`}, on a ${cadence} cadence. ` + "This is a periodic alignment check. Review whether the run is still on goal. " + "When steering or communication is useful, use Intercom. Before steering a stage, join its invocation group. " + "Use the Intercom `groups` action to discover it. Workflow invocation groups are named `workflow:<rootRunId>`. " + "Consider the expanded workflow topology and match each update's reach to its impact: send a local update to " + "its affected stage; when shared scope or acceptance " + "criteria change, send the same authoritative Intercom update to every relevant live and known unstarted " + "`<runId>:<stageKey>`, including each worker-to-reviewer loop. Intercom delivers immediately to live stages and " + "queues updates for known stages that have not started, delivering them before their first model turn, so workers " + "and reviewers begin with one consistent contract. " + "Use `ask` once the target has a live session that can reply. " + "Use workflow pause, resume, interrupt, or quit for run control. " + "Continue the progressing run when no intervention is needed, or ask the user when a decision is needed. " + `Inspect: /workflow status ${details.runId}`;
118972
119410
  }
118973
119411
  function registerWorkflowHeartbeatRenderer(options) {
118974
119412
  const register = options.registerMessageRenderer;
@@ -119638,6 +120076,9 @@ function workflowModelCatalogFromContext(ctx) {
119638
120076
  };
119639
120077
  }
119640
120078
 
120079
+ // dist/builtin/workflows/src/extension/workflow-ports.ts
120080
+ init_src();
120081
+
119641
120082
  // dist/builtin/workflows/src/extension/mcp.ts
119642
120083
  init_src();
119643
120084
  function setMcpScope(pi, opts) {
@@ -119672,19 +120113,30 @@ function clearMcpScope(pi, stageId) {
119672
120113
  }
119673
120114
 
119674
120115
  // dist/builtin/workflows/src/extension/workflow-ports.ts
120116
+ function unlessStale(append) {
120117
+ try {
120118
+ return append();
120119
+ } catch (error) {
120120
+ if (isStaleExtensionContextError(error))
120121
+ return;
120122
+ throw error;
120123
+ }
120124
+ }
119675
120125
  function makePersistencePort(pi, persistRuns) {
119676
120126
  if (!persistRuns)
119677
120127
  return;
119678
120128
  if (typeof pi.appendEntry !== "function")
119679
120129
  return;
119680
120130
  const port = {
119681
- appendEntry: (type, payload) => pi.appendEntry(type, payload)
120131
+ appendEntry: (type, payload) => unlessStale(() => pi.appendEntry(type, payload))
119682
120132
  };
119683
120133
  if (typeof pi.setLabel === "function") {
119684
- port.setLabel = (entryId, label) => pi.setLabel(entryId, label);
120134
+ port.setLabel = (entryId, label) => {
120135
+ unlessStale(() => pi.setLabel(entryId, label));
120136
+ };
119685
120137
  }
119686
120138
  if (typeof pi.appendCustomMessageEntry === "function") {
119687
- port.appendCustomMessageEntry = (content, meta2) => pi.appendCustomMessageEntry(content, meta2);
120139
+ port.appendCustomMessageEntry = (content, meta2) => unlessStale(() => pi.appendCustomMessageEntry(content, meta2));
119688
120140
  }
119689
120141
  return port;
119690
120142
  }
@@ -124506,7 +124958,7 @@ function renderResult(result, opts) {
124506
124958
  }
124507
124959
 
124508
124960
  // dist/builtin/workflows/src/extension/workflow-prompts.ts
124509
- var WORKFLOW_TOOL_DESCRIPTION = "Run named builtin, project, user, or package workflows; custom definitions may import reusable project/package workflows or builtin definitions from @bastani/atomic/workflows/builtin and nest them with ctx.workflow(...), including deeper composition within the configured maxDepth; " + "when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; after successfully creating and reloading a newly authored custom workflow, report the folder containing its generated code as 'Custom workflow created. You can inspect its code at: <workflow-folder-path>'; do this only for newly created custom workflows, never builtin or pre-existing workflows; " + "discover with list/get/inputs/models, list session runs with status (no runId; statusFilter narrows the list), inspect status/stages/stage details, " + "answer pending prompts only while the root workflow is nonterminal, pause/resume/interrupt/quit runs, and reload workflow resources. " + "When steering or communication is useful, use Intercom; address a workflow stage as `<runId>:<stageKey>`. Live delivery is immediate; a known stage that has not started is queued and receives the message before its first model turn. Use `ask` only for a reply-capable live session. " + "Treat a blocked run as continuable by default: resume resumable blocks, answer pending prompts, steer past the obstacle, or start a follow-up workflow past a terminal block, and escalate to the user only when the blocked result is so ambiguous that human input or steering must settle it; when ask_user_question or human input is unavailable, continue fully autonomously on the interpretation best supported by the objective and repository evidence, and record the assumption. " + "For action 'run' and 'resume', budget accepts per-field duration, token, cost, and warning overrides; fields resolve over the workflow declaration and config, and 0 disables a field. " + "Pass budget only when the user asked for a limit; otherwise omit it entirely and inherit the declaration and config rather than inventing a cap. " + "For primitive prompt answers, use booleans or the documented confirm labels, exact case-insensitive select labels or 1-based indexes, and text strings for input/editor; an invalid answer remains pending and returns guidance instead of choosing a default. " + "For large stage handoffs, write context to files/artifacts, pass paths via reads, and prompt downstream agents to 'Read the file at <path>...' instead of injecting large previous text. " + "Wrap critical parts of run inputs and steering messages in <keepContext>...</keepContext> so compaction preserves them verbatim in the stages that inherit them; tag role constraints, prohibitions, must-hold criteria, and identifiers, not background or bulk reference material. " + "For transcripts, prefer status/stages/stage to get sessionFile/transcriptPath, " + "quote the exact path without rewriting separators (Windows backslashes are valid), " + "then search it with rg/grep and read small ranges; transcript is path-only by default when sessionFile/transcriptPath exists, explicit tail/limit returns bounded previews, and missing transcript paths fall back to a small preview. " + "Use action 'models' to inspect models in the configured catalog; the result is a configured-auth snapshot showing what's present in the registry with configured authentication, not proof of credentials, entitlements, OAuth freshness, or live provider access. " + "When authoring a workflow that should dynamically select a model, first call workflow({ action: 'models' }) to inspect the configured catalog, then select from the returned provider/id entries considering the isCurrent marker and available thinking levels.";
124961
+ var WORKFLOW_TOOL_DESCRIPTION = "Run named builtin, project, user, or package workflows; custom definitions may import reusable project/package workflows or builtin definitions from @bastani/atomic/workflows/builtin and nest them with ctx.workflow(...), including deeper composition within the configured maxDepth; " + "when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; after successfully creating and reloading a newly authored custom workflow, report the folder containing its generated code as 'Custom workflow created. You can inspect its code at: <workflow-folder-path>'; do this only for newly created custom workflows, never builtin or pre-existing workflows; " + "discover with list/get/inputs/models, list session runs with status (no runId; statusFilter narrows the list), inspect status/stages/stage details, " + "answer pending prompts only while the root workflow is nonterminal, pause/resume/interrupt/quit runs, and reload workflow resources. " + "When steering or communication is useful, use Intercom. Before steering a stage, join its invocation group. Use the Intercom `groups` action to discover it. Workflow invocation groups are named `workflow:<rootRunId>`. Then address the stage as `<runId>:<stageKey>`. Live delivery is immediate; a known stage that has not started is queued and receives the message before its first model turn. Use `ask` only for a reply-capable live session. " + "Treat a blocked run as continuable by default: resume resumable blocks, answer pending prompts, steer past the obstacle, or start a follow-up workflow past a terminal block, and escalate to the user only when the blocked result is so ambiguous that human input or steering must settle it; when ask_user_question or human input is unavailable, continue fully autonomously on the interpretation best supported by the objective and repository evidence, and record the assumption. " + "For action 'run' and 'resume', budget accepts per-field duration, token, cost, and warning overrides; fields resolve over the workflow declaration and config, and 0 disables a field. " + "Pass budget only when the user asked for a limit; otherwise omit it entirely and inherit the declaration and config rather than inventing a cap. " + "For primitive prompt answers, use booleans or the documented confirm labels, exact case-insensitive select labels or 1-based indexes, and text strings for input/editor; an invalid answer remains pending and returns guidance instead of choosing a default. " + "For large stage handoffs, write context to files/artifacts, pass paths via reads, and prompt downstream agents to 'Read the file at <path>...' instead of injecting large previous text. " + "Wrap critical parts of run inputs and steering messages in <keepContext>...</keepContext> so compaction preserves them verbatim in the stages that inherit them; tag role constraints, prohibitions, must-hold criteria, and identifiers, not background or bulk reference material. " + "For transcripts, prefer status/stages/stage to get sessionFile/transcriptPath, " + "quote the exact path without rewriting separators (Windows backslashes are valid), " + "then search it with rg/grep and read small ranges; transcript is path-only by default when sessionFile/transcriptPath exists, explicit tail/limit returns bounded previews, and missing transcript paths fall back to a small preview. " + "Use action 'models' to inspect models in the configured catalog; the result is a configured-auth snapshot showing what's present in the registry with configured authentication, not proof of credentials, entitlements, OAuth freshness, or live provider access. " + "When authoring a workflow that should dynamically select a model, first call workflow({ action: 'models' }) to inspect the configured catalog, then select from the returned provider/id entries considering the isCurrent marker and available thinking levels.";
124510
124962
  var DEFAULT_PROMPT_GUIDANCE = [
124511
124963
  `**Workflows**: Treat workflows as the default execution path for any non-trivial task and for any request that has inherent structure plus an objective you can make verifiable. Use the \`workflow\` tool for existing named workflows; when the task needs a graph that is not installed, author a custom TypeScript \`workflow({...})\` inline with normal coding tools, reload workflow resources, and run it.
124512
124964
  - Workflow fit check: prefer a workflow for implementation, build, debug/diagnosis, bug-fix, migration, new-feature, scoped multi-file, or docs/code changes with validation; and whenever there are multiple steps, dependencies, handoffs, uncertainty, review/validation needs, long-running work, measurable done criteria, or an outcome that needs evidence.
@@ -124542,7 +124994,7 @@ var DEFAULT_PROMPT_GUIDANCE = [
124542
124994
  - Wrap critical parts of the \`inputs\` you pass — objective, prompt, acceptance criteria — in \`<keepContext>\` / \`</keepContext>\`. Tagged text survives compaction verbatim regardless of the compression ratio, and stages inherit it because workflows inject your inputs into their prompts. A long stage is compacted repeatedly, and compaction ranks lines individually: a verbose restated objective outlives the one line that bounds it, so a stage can end up executing a coherent but unbounded version of what you asked for. Decide this per launch rather than tagging everything — tag role constraints, prohibitions, must-hold criteria, and identifiers such as a target branch, worktree path, or issue number; leave background, quoted issue text, and reference material untagged and pass bulk through files and \`reads\`. Protected lines count against the keep target rather than raising it, so an over-tagged input makes the evidence stages need compress harder.
124543
124995
  - Tag steering the same way. An Intercom \`send\` amendment is authoritative and stages must carry it forward, but it arrives late in an already-long session and is exactly one short message competing with the whole transcript; \`<keepContext>\` around the requirement keeps it from being compacted away before the stage acts on it.
124544
124996
  - In interactive chat, named workflow launches run in the background. Run \`/workflow connect <run>\` to see agents working and chat with and steer each stage. Inspection and control calls (\`status\`, \`stages\`, \`stage\`, \`transcript\`, \`answer\`, \`pause\`, \`resume\`, \`interrupt\`, \`quit\`) remain available while work runs.
124545
- - \`workflow answer\` handles a pending human-input prompt. Send free-form updates through Intercom to \`<runId>:<stageKey>\`; Atomic delivers immediately to live stages and queues messages for known stages that have not started, delivering them before their first model turn. Use \`ask\` once the target has a live session that can reply. Use explicit \`/workflow attach <run> <stage>\` for user-driven post-mortem chat.
124997
+ - \`workflow answer\` handles a pending human-input prompt. Before steering a stage, join its invocation group. Use the Intercom \`groups\` action to discover it. Workflow invocation groups are named \`workflow:<rootRunId>\`. Send free-form updates through Intercom to \`<runId>:<stageKey>\`; Atomic delivers immediately to live stages and queues messages for known stages that have not started, delivering them before their first model turn. Use \`ask\` once the target has a live session that can reply. Use explicit \`/workflow attach <run> <stage>\` for user-driven post-mortem chat.
124546
124998
  - A blocked run is a changed condition, not a stop order. On a blocked status or a WORKFLOW BLOCKED lifecycle notice, keep the work moving by default: resume a resumable block, answer the pending prompt, steer the stage past the obstacle, or start a follow-up workflow that carries the remaining tracked work past a terminal block — continue inline only if the remaining work is minimal. Stop for user input only when the task is so ambiguous that competing interpretations lead to materially different outcomes and judgment cannot infer intent from the stated objective and repository evidence; then ask one grouped question or wait for steering.
124547
124999
  - A budget-exceeded stop (the resumable \`budget_exceeded\` blocked rail) is the exception: the exhausted budget is a boundary someone chose, so do not raise it silently. Summarize progress and the estimated next steps, ask the user whether to proceed — prefer the \`ask_user_question\` tool when it is available — and resume with a raised \`budget\` only after approval.
124548
125000
  - When human input is unavailable — \`ask_user_question\` is not among your tools, the session is headless, or nobody answers — do not stall on a question. Choose the interpretation best supported by the stated objective and repository evidence — mine git history, commits, PRs, issues, and the user's own comments to infer how they would decide — record the assumption and rationale in the result or an artifact, and continue fully autonomously on best judgment.
@@ -124564,7 +125016,7 @@ var DEFAULT_PROMPT_GUIDANCE = [
124564
125016
  - Cyclic workflow graphs are unsupported. Workflow authors and coding agents MUST NOT create self-edges or dependency edges from the current frontier to an existing ancestor. Every materialized execution topology must remain a DAG. Redesign or stop before launch if a cycle cannot be removed.
124565
125017
  - Bounded loops must create distinct tracked work for every iteration; never reopen an ancestor below its downstream work. Stacked implementation slices are unrolled, not looped: each slice gets a fresh child boundary and distinct tracked nodes, and no slice may add an edge back to the current frontier, itself, or an ancestor. If a retained session receives follow-up without new dependency work, keep it as non-topological activity metadata rather than adding a back-edge. Before launch, sketch nodes and dependencies for every branch and loop and reject any proposed parent edge to the node itself or an ancestor.
124566
125018
  - Treat dynamic graph validation during execution, replay, and DBOS hydration as the authoritative cycle boundary. If runtime topology code changes, require incremental edge checks and DBOS hydration validation; prompt guidance and TypeScript types cannot replace those runtime checks.
124567
- - Every workflow invocation automatically receives one stable, non-default Intercom group. Intercom-capable stages inherit it, nested workflows keep the top-level invocation group, and subagents inherit their launching stage's group. Do not mint or thread group names through ordinary workflow definitions. Use an explicit \`group\` only for an intentional override: a named group or \`group: true\` creates a subgroup, while \`group: "default"\` opts into the shared default group. Stages without Intercom access receive no group, and \`contact_supervisor\` still crosses group boundaries for authorized escalation.
125019
+ - Every workflow invocation automatically receives one stable, non-default Intercom group named \`workflow:<rootRunId>\`. Every model stage inherits it because ordinary \`intercom\` is mandatory even under tool and extension restrictions; nested workflows keep the top-level invocation group, and subagents inherit their launching stage's group. Do not mint or thread group names through ordinary workflow definitions. Use an explicit \`group\` only for an intentional override: a named group or \`group: true\` creates a subgroup, while \`group: "default"\` opts into the shared default group. \`contact_supervisor\` still crosses group boundaries only for authorized subagent escalation.
124568
125020
  - Prefer \`ctx.tool(name, args, fn)\` for workflow-owned TypeScript operations with side effects, such as filesystem writes, network mutations, and external API actions. It creates a tracked, non-attachable durable graph node before invoking \`fn\`; it may be used before, between, after, or without model stages. A completed \`ctx.tool\` call is durably checkpointed with its serializable result, so resume replays that result without rerunning \`fn\`. For checks that may fail during a bounded repair loop, opt into \`failureMode: "return"\`, branch on the typed outcome, and pass only the needed error fields to the repair stage or artifact yourself; Atomic does not inject failure evidence into later prompts. Retries do not bound a hung callback, so every \`ctx.tool\` callback that starts a child process or performs network I/O MUST set an explicit positive finite \`timeoutMs\` and forward the supplied \`signal\` to cancellable work. A timeout applies per attempt, aborts that attempt's signal, and gives retries a fresh deadline and signal. Cancellation and storage faults still throw. Keep pure computation and side-effect-free transformations as ordinary TypeScript. Do not wrap agent-stage internals or every function call indiscriminately; this rule applies to side effects orchestrated directly by the workflow definition.
124569
125021
  - Pass large stage context through files/artifacts and \`reads\` with an explicit \`Read the file at <path>...\` prompt rather than large \`previous\` payloads or injected session history.
124570
125022
  - Wrap critical stage-prompt content in \`<keepContext>\` / \`</keepContext>\`. Tagged content survives compression verbatim regardless of the compression ratio, and every line of the span including the tag lines is protected. A long-running stage will be compacted, and compaction ranks lines individually: an objective is verbose and restated while the constraint that narrows it is usually one line, so the constraint is the cheaper deletion and what survives reads as broader permission than intended. Tag role constraints that bound a stage to part of the work, acceptance criteria and immutable contracts, explicit prohibitions, and identifiers a stage must not lose such as a target branch, worktree path, or run ID. Do not tag bulk context: protected lines count against the keep target rather than raising it, so a large protected span makes the surrounding transcript compress harder — tag the constraint, not the material it applies to.