@bastani/atomic 0.9.13-alpha.2 → 0.9.13-alpha.4

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 (317) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/i-have-adhd/package.json +1 -1
  4. package/dist/builtin/intercom/CHANGELOG.md +14 -0
  5. package/dist/builtin/intercom/README.md +12 -12
  6. package/dist/builtin/intercom/incoming-message-delivery.ts +1 -1
  7. package/dist/builtin/intercom/index.ts +1 -1
  8. package/dist/builtin/intercom/intercom-tool.ts +1 -1
  9. package/dist/builtin/intercom/intercom-utils.ts +3 -6
  10. package/dist/builtin/intercom/package.json +1 -1
  11. package/dist/builtin/intercom/result-renderers.ts +1 -1
  12. package/dist/builtin/intercom/session-target.ts +1 -15
  13. package/dist/builtin/intercom/skills/intercom/SKILL.md +6 -6
  14. package/dist/builtin/intercom/terminal-ordering-barrier.ts +2 -2
  15. package/dist/builtin/intercom/ui/inline-message.ts +7 -5
  16. package/dist/builtin/intercom/ui/session-list.ts +23 -10
  17. package/dist/builtin/mcp/package.json +1 -1
  18. package/dist/builtin/subagents/CHANGELOG.md +19 -0
  19. package/dist/builtin/subagents/README.md +29 -73
  20. package/dist/builtin/subagents/package.json +2 -2
  21. package/dist/builtin/subagents/prompts/parallel-cleanup.md +1 -1
  22. package/dist/builtin/subagents/prompts/parallel-review.md +1 -1
  23. package/dist/builtin/subagents/prompts/review-loop.md +2 -2
  24. package/dist/builtin/subagents/skills/subagent/SKILL.md +23 -59
  25. package/dist/builtin/subagents/skills/tmux/SKILL.md +1 -1
  26. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -3
  27. package/dist/builtin/subagents/src/extension/doctor.ts +2 -14
  28. package/dist/builtin/subagents/src/extension/fanout-child.ts +1 -17
  29. package/dist/builtin/subagents/src/extension/index.ts +9 -70
  30. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  31. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +2 -2
  32. package/dist/builtin/subagents/src/extension/schemas.ts +2 -8
  33. package/dist/builtin/subagents/src/extension/tool-description.ts +2 -3
  34. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +1 -1
  35. package/dist/builtin/subagents/src/intercom/result-intercom.ts +5 -46
  36. package/dist/builtin/subagents/src/runs/{background → foreground}/completion-notification.ts +2 -2
  37. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +25 -88
  38. package/dist/builtin/subagents/src/runs/{background → foreground}/notify.ts +5 -5
  39. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -28
  40. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +3 -0
  41. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +2 -0
  42. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +0 -5
  43. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +30 -20
  44. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +4 -4
  45. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +0 -13
  46. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +104 -48
  47. package/dist/builtin/subagents/src/runs/inprocess/index.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +5 -5
  49. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +0 -7
  50. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +0 -10
  51. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +3 -108
  52. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +0 -4
  53. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  54. package/dist/builtin/subagents/src/shared/formatters.ts +3 -5
  55. package/dist/builtin/subagents/src/shared/model-resolution.ts +78 -0
  56. package/dist/builtin/subagents/src/shared/status-format.ts +4 -11
  57. package/dist/builtin/subagents/src/shared/types-config.ts +10 -9
  58. package/dist/builtin/subagents/src/shared/types-nested.ts +127 -0
  59. package/dist/builtin/subagents/src/shared/types-results.ts +2 -8
  60. package/dist/builtin/subagents/src/shared/types-runtime.ts +0 -9
  61. package/dist/builtin/subagents/src/shared/types.ts +1 -1
  62. package/dist/builtin/subagents/src/shared/utils.ts +1 -109
  63. package/dist/builtin/subagents/src/slash/slash-commands.ts +7 -17
  64. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -252
  65. package/dist/builtin/subagents/src/tui/render-layout.ts +4 -4
  66. package/dist/builtin/subagents/src/tui/render-result.ts +0 -9
  67. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -34
  68. package/dist/builtin/subagents/src/tui/render.ts +0 -2
  69. package/dist/builtin/web-access/package.json +1 -1
  70. package/dist/builtin/workflows/CHANGELOG.md +23 -0
  71. package/dist/builtin/workflows/README.md +3 -3
  72. package/dist/builtin/workflows/package.json +1 -1
  73. package/dist/builtin/workflows/src/durable/backend.ts +11 -0
  74. package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +63 -25
  75. package/dist/builtin/workflows/src/durable/completed-catalog.ts +166 -25
  76. package/dist/builtin/workflows/src/durable/dbos-backend.ts +42 -24
  77. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +2 -1
  78. package/dist/builtin/workflows/src/durable/run-timing.ts +28 -7
  79. package/dist/builtin/workflows/src/durable/scoped-backend.ts +4 -0
  80. package/dist/builtin/workflows/src/durable/targeted-inspection.ts +110 -0
  81. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +2 -2
  82. package/dist/builtin/workflows/src/engine/runtime.ts +19 -2
  83. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +3 -0
  84. package/dist/builtin/workflows/src/extension/index.bundle.mjs +750 -168
  85. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +6 -0
  86. package/dist/builtin/workflows/src/extension/ui-surface.ts +4 -0
  87. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +6 -1
  88. package/dist/builtin/workflows/src/extension/workflow-targets.ts +18 -10
  89. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +31 -16
  90. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +75 -3
  91. package/dist/builtin/workflows/src/extension/workflow-tool.ts +53 -6
  92. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +5 -1
  93. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +94 -60
  94. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +1 -1
  95. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +7 -7
  96. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +25 -4
  97. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  98. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +2 -0
  99. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +142 -4
  100. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +2 -0
  101. package/dist/builtin/workflows/src/runs/foreground/stage-session-heartbeat.ts +88 -0
  102. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +1 -0
  103. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +1 -0
  104. package/dist/builtin/workflows/src/tui/run-detail.ts +25 -12
  105. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +27 -8
  106. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +17 -1
  107. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +20 -3
  108. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +10 -1
  109. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +1 -0
  110. package/dist/core/agent-session-events.d.ts.map +1 -1
  111. package/dist/core/agent-session-events.js +22 -5
  112. package/dist/core/agent-session-events.js.map +1 -1
  113. package/dist/core/agent-session-export.d.ts.map +1 -1
  114. package/dist/core/agent-session-export.js +2 -1
  115. package/dist/core/agent-session-export.js.map +1 -1
  116. package/dist/core/agent-session-methods.d.ts +10 -4
  117. package/dist/core/agent-session-methods.d.ts.map +1 -1
  118. package/dist/core/agent-session-methods.js.map +1 -1
  119. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  120. package/dist/core/agent-session-prompt.js +68 -0
  121. package/dist/core/agent-session-prompt.js.map +1 -1
  122. package/dist/core/agent-session-queue-pause.d.ts.map +1 -1
  123. package/dist/core/agent-session-queue-pause.js +6 -0
  124. package/dist/core/agent-session-queue-pause.js.map +1 -1
  125. package/dist/core/agent-session-summary.d.ts +21 -0
  126. package/dist/core/agent-session-summary.d.ts.map +1 -0
  127. package/dist/core/agent-session-summary.js +156 -0
  128. package/dist/core/agent-session-summary.js.map +1 -0
  129. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  130. package/dist/core/agent-session-tool-registry.js +0 -4
  131. package/dist/core/agent-session-tool-registry.js.map +1 -1
  132. package/dist/core/agent-session-transfer.d.ts.map +1 -1
  133. package/dist/core/agent-session-transfer.js +0 -2
  134. package/dist/core/agent-session-transfer.js.map +1 -1
  135. package/dist/core/agent-session-tree.d.ts.map +1 -1
  136. package/dist/core/agent-session-tree.js +6 -0
  137. package/dist/core/agent-session-tree.js.map +1 -1
  138. package/dist/core/agent-session.d.ts +21 -3
  139. package/dist/core/agent-session.d.ts.map +1 -1
  140. package/dist/core/agent-session.js +22 -5
  141. package/dist/core/agent-session.js.map +1 -1
  142. package/dist/core/atomic-guide-command.js +2 -2
  143. package/dist/core/atomic-guide-command.js.map +1 -1
  144. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  145. package/dist/core/compaction/branch-summarization.js +1 -0
  146. package/dist/core/compaction/branch-summarization.js.map +1 -1
  147. package/dist/core/compaction/index.d.ts +1 -0
  148. package/dist/core/compaction/index.d.ts.map +1 -1
  149. package/dist/core/compaction/index.js +1 -0
  150. package/dist/core/compaction/index.js.map +1 -1
  151. package/dist/core/compaction/session-summarization.d.ts +41 -0
  152. package/dist/core/compaction/session-summarization.d.ts.map +1 -0
  153. package/dist/core/compaction/session-summarization.js +97 -0
  154. package/dist/core/compaction/session-summarization.js.map +1 -0
  155. package/dist/core/extensions/ui-types.d.ts +4 -0
  156. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  157. package/dist/core/extensions/ui-types.js.map +1 -1
  158. package/dist/core/keybindings.d.ts +0 -5
  159. package/dist/core/keybindings.d.ts.map +1 -1
  160. package/dist/core/keybindings.js +0 -2
  161. package/dist/core/keybindings.js.map +1 -1
  162. package/dist/core/session-manager-core.d.ts +3 -1
  163. package/dist/core/session-manager-core.d.ts.map +1 -1
  164. package/dist/core/session-manager-core.js +9 -1
  165. package/dist/core/session-manager-core.js.map +1 -1
  166. package/dist/core/session-manager-entries.d.ts +24 -1
  167. package/dist/core/session-manager-entries.d.ts.map +1 -1
  168. package/dist/core/session-manager-entries.js +48 -0
  169. package/dist/core/session-manager-entries.js.map +1 -1
  170. package/dist/core/session-manager-list.d.ts.map +1 -1
  171. package/dist/core/session-manager-list.js +10 -0
  172. package/dist/core/session-manager-list.js.map +1 -1
  173. package/dist/core/session-manager-types.d.ts +10 -1
  174. package/dist/core/session-manager-types.d.ts.map +1 -1
  175. package/dist/core/session-manager-types.js.map +1 -1
  176. package/dist/core/settings-manager-basic-accessors.d.ts +3 -0
  177. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  178. package/dist/core/settings-manager-basic-accessors.js +5 -0
  179. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +1 -1
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js.map +1 -1
  183. package/dist/core/settings-types.d.ts +4 -0
  184. package/dist/core/settings-types.d.ts.map +1 -1
  185. package/dist/core/settings-types.js.map +1 -1
  186. package/dist/core/slash-commands.js +2 -2
  187. package/dist/core/slash-commands.js.map +1 -1
  188. package/dist/core/tools/bash.d.ts +0 -15
  189. package/dist/core/tools/bash.d.ts.map +1 -1
  190. package/dist/core/tools/bash.js +3 -81
  191. package/dist/core/tools/bash.js.map +1 -1
  192. package/dist/core/tools/fetch-url.d.ts +12 -0
  193. package/dist/core/tools/fetch-url.d.ts.map +1 -1
  194. package/dist/core/tools/fetch-url.js +76 -10
  195. package/dist/core/tools/fetch-url.js.map +1 -1
  196. package/dist/core/tools/index.js +4 -4
  197. package/dist/core/tools/index.js.map +1 -1
  198. package/dist/core/tools/session-temp-dir.d.ts +2 -2
  199. package/dist/core/tools/session-temp-dir.d.ts.map +1 -1
  200. package/dist/core/tools/session-temp-dir.js +6 -7
  201. package/dist/core/tools/session-temp-dir.js.map +1 -1
  202. package/dist/core/usage-totals.js +1 -1
  203. package/dist/core/usage-totals.js.map +1 -1
  204. package/dist/index.d.ts +1 -1
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +1 -1
  207. package/dist/index.js.map +1 -1
  208. package/dist/modes/interactive/components/footer.js +1 -1
  209. package/dist/modes/interactive/components/footer.js.map +1 -1
  210. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/host-session-picker.js +1 -0
  212. package/dist/modes/interactive/components/host-session-picker.js.map +1 -1
  213. package/dist/modes/interactive/components/index.d.ts +1 -0
  214. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/index.js +1 -0
  216. package/dist/modes/interactive/components/index.js.map +1 -1
  217. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  218. package/dist/modes/interactive/components/session-selector-list.js +29 -4
  219. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  220. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  221. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  222. package/dist/modes/interactive/components/transcript-follow-indicator.d.ts +14 -0
  223. package/dist/modes/interactive/components/transcript-follow-indicator.d.ts.map +1 -0
  224. package/dist/modes/interactive/components/transcript-follow-indicator.js +36 -0
  225. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -0
  226. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  227. package/dist/modes/interactive/components/tree-selector-content.js +6 -0
  228. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  229. package/dist/modes/interactive/interactive-extension-custom-ui.js +3 -0
  230. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  231. package/dist/modes/interactive/interactive-input-handling.js +0 -3
  232. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  233. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  234. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  235. package/dist/modes/interactive/interactive-mode-base.js +7 -1
  236. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  237. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -3
  238. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  239. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  240. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  241. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  242. package/dist/modes/interactive/interactive-mode.js +1 -0
  243. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  244. package/dist/modes/interactive/interactive-slash-commands.js +2 -5
  245. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  246. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  247. package/dist/modes/interactive/interactive-startup.js +6 -0
  248. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  249. package/dist/modes/interactive/interactive-transcript-follow.d.ts +2 -0
  250. package/dist/modes/interactive/interactive-transcript-follow.d.ts.map +1 -0
  251. package/dist/modes/interactive/interactive-transcript-follow.js +6 -0
  252. package/dist/modes/interactive/interactive-transcript-follow.js.map +1 -0
  253. package/dist/modes/interactive/interactive-tui.d.ts +13 -1
  254. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  255. package/dist/modes/interactive/interactive-tui.js +59 -1
  256. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  257. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  258. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  259. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  260. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  261. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  262. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  263. package/dist/modes/interactive-engine/protocol.js +5 -1
  264. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  265. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  266. package/dist/modes/interactive-engine/remote-component.js +21 -9
  267. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  268. package/docs/environment-variables.md +1 -1
  269. package/docs/intercom.md +20 -21
  270. package/docs/keybindings.md +2 -5
  271. package/docs/quickstart.md +5 -1
  272. package/docs/sdk.md +1 -1
  273. package/docs/session-format.md +15 -0
  274. package/docs/sessions.md +8 -0
  275. package/docs/settings.md +6 -0
  276. package/docs/subagents.md +19 -31
  277. package/docs/tools.md +3 -5
  278. package/docs/usage.md +3 -1
  279. package/docs/windows.md +1 -1
  280. package/docs/workflows.md +60 -32
  281. package/npm-shrinkwrap.json +29 -29
  282. package/package.json +2 -2
  283. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +0 -331
  284. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +0 -161
  285. package/dist/builtin/subagents/src/runs/inprocess/background-single.ts +0 -195
  286. package/dist/builtin/subagents/src/runs/inprocess/background.ts +0 -90
  287. package/dist/builtin/subagents/src/shared/types-async.ts +0 -247
  288. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +0 -217
  289. package/dist/builtin/subagents/src/tui/render-widget.ts +0 -366
  290. package/dist/core/async/format.d.ts +0 -3
  291. package/dist/core/async/format.d.ts.map +0 -1
  292. package/dist/core/async/format.js +0 -52
  293. package/dist/core/async/format.js.map +0 -1
  294. package/dist/core/async/job-manager.d.ts +0 -40
  295. package/dist/core/async/job-manager.d.ts.map +0 -1
  296. package/dist/core/async/job-manager.js +0 -293
  297. package/dist/core/async/job-manager.js.map +0 -1
  298. package/dist/core/async/session-manager.d.ts +0 -16
  299. package/dist/core/async/session-manager.d.ts.map +0 -1
  300. package/dist/core/async/session-manager.js +0 -34
  301. package/dist/core/async/session-manager.js.map +0 -1
  302. package/dist/core/async/types.d.ts +0 -23
  303. package/dist/core/async/types.d.ts.map +0 -1
  304. package/dist/core/async/types.js +0 -2
  305. package/dist/core/async/types.js.map +0 -1
  306. package/dist/core/tools/bash-async-execution.d.ts +0 -27
  307. package/dist/core/tools/bash-async-execution.d.ts.map +0 -1
  308. package/dist/core/tools/bash-async-execution.js +0 -81
  309. package/dist/core/tools/bash-async-execution.js.map +0 -1
  310. package/dist/core/tools/bash-async-jobs.d.ts +0 -30
  311. package/dist/core/tools/bash-async-jobs.d.ts.map +0 -1
  312. package/dist/core/tools/bash-async-jobs.js +0 -87
  313. package/dist/core/tools/bash-async-jobs.js.map +0 -1
  314. package/dist/core/tools/bash-async-output.d.ts +0 -13
  315. package/dist/core/tools/bash-async-output.d.ts.map +0 -1
  316. package/dist/core/tools/bash-async-output.js +0 -122
  317. package/dist/core/tools/bash-async-output.js.map +0 -1
@@ -1,4 +1,6 @@
1
- import { APP_ACTION, isKeybindingsLike, matchesAction } from "./keybindings-adapter.js";
1
+ import { TRANSCRIPT_JUMP_TO_END_URL } from "@bastani/atomic";
2
+
3
+ import { APP_ACTION, isKeybindingsLike, matchesAction, TUI_ACTION } from "./keybindings-adapter.js";
2
4
  import { parseTerminalMouseInput, terminalMouseWheelDirection } from "./mouse-input.js";
3
5
  import { defaultResponseFor, handlePromptCardInput, isPromptEscapeInput } from "./prompt-card.js";
4
6
  import { releaseMountedCustomUi } from "./stage-chat-view-custom-ui.js";
@@ -18,6 +20,7 @@ import { PROMPT_SCROLL_STEP_ROWS, type StageChatViewContext } from "./stage-chat
18
20
  import { Key, matchesKey } from "./text-helpers.js";
19
21
 
20
22
  export function handleStageChatInput(ctx: StageChatViewContext, data: string): boolean {
23
+ if (data === TRANSCRIPT_JUMP_TO_END_URL) return handleStageChatJumpToBottom(ctx, data);
21
24
  const keybindings = isKeybindingsLike(ctx.piKeybindings) ? ctx.piKeybindings : undefined;
22
25
  // Only the default physical Ctrl+T belongs to the host thinking action. A
23
26
  // user remap may reuse an editor key, so let that key reach the composer.
@@ -51,6 +54,7 @@ export function handleStageChatInput(ctx: StageChatViewContext, data: string): b
51
54
  if (readOnlyPromptArchive && handlePromptScrollInput(ctx, data, true)) {
52
55
  return true;
53
56
  }
57
+ if (handleStageChatJumpToBottom(ctx, data)) return true;
54
58
  if (ctx.chatHost.handleScrollInput(data)) return true;
55
59
  if (matchesKey(data, Key.escape)) {
56
60
  if (ctx.chatHost.isCompacting() || ctx.chatHost.isBashRunning() || ctx.chatHost.isEditingBashCommand()) {
@@ -79,6 +83,14 @@ export function handleStageChatInput(ctx: StageChatViewContext, data: string): b
79
83
  if (blocked) return true;
80
84
  return ctx.chatHost.handleInput(data);
81
85
  }
86
+
87
+ function handleStageChatJumpToBottom(ctx: StageChatViewContext, data: string): boolean {
88
+ const keybindings = isKeybindingsLike(ctx.piKeybindings) ? ctx.piKeybindings : undefined;
89
+ if (data !== TRANSCRIPT_JUMP_TO_END_URL && !matchesAction(keybindings, data, TUI_ACTION.altScreenBottom))
90
+ return false;
91
+ ctx.chatHost.scrollToBottom();
92
+ return true;
93
+ }
82
94
  function handleToolsExpandInput(ctx: StageChatViewContext, data: string): boolean {
83
95
  const keybindings = isKeybindingsLike(ctx.piKeybindings) ? ctx.piKeybindings : undefined;
84
96
  if (!matchesAction(keybindings, data, APP_ACTION.toolsExpand)) return false;
@@ -106,6 +118,10 @@ function handleMountedCustomUiInput(ctx: StageChatViewContext, data: string): bo
106
118
  }
107
119
  // Let scroll input reach the transcript so history stays scrollable while the
108
120
  // question is shown, matching the standalone ask_user_question tool.
121
+ if (handleStageChatJumpToBottom(ctx, data)) {
122
+ ctx.requestRender?.();
123
+ return true;
124
+ }
109
125
  if (ctx.chatHost.handleScrollInput(data)) {
110
126
  ctx.requestRender?.();
111
127
  return true;
@@ -23,6 +23,7 @@
23
23
  * - https://pi.dev/docs/latest/tui (canonical Pi-tui component contract)
24
24
  */
25
25
 
26
+ import { keyText, TranscriptFollowIndicator } from "@bastani/atomic";
26
27
  import type { Component, Focusable } from "@earendil-works/pi-tui";
27
28
  import { fitStageChatFrame, planStageChatFrame } from "./stage-chat-layout.js";
28
29
  import {
@@ -157,6 +158,12 @@ export class StageChatView implements Component, Focusable {
157
158
  if (blocked) this.chatHost.scrollToBottom();
158
159
 
159
160
  let bodyLines: string[];
161
+ let transcriptBodyActive = false;
162
+ let reservedIndicatorLines: readonly string[] = [];
163
+ const indicator = new TranscriptFollowIndicator({
164
+ isFollowing: () => this.chatHost.bodyScrollFromBottom() === 0,
165
+ keyLabel: () => keyText("tui.altScreen.bottom"),
166
+ });
160
167
  if (bodyBudget <= 0) {
161
168
  bodyLines = [];
162
169
  } else if (promptActive) {
@@ -164,17 +171,27 @@ export class StageChatView implements Component, Focusable {
164
171
  } else if (blocked) {
165
172
  bodyLines = renderBlockedBody(ctx, w, bodyBudget, stage);
166
173
  } else if (!readOnlyArchive && isPaused(ctx, stage)) {
167
- bodyLines = renderPausedBody(ctx, w, bodyBudget);
174
+ reservedIndicatorLines = bodyBudget > 1 ? indicator.render(w) : [];
175
+ bodyLines = renderPausedBody(ctx, w, bodyBudget, reservedIndicatorLines, () => indicator.render(w));
168
176
  } else if (readOnlyArchive) {
169
- bodyLines = renderReadOnlyArchiveBody(ctx, w, bodyBudget, stage);
177
+ reservedIndicatorLines = bodyBudget > 1 ? indicator.render(w) : [];
178
+ bodyLines = renderReadOnlyArchiveBody(ctx, w, bodyBudget, stage, reservedIndicatorLines, () =>
179
+ indicator.render(w),
180
+ );
170
181
  } else {
182
+ transcriptBodyActive = true;
171
183
  bodyLines = this.chatHost.renderBody(w, bodyBudget);
172
184
  }
185
+ const indicatorLines = transcriptBodyActive && bodyBudget > 1 ? indicator.render(w) : [];
186
+ const indicatorVisible = indicatorLines.length > 0;
187
+ const dropBodyRow = transcriptBodyActive && indicatorVisible && bodyLines.length >= bodyBudget;
188
+ const visibleBodyLines = bodyLines.slice(dropBodyRow ? 1 : 0, bodyBudget);
173
189
 
174
190
  const lines = [
175
191
  ...headerLines,
176
192
  ...sepLines,
177
- ...bodyLines,
193
+ ...visibleBodyLines,
194
+ ...indicatorLines,
178
195
  ...visiblePendingLines,
179
196
  ...visibleWorkingLines,
180
197
  ...visibleUsageLines,
@@ -8,7 +8,11 @@
8
8
  * `stage-chat-view.ts`, and `stage-control-registry.ts`.
9
9
  */
10
10
 
11
- import type { ChatMessageRenderOptions, ReadonlyFooterDataProvider } from "@bastani/atomic";
11
+ import {
12
+ type ChatMessageRenderOptions,
13
+ type ReadonlyFooterDataProvider,
14
+ TRANSCRIPT_JUMP_TO_END_URL,
15
+ } from "@bastani/atomic";
12
16
  import type { Component, EditorComponent, EditorTheme, TUI } from "@earendil-works/pi-tui";
13
17
  import type { StageControlRegistry } from "../runs/foreground/stage-control-registry.js";
14
18
  import { stageQueuedUserMessageCount } from "../runs/foreground/stage-queued-user-messages.js";
@@ -340,6 +344,11 @@ export class WorkflowAttachPane implements Component {
340
344
  if (this._shouldQuarantineStagePromptEnter(data)) return true;
341
345
  return this.chatView.handleInput(data);
342
346
  }
347
+ // The overlay opts into internal UI actions for the whole adapter, so the
348
+ // graph view is offered the jump URL too. It draws no follow indicator and
349
+ // has nothing to jump to: decline so the host transcript stays the fallback
350
+ // instead of swallowing the activation.
351
+ if (data === TRANSCRIPT_JUMP_TO_END_URL) return false;
343
352
  if (this._shouldQuarantineGraphEnter(data)) return true;
344
353
  return this.graphView.handleInput(data);
345
354
  }
@@ -191,6 +191,7 @@ function toPickerRow(session: SessionInfo): PiHostSessionPickerRow {
191
191
  modifiedAt: session.modified.getTime(),
192
192
  messageCount: session.messageCount,
193
193
  firstMessage: session.firstMessage,
194
+ ...(session.summary !== undefined ? { summary: session.summary } : {}),
194
195
  allMessagesText: session.allMessagesText,
195
196
  ...(session.name !== undefined ? { name: session.name } : {}),
196
197
  ...(session.messageColor !== undefined ? { messageColor: session.messageColor } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-events.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAe,MAAM,8BAA8B,CAAC;AAE3F,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAS9F,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAI9B,MAAM,0BAA0B,CAAC;AAiBlC,wBAAgB,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIxE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAMzD;AAED,4EAA4E;AAE5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CA2B7F;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CA6B1F;AAED,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,YAAY,EAAE,GACtB,gBAAgB,GAAG,SAAS,CAQ9B;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyL7F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CA0BvF;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAQvF;AAED,wCAAwC;AAExC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAMtD;AAED,0CAA0C;AAE1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAMhF;AAED,8EAA8E;AAE9E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAS1F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,GAAG,IAAI,CAchH;AAED,kDAAkD;AAElD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE9F;AAED;;;;GAIG;AAEH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,yBAAyB,GAAG,MAAM,IAAI,CAU7F;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAK7D;AAED;;;GAGG;AAEH,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAchD;AAMD,uBAAuB;AAEvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;CAiBrC,CAAC"}
1
+ {"version":3,"file":"agent-session-events.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAe,MAAM,8BAA8B,CAAC;AAE3F,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAS9F,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAI9B,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIxE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAMzD;AAED,4EAA4E;AAE5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CA2B7F;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CA6B1F;AAED,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,YAAY,EAAE,GACtB,gBAAgB,GAAG,SAAS,CAQ9B;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsM7F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CA0BvF;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAQvF;AAED,wCAAwC;AAExC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAMtD;AAED,0CAA0C;AAE1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAMhF;AAED,8EAA8E;AAE9E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAS1F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,GAAG,IAAI,CAchH;AAED,kDAAkD;AAElD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE9F;AAED;;;;GAIG;AAEH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,yBAAyB,GAAG,MAAM,IAAI,CAU7F;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAK7D;AAED;;;GAGG;AAEH,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAmBhD;AAMD,uBAAuB;AAEvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;CAiBrC,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { cleanupSessionResources } from "@earendil-works/pi-ai/compat";
2
2
  import { isProtectedStreamingCustomMessage, markProtectedStreamingCustomMessageConsumed, markProtectedStreamingCustomMessagePersistenceFailed, persistProtectedStreamingCustomMessage, prepareProtectedStreamingCustomMessagesForDisposal, retryConsumedProtectedStreamingCustomMessages, } from "./agent-session-persistent-custom-messages.js";
3
3
  import { customMessageExcludesContext, isSingleGenericAbortTextContent, replacementAbortContent, } from "./agent-session-types.js";
4
- import { disposeSessionAsyncJobManager } from "./async/session-manager.js";
5
4
  import { formatCodexProviderError } from "./codex-errors.js";
6
5
  import { STALE_EXTENSION_CONTEXT_MESSAGE } from "./extensions/stale-context.js";
7
6
  import { normalizeMessageContent } from "./messages.js";
@@ -90,6 +89,11 @@ export async function _processAgentEvent(event) {
90
89
  const steeringIndex = this._steeringMessages.indexOf(messageText);
91
90
  if (steeringIndex !== -1) {
92
91
  this._steeringMessages.splice(steeringIndex, 1);
92
+ // The loop already polled this message out of the agent queue, so the
93
+ // pause hold can no longer reach it and Escape can no longer restore it
94
+ // to the editor. Record it so an interrupt that kills its reply before
95
+ // any output can still schedule that reply (issue #2362).
96
+ this._admittedQueuedMessageAwaitingReply = messageText;
93
97
  this._emitQueueUpdate();
94
98
  }
95
99
  else {
@@ -97,6 +101,7 @@ export async function _processAgentEvent(event) {
97
101
  const followUpIndex = this._followUpMessages.indexOf(messageText);
98
102
  if (followUpIndex !== -1) {
99
103
  this._followUpMessages.splice(followUpIndex, 1);
104
+ this._admittedQueuedMessageAwaitingReply = messageText;
100
105
  this._emitQueueUpdate();
101
106
  }
102
107
  }
@@ -235,6 +240,12 @@ export async function _processAgentEvent(event) {
235
240
  if (typeof this._restoreFallbackModel === "function")
236
241
  await this._restoreFallbackModel();
237
242
  }
243
+ // Launched last so the fallback lifecycle wins: a switch above returns before this line, and
244
+ // the restore has already put `this.model` back to the user's selection, which the launch
245
+ // reads synchronously before it parks on waitForIdle(). Guarded like the fallback methods
246
+ // above because the fallback suites drive this function on a synthetic session.
247
+ if (event.type === "agent_end" && typeof this._maybeGenerateSessionSummary === "function")
248
+ void this._maybeGenerateSessionSummary();
238
249
  }
239
250
  }
240
251
  export function _applyInterruptAbortMessage(event) {
@@ -421,17 +432,23 @@ export function _disconnectFromAgent() {
421
432
  * Call this when completely done with the session.
422
433
  */
423
434
  export function dispose() {
435
+ // Terminal and idempotent: callers legitimately dispose more than once (an explicit dispose
436
+ // followed by a harness teardown), and the steps below are not all safe to repeat.
437
+ if (this._disposed)
438
+ return;
439
+ // Summary work queued before its AbortController exists cannot be reached by
440
+ // abortSessionSummary(), so disposal is recorded as state that every checkpoint consults.
441
+ this._disposed = true;
442
+ // A background summary must never keep the process alive past shutdown.
443
+ this.abortSessionSummary();
424
444
  // Fail closed while protected input remains queued, or flush a consumed
425
445
  // reconciliation before invalidation can discard its recovery state.
426
446
  prepareProtectedStreamingCustomMessagesForDisposal(this);
427
447
  this._extensionRunner.invalidate(STALE_EXTENSION_CONTEXT_MESSAGE);
428
- disposeSessionAsyncJobManager(this._asyncJobManager, this._asyncJobManagerSessionId);
429
448
  this._disconnectFromAgent();
430
449
  this._eventListeners = [];
431
450
  cleanupSessionResources(this.sessionId);
432
- // Last: an async spill writer started by this session holds its own lease, so
433
- // releasing here stops protecting a tree nothing is using without cutting a
434
- // writer that outlived the session object.
451
+ // Releasing the session lease stops protecting a tree that is no longer in use.
435
452
  this._tempStorageLease?.release();
436
453
  this._tempStorageLease = undefined;
437
454
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-events.js","sourceRoot":"","sources":["../../src/core/agent-session-events.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent, AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Message, TextContent } from \"@earendil-works/pi-ai/compat\";\nimport { cleanupSessionResources } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport {\n\tisProtectedStreamingCustomMessage,\n\tmarkProtectedStreamingCustomMessageConsumed,\n\tmarkProtectedStreamingCustomMessagePersistenceFailed,\n\tpersistProtectedStreamingCustomMessage,\n\tprepareProtectedStreamingCustomMessagesForDisposal,\n\tretryConsumedProtectedStreamingCustomMessages,\n} from \"./agent-session-persistent-custom-messages.ts\";\nimport {\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\tcustomMessageExcludesContext,\n\tisSingleGenericAbortTextContent,\n\treplacementAbortContent,\n} from \"./agent-session-types.ts\";\nimport { disposeSessionAsyncJobManager } from \"./async/session-manager.js\";\nimport { formatCodexProviderError } from \"./codex-errors.ts\";\nimport type {\n\tMessageEndEvent,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tTurnEndEvent,\n\tTurnStartEvent,\n} from \"./extensions/index.ts\";\nimport { STALE_EXTENSION_CONTEXT_MESSAGE } from \"./extensions/stale-context.ts\";\nimport type { StageAdmittedCustomMessage } from \"./messages.ts\";\nimport { normalizeMessageContent } from \"./messages.ts\";\n\nexport function _emit(this: AgentSession, event: AgentSessionEvent): void {\n\tfor (const l of this._eventListeners) {\n\t\tl(event);\n\t}\n}\n\nexport function _emitQueueUpdate(this: AgentSession): void {\n\tthis._emit({\n\t\ttype: \"queue_update\",\n\t\tsteering: [...this._steeringMessages],\n\t\tfollowUp: [...this._followUpMessages],\n\t});\n}\n\n/** Internal handler for agent events - shared by subscribe and reconnect */\n\nexport function _handleAgentEvent(this: AgentSession, event: AgentEvent): Promise<void> | void {\n\t// Create retry promise synchronously before queueing async processing.\n\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t// and waitForRetry() can miss the in-flight retry.\n\tthis._createRetryPromiseForAgentEnd(event);\n\tconst awaitProtectedPersistence =\n\t\tevent.type === \"message_end\" && event.message.role === \"custom\"\n\t\t\t? markProtectedStreamingCustomMessageConsumed(this, event.message)\n\t\t\t: false;\n\n\tconst processing = this._agentEventQueue.then(\n\t\t() => this._processAgentEvent(event),\n\t\t() => this._processAgentEvent(event),\n\t);\n\tthis._agentEventQueue = processing;\n\n\t// Keep queue alive if an event handler fails. Agent-core must additionally\n\t// await protected persistence and fallback reconciliation before the next\n\t// provider request; other listener work stays nonblocking.\n\tprocessing.catch(() => {});\n\tif (\n\t\tawaitProtectedPersistence ||\n\t\t(event.type === \"agent_end\" && (this._fallbackModels.length > 0 || this._fallbackOriginModel !== undefined))\n\t)\n\t\treturn processing.catch(() => {});\n}\n\nexport function _createRetryPromiseForAgentEnd(this: AgentSession, event: AgentEvent): void {\n\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\treturn;\n\t}\n\n\tconst settings = this.settingsManager.getRetrySettings();\n\tif (!settings.enabled && this._fallbackModels.length === 0) {\n\t\treturn;\n\t}\n\n\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\tif (!lastAssistant) {\n\t\treturn;\n\t}\n\n\tconst fallbackable =\n\t\ttypeof this._isFallbackableError === \"function\"\n\t\t\t? this._isFallbackableError(lastAssistant)\n\t\t\t: this._isRetryableError(lastAssistant);\n\tconst retryable = this._isRetryableError(lastAssistant);\n\tconst shouldRetry =\n\t\tretryable || fallbackable || this._isEmptyCompletion(lastAssistant) || this._isSafetyRefusal(lastAssistant);\n\tif (!shouldRetry) {\n\t\treturn;\n\t}\n\n\tthis._retryPromise = new Promise((resolve) => {\n\t\tthis._retryResolve = resolve;\n\t});\n}\n\nexport function _findLastAssistantInMessages(\n\tthis: AgentSession,\n\tmessages: AgentMessage[],\n): AssistantMessage | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\treturn message as AssistantMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function _processAgentEvent(this: AgentSession, event: AgentEvent): Promise<void> {\n\tconst protectedMessage =\n\t\tevent.type === \"message_end\" &&\n\t\tevent.message.role === \"custom\" &&\n\t\tisProtectedStreamingCustomMessage(this, event.message)\n\t\t\t? event.message\n\t\t\t: undefined;\n\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t// This ensures the UI sees the updated queue state\n\tif (event.type === \"message_start\" && event.message.role === \"user\") {\n\t\tthis._overflowRecoveryAttempted = false;\n\t\tthis._recoverableLengthRecoveryAttempted = false;\n\t\tthis._fallbackAttemptedKeys.clear();\n\t\tthis._fallbackBlockedModels.length = 0;\n\t\tconst messageText = this._getUserMessageText(event.message);\n\t\tif (messageText) {\n\t\t\t// Check steering queue first\n\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\tif (steeringIndex !== -1) {\n\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\tthis._emitQueueUpdate();\n\t\t\t} else {\n\t\t\t\t// Check follow-up queue\n\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tthis._applyInterruptAbortMessage(event);\n\tthis._applyProviderErrorGuidance(event);\n\n\ttry {\n\t\t// Emit to extensions first, then notify all public listeners.\n\t\tawait this._emitExtensionEvent(event);\n\t\tthis._emit(event);\n\t} finally {\n\t\t// Agent-core has consumed this protected input already. Its durability\n\t\t// boundary cannot be skipped by a fallible extension or session listener.\n\t\tif (protectedMessage !== undefined) {\n\t\t\ttry {\n\t\t\t\tpersistProtectedStreamingCustomMessage(this, protectedMessage);\n\t\t\t} catch {\n\t\t\t\tmarkProtectedStreamingCustomMessagePersistenceFailed(this, protectedMessage);\n\t\t\t}\n\t\t\tretryConsumedProtectedStreamingCustomMessages(this);\n\t\t}\n\t}\n\n\t// Handle session persistence\n\tif (event.type === \"message_end\") {\n\t\t// Check if this is a custom message from extensions\n\t\tif (event.message.role === \"custom\") {\n\t\t\tconst admitted = event.message as StageAdmittedCustomMessage;\n\t\t\tif (protectedMessage === undefined) {\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tevent.message.customType,\n\t\t\t\t\tevent.message.content,\n\t\t\t\t\tevent.message.display,\n\t\t\t\t\tevent.message.details,\n\t\t\t\t\tcustomMessageExcludesContext(event.message),\n\t\t\t\t\tundefined,\n\t\t\t\t\tadmitted.stageAdmissionKey,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (\n\t\t\tevent.message.role === \"user\" ||\n\t\t\tevent.message.role === \"assistant\" ||\n\t\t\tevent.message.role === \"toolResult\"\n\t\t) {\n\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\tthis.sessionManager.appendMessage(event.message);\n\t\t}\n\t\t// Other message types (bashExecution, branchSummary) are persisted elsewhere\n\n\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tthis._lastAssistantMessage = event.message;\n\n\t\t\tconst assistantMsg = event.message as AssistantMessage;\n\t\t\t// A length stop preserves its one-shot recovery budget. Reset both\n\t\t\t// recovery kinds only once a non-truncated response completes.\n\t\t\tconst assistantFailed =\n\t\t\t\tassistantMsg.stopReason === \"error\" ||\n\t\t\t\tthis._isEmptyCompletion(assistantMsg) ||\n\t\t\t\tthis._isSafetyRefusal(assistantMsg);\n\t\t\tif (!assistantFailed && assistantMsg.stopReason !== \"length\") {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\tthis._recoverableLengthRecoveryAttempted = false;\n\t\t\t}\n\t\t\tif (!assistantFailed) {\n\t\t\t\tthis._contextOverflowUnresolved = false;\n\t\t\t\tthis._outputBudgetErrorContinuationAttempts = 0;\n\t\t\t}\n\t\t\tif (!assistantFailed && assistantMsg.stopReason === \"stop\") {\n\t\t\t\tthis._fallbackAttemptedKeys.clear();\n\t\t\t\tthis._fallbackBlockedModels.length = 0;\n\t\t\t}\n\n\t\t\t// A non-truncated assistant response means the length-continuation loop\n\t\t\t// made progress (or the turn completed cleanly), so reset the bounded\n\t\t\t// output-cap continuation counter.\n\t\t\tif (assistantMsg.stopReason !== \"length\") {\n\t\t\t\tthis._lengthContinuationAttempts = 0;\n\t\t\t}\n\n\t\t\t// Reset retry counter immediately on successful assistant response\n\t\t\t// This prevents accumulation across multiple LLM calls within a turn\n\t\t\tif (!assistantFailed && this._retryAttempt > 0) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t});\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t// A transient hidden-reconciliation write failure retries independently of\n\t// provider/card delivery and can never create another visible lifecycle card.\n\tretryConsumedProtectedStreamingCustomMessages(this);\n\n\t// Check auto-retry and auto-compaction after agent completes\n\tif (event.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\tconst msg = this._lastAssistantMessage;\n\t\tthis._lastAssistantMessage = undefined;\n\t\tconst postToolPreflightFailed =\n\t\t\tthis._postToolCompactionPreflightError !== undefined &&\n\t\t\tmsg.errorMessage === this._postToolCompactionPreflightError;\n\n\t\t// Check provider/model failures before compaction. Fallback eligibility is\n\t\t// broader than same-model retry eligibility: auth and request-incompatible\n\t\t// failures advance without re-requesting the failed model.\n\t\tconst fallbackableError =\n\t\t\t!postToolPreflightFailed &&\n\t\t\t(typeof this._isFallbackableError === \"function\"\n\t\t\t\t? this._isFallbackableError(msg)\n\t\t\t\t: this._isRetryableError(msg));\n\t\tconst retryableError = !postToolPreflightFailed && this._isRetryableError(msg);\n\t\tconst emptyCompletion =\n\t\t\t!postToolPreflightFailed && !retryableError && !fallbackableError && this._isEmptyCompletion(msg);\n\t\tconst safetyRefusal =\n\t\t\t!postToolPreflightFailed &&\n\t\t\t!retryableError &&\n\t\t\t!fallbackableError &&\n\t\t\t!emptyCompletion &&\n\t\t\tthis._isSafetyRefusal(msg);\n\t\tconst modelFailure = retryableError || fallbackableError || emptyCompletion || safetyRefusal;\n\t\tlet restoreAfterTurn = !modelFailure;\n\t\tif (modelFailure) {\n\t\t\tif (emptyCompletion && !msg.errorMessage) {\n\t\t\t\t// Surface a clear reason in the retry banner; empty completions carry no\n\t\t\t\t// provider error message of their own.\n\t\t\t\tmsg.errorMessage = \"Provider returned an empty completion\";\n\t\t\t} else if (safetyRefusal && !msg.errorMessage) {\n\t\t\t\tmsg.errorMessage = \"Provider returned a canned safety refusal\";\n\t\t\t}\n\t\t\tconst didRetry = await this._handleRetryableError(msg);\n\t\t\tif (didRetry) return; // Retry was initiated, don't proceed to compaction\n\t\t\trestoreAfterTurn = true;\n\t\t}\n\n\t\tthis._resolveRetry();\n\t\tthis._contextOverflowUnresolved = false;\n\t\tawait this._checkCompaction(msg);\n\t\t// Compaction owns context overflow first. Only once it is disabled, fails,\n\t\t// or reports the overflow unresolved may the chain spend a candidate on a\n\t\t// larger-context model, so a compactable first overflow costs nothing.\n\t\tif (this._contextOverflowUnresolved) {\n\t\t\tthis._contextOverflowUnresolved = false;\n\t\t\tif (typeof this._trySwitchToFallbackModel === \"function\" && (await this._trySwitchToFallbackModel(msg)))\n\t\t\t\treturn;\n\t\t\trestoreAfterTurn = true;\n\t\t}\n\t\t// Keep a fallback active across the compact-and-continue probe that belongs\n\t\t// to this same user turn. The probe restores it before a queued next turn,\n\t\t// or after a continuation settles.\n\t\tif (restoreAfterTurn && this._pendingPostCompactionContinuation === undefined) {\n\t\t\tif (typeof this._restoreFallbackModel === \"function\") await this._restoreFallbackModel();\n\t\t}\n\t}\n}\n\nexport function _applyInterruptAbortMessage(this: AgentSession, event: AgentEvent): void {\n\tconst abortMessage = this._activeInterruptAbortMessage;\n\tif (!abortMessage) return;\n\n\tif (event.type === \"tool_execution_end\" && event.isError && isSingleGenericAbortTextContent(event.result.content)) {\n\t\tevent.result.content = replacementAbortContent(abortMessage);\n\t\treturn;\n\t}\n\n\tif (event.type !== \"message_start\" && event.type !== \"message_end\") return;\n\n\tif (\n\t\tevent.message.role === \"toolResult\" &&\n\t\tevent.message.isError &&\n\t\tisSingleGenericAbortTextContent(event.message.content)\n\t) {\n\t\tevent.message.content = replacementAbortContent(abortMessage);\n\t\treturn;\n\t}\n\n\tif (event.message.role === \"assistant\") {\n\t\tconst assistantMessage = event.message as AssistantMessage;\n\t\tif (assistantMessage.stopReason === \"aborted\") {\n\t\t\tassistantMessage.errorMessage = abortMessage;\n\t\t}\n\t}\n}\n\nexport function _applyProviderErrorGuidance(this: AgentSession, event: AgentEvent): void {\n\tif (event.type !== \"message_start\" && event.type !== \"message_update\" && event.type !== \"message_end\") return;\n\tif (event.message.role !== \"assistant\") return;\n\n\tconst assistantMessage = event.message as AssistantMessage;\n\tif (assistantMessage.stopReason !== \"error\" || !assistantMessage.errorMessage) return;\n\n\tassistantMessage.errorMessage = formatCodexProviderError(assistantMessage.provider, assistantMessage.errorMessage);\n}\n\n/** Resolve the pending retry promise */\n\nexport function _resolveRetry(this: AgentSession): void {\n\tif (this._retryResolve) {\n\t\tthis._retryResolve();\n\t\tthis._retryResolve = undefined;\n\t\tthis._retryPromise = undefined;\n\t}\n}\n\n/** Extract text content from a message */\n\nexport function _getUserMessageText(this: AgentSession, message: Message): string {\n\tif (message.role !== \"user\") return \"\";\n\tconst content = message.content;\n\tif (typeof content === \"string\") return content;\n\tconst textBlocks = content.filter((c) => c.type === \"text\");\n\treturn textBlocks.map((c) => (c as TextContent).text).join(\"\");\n}\n\n/** Find the last assistant message in agent state (including aborted ones) */\n\nexport function _findLastAssistantMessage(this: AgentSession): AssistantMessage | undefined {\n\tconst messages = this.agent.state.messages;\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"assistant\") {\n\t\t\treturn msg as AssistantMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function _replaceMessageInPlace(this: AgentSession, target: AgentMessage, replacement: AgentMessage): void {\n\t// Agent-core stores the finalized message object in its state before emitting message_end.\n\t// SessionManager persistence happens later in _processAgentEvent() with event.message.\n\t// Mutating this object in place keeps agent state, later turn/agent events, listeners,\n\t// and the eventual SessionManager.appendMessage(event.message) persistence in sync.\n\tif (target === replacement) {\n\t\treturn;\n\t}\n\n\tconst targetRecord = target as unknown as Record<string, unknown>;\n\tfor (const key of Object.keys(targetRecord)) {\n\t\tdelete targetRecord[key];\n\t}\n\tObject.assign(targetRecord, replacement);\n}\n\n/** Emit extension events based on agent events */\n\nexport async function _emitExtensionEvent(this: AgentSession, event: AgentEvent): Promise<void> {\n\tif (event.type === \"agent_start\") {\n\t\tthis._turnIndex = 0;\n\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t} else if (event.type === \"agent_end\") {\n\t\tawait this._extensionRunner.emit({ type: \"agent_end\", messages: event.messages });\n\t} else if (event.type === \"turn_start\") {\n\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\ttype: \"turn_start\",\n\t\t\tturnIndex: this._turnIndex,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"turn_end\") {\n\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\ttype: \"turn_end\",\n\t\t\tturnIndex: this._turnIndex,\n\t\t\tmessage: event.message,\n\t\t\ttoolResults: event.toolResults,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\tthis._turnIndex++;\n\t} else if (event.type === \"message_start\") {\n\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\ttype: \"message_start\",\n\t\t\tmessage: event.message,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"message_update\") {\n\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\ttype: \"message_update\",\n\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"message_end\") {\n\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\ttype: \"message_end\",\n\t\t\tmessage: event.message,\n\t\t};\n\t\tconst replacement = await this._extensionRunner.emitMessageEnd(extensionEvent);\n\t\tif (replacement) {\n\t\t\tthis._replaceMessageInPlace(event.message, normalizeMessageContent(replacement));\n\t\t}\n\t} else if (event.type === \"tool_execution_start\") {\n\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\targs: event.args,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"tool_execution_update\") {\n\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\ttype: \"tool_execution_update\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\targs: event.args,\n\t\t\tpartialResult: event.partialResult,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"tool_execution_end\") {\n\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\tresult: event.result,\n\t\t\tisError: event.isError,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t}\n}\n\n/**\n * Subscribe to agent events.\n * Session persistence is handled internally (saves messages on message_end).\n * Multiple listeners can be added. Returns unsubscribe function for this listener.\n */\n\nexport function subscribe(this: AgentSession, listener: AgentSessionEventListener): () => void {\n\tthis._eventListeners.push(listener);\n\n\t// Return unsubscribe function for this specific listener\n\treturn () => {\n\t\tconst index = this._eventListeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tthis._eventListeners.splice(index, 1);\n\t\t}\n\t};\n}\n\n/** Disconnect from agent events during disposal. */\nexport function _disconnectFromAgent(this: AgentSession): void {\n\tif (this._unsubscribeAgent) {\n\t\tthis._unsubscribeAgent();\n\t\tthis._unsubscribeAgent = undefined;\n\t}\n}\n\n/**\n * Remove all listeners and disconnect from agent.\n * Call this when completely done with the session.\n */\n\nexport function dispose(this: AgentSession): void {\n\t// Fail closed while protected input remains queued, or flush a consumed\n\t// reconciliation before invalidation can discard its recovery state.\n\tprepareProtectedStreamingCustomMessagesForDisposal(this);\n\tthis._extensionRunner.invalidate(STALE_EXTENSION_CONTEXT_MESSAGE);\n\tdisposeSessionAsyncJobManager(this._asyncJobManager, this._asyncJobManagerSessionId);\n\tthis._disconnectFromAgent();\n\tthis._eventListeners = [];\n\tcleanupSessionResources(this.sessionId);\n\t// Last: an async spill writer started by this session holds its own lease, so\n\t// releasing here stops protecting a tree nothing is using without cutting a\n\t// writer that outlived the session object.\n\tthis._tempStorageLease?.release();\n\tthis._tempStorageLease = undefined;\n}\n\n// =========================================================================\n// Read-only State Access\n// =========================================================================\n\n/** Full agent state */\n\nexport const agentSessionEventsMethods = {\n\t_emit,\n\t_emitQueueUpdate,\n\t_handleAgentEvent,\n\t_createRetryPromiseForAgentEnd,\n\t_findLastAssistantInMessages,\n\t_processAgentEvent,\n\t_applyInterruptAbortMessage,\n\t_applyProviderErrorGuidance,\n\t_resolveRetry,\n\t_getUserMessageText,\n\t_findLastAssistantMessage,\n\t_replaceMessageInPlace,\n\t_emitExtensionEvent,\n\tsubscribe,\n\t_disconnectFromAgent,\n\tdispose,\n};\n"]}
1
+ {"version":3,"file":"agent-session-events.js","sourceRoot":"","sources":["../../src/core/agent-session-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EACN,iCAAiC,EACjC,2CAA2C,EAC3C,oDAAoD,EACpD,sCAAsC,EACtC,kDAAkD,EAClD,6CAA6C,GAC7C,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAGN,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAW7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,UAAU,KAAK,CAAqB,KAAwB;IACjE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,CAAC;IACV,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,IAAI,CAAC,KAAK,CAAC;QACV,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACrC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;KACrC,CAAC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,MAAM,UAAU,iBAAiB,CAAqB,KAAiB;IACtE,uEAAuE;IACvE,mFAAmF;IACnF,8EAA8E;IAC9E,gFAAgF;IAChF,mDAAmD;IACnD,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,yBAAyB,GAC9B,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;QAC9D,CAAC,CAAC,2CAA2C,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QAClE,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC5C,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CACpC,CAAC;IACF,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;IAEnC,2EAA2E;IAC3E,0EAA0E;IAC1E,2DAA2D;IAC3D,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3B,IACC,yBAAyB;QACzB,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC;QAE5G,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAqB,KAAiB;IACnF,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtD,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IACzD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO;IACR,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,OAAO;IACR,CAAC;IAED,MAAM,YAAY,GACjB,OAAO,IAAI,CAAC,oBAAoB,KAAK,UAAU;QAC9C,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,WAAW,GAChB,SAAS,IAAI,YAAY,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC7G,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO;IACR,CAAC;IAED,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC9B,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAE3C,QAAwB;IAExB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,OAA2B,CAAC;QACpC,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAqB,KAAiB;IAC7E,MAAM,gBAAgB,GACrB,KAAK,CAAC,IAAI,KAAK,aAAa;QAC5B,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;QAC/B,iCAAiC,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QACrD,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,SAAS,CAAC;IACd,4FAA4F;IAC5F,mDAAmD;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACrE,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QACxC,IAAI,CAAC,mCAAmC,GAAG,KAAK,CAAC;QACjD,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,WAAW,EAAE,CAAC;YACjB,6BAA6B;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClE,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAChD,sEAAsE;gBACtE,wEAAwE;gBACxE,uEAAuE;gBACvE,0DAA0D;gBAC1D,IAAI,CAAC,mCAAmC,GAAG,WAAW,CAAC;gBACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACP,wBAAwB;gBACxB,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAClE,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;oBAChD,IAAI,CAAC,mCAAmC,GAAG,WAAW,CAAC;oBACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,CAAC;QACJ,8DAA8D;QAC9D,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,uEAAuE;QACvE,0EAA0E;QAC1E,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACJ,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACR,oDAAoD,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YAC9E,CAAC;YACD,6CAA6C,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,oDAAoD;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAqC,CAAC;YAC7D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAC3C,KAAK,CAAC,OAAO,CAAC,UAAU,EACxB,KAAK,CAAC,OAAO,CAAC,OAAO,EACrB,KAAK,CAAC,OAAO,CAAC,OAAO,EACrB,KAAK,CAAC,OAAO,CAAC,OAAO,EACrB,4BAA4B,CAAC,KAAK,CAAC,OAAO,CAAC,EAC3C,SAAS,EACT,QAAQ,CAAC,iBAAiB,CAC1B,CAAC;YACH,CAAC;QACF,CAAC;aAAM,IACN,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAClC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,EAClC,CAAC;YACF,uDAAuD;YACvD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,6EAA6E;QAE7E,qEAAqE;QACrE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC;YAE3C,MAAM,YAAY,GAAG,KAAK,CAAC,OAA2B,CAAC;YACvD,mEAAmE;YACnE,+DAA+D;YAC/D,MAAM,eAAe,GACpB,YAAY,CAAC,UAAU,KAAK,OAAO;gBACnC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;gBACrC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,CAAC,eAAe,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC9D,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;gBACxC,IAAI,CAAC,mCAAmC,GAAG,KAAK,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACtB,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;gBACxC,IAAI,CAAC,sCAAsC,GAAG,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,eAAe,IAAI,YAAY,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC5D,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,CAAC;YAED,wEAAwE;YACxE,sEAAsE;YACtE,mCAAmC;YACnC,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC1C,IAAI,CAAC,2BAA2B,GAAG,CAAC,CAAC;YACtC,CAAC;YAED,mEAAmE;YACnE,qEAAqE;YACrE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI,CAAC,aAAa;iBAC3B,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,6CAA6C,CAAC,IAAI,CAAC,CAAC;IAEpD,6DAA6D;IAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACvC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,MAAM,uBAAuB,GAC5B,IAAI,CAAC,iCAAiC,KAAK,SAAS;YACpD,GAAG,CAAC,YAAY,KAAK,IAAI,CAAC,iCAAiC,CAAC;QAE7D,2EAA2E;QAC3E,2EAA2E;QAC3E,2DAA2D;QAC3D,MAAM,iBAAiB,GACtB,CAAC,uBAAuB;YACxB,CAAC,OAAO,IAAI,CAAC,oBAAoB,KAAK,UAAU;gBAC/C,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBAChC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC/E,MAAM,eAAe,GACpB,CAAC,uBAAuB,IAAI,CAAC,cAAc,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,aAAa,GAClB,CAAC,uBAAuB;YACxB,CAAC,cAAc;YACf,CAAC,iBAAiB;YAClB,CAAC,eAAe;YAChB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,YAAY,GAAG,cAAc,IAAI,iBAAiB,IAAI,eAAe,IAAI,aAAa,CAAC;QAC7F,IAAI,gBAAgB,GAAG,CAAC,YAAY,CAAC;QACrC,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,eAAe,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1C,yEAAyE;gBACzE,uCAAuC;gBACvC,GAAG,CAAC,YAAY,GAAG,uCAAuC,CAAC;YAC5D,CAAC;iBAAM,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC/C,GAAG,CAAC,YAAY,GAAG,2CAA2C,CAAC;YAChE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,QAAQ;gBAAE,OAAO,CAAC,mDAAmD;YACzE,gBAAgB,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEjC,2EAA2E;QAC3E,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACrC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACxC,IAAI,OAAO,IAAI,CAAC,yBAAyB,KAAK,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;gBACtG,OAAO;YACR,gBAAgB,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,4EAA4E;QAC5E,2EAA2E;QAC3E,mCAAmC;QACnC,IAAI,gBAAgB,IAAI,IAAI,CAAC,kCAAkC,KAAK,SAAS,EAAE,CAAC;YAC/E,IAAI,OAAO,IAAI,CAAC,qBAAqB,KAAK,UAAU;gBAAE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1F,CAAC;QACD,6FAA6F;QAC7F,0FAA0F;QAC1F,0FAA0F;QAC1F,gFAAgF;QAChF,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,4BAA4B,KAAK,UAAU;YACxF,KAAK,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAC3C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAqB,KAAiB;IAChF,MAAM,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC;IACvD,IAAI,CAAC,YAAY;QAAE,OAAO;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,IAAI,+BAA+B,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnH,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAC7D,OAAO;IACR,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO;IAE3E,IACC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;QACnC,KAAK,CAAC,OAAO,CAAC,OAAO;QACrB,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EACrD,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAA2B,CAAC;QAC3D,IAAI,gBAAgB,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC/C,gBAAgB,CAAC,YAAY,GAAG,YAAY,CAAC;QAC9C,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAqB,KAAiB;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO;IAC9G,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO;IAE/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAA2B,CAAC;IAC3D,IAAI,gBAAgB,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY;QAAE,OAAO;IAEtF,gBAAgB,CAAC,YAAY,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACpH,CAAC;AAED,wCAAwC;AAExC,MAAM,UAAU,aAAa;IAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IAChC,CAAC;AACF,CAAC;AAED,0CAA0C;AAE1C,MAAM,UAAU,mBAAmB,CAAqB,OAAgB;IACvE,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC5D,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,yBAAyB;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,OAAO,GAAuB,CAAC;QAChC,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAqB,MAAoB,EAAE,WAAyB;IACzG,2FAA2F;IAC3F,uFAAuF;IACvF,uFAAuF;IACvF,oFAAoF;IACpF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO;IACR,CAAC;IAED,MAAM,YAAY,GAAG,MAA4C,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,kDAAkD;AAElD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAqB,KAAiB;IAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,cAAc,GAAmB;YACtC,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,cAAc,GAAiB;YACpC,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC9B,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAsB;YACzC,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,KAAK,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAuB;YAC1C,IAAI,EAAE,gBAAgB;YACtB,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;SAClD,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACzC,MAAM,cAAc,GAAoB;YACvC,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/E,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QAClD,MAAM,cAAc,GAA4B;YAC/C,IAAI,EAAE,sBAAsB;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QACnD,MAAM,cAAc,GAA6B;YAChD,IAAI,EAAE,uBAAuB;YAC7B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,aAAa,EAAE,KAAK,CAAC,aAAa;SAClC,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAChD,MAAM,cAAc,GAA0B;YAC7C,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;AACF,CAAC;AAED;;;;GAIG;AAEH,MAAM,UAAU,SAAS,CAAqB,QAAmC;IAChF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEpC,yDAAyD;IACzD,OAAO,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB;IACnC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACpC,CAAC;AACF,CAAC;AAED;;;GAGG;AAEH,MAAM,UAAU,OAAO;IACtB,4FAA4F;IAC5F,mFAAmF;IACnF,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IAC3B,6EAA6E;IAC7E,0FAA0F;IAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACtB,wEAAwE;IACxE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,wEAAwE;IACxE,qEAAqE;IACrE,kDAAkD,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;IAClE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC1B,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,gFAAgF;IAChF,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;IAClC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,4EAA4E;AAC5E,yBAAyB;AACzB,4EAA4E;AAE5E,uBAAuB;AAEvB,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,KAAK;IACL,gBAAgB;IAChB,iBAAiB;IACjB,8BAA8B;IAC9B,4BAA4B;IAC5B,kBAAkB;IAClB,2BAA2B;IAC3B,2BAA2B;IAC3B,aAAa;IACb,mBAAmB;IACnB,yBAAyB;IACzB,sBAAsB;IACtB,mBAAmB;IACnB,SAAS;IACT,oBAAoB;IACpB,OAAO;CACP,CAAC","sourcesContent":["import type { AgentEvent, AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Message, TextContent } from \"@earendil-works/pi-ai/compat\";\nimport { cleanupSessionResources } from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport {\n\tisProtectedStreamingCustomMessage,\n\tmarkProtectedStreamingCustomMessageConsumed,\n\tmarkProtectedStreamingCustomMessagePersistenceFailed,\n\tpersistProtectedStreamingCustomMessage,\n\tprepareProtectedStreamingCustomMessagesForDisposal,\n\tretryConsumedProtectedStreamingCustomMessages,\n} from \"./agent-session-persistent-custom-messages.ts\";\nimport {\n\ttype AgentSessionEvent,\n\ttype AgentSessionEventListener,\n\tcustomMessageExcludesContext,\n\tisSingleGenericAbortTextContent,\n\treplacementAbortContent,\n} from \"./agent-session-types.ts\";\nimport { formatCodexProviderError } from \"./codex-errors.ts\";\nimport type {\n\tMessageEndEvent,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tTurnEndEvent,\n\tTurnStartEvent,\n} from \"./extensions/index.ts\";\nimport { STALE_EXTENSION_CONTEXT_MESSAGE } from \"./extensions/stale-context.ts\";\nimport type { StageAdmittedCustomMessage } from \"./messages.ts\";\nimport { normalizeMessageContent } from \"./messages.ts\";\n\nexport function _emit(this: AgentSession, event: AgentSessionEvent): void {\n\tfor (const l of this._eventListeners) {\n\t\tl(event);\n\t}\n}\n\nexport function _emitQueueUpdate(this: AgentSession): void {\n\tthis._emit({\n\t\ttype: \"queue_update\",\n\t\tsteering: [...this._steeringMessages],\n\t\tfollowUp: [...this._followUpMessages],\n\t});\n}\n\n/** Internal handler for agent events - shared by subscribe and reconnect */\n\nexport function _handleAgentEvent(this: AgentSession, event: AgentEvent): Promise<void> | void {\n\t// Create retry promise synchronously before queueing async processing.\n\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t// and waitForRetry() can miss the in-flight retry.\n\tthis._createRetryPromiseForAgentEnd(event);\n\tconst awaitProtectedPersistence =\n\t\tevent.type === \"message_end\" && event.message.role === \"custom\"\n\t\t\t? markProtectedStreamingCustomMessageConsumed(this, event.message)\n\t\t\t: false;\n\n\tconst processing = this._agentEventQueue.then(\n\t\t() => this._processAgentEvent(event),\n\t\t() => this._processAgentEvent(event),\n\t);\n\tthis._agentEventQueue = processing;\n\n\t// Keep queue alive if an event handler fails. Agent-core must additionally\n\t// await protected persistence and fallback reconciliation before the next\n\t// provider request; other listener work stays nonblocking.\n\tprocessing.catch(() => {});\n\tif (\n\t\tawaitProtectedPersistence ||\n\t\t(event.type === \"agent_end\" && (this._fallbackModels.length > 0 || this._fallbackOriginModel !== undefined))\n\t)\n\t\treturn processing.catch(() => {});\n}\n\nexport function _createRetryPromiseForAgentEnd(this: AgentSession, event: AgentEvent): void {\n\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\treturn;\n\t}\n\n\tconst settings = this.settingsManager.getRetrySettings();\n\tif (!settings.enabled && this._fallbackModels.length === 0) {\n\t\treturn;\n\t}\n\n\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\tif (!lastAssistant) {\n\t\treturn;\n\t}\n\n\tconst fallbackable =\n\t\ttypeof this._isFallbackableError === \"function\"\n\t\t\t? this._isFallbackableError(lastAssistant)\n\t\t\t: this._isRetryableError(lastAssistant);\n\tconst retryable = this._isRetryableError(lastAssistant);\n\tconst shouldRetry =\n\t\tretryable || fallbackable || this._isEmptyCompletion(lastAssistant) || this._isSafetyRefusal(lastAssistant);\n\tif (!shouldRetry) {\n\t\treturn;\n\t}\n\n\tthis._retryPromise = new Promise((resolve) => {\n\t\tthis._retryResolve = resolve;\n\t});\n}\n\nexport function _findLastAssistantInMessages(\n\tthis: AgentSession,\n\tmessages: AgentMessage[],\n): AssistantMessage | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\treturn message as AssistantMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function _processAgentEvent(this: AgentSession, event: AgentEvent): Promise<void> {\n\tconst protectedMessage =\n\t\tevent.type === \"message_end\" &&\n\t\tevent.message.role === \"custom\" &&\n\t\tisProtectedStreamingCustomMessage(this, event.message)\n\t\t\t? event.message\n\t\t\t: undefined;\n\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t// This ensures the UI sees the updated queue state\n\tif (event.type === \"message_start\" && event.message.role === \"user\") {\n\t\tthis._overflowRecoveryAttempted = false;\n\t\tthis._recoverableLengthRecoveryAttempted = false;\n\t\tthis._fallbackAttemptedKeys.clear();\n\t\tthis._fallbackBlockedModels.length = 0;\n\t\tconst messageText = this._getUserMessageText(event.message);\n\t\tif (messageText) {\n\t\t\t// Check steering queue first\n\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\tif (steeringIndex !== -1) {\n\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\t// The loop already polled this message out of the agent queue, so the\n\t\t\t\t// pause hold can no longer reach it and Escape can no longer restore it\n\t\t\t\t// to the editor. Record it so an interrupt that kills its reply before\n\t\t\t\t// any output can still schedule that reply (issue #2362).\n\t\t\t\tthis._admittedQueuedMessageAwaitingReply = messageText;\n\t\t\t\tthis._emitQueueUpdate();\n\t\t\t} else {\n\t\t\t\t// Check follow-up queue\n\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\tthis._admittedQueuedMessageAwaitingReply = messageText;\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tthis._applyInterruptAbortMessage(event);\n\tthis._applyProviderErrorGuidance(event);\n\n\ttry {\n\t\t// Emit to extensions first, then notify all public listeners.\n\t\tawait this._emitExtensionEvent(event);\n\t\tthis._emit(event);\n\t} finally {\n\t\t// Agent-core has consumed this protected input already. Its durability\n\t\t// boundary cannot be skipped by a fallible extension or session listener.\n\t\tif (protectedMessage !== undefined) {\n\t\t\ttry {\n\t\t\t\tpersistProtectedStreamingCustomMessage(this, protectedMessage);\n\t\t\t} catch {\n\t\t\t\tmarkProtectedStreamingCustomMessagePersistenceFailed(this, protectedMessage);\n\t\t\t}\n\t\t\tretryConsumedProtectedStreamingCustomMessages(this);\n\t\t}\n\t}\n\n\t// Handle session persistence\n\tif (event.type === \"message_end\") {\n\t\t// Check if this is a custom message from extensions\n\t\tif (event.message.role === \"custom\") {\n\t\t\tconst admitted = event.message as StageAdmittedCustomMessage;\n\t\t\tif (protectedMessage === undefined) {\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tevent.message.customType,\n\t\t\t\t\tevent.message.content,\n\t\t\t\t\tevent.message.display,\n\t\t\t\t\tevent.message.details,\n\t\t\t\t\tcustomMessageExcludesContext(event.message),\n\t\t\t\t\tundefined,\n\t\t\t\t\tadmitted.stageAdmissionKey,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (\n\t\t\tevent.message.role === \"user\" ||\n\t\t\tevent.message.role === \"assistant\" ||\n\t\t\tevent.message.role === \"toolResult\"\n\t\t) {\n\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\tthis.sessionManager.appendMessage(event.message);\n\t\t}\n\t\t// Other message types (bashExecution, branchSummary) are persisted elsewhere\n\n\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\tif (event.message.role === \"assistant\") {\n\t\t\tthis._lastAssistantMessage = event.message;\n\n\t\t\tconst assistantMsg = event.message as AssistantMessage;\n\t\t\t// A length stop preserves its one-shot recovery budget. Reset both\n\t\t\t// recovery kinds only once a non-truncated response completes.\n\t\t\tconst assistantFailed =\n\t\t\t\tassistantMsg.stopReason === \"error\" ||\n\t\t\t\tthis._isEmptyCompletion(assistantMsg) ||\n\t\t\t\tthis._isSafetyRefusal(assistantMsg);\n\t\t\tif (!assistantFailed && assistantMsg.stopReason !== \"length\") {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\tthis._recoverableLengthRecoveryAttempted = false;\n\t\t\t}\n\t\t\tif (!assistantFailed) {\n\t\t\t\tthis._contextOverflowUnresolved = false;\n\t\t\t\tthis._outputBudgetErrorContinuationAttempts = 0;\n\t\t\t}\n\t\t\tif (!assistantFailed && assistantMsg.stopReason === \"stop\") {\n\t\t\t\tthis._fallbackAttemptedKeys.clear();\n\t\t\t\tthis._fallbackBlockedModels.length = 0;\n\t\t\t}\n\n\t\t\t// A non-truncated assistant response means the length-continuation loop\n\t\t\t// made progress (or the turn completed cleanly), so reset the bounded\n\t\t\t// output-cap continuation counter.\n\t\t\tif (assistantMsg.stopReason !== \"length\") {\n\t\t\t\tthis._lengthContinuationAttempts = 0;\n\t\t\t}\n\n\t\t\t// Reset retry counter immediately on successful assistant response\n\t\t\t// This prevents accumulation across multiple LLM calls within a turn\n\t\t\tif (!assistantFailed && this._retryAttempt > 0) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t});\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t// A transient hidden-reconciliation write failure retries independently of\n\t// provider/card delivery and can never create another visible lifecycle card.\n\tretryConsumedProtectedStreamingCustomMessages(this);\n\n\t// Check auto-retry and auto-compaction after agent completes\n\tif (event.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\tconst msg = this._lastAssistantMessage;\n\t\tthis._lastAssistantMessage = undefined;\n\t\tconst postToolPreflightFailed =\n\t\t\tthis._postToolCompactionPreflightError !== undefined &&\n\t\t\tmsg.errorMessage === this._postToolCompactionPreflightError;\n\n\t\t// Check provider/model failures before compaction. Fallback eligibility is\n\t\t// broader than same-model retry eligibility: auth and request-incompatible\n\t\t// failures advance without re-requesting the failed model.\n\t\tconst fallbackableError =\n\t\t\t!postToolPreflightFailed &&\n\t\t\t(typeof this._isFallbackableError === \"function\"\n\t\t\t\t? this._isFallbackableError(msg)\n\t\t\t\t: this._isRetryableError(msg));\n\t\tconst retryableError = !postToolPreflightFailed && this._isRetryableError(msg);\n\t\tconst emptyCompletion =\n\t\t\t!postToolPreflightFailed && !retryableError && !fallbackableError && this._isEmptyCompletion(msg);\n\t\tconst safetyRefusal =\n\t\t\t!postToolPreflightFailed &&\n\t\t\t!retryableError &&\n\t\t\t!fallbackableError &&\n\t\t\t!emptyCompletion &&\n\t\t\tthis._isSafetyRefusal(msg);\n\t\tconst modelFailure = retryableError || fallbackableError || emptyCompletion || safetyRefusal;\n\t\tlet restoreAfterTurn = !modelFailure;\n\t\tif (modelFailure) {\n\t\t\tif (emptyCompletion && !msg.errorMessage) {\n\t\t\t\t// Surface a clear reason in the retry banner; empty completions carry no\n\t\t\t\t// provider error message of their own.\n\t\t\t\tmsg.errorMessage = \"Provider returned an empty completion\";\n\t\t\t} else if (safetyRefusal && !msg.errorMessage) {\n\t\t\t\tmsg.errorMessage = \"Provider returned a canned safety refusal\";\n\t\t\t}\n\t\t\tconst didRetry = await this._handleRetryableError(msg);\n\t\t\tif (didRetry) return; // Retry was initiated, don't proceed to compaction\n\t\t\trestoreAfterTurn = true;\n\t\t}\n\n\t\tthis._resolveRetry();\n\t\tthis._contextOverflowUnresolved = false;\n\t\tawait this._checkCompaction(msg);\n\n\t\t// Compaction owns context overflow first. Only once it is disabled, fails,\n\t\t// or reports the overflow unresolved may the chain spend a candidate on a\n\t\t// larger-context model, so a compactable first overflow costs nothing.\n\t\tif (this._contextOverflowUnresolved) {\n\t\t\tthis._contextOverflowUnresolved = false;\n\t\t\tif (typeof this._trySwitchToFallbackModel === \"function\" && (await this._trySwitchToFallbackModel(msg)))\n\t\t\t\treturn;\n\t\t\trestoreAfterTurn = true;\n\t\t}\n\t\t// Keep a fallback active across the compact-and-continue probe that belongs\n\t\t// to this same user turn. The probe restores it before a queued next turn,\n\t\t// or after a continuation settles.\n\t\tif (restoreAfterTurn && this._pendingPostCompactionContinuation === undefined) {\n\t\t\tif (typeof this._restoreFallbackModel === \"function\") await this._restoreFallbackModel();\n\t\t}\n\t\t// Launched last so the fallback lifecycle wins: a switch above returns before this line, and\n\t\t// the restore has already put `this.model` back to the user's selection, which the launch\n\t\t// reads synchronously before it parks on waitForIdle(). Guarded like the fallback methods\n\t\t// above because the fallback suites drive this function on a synthetic session.\n\t\tif (event.type === \"agent_end\" && typeof this._maybeGenerateSessionSummary === \"function\")\n\t\t\tvoid this._maybeGenerateSessionSummary();\n\t}\n}\n\nexport function _applyInterruptAbortMessage(this: AgentSession, event: AgentEvent): void {\n\tconst abortMessage = this._activeInterruptAbortMessage;\n\tif (!abortMessage) return;\n\n\tif (event.type === \"tool_execution_end\" && event.isError && isSingleGenericAbortTextContent(event.result.content)) {\n\t\tevent.result.content = replacementAbortContent(abortMessage);\n\t\treturn;\n\t}\n\n\tif (event.type !== \"message_start\" && event.type !== \"message_end\") return;\n\n\tif (\n\t\tevent.message.role === \"toolResult\" &&\n\t\tevent.message.isError &&\n\t\tisSingleGenericAbortTextContent(event.message.content)\n\t) {\n\t\tevent.message.content = replacementAbortContent(abortMessage);\n\t\treturn;\n\t}\n\n\tif (event.message.role === \"assistant\") {\n\t\tconst assistantMessage = event.message as AssistantMessage;\n\t\tif (assistantMessage.stopReason === \"aborted\") {\n\t\t\tassistantMessage.errorMessage = abortMessage;\n\t\t}\n\t}\n}\n\nexport function _applyProviderErrorGuidance(this: AgentSession, event: AgentEvent): void {\n\tif (event.type !== \"message_start\" && event.type !== \"message_update\" && event.type !== \"message_end\") return;\n\tif (event.message.role !== \"assistant\") return;\n\n\tconst assistantMessage = event.message as AssistantMessage;\n\tif (assistantMessage.stopReason !== \"error\" || !assistantMessage.errorMessage) return;\n\n\tassistantMessage.errorMessage = formatCodexProviderError(assistantMessage.provider, assistantMessage.errorMessage);\n}\n\n/** Resolve the pending retry promise */\n\nexport function _resolveRetry(this: AgentSession): void {\n\tif (this._retryResolve) {\n\t\tthis._retryResolve();\n\t\tthis._retryResolve = undefined;\n\t\tthis._retryPromise = undefined;\n\t}\n}\n\n/** Extract text content from a message */\n\nexport function _getUserMessageText(this: AgentSession, message: Message): string {\n\tif (message.role !== \"user\") return \"\";\n\tconst content = message.content;\n\tif (typeof content === \"string\") return content;\n\tconst textBlocks = content.filter((c) => c.type === \"text\");\n\treturn textBlocks.map((c) => (c as TextContent).text).join(\"\");\n}\n\n/** Find the last assistant message in agent state (including aborted ones) */\n\nexport function _findLastAssistantMessage(this: AgentSession): AssistantMessage | undefined {\n\tconst messages = this.agent.state.messages;\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"assistant\") {\n\t\t\treturn msg as AssistantMessage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function _replaceMessageInPlace(this: AgentSession, target: AgentMessage, replacement: AgentMessage): void {\n\t// Agent-core stores the finalized message object in its state before emitting message_end.\n\t// SessionManager persistence happens later in _processAgentEvent() with event.message.\n\t// Mutating this object in place keeps agent state, later turn/agent events, listeners,\n\t// and the eventual SessionManager.appendMessage(event.message) persistence in sync.\n\tif (target === replacement) {\n\t\treturn;\n\t}\n\n\tconst targetRecord = target as unknown as Record<string, unknown>;\n\tfor (const key of Object.keys(targetRecord)) {\n\t\tdelete targetRecord[key];\n\t}\n\tObject.assign(targetRecord, replacement);\n}\n\n/** Emit extension events based on agent events */\n\nexport async function _emitExtensionEvent(this: AgentSession, event: AgentEvent): Promise<void> {\n\tif (event.type === \"agent_start\") {\n\t\tthis._turnIndex = 0;\n\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t} else if (event.type === \"agent_end\") {\n\t\tawait this._extensionRunner.emit({ type: \"agent_end\", messages: event.messages });\n\t} else if (event.type === \"turn_start\") {\n\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\ttype: \"turn_start\",\n\t\t\tturnIndex: this._turnIndex,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"turn_end\") {\n\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\ttype: \"turn_end\",\n\t\t\tturnIndex: this._turnIndex,\n\t\t\tmessage: event.message,\n\t\t\ttoolResults: event.toolResults,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\tthis._turnIndex++;\n\t} else if (event.type === \"message_start\") {\n\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\ttype: \"message_start\",\n\t\t\tmessage: event.message,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"message_update\") {\n\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\ttype: \"message_update\",\n\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"message_end\") {\n\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\ttype: \"message_end\",\n\t\t\tmessage: event.message,\n\t\t};\n\t\tconst replacement = await this._extensionRunner.emitMessageEnd(extensionEvent);\n\t\tif (replacement) {\n\t\t\tthis._replaceMessageInPlace(event.message, normalizeMessageContent(replacement));\n\t\t}\n\t} else if (event.type === \"tool_execution_start\") {\n\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\targs: event.args,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"tool_execution_update\") {\n\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\ttype: \"tool_execution_update\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\targs: event.args,\n\t\t\tpartialResult: event.partialResult,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t} else if (event.type === \"tool_execution_end\") {\n\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: event.toolCallId,\n\t\t\ttoolName: event.toolName,\n\t\t\tresult: event.result,\n\t\t\tisError: event.isError,\n\t\t};\n\t\tawait this._extensionRunner.emit(extensionEvent);\n\t}\n}\n\n/**\n * Subscribe to agent events.\n * Session persistence is handled internally (saves messages on message_end).\n * Multiple listeners can be added. Returns unsubscribe function for this listener.\n */\n\nexport function subscribe(this: AgentSession, listener: AgentSessionEventListener): () => void {\n\tthis._eventListeners.push(listener);\n\n\t// Return unsubscribe function for this specific listener\n\treturn () => {\n\t\tconst index = this._eventListeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tthis._eventListeners.splice(index, 1);\n\t\t}\n\t};\n}\n\n/** Disconnect from agent events during disposal. */\nexport function _disconnectFromAgent(this: AgentSession): void {\n\tif (this._unsubscribeAgent) {\n\t\tthis._unsubscribeAgent();\n\t\tthis._unsubscribeAgent = undefined;\n\t}\n}\n\n/**\n * Remove all listeners and disconnect from agent.\n * Call this when completely done with the session.\n */\n\nexport function dispose(this: AgentSession): void {\n\t// Terminal and idempotent: callers legitimately dispose more than once (an explicit dispose\n\t// followed by a harness teardown), and the steps below are not all safe to repeat.\n\tif (this._disposed) return;\n\t// Summary work queued before its AbortController exists cannot be reached by\n\t// abortSessionSummary(), so disposal is recorded as state that every checkpoint consults.\n\tthis._disposed = true;\n\t// A background summary must never keep the process alive past shutdown.\n\tthis.abortSessionSummary();\n\t// Fail closed while protected input remains queued, or flush a consumed\n\t// reconciliation before invalidation can discard its recovery state.\n\tprepareProtectedStreamingCustomMessagesForDisposal(this);\n\tthis._extensionRunner.invalidate(STALE_EXTENSION_CONTEXT_MESSAGE);\n\tthis._disconnectFromAgent();\n\tthis._eventListeners = [];\n\tcleanupSessionResources(this.sessionId);\n\t// Releasing the session lease stops protecting a tree that is no longer in use.\n\tthis._tempStorageLease?.release();\n\tthis._tempStorageLease = undefined;\n}\n\n// =========================================================================\n// Read-only State Access\n// =========================================================================\n\n/** Full agent state */\n\nexport const agentSessionEventsMethods = {\n\t_emit,\n\t_emitQueueUpdate,\n\t_handleAgentEvent,\n\t_createRetryPromiseForAgentEnd,\n\t_findLastAssistantInMessages,\n\t_processAgentEvent,\n\t_applyInterruptAbortMessage,\n\t_applyProviderErrorGuidance,\n\t_resolveRetry,\n\t_getUserMessageText,\n\t_findLastAssistantMessage,\n\t_replaceMessageInPlace,\n\t_emitExtensionEvent,\n\tsubscribe,\n\t_disconnectFromAgent,\n\tdispose,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-export.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-export.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CA0ChE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CA4C5E;AAED;;;;GAIG;AAEH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB3F;AAED;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B7E;AAMD;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAsB3E;AAMD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,sBAAsB,CAQvF;AAED;;GAEG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED;;GAEG;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;CAQrC,CAAC"}
1
+ {"version":3,"file":"agent-session-export.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-export.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CA4ChE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CA4C5E;AAED;;;;GAIG;AAEH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB3F;AAED;;;;;GAKG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B7E;AAMD;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAsB3E;AAMD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,sBAAsB,CAQvF;AAED;;GAEG;AAEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED;;GAEG;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;CAQrC,CAAC"}
@@ -13,8 +13,9 @@ export function getSessionStats() {
13
13
  let toolCalls = 0;
14
14
  const totals = createUsageTotals();
15
15
  for (const entry of this.sessionManager.getEntries()) {
16
- if (entry.type === "branch_summary" && entry.usage)
16
+ if ((entry.type === "branch_summary" || entry.type === "session_summary") && entry.usage) {
17
17
  addUsageToTotals(totals, entry.usage);
18
+ }
18
19
  if (entry.type !== "message")
19
20
  continue;
20
21
  totalMessages++;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-export.js","sourceRoot":"","sources":["../../src/core/agent-session-export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGtF,OAAO,EAAE,uBAAuB,EAAE,gCAAgC,EAAsB,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,UAAU,eAAe;IAC9B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,KAAK;YAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACvC,aAAa,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,YAAY,EAAE,CAAC;aACvC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACxC,WAAW,EAAE,CAAC;YACd,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK;gBAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAClF,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzC,iBAAiB,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,OAA2B,CAAC;YAC9C,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YACvF,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IAED,OAAO;QACN,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY;QACZ,iBAAiB;QACjB,SAAS;QACT,WAAW;QACX,aAAa;QACb,MAAM,EAAE;YACP,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU;SAC1E;QACD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE;KACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;IAC/C,IAAI,aAAa,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,mFAAmF;IACnF,wFAAwF;IACxF,2FAA2F;IAC3F,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;IACtD,MAAM,wBAAwB,GAAG,gCAAgC,CAAC,aAAa,CAAC,CAAC;IAEjF,IAAI,wBAAwB,EAAE,CAAC;QAC9B,yEAAyE;QACzE,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC5E,IAAI,sBAAsB,GAAG,KAAK,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;gBAChC,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC5E,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC7E,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;wBACvB,sBAAsB,GAAG,IAAI,CAAC;oBAC/B,CAAC;oBACD,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC;IAExD,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,aAAa;QACb,OAAO;KACP,CAAC;AACH,CAAC;AAED;;;;GAIG;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAqB,UAAmB;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;IAClD,MAAM,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,sBAAsB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/E,MAAM,CAAC,wBAAwB,CAAC;QAChC,MAAM,CAAC,gCAAgC,CAAC;KACxC,CAAC,CAAC;IAEH,uFAAuF;IACvF,MAAM,YAAY,GAAqB,sBAAsB,CAAC;QAC7D,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACzD,KAAK;QACL,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;KACjC,CAAC,CAAC;IAEH,OAAO,MAAM,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE;QACjE,UAAU;QACV,SAAS;QACT,YAAY;KACZ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AAEH,MAAM,UAAU,aAAa,CAAqB,UAAmB;IACpE,MAAM,QAAQ,GAAG,WAAW,CAC3B,UAAU,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAC/E,OAAO,CAAC,GAAG,EAAE,CACb,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAkB;QAC7B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,uBAAuB;QAChC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;QACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;KACjC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,+CAA+C;IAC/C,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,YAAY;AACZ,4EAA4E;AAE5E;;;;GAIG;AAEH,MAAM,UAAU,oBAAoB;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;SACjC,KAAK,EAAE;SACP,OAAO,EAAE;SACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,GAAG,GAAG,CAAqB,CAAC;QAClC,wCAAwC;QACxC,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAErC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,OAAO,IAAK,aAAkC,CAAC,OAAO,EAAE,CAAC;QACnE,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AACjC,CAAC;AAED,4EAA4E;AAC5E,mBAAmB;AACnB,4EAA4E;AAE5E,MAAM,UAAU,4BAA4B;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CACtC,EAAE,EACF,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,CACpD,CAAC;IAC5B,OAAO,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrF,OAAO,CAAC,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvF,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;GAEG;AAEH,MAAM,UAAU,oBAAoB,CAAqB,SAAiB;IACzE,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,4BAA4B;IAC5B,oBAAoB;CACpB,CAAC","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { AssistantMessage } from \"@earendil-works/pi-ai/compat\";\nimport { theme } from \"../modes/interactive/theme/theme.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport type { SessionStats } from \"./agent-session-types.ts\";\nimport { calculateContextTokens, estimateContextTokens } from \"./compaction/index.ts\";\nimport type { ToolHtmlRenderer } from \"./export-html/index.ts\";\nimport type { ContextUsage, ReplacedSessionContext } from \"./extensions/index.ts\";\nimport { CURRENT_SESSION_VERSION, getLatestCompactionBoundaryEntry, type SessionHeader } from \"./session-manager.ts\";\nimport { addUsageToTotals, createUsageTotals } from \"./usage-totals.ts\";\n\nexport function getSessionStats(this: AgentSession): SessionStats {\n\tlet userMessages = 0;\n\tlet assistantMessages = 0;\n\tlet toolResults = 0;\n\tlet totalMessages = 0;\n\tlet toolCalls = 0;\n\tconst totals = createUsageTotals();\n\tfor (const entry of this.sessionManager.getEntries()) {\n\t\tif (entry.type === \"branch_summary\" && entry.usage) addUsageToTotals(totals, entry.usage);\n\t\tif (entry.type !== \"message\") continue;\n\t\ttotalMessages++;\n\t\tconst message = entry.message;\n\t\tif (message.role === \"user\") userMessages++;\n\t\telse if (message.role === \"toolResult\") {\n\t\t\ttoolResults++;\n\t\t\tif (\"usage\" in message && message.usage) addUsageToTotals(totals, message.usage);\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tassistantMessages++;\n\t\t\tconst assistant = message as AssistantMessage;\n\t\t\ttoolCalls += assistant.content.filter((content) => content.type === \"toolCall\").length;\n\t\t\taddUsageToTotals(totals, assistant.usage);\n\t\t}\n\t}\n\n\treturn {\n\t\tsessionFile: this.sessionFile,\n\t\tsessionId: this.sessionId,\n\t\tuserMessages,\n\t\tassistantMessages,\n\t\ttoolCalls,\n\t\ttoolResults,\n\t\ttotalMessages,\n\t\ttokens: {\n\t\t\tinput: totals.input,\n\t\t\toutput: totals.output,\n\t\t\tcacheRead: totals.cacheRead,\n\t\t\tcacheWrite: totals.cacheWrite,\n\t\t\ttotal: totals.input + totals.output + totals.cacheRead + totals.cacheWrite,\n\t\t},\n\t\tcost: totals.cost,\n\t\tcontextUsage: this.getContextUsage(),\n\t};\n}\n\nexport function getContextUsage(this: AgentSession): ContextUsage | undefined {\n\tconst model = this.model;\n\tif (!model) return undefined;\n\n\tconst contextWindow = model.contextWindow ?? 0;\n\tif (contextWindow <= 0) return undefined;\n\n\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\tconst branchEntries = this.sessionManager.getBranch();\n\tconst latestCompactionBoundary = getLatestCompactionBoundaryEntry(branchEntries);\n\n\tif (latestCompactionBoundary) {\n\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompactionBoundary);\n\t\tlet hasPostCompactionUsage = false;\n\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\tconst entry = branchEntries[i];\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tconst assistant = entry.message;\n\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage, assistant.api);\n\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!hasPostCompactionUsage) {\n\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t}\n\t}\n\n\tconst estimate = estimateContextTokens(this.messages);\n\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\treturn {\n\t\ttokens: estimate.tokens,\n\t\tcontextWindow,\n\t\tpercent,\n\t};\n}\n\n/**\n * Export session to HTML.\n * @param outputPath Optional output path (defaults to session directory)\n * @returns Path to exported file\n */\n\nexport async function exportToHtml(this: AgentSession, outputPath?: string): Promise<string> {\n\tconst themeName = this.settingsManager.getTheme();\n\tconst [{ exportSessionToHtml }, { createToolHtmlRenderer }] = await Promise.all([\n\t\timport(\"./export-html/index.ts\"),\n\t\timport(\"./export-html/tool-renderer.ts\"),\n\t]);\n\n\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\tgetToolDefinition: (name) => this.getToolDefinition(name),\n\t\ttheme,\n\t\tcwd: this.sessionManager.getCwd(),\n\t});\n\n\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\toutputPath,\n\t\tthemeName,\n\t\ttoolRenderer,\n\t});\n}\n\n/**\n * Export the current session branch to a JSONL file.\n * Writes the session header followed by all entries on the current branch path.\n * @param outputPath Target file path. If omitted, generates a timestamped file in cwd.\n * @returns The resolved output file path.\n */\n\nexport function exportToJsonl(this: AgentSession, outputPath?: string): string {\n\tconst filePath = resolvePath(\n\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\tprocess.cwd(),\n\t);\n\tconst dir = dirname(filePath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\n\tconst header: SessionHeader = {\n\t\ttype: \"session\",\n\t\tversion: CURRENT_SESSION_VERSION,\n\t\tid: this.sessionManager.getSessionId(),\n\t\ttimestamp: new Date().toISOString(),\n\t\tcwd: this.sessionManager.getCwd(),\n\t};\n\n\tconst branchEntries = this.sessionManager.getBranch();\n\tconst lines = [JSON.stringify(header)];\n\n\t// Re-chain parentIds to form a linear sequence\n\tlet prevId: string | null = null;\n\tfor (const entry of branchEntries) {\n\t\tconst linear = { ...entry, parentId: prevId };\n\t\tlines.push(JSON.stringify(linear));\n\t\tprevId = entry.id;\n\t}\n\n\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\treturn filePath;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Get text content of last assistant message.\n * Useful for /copy command.\n * @returns Text content, or undefined if no assistant message exists\n */\n\nexport function getLastAssistantText(this: AgentSession): string | undefined {\n\tconst lastAssistant = this.messages\n\t\t.slice()\n\t\t.reverse()\n\t\t.find((m) => {\n\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\tconst msg = m as AssistantMessage;\n\t\t\t// Skip aborted messages with no content\n\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\treturn true;\n\t\t});\n\n\tif (!lastAssistant) return undefined;\n\n\tlet text = \"\";\n\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\tif (content.type === \"text\") {\n\t\t\ttext += content.text;\n\t\t}\n\t}\n\n\treturn text.trim() || undefined;\n}\n\n// =========================================================================\n// Extension System\n// =========================================================================\n\nexport function createReplacedSessionContext(this: AgentSession): ReplacedSessionContext {\n\tconst context = Object.defineProperties(\n\t\t{},\n\t\tObject.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()),\n\t) as ReplacedSessionContext;\n\tcontext.sendMessage = (message, options) => this.sendCustomMessage(message, options);\n\tcontext.sendUserMessage = (content, options) => this.sendUserMessage(content, options);\n\treturn context;\n}\n\n/**\n * Check if extensions have handlers for a specific event type.\n */\n\nexport function hasExtensionHandlers(this: AgentSession, eventType: string): boolean {\n\treturn this._extensionRunner.hasHandlers(eventType);\n}\n\n/**\n * Get the extension runner (for setting UI context and error handlers).\n */\n\nexport const agentSessionExportMethods = {\n\tgetSessionStats,\n\tgetContextUsage,\n\texportToHtml,\n\texportToJsonl,\n\tgetLastAssistantText,\n\tcreateReplacedSessionContext,\n\thasExtensionHandlers,\n};\n"]}
1
+ {"version":3,"file":"agent-session-export.js","sourceRoot":"","sources":["../../src/core/agent-session-export.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { AssistantMessage } from \"@earendil-works/pi-ai/compat\";\nimport { theme } from \"../modes/interactive/theme/theme.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport type { SessionStats } from \"./agent-session-types.ts\";\nimport { calculateContextTokens, estimateContextTokens } from \"./compaction/index.ts\";\nimport type { ToolHtmlRenderer } from \"./export-html/index.ts\";\nimport type { ContextUsage, ReplacedSessionContext } from \"./extensions/index.ts\";\nimport { CURRENT_SESSION_VERSION, getLatestCompactionBoundaryEntry, type SessionHeader } from \"./session-manager.ts\";\nimport { addUsageToTotals, createUsageTotals } from \"./usage-totals.ts\";\n\nexport function getSessionStats(this: AgentSession): SessionStats {\n\tlet userMessages = 0;\n\tlet assistantMessages = 0;\n\tlet toolResults = 0;\n\tlet totalMessages = 0;\n\tlet toolCalls = 0;\n\tconst totals = createUsageTotals();\n\tfor (const entry of this.sessionManager.getEntries()) {\n\t\tif ((entry.type === \"branch_summary\" || entry.type === \"session_summary\") && entry.usage) {\n\t\t\taddUsageToTotals(totals, entry.usage);\n\t\t}\n\t\tif (entry.type !== \"message\") continue;\n\t\ttotalMessages++;\n\t\tconst message = entry.message;\n\t\tif (message.role === \"user\") userMessages++;\n\t\telse if (message.role === \"toolResult\") {\n\t\t\ttoolResults++;\n\t\t\tif (\"usage\" in message && message.usage) addUsageToTotals(totals, message.usage);\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tassistantMessages++;\n\t\t\tconst assistant = message as AssistantMessage;\n\t\t\ttoolCalls += assistant.content.filter((content) => content.type === \"toolCall\").length;\n\t\t\taddUsageToTotals(totals, assistant.usage);\n\t\t}\n\t}\n\n\treturn {\n\t\tsessionFile: this.sessionFile,\n\t\tsessionId: this.sessionId,\n\t\tuserMessages,\n\t\tassistantMessages,\n\t\ttoolCalls,\n\t\ttoolResults,\n\t\ttotalMessages,\n\t\ttokens: {\n\t\t\tinput: totals.input,\n\t\t\toutput: totals.output,\n\t\t\tcacheRead: totals.cacheRead,\n\t\t\tcacheWrite: totals.cacheWrite,\n\t\t\ttotal: totals.input + totals.output + totals.cacheRead + totals.cacheWrite,\n\t\t},\n\t\tcost: totals.cost,\n\t\tcontextUsage: this.getContextUsage(),\n\t};\n}\n\nexport function getContextUsage(this: AgentSession): ContextUsage | undefined {\n\tconst model = this.model;\n\tif (!model) return undefined;\n\n\tconst contextWindow = model.contextWindow ?? 0;\n\tif (contextWindow <= 0) return undefined;\n\n\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\tconst branchEntries = this.sessionManager.getBranch();\n\tconst latestCompactionBoundary = getLatestCompactionBoundaryEntry(branchEntries);\n\n\tif (latestCompactionBoundary) {\n\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompactionBoundary);\n\t\tlet hasPostCompactionUsage = false;\n\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\tconst entry = branchEntries[i];\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\tconst assistant = entry.message;\n\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage, assistant.api);\n\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!hasPostCompactionUsage) {\n\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t}\n\t}\n\n\tconst estimate = estimateContextTokens(this.messages);\n\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\treturn {\n\t\ttokens: estimate.tokens,\n\t\tcontextWindow,\n\t\tpercent,\n\t};\n}\n\n/**\n * Export session to HTML.\n * @param outputPath Optional output path (defaults to session directory)\n * @returns Path to exported file\n */\n\nexport async function exportToHtml(this: AgentSession, outputPath?: string): Promise<string> {\n\tconst themeName = this.settingsManager.getTheme();\n\tconst [{ exportSessionToHtml }, { createToolHtmlRenderer }] = await Promise.all([\n\t\timport(\"./export-html/index.ts\"),\n\t\timport(\"./export-html/tool-renderer.ts\"),\n\t]);\n\n\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\tgetToolDefinition: (name) => this.getToolDefinition(name),\n\t\ttheme,\n\t\tcwd: this.sessionManager.getCwd(),\n\t});\n\n\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\toutputPath,\n\t\tthemeName,\n\t\ttoolRenderer,\n\t});\n}\n\n/**\n * Export the current session branch to a JSONL file.\n * Writes the session header followed by all entries on the current branch path.\n * @param outputPath Target file path. If omitted, generates a timestamped file in cwd.\n * @returns The resolved output file path.\n */\n\nexport function exportToJsonl(this: AgentSession, outputPath?: string): string {\n\tconst filePath = resolvePath(\n\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\tprocess.cwd(),\n\t);\n\tconst dir = dirname(filePath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\n\tconst header: SessionHeader = {\n\t\ttype: \"session\",\n\t\tversion: CURRENT_SESSION_VERSION,\n\t\tid: this.sessionManager.getSessionId(),\n\t\ttimestamp: new Date().toISOString(),\n\t\tcwd: this.sessionManager.getCwd(),\n\t};\n\n\tconst branchEntries = this.sessionManager.getBranch();\n\tconst lines = [JSON.stringify(header)];\n\n\t// Re-chain parentIds to form a linear sequence\n\tlet prevId: string | null = null;\n\tfor (const entry of branchEntries) {\n\t\tconst linear = { ...entry, parentId: prevId };\n\t\tlines.push(JSON.stringify(linear));\n\t\tprevId = entry.id;\n\t}\n\n\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\treturn filePath;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Get text content of last assistant message.\n * Useful for /copy command.\n * @returns Text content, or undefined if no assistant message exists\n */\n\nexport function getLastAssistantText(this: AgentSession): string | undefined {\n\tconst lastAssistant = this.messages\n\t\t.slice()\n\t\t.reverse()\n\t\t.find((m) => {\n\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\tconst msg = m as AssistantMessage;\n\t\t\t// Skip aborted messages with no content\n\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\treturn true;\n\t\t});\n\n\tif (!lastAssistant) return undefined;\n\n\tlet text = \"\";\n\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\tif (content.type === \"text\") {\n\t\t\ttext += content.text;\n\t\t}\n\t}\n\n\treturn text.trim() || undefined;\n}\n\n// =========================================================================\n// Extension System\n// =========================================================================\n\nexport function createReplacedSessionContext(this: AgentSession): ReplacedSessionContext {\n\tconst context = Object.defineProperties(\n\t\t{},\n\t\tObject.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()),\n\t) as ReplacedSessionContext;\n\tcontext.sendMessage = (message, options) => this.sendCustomMessage(message, options);\n\tcontext.sendUserMessage = (content, options) => this.sendUserMessage(content, options);\n\treturn context;\n}\n\n/**\n * Check if extensions have handlers for a specific event type.\n */\n\nexport function hasExtensionHandlers(this: AgentSession, eventType: string): boolean {\n\treturn this._extensionRunner.hasHandlers(eventType);\n}\n\n/**\n * Get the extension runner (for setting UI context and error handlers).\n */\n\nexport const agentSessionExportMethods = {\n\tgetSessionStats,\n\tgetContextUsage,\n\texportToHtml,\n\texportToJsonl,\n\tgetLastAssistantText,\n\tcreateReplacedSessionContext,\n\thasExtensionHandlers,\n};\n"]}
@@ -3,7 +3,6 @@ import type { ProviderHeaders } from "@earendil-works/pi-ai";
3
3
  import type { Api, AssistantMessage, ImageContent, Message, Model, TextContent } from "@earendil-works/pi-ai/compat";
4
4
  import type { PendingPostToolCompactionGuard } from "./agent-session-post-tool-compaction.ts";
5
5
  import type { AgentSessionEvent, AgentSessionEventListener, AgentSessionReloadOptions, ClearQueueOptions, DrainedAgentQueues, ExtensionBindings, InterruptQueueHold, ModelCycleResult, PromptOptions, SessionStats, ToolDefinitionEntry } from "./agent-session-types.ts";
6
- import type { AsyncJobManager } from "./async/job-manager.js";
7
6
  import type { BashResult } from "./bash-executor.ts";
8
7
  import type { CompactionUrgency, PlannerAuth, VerbatimCompactionParameters, VerbatimCompactionResult } from "./compaction/index.ts";
9
8
  import type { ContextUsage, ExtensionCommandContextActions, ExtensionErrorListener, ExtensionMode, ExtensionRunner, ExtensionUIContext, OrchestrationContext, ReplacedSessionContext, SendMessageOptions, SendMessagesOptions, SessionStartEvent, ToolDefinition, ToolInfo } from "./extensions/index.ts";
@@ -176,6 +175,8 @@ export interface AgentSessionMethodSurface extends AgentSessionQueuePauseControl
176
175
  compact(options?: Partial<VerbatimCompactionParameters>): Promise<VerbatimCompactionResult>;
177
176
  abortCompaction(): void;
178
177
  abortBranchSummary(): void;
178
+ abortSessionSummary(): void;
179
+ _maybeGenerateSessionSummary(): Promise<void>;
179
180
  _checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck?: boolean): Promise<void>;
180
181
  _dropTrailingAutoCompactionRetryAssistantIfPresent(): void;
181
182
  _schedulePostAutoCompactionContinuationProbe(reason: "overflow" | "threshold", willRetry: boolean): void;
@@ -258,7 +259,7 @@ export interface AgentSessionMethodSurface extends AgentSessionQueuePauseControl
258
259
  transferWorkflowStageDeliveriesTo(target: object): void;
259
260
  hasExtensionHandlers(eventType: string): boolean;
260
261
  }
261
- export interface AgentSessionPublicSurface extends Pick<AgentSessionMethodSurface, "orchestrationContext" | "modelRuntime" | "state" | "model" | "thinkingLevel" | "isStreaming" | "systemPrompt" | "retryAttempt" | "isCompacting" | "compactionReason" | "messages" | "steeringMode" | "followUpMode" | "sessionFile" | "sessionId" | "sessionName" | "scopedModels" | "promptTemplates" | "pendingMessageCount" | "resourceLoader" | "autoCompactionEnabled" | "isRetrying" | "autoRetryEnabled" | "isBashRunning" | "hasPendingBashMessages" | "extensionRunner" | "queuedMessagesPaused" | "pauseQueuedMessages" | "resumeQueuedMessages" | "subscribe" | "dispose" | "getActiveToolNames" | "getAllTools" | "getToolDefinition" | "setActiveToolsByName" | "setScopedModels" | "prompt" | "steer" | "followUp" | "sendCustomMessage" | "sendUserMessage" | "clearQueue" | "getSteeringMessages" | "getFollowUpMessages" | "abort" | "setModel" | "cycleModel" | "setThinkingLevel" | "cycleThinkingLevel" | "getAvailableThinkingLevels" | "supportsThinking" | "setSteeringMode" | "setFollowUpMode" | "compact" | "abortCompaction" | "abortBranchSummary" | "setAutoCompactionEnabled" | "bindExtensions" | "refreshCurrentModelFromRegistry" | "reload" | "abortRetry" | "setAutoRetryEnabled" | "executeBash" | "recordBashResult" | "abortBash" | "setSessionName" | "navigateTree" | "getUserMessagesForForking" | "getSessionStats" | "getContextUsage" | "exportToHtml" | "exportToJsonl" | "getLastAssistantText" | "createReplacedSessionContext" | "hasExtensionHandlers"> {
262
+ export interface AgentSessionPublicSurface extends Pick<AgentSessionMethodSurface, "orchestrationContext" | "modelRuntime" | "state" | "model" | "thinkingLevel" | "isStreaming" | "systemPrompt" | "retryAttempt" | "isCompacting" | "compactionReason" | "messages" | "steeringMode" | "followUpMode" | "sessionFile" | "sessionId" | "sessionName" | "scopedModels" | "promptTemplates" | "pendingMessageCount" | "resourceLoader" | "autoCompactionEnabled" | "isRetrying" | "autoRetryEnabled" | "abortSessionSummary" | "isBashRunning" | "hasPendingBashMessages" | "extensionRunner" | "queuedMessagesPaused" | "pauseQueuedMessages" | "resumeQueuedMessages" | "subscribe" | "dispose" | "getActiveToolNames" | "getAllTools" | "getToolDefinition" | "setActiveToolsByName" | "setScopedModels" | "prompt" | "steer" | "followUp" | "sendCustomMessage" | "sendUserMessage" | "clearQueue" | "getSteeringMessages" | "getFollowUpMessages" | "abort" | "setModel" | "cycleModel" | "setThinkingLevel" | "cycleThinkingLevel" | "getAvailableThinkingLevels" | "supportsThinking" | "setSteeringMode" | "setFollowUpMode" | "compact" | "abortCompaction" | "abortBranchSummary" | "setAutoCompactionEnabled" | "bindExtensions" | "refreshCurrentModelFromRegistry" | "reload" | "abortRetry" | "setAutoRetryEnabled" | "executeBash" | "recordBashResult" | "abortBash" | "setSessionName" | "navigateTree" | "getUserMessagesForForking" | "getSessionStats" | "getContextUsage" | "exportToHtml" | "exportToJsonl" | "getLastAssistantText" | "createReplacedSessionContext" | "hasExtensionHandlers"> {
262
263
  readonly agent: Agent;
263
264
  readonly sessionManager: SessionManager;
264
265
  readonly settingsManager: SettingsManager;
@@ -293,6 +294,8 @@ export interface AgentSessionInternalSurface extends AgentSessionMethodSurface,
293
294
  _activeInterruptQueueHold: InterruptQueueHold | undefined;
294
295
  _queuedMessagesPaused: boolean;
295
296
  _queuedMessagesPauseAbortBoundary: Promise<void> | undefined;
297
+ _admittedQueuedMessageAwaitingReply: string | undefined;
298
+ _admittedRecoveryTurn: Promise<void> | undefined;
296
299
  _workflowStageDeliveryForwardTarget: AgentSessionInternalSurface | undefined;
297
300
  _activeInterruptAbortMessage: string | undefined;
298
301
  _pendingNextTurnMessages: CustomMessage[];
@@ -334,6 +337,11 @@ export interface AgentSessionInternalSurface extends AgentSessionMethodSurface,
334
337
  _subagentPolicy?: import("./extensions/index.ts").SubagentChildPolicy;
335
338
  _extensionUIContext?: ExtensionUIContext;
336
339
  _extensionMode: ExtensionMode;
340
+ _disposed: boolean;
341
+ _sessionSummaryAbortController: AbortController | undefined;
342
+ _sessionSummaryToken: number;
343
+ _sessionSummaryRun: import("./agent-session-summary.ts").SessionSummaryRun | undefined;
344
+ _lastSummarizedMessageId: string | undefined;
337
345
  _extensionCommandContextActions?: ExtensionCommandContextActions;
338
346
  _extensionShutdownHandler?: () => void;
339
347
  _extensionErrorListener?: ExtensionErrorListener;
@@ -348,8 +356,6 @@ export interface AgentSessionInternalSurface extends AgentSessionMethodSurface,
348
356
  _systemPromptTransform?: (prompt: string) => string;
349
357
  _systemPromptOverride?: string;
350
358
  _lastAssistantMessage: AssistantMessage | undefined;
351
- _asyncJobManager: AsyncJobManager;
352
- _asyncJobManagerSessionId: symbol;
353
359
  _tempStorageLease: import("./tools/session-temp-dir.ts").ProtectedPathLease | undefined;
354
360
  _workflowStageAdmission: import("./workflow-stage-admission.ts").WorkflowStageAdmissionBoundary | undefined;
355
361
  }