@bastani/atomic 0.9.40 → 0.9.41-alpha.1

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 (295) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/intercom/CHANGELOG.md +12 -0
  4. package/dist/builtin/intercom/README.md +1 -1
  5. package/dist/builtin/intercom/broker/broker.ts +24 -21
  6. package/dist/builtin/intercom/broker/client.ts +97 -6
  7. package/dist/builtin/intercom/broker/list-reply.ts +53 -0
  8. package/dist/builtin/intercom/index.bundle.mjs +278 -46
  9. package/dist/builtin/intercom/package.json +1 -1
  10. package/dist/builtin/intercom/recoverable-disconnect.ts +27 -1
  11. package/dist/builtin/intercom/types.ts +8 -1
  12. package/dist/builtin/mcp/package.json +1 -1
  13. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  14. package/dist/builtin/subagents/README.md +14 -0
  15. package/dist/builtin/subagents/package.json +1 -1
  16. package/dist/builtin/subagents/src/extension/index.bundle.mjs +99 -19
  17. package/dist/builtin/web-access/package.json +1 -1
  18. package/dist/builtin/workflows/CHANGELOG.md +25 -0
  19. package/dist/builtin/workflows/README.md +2 -0
  20. package/dist/builtin/workflows/package.json +1 -1
  21. package/dist/builtin/workflows/src/authoring.d.ts +1 -1
  22. package/dist/builtin/workflows/src/durable/journal/internal.d.ts +16 -0
  23. package/dist/builtin/workflows/src/durable/journal/legacy-journal-tables.d.ts +9 -0
  24. package/dist/builtin/workflows/src/durable/journal/sql-run-journal.d.ts +6 -0
  25. package/dist/builtin/workflows/src/extension/index.bundle.mjs +441 -90
  26. package/dist/builtin/workflows/src/index.js +226 -34
  27. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +17 -1
  28. package/dist/cli/credential-print.d.ts.map +1 -1
  29. package/dist/cli/credential-print.js +1 -1
  30. package/dist/cli/credential-print.js.map +1 -1
  31. package/dist/config.d.ts +1 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/agent-session-extension-bindings.d.ts +2 -1
  36. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  37. package/dist/core/agent-session-extension-bindings.js +33 -18
  38. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  39. package/dist/core/agent-session-methods.d.ts +2 -1
  40. package/dist/core/agent-session-methods.d.ts.map +1 -1
  41. package/dist/core/agent-session-methods.js.map +1 -1
  42. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  43. package/dist/core/agent-session-prompt.js +114 -21
  44. package/dist/core/agent-session-prompt.js.map +1 -1
  45. package/dist/core/agent-session-runtime.d.ts +1 -1
  46. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  47. package/dist/core/agent-session-runtime.js +6 -0
  48. package/dist/core/agent-session-runtime.js.map +1 -1
  49. package/dist/core/agent-session-state.d.ts +19 -1
  50. package/dist/core/agent-session-state.d.ts.map +1 -1
  51. package/dist/core/agent-session-state.js +41 -6
  52. package/dist/core/agent-session-state.js.map +1 -1
  53. package/dist/core/auth-storage-backends.d.ts +3 -1
  54. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  55. package/dist/core/auth-storage-backends.js +79 -12
  56. package/dist/core/auth-storage-backends.js.map +1 -1
  57. package/dist/core/client-identity.d.ts +8 -0
  58. package/dist/core/client-identity.d.ts.map +1 -0
  59. package/dist/core/client-identity.js +16 -0
  60. package/dist/core/client-identity.js.map +1 -0
  61. package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
  62. package/dist/core/compaction/planner-outcome.js +2 -1
  63. package/dist/core/compaction/planner-outcome.js.map +1 -1
  64. package/dist/core/execution-model-router.d.ts +18 -0
  65. package/dist/core/execution-model-router.d.ts.map +1 -1
  66. package/dist/core/execution-model-router.js +14 -8
  67. package/dist/core/execution-model-router.js.map +1 -1
  68. package/dist/core/extension-oauth-refresh-rejection.d.ts +12 -0
  69. package/dist/core/extension-oauth-refresh-rejection.d.ts.map +1 -0
  70. package/dist/core/extension-oauth-refresh-rejection.js +70 -0
  71. package/dist/core/extension-oauth-refresh-rejection.js.map +1 -0
  72. package/dist/core/extension-startup-failure.d.ts +30 -0
  73. package/dist/core/extension-startup-failure.d.ts.map +1 -0
  74. package/dist/core/extension-startup-failure.js +62 -0
  75. package/dist/core/extension-startup-failure.js.map +1 -0
  76. package/dist/core/extensions/context-types.d.ts +2 -0
  77. package/dist/core/extensions/context-types.d.ts.map +1 -1
  78. package/dist/core/extensions/context-types.js.map +1 -1
  79. package/dist/core/extensions/provider-types.d.ts +2 -0
  80. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  81. package/dist/core/extensions/provider-types.js.map +1 -1
  82. package/dist/core/extensions/runner-context.d.ts +1 -0
  83. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  84. package/dist/core/extensions/runner-context.js +8 -0
  85. package/dist/core/extensions/runner-context.js.map +1 -1
  86. package/dist/core/extensions/runner.d.ts +1 -0
  87. package/dist/core/extensions/runner.d.ts.map +1 -1
  88. package/dist/core/extensions/runner.js +3 -0
  89. package/dist/core/extensions/runner.js.map +1 -1
  90. package/dist/core/extensions/runtime-types.d.ts +1 -0
  91. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  92. package/dist/core/extensions/runtime-types.js.map +1 -1
  93. package/dist/core/extensions/workflow-run-control-hub.d.ts +1 -0
  94. package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
  95. package/dist/core/extensions/workflow-run-control-hub.js +3 -0
  96. package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
  97. package/dist/core/extensions/workflow-run-control.d.ts +8 -0
  98. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
  99. package/dist/core/extensions/workflow-run-control.js.map +1 -1
  100. package/dist/core/model-fallback-failures.d.ts.map +1 -1
  101. package/dist/core/model-fallback-failures.js +12 -0
  102. package/dist/core/model-fallback-failures.js.map +1 -1
  103. package/dist/core/model-resolver-defaults.js +1 -1
  104. package/dist/core/model-resolver-defaults.js.map +1 -1
  105. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  106. package/dist/core/model-runtime-streaming.js +9 -3
  107. package/dist/core/model-runtime-streaming.js.map +1 -1
  108. package/dist/core/model-runtime.d.ts +5 -0
  109. package/dist/core/model-runtime.d.ts.map +1 -1
  110. package/dist/core/model-runtime.js +6 -0
  111. package/dist/core/model-runtime.js.map +1 -1
  112. package/dist/core/provider-composer-internal.d.ts +6 -5
  113. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  114. package/dist/core/provider-composer-internal.js +13 -2
  115. package/dist/core/provider-composer-internal.js.map +1 -1
  116. package/dist/core/sdk.d.ts.map +1 -1
  117. package/dist/core/sdk.js +12 -4
  118. package/dist/core/sdk.js.map +1 -1
  119. package/dist/core/storage/session/sql-session-store.d.ts +35 -0
  120. package/dist/core/storage/session/sql-session-store.d.ts.map +1 -1
  121. package/dist/core/storage/session/sql-session-store.js +158 -42
  122. package/dist/core/storage/session/sql-session-store.js.map +1 -1
  123. package/dist/core/structured-output/deadline.d.ts +40 -0
  124. package/dist/core/structured-output/deadline.d.ts.map +1 -0
  125. package/dist/core/structured-output/deadline.js +110 -0
  126. package/dist/core/structured-output/deadline.js.map +1 -0
  127. package/dist/core/structured-output/index.d.ts.map +1 -1
  128. package/dist/core/structured-output/index.js +103 -47
  129. package/dist/core/structured-output/index.js.map +1 -1
  130. package/dist/core/structured-output/rejection-detail.d.ts +9 -0
  131. package/dist/core/structured-output/rejection-detail.d.ts.map +1 -0
  132. package/dist/core/structured-output/rejection-detail.js +129 -0
  133. package/dist/core/structured-output/rejection-detail.js.map +1 -0
  134. package/dist/core/structured-output/types.d.ts +8 -1
  135. package/dist/core/structured-output/types.d.ts.map +1 -1
  136. package/dist/core/structured-output/types.js.map +1 -1
  137. package/dist/core/tasks/completion.d.ts +7 -1
  138. package/dist/core/tasks/completion.d.ts.map +1 -1
  139. package/dist/core/tasks/completion.js +28 -6
  140. package/dist/core/tasks/completion.js.map +1 -1
  141. package/dist/core/tasks/contracts.d.ts +6 -1
  142. package/dist/core/tasks/contracts.d.ts.map +1 -1
  143. package/dist/core/tasks/contracts.js.map +1 -1
  144. package/dist/core/tasks/pause.d.ts +2 -1
  145. package/dist/core/tasks/pause.d.ts.map +1 -1
  146. package/dist/core/tasks/pause.js +3 -2
  147. package/dist/core/tasks/pause.js.map +1 -1
  148. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  149. package/dist/core/tools/bash-pty-native.js +10 -5
  150. package/dist/core/tools/bash-pty-native.js.map +1 -1
  151. package/dist/core/tools/bash.d.ts.map +1 -1
  152. package/dist/core/tools/bash.js +16 -32
  153. package/dist/core/tools/bash.js.map +1 -1
  154. package/dist/core/tools/kill.d.ts.map +1 -1
  155. package/dist/core/tools/kill.js +17 -3
  156. package/dist/core/tools/kill.js.map +1 -1
  157. package/dist/core/tools/shell-task-render.d.ts +55 -0
  158. package/dist/core/tools/shell-task-render.d.ts.map +1 -0
  159. package/dist/core/tools/shell-task-render.js +123 -0
  160. package/dist/core/tools/shell-task-render.js.map +1 -0
  161. package/dist/core/tools/shell-task-status.d.ts +52 -0
  162. package/dist/core/tools/shell-task-status.d.ts.map +1 -0
  163. package/dist/core/tools/shell-task-status.js +184 -0
  164. package/dist/core/tools/shell-task-status.js.map +1 -0
  165. package/dist/core/tools/structured-output.d.ts +5 -0
  166. package/dist/core/tools/structured-output.d.ts.map +1 -1
  167. package/dist/core/tools/structured-output.js +3 -0
  168. package/dist/core/tools/structured-output.js.map +1 -1
  169. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  170. package/dist/extensions/codemode/execute.js +134 -57
  171. package/dist/extensions/codemode/execute.js.map +1 -1
  172. package/dist/extensions/mcp/config.d.ts.map +1 -1
  173. package/dist/extensions/mcp/config.js +3 -2
  174. package/dist/extensions/mcp/config.js.map +1 -1
  175. package/dist/index-extensions.d.ts +1 -0
  176. package/dist/index-extensions.d.ts.map +1 -1
  177. package/dist/index-extensions.js +3 -0
  178. package/dist/index-extensions.js.map +1 -1
  179. package/dist/index.d.ts +3 -1
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +3 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/main.d.ts.map +1 -1
  184. package/dist/main.js +19 -6
  185. package/dist/main.js.map +1 -1
  186. package/dist/modes/interactive/components/task-row.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/task-row.js +11 -1
  188. package/dist/modes/interactive/components/task-row.js.map +1 -1
  189. package/dist/modes/interactive/interactive-auth-routing.js +12 -10
  190. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  191. package/dist/modes/interactive/interactive-extension-custom-ui.js +20 -30
  192. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  193. package/dist/modes/interactive/interactive-extension-dialogs.js +23 -96
  194. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  195. package/dist/modes/interactive/interactive-extension-runtime.js +7 -8
  196. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  197. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  198. package/dist/modes/interactive/interactive-input-handling.js +27 -4
  199. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  200. package/dist/modes/interactive/interactive-mode-base.d.ts +20 -10
  201. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  202. package/dist/modes/interactive/interactive-mode-base.js +40 -5
  203. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  204. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  205. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  206. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  207. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  208. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -4
  209. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  210. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  211. package/dist/modes/interactive/interactive-mode-types.d.ts +4 -1
  212. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  213. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  214. package/dist/modes/interactive/interactive-prompt-restore.d.ts +3 -0
  215. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
  216. package/dist/modes/interactive/interactive-prompt-restore.js +9 -1
  217. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
  218. package/dist/modes/interactive/interactive-prompt-turn.js +30 -2
  219. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  220. package/dist/modes/interactive/interactive-queueing.js +43 -8
  221. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  222. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  223. package/dist/modes/interactive/interactive-startup.js +12 -3
  224. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  225. package/dist/modes/interactive/theme/color-utils.d.ts +6 -1
  226. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  227. package/dist/modes/interactive/theme/color-utils.js +39 -17
  228. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  229. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  230. package/dist/modes/interactive/theme/theme-class.js +2 -2
  231. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  232. package/dist/modes/interactive/theme/theme-tokens.d.ts +6 -0
  233. package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -1
  234. package/dist/modes/interactive/theme/theme-tokens.js +7 -3
  235. package/dist/modes/interactive/theme/theme-tokens.js.map +1 -1
  236. package/dist/modes/interactive-engine/isolated-auth.d.ts +3 -0
  237. package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
  238. package/dist/modes/interactive-engine/isolated-auth.js +13 -1
  239. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  240. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  241. package/dist/modes/interactive-engine/isolated-runtime.js +11 -2
  242. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  243. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +8 -0
  244. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  245. package/dist/modes/interactive-engine/remote-model-catalog.js +54 -0
  246. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  247. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  248. package/dist/modes/rpc/rpc-command-handler.js +4 -13
  249. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  250. package/dist/modes/rpc/rpc-model-catalog.d.ts +9 -0
  251. package/dist/modes/rpc/rpc-model-catalog.d.ts.map +1 -0
  252. package/dist/modes/rpc/rpc-model-catalog.js +19 -0
  253. package/dist/modes/rpc/rpc-model-catalog.js.map +1 -0
  254. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  255. package/dist/modes/rpc/rpc-provider-auth.js +2 -6
  256. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  257. package/dist/modes/rpc/rpc-types.d.ts +6 -0
  258. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  259. package/dist/modes/rpc/rpc-types.js.map +1 -1
  260. package/dist/utils/changelog.d.ts +6 -0
  261. package/dist/utils/changelog.d.ts.map +1 -1
  262. package/dist/utils/changelog.js +11 -0
  263. package/dist/utils/changelog.js.map +1 -1
  264. package/dist/utils/clipboard.d.ts.map +1 -1
  265. package/dist/utils/clipboard.js +4 -0
  266. package/dist/utils/clipboard.js.map +1 -1
  267. package/dist/utils/tools-manager.d.ts.map +1 -1
  268. package/dist/utils/tools-manager.js +3 -2
  269. package/dist/utils/tools-manager.js.map +1 -1
  270. package/docs/background-tasks.md +5 -3
  271. package/docs/codemode.md +2 -2
  272. package/docs/custom-provider/oauth.md +42 -1
  273. package/docs/custom-provider/registration.md +2 -0
  274. package/docs/environment-variables.md +1 -0
  275. package/docs/extensions/api-reference.md +3 -4
  276. package/docs/extensions/authoring.md +1 -1
  277. package/docs/extensions/events.md +1 -1
  278. package/docs/providers.md +3 -3
  279. package/docs/rpc/protocol.md +4 -2
  280. package/docs/sdk/reference.md +2 -0
  281. package/docs/sdk/structured-decisions.md +7 -5
  282. package/docs/sdk.md +5 -2
  283. package/docs/settings.md +4 -2
  284. package/docs/subagents/reference.md +1 -1
  285. package/docs/subagents.md +15 -1
  286. package/docs/themes/reference.md +3 -1
  287. package/docs/usage.md +3 -1
  288. package/docs/workflows/api-reference.md +28 -0
  289. package/docs/workflows/operations.md +2 -2
  290. package/npm-shrinkwrap.json +32 -32
  291. package/package.json +3 -3
  292. package/dist/core/provider-attribution.d.ts +0 -4
  293. package/dist/core/provider-attribution.d.ts.map +0 -1
  294. package/dist/core/provider-attribution.js +0 -87
  295. package/dist/core/provider-attribution.js.map +0 -1
@@ -29,6 +29,7 @@ export declare function mergeRestoredDraft(draft: string, currentText: string):
29
29
  export interface PromptDraftRestoreTarget {
30
30
  /** True once the submission reached an agent turn (`agent_start` observed). */
31
31
  turnStarted: boolean;
32
+ refused?: boolean;
32
33
  /** Text to put back, exactly as the editor handed it to the submit callback. */
33
34
  draft: string;
34
35
  getEditorText(): string;
@@ -54,5 +55,7 @@ export declare function restoreUnsentPromptDraft(error: unknown, target: PromptD
54
55
  */
55
56
  export declare function restoreFailedSubmissionDraft(mode: InteractiveModeBase, error: unknown, draft: string, options?: {
56
57
  turnStarted?: boolean;
58
+ refused?: boolean;
57
59
  }): boolean;
60
+ export declare function restoreRefusedSubmission(mode: InteractiveModeBase, error: unknown, draft: string): void;
58
61
  //# sourceMappingURL=interactive-prompt-restore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-prompt-restore.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-restore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,wBAAwB;IACxC,+EAA+E;IAC/E,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,IAAI,MAAM,CAAC;IACxB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,IAAI,OAAO,CAAC;IAC3B,WAAW,IAAI,IAAI,CAAC;IACpB,aAAa,IAAI,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAQlG;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAsBT"}
1
+ {"version":3,"file":"interactive-prompt-restore.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-restore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,wBAAwB;IACxC,+EAA+E;IAC/E,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,IAAI,MAAM,CAAC;IACxB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,IAAI,OAAO,CAAC;IAC3B,WAAW,IAAI,IAAI,CAAC;IACpB,aAAa,IAAI,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAUlG;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,OAAO,CAuBT;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIvG"}
@@ -41,8 +41,9 @@ export function mergeRestoredDraft(draft, currentText) {
41
41
  export function restoreUnsentPromptDraft(error, target) {
42
42
  if (target.turnStarted)
43
43
  return false;
44
- if (!isEngineSendFailure(error) && !isInteractiveEngineResourceReadinessError(error))
44
+ if (target.refused !== true && !isEngineSendFailure(error) && !isInteractiveEngineResourceReadinessError(error)) {
45
45
  return false;
46
+ }
46
47
  target.setEditorText(mergeRestoredDraft(target.draft, target.getEditorText()));
47
48
  // Never steal focus from a modal that took over while the send was pending.
48
49
  if (target.editorOwnsInput())
@@ -64,6 +65,7 @@ export function restoreFailedSubmissionDraft(mode, error, draft, options) {
64
65
  const queued = mode.pendingUserInputs;
65
66
  const restored = restoreUnsentPromptDraft(error, {
66
67
  turnStarted: options?.turnStarted === true,
68
+ refused: options?.refused === true,
67
69
  draft: [draft, ...queued.map((submission) => submission.draft)].join(RESTORED_DRAFT_SEPARATOR),
68
70
  // Expand first: a large paste lives in the editor's private paste registry
69
71
  // and shows only a `[paste #1 … chars]` marker in the visible buffer, and
@@ -80,4 +82,10 @@ export function restoreFailedSubmissionDraft(mode, error, draft, options) {
80
82
  }
81
83
  return restored;
82
84
  }
85
+ export function restoreRefusedSubmission(mode, error, draft) {
86
+ const restored = restoreFailedSubmissionDraft(mode, error, draft, { refused: true });
87
+ if (restored && (isEngineSendFailure(error) || isInteractiveEngineResourceReadinessError(error)))
88
+ return;
89
+ mode.showError(error instanceof Error ? error.message : "Unknown error occurred");
90
+ }
83
91
  //# sourceMappingURL=interactive-prompt-restore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-prompt-restore.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-restore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yCAAyC,EAAE,MAAM,mDAAmD,CAAC;AAC9G,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGnG;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IACjD,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,WAAmB;IACpE,OAAO,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,wBAAwB,GAAG,WAAW,EAAE,CAAC;AAC/F,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc,EAAE,MAAgC;IACxF,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnG,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/E,4EAA4E;IAC5E,IAAI,MAAM,CAAC,eAAe,EAAE;QAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,CAAC,aAAa,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC3C,IAAyB,EACzB,KAAc,EACd,KAAa,EACb,OAAmC;IAEnC,2EAA2E;IAC3E,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC;IACtC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE;QAChD,WAAW,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI;QAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAC9F,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,gCAAgC;QAChC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7E,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1E,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;KAC5C,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import { isInteractiveEngineResourceReadinessError } from \"../interactive-engine/resource-readiness-error.ts\";\nimport { isRpcRequestAcceptedFailure, isRpcTransportFailure } from \"../rpc/rpc-transport-error.ts\";\nimport type { InteractiveModeBase } from \"./interactive-mode-base.ts\";\n\n/**\n * True when the prompt never reached an agent turn because the transport\n * rejected it, so the typed text is still user-owned.\n *\n * Admission is the only input, and it is decisive. Every rejection `RpcClient`\n * raises is built through `rpcTransportError`, and an accepted request is\n * re-marked per request, so the classification already knows whether the child\n * took ownership.\n *\n * Message text is deliberately not consulted. A provider, extension, or command\n * error is free to contain a phrase like `Agent process stopped` after the\n * engine admitted and ran the submission; restoring the draft there would hide\n * a real failure and invite a duplicate run. Node also documents `error.message`\n * as free to change in any release.\n */\nexport function isEngineSendFailure(error: unknown): boolean {\n\treturn isRpcTransportFailure(error) && !isRpcRequestAcceptedFailure(error);\n}\n\n/** Separator between a restored submission and text typed while it was pending. */\nexport const RESTORED_DRAFT_SEPARATOR = \"\\n\\n\";\n\n/**\n * Merge a rejected submission back into the live editor buffer in temporal\n * order: the failed submission first, then whatever the user typed while the\n * send was still pending.\n *\n * Presence is measured on the raw string, never on `trim()`, so whitespace-only\n * typing is preserved too. Neither side is trimmed or normalized here.\n */\nexport function mergeRestoredDraft(draft: string, currentText: string): string {\n\treturn currentText.length === 0 ? draft : `${draft}${RESTORED_DRAFT_SEPARATOR}${currentText}`;\n}\n\nexport interface PromptDraftRestoreTarget {\n\t/** True once the submission reached an agent turn (`agent_start` observed). */\n\tturnStarted: boolean;\n\t/** Text to put back, exactly as the editor handed it to the submit callback. */\n\tdraft: string;\n\tgetEditorText(): string;\n\tsetEditorText(text: string): void;\n\teditorOwnsInput(): boolean;\n\tfocusEditor(): void;\n\trequestRender(): void;\n}\n\n/**\n * Put a rejected submission back in the editor instead of discarding it.\n *\n * Only for a send that never landed: once the agent turn has started, the text\n * belongs to the transcript and a mid-turn failure must not resurrect it.\n * Returns true when the draft was restored.\n */\nexport function restoreUnsentPromptDraft(error: unknown, target: PromptDraftRestoreTarget): boolean {\n\tif (target.turnStarted) return false;\n\tif (!isEngineSendFailure(error) && !isInteractiveEngineResourceReadinessError(error)) return false;\n\ttarget.setEditorText(mergeRestoredDraft(target.draft, target.getEditorText()));\n\t// Never steal focus from a modal that took over while the send was pending.\n\tif (target.editorOwnsInput()) target.focusEditor();\n\ttarget.requestRender();\n\treturn true;\n}\n\n/**\n * Host-bound restore used by every submit path (the prompt loop and the direct\n * dispatch branches that bypass it).\n *\n * Returns true when the failure was a send the engine never accepted and the\n * draft is back in the editor; false means the caller owns the error.\n */\nexport function restoreFailedSubmissionDraft(\n\tmode: InteractiveModeBase,\n\terror: unknown,\n\tdraft: string,\n\toptions?: { turnStarted?: boolean },\n): boolean {\n\t// Submissions still waiting in the queue were never sent either. They come\n\t// back with this one, in FIFO order, because leaving them queued would let\n\t// each later failure prepend a newer draft above older restored text.\n\tconst queued = mode.pendingUserInputs;\n\tconst restored = restoreUnsentPromptDraft(error, {\n\t\tturnStarted: options?.turnStarted === true,\n\t\tdraft: [draft, ...queued.map((submission) => submission.draft)].join(RESTORED_DRAFT_SEPARATOR),\n\t\t// Expand first: a large paste lives in the editor's private paste registry\n\t\t// and shows only a `[paste #1 … chars]` marker in the visible buffer, and\n\t\t// setText() clears that registry. Reading the marker would round-trip dead\n\t\t// text and destroy the payload.\n\t\tgetEditorText: () => mode.editor.getExpandedText?.() ?? mode.editor.getText(),\n\t\tsetEditorText: (text) => mode.editor.setText(text),\n\t\teditorOwnsInput: () => mode.editorContainer.children.includes(mode.editor),\n\t\tfocusEditor: () => mode.ui.setFocus(mode.editor),\n\t\trequestRender: () => mode.ui.requestRender(),\n\t});\n\tif (restored) {\n\t\tqueued.length = 0;\n\t}\n\treturn restored;\n}\n"]}
1
+ {"version":3,"file":"interactive-prompt-restore.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-restore.ts"],"names":[],"mappings":"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","sourcesContent":["import { isInteractiveEngineResourceReadinessError } from \"../interactive-engine/resource-readiness-error.ts\";\nimport { isRpcRequestAcceptedFailure, isRpcTransportFailure } from \"../rpc/rpc-transport-error.ts\";\nimport type { InteractiveModeBase } from \"./interactive-mode-base.ts\";\n\n/**\n * True when the prompt never reached an agent turn because the transport\n * rejected it, so the typed text is still user-owned.\n *\n * Admission is the only input, and it is decisive. Every rejection `RpcClient`\n * raises is built through `rpcTransportError`, and an accepted request is\n * re-marked per request, so the classification already knows whether the child\n * took ownership.\n *\n * Message text is deliberately not consulted. A provider, extension, or command\n * error is free to contain a phrase like `Agent process stopped` after the\n * engine admitted and ran the submission; restoring the draft there would hide\n * a real failure and invite a duplicate run. Node also documents `error.message`\n * as free to change in any release.\n */\nexport function isEngineSendFailure(error: unknown): boolean {\n\treturn isRpcTransportFailure(error) && !isRpcRequestAcceptedFailure(error);\n}\n\n/** Separator between a restored submission and text typed while it was pending. */\nexport const RESTORED_DRAFT_SEPARATOR = \"\\n\\n\";\n\n/**\n * Merge a rejected submission back into the live editor buffer in temporal\n * order: the failed submission first, then whatever the user typed while the\n * send was still pending.\n *\n * Presence is measured on the raw string, never on `trim()`, so whitespace-only\n * typing is preserved too. Neither side is trimmed or normalized here.\n */\nexport function mergeRestoredDraft(draft: string, currentText: string): string {\n\treturn currentText.length === 0 ? draft : `${draft}${RESTORED_DRAFT_SEPARATOR}${currentText}`;\n}\n\nexport interface PromptDraftRestoreTarget {\n\t/** True once the submission reached an agent turn (`agent_start` observed). */\n\tturnStarted: boolean;\n\trefused?: boolean;\n\t/** Text to put back, exactly as the editor handed it to the submit callback. */\n\tdraft: string;\n\tgetEditorText(): string;\n\tsetEditorText(text: string): void;\n\teditorOwnsInput(): boolean;\n\tfocusEditor(): void;\n\trequestRender(): void;\n}\n\n/**\n * Put a rejected submission back in the editor instead of discarding it.\n *\n * Only for a send that never landed: once the agent turn has started, the text\n * belongs to the transcript and a mid-turn failure must not resurrect it.\n * Returns true when the draft was restored.\n */\nexport function restoreUnsentPromptDraft(error: unknown, target: PromptDraftRestoreTarget): boolean {\n\tif (target.turnStarted) return false;\n\tif (target.refused !== true && !isEngineSendFailure(error) && !isInteractiveEngineResourceReadinessError(error)) {\n\t\treturn false;\n\t}\n\ttarget.setEditorText(mergeRestoredDraft(target.draft, target.getEditorText()));\n\t// Never steal focus from a modal that took over while the send was pending.\n\tif (target.editorOwnsInput()) target.focusEditor();\n\ttarget.requestRender();\n\treturn true;\n}\n\n/**\n * Host-bound restore used by every submit path (the prompt loop and the direct\n * dispatch branches that bypass it).\n *\n * Returns true when the failure was a send the engine never accepted and the\n * draft is back in the editor; false means the caller owns the error.\n */\nexport function restoreFailedSubmissionDraft(\n\tmode: InteractiveModeBase,\n\terror: unknown,\n\tdraft: string,\n\toptions?: { turnStarted?: boolean; refused?: boolean },\n): boolean {\n\t// Submissions still waiting in the queue were never sent either. They come\n\t// back with this one, in FIFO order, because leaving them queued would let\n\t// each later failure prepend a newer draft above older restored text.\n\tconst queued = mode.pendingUserInputs;\n\tconst restored = restoreUnsentPromptDraft(error, {\n\t\tturnStarted: options?.turnStarted === true,\n\t\trefused: options?.refused === true,\n\t\tdraft: [draft, ...queued.map((submission) => submission.draft)].join(RESTORED_DRAFT_SEPARATOR),\n\t\t// Expand first: a large paste lives in the editor's private paste registry\n\t\t// and shows only a `[paste #1 … chars]` marker in the visible buffer, and\n\t\t// setText() clears that registry. Reading the marker would round-trip dead\n\t\t// text and destroy the payload.\n\t\tgetEditorText: () => mode.editor.getExpandedText?.() ?? mode.editor.getText(),\n\t\tsetEditorText: (text) => mode.editor.setText(text),\n\t\teditorOwnsInput: () => mode.editorContainer.children.includes(mode.editor),\n\t\tfocusEditor: () => mode.ui.setFocus(mode.editor),\n\t\trequestRender: () => mode.ui.requestRender(),\n\t});\n\tif (restored) {\n\t\tqueued.length = 0;\n\t}\n\treturn restored;\n}\n\nexport function restoreRefusedSubmission(mode: InteractiveModeBase, error: unknown, draft: string): void {\n\tconst restored = restoreFailedSubmissionDraft(mode, error, draft, { refused: true });\n\tif (restored && (isEngineSendFailure(error) || isInteractiveEngineResourceReadinessError(error))) return;\n\tmode.showError(error instanceof Error ? error.message : \"Unknown error occurred\");\n}\n"]}
@@ -2,10 +2,20 @@ import { tryExecuteSessionSlashCommand } from "../../core/agent-session-prompt.j
2
2
  import { yieldToEventLoop } from "../../utils/event-loop.js";
3
3
  import { IsolatedInteractiveRuntime } from "../interactive-engine/isolated-runtime.js";
4
4
  import { InteractiveModeBase } from "./interactive-mode-base.js";
5
- import { restoreFailedSubmissionDraft } from "./interactive-prompt-restore.js";
5
+ import { restoreFailedSubmissionDraft, restoreRefusedSubmission } from "./interactive-prompt-restore.js";
6
6
  import { toInteractiveSubmission } from "./interactive-submission.js";
7
7
  InteractiveModeBase.prototype.runUserPromptTurn = async function (input) {
8
8
  const { text: userInput, draft } = toInteractiveSubmission(input);
9
+ const turn = this.promptTurn ?? { dispatched: false };
10
+ this.promptTurn = turn;
11
+ const settleDispatch = () => {
12
+ if (turn.dispatched)
13
+ return;
14
+ turn.dispatched = true;
15
+ if (this.compactionQueuedMessages.length > 0 && !this.compactionActive) {
16
+ void this.flushCompactionQueue({ afterPrompt: true });
17
+ }
18
+ };
9
19
  // Show the working spinner immediately on submit so there is no visible gap
10
20
  // while prompt preflight runs before the agent emits `agent_start`. The
11
21
  // ownership flag keeps deferred startup from tearing it down mid-way.
@@ -18,6 +28,7 @@ InteractiveModeBase.prototype.runUserPromptTurn = async function (input) {
18
28
  // A submission that never reaches an agent turn stays user-owned, so track
19
29
  // whether the turn actually started before deciding to restore the draft.
20
30
  let turnStarted = false;
31
+ let refused = false;
21
32
  const unsubscribeTurnStart = this.session.subscribe((event) => {
22
33
  if (event.type === "agent_start")
23
34
  turnStarted = true;
@@ -32,11 +43,24 @@ InteractiveModeBase.prototype.runUserPromptTurn = async function (input) {
32
43
  if (!(this.runtimeHost instanceof IsolatedInteractiveRuntime) || !this.isExtensionCommand(userInput)) {
33
44
  await this.session.resumeQueuedMessages();
34
45
  }
35
- await this.session.prompt(userInput);
46
+ await this.session.prompt(userInput, {
47
+ streamingBehavior: "steer",
48
+ preflightResult: (success, disposition) => {
49
+ refused = !success;
50
+ if (success && disposition === "queued")
51
+ this.discardDeferredRenderedUserInput(userInput);
52
+ if (success)
53
+ settleDispatch();
54
+ },
55
+ });
36
56
  }
37
57
  }
38
58
  catch (error) {
39
59
  this.discardDeferredRenderedUserInput(userInput);
60
+ if (refused && !turnStarted) {
61
+ restoreRefusedSubmission(this, error, draft);
62
+ return;
63
+ }
40
64
  const restored = restoreFailedSubmissionDraft(this, error, draft, { turnStarted });
41
65
  // A restored draft already tells the user the submission did not land, and
42
66
  // the recovery status explains why. A red transport error beside it is noise.
@@ -46,6 +70,10 @@ InteractiveModeBase.prototype.runUserPromptTurn = async function (input) {
46
70
  }
47
71
  finally {
48
72
  unsubscribeTurnStart();
73
+ if (this.promptTurn === turn)
74
+ this.promptTurn = undefined;
75
+ if (!refused || turnStarted)
76
+ settleDispatch();
49
77
  this.promptTurnWorkingLoaderActive = false;
50
78
  // A submission that resolves without starting an agent turn (e.g. a
51
79
  // handled slash command) never emits `agent_end`, so clear the pre-shown
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-prompt-turn.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-turn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAA8B,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAElG,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,WAEtD,KAAqC;IAErC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAClE,4EAA4E;IAC5E,wEAAwE;IACxE,sEAAsE;IACtE,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5B,MAAM,8BAA8B,GAAG,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,CAAC;IAChH,sEAAsE;IACtE,2CAA2C;IAC3C,MAAM,gBAAgB,EAAE,CAAC;IACzB,2EAA2E;IAC3E,0EAA0E;IAC1E,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,WAAW,GAAG,IAAI,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,IAAI,8BAA8B,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,mBAAmB,GACxB,CAAC,CAAC,IAAI,CAAC,WAAW,YAAY,0BAA0B,CAAC;YACzD,CAAC,MAAM,6BAA6B,CACnC,IAAI,CAAC,OAAiG,EACtG,SAAS,CACT,CAAC,CAAC;QACJ,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,YAAY,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtG,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAC3C,CAAC;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACnF,2EAA2E;QAC3E,8EAA8E;QAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;YAAS,CAAC;QACV,oBAAoB,EAAE,CAAC;QACvB,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;QAC3C,oEAAoE;QACpE,yEAAyE;QACzE,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC;IACF,CAAC;AACF,CAAC,CAAC","sourcesContent":["import type { AgentSessionInternalSurface } from \"../../core/agent-session-methods.ts\";\nimport { tryExecuteSessionSlashCommand } from \"../../core/agent-session-prompt.ts\";\nimport { yieldToEventLoop } from \"../../utils/event-loop.ts\";\nimport { IsolatedInteractiveRuntime } from \"../interactive-engine/isolated-runtime.js\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { restoreFailedSubmissionDraft } from \"./interactive-prompt-restore.ts\";\nimport { type InteractiveSubmission, toInteractiveSubmission } from \"./interactive-submission.ts\";\n\nInteractiveModeBase.prototype.runUserPromptTurn = async function (\n\tthis: InteractiveModeBase,\n\tinput: InteractiveSubmission | string,\n): Promise<void> {\n\tconst { text: userInput, draft } = toInteractiveSubmission(input);\n\t// Show the working spinner immediately on submit so there is no visible gap\n\t// while prompt preflight runs before the agent emits `agent_start`. The\n\t// ownership flag keeps deferred startup from tearing it down mid-way.\n\tthis.promptTurnWorkingLoaderActive = true;\n\tthis.showWorkingLoaderNow();\n\tconst deferredStartupNeedsPromptGate = this.deferredStartupPending || this.deferredStartupPromise !== undefined;\n\t// Yield once so the freshly-mounted spinner paints before synchronous\n\t// preflight work can block the event loop.\n\tawait yieldToEventLoop();\n\t// A submission that never reaches an agent turn stays user-owned, so track\n\t// whether the turn actually started before deciding to restore the draft.\n\tlet turnStarted = false;\n\tconst unsubscribeTurnStart = this.session.subscribe((event) => {\n\t\tif (event.type === \"agent_start\") turnStarted = true;\n\t});\n\ttry {\n\t\tif (deferredStartupNeedsPromptGate) {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t}\n\t\tconst handledSlashCommand =\n\t\t\t!(this.runtimeHost instanceof IsolatedInteractiveRuntime) &&\n\t\t\t(await tryExecuteSessionSlashCommand(\n\t\t\t\tthis.session as typeof this.session & Pick<AgentSessionInternalSurface, \"_tryExecuteExtensionCommand\">,\n\t\t\t\tuserInput,\n\t\t\t));\n\t\tif (!handledSlashCommand) {\n\t\t\tif (!(this.runtimeHost instanceof IsolatedInteractiveRuntime) || !this.isExtensionCommand(userInput)) {\n\t\t\t\tawait this.session.resumeQueuedMessages();\n\t\t\t}\n\t\t\tawait this.session.prompt(userInput);\n\t\t}\n\t} catch (error) {\n\t\tthis.discardDeferredRenderedUserInput(userInput);\n\t\tconst restored = restoreFailedSubmissionDraft(this, error, draft, { turnStarted });\n\t\t// A restored draft already tells the user the submission did not land, and\n\t\t// the recovery status explains why. A red transport error beside it is noise.\n\t\tif (!restored) {\n\t\t\tthis.showError(error instanceof Error ? error.message : \"Unknown error occurred\");\n\t\t}\n\t} finally {\n\t\tunsubscribeTurnStart();\n\t\tthis.promptTurnWorkingLoaderActive = false;\n\t\t// A submission that resolves without starting an agent turn (e.g. a\n\t\t// handled slash command) never emits `agent_end`, so clear the pre-shown\n\t\t// spinner here when idle to avoid a lingering indicator.\n\t\tif (!this.session.isStreaming) {\n\t\t\tthis.stopWorkingLoader();\n\t\t}\n\t}\n};\n"]}
1
+ {"version":3,"file":"interactive-prompt-turn.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-prompt-turn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionInternalSurface } from \"../../core/agent-session-methods.ts\";\nimport { tryExecuteSessionSlashCommand } from \"../../core/agent-session-prompt.ts\";\nimport { yieldToEventLoop } from \"../../utils/event-loop.ts\";\nimport { IsolatedInteractiveRuntime } from \"../interactive-engine/isolated-runtime.js\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { restoreFailedSubmissionDraft, restoreRefusedSubmission } from \"./interactive-prompt-restore.ts\";\nimport { type InteractiveSubmission, toInteractiveSubmission } from \"./interactive-submission.ts\";\n\nInteractiveModeBase.prototype.runUserPromptTurn = async function (\n\tthis: InteractiveModeBase,\n\tinput: InteractiveSubmission | string,\n): Promise<void> {\n\tconst { text: userInput, draft } = toInteractiveSubmission(input);\n\tconst turn = this.promptTurn ?? { dispatched: false };\n\tthis.promptTurn = turn;\n\tconst settleDispatch = (): void => {\n\t\tif (turn.dispatched) return;\n\t\tturn.dispatched = true;\n\t\tif (this.compactionQueuedMessages.length > 0 && !this.compactionActive) {\n\t\t\tvoid this.flushCompactionQueue({ afterPrompt: true });\n\t\t}\n\t};\n\t// Show the working spinner immediately on submit so there is no visible gap\n\t// while prompt preflight runs before the agent emits `agent_start`. The\n\t// ownership flag keeps deferred startup from tearing it down mid-way.\n\tthis.promptTurnWorkingLoaderActive = true;\n\tthis.showWorkingLoaderNow();\n\tconst deferredStartupNeedsPromptGate = this.deferredStartupPending || this.deferredStartupPromise !== undefined;\n\t// Yield once so the freshly-mounted spinner paints before synchronous\n\t// preflight work can block the event loop.\n\tawait yieldToEventLoop();\n\t// A submission that never reaches an agent turn stays user-owned, so track\n\t// whether the turn actually started before deciding to restore the draft.\n\tlet turnStarted = false;\n\tlet refused = false;\n\tconst unsubscribeTurnStart = this.session.subscribe((event) => {\n\t\tif (event.type === \"agent_start\") turnStarted = true;\n\t});\n\ttry {\n\t\tif (deferredStartupNeedsPromptGate) {\n\t\t\tawait this.ensureDeferredStartupComplete();\n\t\t}\n\t\tconst handledSlashCommand =\n\t\t\t!(this.runtimeHost instanceof IsolatedInteractiveRuntime) &&\n\t\t\t(await tryExecuteSessionSlashCommand(\n\t\t\t\tthis.session as typeof this.session & Pick<AgentSessionInternalSurface, \"_tryExecuteExtensionCommand\">,\n\t\t\t\tuserInput,\n\t\t\t));\n\t\tif (!handledSlashCommand) {\n\t\t\tif (!(this.runtimeHost instanceof IsolatedInteractiveRuntime) || !this.isExtensionCommand(userInput)) {\n\t\t\t\tawait this.session.resumeQueuedMessages();\n\t\t\t}\n\t\t\tawait this.session.prompt(userInput, {\n\t\t\t\tstreamingBehavior: \"steer\",\n\t\t\t\tpreflightResult: (success, disposition) => {\n\t\t\t\t\trefused = !success;\n\t\t\t\t\tif (success && disposition === \"queued\") this.discardDeferredRenderedUserInput(userInput);\n\t\t\t\t\tif (success) settleDispatch();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tthis.discardDeferredRenderedUserInput(userInput);\n\t\tif (refused && !turnStarted) {\n\t\t\trestoreRefusedSubmission(this, error, draft);\n\t\t\treturn;\n\t\t}\n\t\tconst restored = restoreFailedSubmissionDraft(this, error, draft, { turnStarted });\n\t\t// A restored draft already tells the user the submission did not land, and\n\t\t// the recovery status explains why. A red transport error beside it is noise.\n\t\tif (!restored) {\n\t\t\tthis.showError(error instanceof Error ? error.message : \"Unknown error occurred\");\n\t\t}\n\t} finally {\n\t\tunsubscribeTurnStart();\n\t\tif (this.promptTurn === turn) this.promptTurn = undefined;\n\t\tif (!refused || turnStarted) settleDispatch();\n\t\tthis.promptTurnWorkingLoaderActive = false;\n\t\t// A submission that resolves without starting an agent turn (e.g. a\n\t\t// handled slash command) never emits `agent_end`, so clear the pre-shown\n\t\t// spinner here when idle to avoid a lingering indicator.\n\t\tif (!this.session.isStreaming) {\n\t\t\tthis.stopWorkingLoader();\n\t\t}\n\t}\n};\n"]}
@@ -1,3 +1,4 @@
1
+ import { isRpcRequestAcceptedFailure } from "../rpc/rpc-transport-error.js";
1
2
  import { InteractiveModeBase } from "./interactive-mode-base.js";
2
3
  import { combineQueuedMessagesForEditor, Spacer, TruncatedText, theme } from "./interactive-mode-deps.js";
3
4
  InteractiveModeBase.prototype.getAllQueuedMessages = function () {
@@ -87,10 +88,15 @@ InteractiveModeBase.prototype.isExtensionCommand = function (text) {
87
88
  InteractiveModeBase.prototype.flushCompactionQueue = async function (options) {
88
89
  if (this.compactionFlushPending || this.compactionQueuedMessages.length === 0)
89
90
  return;
91
+ if (this.promptTurn?.dispatched === false)
92
+ return;
90
93
  this.compactionFlushPending = true;
91
94
  this.compactionSendFailed = false;
92
95
  try {
93
- await sendCompactionQueue(this, options?.willRetry === true);
96
+ if (options?.afterPrompt === true)
97
+ await sendHeldInput(this);
98
+ else
99
+ await sendCompactionQueue(this, options?.willRetry === true);
94
100
  }
95
101
  finally {
96
102
  this.compactionFlushPending = false;
@@ -163,21 +169,50 @@ async function startCompactionQueuePrompt(mode) {
163
169
  const first = takeNextCompactionMessage(mode);
164
170
  if (!first)
165
171
  return false;
172
+ const refused = await promptUntilAccepted(mode, first);
173
+ if (refused === undefined)
174
+ return true;
175
+ returnCompactionMessage(mode, first, refused.error);
176
+ return false;
177
+ }
178
+ async function promptUntilAccepted(mode, message, onQueued) {
166
179
  let accept;
167
180
  const accepted = new Promise((resolve) => {
168
181
  accept = resolve;
169
182
  });
170
- const prompt = mode.session.prompt(first.text, {
171
- streamingBehavior: first.mode,
172
- preflightResult: (success) => accept(success),
183
+ const prompt = mode.session.prompt(message.text, {
184
+ streamingBehavior: message.mode,
185
+ preflightResult: (success, disposition) => {
186
+ if (success && disposition === "queued")
187
+ onQueued?.();
188
+ accept(success);
189
+ },
173
190
  });
174
- prompt.then(() => accept(true), () => accept(false));
191
+ prompt.then(() => accept(true), (error) => accept(isRpcRequestAcceptedFailure(error)));
175
192
  if (await accepted) {
176
193
  prompt.catch((error) => showCompactionQueueError(mode, error));
177
- return true;
194
+ return undefined;
195
+ }
196
+ return {
197
+ error: await prompt.then(() => undefined, (error) => error),
198
+ };
199
+ }
200
+ async function sendHeldInput(mode) {
201
+ while (mode.compactionQueuedMessages.length > 0) {
202
+ const message = takeNextCompactionMessage(mode);
203
+ if (!message)
204
+ return;
205
+ const echoed = !message.text.startsWith("/");
206
+ if (echoed)
207
+ mode.renderDeferredUserInput(message.text);
208
+ const refused = await promptUntilAccepted(mode, message, echoed ? () => mode.discardDeferredRenderedUserInput(message.text) : undefined);
209
+ if (refused !== undefined) {
210
+ if (echoed)
211
+ mode.discardDeferredRenderedUserInput(message.text);
212
+ returnCompactionMessage(mode, message, refused.error);
213
+ return;
214
+ }
178
215
  }
179
- returnCompactionMessage(mode, first, await prompt.then(() => undefined, (error) => error));
180
- return false;
181
216
  }
182
217
  InteractiveModeBase.prototype.flushPendingBashComponents = function () {
183
218
  for (const component of this.pendingBashComponents) {
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-queueing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-queueing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { combineQueuedMessagesForEditor, Spacer, TruncatedText, theme } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage } from \"./interactive-mode-types.ts\";\n\nInteractiveModeBase.prototype.getAllQueuedMessages = function (this: InteractiveModeBase): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\treturn {\n\t\tsteering: [\n\t\t\t...this.session.getSteeringMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"steer\").map((msg) => msg.text),\n\t\t],\n\t\tfollowUp: [\n\t\t\t...this.session.getFollowUpMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"followUp\").map((msg) => msg.text),\n\t\t],\n\t};\n};\n\nInteractiveModeBase.prototype.clearAllQueues = function (\n\tthis: InteractiveModeBase,\n\toptions?: { preserveUnprotectedCustomMessages?: boolean },\n): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\tconst { steering, followUp } = this.session.clearQueue(options);\n\tconst compactionSteering = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"steer\")\n\t\t.map((msg) => msg.text);\n\tconst compactionFollowUp = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"followUp\")\n\t\t.map((msg) => msg.text);\n\tthis.compactionQueuedMessages = [];\n\tthis.compactionSendFailed = false;\n\treturn {\n\t\tsteering: [...steering, ...compactionSteering],\n\t\tfollowUp: [...followUp, ...compactionFollowUp],\n\t};\n};\n\nInteractiveModeBase.prototype.updatePendingMessagesDisplay = function (this: InteractiveModeBase): void {\n\tthis.pendingMessagesContainer.clear();\n\tconst { steering: steeringMessages, followUp: followUpMessages } = this.getAllQueuedMessages();\n\tif (steeringMessages.length > 0 || followUpMessages.length > 0) {\n\t\tthis.pendingMessagesContainer.addChild(new Spacer(1));\n\t\tfor (const message of steeringMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Steering: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tfor (const message of followUpMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Follow-up: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tconst dequeueHint = this.getAppKeyDisplay(\"app.message.dequeue\");\n\t\tconst hintText = theme.fg(\"dim\", `↳ ${dequeueHint} to edit all queued messages`);\n\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(hintText, 1, 0));\n\t}\n};\n\nInteractiveModeBase.prototype.restoreQueuedMessagesToEditor = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\tabort?: boolean;\n\t\tcurrentText?: string;\n\t\tpreserveUnprotectedCustomMessages?: boolean;\n\t},\n): number {\n\tconst { steering, followUp } = this.clearAllQueues(options);\n\tconst allQueued = [...steering, ...followUp];\n\tif (allQueued.length === 0) {\n\t\tthis.updatePendingMessagesDisplay();\n\t\tif (options?.abort) {\n\t\t\tvoid this.session.abort();\n\t\t}\n\t\treturn 0;\n\t}\n\tconst currentText = options?.currentText ?? this.editor.getText();\n\tconst combinedText = combineQueuedMessagesForEditor(allQueued, currentText);\n\tthis.editor.setText(combinedText);\n\tthis.updatePendingMessagesDisplay();\n\tif (options?.abort) {\n\t\tvoid this.session.abort();\n\t}\n\treturn allQueued.length;\n};\n\nInteractiveModeBase.prototype.queueCompactionMessage = function (\n\tthis: InteractiveModeBase,\n\ttext: string,\n\tmode: \"steer\" | \"followUp\",\n): void {\n\tthis.compactionQueuedMessages.push({ text, mode });\n\tthis.editor.addToHistory?.(text);\n\tthis.editor.setText(\"\");\n\tthis.updatePendingMessagesDisplay();\n\tif (this.compactionActive) {\n\t\tthis.showStatus(\"Queued message for after compaction\");\n\t\treturn;\n\t}\n\tif (!this.compactionFlushPending) void this.flushCompactionQueue({ willRetry: false });\n};\n\nInteractiveModeBase.prototype.isExtensionCommand = function (this: InteractiveModeBase, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\n\tconst extensionRunner = this.session.extensionRunner;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn !!extensionRunner.getCommand(commandName);\n};\n\nInteractiveModeBase.prototype.flushCompactionQueue = async function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\twillRetry?: boolean;\n\t},\n): Promise<void> {\n\tif (this.compactionFlushPending || this.compactionQueuedMessages.length === 0) return;\n\tthis.compactionFlushPending = true;\n\tthis.compactionSendFailed = false;\n\ttry {\n\t\tawait sendCompactionQueue(this, options?.willRetry === true);\n\t} finally {\n\t\tthis.compactionFlushPending = false;\n\t\tthis.updatePendingMessagesDisplay();\n\t}\n\tconst arrivedAfterDrain =\n\t\tthis.compactionQueuedMessages.length > 0 && !this.compactionSendFailed && !this.compactionActive;\n\tif (arrivedAfterDrain) await this.flushCompactionQueue(options);\n};\n\nasync function sendCompactionQueue(mode: InteractiveModeBase, willRetry: boolean): Promise<void> {\n\tconst queueOnly = !willRetry && (mode.session.isStreaming || mode.session.queuedMessagesPaused);\n\tif (queueOnly) {\n\t\tawait drainCompactionQueue(mode, (message) =>\n\t\t\tmode.session.prompt(message.text, { streamingBehavior: message.mode }),\n\t\t);\n\t\treturn;\n\t}\n\tif (!willRetry && !(await startCompactionQueuePrompt(mode))) return;\n\tawait drainCompactionQueue(mode, (message) => {\n\t\tif (mode.isExtensionCommand(message.text)) return mode.session.prompt(message.text);\n\t\tif (message.mode === \"followUp\") return mode.session.followUp(message.text);\n\t\treturn mode.session.steer(message.text);\n\t});\n}\n\nfunction showCompactionQueueError(mode: InteractiveModeBase, error: unknown): void {\n\tmode.showError(`Failed to send queued message: ${error instanceof Error ? error.message : String(error)}`);\n}\n\nfunction takeNextCompactionMessage(mode: InteractiveModeBase): CompactionQueuedMessage | undefined {\n\tconst [next, ...rest] = mode.compactionQueuedMessages;\n\tmode.compactionQueuedMessages = rest;\n\tmode.updatePendingMessagesDisplay();\n\treturn next;\n}\n\nfunction returnCompactionMessage(mode: InteractiveModeBase, message: CompactionQueuedMessage, error: unknown): void {\n\tmode.compactionQueuedMessages = [message, ...mode.compactionQueuedMessages];\n\tmode.compactionSendFailed = true;\n\tmode.updatePendingMessagesDisplay();\n\tshowCompactionQueueError(mode, error);\n}\n\n/**\n * Deliver messages one at a time from the front of the compaction queue. Input submitted meanwhile\n * joins the back of that queue, so a failed message returns to the front ahead of everything after it.\n */\nasync function drainCompactionQueue(\n\tmode: InteractiveModeBase,\n\tdeliver: (message: CompactionQueuedMessage) => Promise<unknown>,\n\tlimit = Number.POSITIVE_INFINITY,\n): Promise<boolean> {\n\tfor (let delivered = 0; delivered < limit; delivered++) {\n\t\tconst message = takeNextCompactionMessage(mode);\n\t\tif (!message) break;\n\t\ttry {\n\t\t\tawait deliver(message);\n\t\t} catch (error) {\n\t\t\treturnCompactionMessage(mode, message, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Run leading extension commands, then start the first prompt. The rest of the batch stays in the\n * compaction queue until that prompt is accepted, so a rejected prompt is restored ahead of it.\n */\nasync function startCompactionQueuePrompt(mode: InteractiveModeBase): Promise<boolean> {\n\tconst firstPromptIndex = mode.compactionQueuedMessages.findIndex(\n\t\t(message) => !mode.isExtensionCommand(message.text),\n\t);\n\tconst leadingCommands = firstPromptIndex === -1 ? mode.compactionQueuedMessages.length : firstPromptIndex;\n\tconst ranCommands = await drainCompactionQueue(\n\t\tmode,\n\t\t(message) => mode.session.prompt(message.text),\n\t\tleadingCommands,\n\t);\n\tif (!ranCommands) return false;\n\tconst first = takeNextCompactionMessage(mode);\n\tif (!first) return false;\n\tlet accept!: (accepted: boolean) => void;\n\tconst accepted = new Promise<boolean>((resolve) => {\n\t\taccept = resolve;\n\t});\n\tconst prompt = mode.session.prompt(first.text, {\n\t\tstreamingBehavior: first.mode,\n\t\tpreflightResult: (success) => accept(success),\n\t});\n\tprompt.then(\n\t\t() => accept(true),\n\t\t() => accept(false),\n\t);\n\tif (await accepted) {\n\t\tprompt.catch((error) => showCompactionQueueError(mode, error));\n\t\treturn true;\n\t}\n\treturnCompactionMessage(\n\t\tmode,\n\t\tfirst,\n\t\tawait prompt.then(\n\t\t\t() => undefined,\n\t\t\t(error: unknown) => error,\n\t\t),\n\t);\n\treturn false;\n}\n\nInteractiveModeBase.prototype.flushPendingBashComponents = function (this: InteractiveModeBase): void {\n\tfor (const component of this.pendingBashComponents) {\n\t\tthis.pendingMessagesContainer.removeChild(component);\n\t\tthis.chatContainer.addChild(component);\n\t}\n\tthis.pendingBashComponents = [];\n};\n"]}
1
+ {"version":3,"file":"interactive-queueing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-queueing.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRpcRequestAcceptedFailure } from \"../rpc/rpc-transport-error.ts\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { combineQueuedMessagesForEditor, Spacer, TruncatedText, theme } from \"./interactive-mode-deps.ts\";\nimport type { CompactionQueuedMessage } from \"./interactive-mode-types.ts\";\n\nInteractiveModeBase.prototype.getAllQueuedMessages = function (this: InteractiveModeBase): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\treturn {\n\t\tsteering: [\n\t\t\t...this.session.getSteeringMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"steer\").map((msg) => msg.text),\n\t\t],\n\t\tfollowUp: [\n\t\t\t...this.session.getFollowUpMessages(),\n\t\t\t...this.compactionQueuedMessages.filter((msg) => msg.mode === \"followUp\").map((msg) => msg.text),\n\t\t],\n\t};\n};\n\nInteractiveModeBase.prototype.clearAllQueues = function (\n\tthis: InteractiveModeBase,\n\toptions?: { preserveUnprotectedCustomMessages?: boolean },\n): {\n\tsteering: string[];\n\tfollowUp: string[];\n} {\n\tconst { steering, followUp } = this.session.clearQueue(options);\n\tconst compactionSteering = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"steer\")\n\t\t.map((msg) => msg.text);\n\tconst compactionFollowUp = this.compactionQueuedMessages\n\t\t.filter((msg) => msg.mode === \"followUp\")\n\t\t.map((msg) => msg.text);\n\tthis.compactionQueuedMessages = [];\n\tthis.compactionSendFailed = false;\n\treturn {\n\t\tsteering: [...steering, ...compactionSteering],\n\t\tfollowUp: [...followUp, ...compactionFollowUp],\n\t};\n};\n\nInteractiveModeBase.prototype.updatePendingMessagesDisplay = function (this: InteractiveModeBase): void {\n\tthis.pendingMessagesContainer.clear();\n\tconst { steering: steeringMessages, followUp: followUpMessages } = this.getAllQueuedMessages();\n\tif (steeringMessages.length > 0 || followUpMessages.length > 0) {\n\t\tthis.pendingMessagesContainer.addChild(new Spacer(1));\n\t\tfor (const message of steeringMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Steering: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tfor (const message of followUpMessages) {\n\t\t\tconst text = theme.fg(\"dim\", `Follow-up: ${message}`);\n\t\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));\n\t\t}\n\t\tconst dequeueHint = this.getAppKeyDisplay(\"app.message.dequeue\");\n\t\tconst hintText = theme.fg(\"dim\", `↳ ${dequeueHint} to edit all queued messages`);\n\t\tthis.pendingMessagesContainer.addChild(new TruncatedText(hintText, 1, 0));\n\t}\n};\n\nInteractiveModeBase.prototype.restoreQueuedMessagesToEditor = function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\tabort?: boolean;\n\t\tcurrentText?: string;\n\t\tpreserveUnprotectedCustomMessages?: boolean;\n\t},\n): number {\n\tconst { steering, followUp } = this.clearAllQueues(options);\n\tconst allQueued = [...steering, ...followUp];\n\tif (allQueued.length === 0) {\n\t\tthis.updatePendingMessagesDisplay();\n\t\tif (options?.abort) {\n\t\t\tvoid this.session.abort();\n\t\t}\n\t\treturn 0;\n\t}\n\tconst currentText = options?.currentText ?? this.editor.getText();\n\tconst combinedText = combineQueuedMessagesForEditor(allQueued, currentText);\n\tthis.editor.setText(combinedText);\n\tthis.updatePendingMessagesDisplay();\n\tif (options?.abort) {\n\t\tvoid this.session.abort();\n\t}\n\treturn allQueued.length;\n};\n\nInteractiveModeBase.prototype.queueCompactionMessage = function (\n\tthis: InteractiveModeBase,\n\ttext: string,\n\tmode: \"steer\" | \"followUp\",\n): void {\n\tthis.compactionQueuedMessages.push({ text, mode });\n\tthis.editor.addToHistory?.(text);\n\tthis.editor.setText(\"\");\n\tthis.updatePendingMessagesDisplay();\n\tif (this.compactionActive) {\n\t\tthis.showStatus(\"Queued message for after compaction\");\n\t\treturn;\n\t}\n\tif (!this.compactionFlushPending) void this.flushCompactionQueue({ willRetry: false });\n};\n\nInteractiveModeBase.prototype.isExtensionCommand = function (this: InteractiveModeBase, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\n\tconst extensionRunner = this.session.extensionRunner;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn !!extensionRunner.getCommand(commandName);\n};\n\nInteractiveModeBase.prototype.flushCompactionQueue = async function (\n\tthis: InteractiveModeBase,\n\toptions?: {\n\t\twillRetry?: boolean;\n\t\tafterPrompt?: boolean;\n\t},\n): Promise<void> {\n\tif (this.compactionFlushPending || this.compactionQueuedMessages.length === 0) return;\n\tif (this.promptTurn?.dispatched === false) return;\n\tthis.compactionFlushPending = true;\n\tthis.compactionSendFailed = false;\n\ttry {\n\t\tif (options?.afterPrompt === true) await sendHeldInput(this);\n\t\telse await sendCompactionQueue(this, options?.willRetry === true);\n\t} finally {\n\t\tthis.compactionFlushPending = false;\n\t\tthis.updatePendingMessagesDisplay();\n\t}\n\tconst arrivedAfterDrain =\n\t\tthis.compactionQueuedMessages.length > 0 && !this.compactionSendFailed && !this.compactionActive;\n\tif (arrivedAfterDrain) await this.flushCompactionQueue(options);\n};\n\nasync function sendCompactionQueue(mode: InteractiveModeBase, willRetry: boolean): Promise<void> {\n\tconst queueOnly = !willRetry && (mode.session.isStreaming || mode.session.queuedMessagesPaused);\n\tif (queueOnly) {\n\t\tawait drainCompactionQueue(mode, (message) =>\n\t\t\tmode.session.prompt(message.text, { streamingBehavior: message.mode }),\n\t\t);\n\t\treturn;\n\t}\n\tif (!willRetry && !(await startCompactionQueuePrompt(mode))) return;\n\tawait drainCompactionQueue(mode, (message) => {\n\t\tif (mode.isExtensionCommand(message.text)) return mode.session.prompt(message.text);\n\t\tif (message.mode === \"followUp\") return mode.session.followUp(message.text);\n\t\treturn mode.session.steer(message.text);\n\t});\n}\n\nfunction showCompactionQueueError(mode: InteractiveModeBase, error: unknown): void {\n\tmode.showError(`Failed to send queued message: ${error instanceof Error ? error.message : String(error)}`);\n}\n\nfunction takeNextCompactionMessage(mode: InteractiveModeBase): CompactionQueuedMessage | undefined {\n\tconst [next, ...rest] = mode.compactionQueuedMessages;\n\tmode.compactionQueuedMessages = rest;\n\tmode.updatePendingMessagesDisplay();\n\treturn next;\n}\n\nfunction returnCompactionMessage(mode: InteractiveModeBase, message: CompactionQueuedMessage, error: unknown): void {\n\tmode.compactionQueuedMessages = [message, ...mode.compactionQueuedMessages];\n\tmode.compactionSendFailed = true;\n\tmode.updatePendingMessagesDisplay();\n\tshowCompactionQueueError(mode, error);\n}\n\n/**\n * Deliver messages one at a time from the front of the compaction queue. Input submitted meanwhile\n * joins the back of that queue, so a failed message returns to the front ahead of everything after it.\n */\nasync function drainCompactionQueue(\n\tmode: InteractiveModeBase,\n\tdeliver: (message: CompactionQueuedMessage) => Promise<unknown>,\n\tlimit = Number.POSITIVE_INFINITY,\n): Promise<boolean> {\n\tfor (let delivered = 0; delivered < limit; delivered++) {\n\t\tconst message = takeNextCompactionMessage(mode);\n\t\tif (!message) break;\n\t\ttry {\n\t\t\tawait deliver(message);\n\t\t} catch (error) {\n\t\t\treturnCompactionMessage(mode, message, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Run leading extension commands, then start the first prompt. The rest of the batch stays in the\n * compaction queue until that prompt is accepted, so a rejected prompt is restored ahead of it.\n */\nasync function startCompactionQueuePrompt(mode: InteractiveModeBase): Promise<boolean> {\n\tconst firstPromptIndex = mode.compactionQueuedMessages.findIndex(\n\t\t(message) => !mode.isExtensionCommand(message.text),\n\t);\n\tconst leadingCommands = firstPromptIndex === -1 ? mode.compactionQueuedMessages.length : firstPromptIndex;\n\tconst ranCommands = await drainCompactionQueue(\n\t\tmode,\n\t\t(message) => mode.session.prompt(message.text),\n\t\tleadingCommands,\n\t);\n\tif (!ranCommands) return false;\n\tconst first = takeNextCompactionMessage(mode);\n\tif (!first) return false;\n\tconst refused = await promptUntilAccepted(mode, first);\n\tif (refused === undefined) return true;\n\treturnCompactionMessage(mode, first, refused.error);\n\treturn false;\n}\n\nasync function promptUntilAccepted(\n\tmode: InteractiveModeBase,\n\tmessage: CompactionQueuedMessage,\n\tonQueued?: () => void,\n): Promise<{ error: unknown } | undefined> {\n\tlet accept!: (accepted: boolean) => void;\n\tconst accepted = new Promise<boolean>((resolve) => {\n\t\taccept = resolve;\n\t});\n\tconst prompt = mode.session.prompt(message.text, {\n\t\tstreamingBehavior: message.mode,\n\t\tpreflightResult: (success, disposition) => {\n\t\t\tif (success && disposition === \"queued\") onQueued?.();\n\t\t\taccept(success);\n\t\t},\n\t});\n\tprompt.then(\n\t\t() => accept(true),\n\t\t(error: unknown) => accept(isRpcRequestAcceptedFailure(error)),\n\t);\n\tif (await accepted) {\n\t\tprompt.catch((error) => showCompactionQueueError(mode, error));\n\t\treturn undefined;\n\t}\n\treturn {\n\t\terror: await prompt.then(\n\t\t\t() => undefined,\n\t\t\t(error: unknown) => error,\n\t\t),\n\t};\n}\n\nasync function sendHeldInput(mode: InteractiveModeBase): Promise<void> {\n\twhile (mode.compactionQueuedMessages.length > 0) {\n\t\tconst message = takeNextCompactionMessage(mode);\n\t\tif (!message) return;\n\t\tconst echoed = !message.text.startsWith(\"/\");\n\t\tif (echoed) mode.renderDeferredUserInput(message.text);\n\t\tconst refused = await promptUntilAccepted(\n\t\t\tmode,\n\t\t\tmessage,\n\t\t\techoed ? () => mode.discardDeferredRenderedUserInput(message.text) : undefined,\n\t\t);\n\t\tif (refused !== undefined) {\n\t\t\tif (echoed) mode.discardDeferredRenderedUserInput(message.text);\n\t\t\treturnCompactionMessage(mode, message, refused.error);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nInteractiveModeBase.prototype.flushPendingBashComponents = function (this: InteractiveModeBase): void {\n\tfor (const component of this.pendingBashComponents) {\n\t\tthis.pendingMessagesContainer.removeChild(component);\n\t\tthis.chatContainer.addChild(component);\n\t}\n\tthis.pendingBashComponents = [];\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-startup.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,4BAA4B,CAAC;AA4CnF,eAAO,MAAM,8BAA8B,QAAO,OAAkC,CAAC;AA4HrF,wBAAgB,+CAA+C,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAWrG"}
1
+ {"version":3,"file":"interactive-startup.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-startup.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,4BAA4B,CAAC;AA6CnF,eAAO,MAAM,8BAA8B,QAAO,OAAkC,CAAC;AA4HrF,wBAAgB,+CAA+C,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAWrG"}
@@ -11,7 +11,7 @@ import { StartupIdentityComponent } from "./components/startup-identity.js";
11
11
  import { ThemedText } from "./components/themed-text.js";
12
12
  import { bindInitialEagerSession } from "./interactive-initial-session-binding.js";
13
13
  import { InteractiveModeBase, seedStartupInput } from "./interactive-mode-base.js";
14
- import { APP_NAME, APP_TITLE, checkForNewPiVersion, composeStartupIdentity, DefaultPackageManager, DynamicBorder, ENV_OFFLINE, ensureTool, getAgentDir, getChangelogPath, getCwdRelativePath, getEntriesForVersion, getEnvValue, getMarkdownTheme, getNewEntries, getPiUserAgent, isInstallTelemetryEnabled, Markdown, normalizeChangelogLinks, onThemeChange, os, parseChangelog, path, recordTimeSinceReset, Spacer, spawn, Text, theme, VERSION, VERSION_ADOPTION_ENDPOINT, visibleWidth, } from "./interactive-mode-deps.js";
14
+ import { APP_NAME, APP_TITLE, checkForNewPiVersion, composeStartupIdentity, DefaultPackageManager, DynamicBorder, ENV_OFFLINE, ensureTool, getAgentDir, getChangelogHighlights, getChangelogPath, getCwdRelativePath, getEntriesForVersion, getEnvValue, getMarkdownTheme, getNewEntries, getPiUserAgent, isInstallTelemetryEnabled, Markdown, normalizeChangelogLinks, onThemeChange, os, parseChangelog, path, recordTimeSinceReset, Spacer, spawn, Text, theme, VERSION, VERSION_ADOPTION_ENDPOINT, visibleWidth, } from "./interactive-mode-deps.js";
15
15
  import { refreshCatalogsAfterTuiStartup, updateProviderCountFromSnapshot, } from "./interactive-model-catalog-startup.js";
16
16
  import { ONBOARDING_COPY } from "./interactive-onboarding.js";
17
17
  import { holdTuiForStartupTrust } from "./interactive-startup-trust.js";
@@ -174,7 +174,7 @@ InteractiveModeBase.prototype.init = async function () {
174
174
  this.footerContainer,
175
175
  this.widgetContainerBelow,
176
176
  ]);
177
- this.ui.setFocus(this.extensionSelector ?? this.extensionInput ?? this.extensionEditor ?? this.editor);
177
+ this.ui.setFocus(this.extensionDialogs.at(-1)?.component ?? this.editor);
178
178
  this.setupKeyHandlers();
179
179
  this.setupEditorSubmitHandler();
180
180
  // Rebuild autocomplete whenever the engine child's command catalog arrives or
@@ -412,6 +412,7 @@ InteractiveModeBase.prototype.checkTmuxKeyboardSetup = async function () {
412
412
  }
413
413
  return undefined;
414
414
  };
415
+ const FULL_CHANGELOG_HINT = "Run `/changelog` for the full list of changes.";
415
416
  InteractiveModeBase.prototype.getChangelogForDisplay = function () {
416
417
  // Skip changelog for resumed/continued sessions (already have messages)
417
418
  if (this.session.state.messages.length > 0) {
@@ -431,7 +432,15 @@ InteractiveModeBase.prototype.getChangelogForDisplay = function () {
431
432
  if (currentEntries.length > 0) {
432
433
  this.settingsManager.setLastChangelogVersion(VERSION);
433
434
  this.reportInstallTelemetry(VERSION);
434
- return currentEntries.map((e) => normalizeChangelogLinks(e.content, e)).join("\n\n");
435
+ return currentEntries
436
+ .map((e) => {
437
+ const highlights = getChangelogHighlights(e);
438
+ if (!highlights)
439
+ return normalizeChangelogLinks(e.content, e);
440
+ const [heading] = e.content.split("\n");
441
+ return normalizeChangelogLinks(`${heading}\n\n${highlights}\n\n${FULL_CHANGELOG_HINT}`, e);
442
+ })
443
+ .join("\n\n");
435
444
  }
436
445
  return undefined;
437
446
  };