@bastani/atomic 0.9.16-alpha.7 → 0.9.16-alpha.9

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 (226) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/README.md +4 -4
  4. package/dist/builtin/intercom/broker/broker.ts +617 -22
  5. package/dist/builtin/intercom/broker/client-message-validation.ts +9 -0
  6. package/dist/builtin/intercom/broker/client.ts +200 -10
  7. package/dist/builtin/intercom/broker/pending-send-registry.ts +4 -0
  8. package/dist/builtin/intercom/broker/send-handler.ts +90 -36
  9. package/dist/builtin/intercom/broker/send-signature.ts +20 -8
  10. package/dist/builtin/intercom/group.ts +85 -0
  11. package/dist/builtin/intercom/index.bundle.mjs +746 -55
  12. package/dist/builtin/intercom/package.json +1 -1
  13. package/dist/builtin/intercom/session-target.ts +54 -0
  14. package/dist/builtin/intercom/skills/intercom/SKILL.md +18 -3
  15. package/dist/builtin/intercom/source-ownership.ts +31 -0
  16. package/dist/builtin/intercom/types.ts +115 -0
  17. package/dist/builtin/mcp/index.bundle.mjs +175 -37
  18. package/dist/builtin/mcp/package.json +1 -1
  19. package/dist/builtin/subagents/package.json +1 -1
  20. package/dist/builtin/subagents/src/extension/index.bundle.mjs +239 -53
  21. package/dist/builtin/web-access/index.bundle.mjs +175 -37
  22. package/dist/builtin/web-access/package.json +1 -1
  23. package/dist/builtin/workflows/CHANGELOG.md +15 -0
  24. package/dist/builtin/workflows/README.md +40 -37
  25. package/dist/builtin/workflows/builtin/adversarial-verification.js +13 -0
  26. package/dist/builtin/workflows/builtin/{shared-prompts.ts → chunk-0x6e303p.js} +133 -154
  27. package/dist/builtin/workflows/builtin/chunk-17zk6ffd.js +69794 -0
  28. package/dist/builtin/workflows/builtin/chunk-29wrp38a.js +199 -0
  29. package/dist/builtin/workflows/builtin/chunk-2dqb5s2q.js +602 -0
  30. package/dist/builtin/workflows/builtin/chunk-4febxsv4.js +264 -0
  31. package/dist/builtin/workflows/builtin/chunk-5wgwscd0.js +4 -0
  32. package/dist/builtin/workflows/builtin/chunk-6fqs7c01.js +155 -0
  33. package/dist/builtin/workflows/builtin/chunk-7430zyas.js +126 -0
  34. package/dist/builtin/workflows/builtin/chunk-7at6dnkr.js +33 -0
  35. package/dist/builtin/workflows/builtin/chunk-82ha8p41.js +175 -0
  36. package/dist/builtin/workflows/builtin/chunk-8v8wmb7z.js +529 -0
  37. package/dist/builtin/workflows/builtin/chunk-bfkmzv9h.js +156 -0
  38. package/dist/builtin/workflows/builtin/chunk-c53y8bdh.js +345 -0
  39. package/dist/builtin/workflows/builtin/chunk-cg9tmks0.js +206 -0
  40. package/dist/builtin/workflows/builtin/chunk-h5e65g7g.js +1080 -0
  41. package/dist/builtin/workflows/builtin/chunk-hzzn6adg.js +221 -0
  42. package/dist/builtin/workflows/builtin/chunk-nqr34qp3.js +1061 -0
  43. package/dist/builtin/workflows/builtin/chunk-qe6bfpbd.js +1207 -0
  44. package/dist/builtin/workflows/builtin/chunk-qwzvgxnq.js +404 -0
  45. package/dist/builtin/workflows/builtin/chunk-qx2ptjs3.js +215 -0
  46. package/dist/builtin/workflows/builtin/chunk-rbnj9621.js +2447 -0
  47. package/dist/builtin/workflows/builtin/chunk-wpckd35c.js +12 -0
  48. package/dist/builtin/workflows/builtin/chunk-x2ghn0je.js +4110 -0
  49. package/dist/builtin/workflows/builtin/classify-and-act.js +12 -0
  50. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +10 -0
  51. package/dist/builtin/workflows/builtin/generate-and-filter.js +12 -0
  52. package/dist/builtin/workflows/builtin/goal.js +16 -0
  53. package/dist/builtin/workflows/builtin/index.js +49 -0
  54. package/dist/builtin/workflows/builtin/loop-until-done.js +12 -0
  55. package/dist/builtin/workflows/builtin/open-claude-design.js +11 -0
  56. package/dist/builtin/workflows/builtin/ralph.js +16 -0
  57. package/dist/builtin/workflows/builtin/steering-context.d.ts +6 -0
  58. package/dist/builtin/workflows/builtin/steering-context.js +7 -0
  59. package/dist/builtin/workflows/builtin/tournament.js +13 -0
  60. package/dist/builtin/workflows/package.json +10 -7
  61. package/dist/builtin/workflows/src/authoring/typebox-defaults.d.ts +41 -0
  62. package/dist/builtin/workflows/src/extension/index.bundle.mjs +1294 -430
  63. package/dist/builtin/workflows/src/{index.bundle.mjs → index.js} +1022 -429
  64. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +403 -0
  65. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +327 -0
  66. package/dist/builtin/workflows/src/shared/budget.d.ts +67 -0
  67. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +60 -0
  68. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
  69. package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -1
  70. package/dist/core/agent-session-custom-message-commit.js +12 -5
  71. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  72. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
  73. package/dist/core/agent-session-persistent-custom-messages.js +2 -0
  74. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  75. package/dist/core/agent-session.d.ts.map +1 -1
  76. package/dist/core/agent-session.js +2 -1
  77. package/dist/core/agent-session.js.map +1 -1
  78. package/dist/core/auth-storage.d.ts +2 -0
  79. package/dist/core/auth-storage.d.ts.map +1 -1
  80. package/dist/core/auth-storage.js +4 -0
  81. package/dist/core/auth-storage.js.map +1 -1
  82. package/dist/core/builtin-install-layout.d.ts +1 -1
  83. package/dist/core/builtin-install-layout.d.ts.map +1 -1
  84. package/dist/core/builtin-install-layout.js +1 -1
  85. package/dist/core/builtin-install-layout.js.map +1 -1
  86. package/dist/core/codex-fast-mode.d.ts +10 -7
  87. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  88. package/dist/core/codex-fast-mode.js +31 -13
  89. package/dist/core/codex-fast-mode.js.map +1 -1
  90. package/dist/core/extensions/agent-events.d.ts +15 -0
  91. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  92. package/dist/core/extensions/agent-events.js.map +1 -1
  93. package/dist/core/extensions/api-types.d.ts +3 -1
  94. package/dist/core/extensions/api-types.d.ts.map +1 -1
  95. package/dist/core/extensions/api-types.js.map +1 -1
  96. package/dist/core/extensions/context-types.d.ts +35 -0
  97. package/dist/core/extensions/context-types.d.ts.map +1 -1
  98. package/dist/core/extensions/context-types.js.map +1 -1
  99. package/dist/core/extensions/event-types.d.ts +2 -2
  100. package/dist/core/extensions/event-types.d.ts.map +1 -1
  101. package/dist/core/extensions/event-types.js.map +1 -1
  102. package/dist/core/extensions/index.d.ts +1 -1
  103. package/dist/core/extensions/index.d.ts.map +1 -1
  104. package/dist/core/extensions/index.js.map +1 -1
  105. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  106. package/dist/core/extensions/loader-virtual-modules.js +6 -1
  107. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  108. package/dist/core/extensions/runner.d.ts +6 -0
  109. package/dist/core/extensions/runner.d.ts.map +1 -1
  110. package/dist/core/extensions/runner.js +65 -1
  111. package/dist/core/extensions/runner.js.map +1 -1
  112. package/dist/core/model-runtime.d.ts +2 -0
  113. package/dist/core/model-runtime.d.ts.map +1 -1
  114. package/dist/core/model-runtime.js +4 -0
  115. package/dist/core/model-runtime.js.map +1 -1
  116. package/dist/core/runtime-credentials.d.ts +1 -0
  117. package/dist/core/runtime-credentials.d.ts.map +1 -1
  118. package/dist/core/runtime-credentials.js +8 -0
  119. package/dist/core/runtime-credentials.js.map +1 -1
  120. package/dist/core/sdk.d.ts.map +1 -1
  121. package/dist/core/sdk.js +5 -5
  122. package/dist/core/sdk.js.map +1 -1
  123. package/dist/core/session-manager-storage.d.ts +2 -0
  124. package/dist/core/session-manager-storage.d.ts.map +1 -1
  125. package/dist/core/session-manager-storage.js +4 -2
  126. package/dist/core/session-manager-storage.js.map +1 -1
  127. package/dist/core/slash-commands.js +1 -1
  128. package/dist/core/slash-commands.js.map +1 -1
  129. package/dist/core/workflow-stage-admission.d.ts +6 -1
  130. package/dist/core/workflow-stage-admission.d.ts.map +1 -1
  131. package/dist/core/workflow-stage-admission.js +8 -9
  132. package/dist/core/workflow-stage-admission.js.map +1 -1
  133. package/dist/index-extensions.d.ts +1 -1
  134. package/dist/index-extensions.d.ts.map +1 -1
  135. package/dist/index-extensions.js.map +1 -1
  136. package/dist/index.d.ts +0 -1
  137. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  138. package/dist/modes/interactive/components/footer.js +1 -1
  139. package/dist/modes/interactive/components/footer.js.map +1 -1
  140. package/dist/modes/interactive/interactive-autocomplete.js +1 -1
  141. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  142. package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
  143. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  144. package/dist/modes/interactive/interactive-startup.js +1 -1
  145. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  146. package/dist/modes/interactive-engine/isolated-runtime.d.ts +4 -0
  147. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  148. package/dist/modes/interactive-engine/isolated-runtime.js +69 -10
  149. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  150. package/dist/modes/rpc/rpc-client-api.d.ts +18 -2
  151. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  152. package/dist/modes/rpc/rpc-client-api.js +33 -5
  153. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  154. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  155. package/dist/modes/rpc/rpc-command-handler.js +8 -4
  156. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  157. package/dist/modes/rpc/rpc-types.d.ts +13 -0
  158. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  159. package/dist/modes/rpc/rpc-types.js.map +1 -1
  160. package/docs/extensions.md +19 -0
  161. package/docs/intercom.md +15 -6
  162. package/docs/packages.md +2 -2
  163. package/docs/providers.md +8 -3
  164. package/docs/quickstart.md +2 -2
  165. package/docs/rpc.md +21 -4
  166. package/docs/settings.md +6 -4
  167. package/docs/subagents.md +1 -1
  168. package/docs/usage.md +1 -1
  169. package/docs/workflows.md +108 -239
  170. package/npm-shrinkwrap.json +32 -32
  171. package/package.json +9 -13
  172. package/dist/builtin/workflows/ambient.d.ts +0 -61
  173. package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +0 -26
  174. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +0 -391
  175. package/dist/builtin/workflows/builtin/adversarial-verification.ts +0 -34
  176. package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +0 -14
  177. package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +0 -108
  178. package/dist/builtin/workflows/builtin/classify-and-act.ts +0 -40
  179. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +0 -14
  180. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +0 -96
  181. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +0 -37
  182. package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +0 -41
  183. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +0 -90
  184. package/dist/builtin/workflows/builtin/generate-and-filter.ts +0 -31
  185. package/dist/builtin/workflows/builtin/goal-artifacts.ts +0 -64
  186. package/dist/builtin/workflows/builtin/goal-convergence.ts +0 -87
  187. package/dist/builtin/workflows/builtin/goal-ledger.ts +0 -139
  188. package/dist/builtin/workflows/builtin/goal-models.ts +0 -72
  189. package/dist/builtin/workflows/builtin/goal-orchestrator-prompts.ts +0 -94
  190. package/dist/builtin/workflows/builtin/goal-prompts.ts +0 -217
  191. package/dist/builtin/workflows/builtin/goal-reducer.ts +0 -176
  192. package/dist/builtin/workflows/builtin/goal-reports.ts +0 -76
  193. package/dist/builtin/workflows/builtin/goal-reverify.ts +0 -305
  194. package/dist/builtin/workflows/builtin/goal-review.ts +0 -139
  195. package/dist/builtin/workflows/builtin/goal-runner.ts +0 -504
  196. package/dist/builtin/workflows/builtin/goal-schemas.ts +0 -89
  197. package/dist/builtin/workflows/builtin/goal-types.ts +0 -164
  198. package/dist/builtin/workflows/builtin/goal.ts +0 -78
  199. package/dist/builtin/workflows/builtin/index.ts +0 -16
  200. package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +0 -87
  201. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +0 -282
  202. package/dist/builtin/workflows/builtin/loop-until-done.ts +0 -51
  203. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +0 -305
  204. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +0 -337
  205. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +0 -347
  206. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +0 -313
  207. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -311
  208. package/dist/builtin/workflows/builtin/open-claude-design.ts +0 -57
  209. package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +0 -28
  210. package/dist/builtin/workflows/builtin/progress-scoring.ts +0 -230
  211. package/dist/builtin/workflows/builtin/ralph-core.ts +0 -449
  212. package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +0 -100
  213. package/dist/builtin/workflows/builtin/ralph-models.ts +0 -183
  214. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +0 -103
  215. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +0 -104
  216. package/dist/builtin/workflows/builtin/ralph-runner.ts +0 -459
  217. package/dist/builtin/workflows/builtin/ralph.ts +0 -82
  218. package/dist/builtin/workflows/builtin/review-convergence.ts +0 -229
  219. package/dist/builtin/workflows/builtin/selection-math.ts +0 -156
  220. package/dist/builtin/workflows/builtin/steering-context.ts +0 -51
  221. package/dist/builtin/workflows/builtin/tournament-prompts.ts +0 -70
  222. package/dist/builtin/workflows/builtin/tournament-runner.ts +0 -400
  223. package/dist/builtin/workflows/builtin/tournament.ts +0 -73
  224. package/dist/builtin/workflows/builtin/verification-criteria.ts +0 -330
  225. package/dist/builtin/workflows/builtin/verification-prompts.ts +0 -206
  226. package/dist/builtin/workflows/builtin/verification-usage.ts +0 -44
@@ -3860,10 +3860,10 @@ function hasAssistantMessage(entries) {
3860
3860
  return entries.some((entry) => entry.type === "message" && entry.message.role === "assistant");
3861
3861
  }
3862
3862
  function persistAppendedEntry(filePath, entries, entry, flushed) {
3863
- if (!hasAssistantMessage(entries))
3864
- return false;
3865
3863
  if (flushed)
3866
3864
  appendSessionEntry(filePath, entry);
3865
+ else if (!hasAssistantMessage(entries))
3866
+ return false;
3867
3867
  else
3868
3868
  appendSessionEntries(filePath, entries);
3869
3869
  return true;
@@ -9931,6 +9931,8 @@ function appendDurableDisplayCard(session, message, delivery) {
9931
9931
  const card = { ...message, excludeFromContext: true };
9932
9932
  const admitted = message;
9933
9933
  const intentEntryId = session.sessionManager.appendCustomMessageEntry(card.customType, card.content, card.display, card.details, true, { delivery }, admitted.stageAdmissionKey);
9934
+ if (admitted.stageAdmissionKey !== undefined)
9935
+ session.sessionManager.flush();
9934
9936
  session.agent.state.messages.push(card);
9935
9937
  return { card, intentEntryId };
9936
9938
  }
@@ -10156,12 +10158,17 @@ var init_agent_session_persistent_custom_messages = __esm(() => {
10156
10158
  });
10157
10159
 
10158
10160
  // src/core/agent-session-custom-message-commit.ts
10161
+ function appendDurableStageAdmission(session, message) {
10162
+ session._appendCustomMessage(message);
10163
+ if (message.stageAdmissionKey !== undefined)
10164
+ session.sessionManager?.flush();
10165
+ }
10159
10166
  async function commitAdmittedCustomMessage(session, appMessage, options) {
10160
10167
  const owner = resolveWorkflowStageDeliveryTarget(session);
10161
10168
  if (owner !== session)
10162
10169
  return commitAdmittedCustomMessage(owner, appMessage, options);
10163
10170
  const self = session;
10164
- const useProtectedReconciliation = options?.persistWhenStreaming === true && options.triggerTurn === true && options.excludeFromContext !== true;
10171
+ const useProtectedReconciliation = options?.persistWhenStreaming === true && options.excludeFromContext !== true && (options.triggerTurn === true || options.stageAdmissionKey !== undefined);
10165
10172
  if (options?.deliverAs === "nextTurn") {
10166
10173
  self._pendingNextTurnMessages.push(appMessage);
10167
10174
  } else if (self._queuedMessagesPaused) {
@@ -10175,20 +10182,20 @@ async function commitAdmittedCustomMessage(session, appMessage, options) {
10175
10182
  } else if (self.isStreaming) {
10176
10183
  self._pendingCustomMessages.push(appMessage);
10177
10184
  } else {
10178
- self._appendCustomMessage(appMessage);
10185
+ appendDurableStageAdmission(self, appMessage);
10179
10186
  }
10180
10187
  } else if (options?.deliverAs === "interrupt" && options.triggerTurn) {
10181
10188
  const interrupt = self._enqueueInterruptCustomMessage(appMessage, options);
10182
10189
  self._workflowStageAdmission?.trackAdmittedWork(interrupt);
10183
10190
  interrupt.catch(() => {});
10184
10191
  } else if (self.isStreaming && options?.excludeFromContext === true && options.triggerTurn !== true && options.deliverAs === undefined) {
10185
- self._appendCustomMessage(appMessage);
10192
+ appendDurableStageAdmission(self, appMessage);
10186
10193
  } else if (self.isStreaming && options?.triggerTurn === false) {
10187
10194
  self._pendingCustomMessages.push(appMessage);
10188
10195
  } else if (self.isStreaming && useProtectedReconciliation) {
10189
10196
  await queueProtectedStreamingCustomMessage(self, appMessage, options?.deliverAs === "followUp" ? "followUp" : "steer");
10190
10197
  } else if (self.isStreaming && options?.persistWhenStreaming === true) {
10191
- self._appendCustomMessage(appMessage);
10198
+ appendDurableStageAdmission(self, appMessage);
10192
10199
  } else if (self.isStreaming && options?.triggerTurn !== false) {
10193
10200
  self._queueAgentMessage(appMessage, options?.deliverAs === "followUp" ? "followUp" : "steer");
10194
10201
  } else if (options?.triggerTurn) {
@@ -10211,7 +10218,7 @@ async function commitAdmittedCustomMessage(session, appMessage, options) {
10211
10218
  self._continueQueuedAgentMessages().catch(() => {});
10212
10219
  }
10213
10220
  } else {
10214
- self._appendCustomMessage(appMessage);
10221
+ appendDurableStageAdmission(self, appMessage);
10215
10222
  }
10216
10223
  }
10217
10224
  function _commitAdmittedCustomMessage(appMessage, options) {
@@ -12235,6 +12242,8 @@ class ExtensionRunner {
12235
12242
  shortcutDiagnostics = [];
12236
12243
  commandDiagnostics = [];
12237
12244
  staleMessage;
12245
+ uiPromptBinding = 0;
12246
+ activeUIPrompt;
12238
12247
  constructor(extensions, runtime, cwd, sessionManager, modelRegistry, orchestrationContext, subagentPolicy) {
12239
12248
  this.extensions = extensions;
12240
12249
  this.runtime = runtime;
@@ -12329,9 +12338,71 @@ class ExtensionRunner {
12329
12338
  this.reloadHandler = async () => {};
12330
12339
  }
12331
12340
  setUIContext(uiContext, mode = "print") {
12332
- this.uiContext = uiContext ?? noOpUIContext;
12341
+ this.endActiveUIPrompt();
12342
+ const binding = ++this.uiPromptBinding;
12343
+ this.uiContext = uiContext ? this.wrapUIPromptContext(uiContext, binding) : noOpUIContext;
12333
12344
  this.mode = mode;
12334
12345
  }
12346
+ wrapUIPromptContext(ui, binding) {
12347
+ return {
12348
+ ...ui,
12349
+ select: (title, options, opts) => this.withUIPrompt(binding, "select", title, () => ui.select(title, options, opts)),
12350
+ confirm: (title, message, opts) => this.withUIPrompt(binding, "confirm", title, () => ui.confirm(title, message, opts)),
12351
+ input: (title, placeholder, opts) => this.withUIPrompt(binding, "input", title, () => ui.input(title, placeholder, opts)),
12352
+ editor: (title, prefill, opts) => this.withUIPrompt(binding, "editor", title, () => ui.editor(title, prefill, opts)),
12353
+ custom: (factory, options) => this.withUIPrompt(binding, "custom", undefined, () => ui.custom(factory, options))
12354
+ };
12355
+ }
12356
+ withUIPrompt(binding, kind, title, run) {
12357
+ if (binding !== this.uiPromptBinding)
12358
+ return run();
12359
+ let prompt = this.activeUIPrompt;
12360
+ if (!prompt) {
12361
+ prompt = { depth: 0, kind, title };
12362
+ this.activeUIPrompt = prompt;
12363
+ this.emitUIPromptEvent({
12364
+ type: "ui_prompt_start",
12365
+ reason: "ui_prompt",
12366
+ kind,
12367
+ ...title === undefined ? {} : { title }
12368
+ });
12369
+ }
12370
+ prompt.depth += 1;
12371
+ let finished = false;
12372
+ const finish = () => {
12373
+ if (finished)
12374
+ return;
12375
+ finished = true;
12376
+ if (this.activeUIPrompt !== prompt)
12377
+ return;
12378
+ prompt.depth -= 1;
12379
+ if (prompt.depth === 0)
12380
+ this.endActiveUIPrompt(prompt);
12381
+ };
12382
+ try {
12383
+ return run().finally(finish);
12384
+ } catch (error) {
12385
+ finish();
12386
+ throw error;
12387
+ }
12388
+ }
12389
+ endActiveUIPrompt(prompt = this.activeUIPrompt) {
12390
+ if (!prompt || this.activeUIPrompt !== prompt)
12391
+ return;
12392
+ this.activeUIPrompt = undefined;
12393
+ prompt.depth = 0;
12394
+ this.emitUIPromptEvent({
12395
+ type: "ui_prompt_end",
12396
+ reason: "ui_prompt",
12397
+ kind: prompt.kind,
12398
+ ...prompt.title === undefined ? {} : { title: prompt.title }
12399
+ });
12400
+ }
12401
+ emitUIPromptEvent(event) {
12402
+ queueMicrotask(() => {
12403
+ this.emit(event);
12404
+ });
12405
+ }
12335
12406
  getUIContext() {
12336
12407
  return this.uiContext;
12337
12408
  }
@@ -21613,11 +21684,20 @@ import {
21613
21684
  function isCodexFastModeSupportedProvider(provider) {
21614
21685
  return provider === "openai" || provider === "openai-codex";
21615
21686
  }
21616
- function isCodexFastModeSupportedModel(model) {
21617
- return isCodexFastModeSupportedProvider(model.provider) || model.api === "openai-codex-responses";
21687
+ function isGitHubCopilotModel(model) {
21688
+ return model.provider === "github-copilot";
21689
+ }
21690
+ function isGitHubCopilotFastModeSupportedModel(model, credential) {
21691
+ if (!isGitHubCopilotModel(model) || credential?.type !== "oauth")
21692
+ return false;
21693
+ const fastModelIds = credential.fastModelIds;
21694
+ return Array.isArray(fastModelIds) && fastModelIds.every((modelId) => typeof modelId === "string") && fastModelIds.includes(`${model.id}-fast`);
21695
+ }
21696
+ function isCodexFastModeSupportedModel(model, copilotCredential) {
21697
+ return isCodexFastModeSupportedProvider(model.provider) || model.api === "openai-codex-responses" || model.id !== undefined && isGitHubCopilotFastModeSupportedModel({ provider: model.provider, id: model.id }, copilotCredential);
21618
21698
  }
21619
- function hasSupportedCodexFastModeModel(models) {
21620
- return models.some(isCodexFastModeSupportedModel);
21699
+ function hasSupportedCodexFastModeModel(models, copilotCredential) {
21700
+ return models.some((model) => isCodexFastModeSupportedModel(model, copilotCredential));
21621
21701
  }
21622
21702
  function isWorkflowStageOrchestrationContext(context) {
21623
21703
  return context?.kind === "workflow-stage";
@@ -21628,11 +21708,11 @@ function getCodexFastModeScope(context) {
21628
21708
  function isCodexFastModeEnabledForScope(settings, scope) {
21629
21709
  return settings[scope];
21630
21710
  }
21631
- function shouldApplyCodexFastModeForScope(model, settings, scope) {
21632
- return isCodexFastModeSupportedModel(model) && isCodexFastModeEnabledForScope(settings, scope);
21711
+ function shouldApplyCodexFastModeForScope(model, settings, scope, copilotCredential) {
21712
+ return isCodexFastModeSupportedModel(model, copilotCredential) && isCodexFastModeEnabledForScope(settings, scope);
21633
21713
  }
21634
- function shouldApplyCodexFastMode(model, settings, context) {
21635
- return shouldApplyCodexFastModeForScope(model, settings, getCodexFastModeScope(context));
21714
+ function shouldApplyCodexFastMode(model, settings, context, copilotCredential) {
21715
+ return shouldApplyCodexFastModeForScope(model, settings, getCodexFastModeScope(context), copilotCredential);
21636
21716
  }
21637
21717
  function formatCodexFastModeModelLabel(modelName, enabled) {
21638
21718
  return enabled ? `${modelName} fast` : modelName;
@@ -21773,7 +21853,7 @@ class FooterComponent {
21773
21853
  pwd += ` • ${sessionName}`;
21774
21854
  const modelName = state.model?.id || "no-model";
21775
21855
  const fastModeSettings = this.session.settingsManager.getCodexFastModeSettings();
21776
- const fastModeEnabled = state.model ? shouldApplyCodexFastMode(state.model, fastModeSettings, this.session.orchestrationContext) : false;
21856
+ const fastModeEnabled = state.model ? shouldApplyCodexFastMode(state.model, fastModeSettings, this.session.orchestrationContext, this.session.modelRuntime.getCredentialSnapshot?.("github-copilot")) : false;
21777
21857
  let modelLabel2 = modelName;
21778
21858
  if (state.model?.reasoning) {
21779
21859
  const thinkingLevel = state.thinkingLevel || "off";
@@ -39361,14 +39441,18 @@ import { AsyncLocalStorage } from "node:async_hooks";
39361
39441
 
39362
39442
  class WorkflowStageAdmissionBoundary {
39363
39443
  open = true;
39364
- completed = new Set;
39444
+ completed;
39365
39445
  inFlight = new Map;
39366
39446
  pending = new Set;
39367
39447
  invocationContext = new AsyncLocalStorage;
39368
39448
  closePromise;
39369
39449
  drainAdmittedWork;
39370
- constructor(drainAdmittedWork = async () => {}) {
39371
- this.drainAdmittedWork = drainAdmittedWork;
39450
+ constructor(drainAdmittedWork = undefined, completedKeys = []) {
39451
+ this.drainAdmittedWork = drainAdmittedWork ?? (async () => {});
39452
+ this.completed = new Set(completedKeys);
39453
+ }
39454
+ static restore(entries, drainAdmittedWork) {
39455
+ return new WorkflowStageAdmissionBoundary(drainAdmittedWork, Array.from(entries).flatMap((entry) => entry.type === "custom_message" && typeof entry.stageAdmissionKey === "string" ? [entry.stageAdmissionKey] : []));
39372
39456
  }
39373
39457
  admit(key, deliver, routeLate) {
39374
39458
  if (key !== undefined) {
@@ -39607,7 +39691,7 @@ class AgentSessionBase {
39607
39691
  this._subagentPolicy = config.subagentPolicy;
39608
39692
  this._systemPromptTransform = config.systemPromptTransform;
39609
39693
  const stageContext = config.orchestrationContext?.kind === "workflow-stage" ? config.orchestrationContext : undefined;
39610
- this._workflowStageAdmission = stageContext?.messageAdmission?.boundary ?? (stageContext ? new WorkflowStageAdmissionBoundary : undefined);
39694
+ this._workflowStageAdmission = stageContext?.messageAdmission?.boundary ?? (stageContext ? WorkflowStageAdmissionBoundary.restore(this.sessionManager.getBranch()) : undefined);
39611
39695
  if (this._workflowStageAdmission && stageContext && stageContext.messageAdmission === undefined) {
39612
39696
  stageContext.messageAdmission = {
39613
39697
  boundary: this._workflowStageAdmission,
@@ -46559,6 +46643,31 @@ class RemoteQueuePause {
46559
46643
  var init_remote_queue_pause = () => {};
46560
46644
 
46561
46645
  // src/modes/interactive-engine/isolated-runtime.ts
46646
+ import { clampThinkingLevel as clampThinkingLevel5 } from "@bastani/pi-ai/compat";
46647
+ function applyPersistedModelDefault(session, model, alreadyInScope) {
46648
+ session.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
46649
+ if (alreadyInScope || session.scopedModels.length === 0)
46650
+ return;
46651
+ const enabledModels = session.settingsManager.getEnabledModels();
46652
+ if (!enabledModels?.length)
46653
+ return;
46654
+ const modelReference = `${model.provider}/${model.id}`;
46655
+ if (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase()))
46656
+ return;
46657
+ session.settingsManager.setEnabledModels([...enabledModels, modelReference]);
46658
+ }
46659
+ function thinkingPersistTarget(result) {
46660
+ if (!result.provider || !result.modelId)
46661
+ return;
46662
+ return { provider: result.provider, modelId: result.modelId };
46663
+ }
46664
+ function applyPersistedThinkingDefault(session, level, target) {
46665
+ if (target) {
46666
+ session.settingsManager.setModelThinkingLevel(target.provider, target.modelId, level);
46667
+ return;
46668
+ }
46669
+ session.settingsManager.setDefaultThinkingLevel(level);
46670
+ }
46562
46671
  var IsolatedInteractiveRuntime;
46563
46672
  var init_isolated_runtime = __esm(() => {
46564
46673
  init_agent_session_runtime();
@@ -46577,6 +46686,7 @@ var init_isolated_runtime = __esm(() => {
46577
46686
  steeringMessages = [];
46578
46687
  followUpMessages = [];
46579
46688
  queueUpdateGeneration = 0;
46689
+ thinkingEpoch = 0;
46580
46690
  pendingQueueClear;
46581
46691
  engineCallbackActive = false;
46582
46692
  queuePause;
@@ -46941,43 +47051,56 @@ var init_isolated_runtime = __esm(() => {
46941
47051
  },
46942
47052
  setModel: {
46943
47053
  configurable: true,
46944
- value: async (model) => {
46945
- const selected = await this.client.setModel(model.provider, model.id);
46946
- session.agent.state.model = session.modelRuntime.getModel(selected.provider, selected.id) ?? model;
47054
+ value: async (model, options) => {
47055
+ const selected = await this.client.setModel(model.provider, model.id, options);
47056
+ const nextModel = session.modelRuntime.getModel(selected.provider, selected.id) ?? model;
47057
+ session.agent.state.model = nextModel;
46947
47058
  this.resolveModelFallback();
47059
+ if (options?.persist === true)
47060
+ await this.syncPersistedModelCatalog(session, nextModel);
46948
47061
  }
46949
47062
  },
46950
47063
  setThinkingLevel: {
46951
47064
  configurable: true,
46952
- value: (level) => {
46953
- session.agent.state.thinkingLevel = level;
46954
- this.dispatchBestEffort("set thinking level", this.client.setThinkingLevel(level));
47065
+ value: (level, options) => {
47066
+ const availableLevels = session.getAvailableThinkingLevels();
47067
+ const effectiveLevel = availableLevels.includes(level) ? level : session.model ? clampThinkingLevel5(session.model, level) : "off";
47068
+ session.agent.state.thinkingLevel = effectiveLevel;
47069
+ const epoch = ++this.thinkingEpoch;
47070
+ this.dispatchBestEffort("set thinking level", this.client.setThinkingLevelAck(level, options).then((result) => {
47071
+ this.applyThinkingAck(session, epoch, result, options?.persist === true);
47072
+ }));
46955
47073
  }
46956
47074
  },
46957
47075
  cycleModel: {
46958
47076
  configurable: true,
46959
- value: async (direction) => {
47077
+ value: async (direction, options) => {
46960
47078
  const previousModel = session.model;
46961
- const result = await this.client.cycleModel(direction);
47079
+ const result = await this.client.cycleModel(direction, options);
46962
47080
  if (!result)
46963
47081
  return;
46964
47082
  const model = session.modelRuntime.getModel(result.model.provider, result.model.id) ?? result.model;
46965
47083
  session.agent.state.model = model;
46966
47084
  session.agent.state.thinkingLevel = result.thinkingLevel;
46967
47085
  this.resolveModelFallbackAfterExplicitModelSelection(previousModel, model);
47086
+ if (options?.persist === true)
47087
+ await this.syncPersistedModelCatalog(session, model);
46968
47088
  return { ...result, model };
46969
47089
  }
46970
47090
  },
46971
47091
  cycleThinkingLevel: {
46972
47092
  configurable: true,
46973
- value: () => {
47093
+ value: (options) => {
46974
47094
  const levels = session.getAvailableThinkingLevels();
46975
47095
  if (levels.length <= 1)
46976
47096
  return;
46977
47097
  const current = levels.indexOf(session.thinkingLevel);
46978
47098
  const level = levels[(current + 1) % levels.length];
46979
47099
  session.agent.state.thinkingLevel = level;
46980
- this.dispatchBestEffort("cycle thinking level", this.client.setThinkingLevel(level));
47100
+ const epoch = ++this.thinkingEpoch;
47101
+ this.dispatchBestEffort("cycle thinking level", this.client.setThinkingLevelAck(level, options).then((result) => {
47102
+ this.applyThinkingAck(session, epoch, result, options?.persist === true);
47103
+ }));
46981
47104
  return level;
46982
47105
  }
46983
47106
  },
@@ -47021,6 +47144,14 @@ var init_isolated_runtime = __esm(() => {
47021
47144
  this.engineCallbackActive = false;
47022
47145
  }
47023
47146
  }
47147
+ applyThinkingAck(session, epoch, result, persist) {
47148
+ if (persist) {
47149
+ applyPersistedThinkingDefault(session, result.level, thinkingPersistTarget(result));
47150
+ }
47151
+ if (epoch === this.thinkingEpoch) {
47152
+ session.agent.state.thinkingLevel = result.level;
47153
+ }
47154
+ }
47024
47155
  dispatchBestEffort(label, operation) {
47025
47156
  operation.catch((error) => {
47026
47157
  if (this.health.isRecovering())
@@ -47061,6 +47192,12 @@ var init_isolated_runtime = __esm(() => {
47061
47192
  }
47062
47193
  });
47063
47194
  }
47195
+ async syncPersistedModelCatalog(session, model) {
47196
+ const alreadyInScope = session.scopedModels.some((scoped) => scoped.model.provider === model.provider && scoped.model.id === model.id);
47197
+ const catalog = await this.client.requestInternal({ type: "get_available_models" });
47198
+ this.remoteModelCatalog.apply(catalog);
47199
+ applyPersistedModelDefault(session, model, alreadyInScope);
47200
+ }
47064
47201
  refreshSessionView() {
47065
47202
  const session = super.session;
47066
47203
  const sessionFile = session.sessionFile;
@@ -47100,6 +47237,7 @@ var init_isolated_runtime = __esm(() => {
47100
47237
  session.agent.state.model = event.model;
47101
47238
  break;
47102
47239
  case "thinking_level_changed":
47240
+ this.thinkingEpoch += 1;
47103
47241
  session.agent.state.thinkingLevel = event.level;
47104
47242
  break;
47105
47243
  case "session_info_changed":
@@ -48313,7 +48451,7 @@ var init_slash_commands = __esm(() => {
48313
48451
  { name: "tree", description: "Navigate session tree (switch branches)" },
48314
48452
  { name: "thinking", description: "Set thinking level", argumentHint: "<level>" },
48315
48453
  { name: "scoped-models", description: "Enable/disable models for ctrl+p cycling" },
48316
- { name: "fast", description: "Configure Codex fast mode for chat and workflows" },
48454
+ { name: "fast", description: "Configure OpenAI fast mode for chat and workflows in supported models" },
48317
48455
  { name: "export", description: "Export session (HTML default, or specify path: .html/.jsonl)" },
48318
48456
  { name: "import", description: "Import and resume a session from a JSONL file" },
48319
48457
  { name: "share", description: "Share session as a secret GitHub gist" },
@@ -49765,7 +49903,7 @@ var init_interactive_autocomplete = __esm(() => {
49765
49903
  return [...this.session.modelRuntime.getAvailableSnapshot()];
49766
49904
  };
49767
49905
  InteractiveModeBase.prototype.hasCodexFastModeSupportedModels = function() {
49768
- return hasSupportedCodexFastModeModel(this.getCodexFastModeCandidateModels());
49906
+ return hasSupportedCodexFastModeModel(this.getCodexFastModeCandidateModels(), this.session.modelRuntime.getCredentialSnapshot?.("github-copilot"));
49769
49907
  };
49770
49908
  InteractiveModeBase.prototype.buildRemoteSlashCommands = function(localCommands) {
49771
49909
  const remote = getInteractiveEngineRemoteCommands(this.runtimeHost);
@@ -50453,7 +50591,7 @@ var init_interactive_startup = __esm(() => {
50453
50591
  if (!model) {
50454
50592
  return modelLabel2;
50455
50593
  }
50456
- const fastModeEnabled = shouldApplyCodexFastMode(model, this.session.settingsManager.getCodexFastModeSettings(), this.session.orchestrationContext);
50594
+ const fastModeEnabled = shouldApplyCodexFastMode(model, this.session.settingsManager.getCodexFastModeSettings(), this.session.orchestrationContext, this.session.modelRuntime.getCredentialSnapshot?.("github-copilot"));
50457
50595
  return formatCodexFastModeModelLabel(modelLabel2, fastModeEnabled);
50458
50596
  };
50459
50597
  InteractiveModeBase.prototype.getStartupIdentityText = function(maxWidth, gap = 0, manifestoPhase = 4) {
@@ -51379,7 +51517,7 @@ var init_interactive_extension_runtime = __esm(() => {
51379
51517
  if (shortcuts.size === 0)
51380
51518
  return;
51381
51519
  const createContext = () => ({
51382
- ui: this.createExtensionUIContext(),
51520
+ ui: extensionRunner.getUIContext(),
51383
51521
  mode: "tui",
51384
51522
  hasUI: true,
51385
51523
  cwd: this.sessionManager.getCwd(),
@@ -54968,7 +55106,7 @@ var init_interactive_selectors = __esm(() => {
54968
55106
  });
54969
55107
 
54970
55108
  // src/modes/interactive/interactive-model-routing.ts
54971
- import { clampThinkingLevel as clampThinkingLevel5 } from "@bastani/pi-ai/compat";
55109
+ import { clampThinkingLevel as clampThinkingLevel6 } from "@bastani/pi-ai/compat";
54972
55110
  function resolveThinkingSelectorDefault(rawDefault, availableLevels, model) {
54973
55111
  if (rawDefault === undefined)
54974
55112
  return;
@@ -54976,7 +55114,7 @@ function resolveThinkingSelectorDefault(rawDefault, availableLevels, model) {
54976
55114
  return rawDefault;
54977
55115
  if (!model)
54978
55116
  return availableLevels.includes("off") ? "off" : availableLevels[0];
54979
- const clamped = clampThinkingLevel5(model, rawDefault);
55117
+ const clamped = clampThinkingLevel6(model, rawDefault);
54980
55118
  if (availableLevels.includes(clamped))
54981
55119
  return clamped;
54982
55120
  return availableLevels.includes("off") ? "off" : availableLevels[0];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.16-alpha.7",
3
+ "version": "0.9.16-alpha.9",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
6
6
  "contributors": [
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.16-alpha.8] - 2026-08-27
10
+
11
+ ### Added
12
+
13
+ - Added a dedicated `workflow answer` action for responding to pending primitive and structured human-in-the-loop prompts without exposing stage-message delivery semantics.
14
+ - Added durable pending-stage message state for ordinary Intercom delivery, including FIFO delivery before the first model turn, resume/replay persistence, exactly-once stage-attempt handling, lifecycle failure notifications, and guidance for propagating material updates to known workflow stages that have not started. ([#2717](https://github.com/bastani-inc/atomic/issues/2717))
15
+
16
+ ### Changed
17
+
18
+ - Periodic workflow heartbeat prompts now guide supervising agents to use ordinary Intercom when steering or communication is useful, match an update's reach to the expanded workflow topology, send shared scope or acceptance changes consistently across every relevant live and known unstarted worker/reviewer stage, account for immediate and queued pre-first-turn delivery, and use workflow pause, resume, interrupt, or quit for run control.
19
+
20
+ ### Removed
21
+
22
+ - Removed the public `workflow send` action and its stage-chat delivery modes. Use `workflow answer` for pending human-input prompts, `workflow resume` for paused control, and ordinary Intercom for live or deferred workflow-stage communication.
23
+
9
24
  ## [0.9.16-alpha.7] - 2026-08-26
10
25
 
11
26
  ### Changed