@code-yeongyu/senpi 2026.7.31 → 2026.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/CHANGELOG.md +237 -0
  2. package/dist/core/agent-session.d.ts +49 -13
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +120 -37
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  7. package/dist/core/dynamic-prompt/build.js +4 -0
  8. package/dist/core/dynamic-prompt/build.js.map +1 -1
  9. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts +2 -2
  10. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js +25 -25
  12. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-command.js.map +1 -1
  13. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js.map +1 -1
  15. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts +1 -1
  16. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js +2 -2
  18. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-management.js.map +1 -1
  19. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts +9 -9
  20. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js +2 -2
  22. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/accounts.js.map +1 -1
  23. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts +1 -1
  24. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js +3 -3
  26. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/affinity.js.map +1 -1
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts +21 -0
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts.map +1 -0
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js +30 -0
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js.map +1 -0
  31. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.d.ts +8 -4
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -0
  33. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/auth-lane.js +34 -25
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -0
  35. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js.map +1 -1
  37. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js.map +1 -1
  39. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts +1 -1
  40. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js +1 -1
  42. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/errors.js.map +1 -1
  43. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js.map +1 -1
  45. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js +1 -1
  47. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +14 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -0
  50. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/guidance.js +37 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -0
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -0
  54. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/index.js +12 -10
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -0
  56. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts +3 -3
  57. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/oauth-login.js +2 -2
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -0
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts +18 -0
  61. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/options.js +70 -10
  63. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -0
  64. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.js +32 -19
  66. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -0
  67. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts +1 -0
  68. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js.map +1 -1
  70. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts +30 -0
  71. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +197 -0
  73. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -0
  74. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts +18 -0
  75. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -0
  76. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js +33 -0
  77. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js.map +1 -0
  78. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts +3 -0
  79. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +134 -0
  81. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -0
  82. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +85 -0
  83. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +270 -0
  85. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -0
  86. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts +17 -0
  87. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -0
  88. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +217 -0
  89. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -0
  90. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts +49 -0
  91. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +204 -0
  93. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -0
  94. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts +28 -0
  95. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +107 -0
  97. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -0
  98. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts +2 -0
  99. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +10 -0
  101. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -0
  102. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js.map +1 -1
  104. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.d.ts +1 -1
  105. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream.js +72 -53
  107. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -0
  108. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts +3 -0
  109. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js +25 -0
  111. package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js.map +1 -0
  112. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts +1 -1
  113. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js +2 -2
  115. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tool-watch.js.map +1 -1
  116. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +18 -0
  119. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -0
  120. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +69 -0
  121. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -0
  122. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/index.js +28 -2
  124. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/speculative.d.ts +4 -1
  126. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/speculative.js +22 -17
  128. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  129. package/dist/core/extensions/builtin/compaction/task-intent.d.ts +2 -6
  130. package/dist/core/extensions/builtin/compaction/task-intent.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/compaction/task-intent.js +10 -9
  132. package/dist/core/extensions/builtin/compaction/task-intent.js.map +1 -1
  133. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +6 -0
  134. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/goal/continuation-recovery.js +20 -0
  136. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -0
  137. package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -4
  138. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/goal/continuation.js +2 -8
  140. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  141. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts +19 -0
  142. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -0
  143. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +48 -0
  144. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -0
  145. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/goal/index.js +17 -15
  147. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  148. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +12 -10
  150. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  151. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +5 -1
  152. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/goal/monitor-continuation.js +94 -52
  154. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  155. package/dist/core/extensions/builtin/goal/persistence.d.ts +16 -0
  156. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/goal/persistence.js +185 -11
  158. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  159. package/dist/core/extensions/builtin/goal/ui.d.ts +1 -0
  160. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/goal/ui.js +11 -2
  162. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +15 -0
  165. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +30 -3
  168. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  169. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  170. package/dist/core/extensions/builtin/index.js +5 -2
  171. package/dist/core/extensions/builtin/index.js.map +1 -1
  172. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts +31 -0
  173. package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -0
  174. package/dist/core/extensions/builtin/loop-guard/detectors.js +111 -0
  175. package/dist/core/extensions/builtin/loop-guard/detectors.js.map +1 -0
  176. package/dist/core/extensions/builtin/loop-guard/index.d.ts +3 -0
  177. package/dist/core/extensions/builtin/loop-guard/index.d.ts.map +1 -0
  178. package/dist/core/extensions/builtin/loop-guard/index.js +31 -0
  179. package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -0
  180. package/dist/core/extensions/builtin/loop-guard/notice.d.ts +5 -0
  181. package/dist/core/extensions/builtin/loop-guard/notice.d.ts.map +1 -0
  182. package/dist/core/extensions/builtin/loop-guard/notice.js +42 -0
  183. package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -0
  184. package/dist/core/extensions/builtin/loop-guard/policy.d.ts +30 -0
  185. package/dist/core/extensions/builtin/loop-guard/policy.d.ts.map +1 -0
  186. package/dist/core/extensions/builtin/loop-guard/policy.js +30 -0
  187. package/dist/core/extensions/builtin/loop-guard/policy.js.map +1 -0
  188. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts +4 -0
  189. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -0
  190. package/dist/core/extensions/builtin/loop-guard/renderer.js +50 -0
  191. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -0
  192. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts +13 -0
  193. package/dist/core/extensions/builtin/loop-guard/similarity.d.ts.map +1 -0
  194. package/dist/core/extensions/builtin/loop-guard/similarity.js +51 -0
  195. package/dist/core/extensions/builtin/loop-guard/similarity.js.map +1 -0
  196. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts +13 -0
  197. package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -0
  198. package/dist/core/extensions/builtin/loop-guard/tracker.js +39 -0
  199. package/dist/core/extensions/builtin/loop-guard/tracker.js.map +1 -0
  200. package/dist/core/extensions/builtin/monitor-state-event.d.ts +10 -0
  201. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  203. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts +3 -0
  204. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.d.ts.map +1 -0
  205. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js +10 -0
  206. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash-0731.js.map +1 -0
  207. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts +3 -0
  208. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.d.ts.map +1 -0
  209. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js +10 -0
  210. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-flash.js.map +1 -0
  211. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts +3 -0
  212. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.d.ts.map +1 -0
  213. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js +11 -0
  214. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-pro.js.map +1 -0
  215. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts +13 -0
  216. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.d.ts.map +1 -0
  217. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js +60 -0
  218. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4.js.map +1 -0
  219. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/prompt-preset/index.js +8 -4
  221. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/presets.js +42 -0
  224. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/settings.js +3 -0
  228. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  229. package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/recommended-models/index.js +2 -1
  231. package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
  232. package/dist/core/extensions/builtin/rules/index.js +4 -3
  233. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  234. package/dist/core/extensions/builtin/rules/rules/constants.d.ts +11 -0
  235. package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -1
  236. package/dist/core/extensions/builtin/rules/rules/constants.js +11 -0
  237. package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -1
  238. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/rules/rules/formatter.js +15 -1
  240. package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -1
  241. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  242. package/dist/core/extensions/builtin/service-tier.js +23 -21
  243. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  244. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/terminal/extension.js +21 -7
  246. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  247. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  248. package/dist/core/extensions/builtin/terminal/monitor-notify.js +42 -5
  249. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  250. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +2 -0
  251. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  252. package/dist/core/extensions/builtin/terminal/monitor-registry.js +2 -0
  253. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  254. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts +37 -0
  255. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -0
  256. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js +61 -0
  257. package/dist/core/extensions/builtin/terminal/monitor-status-ticker.js.map +1 -0
  258. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts +9 -1
  259. package/dist/core/extensions/builtin/terminal/monitor-status.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/terminal/monitor-status.js +35 -2
  261. package/dist/core/extensions/builtin/terminal/monitor-status.js.map +1 -1
  262. package/dist/core/extensions/builtin/terminal/tools/monitor.js +1 -1
  263. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  264. package/dist/core/extensions/builtin/todotools/commands.d.ts +2 -2
  265. package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/todotools/commands.js.map +1 -1
  267. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  268. package/dist/core/extensions/builtin/todotools/index.js +6 -3
  269. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  270. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  271. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  272. package/dist/core/extensions/builtin/todotools/state.js +1 -1
  273. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  274. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts +19 -0
  275. package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -0
  276. package/dist/core/extensions/builtin/todotools/todo-widget-component.js +78 -0
  277. package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -0
  278. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts +13 -1
  279. package/dist/core/extensions/builtin/todotools/todo-widget.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/todotools/todo-widget.js +32 -14
  281. package/dist/core/extensions/builtin/todotools/todo-widget.js.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +2 -2
  283. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/tools/todo.js +1 -1
  285. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  286. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts +1 -1
  287. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  288. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js +88 -29
  289. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  290. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  291. package/dist/core/extensions/builtin/tps.js +5 -2
  292. package/dist/core/extensions/builtin/tps.js.map +1 -1
  293. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts +4 -0
  294. package/dist/core/extensions/builtin/ttsr/builtin-rules.d.ts.map +1 -0
  295. package/dist/core/extensions/builtin/ttsr/builtin-rules.js +20 -0
  296. package/dist/core/extensions/builtin/ttsr/builtin-rules.js.map +1 -0
  297. package/dist/core/extensions/builtin/ttsr/commands.js +9 -1
  298. package/dist/core/extensions/builtin/ttsr/commands.js.map +1 -1
  299. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/ttsr/index.js +4 -3
  301. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  302. package/dist/core/extensions/builtin/ttsr/manager.js +1 -1
  303. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  304. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  305. package/dist/core/extensions/builtin/websearch/websearch/config.js +1 -0
  306. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  307. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  308. package/dist/core/extensions/builtin/websearch/websearch/native.js +16 -5
  309. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  310. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -1
  311. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +1 -0
  312. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -1
  313. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts +4 -1
  314. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.d.ts.map +1 -1
  315. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js +44 -37
  316. package/dist/core/extensions/builtin/websearch/websearch/providers/anthropic.js.map +1 -1
  317. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts +3 -0
  318. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.d.ts.map +1 -0
  319. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js +12 -0
  320. package/dist/core/extensions/builtin/websearch/websearch/providers/deepseek.js.map +1 -0
  321. package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -1
  322. package/dist/core/extensions/builtin/websearch/websearch/providers.js +2 -0
  323. package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -1
  324. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  325. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +3 -3
  326. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  327. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  328. package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -3
  329. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  330. package/dist/core/extensions/builtin/websearch/websearch/tool.js +2 -2
  331. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  332. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -1
  333. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  334. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  335. package/dist/core/extensions/index.d.ts +1 -1
  336. package/dist/core/extensions/index.d.ts.map +1 -1
  337. package/dist/core/extensions/index.js.map +1 -1
  338. package/dist/core/extensions/loader.d.ts.map +1 -1
  339. package/dist/core/extensions/loader.js +5 -0
  340. package/dist/core/extensions/loader.js.map +1 -1
  341. package/dist/core/extensions/runner.d.ts +1 -1
  342. package/dist/core/extensions/runner.d.ts.map +1 -1
  343. package/dist/core/extensions/runner.js +3 -1
  344. package/dist/core/extensions/runner.js.map +1 -1
  345. package/dist/core/extensions/types.d.ts +22 -1
  346. package/dist/core/extensions/types.d.ts.map +1 -1
  347. package/dist/core/extensions/types.js.map +1 -1
  348. package/dist/core/model-resolver.js +2 -2
  349. package/dist/core/model-resolver.js.map +1 -1
  350. package/dist/core/thinking-levels.d.ts +5 -0
  351. package/dist/core/thinking-levels.d.ts.map +1 -1
  352. package/dist/core/thinking-levels.js +9 -39
  353. package/dist/core/thinking-levels.js.map +1 -1
  354. package/dist/index.d.ts +1 -1
  355. package/dist/index.d.ts.map +1 -1
  356. package/dist/index.js.map +1 -1
  357. package/dist/modes/app-server/server/account.d.ts +1 -1
  358. package/dist/modes/app-server/server/account.js +1 -1
  359. package/dist/modes/app-server/server/account.js.map +1 -1
  360. package/dist/modes/app-server/server/server-core.js +1 -1
  361. package/dist/modes/app-server/server/server-core.js.map +1 -1
  362. package/dist/modes/interactive/compaction-queue-transfer.d.ts +2 -0
  363. package/dist/modes/interactive/compaction-queue-transfer.d.ts.map +1 -1
  364. package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
  365. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  366. package/dist/modes/interactive/components/footer.js +9 -5
  367. package/dist/modes/interactive/components/footer.js.map +1 -1
  368. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  369. package/dist/modes/interactive/interactive-mode.js +38 -12
  370. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  371. package/dist/modes/interactive/risky-main-model-warning.d.ts +1 -1
  372. package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -1
  373. package/dist/modes/interactive/risky-main-model-warning.js +1 -1
  374. package/dist/modes/interactive/risky-main-model-warning.js.map +1 -1
  375. package/dist/modes/rpc/connection-handler.js +3 -3
  376. package/dist/modes/rpc/connection-handler.js.map +1 -1
  377. package/docs/extensions.md +10 -0
  378. package/docs/providers.md +21 -5
  379. package/docs/release-guide.md +2 -2
  380. package/docs/settings.md +1 -1
  381. package/examples/extensions/overlay-test.ts +1 -1
  382. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +33 -0
  383. package/node_modules/@code-yeongyu/senpi-codemode/README.md +6 -3
  384. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  385. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status-ticker.ts +79 -0
  386. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +36 -3
  387. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +26 -12
  388. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +146 -0
  389. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +21 -119
  390. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +157 -0
  391. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +62 -208
  392. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +98 -0
  393. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +81 -0
  394. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +24 -0
  395. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +140 -0
  396. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-notification-queue.ts +53 -0
  397. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +45 -0
  398. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +45 -0
  399. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +20 -342
  400. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  401. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -0
  402. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  403. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  404. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +10 -15
  406. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +2 -2
  408. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts +24 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js +70 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +2 -16
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -58
  416. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +2 -2
  418. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js +7 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +2 -2
  424. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +2 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +14 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/models.js +95 -19
  431. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts +3 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.d.ts.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js +36 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/utils/unavailable-tool-text.js.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  450. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  451. package/node_modules/@earendil-works/pi-tui/dist/mux.js +1 -1
  452. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  453. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +1 -0
  454. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-tui/dist/tui.js +17 -3
  456. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  458. package/package.json +6 -6
  459. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.d.ts.map +0 -1
  460. package/dist/core/extensions/builtin/claude-agent-sdk/auth-lane.js.map +0 -1
  461. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts +0 -6
  462. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.d.ts.map +0 -1
  463. package/dist/core/extensions/builtin/claude-agent-sdk/guidance.js.map +0 -1
  464. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts +0 -4
  465. package/dist/core/extensions/builtin/claude-agent-sdk/index.d.ts.map +0 -1
  466. package/dist/core/extensions/builtin/claude-agent-sdk/index.js.map +0 -1
  467. package/dist/core/extensions/builtin/claude-agent-sdk/oauth-login.js.map +0 -1
  468. package/dist/core/extensions/builtin/claude-agent-sdk/options.d.ts +0 -16
  469. package/dist/core/extensions/builtin/claude-agent-sdk/options.js.map +0 -1
  470. package/dist/core/extensions/builtin/claude-agent-sdk/prompt-bridge.js.map +0 -1
  471. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts +0 -15
  472. package/dist/core/extensions/builtin/claude-agent-sdk/settings.d.ts.map +0 -1
  473. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js +0 -41
  474. package/dist/core/extensions/builtin/claude-agent-sdk/settings.js.map +0 -1
  475. package/dist/core/extensions/builtin/claude-agent-sdk/stream.d.ts.map +0 -1
  476. package/dist/core/extensions/builtin/claude-agent-sdk/stream.js.map +0 -1
  477. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.d.ts +0 -0
  478. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/account-events.js +0 -0
  479. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.d.ts +0 -0
  480. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools-schema.js +0 -0
  481. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.d.ts +0 -0
  482. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/custom-tools.js +0 -0
  483. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.d.ts +0 -0
  484. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/executable.js +0 -0
  485. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/failover.d.ts +0 -0
  486. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/prompt-bridge.d.ts +0 -0
  487. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/sdk-boundary.js +0 -0
  488. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.d.ts +0 -0
  489. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/stream-protocol.js +0 -0
  490. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.d.ts +0 -0
  491. /package/dist/core/extensions/builtin/{claude-agent-sdk → claude-sdk-oauth}/tools.js +0 -0
@@ -0,0 +1,79 @@
1
+ import type { EvalDetachedCellStatusEntry } from "../tool/detached-cell-manager.ts";
2
+ import { formatEvalCellStatus } from "./eval-status.ts";
3
+
4
+ /** Footer live-elapsed refresh cadence while at least one detached cell is running. */
5
+ export const EVAL_STATUS_TICK_INTERVAL_MS = 1000;
6
+
7
+ /** Receives the freshly formatted footer status text (undefined clears the status). */
8
+ export type EvalStatusRender = (status: string | undefined) => void;
9
+
10
+ export interface EvalStatusTickerOptions {
11
+ readonly render: EvalStatusRender;
12
+ /** Injectable clock for tests; defaults to Date.now. */
13
+ readonly now?: () => number;
14
+ }
15
+
16
+ /**
17
+ * Drives a once-per-second footer refresh while detached eval cells are running so
18
+ * the "↗ py · … (Ns)" elapsed label advances live instead of freezing between
19
+ * cell-set transitions. Same shape as the terminal builtin's MonitorStatusTicker:
20
+ * the interval is unref'd, and ticks producing the already-rendered label are skipped.
21
+ */
22
+ export class EvalStatusTicker {
23
+ private readonly render: EvalStatusRender;
24
+ private readonly now: () => number;
25
+ private intervalId: NodeJS.Timeout | undefined;
26
+ private entries: readonly EvalDetachedCellStatusEntry[] = [];
27
+ private lastRenderedStatus: string | undefined;
28
+ private hasRendered = false;
29
+
30
+ constructor(options: EvalStatusTickerOptions) {
31
+ this.render = options.render;
32
+ this.now = options.now ?? Date.now;
33
+ }
34
+
35
+ get running(): boolean {
36
+ return this.intervalId !== undefined;
37
+ }
38
+
39
+ /**
40
+ * Point the ticker at the current detached-cell set, render once immediately,
41
+ * and start the interval while cells are live (or stop it when none remain).
42
+ */
43
+ sync(entries: readonly EvalDetachedCellStatusEntry[]): void {
44
+ this.entries = entries;
45
+ this.hasRendered = false;
46
+ this.tick();
47
+ if (entries.length === 0) {
48
+ this.stopInterval();
49
+ return;
50
+ }
51
+ if (this.intervalId !== undefined) return;
52
+ const handle = setInterval(() => this.tick(), EVAL_STATUS_TICK_INTERVAL_MS);
53
+ handle.unref();
54
+ this.intervalId = handle;
55
+ }
56
+
57
+ /** Stop the interval and drop the retained entries. */
58
+ stop(): void {
59
+ this.stopInterval();
60
+ this.entries = [];
61
+ this.lastRenderedStatus = undefined;
62
+ this.hasRendered = false;
63
+ }
64
+
65
+ private stopInterval(): void {
66
+ if (this.intervalId !== undefined) {
67
+ clearInterval(this.intervalId);
68
+ this.intervalId = undefined;
69
+ }
70
+ }
71
+
72
+ private tick(): void {
73
+ const status = formatEvalCellStatus(this.entries, this.now());
74
+ if (this.hasRendered && status === this.lastRenderedStatus) return;
75
+ this.hasRendered = true;
76
+ this.lastRenderedStatus = status;
77
+ this.render(status);
78
+ }
79
+ }
@@ -31,14 +31,47 @@ function labelOf(entry: EvalDetachedCellStatusEntry): string {
31
31
  return entry.title === undefined || entry.title.length === 0 ? entry.cellId : entry.title;
32
32
  }
33
33
 
34
+ /**
35
+ * Goal-style compact elapsed label (`5s`, `3m`, `2h 30m`, `1d 2h 3m`). Mirrors
36
+ * the monitor builtin's formatElapsedSeconds; kept local like the rest of the
37
+ * duplicated status-file helpers between the two packages.
38
+ */
39
+ export function formatElapsedSeconds(value: number): string {
40
+ const seconds = Math.max(0, Math.trunc(value));
41
+ if (seconds < 60) return `${seconds}s`;
42
+ const minutes = Math.trunc(seconds / 60);
43
+ if (minutes < 60) return `${minutes}m`;
44
+ const hours = Math.trunc(minutes / 60);
45
+ const remainingMinutes = minutes % 60;
46
+ if (hours >= 24) {
47
+ const days = Math.trunc(hours / 24);
48
+ const remainingHours = hours % 24;
49
+ return `${days}d ${remainingHours}h ${remainingMinutes}m`;
50
+ }
51
+ if (remainingMinutes === 0) return `${hours}h`;
52
+ return `${hours}h ${remainingMinutes}m`;
53
+ }
54
+
55
+ /** Whole seconds since the oldest detached cell was created; never negative on clock skew. */
56
+ export function evalCellElapsedSeconds(entries: readonly EvalDetachedCellStatusEntry[], nowMs: number): number {
57
+ let oldest = Number.POSITIVE_INFINITY;
58
+ for (const entry of entries) oldest = Math.min(oldest, entry.startedAtMs);
59
+ if (!Number.isFinite(oldest)) return 0;
60
+ return Math.max(0, Math.round((nowMs - oldest) / 1000));
61
+ }
62
+
34
63
  /** Brief footer text for the cells still running detached; undefined clears the status. */
35
- export function formatEvalCellStatus(entries: readonly EvalDetachedCellStatusEntry[]): string | undefined {
64
+ export function formatEvalCellStatus(
65
+ entries: readonly EvalDetachedCellStatusEntry[],
66
+ nowMs: number,
67
+ ): string | undefined {
36
68
  const first = entries[0];
37
69
  if (first === undefined) return undefined;
70
+ const suffix = ` (${formatElapsedSeconds(evalCellElapsedSeconds(entries, nowMs))})`;
38
71
  if (entries.length === 1) {
39
72
  const head = `${DETACHED_GLYPH} ${first.language} · `;
40
- return head + truncateEnd(labelOf(first), MAX_STATUS_LENGTH - head.length);
73
+ return head + truncateEnd(labelOf(first), MAX_STATUS_LENGTH - head.length - suffix.length) + suffix;
41
74
  }
42
75
  const head = `${DETACHED_GLYPH} eval ${entries.length}: `;
43
- return head + packLabels(entries.map(labelOf), MAX_STATUS_LENGTH - head.length);
76
+ return head + packLabels(entries.map(labelOf), MAX_STATUS_LENGTH - head.length - suffix.length) + suffix;
44
77
  }
@@ -5,7 +5,8 @@ import type { EvalSchemaToolInfo } from "./bridges/schema-bridge.ts";
5
5
  import { type CompletionRequest, type CompletionResult, createCompletionHandler } from "./completion/handler.ts";
6
6
  import { defaultCodemodeSettings } from "./config/settings.ts";
7
7
  import { EvalNotifier } from "./extension/eval-notifier.ts";
8
- import { EVAL_CELLS_STATUS_KEY, formatEvalCellStatus } from "./extension/eval-status.ts";
8
+ import { EVAL_CELLS_STATUS_KEY } from "./extension/eval-status.ts";
9
+ import { EvalStatusTicker } from "./extension/eval-status-ticker.ts";
9
10
  import {
10
11
  createExecuteTool,
11
12
  createRuntime,
@@ -44,6 +45,8 @@ export interface SenpiCodemodeOptions {
44
45
  options: CreateCodemodeSessionManagerOptions,
45
46
  ) => CodemodeSessionManager | Promise<CodemodeSessionManager>;
46
47
  readonly complete?: (request: CompletionRequest, ctx: ExtensionContext) => Promise<CompletionResult>;
48
+ /** Injectable clock for detached-cell elapsed labels; defaults to Date.now. */
49
+ readonly now?: () => number;
47
50
  }
48
51
 
49
52
  export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCodemodeOptions = {}): void {
@@ -59,17 +62,22 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
59
62
  getContext: () => activeContext,
60
63
  getMode: () => "wake",
61
64
  });
65
+ const statusTicker = new EvalStatusTicker({
66
+ ...(options.now === undefined ? {} : { now: options.now }),
67
+ render: (status) => {
68
+ const ctx = activeContext;
69
+ if (ctx?.ui?.setStatus === undefined) return;
70
+ const theme = ctx.ui.theme;
71
+ ctx.ui.setStatus(
72
+ EVAL_CELLS_STATUS_KEY,
73
+ status === undefined || ctx.mode !== "tui" || theme === undefined
74
+ ? status
75
+ : theme.bg("selectedBg", theme.fg("text", status)),
76
+ );
77
+ },
78
+ });
62
79
  const showDetachedCells = (entries: readonly EvalDetachedCellStatusEntry[]): void => {
63
- const ctx = activeContext;
64
- if (ctx?.ui?.setStatus === undefined) return;
65
- const status = formatEvalCellStatus(entries);
66
- const theme = ctx.ui.theme;
67
- ctx.ui.setStatus(
68
- EVAL_CELLS_STATUS_KEY,
69
- status === undefined || ctx.mode !== "tui" || theme === undefined
70
- ? status
71
- : theme.bg("selectedBg", theme.fg("text", status)),
72
- );
80
+ statusTicker.sync(entries);
73
81
  };
74
82
  const registerEvalForRuntime = (
75
83
  runtime: SessionRuntime,
@@ -101,6 +109,7 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
101
109
  activeRuntime = undefined;
102
110
  activeModelId = undefined;
103
111
  activeCells = undefined;
112
+ statusTicker.stop();
104
113
  await cells?.dispose();
105
114
  activeContext = undefined;
106
115
  await manager.dispose();
@@ -114,7 +123,11 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
114
123
  listTools: () => pi.getAllTools(),
115
124
  complete,
116
125
  settings: defaultCodemodeSettings,
117
- cellManager: new EvalDetachedCellManager({ notifier, onStatusChange: showDetachedCells }),
126
+ cellManager: new EvalDetachedCellManager({
127
+ notifier,
128
+ onStatusChange: showDetachedCells,
129
+ ...(options.now === undefined ? {} : { now: options.now }),
130
+ }),
118
131
  executionTracker: manager,
119
132
  renderers,
120
133
  hostLine: hostLine(),
@@ -143,6 +156,7 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
143
156
  artifactsDir: runtime.artifactsDir,
144
157
  notifier,
145
158
  onStatusChange: showDetachedCells,
159
+ ...(options.now === undefined ? {} : { now: options.now }),
146
160
  });
147
161
  activeCells = cellManager;
148
162
  activeRuntime = runtime;
@@ -0,0 +1,146 @@
1
+ import { IdleTimeout, type IdleTimeoutOptions, type TimeoutPauseHandle } from "../timeouts/idle-timeout.ts";
2
+ import type { EvalKernel } from "./types.ts";
3
+
4
+ const INTERRUPT_DELIVERY_GRACE_MS = 100;
5
+
6
+ export interface EvalTimeoutFactory {
7
+ create(options: IdleTimeoutOptions): TimeoutPauseHandle & { dispose(): void };
8
+ }
9
+
10
+ export const defaultTimeoutFactory: EvalTimeoutFactory = {
11
+ create(options): IdleTimeout {
12
+ return new IdleTimeout(options);
13
+ },
14
+ };
15
+
16
+ export interface CellExecutionOptions {
17
+ readonly callerSignal: AbortSignal;
18
+ readonly cellId: string;
19
+ readonly timeoutMs: number;
20
+ readonly timeoutFactory: EvalTimeoutFactory;
21
+ readonly onTimeout: (error: Error) => void;
22
+ readonly onAbort: (error: Error) => void;
23
+ }
24
+
25
+ export class CellExecution {
26
+ readonly #callerSignal: AbortSignal;
27
+ readonly #onAbort: (error: Error) => void;
28
+ readonly #abortPromise: Promise<never>;
29
+ readonly #detachedPromise: Promise<void>;
30
+ readonly #watchdog: TimeoutPauseHandle & { dispose(): void };
31
+ #rejectAbort: ((reason?: unknown) => void) | undefined;
32
+ #resolveDetached: (() => void) | undefined;
33
+ #kernel: EvalKernel | undefined;
34
+ #interruptDeadline: ReturnType<typeof setTimeout> | undefined;
35
+ #active = true;
36
+
37
+ constructor(options: CellExecutionOptions) {
38
+ this.#callerSignal = options.callerSignal;
39
+ this.#onAbort = options.onAbort;
40
+ this.#abortPromise = new Promise<never>((_resolve, reject) => {
41
+ this.#rejectAbort = reject;
42
+ });
43
+ this.#detachedPromise = new Promise<void>((resolve) => {
44
+ this.#resolveDetached = resolve;
45
+ });
46
+ this.#watchdog = options.timeoutFactory.create({
47
+ cellId: options.cellId,
48
+ timeoutMs: options.timeoutMs,
49
+ onTimeout: ({ error }) => options.onTimeout(error),
50
+ });
51
+ this.#callerSignal.addEventListener("abort", this.#handleCallerAbort, {
52
+ once: true,
53
+ });
54
+ }
55
+
56
+ get detached(): Promise<void> {
57
+ return this.#detachedPromise;
58
+ }
59
+
60
+ pause(): void {
61
+ this.#watchdog.pause();
62
+ }
63
+
64
+ resume(): void {
65
+ this.#watchdog.resume();
66
+ }
67
+
68
+ setKernel(kernel: EvalKernel): void {
69
+ this.#kernel = kernel;
70
+ }
71
+
72
+ detach(): void {
73
+ if (!this.#active) return;
74
+ this.#watchdog.dispose();
75
+ this.#resolveDetached?.();
76
+ this.#resolveDetached = undefined;
77
+ }
78
+
79
+ cancel(reason: unknown): void {
80
+ this.#abort(reason);
81
+ }
82
+
83
+ finish(): void {
84
+ this.#active = false;
85
+ this.#cleanup();
86
+ }
87
+
88
+ async wait<Result>(operation: Promise<Result>): Promise<Result> {
89
+ const guarded = operation.then(
90
+ (value): Result | Promise<never> => (this.#active ? value : this.#abortPromise),
91
+ (reason: unknown): Promise<never> => (this.#active ? Promise.reject(reason) : this.#abortPromise),
92
+ );
93
+ return await Promise.race([guarded, this.#abortPromise]);
94
+ }
95
+
96
+ readonly #handleCallerAbort = (): void => {
97
+ this.#abort(this.#callerSignal.reason);
98
+ };
99
+
100
+ interruptStateRetained: Promise<boolean> | undefined;
101
+
102
+ #abort(reason: unknown): void {
103
+ if (!this.#active) return;
104
+ this.#active = false;
105
+ this.#cleanup();
106
+ const error = abortError(reason);
107
+ this.#onAbort(error);
108
+ const kernel = this.#kernel;
109
+ if (kernel === undefined) {
110
+ this.#settleAbort(error);
111
+ return;
112
+ }
113
+ this.#interruptDeadline = setTimeout(() => this.#settleAbort(error), INTERRUPT_DELIVERY_GRACE_MS);
114
+ void Promise.resolve()
115
+ .then(async () => {
116
+ const handle = await kernel.interrupt(error.message);
117
+ this.interruptStateRetained = handle?.stateRetained;
118
+ })
119
+ .then(
120
+ () => this.#settleAbort(error),
121
+ (interruptError: unknown) => this.#settleAbort(interruptError),
122
+ );
123
+ }
124
+
125
+ #settleAbort(reason: unknown): void {
126
+ const reject = this.#rejectAbort;
127
+ if (reject === undefined) return;
128
+ this.#rejectAbort = undefined;
129
+ if (this.#interruptDeadline !== undefined) clearTimeout(this.#interruptDeadline);
130
+ reject(reason);
131
+ }
132
+
133
+ #cleanup(): void {
134
+ this.#callerSignal.removeEventListener("abort", this.#handleCallerAbort);
135
+ this.#watchdog.dispose();
136
+ if (this.#interruptDeadline !== undefined) clearTimeout(this.#interruptDeadline);
137
+ this.#interruptDeadline = undefined;
138
+ }
139
+ }
140
+
141
+ export function abortError(reason: unknown): Error {
142
+ if (reason instanceof Error && reason.name !== "AbortError") return reason;
143
+ const error = new Error(typeof reason === "string" ? reason : "Eval interrupted", { cause: reason });
144
+ error.name = "AbortError";
145
+ return error;
146
+ }
@@ -1,9 +1,4 @@
1
- import {
2
- type AgentToolResult,
3
- type AgentToolUpdateCallback,
4
- type ExtensionContext,
5
- sanitizeTerminalLabel,
6
- } from "@code-yeongyu/senpi";
1
+ import { type AgentToolResult, type ExtensionContext, sanitizeTerminalLabel } from "@code-yeongyu/senpi";
7
2
  import type { KernelToHostMessage } from "../bridge/protocol.ts";
8
3
  import type { AgentExecuteTool } from "../bridges/agent-bridge.ts";
9
4
  import { isReservedToolName, runReservedTool } from "../bridges/reserved-dispatch.ts";
@@ -13,15 +8,12 @@ import type { CompletionRequest, CompletionResult } from "../completion/handler.
13
8
  import { handleCompletionToolCall } from "../completion/tool-bridge.ts";
14
9
  import type { ResolvedCodemodeSettings } from "../config/settings.ts";
15
10
  import { boundToolCallArgs, capCodePoints, MAX_ENRICHED_TOOL_CALLS, toolCallResultPreview } from "./call-capture.ts";
16
- import {
17
- type EvalImageResizer,
18
- EvalOutputCollector,
19
- type EvalOutputResult,
20
- marshalToolResult,
21
- toolResultIsError,
22
- } from "./image.ts";
11
+ import { CellResultBuilder, type CellState } from "./cell-runtime.ts";
12
+ import { type EvalImageResizer, marshalToolResult, toolResultIsError } from "./image.ts";
23
13
  import { upsertStatusEvent } from "./status-events.ts";
24
- import type { EvalKernel, EvalStatusEvent, EvalToolDetails, EvalToolInput } from "./types.ts";
14
+ import type { EvalKernel, EvalStatusEvent, EvalToolDetails } from "./types.ts";
15
+
16
+ export type { CellState } from "./cell-runtime.ts";
25
17
 
26
18
  type ResolvedToolReply = {
27
19
  readonly value: unknown;
@@ -37,22 +29,6 @@ type ToolCallEnrichment = {
37
29
  readonly argsTruncated?: true;
38
30
  };
39
31
 
40
- const LIVE_OUTPUT_PREVIEW_LINES = 8;
41
-
42
- export interface CellState {
43
- readonly input: EvalToolInput;
44
- readonly signal: AbortSignal;
45
- readonly onUpdate: AgentToolUpdateCallback<EvalToolDetails> | undefined;
46
- readonly toolCalls: EvalToolDetails["toolCalls"] extends readonly (infer Item)[] ? Item[] : never;
47
- readonly pendingBridgeCalls: Promise<void>[];
48
- readonly statusEvents: EvalStatusEvent[];
49
- active: boolean;
50
- output: string;
51
- phase: string | undefined;
52
- durationMs: number;
53
- status: "pending" | "running" | "complete" | "error";
54
- }
55
-
56
32
  export interface CellBridgeRuntime {
57
33
  readonly executeTool: AgentExecuteTool;
58
34
  readonly listTools?: () => readonly EvalSchemaToolInfo[];
@@ -67,46 +43,40 @@ export class CellHandler {
67
43
  readonly #kernel: EvalKernel;
68
44
  readonly #state: CellState;
69
45
  readonly #runtime: CellBridgeRuntime;
70
- readonly #output: EvalOutputCollector;
46
+ readonly #resultBuilder: CellResultBuilder;
71
47
 
72
48
  constructor(kernel: EvalKernel, state: CellState, runtime: CellBridgeRuntime) {
73
49
  this.#kernel = kernel;
74
50
  this.#state = state;
75
51
  this.#runtime = runtime;
76
52
  const settings = runtime.settings.outputSink;
77
- this.#output = new EvalOutputCollector({
53
+ this.#resultBuilder = new CellResultBuilder({
54
+ state,
78
55
  headBytes: settings.headBytes,
79
56
  maxColumns: settings.maxColumns,
80
57
  model: runtime.ctx.model,
81
58
  ...(runtime.artifactPath === undefined ? {} : { artifactPath: runtime.artifactPath }),
82
59
  ...(runtime.imageResizer === undefined ? {} : { imageResizer: runtime.imageResizer }),
83
- onChunk: (_aggregate, cell) => {
84
- state.output = cell;
85
- this.#emitUpdate(false);
86
- },
87
60
  });
88
- state.status = "running";
89
- this.#emitUpdate(false);
90
61
  }
91
62
 
92
63
  async handle(message: KernelToHostMessage): Promise<void> {
93
64
  if (!this.#state.active) return;
94
65
  switch (message.type) {
95
66
  case "text":
96
- this.#output.push(message.data);
67
+ this.#resultBuilder.push(message.data);
97
68
  return;
98
69
  case "phase":
99
- this.#state.phase = message.title;
100
- this.#emitUpdate(false);
70
+ this.#resultBuilder.setPhase(message.title);
101
71
  return;
102
72
  case "status":
103
73
  this.#recordStatus(message.event);
104
74
  return;
105
75
  case "log":
106
- this.#output.push(`${message.message}\n`);
76
+ this.#resultBuilder.push(`${message.message}\n`);
107
77
  return;
108
78
  case "display":
109
- this.#output.display(message);
79
+ this.#resultBuilder.display(message);
110
80
  return;
111
81
  case "tool-call": {
112
82
  const pending = this.#handleToolCall(message);
@@ -125,38 +95,19 @@ export class CellHandler {
125
95
  }
126
96
 
127
97
  async finalize(result: Extract<KernelToHostMessage, { type: "result" }>): Promise<AgentToolResult<EvalToolDetails>> {
128
- this.#state.durationMs = result.durationMs;
129
- if (result.ok) {
130
- if (result.valueRepr) this.#output.push(`${result.valueRepr}\n`);
131
- this.#state.status = "complete";
132
- } else {
133
- this.#output.push(`${result.error.message}\n`);
134
- this.#state.status = "error";
135
- }
136
- return await this.#finish(!result.ok);
98
+ return await this.#resultBuilder.finalize(result);
137
99
  }
138
100
 
139
101
  async finalizeCancellation(error: Error): Promise<AgentToolResult<EvalToolDetails>> {
140
- this.#output.push(`${error.message}\n`);
141
- this.#state.status = "error";
142
- return await this.#finish(true);
102
+ return await this.#resultBuilder.finalizeCancellation(error);
143
103
  }
144
104
 
145
105
  async flushOutput(): Promise<void> {
146
- await this.#output.flush();
106
+ await this.#resultBuilder.flushOutput();
147
107
  }
148
108
 
149
- async #finish(isError: boolean): Promise<AgentToolResult<EvalToolDetails>> {
150
- const output = await this.#output.finish();
151
- this.#state.output = output.output;
152
- const details = this.#details(output, isError);
153
- this.#emitUpdate(isError);
154
- const text =
155
- output.output ||
156
- (output.images.length > 0
157
- ? `(displayed ${output.images.length} image${output.images.length === 1 ? "" : "s"}; no text output)`
158
- : "(no output)");
159
- return { content: [{ type: "text", text }, ...output.images], details };
109
+ liveResult(): AgentToolResult<EvalToolDetails> {
110
+ return this.#resultBuilder.liveResult();
160
111
  }
161
112
 
162
113
  async #handleToolCall(message: Extract<KernelToHostMessage, { type: "tool-call" }>): Promise<void> {
@@ -202,7 +153,7 @@ export class CellHandler {
202
153
  ? { name: message.toolName, ok: true }
203
154
  : { name: message.toolName, ok: false, error: result.error },
204
155
  );
205
- this.#emitUpdate(false);
156
+ this.#resultBuilder.emitUpdate(false);
206
157
  return;
207
158
  }
208
159
  const capturedArgs = boundToolCallArgs(message.args);
@@ -268,7 +219,7 @@ export class CellHandler {
268
219
  error: { message: text },
269
220
  });
270
221
  }
271
- this.#emitUpdate(false);
222
+ this.#resultBuilder.emitUpdate(false);
272
223
  }
273
224
 
274
225
  #pushToolCall(
@@ -301,55 +252,6 @@ export class CellHandler {
301
252
  #recordStatus(event: EvalStatusEvent): void {
302
253
  if (!this.#runtime.settings.statusEvents) return;
303
254
  upsertStatusEvent(this.#state.statusEvents, event);
304
- this.#emitUpdate(false);
305
- }
306
-
307
- #details(output: EvalOutputResult | undefined, isError: boolean): EvalToolDetails {
308
- const statusEvents = this.#state.statusEvents.length > 0 ? [...this.#state.statusEvents] : undefined;
309
- return {
310
- language: this.#state.input.language,
311
- languages: [this.#state.input.language],
312
- ...(this.#state.input.title === undefined ? {} : { title: this.#state.input.title }),
313
- durationMs: this.#state.durationMs,
314
- toolCalls: [...this.#state.toolCalls],
315
- truncated: output?.truncated ?? false,
316
- ...(isError ? { isError: true } : {}),
317
- ...(this.#state.phase === undefined ? {} : { phase: this.#state.phase }),
318
- cells: [
319
- {
320
- index: 0,
321
- ...(this.#state.input.title === undefined ? {} : { title: this.#state.input.title }),
322
- code: this.#state.input.code,
323
- language: this.#state.input.language,
324
- output: this.#state.output,
325
- status: this.#state.status,
326
- durationMs: this.#state.durationMs,
327
- ...(statusEvents === undefined ? {} : { statusEvents }),
328
- ...(output?.hasMarkdown ? { hasMarkdown: true } : {}),
329
- },
330
- ],
331
- ...(statusEvents === undefined ? {} : { statusEvents }),
332
- ...(output === undefined || output.jsonOutputs.length === 0 ? {} : { jsonOutputs: output.jsonOutputs }),
333
- ...(output?.notice === undefined ? {} : { notice: output.notice }),
334
- ...(output?.meta === undefined ? {} : { meta: output.meta }),
335
- };
336
- }
337
-
338
- #liveUpdateText(): string {
339
- const title = this.#state.input.title === undefined ? "" : ` ${this.#state.input.title}`;
340
- const aggregateOutput = this.#output.aggregateText();
341
- const outputLines = aggregateOutput.split("\n");
342
- const hasTrailingNewline = aggregateOutput.endsWith("\n");
343
- if (hasTrailingNewline) outputLines.pop();
344
- const output = `${outputLines.slice(-LIVE_OUTPUT_PREVIEW_LINES).join("\n")}${hasTrailingNewline ? "\n" : ""}`;
345
- return `1/1 cells ${this.#state.status}\n[1] ${this.#state.input.language}${title} ${this.#state.status}${output.length === 0 ? "" : `\n${output}`}`;
346
- }
347
-
348
- #emitUpdate(isError: boolean): void {
349
- if (!this.#state.active) return;
350
- this.#state.onUpdate?.({
351
- content: [{ type: "text", text: this.#liveUpdateText() }],
352
- details: this.#details(undefined, isError),
353
- });
255
+ this.#resultBuilder.emitUpdate(false);
354
256
  }
355
257
  }