@code-yeongyu/senpi 2026.7.17-5 → 2026.7.20-2

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 (605) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +5 -2
  3. package/dist/cli/neo/build-argv.d.ts.map +1 -1
  4. package/dist/cli/neo/build-argv.js +2 -0
  5. package/dist/cli/neo/build-argv.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +11 -4
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +37 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +395 -73
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/compaction/compaction.d.ts +2 -2
  14. package/dist/core/compaction/compaction.d.ts.map +1 -1
  15. package/dist/core/compaction/compaction.js +59 -15
  16. package/dist/core/compaction/compaction.js.map +1 -1
  17. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/compaction/index.js +68 -10
  19. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/compaction/speculative.d.ts +7 -1
  21. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/compaction/speculative.js +29 -11
  23. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  24. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +9 -7
  25. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/compaction/todo-bridge.js +34 -9
  27. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  28. package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
  29. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/goal/command-registration.js +3 -4
  31. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  32. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/goal/index.js +11 -27
  34. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
  36. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/goal/tool-registration.js +2 -3
  38. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  39. package/dist/core/extensions/builtin/goal/turn-usage.d.ts +20 -0
  40. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -0
  41. package/dist/core/extensions/builtin/goal/turn-usage.js +61 -0
  42. package/dist/core/extensions/builtin/goal/turn-usage.js.map +1 -0
  43. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts +1 -0
  44. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js +5 -1
  46. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
  47. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts +2 -1
  48. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +48 -29
  50. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  51. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts +2 -2
  52. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/gpt-apply-patch/index.js +2 -2
  54. package/dist/core/extensions/builtin/gpt-apply-patch/index.js.map +1 -1
  55. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts +1 -1
  56. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +5 -3
  58. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  59. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +7 -6
  60. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  62. package/dist/core/extensions/builtin/hooks/matcher.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/hooks/matcher.js +1 -0
  64. package/dist/core/extensions/builtin/hooks/matcher.js.map +1 -1
  65. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/index.js +4 -0
  67. package/dist/core/extensions/builtin/index.js.map +1 -1
  68. package/dist/core/extensions/builtin/model-fallback/index.d.ts +4 -0
  69. package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +1 -0
  70. package/dist/core/extensions/builtin/model-fallback/index.js +55 -0
  71. package/dist/core/extensions/builtin/model-fallback/index.js.map +1 -0
  72. package/dist/core/extensions/builtin/model-fallback/settings.d.ts +6 -0
  73. package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +1 -0
  74. package/dist/core/extensions/builtin/model-fallback/settings.js +11 -0
  75. package/dist/core/extensions/builtin/model-fallback/settings.js.map +1 -0
  76. package/dist/core/extensions/builtin/model-fallback/ui.d.ts +12 -0
  77. package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/model-fallback/ui.js +72 -0
  79. package/dist/core/extensions/builtin/model-fallback/ui.js.map +1 -0
  80. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/nested-agents-md/index.js +4 -1
  82. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  83. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +1 -1
  84. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
  85. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +2 -2
  86. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  87. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +2 -2
  88. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  89. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts +3 -0
  90. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +80 -0
  92. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -0
  93. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/prompt-preset/presets.js +14 -0
  95. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  96. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  97. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  99. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  100. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/rules/index.js +4 -1
  102. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
  104. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/terminal/shared.js +7 -0
  106. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  107. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/terminal/tools/bash.js +68 -6
  109. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  110. package/dist/core/extensions/builtin/todotools/commands.d.ts +18 -0
  111. package/dist/core/extensions/builtin/todotools/commands.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/todotools/commands.js +395 -0
  113. package/dist/core/extensions/builtin/todotools/commands.js.map +1 -0
  114. package/dist/core/extensions/builtin/todotools/index.d.ts +4 -1
  115. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  116. package/dist/core/extensions/builtin/todotools/index.js +17 -14
  117. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  118. package/dist/core/extensions/builtin/todotools/markdown.d.ts +13 -0
  119. package/dist/core/extensions/builtin/todotools/markdown.d.ts.map +1 -0
  120. package/dist/core/extensions/builtin/todotools/markdown.js +82 -0
  121. package/dist/core/extensions/builtin/todotools/markdown.js.map +1 -0
  122. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -1
  123. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/todotools/prompt.js +50 -153
  125. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  126. package/dist/core/extensions/builtin/todotools/state.d.ts +67 -14
  127. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/todotools/state.js +400 -35
  129. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  130. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +22 -0
  131. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -0
  132. package/dist/core/extensions/builtin/todotools/tools/todo.js +229 -0
  133. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -0
  134. package/dist/core/extensions/builtin/video-in/index.d.ts +3 -0
  135. package/dist/core/extensions/builtin/video-in/index.d.ts.map +1 -0
  136. package/dist/core/extensions/builtin/video-in/index.js +111 -0
  137. package/dist/core/extensions/builtin/video-in/index.js.map +1 -0
  138. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +13 -4
  140. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  141. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +3 -2
  142. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/websearch/websearch/search.js +2 -1
  144. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  145. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/websearch/websearch/tool.js +17 -1
  147. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  148. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +2 -0
  149. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  151. package/dist/core/extensions/loader.d.ts +10 -1
  152. package/dist/core/extensions/loader.d.ts.map +1 -1
  153. package/dist/core/extensions/loader.js +44 -3
  154. package/dist/core/extensions/loader.js.map +1 -1
  155. package/dist/core/extensions/runner.d.ts +3 -1
  156. package/dist/core/extensions/runner.d.ts.map +1 -1
  157. package/dist/core/extensions/runner.js +60 -8
  158. package/dist/core/extensions/runner.js.map +1 -1
  159. package/dist/core/extensions/types.d.ts +103 -18
  160. package/dist/core/extensions/types.d.ts.map +1 -1
  161. package/dist/core/extensions/types.js.map +1 -1
  162. package/dist/core/model-registry.d.ts +5 -1
  163. package/dist/core/model-registry.d.ts.map +1 -1
  164. package/dist/core/model-registry.js +17 -2
  165. package/dist/core/model-registry.js.map +1 -1
  166. package/dist/core/model-runtime.d.ts +12 -1
  167. package/dist/core/model-runtime.d.ts.map +1 -1
  168. package/dist/core/model-runtime.js +51 -9
  169. package/dist/core/model-runtime.js.map +1 -1
  170. package/dist/core/prompt-templates.d.ts +1 -0
  171. package/dist/core/prompt-templates.d.ts.map +1 -1
  172. package/dist/core/prompt-templates.js +4 -4
  173. package/dist/core/prompt-templates.js.map +1 -1
  174. package/dist/core/provider-composer.d.ts +1 -1
  175. package/dist/core/provider-composer.d.ts.map +1 -1
  176. package/dist/core/provider-composer.js.map +1 -1
  177. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  178. package/dist/core/remote-catalog-provider.js +16 -3
  179. package/dist/core/remote-catalog-provider.js.map +1 -1
  180. package/dist/core/resource-loader.d.ts +6 -0
  181. package/dist/core/resource-loader.d.ts.map +1 -1
  182. package/dist/core/resource-loader.js +27 -2
  183. package/dist/core/resource-loader.js.map +1 -1
  184. package/dist/core/retry-fallback/chains.d.ts +29 -0
  185. package/dist/core/retry-fallback/chains.d.ts.map +1 -0
  186. package/dist/core/retry-fallback/chains.js +109 -0
  187. package/dist/core/retry-fallback/chains.js.map +1 -0
  188. package/dist/core/retry-fallback/controller.d.ts +77 -0
  189. package/dist/core/retry-fallback/controller.d.ts.map +1 -0
  190. package/dist/core/retry-fallback/controller.js +157 -0
  191. package/dist/core/retry-fallback/controller.js.map +1 -0
  192. package/dist/core/retry-fallback/cooldown.d.ts +21 -0
  193. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -0
  194. package/dist/core/retry-fallback/cooldown.js +49 -0
  195. package/dist/core/retry-fallback/cooldown.js.map +1 -0
  196. package/dist/core/retry-fallback/log.d.ts +10 -0
  197. package/dist/core/retry-fallback/log.d.ts.map +1 -0
  198. package/dist/core/retry-fallback/log.js +128 -0
  199. package/dist/core/retry-fallback/log.js.map +1 -0
  200. package/dist/core/retry-fallback/validate.d.ts +8 -0
  201. package/dist/core/retry-fallback/validate.d.ts.map +1 -0
  202. package/dist/core/retry-fallback/validate.js +63 -0
  203. package/dist/core/retry-fallback/validate.js.map +1 -0
  204. package/dist/core/sdk.d.ts.map +1 -1
  205. package/dist/core/sdk.js +1 -0
  206. package/dist/core/sdk.js.map +1 -1
  207. package/dist/core/session-manager.d.ts +6 -1
  208. package/dist/core/session-manager.d.ts.map +1 -1
  209. package/dist/core/session-manager.js +19 -3
  210. package/dist/core/session-manager.js.map +1 -1
  211. package/dist/core/settings-manager.d.ts +21 -0
  212. package/dist/core/settings-manager.d.ts.map +1 -1
  213. package/dist/core/settings-manager.js +100 -1
  214. package/dist/core/settings-manager.js.map +1 -1
  215. package/dist/core/tools/bash.d.ts.map +1 -1
  216. package/dist/core/tools/bash.js +20 -5
  217. package/dist/core/tools/bash.js.map +1 -1
  218. package/dist/core/tools/read.js +1 -1
  219. package/dist/core/tools/read.js.map +1 -1
  220. package/dist/extensions/index.d.ts +3 -0
  221. package/dist/extensions/index.d.ts.map +1 -0
  222. package/dist/extensions/index.js +3 -0
  223. package/dist/extensions/index.js.map +1 -0
  224. package/dist/extensions/llama/client.d.ts +61 -0
  225. package/dist/extensions/llama/client.d.ts.map +1 -0
  226. package/dist/extensions/llama/client.js +298 -0
  227. package/dist/extensions/llama/client.js.map +1 -0
  228. package/dist/extensions/llama/huggingface.d.ts +23 -0
  229. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  230. package/dist/extensions/llama/huggingface.js +139 -0
  231. package/dist/extensions/llama/huggingface.js.map +1 -0
  232. package/dist/extensions/llama/index.d.ts +3 -0
  233. package/dist/extensions/llama/index.d.ts.map +1 -0
  234. package/dist/extensions/llama/index.js +208 -0
  235. package/dist/extensions/llama/index.js.map +1 -0
  236. package/dist/extensions/llama/provider.d.ts +10 -0
  237. package/dist/extensions/llama/provider.d.ts.map +1 -0
  238. package/dist/extensions/llama/provider.js +106 -0
  239. package/dist/extensions/llama/provider.js.map +1 -0
  240. package/dist/extensions/llama/ui.d.ts +42 -0
  241. package/dist/extensions/llama/ui.d.ts.map +1 -0
  242. package/dist/extensions/llama/ui.js +400 -0
  243. package/dist/extensions/llama/ui.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/main.d.ts.map +1 -1
  248. package/dist/main.js +6 -4
  249. package/dist/main.js.map +1 -1
  250. package/dist/modes/interactive/components/assistant-message.d.ts +6 -7
  251. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/assistant-message.js +154 -114
  253. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  254. package/dist/modes/interactive/components/footer.d.ts +2 -1
  255. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/footer.js +25 -4
  257. package/dist/modes/interactive/components/footer.js.map +1 -1
  258. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  259. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/settings-selector.js +20 -0
  261. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  262. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  263. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  264. package/dist/modes/interactive/interactive-mode.js +165 -13
  265. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  266. package/dist/modes/interactive/streaming-reveal.d.ts +35 -0
  267. package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -0
  268. package/dist/modes/interactive/streaming-reveal.js +268 -0
  269. package/dist/modes/interactive/streaming-reveal.js.map +1 -0
  270. package/dist/modes/interactive/tool-args-reveal.d.ts +20 -0
  271. package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -0
  272. package/dist/modes/interactive/tool-args-reveal.js +153 -0
  273. package/dist/modes/interactive/tool-args-reveal.js.map +1 -0
  274. package/dist/utils/child-process.d.ts +17 -1
  275. package/dist/utils/child-process.d.ts.map +1 -1
  276. package/dist/utils/child-process.js +41 -1
  277. package/dist/utils/child-process.js.map +1 -1
  278. package/docs/custom-provider.md +28 -0
  279. package/docs/extensions.md +65 -5
  280. package/docs/index.md +1 -0
  281. package/docs/llama-cpp.md +99 -0
  282. package/docs/neo.md +2 -1
  283. package/docs/prompt-templates.md +1 -0
  284. package/docs/providers.md +7 -0
  285. package/docs/settings.md +35 -0
  286. package/docs/tui.md +41 -26
  287. package/docs/usage.md +1 -0
  288. package/examples/extensions/README.md +1 -1
  289. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  290. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  291. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +0 -1
  292. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  293. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +76 -8
  294. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  296. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +26 -1
  297. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  298. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  299. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +24 -2
  300. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  301. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  302. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  304. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  305. package/node_modules/@earendil-works/pi-ai/README.md +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +92 -29
  308. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +105 -61
  311. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
  313. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
  315. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  317. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  319. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +4263 -22324
  321. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +436 -1988
  323. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +2 -1892
  325. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts +10 -80
  327. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts.map +1 -1
  328. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js +2 -57
  329. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js.map +1 -1
  330. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +43 -267
  331. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +2 -252
  333. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +184 -883
  335. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  336. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +2 -811
  337. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  338. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts +10 -60
  339. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js +2 -56
  341. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +168 -884
  343. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +2 -755
  345. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts +40 -286
  347. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js +2 -236
  349. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  350. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -0
  351. package/node_modules/@earendil-works/pi-ai/dist/providers/data/ant-ling.json +1 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -0
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -0
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -0
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -0
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -0
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -0
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -0
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -0
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -0
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -0
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -0
  364. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -0
  365. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -0
  366. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -0
  367. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -0
  368. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai-cn.json +1 -0
  369. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai.json +1 -0
  370. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -0
  371. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -0
  372. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -0
  373. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -0
  374. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -0
  376. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -0
  377. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -0
  378. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xai.json +1 -0
  379. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  380. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  381. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  382. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi.json +1 -0
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -0
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -0
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +7 -58
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -40
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +1 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +1 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +49 -362
  394. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
  395. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -292
  396. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +85 -760
  398. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +2 -538
  400. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts +31 -189
  402. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js +2 -179
  404. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +49 -309
  406. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js +2 -285
  408. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts +22 -118
  410. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js +2 -122
  412. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts +196 -979
  414. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js +2 -884
  416. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +13 -122
  418. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +2 -98
  420. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts +10 -48
  422. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js +2 -53
  424. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts +10 -48
  426. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js +2 -53
  428. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js.map +1 -1
  429. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts +91 -480
  430. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts.map +1 -1
  431. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js +2 -512
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js.map +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +31 -257
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +2 -185
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +31 -257
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +2 -185
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts +58 -541
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts.map +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js +2 -382
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js.map +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +22 -196
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +2 -139
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +184 -954
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  451. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +2 -825
  452. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts +1 -1
  454. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js +2 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +46 -335
  458. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
  459. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +2 -273
  460. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  461. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +163 -1185
  462. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +2 -996
  464. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  465. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +1076 -5729
  466. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  467. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +2 -4892
  468. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  469. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +49 -610
  470. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -1
  471. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +2 -396
  472. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -1
  473. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +752 -3336
  474. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  475. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -3263
  476. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  477. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +10 -65
  478. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
  479. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +2 -57
  480. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
  481. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +10 -63
  482. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  483. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +2 -56
  484. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  485. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +10 -63
  486. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  487. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +2 -56
  488. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  489. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +10 -63
  490. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  491. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +2 -56
  492. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  493. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts +19 -126
  494. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts.map +1 -1
  495. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js +2 -110
  496. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js.map +1 -1
  497. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +19 -144
  498. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  499. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +2 -111
  500. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
  501. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +19 -144
  502. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
  503. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +2 -111
  504. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
  505. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  506. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +9 -0
  507. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  508. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  509. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +2 -1
  510. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  511. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +1 -0
  512. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -1
  513. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +1 -1
  514. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -1
  515. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +1 -0
  516. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -1
  517. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +1 -1
  518. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -1
  519. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts +19 -0
  520. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts.map +1 -0
  521. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js +8 -0
  522. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js.map +1 -0
  523. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +2 -0
  524. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -1
  525. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +7 -4
  526. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -1
  527. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +2 -0
  528. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
  529. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +22 -18
  530. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
  531. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts +15 -0
  532. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts.map +1 -0
  533. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.js +198 -0
  534. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/coerce-parameters.js.map +1 -0
  535. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.d.ts +3 -0
  536. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.d.ts.map +1 -0
  537. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.js +8 -0
  538. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/config.js.map +1 -0
  539. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.d.ts +6 -0
  540. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.d.ts.map +1 -0
  541. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.js +33 -0
  542. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/format.js.map +1 -0
  543. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +6 -0
  544. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -0
  545. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +6 -0
  546. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -0
  547. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.d.ts +4 -0
  548. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.d.ts.map +1 -0
  549. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.js +6 -0
  550. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/parse.js.map +1 -0
  551. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.d.ts +12 -0
  552. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.d.ts.map +1 -0
  553. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.js +46 -0
  554. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/repair.js.map +1 -0
  555. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.d.ts +4 -0
  556. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.d.ts.map +1 -0
  557. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.js +6 -0
  558. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/stream.js.map +1 -0
  559. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +2 -1
  560. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  561. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  562. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +19 -2
  563. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  564. package/node_modules/@earendil-works/pi-ai/dist/types.js +4 -1
  565. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  566. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  567. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +6 -1
  568. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  569. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +4 -0
  570. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -0
  571. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +6 -0
  572. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -0
  573. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  574. package/node_modules/@earendil-works/pi-pty/dist/registry-session.d.ts +1 -1
  575. package/node_modules/@earendil-works/pi-pty/dist/registry-session.d.ts.map +1 -1
  576. package/node_modules/@earendil-works/pi-pty/dist/registry-session.js +25 -6
  577. package/node_modules/@earendil-works/pi-pty/dist/registry-session.js.map +1 -1
  578. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts +6 -0
  579. package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
  580. package/node_modules/@earendil-works/pi-pty/dist/registry-types.js.map +1 -1
  581. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts +1 -0
  582. package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
  583. package/node_modules/@earendil-works/pi-pty/dist/registry.js +9 -1
  584. package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
  585. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  586. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  587. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  588. package/node_modules/@earendil-works/pi-tui/dist/index.js +1 -1
  589. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  590. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +6 -1
  591. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  592. package/node_modules/@earendil-works/pi-tui/dist/tui.js +14 -2
  593. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  594. package/node_modules/@earendil-works/pi-tui/dist/utils.js +1 -1
  595. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  596. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  597. package/package.json +6 -6
  598. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts +0 -4
  599. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +0 -1
  600. package/dist/core/extensions/builtin/todotools/tools/todoread.js +0 -37
  601. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +0 -1
  602. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts +0 -10
  603. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +0 -1
  604. package/dist/core/extensions/builtin/todotools/tools/todowrite.js +0 -95
  605. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,SAAS,yBAAyB,CAAC,QAA2B;IAC7D,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,0CAA0C,GAAG,yBAAyB,CAAC;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,mBAAmB;IACnB,qBAAqB;IAErB,6EAA6E;IAC7E,yDAAyD;IACzD,6BAA6B;IAC7B,mBAAmB;IAEnB,4EAA4E;IAC5E,4EAA4E;IAC5E,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,gCAAgC,GAAG,yBAAyB,CAAC;IAClE,0EAA0E;IAC1E,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IAEjB,8EAA8E;IAC9E,+CAA+C;IAC/C,2BAA2B;IAE3B,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,gBAAgB;IAChB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,gBAAgB;IAChB,8BAA8B;IAC9B,YAAY;IACZ,SAAS;IACT,YAAY;IAEZ,+EAA+E;IAC/E,mBAAmB;IACnB,kBAAkB;IAElB,yEAAyE;IACzE,8EAA8E;IAC9E,yEAAyE;IACzE,eAAe;IACf,kCAAkC;IAClC,sCAAsC;IAEtC,4EAA4E;IAC5E,iEAAiE;IACjE,aAAa;IAEb,6EAA6E;IAC7E,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,2BAA2B;IAE3B,yCAAyC;IACzC,mBAAmB;CACnB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAyB;IAClE,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,0CAA0C,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,gCAAgC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import type { AssistantMessage } from \"../types.ts\";\n\nfunction buildProviderErrorPattern(patterns: readonly string[]): RegExp {\n\treturn new RegExp(patterns.join(\"|\"), \"i\");\n}\n\nconst NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN = buildProviderErrorPattern([\n\t// OpenCode Go/free-tier limits returned as 429 JSON error types by OpenCode's\n\t// Zen API. These are subscription/account limits, not transient throttles.\n\t\"GoUsageLimitError\",\n\t\"FreeUsageLimitError\",\n\n\t// OpenCode Go subscription-limit text asks users to enable available-balance\n\t// usage after rolling/weekly/monthly limits are reached.\n\t\"Monthly usage limit reached\",\n\t\"available balance\",\n\n\t// Generic quota/budget/billing exhaustion. `insufficient_quota` is OpenAI's\n\t// quota/billing error code; the other strings cover common gateway wording.\n\t\"insufficient_quota\",\n\t\"out of budget\",\n\t\"quota exceeded\",\n\t\"billing\",\n]);\n\nconst RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([\n\t// Generic provider load, HTTP status, and server-side transient failures.\n\t\"overloaded\",\n\t\"rate.?limit\",\n\t\"too many requests\",\n\t\"429\",\n\t\"500\",\n\t\"502\",\n\t\"503\",\n\t\"504\",\n\t\"524\",\n\t\"service.?unavailable\",\n\t\"server.?error\",\n\t\"internal.?error\",\n\n\t// Wrapper/provider text for transient upstream failures, including OpenRouter\n\t// \"Provider returned error\" responses (#2264).\n\t\"provider.?returned.?error\",\n\n\t// Network, proxy, and fetch transport failures. This includes OpenAI Codex\n\t// raw-fetch failures such as \"upstream connect\", \"connection refused\", and\n\t// \"reset before headers\" (#733), plus OpenRouter connection drops (#3317).\n\t\"network.?error\",\n\t\"connection.?error\",\n\t\"connection.?refused\",\n\t\"connection.?lost\",\n\t\"other side closed\",\n\t\"fetch failed\",\n\t\"upstream.?connect\",\n\t\"reset before headers\",\n\t\"socket hang up\",\n\t\"socket connection was closed\",\n\t\"timed? out\",\n\t\"timeout\",\n\t\"terminated\",\n\n\t// WebSocket transports can report close/error text instead of HTTP/fetch text.\n\t\"websocket.?closed\",\n\t\"websocket.?error\",\n\n\t// Premature stream endings from SDKs and transports. Anthropic can throw\n\t// \"stream ended without ...\" and \"Anthropic stream ended before message_stop\"\n\t// (#4433); Bedrock/Smithy can throw an HTTP/2 no-response error (#3594).\n\t\"ended without\",\n\t\"stream ended before message_stop\",\n\t\"http2 request did not get a response\",\n\n\t// Provider-requested retry delay cap failures should flow through the outer\n\t// retry policy so callers can surface/abort the backoff (#1123).\n\t\"retry delay\",\n\n\t// Explicit retry guidance emitted mid-stream by OpenAI Responses and Bedrock\n\t// stream exceptions (#6019).\n\t\"you can retry your request\",\n\t\"try your request again\",\n\t\"please retry your request\",\n\n\t// gRPC based providers (e.g. NVIDIA NIM)\n\t\"ResourceExhausted\",\n]);\n\n/**\n * Classifies whether a failed assistant message looks like a transient provider\n * or transport error, so callers can decide if the last assistant turn should be\n * restarted.\n *\n * This does not implement retry policy. Callers should first handle context\n * overflow separately, then apply their own retry budget, backoff, and reporting\n * before restarting the assistant turn.\n */\nexport function isRetryableAssistantError(message: AssistantMessage): boolean {\n\tif (message.stopReason !== \"error\" || !message.errorMessage) return false;\n\tconst errorMessage = message.errorMessage;\n\tif (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage)) return false;\n\treturn RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage);\n}\n"]}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,SAAS,yBAAyB,CAAC,QAA2B;IAC7D,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,0CAA0C,GAAG,yBAAyB,CAAC;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,mBAAmB;IACnB,qBAAqB;IAErB,6EAA6E;IAC7E,yDAAyD;IACzD,6BAA6B;IAC7B,mBAAmB;IAEnB,4EAA4E;IAC5E,4EAA4E;IAC5E,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,gCAAgC,GAAG,yBAAyB,CAAC;IAClE,0EAA0E;IAC1E,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IAEjB,8EAA8E;IAC9E,+CAA+C;IAC/C,2BAA2B;IAE3B,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,gBAAgB;IAChB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,gBAAgB;IAChB,8BAA8B;IAC9B,YAAY;IACZ,SAAS;IACT,YAAY;IAEZ,+EAA+E;IAC/E,mBAAmB;IACnB,kBAAkB;IAElB,yEAAyE;IACzE,8EAA8E;IAC9E,yEAAyE;IACzE,eAAe;IACf,kCAAkC;IAClC,+CAA+C;IAC/C,sCAAsC;IAEtC,4EAA4E;IAC5E,iEAAiE;IACjE,aAAa;IAEb,6EAA6E;IAC7E,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,2BAA2B;IAE3B,yCAAyC;IACzC,mBAAmB;CACnB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAyB;IAClE,IACC,OAAO,CAAC,UAAU,KAAK,OAAO;QAC9B,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,SAAS;QACvC,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,WAAW;QACzC,CAAC,OAAO,CAAC,YAAY,EACpB,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,0CAA0C,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,gCAAgC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import type { AssistantMessage } from \"../types.ts\";\n\nfunction buildProviderErrorPattern(patterns: readonly string[]): RegExp {\n\treturn new RegExp(patterns.join(\"|\"), \"i\");\n}\n\nconst NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN = buildProviderErrorPattern([\n\t// OpenCode Go/free-tier limits returned as 429 JSON error types by OpenCode's\n\t// Zen API. These are subscription/account limits, not transient throttles.\n\t\"GoUsageLimitError\",\n\t\"FreeUsageLimitError\",\n\n\t// OpenCode Go subscription-limit text asks users to enable available-balance\n\t// usage after rolling/weekly/monthly limits are reached.\n\t\"Monthly usage limit reached\",\n\t\"available balance\",\n\n\t// Generic quota/budget/billing exhaustion. `insufficient_quota` is OpenAI's\n\t// quota/billing error code; the other strings cover common gateway wording.\n\t\"insufficient_quota\",\n\t\"out of budget\",\n\t\"quota exceeded\",\n\t\"billing\",\n]);\n\nconst RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([\n\t// Generic provider load, HTTP status, and server-side transient failures.\n\t\"overloaded\",\n\t\"rate.?limit\",\n\t\"too many requests\",\n\t\"429\",\n\t\"500\",\n\t\"502\",\n\t\"503\",\n\t\"504\",\n\t\"524\",\n\t\"service.?unavailable\",\n\t\"server.?error\",\n\t\"internal.?error\",\n\n\t// Wrapper/provider text for transient upstream failures, including OpenRouter\n\t// \"Provider returned error\" responses (#2264).\n\t\"provider.?returned.?error\",\n\n\t// Network, proxy, and fetch transport failures. This includes OpenAI Codex\n\t// raw-fetch failures such as \"upstream connect\", \"connection refused\", and\n\t// \"reset before headers\" (#733), plus OpenRouter connection drops (#3317).\n\t\"network.?error\",\n\t\"connection.?error\",\n\t\"connection.?refused\",\n\t\"connection.?lost\",\n\t\"other side closed\",\n\t\"fetch failed\",\n\t\"upstream.?connect\",\n\t\"reset before headers\",\n\t\"socket hang up\",\n\t\"socket connection was closed\",\n\t\"timed? out\",\n\t\"timeout\",\n\t\"terminated\",\n\n\t// WebSocket transports can report close/error text instead of HTTP/fetch text.\n\t\"websocket.?closed\",\n\t\"websocket.?error\",\n\n\t// Premature stream endings from SDKs and transports. Anthropic can throw\n\t// \"stream ended without ...\" and \"Anthropic stream ended before message_stop\"\n\t// (#4433); Bedrock/Smithy can throw an HTTP/2 no-response error (#3594).\n\t\"ended without\",\n\t\"stream ended before message_stop\",\n\t\"stream ended before a terminal response event\",\n\t\"http2 request did not get a response\",\n\n\t// Provider-requested retry delay cap failures should flow through the outer\n\t// retry policy so callers can surface/abort the backoff (#1123).\n\t\"retry delay\",\n\n\t// Explicit retry guidance emitted mid-stream by OpenAI Responses and Bedrock\n\t// stream exceptions (#6019).\n\t\"you can retry your request\",\n\t\"try your request again\",\n\t\"please retry your request\",\n\n\t// gRPC based providers (e.g. NVIDIA NIM)\n\t\"ResourceExhausted\",\n]);\n\n/**\n * Classifies whether a failed assistant message looks like a transient provider\n * or transport error, so callers can decide if the last assistant turn should be\n * restarted.\n *\n * This does not implement retry policy. Callers should first handle context\n * overflow separately, then apply their own retry budget, backoff, and reporting\n * before restarting the assistant turn.\n */\nexport function isRetryableAssistantError(message: AssistantMessage): boolean {\n\tif (\n\t\tmessage.stopReason !== \"error\" ||\n\t\tmessage.stopDetails?.type === \"refusal\" ||\n\t\tmessage.stopDetails?.type === \"sensitive\" ||\n\t\t!message.errorMessage\n\t) {\n\t\treturn false;\n\t}\n\tconst errorMessage = message.errorMessage;\n\tif (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage)) return false;\n\treturn RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { AssistantMessage } from "../types.ts";
2
+ /** Returns true when an assistant error was classified as a refusal or sensitive stop. */
3
+ export declare function isClassifierRefusal(message: AssistantMessage): boolean;
4
+ //# sourceMappingURL=stop-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-details.d.ts","sourceRoot":"","sources":["../../src/utils/stop-details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAKtE"}
@@ -0,0 +1,6 @@
1
+ /** Returns true when an assistant error was classified as a refusal or sensitive stop. */
2
+ export function isClassifierRefusal(message) {
3
+ return (message.stopReason === "error" &&
4
+ (message.stopDetails?.type === "refusal" || message.stopDetails?.type === "sensitive"));
5
+ }
6
+ //# sourceMappingURL=stop-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-details.js","sourceRoot":"","sources":["../../src/utils/stop-details.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,OAAyB;IAC5D,OAAO,CACN,OAAO,CAAC,UAAU,KAAK,OAAO;QAC9B,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,WAAW,CAAC,CACtF,CAAC;AACH,CAAC","sourcesContent":["import type { AssistantMessage } from \"../types.ts\";\n\n/** Returns true when an assistant error was classified as a refusal or sensitive stop. */\nexport function isClassifierRefusal(message: AssistantMessage): boolean {\n\treturn (\n\t\tmessage.stopReason === \"error\" &&\n\t\t(message.stopDetails?.type === \"refusal\" || message.stopDetails?.type === \"sensitive\")\n\t);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-ai",
3
3
  "private": true,
4
- "version": "2026.7.17-5",
4
+ "version": "2026.7.20-2",
5
5
  "description": "Unified LLM API with automatic model discovery and provider configuration",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -53,7 +53,7 @@
53
53
  "generate-models": "tsx scripts/generate-models.ts",
54
54
  "generate-model-catalog": "tsx scripts/generate-models.ts --strict --json-only --json-output ../../.artifacts/model-catalog",
55
55
  "generate-image-models": "tsx scripts/generate-image-models.ts",
56
- "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js",
56
+ "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && shx rm -rf dist/providers/data && shx cp -r src/providers/data dist/providers/data",
57
57
  "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
58
58
  "dev:tsc": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
59
59
  "test": "vitest --run",
@@ -3,5 +3,5 @@ export declare const DEFAULT_SIGNAL: TerminalSessionSignal;
3
3
  export declare function sessionIdPrefix(command: string): string;
4
4
  export declare function isTerminalSessionExited(session: SessionRegistrySession): boolean;
5
5
  export declare function stopTerminalSession(session: SessionRegistrySession): Promise<void>;
6
- export declare function waitForTerminalSessionExit(session: SessionRegistrySession): Promise<boolean>;
6
+ export declare function waitForTerminalSessionExit(session: SessionRegistrySession, graceMs?: number): Promise<boolean>;
7
7
  //# sourceMappingURL=registry-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-session.d.ts","sourceRoot":"","sources":["../src/registry-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGzF,eAAO,MAAM,cAAc,EAAE,qBAAiC,CAAC;AAE/D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAOhF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlG"}
1
+ {"version":3,"file":"registry-session.d.ts","sourceRoot":"","sources":["../src/registry-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGzF,eAAO,MAAM,cAAc,EAAE,qBAAiC,CAAC;AAE/D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAOhF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BpH"}
@@ -39,16 +39,35 @@ export async function stopTerminalSession(session) {
39
39
  if (session.signal)
40
40
  await session.signal(DEFAULT_SIGNAL);
41
41
  }
42
- export async function waitForTerminalSessionExit(session) {
42
+ export async function waitForTerminalSessionExit(session, graceMs) {
43
43
  if (isTerminalSessionExited(session))
44
44
  return true;
45
45
  // Invoke via the session object (not a detached reference) so `this` is preserved.
46
- if (session.waitExit)
47
- await session.waitExit();
48
- else if (session.wait)
49
- await session.wait();
50
- else
46
+ const wait = session.waitExit ? session.waitExit() : session.wait ? session.wait() : null;
47
+ if (wait === null)
51
48
  return false;
49
+ if (graceMs === undefined) {
50
+ await wait;
51
+ return isTerminalSessionExited(session);
52
+ }
53
+ let graceTimer;
54
+ try {
55
+ const exitSettled = await Promise.race([
56
+ Promise.resolve(wait).then(() => true),
57
+ new Promise((resolve) => {
58
+ graceTimer = setTimeout(() => resolve(false), graceMs);
59
+ }),
60
+ ]);
61
+ if (!exitSettled) {
62
+ // The wait may still settle (or reject) long after we stopped caring.
63
+ void Promise.resolve(wait).catch(() => { });
64
+ return false;
65
+ }
66
+ }
67
+ finally {
68
+ if (graceTimer)
69
+ clearTimeout(graceTimer);
70
+ }
52
71
  return isTerminalSessionExited(session);
53
72
  }
54
73
  //# sourceMappingURL=registry-session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-session.js","sourceRoot":"","sources":["../src/registry-session.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,CAAC,MAAM,cAAc,GAA0B,SAAS,CAAC;AAE/D,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC;IAC5D,iFAAiF;IACjF,mFAAmF;IACnF,gFAAgF;IAChF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,UAAU;SACvB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,MAAM,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;IACnE,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5G,OAAO,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA+B;IACxE,qEAAqE;IACrE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO;IACR,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,OAAO;IACR,CAAC;IACD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAA+B;IAC/E,IAAI,uBAAuB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,mFAAmF;IACnF,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;SAC1C,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;;QACvC,OAAO,KAAK,CAAC;IAClB,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import type { SessionRegistrySession, TerminalSessionSignal } from \"./registry-types.ts\";\n\nconst DEFAULT_COMMAND = \"bash\";\nexport const DEFAULT_SIGNAL: TerminalSessionSignal = \"SIGTERM\";\n\nexport function sessionIdPrefix(command: string): string {\n\tconst parts = command.split(/[\\\\/]/).filter(Boolean);\n\tconst baseName = parts[parts.length - 1] ?? DEFAULT_COMMAND;\n\t// Strip a Windows executable extension first so `bash.exe` collapses to the same\n\t// `bash` prefix as POSIX `/bin/bash`; otherwise the `.exe` sanitizes to `_exe` and\n\t// session ids become `bash_exe_1`, breaking the cross-platform `bash_N` scheme.\n\tconst withoutExt = baseName.replace(/\\.(?:exe|com|bat|cmd|ps1)$/i, \"\");\n\tconst prefix = withoutExt\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\");\n\treturn prefix || \"session\";\n}\n\nexport function isTerminalSessionExited(session: SessionRegistrySession): boolean {\n\tif (session.exited === true) return true;\n\tif (typeof session.isExited === \"boolean\") return session.isExited;\n\tif (typeof session.isExited === \"function\" && session.isExited()) return true;\n\tif (session.exitState?.status === \"exited\") return true;\n\tif (session.status === \"exited\" || session.status === \"closed\" || session.status === \"stopped\") return true;\n\treturn session.exitResult !== undefined && session.exitResult !== null;\n}\n\nexport async function stopTerminalSession(session: SessionRegistrySession): Promise<void> {\n\t// Call through `session` so class methods keep their `this` binding.\n\tif (session.stop) {\n\t\tawait session.stop();\n\t\treturn;\n\t}\n\tif (session.kill) {\n\t\tawait session.kill(DEFAULT_SIGNAL);\n\t\treturn;\n\t}\n\tif (session.signal) await session.signal(DEFAULT_SIGNAL);\n}\n\nexport async function waitForTerminalSessionExit(session: SessionRegistrySession): Promise<boolean> {\n\tif (isTerminalSessionExited(session)) return true;\n\t// Invoke via the session object (not a detached reference) so `this` is preserved.\n\tif (session.waitExit) await session.waitExit();\n\telse if (session.wait) await session.wait();\n\telse return false;\n\treturn isTerminalSessionExited(session);\n}\n"]}
1
+ {"version":3,"file":"registry-session.js","sourceRoot":"","sources":["../src/registry-session.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionRegistrySession, TerminalSessionSignal } from \"./registry-types.ts\";\n\nconst DEFAULT_COMMAND = \"bash\";\nexport const DEFAULT_SIGNAL: TerminalSessionSignal = \"SIGTERM\";\n\nexport function sessionIdPrefix(command: string): string {\n\tconst parts = command.split(/[\\\\/]/).filter(Boolean);\n\tconst baseName = parts[parts.length - 1] ?? DEFAULT_COMMAND;\n\t// Strip a Windows executable extension first so `bash.exe` collapses to the same\n\t// `bash` prefix as POSIX `/bin/bash`; otherwise the `.exe` sanitizes to `_exe` and\n\t// session ids become `bash_exe_1`, breaking the cross-platform `bash_N` scheme.\n\tconst withoutExt = baseName.replace(/\\.(?:exe|com|bat|cmd|ps1)$/i, \"\");\n\tconst prefix = withoutExt\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"_\")\n\t\t.replace(/^_+|_+$/g, \"\");\n\treturn prefix || \"session\";\n}\n\nexport function isTerminalSessionExited(session: SessionRegistrySession): boolean {\n\tif (session.exited === true) return true;\n\tif (typeof session.isExited === \"boolean\") return session.isExited;\n\tif (typeof session.isExited === \"function\" && session.isExited()) return true;\n\tif (session.exitState?.status === \"exited\") return true;\n\tif (session.status === \"exited\" || session.status === \"closed\" || session.status === \"stopped\") return true;\n\treturn session.exitResult !== undefined && session.exitResult !== null;\n}\n\nexport async function stopTerminalSession(session: SessionRegistrySession): Promise<void> {\n\t// Call through `session` so class methods keep their `this` binding.\n\tif (session.stop) {\n\t\tawait session.stop();\n\t\treturn;\n\t}\n\tif (session.kill) {\n\t\tawait session.kill(DEFAULT_SIGNAL);\n\t\treturn;\n\t}\n\tif (session.signal) await session.signal(DEFAULT_SIGNAL);\n}\n\nexport async function waitForTerminalSessionExit(session: SessionRegistrySession, graceMs?: number): Promise<boolean> {\n\tif (isTerminalSessionExited(session)) return true;\n\t// Invoke via the session object (not a detached reference) so `this` is preserved.\n\tconst wait = session.waitExit ? session.waitExit() : session.wait ? session.wait() : null;\n\tif (wait === null) return false;\n\tif (graceMs === undefined) {\n\t\tawait wait;\n\t\treturn isTerminalSessionExited(session);\n\t}\n\tlet graceTimer: ReturnType<typeof setTimeout> | undefined;\n\ttry {\n\t\tconst exitSettled = await Promise.race([\n\t\t\tPromise.resolve(wait).then(() => true),\n\t\t\tnew Promise<false>((resolve) => {\n\t\t\t\tgraceTimer = setTimeout(() => resolve(false), graceMs);\n\t\t\t}),\n\t\t]);\n\t\tif (!exitSettled) {\n\t\t\t// The wait may still settle (or reject) long after we stopped caring.\n\t\t\tvoid Promise.resolve(wait).catch(() => {});\n\t\t\treturn false;\n\t\t}\n\t} finally {\n\t\tif (graceTimer) clearTimeout(graceTimer);\n\t}\n\treturn isTerminalSessionExited(session);\n}\n"]}
@@ -67,6 +67,12 @@ export interface SessionRegistryOptions<TSession extends SessionRegistrySession
67
67
  readonly killProcess?: (target: number, signal: TerminalSessionSignal) => void;
68
68
  readonly now?: () => number;
69
69
  readonly platform?: string;
70
+ /**
71
+ * How long `stop()` waits for a killed session to report exit before marking
72
+ * it `stopping` and returning. Guards against sessions whose exit never
73
+ * settles (e.g. a surviving descendant holding the PTY open). Default 5s.
74
+ */
75
+ readonly stopExitGraceMs?: number;
70
76
  }
71
77
  export type StoredSessionRegistryEntry<TSession extends SessionRegistrySession> = {
72
78
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"registry-types.d.ts","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry-types.d.ts","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry-types.js","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":"AA0FA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAItD,YAAY,WAAmB;QAC9B,KAAK,CAAC,uCAAuC,WAAW,2BAA2B,CAAC,CAAC;QAJ7E,SAAI,GAAG,2BAA2B,CAAC;QAK3C,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;CACD","sourcesContent":["export type TerminalSessionState = \"live\" | \"stopping\" | \"exited\";\nexport type TerminalSessionSignal = NodeJS.Signals;\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface TrackedDetachedChild {\n\treadonly pid?: number;\n\treadonly processGroupId?: number;\n\treadonly exited?: boolean | (() => boolean);\n\treadonly kill?: (signal?: TerminalSessionSignal) => MaybePromise<unknown>;\n}\n\nexport interface SessionRegistrySession {\n\treadonly command?: string;\n\treadonly exited?: boolean;\n\treadonly isExited?: boolean | (() => boolean);\n\treadonly exitResult?: unknown;\n\treadonly exitState?: { readonly status?: string };\n\treadonly status?: string;\n\treadonly trackedDetachedChildren?: readonly TrackedDetachedChild[];\n\treadonly getTrackedDetachedChildren?: () => readonly TrackedDetachedChild[];\n\treadonly onExit?: (handler: () => void) => (() => void) | undefined;\n\treadonly stop?: () => MaybePromise<unknown>;\n\treadonly kill?: (signal?: TerminalSessionSignal) => MaybePromise<unknown>;\n\treadonly signal?: (signal: TerminalSessionSignal) => MaybePromise<unknown>;\n\treadonly waitExit?: () => Promise<unknown>;\n\treadonly wait?: () => Promise<unknown>;\n}\n\nexport interface SessionRegistryCreateOptions<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly command?: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly session?: TSession;\n}\n\nexport interface SessionRegistryCreateContext {\n\treadonly id: string;\n\treadonly command: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n}\n\nexport interface InitialSessionRegistryEntry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly id: string;\n\treadonly session: TSession;\n\treadonly command?: string;\n}\n\nexport interface SessionRegistryEntry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly id: string;\n\treadonly command: string;\n\treadonly session: TSession;\n\treadonly createdAt: number;\n\treadonly lastUsedAt: number;\n\treadonly state: TerminalSessionState;\n\treadonly exitedAt: number | null;\n}\n\nexport interface SessionRegistrySweepOptions {\n\treadonly remove?: boolean;\n}\n\nexport interface SessionRegistryOptions<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly maxSessions?: number;\n\treadonly initialSessions?: readonly InitialSessionRegistryEntry<TSession>[];\n\treadonly createSession?: (options: SessionRegistryCreateContext) => MaybePromise<TSession>;\n\treadonly killProcess?: (target: number, signal: TerminalSessionSignal) => void;\n\treadonly now?: () => number;\n\treadonly platform?: string;\n}\n\nexport type StoredSessionRegistryEntry<TSession extends SessionRegistrySession> = {\n\tid: string;\n\tcommand: string;\n\tsession: TSession;\n\tcreatedAt: number;\n\tlastUsedAt: number;\n\tstate: TerminalSessionState;\n\texitedAt: number | null;\n\tunsubscribeExit: (() => void) | null;\n\tstopPromise: Promise<boolean> | null;\n\tdetachedCleanupPromise: Promise<void> | null;\n};\n\nexport class SessionRegistryCapacityError extends Error {\n\treadonly code = \"session_registry_capacity\";\n\treadonly maxSessions: number;\n\n\tconstructor(maxSessions: number) {\n\t\tsuper(`Cannot create terminal session: all ${maxSessions} registry slots are live.`);\n\t\tthis.name = \"SessionRegistryCapacityError\";\n\t\tthis.maxSessions = maxSessions;\n\t}\n}\n"]}
1
+ {"version":3,"file":"registry-types.js","sourceRoot":"","sources":["../src/registry-types.ts"],"names":[],"mappings":"AAgGA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAItD,YAAY,WAAmB;QAC9B,KAAK,CAAC,uCAAuC,WAAW,2BAA2B,CAAC,CAAC;QAJ7E,SAAI,GAAG,2BAA2B,CAAC;QAK3C,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;CACD","sourcesContent":["export type TerminalSessionState = \"live\" | \"stopping\" | \"exited\";\nexport type TerminalSessionSignal = NodeJS.Signals;\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface TrackedDetachedChild {\n\treadonly pid?: number;\n\treadonly processGroupId?: number;\n\treadonly exited?: boolean | (() => boolean);\n\treadonly kill?: (signal?: TerminalSessionSignal) => MaybePromise<unknown>;\n}\n\nexport interface SessionRegistrySession {\n\treadonly command?: string;\n\treadonly exited?: boolean;\n\treadonly isExited?: boolean | (() => boolean);\n\treadonly exitResult?: unknown;\n\treadonly exitState?: { readonly status?: string };\n\treadonly status?: string;\n\treadonly trackedDetachedChildren?: readonly TrackedDetachedChild[];\n\treadonly getTrackedDetachedChildren?: () => readonly TrackedDetachedChild[];\n\treadonly onExit?: (handler: () => void) => (() => void) | undefined;\n\treadonly stop?: () => MaybePromise<unknown>;\n\treadonly kill?: (signal?: TerminalSessionSignal) => MaybePromise<unknown>;\n\treadonly signal?: (signal: TerminalSessionSignal) => MaybePromise<unknown>;\n\treadonly waitExit?: () => Promise<unknown>;\n\treadonly wait?: () => Promise<unknown>;\n}\n\nexport interface SessionRegistryCreateOptions<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly command?: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly session?: TSession;\n}\n\nexport interface SessionRegistryCreateContext {\n\treadonly id: string;\n\treadonly command: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n}\n\nexport interface InitialSessionRegistryEntry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly id: string;\n\treadonly session: TSession;\n\treadonly command?: string;\n}\n\nexport interface SessionRegistryEntry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly id: string;\n\treadonly command: string;\n\treadonly session: TSession;\n\treadonly createdAt: number;\n\treadonly lastUsedAt: number;\n\treadonly state: TerminalSessionState;\n\treadonly exitedAt: number | null;\n}\n\nexport interface SessionRegistrySweepOptions {\n\treadonly remove?: boolean;\n}\n\nexport interface SessionRegistryOptions<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\treadonly maxSessions?: number;\n\treadonly initialSessions?: readonly InitialSessionRegistryEntry<TSession>[];\n\treadonly createSession?: (options: SessionRegistryCreateContext) => MaybePromise<TSession>;\n\treadonly killProcess?: (target: number, signal: TerminalSessionSignal) => void;\n\treadonly now?: () => number;\n\treadonly platform?: string;\n\t/**\n\t * How long `stop()` waits for a killed session to report exit before marking\n\t * it `stopping` and returning. Guards against sessions whose exit never\n\t * settles (e.g. a surviving descendant holding the PTY open). Default 5s.\n\t */\n\treadonly stopExitGraceMs?: number;\n}\n\nexport type StoredSessionRegistryEntry<TSession extends SessionRegistrySession> = {\n\tid: string;\n\tcommand: string;\n\tsession: TSession;\n\tcreatedAt: number;\n\tlastUsedAt: number;\n\tstate: TerminalSessionState;\n\texitedAt: number | null;\n\tunsubscribeExit: (() => void) | null;\n\tstopPromise: Promise<boolean> | null;\n\tdetachedCleanupPromise: Promise<void> | null;\n};\n\nexport class SessionRegistryCapacityError extends Error {\n\treadonly code = \"session_registry_capacity\";\n\treadonly maxSessions: number;\n\n\tconstructor(maxSessions: number) {\n\t\tsuper(`Cannot create terminal session: all ${maxSessions} registry slots are live.`);\n\t\tthis.name = \"SessionRegistryCapacityError\";\n\t\tthis.maxSessions = maxSessions;\n\t}\n}\n"]}
@@ -11,6 +11,7 @@ export declare class SessionRegistry<TSession extends SessionRegistrySession = S
11
11
  private readonly platform;
12
12
  private sequence;
13
13
  readonly maxSessions: number;
14
+ private readonly stopExitGraceMs;
14
15
  constructor(options?: SessionRegistryOptions<TSession>);
15
16
  get size(): number;
16
17
  list(): readonly SessionRegistryEntry<TSession>[];
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGX,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAG3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EACX,2BAA2B,EAC3B,YAAY,EACZ,4BAA4B,EAC5B,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAOnE,qBAAa,eAAe,CAAC,QAAQ,SAAS,sBAAsB,GAAG,sBAAsB;IAC5F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6E;IAC3G,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0D;IACtF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,YAAY,OAAO,GAAE,sBAAsB,CAAC,QAAQ,CAAM,EAWzD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,SAAS,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAGhD;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAMrD;IAEK,MAAM,CAAC,OAAO,GAAE,4BAA4B,CAAC,QAAQ,CAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAgB1G;IAEK,WAAW,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAUvF;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMvC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAG9B;YAEa,wBAAwB;IAOtC,OAAO,CAAC,QAAQ;YAwBF,iBAAiB;YAOjB,wBAAwB;YAMxB,sBAAsB;IASpC,OAAO,CAAC,2BAA2B;YAUrB,SAAS;YAeT,uBAAuB;YAMvB,2BAA2B;IAIzC,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,SAAS;CAIjB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGX,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAG3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EACX,2BAA2B,EAC3B,YAAY,EACZ,4BAA4B,EAC5B,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AASnE,qBAAa,eAAe,CAAC,QAAQ,SAAS,sBAAsB,GAAG,sBAAsB;IAC5F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6E;IAC3G,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0D;IACtF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,OAAO,GAAE,sBAAsB,CAAC,QAAQ,CAAM,EAiBzD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,SAAS,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAGhD;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAMrD;IAEK,MAAM,CAAC,OAAO,GAAE,4BAA4B,CAAC,QAAQ,CAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAgB1G;IAEK,WAAW,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAUvF;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMvC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAG9B;YAEa,wBAAwB;IAOtC,OAAO,CAAC,QAAQ;YAwBF,iBAAiB;YAOjB,wBAAwB;YAMxB,sBAAsB;IASpC,OAAO,CAAC,2BAA2B;YAUrB,SAAS;YAeT,uBAAuB;YAMvB,2BAA2B;IAIzC,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,SAAS;CAIjB"}
@@ -5,12 +5,20 @@ export { SessionRegistryCapacityError } from "./registry-types.js";
5
5
  import { SessionRegistryCapacityError } from "./registry-types.js";
6
6
  const DEFAULT_MAX_SESSIONS = 32;
7
7
  const DEFAULT_COMMAND = "bash";
8
+ const DEFAULT_STOP_EXIT_GRACE_MS = 5000;
9
+ const MAX_STOP_EXIT_GRACE_MS = 2_147_483_647;
8
10
  export class SessionRegistry {
9
11
  constructor(options = {}) {
10
12
  this.entries = new Map();
11
13
  this.idCounters = new Map();
12
14
  this.sequence = 0;
13
15
  this.maxSessions = normalizeMaxSessions(options.maxSessions);
16
+ this.stopExitGraceMs =
17
+ options.stopExitGraceMs !== undefined &&
18
+ Number.isFinite(options.stopExitGraceMs) &&
19
+ options.stopExitGraceMs > 0
20
+ ? Math.min(options.stopExitGraceMs, MAX_STOP_EXIT_GRACE_MS)
21
+ : DEFAULT_STOP_EXIT_GRACE_MS;
14
22
  this.createSession = options.createSession ?? null;
15
23
  this.killProcess = options.killProcess ?? defaultKillProcess;
16
24
  this.now = options.now ?? Date.now;
@@ -149,7 +157,7 @@ export class SessionRegistry {
149
157
  await this.cleanupDetachedChildren(entry);
150
158
  if (entry.state !== "exited") {
151
159
  await stopTerminalSession(entry.session);
152
- if (await waitForTerminalSessionExit(entry.session)) {
160
+ if (await waitForTerminalSessionExit(entry.session, this.stopExitGraceMs)) {
153
161
  this.markExited(entry);
154
162
  }
155
163
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { cleanupDetachedChildren, defaultKillProcess, getRuntimePlatform } from \"./registry-detached.ts\";\nimport {\n\tisTerminalSessionExited,\n\tsessionIdPrefix,\n\tstopTerminalSession,\n\twaitForTerminalSessionExit,\n} from \"./registry-session.ts\";\nimport type {\n\tMaybePromise,\n\tSessionRegistryCreateContext,\n\tSessionRegistryCreateOptions,\n\tSessionRegistryEntry,\n\tSessionRegistryOptions,\n\tSessionRegistrySession,\n\tSessionRegistrySweepOptions,\n\tStoredSessionRegistryEntry,\n\tTerminalSessionSignal,\n} from \"./registry-types.ts\";\n\nexport { isTerminalSessionExited, sessionIdPrefix } from \"./registry-session.ts\";\nexport type {\n\tInitialSessionRegistryEntry,\n\tMaybePromise,\n\tSessionRegistryCreateContext,\n\tSessionRegistryCreateOptions,\n\tSessionRegistryEntry,\n\tSessionRegistryOptions,\n\tSessionRegistrySession,\n\tSessionRegistrySweepOptions,\n\tTerminalSessionSignal,\n\tTerminalSessionState,\n\tTrackedDetachedChild,\n} from \"./registry-types.ts\";\nexport { SessionRegistryCapacityError } from \"./registry-types.ts\";\n\nimport { SessionRegistryCapacityError } from \"./registry-types.ts\";\n\nconst DEFAULT_MAX_SESSIONS = 32;\nconst DEFAULT_COMMAND = \"bash\";\n\nexport class SessionRegistry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\tprivate readonly entries = new Map<string, StoredSessionRegistryEntry<TSession>>();\n\tprivate readonly idCounters = new Map<string, number>();\n\tprivate readonly createSession: ((options: SessionRegistryCreateContext) => MaybePromise<TSession>) | null;\n\tprivate readonly killProcess: (target: number, signal: TerminalSessionSignal) => void;\n\tprivate readonly now: () => number;\n\tprivate readonly platform: string;\n\tprivate sequence = 0;\n\treadonly maxSessions: number;\n\n\tconstructor(options: SessionRegistryOptions<TSession> = {}) {\n\t\tthis.maxSessions = normalizeMaxSessions(options.maxSessions);\n\t\tthis.createSession = options.createSession ?? null;\n\t\tthis.killProcess = options.killProcess ?? defaultKillProcess;\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.platform = options.platform ?? getRuntimePlatform();\n\n\t\tfor (const initial of options.initialSessions ?? []) {\n\t\t\tthis.addEntry(initial.id, initial.session, initial.command ?? initial.session.command ?? DEFAULT_COMMAND);\n\t\t}\n\t\tvoid this.sweepExited();\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tlist(): readonly SessionRegistryEntry<TSession>[] {\n\t\tthis.refreshExitedStates();\n\t\treturn [...this.entries.values()].sort((left, right) => left.createdAt - right.createdAt);\n\t}\n\n\tget(id: string): SessionRegistryEntry<TSession> | null {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return null;\n\t\tentry.lastUsedAt = this.timestamp();\n\t\tthis.refreshEntryState(entry);\n\t\treturn entry;\n\t}\n\n\tasync create(options: SessionRegistryCreateOptions<TSession> = {}): Promise<SessionRegistryEntry<TSession>> {\n\t\tawait this.enforceCapacityForCreate();\n\t\tconst command = options.command ?? options.session?.command ?? DEFAULT_COMMAND;\n\t\tconst id = this.allocateId(command);\n\t\tconst session =\n\t\t\toptions.session ??\n\t\t\t(await this.createSessionWithFactory({\n\t\t\t\tid,\n\t\t\t\tcommand,\n\t\t\t\targs: options.args,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t\tcols: options.cols,\n\t\t\t\trows: options.rows,\n\t\t\t}));\n\t\treturn this.addEntry(id, session, command);\n\t}\n\n\tasync sweepExited(options: SessionRegistrySweepOptions = {}): Promise<readonly string[]> {\n\t\tthis.refreshExitedStates();\n\t\tconst sweptIds: string[] = [];\n\t\tfor (const entry of this.entries.values()) {\n\t\t\tif (entry.state !== \"exited\") continue;\n\t\t\tawait this.cleanupDetachedChildren(entry);\n\t\t\tsweptIds.push(entry.id);\n\t\t\tif (options.remove) this.removeEntry(entry.id);\n\t\t}\n\t\treturn sweptIds;\n\t}\n\n\tasync stop(id: string): Promise<boolean> {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return false;\n\t\tif (entry.stopPromise) return entry.stopPromise;\n\t\tentry.stopPromise = this.stopEntry(entry);\n\t\treturn entry.stopPromise;\n\t}\n\n\tasync stopAll(): Promise<void> {\n\t\tawait Promise.all([...this.entries.keys()].map((id) => this.stop(id)));\n\t}\n\n\tasync teardown(): Promise<void> {\n\t\tawait this.stopAll();\n\t\tfor (const id of [...this.entries.keys()]) this.removeEntry(id);\n\t}\n\n\tprivate async createSessionWithFactory(options: SessionRegistryCreateContext): Promise<TSession> {\n\t\tif (!this.createSession) {\n\t\t\tthrow new Error(\"Cannot create terminal session: SessionRegistry requires a createSession factory.\");\n\t\t}\n\t\treturn this.createSession(options);\n\t}\n\n\tprivate addEntry(id: string, session: TSession, command: string): SessionRegistryEntry<TSession> {\n\t\tconst timestamp = this.timestamp();\n\t\tconst exited = isTerminalSessionExited(session);\n\t\tconst entry: StoredSessionRegistryEntry<TSession> = {\n\t\t\tid,\n\t\t\tcommand,\n\t\t\tsession,\n\t\t\tcreatedAt: timestamp,\n\t\t\tlastUsedAt: timestamp,\n\t\t\tstate: exited ? \"exited\" : \"live\",\n\t\t\texitedAt: exited ? timestamp : null,\n\t\t\tunsubscribeExit: null,\n\t\t\tstopPromise: null,\n\t\t\tdetachedCleanupPromise: null,\n\t\t};\n\t\tentry.unsubscribeExit =\n\t\t\tsession.onExit?.(() => {\n\t\t\t\tvoid this.handleSessionExit(id);\n\t\t\t}) ?? null;\n\t\tthis.entries.set(id, entry);\n\t\tthis.observeId(id);\n\t\treturn entry;\n\t}\n\n\tprivate async handleSessionExit(id: string): Promise<void> {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return;\n\t\tthis.markExited(entry);\n\t\tawait this.cleanupDetachedChildren(entry);\n\t}\n\n\tprivate async enforceCapacityForCreate(): Promise<void> {\n\t\tthis.refreshExitedStates();\n\t\tawait this.pruneExitedUntilAtMost(this.maxSessions - 1);\n\t\tif (this.entries.size >= this.maxSessions) throw new SessionRegistryCapacityError(this.maxSessions);\n\t}\n\n\tprivate async pruneExitedUntilAtMost(maxSize: number): Promise<void> {\n\t\twhile (this.entries.size > maxSize) {\n\t\t\tconst entry = this.findLeastRecentlyUsedExited();\n\t\t\tif (!entry) return;\n\t\t\tawait this.cleanupDetachedChildren(entry);\n\t\t\tthis.removeEntry(entry.id);\n\t\t}\n\t}\n\n\tprivate findLeastRecentlyUsedExited(): StoredSessionRegistryEntry<TSession> | null {\n\t\tlet selected: StoredSessionRegistryEntry<TSession> | null = null;\n\t\tfor (const entry of this.entries.values()) {\n\t\t\tif (entry.state !== \"exited\") continue;\n\t\t\tif (!selected || entry.lastUsedAt < selected.lastUsedAt) selected = entry;\n\t\t\telse if (selected.lastUsedAt === entry.lastUsedAt && entry.createdAt < selected.createdAt) selected = entry;\n\t\t}\n\t\treturn selected;\n\t}\n\n\tprivate async stopEntry(entry: StoredSessionRegistryEntry<TSession>): Promise<boolean> {\n\t\tthis.refreshEntryState(entry);\n\t\tawait this.cleanupDetachedChildren(entry);\n\t\tif (entry.state !== \"exited\") {\n\t\t\tawait stopTerminalSession(entry.session);\n\t\t\tif (await waitForTerminalSessionExit(entry.session)) {\n\t\t\t\tthis.markExited(entry);\n\t\t\t} else {\n\t\t\t\tentry.state = \"stopping\";\n\t\t\t\tentry.exitedAt = null;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate async cleanupDetachedChildren(entry: StoredSessionRegistryEntry<TSession>): Promise<void> {\n\t\tif (entry.detachedCleanupPromise) return entry.detachedCleanupPromise;\n\t\tentry.detachedCleanupPromise = this.cleanupDetachedChildrenOnce(entry.session);\n\t\treturn entry.detachedCleanupPromise;\n\t}\n\n\tprivate async cleanupDetachedChildrenOnce(session: TSession): Promise<void> {\n\t\tawait cleanupDetachedChildren(session, this.platform, this.killProcess);\n\t}\n\n\tprivate refreshExitedStates(): void {\n\t\tfor (const entry of this.entries.values()) this.refreshEntryState(entry);\n\t}\n\n\tprivate refreshEntryState(entry: StoredSessionRegistryEntry<TSession>): void {\n\t\tif (entry.state === \"exited\") return;\n\t\tif (isTerminalSessionExited(entry.session)) this.markExited(entry);\n\t}\n\n\tprivate markExited(entry: StoredSessionRegistryEntry<TSession>): void {\n\t\tif (entry.state === \"exited\") return;\n\t\tentry.state = \"exited\";\n\t\tentry.exitedAt = this.timestamp();\n\t}\n\n\tprivate removeEntry(id: string): void {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return;\n\t\tentry.unsubscribeExit?.();\n\t\tthis.entries.delete(id);\n\t}\n\n\tprivate allocateId(command: string): string {\n\t\tconst prefix = sessionIdPrefix(command);\n\t\tlet next = (this.idCounters.get(prefix) ?? 0) + 1;\n\t\twhile (this.entries.has(`${prefix}_${next}`)) next += 1;\n\t\tthis.idCounters.set(prefix, next);\n\t\treturn `${prefix}_${next}`;\n\t}\n\n\tprivate observeId(id: string): void {\n\t\tconst match = /^(.*)_(\\d+)$/.exec(id);\n\t\tif (!match) return;\n\t\tconst prefix = match[1];\n\t\tconst value = Number.parseInt(match[2] ?? \"\", 10);\n\t\tif (!prefix || !Number.isFinite(value)) return;\n\t\tthis.idCounters.set(prefix, Math.max(this.idCounters.get(prefix) ?? 0, value));\n\t}\n\n\tprivate timestamp(): number {\n\t\tthis.sequence += 1;\n\t\treturn this.now() * 1000 + this.sequence;\n\t}\n}\n\nfunction normalizeMaxSessions(value: number | undefined): number {\n\tif (value === undefined) return DEFAULT_MAX_SESSIONS;\n\tif (!Number.isFinite(value) || value < 1) throw new Error(\"maxSessions must be a positive finite number.\");\n\treturn Math.trunc(value);\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { cleanupDetachedChildren, defaultKillProcess, getRuntimePlatform } from \"./registry-detached.ts\";\nimport {\n\tisTerminalSessionExited,\n\tsessionIdPrefix,\n\tstopTerminalSession,\n\twaitForTerminalSessionExit,\n} from \"./registry-session.ts\";\nimport type {\n\tMaybePromise,\n\tSessionRegistryCreateContext,\n\tSessionRegistryCreateOptions,\n\tSessionRegistryEntry,\n\tSessionRegistryOptions,\n\tSessionRegistrySession,\n\tSessionRegistrySweepOptions,\n\tStoredSessionRegistryEntry,\n\tTerminalSessionSignal,\n} from \"./registry-types.ts\";\n\nexport { isTerminalSessionExited, sessionIdPrefix } from \"./registry-session.ts\";\nexport type {\n\tInitialSessionRegistryEntry,\n\tMaybePromise,\n\tSessionRegistryCreateContext,\n\tSessionRegistryCreateOptions,\n\tSessionRegistryEntry,\n\tSessionRegistryOptions,\n\tSessionRegistrySession,\n\tSessionRegistrySweepOptions,\n\tTerminalSessionSignal,\n\tTerminalSessionState,\n\tTrackedDetachedChild,\n} from \"./registry-types.ts\";\nexport { SessionRegistryCapacityError } from \"./registry-types.ts\";\n\nimport { SessionRegistryCapacityError } from \"./registry-types.ts\";\n\nconst DEFAULT_MAX_SESSIONS = 32;\nconst DEFAULT_COMMAND = \"bash\";\nconst DEFAULT_STOP_EXIT_GRACE_MS = 5000;\nconst MAX_STOP_EXIT_GRACE_MS = 2_147_483_647;\n\nexport class SessionRegistry<TSession extends SessionRegistrySession = SessionRegistrySession> {\n\tprivate readonly entries = new Map<string, StoredSessionRegistryEntry<TSession>>();\n\tprivate readonly idCounters = new Map<string, number>();\n\tprivate readonly createSession: ((options: SessionRegistryCreateContext) => MaybePromise<TSession>) | null;\n\tprivate readonly killProcess: (target: number, signal: TerminalSessionSignal) => void;\n\tprivate readonly now: () => number;\n\tprivate readonly platform: string;\n\tprivate sequence = 0;\n\treadonly maxSessions: number;\n\tprivate readonly stopExitGraceMs: number;\n\n\tconstructor(options: SessionRegistryOptions<TSession> = {}) {\n\t\tthis.maxSessions = normalizeMaxSessions(options.maxSessions);\n\t\tthis.stopExitGraceMs =\n\t\t\toptions.stopExitGraceMs !== undefined &&\n\t\t\tNumber.isFinite(options.stopExitGraceMs) &&\n\t\t\toptions.stopExitGraceMs > 0\n\t\t\t\t? Math.min(options.stopExitGraceMs, MAX_STOP_EXIT_GRACE_MS)\n\t\t\t\t: DEFAULT_STOP_EXIT_GRACE_MS;\n\t\tthis.createSession = options.createSession ?? null;\n\t\tthis.killProcess = options.killProcess ?? defaultKillProcess;\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.platform = options.platform ?? getRuntimePlatform();\n\n\t\tfor (const initial of options.initialSessions ?? []) {\n\t\t\tthis.addEntry(initial.id, initial.session, initial.command ?? initial.session.command ?? DEFAULT_COMMAND);\n\t\t}\n\t\tvoid this.sweepExited();\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tlist(): readonly SessionRegistryEntry<TSession>[] {\n\t\tthis.refreshExitedStates();\n\t\treturn [...this.entries.values()].sort((left, right) => left.createdAt - right.createdAt);\n\t}\n\n\tget(id: string): SessionRegistryEntry<TSession> | null {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return null;\n\t\tentry.lastUsedAt = this.timestamp();\n\t\tthis.refreshEntryState(entry);\n\t\treturn entry;\n\t}\n\n\tasync create(options: SessionRegistryCreateOptions<TSession> = {}): Promise<SessionRegistryEntry<TSession>> {\n\t\tawait this.enforceCapacityForCreate();\n\t\tconst command = options.command ?? options.session?.command ?? DEFAULT_COMMAND;\n\t\tconst id = this.allocateId(command);\n\t\tconst session =\n\t\t\toptions.session ??\n\t\t\t(await this.createSessionWithFactory({\n\t\t\t\tid,\n\t\t\t\tcommand,\n\t\t\t\targs: options.args,\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t\tcols: options.cols,\n\t\t\t\trows: options.rows,\n\t\t\t}));\n\t\treturn this.addEntry(id, session, command);\n\t}\n\n\tasync sweepExited(options: SessionRegistrySweepOptions = {}): Promise<readonly string[]> {\n\t\tthis.refreshExitedStates();\n\t\tconst sweptIds: string[] = [];\n\t\tfor (const entry of this.entries.values()) {\n\t\t\tif (entry.state !== \"exited\") continue;\n\t\t\tawait this.cleanupDetachedChildren(entry);\n\t\t\tsweptIds.push(entry.id);\n\t\t\tif (options.remove) this.removeEntry(entry.id);\n\t\t}\n\t\treturn sweptIds;\n\t}\n\n\tasync stop(id: string): Promise<boolean> {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return false;\n\t\tif (entry.stopPromise) return entry.stopPromise;\n\t\tentry.stopPromise = this.stopEntry(entry);\n\t\treturn entry.stopPromise;\n\t}\n\n\tasync stopAll(): Promise<void> {\n\t\tawait Promise.all([...this.entries.keys()].map((id) => this.stop(id)));\n\t}\n\n\tasync teardown(): Promise<void> {\n\t\tawait this.stopAll();\n\t\tfor (const id of [...this.entries.keys()]) this.removeEntry(id);\n\t}\n\n\tprivate async createSessionWithFactory(options: SessionRegistryCreateContext): Promise<TSession> {\n\t\tif (!this.createSession) {\n\t\t\tthrow new Error(\"Cannot create terminal session: SessionRegistry requires a createSession factory.\");\n\t\t}\n\t\treturn this.createSession(options);\n\t}\n\n\tprivate addEntry(id: string, session: TSession, command: string): SessionRegistryEntry<TSession> {\n\t\tconst timestamp = this.timestamp();\n\t\tconst exited = isTerminalSessionExited(session);\n\t\tconst entry: StoredSessionRegistryEntry<TSession> = {\n\t\t\tid,\n\t\t\tcommand,\n\t\t\tsession,\n\t\t\tcreatedAt: timestamp,\n\t\t\tlastUsedAt: timestamp,\n\t\t\tstate: exited ? \"exited\" : \"live\",\n\t\t\texitedAt: exited ? timestamp : null,\n\t\t\tunsubscribeExit: null,\n\t\t\tstopPromise: null,\n\t\t\tdetachedCleanupPromise: null,\n\t\t};\n\t\tentry.unsubscribeExit =\n\t\t\tsession.onExit?.(() => {\n\t\t\t\tvoid this.handleSessionExit(id);\n\t\t\t}) ?? null;\n\t\tthis.entries.set(id, entry);\n\t\tthis.observeId(id);\n\t\treturn entry;\n\t}\n\n\tprivate async handleSessionExit(id: string): Promise<void> {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return;\n\t\tthis.markExited(entry);\n\t\tawait this.cleanupDetachedChildren(entry);\n\t}\n\n\tprivate async enforceCapacityForCreate(): Promise<void> {\n\t\tthis.refreshExitedStates();\n\t\tawait this.pruneExitedUntilAtMost(this.maxSessions - 1);\n\t\tif (this.entries.size >= this.maxSessions) throw new SessionRegistryCapacityError(this.maxSessions);\n\t}\n\n\tprivate async pruneExitedUntilAtMost(maxSize: number): Promise<void> {\n\t\twhile (this.entries.size > maxSize) {\n\t\t\tconst entry = this.findLeastRecentlyUsedExited();\n\t\t\tif (!entry) return;\n\t\t\tawait this.cleanupDetachedChildren(entry);\n\t\t\tthis.removeEntry(entry.id);\n\t\t}\n\t}\n\n\tprivate findLeastRecentlyUsedExited(): StoredSessionRegistryEntry<TSession> | null {\n\t\tlet selected: StoredSessionRegistryEntry<TSession> | null = null;\n\t\tfor (const entry of this.entries.values()) {\n\t\t\tif (entry.state !== \"exited\") continue;\n\t\t\tif (!selected || entry.lastUsedAt < selected.lastUsedAt) selected = entry;\n\t\t\telse if (selected.lastUsedAt === entry.lastUsedAt && entry.createdAt < selected.createdAt) selected = entry;\n\t\t}\n\t\treturn selected;\n\t}\n\n\tprivate async stopEntry(entry: StoredSessionRegistryEntry<TSession>): Promise<boolean> {\n\t\tthis.refreshEntryState(entry);\n\t\tawait this.cleanupDetachedChildren(entry);\n\t\tif (entry.state !== \"exited\") {\n\t\t\tawait stopTerminalSession(entry.session);\n\t\t\tif (await waitForTerminalSessionExit(entry.session, this.stopExitGraceMs)) {\n\t\t\t\tthis.markExited(entry);\n\t\t\t} else {\n\t\t\t\tentry.state = \"stopping\";\n\t\t\t\tentry.exitedAt = null;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate async cleanupDetachedChildren(entry: StoredSessionRegistryEntry<TSession>): Promise<void> {\n\t\tif (entry.detachedCleanupPromise) return entry.detachedCleanupPromise;\n\t\tentry.detachedCleanupPromise = this.cleanupDetachedChildrenOnce(entry.session);\n\t\treturn entry.detachedCleanupPromise;\n\t}\n\n\tprivate async cleanupDetachedChildrenOnce(session: TSession): Promise<void> {\n\t\tawait cleanupDetachedChildren(session, this.platform, this.killProcess);\n\t}\n\n\tprivate refreshExitedStates(): void {\n\t\tfor (const entry of this.entries.values()) this.refreshEntryState(entry);\n\t}\n\n\tprivate refreshEntryState(entry: StoredSessionRegistryEntry<TSession>): void {\n\t\tif (entry.state === \"exited\") return;\n\t\tif (isTerminalSessionExited(entry.session)) this.markExited(entry);\n\t}\n\n\tprivate markExited(entry: StoredSessionRegistryEntry<TSession>): void {\n\t\tif (entry.state === \"exited\") return;\n\t\tentry.state = \"exited\";\n\t\tentry.exitedAt = this.timestamp();\n\t}\n\n\tprivate removeEntry(id: string): void {\n\t\tconst entry = this.entries.get(id);\n\t\tif (!entry) return;\n\t\tentry.unsubscribeExit?.();\n\t\tthis.entries.delete(id);\n\t}\n\n\tprivate allocateId(command: string): string {\n\t\tconst prefix = sessionIdPrefix(command);\n\t\tlet next = (this.idCounters.get(prefix) ?? 0) + 1;\n\t\twhile (this.entries.has(`${prefix}_${next}`)) next += 1;\n\t\tthis.idCounters.set(prefix, next);\n\t\treturn `${prefix}_${next}`;\n\t}\n\n\tprivate observeId(id: string): void {\n\t\tconst match = /^(.*)_(\\d+)$/.exec(id);\n\t\tif (!match) return;\n\t\tconst prefix = match[1];\n\t\tconst value = Number.parseInt(match[2] ?? \"\", 10);\n\t\tif (!prefix || !Number.isFinite(value)) return;\n\t\tthis.idCounters.set(prefix, Math.max(this.idCounters.get(prefix) ?? 0, value));\n\t}\n\n\tprivate timestamp(): number {\n\t\tthis.sequence += 1;\n\t\treturn this.now() * 1000 + this.sequence;\n\t}\n}\n\nfunction normalizeMaxSessions(value: number | undefined): number {\n\tif (value === undefined) return DEFAULT_MAX_SESSIONS;\n\tif (!Number.isFinite(value) || value < 1) throw new Error(\"maxSessions must be a positive finite number.\");\n\treturn Math.trunc(value);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-pty",
3
3
  "private": true,
4
- "version": "2026.7.17-5",
4
+ "version": "2026.7.20-2",
5
5
  "description": "Typed PTY session loader for Senpi persistent terminals",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -21,5 +21,5 @@ export { parseOsc11BackgroundColor, parseTerminalColorSchemeReport, type RgbColo
21
21
  export { allocateImageId, type CellDimensions, deleteAllKittyImages, deleteKittyImage, detectCapabilities, encodeITerm2, encodeKitty, getCapabilities, getCellDimensions, getGifDimensions, getImageDimensions, getJpegDimensions, getPngDimensions, getWebpDimensions, hyperlink, type ImageDimensions, type ImageProtocol, type ImageRenderOptions, renderImage, resetCapabilitiesCache, setCapabilities, setCellDimensions, type TerminalCapabilities, } from "./terminal-image.ts";
22
22
  export { imageFallback, sanitizeTerminalLabel } from "./terminal-text.ts";
23
23
  export { type Component, Container, CURSOR_MARKER, type Focusable, isFocusable, type OverlayAnchor, type OverlayHandle, type OverlayMargin, type OverlayOptions, type OverlayUnfocusOptions, type SizeValue, TUI, } from "./tui.ts";
24
- export { sliceByColumn, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "./utils.ts";
24
+ export { getGraphemeSegmenter, getWordSegmenter, sliceByColumn, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "./utils.ts";
25
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -31,5 +31,5 @@ export { allocateImageId, deleteAllKittyImages, deleteKittyImage, detectCapabili
31
31
  export { imageFallback, sanitizeTerminalLabel } from "./terminal-text.js";
32
32
  export { Container, CURSOR_MARKER, isFocusable, TUI, } from "./tui.js";
33
33
  // Utilities
34
- export { sliceByColumn, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "./utils.js";
34
+ export { getGraphemeSegmenter, getWordSegmenter, sliceByColumn, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "./utils.js";
35
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,uBAAuB;AACvB,OAAO,EAIN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAwC,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,KAAK,EAAsC,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAA+B,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACN,gBAAgB,EAEhB,6BAA6B,EAC7B,QAAQ,EAGR,+BAA+B,GAC/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEN,UAAU,GAIV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAoB,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,iBAAiB;AACjB,OAAO,EAAmB,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,cAAc;AACd,OAAO,EACN,cAAc,EAOd,kBAAkB,EAClB,cAAc,EACd,eAAe,GACf,MAAM,kBAAkB,CAAC;AAC1B,0BAA0B;AAC1B,OAAO,EACN,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,GAAG,EAGH,UAAU,EACV,QAAQ,EACR,sBAAsB,GACtB,MAAM,WAAW,CAAC;AACnB,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAqD,MAAM,mBAAmB,CAAC;AACnG,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAA8C,MAAM,eAAe,CAAC;AAC5F,kBAAkB;AAClB,OAAO,EACN,yBAAyB,EACzB,8BAA8B,GAG9B,MAAM,sBAAsB,CAAC;AAC9B,yBAAyB;AACzB,OAAO,EACN,eAAe,EAEf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EAIT,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEN,SAAS,EACT,aAAa,EAEb,WAAW,EAOX,GAAG,GACH,MAAM,UAAU,CAAC;AAClB,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.ts\";\n// Components\nexport { Box } from \"./components/box.ts\";\nexport { CancellableLoader } from \"./components/cancellable-loader.ts\";\nexport { Editor, type EditorOptions, type EditorTheme } from \"./components/editor.ts\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.ts\";\nexport { Input } from \"./components/input.ts\";\nexport { Loader, type LoaderIndicatorOptions } from \"./components/loader.ts\";\nexport {\n\tclearRenderCache,\n\ttype DefaultTextStyle,\n\tgetMarkdownHighlightCallCount,\n\tMarkdown,\n\ttype MarkdownOptions,\n\ttype MarkdownTheme,\n\tresetMarkdownHighlightCallCount,\n} from \"./components/markdown.ts\";\nexport {\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SelectListTheme,\n\ttype SelectListTruncatePrimaryContext,\n} from \"./components/select-list.ts\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.ts\";\nexport { Spacer } from \"./components/spacer.ts\";\nexport { Text } from \"./components/text.ts\";\nexport { TruncatedText } from \"./components/truncated-text.ts\";\n// Editor component interface (for custom editors)\nexport type { EditorComponent } from \"./editor-component.ts\";\n// Fuzzy matching\nexport { type FuzzyMatch, fuzzyFilter, fuzzyMatch } from \"./fuzzy.ts\";\n// Keybindings\nexport {\n\tgetKeybindings,\n\ttype Keybinding,\n\ttype KeybindingConflict,\n\ttype KeybindingDefinition,\n\ttype KeybindingDefinitions,\n\ttype Keybindings,\n\ttype KeybindingsConfig,\n\tKeybindingsManager,\n\tsetKeybindings,\n\tTUI_KEYBINDINGS,\n} from \"./keybindings.ts\";\n// Keyboard input handling\nexport {\n\tdecodeKittyPrintable,\n\tisKeyRelease,\n\tisKeyRepeat,\n\tisKittyProtocolActive,\n\tKey,\n\ttype KeyEventType,\n\ttype KeyId,\n\tmatchesKey,\n\tparseKey,\n\tsetKittyProtocolActive,\n} from \"./keys.ts\";\n// Input buffering for batch splitting\nexport { StdinBuffer, type StdinBufferEventMap, type StdinBufferOptions } from \"./stdin-buffer.ts\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type ProcessTerminalOptions, type Terminal } from \"./terminal.ts\";\n// Terminal colors\nexport {\n\tparseOsc11BackgroundColor,\n\tparseTerminalColorSchemeReport,\n\ttype RgbColor,\n\ttype TerminalColorScheme,\n} from \"./terminal-colors.ts\";\n// Terminal image support\nexport {\n\tallocateImageId,\n\ttype CellDimensions,\n\tdeleteAllKittyImages,\n\tdeleteKittyImage,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\thyperlink,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCapabilities,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.ts\";\nexport { imageFallback, sanitizeTerminalLabel } from \"./terminal-text.ts\";\nexport {\n\ttype Component,\n\tContainer,\n\tCURSOR_MARKER,\n\ttype Focusable,\n\tisFocusable,\n\ttype OverlayAnchor,\n\ttype OverlayHandle,\n\ttype OverlayMargin,\n\ttype OverlayOptions,\n\ttype OverlayUnfocusOptions,\n\ttype SizeValue,\n\tTUI,\n} from \"./tui.ts\";\n// Utilities\nexport { sliceByColumn, truncateToWidth, visibleWidth, wrapTextWithAnsi } from \"./utils.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,uBAAuB;AACvB,OAAO,EAIN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAwC,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,KAAK,EAAsC,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAA+B,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACN,gBAAgB,EAEhB,6BAA6B,EAC7B,QAAQ,EAGR,+BAA+B,GAC/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEN,UAAU,GAIV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAoB,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,iBAAiB;AACjB,OAAO,EAAmB,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,cAAc;AACd,OAAO,EACN,cAAc,EAOd,kBAAkB,EAClB,cAAc,EACd,eAAe,GACf,MAAM,kBAAkB,CAAC;AAC1B,0BAA0B;AAC1B,OAAO,EACN,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,GAAG,EAGH,UAAU,EACV,QAAQ,EACR,sBAAsB,GACtB,MAAM,WAAW,CAAC;AACnB,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAqD,MAAM,mBAAmB,CAAC;AACnG,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAA8C,MAAM,eAAe,CAAC;AAC5F,kBAAkB;AAClB,OAAO,EACN,yBAAyB,EACzB,8BAA8B,GAG9B,MAAM,sBAAsB,CAAC;AAC9B,yBAAyB;AACzB,OAAO,EACN,eAAe,EAEf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EAIT,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEN,SAAS,EACT,aAAa,EAEb,WAAW,EAOX,GAAG,GACH,MAAM,UAAU,CAAC;AAClB,YAAY;AACZ,OAAO,EACN,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,GAChB,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.ts\";\n// Components\nexport { Box } from \"./components/box.ts\";\nexport { CancellableLoader } from \"./components/cancellable-loader.ts\";\nexport { Editor, type EditorOptions, type EditorTheme } from \"./components/editor.ts\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.ts\";\nexport { Input } from \"./components/input.ts\";\nexport { Loader, type LoaderIndicatorOptions } from \"./components/loader.ts\";\nexport {\n\tclearRenderCache,\n\ttype DefaultTextStyle,\n\tgetMarkdownHighlightCallCount,\n\tMarkdown,\n\ttype MarkdownOptions,\n\ttype MarkdownTheme,\n\tresetMarkdownHighlightCallCount,\n} from \"./components/markdown.ts\";\nexport {\n\ttype SelectItem,\n\tSelectList,\n\ttype SelectListLayoutOptions,\n\ttype SelectListTheme,\n\ttype SelectListTruncatePrimaryContext,\n} from \"./components/select-list.ts\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.ts\";\nexport { Spacer } from \"./components/spacer.ts\";\nexport { Text } from \"./components/text.ts\";\nexport { TruncatedText } from \"./components/truncated-text.ts\";\n// Editor component interface (for custom editors)\nexport type { EditorComponent } from \"./editor-component.ts\";\n// Fuzzy matching\nexport { type FuzzyMatch, fuzzyFilter, fuzzyMatch } from \"./fuzzy.ts\";\n// Keybindings\nexport {\n\tgetKeybindings,\n\ttype Keybinding,\n\ttype KeybindingConflict,\n\ttype KeybindingDefinition,\n\ttype KeybindingDefinitions,\n\ttype Keybindings,\n\ttype KeybindingsConfig,\n\tKeybindingsManager,\n\tsetKeybindings,\n\tTUI_KEYBINDINGS,\n} from \"./keybindings.ts\";\n// Keyboard input handling\nexport {\n\tdecodeKittyPrintable,\n\tisKeyRelease,\n\tisKeyRepeat,\n\tisKittyProtocolActive,\n\tKey,\n\ttype KeyEventType,\n\ttype KeyId,\n\tmatchesKey,\n\tparseKey,\n\tsetKittyProtocolActive,\n} from \"./keys.ts\";\n// Input buffering for batch splitting\nexport { StdinBuffer, type StdinBufferEventMap, type StdinBufferOptions } from \"./stdin-buffer.ts\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type ProcessTerminalOptions, type Terminal } from \"./terminal.ts\";\n// Terminal colors\nexport {\n\tparseOsc11BackgroundColor,\n\tparseTerminalColorSchemeReport,\n\ttype RgbColor,\n\ttype TerminalColorScheme,\n} from \"./terminal-colors.ts\";\n// Terminal image support\nexport {\n\tallocateImageId,\n\ttype CellDimensions,\n\tdeleteAllKittyImages,\n\tdeleteKittyImage,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\thyperlink,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCapabilities,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.ts\";\nexport { imageFallback, sanitizeTerminalLabel } from \"./terminal-text.ts\";\nexport {\n\ttype Component,\n\tContainer,\n\tCURSOR_MARKER,\n\ttype Focusable,\n\tisFocusable,\n\ttype OverlayAnchor,\n\ttype OverlayHandle,\n\ttype OverlayMargin,\n\ttype OverlayOptions,\n\ttype OverlayUnfocusOptions,\n\ttype SizeValue,\n\tTUI,\n} from \"./tui.ts\";\n// Utilities\nexport {\n\tgetGraphemeSegmenter,\n\tgetWordSegmenter,\n\tsliceByColumn,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"./utils.ts\";\n"]}
@@ -174,7 +174,6 @@ export declare class TUI extends Container {
174
174
  private renderRequested;
175
175
  private renderTimer;
176
176
  private lastRenderAt;
177
- private static readonly MIN_RENDER_INTERVAL_MS;
178
177
  private inputRenderPending;
179
178
  private cursorRow;
180
179
  private hardwareCursorRow;
@@ -237,6 +236,12 @@ export declare class TUI extends Container {
237
236
  private queryCellSize;
238
237
  stop(): void;
239
238
  requestRender(force?: boolean, source?: string): void;
239
+ /**
240
+ * Cap the render scheduler at `fps` frames per second. Values are clamped
241
+ * to 30-120fps (120fps yields an 8ms minimum interval). Never calling this
242
+ * preserves the historic 16ms (~60fps) throttle.
243
+ */
244
+ setMaxRenderFps(fps: number): void;
240
245
  private scheduleRender;
241
246
  private commitExpeditedRender;
242
247
  private handleInput;
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAIN,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAA2E,YAAY,EAAE,MAAM,YAAY,CAAC;AA0CnH;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB,OAAO,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,KAAK,mBAAmB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAC5E,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,mBAAmB,CAAC;AAc3D,UAAU,mBAAmB;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AASD;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACzB,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS,CAE3F;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,sBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,CAAC;AAkBxB,wBAAgB,qBAAqB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAKtE;AAED,wBAAgB,qBAAqB,IAAI,mBAAmB,GAAG,SAAS,CAKvE;AA2ED;;GAEG;AACH,MAAM,MAAM,aAAa,GACtB,QAAQ,GACR,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,GACd,YAAY,GACZ,eAAe,GACf,aAAa,GACb,cAAc,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;AAkB9C;;;GAGG;AACH,MAAM,WAAW,cAAc;IAE9B,sEAAsE;IACtE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,uDAAuD;IACvD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,gFAAgF;IAChF,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,4FAA4F;IAC5F,GAAG,CAAC,EAAE,SAAS,CAAC;IAGhB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAGhC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7D,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,6DAA6D;IAC7D,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,6DAA6D;IAC7D,IAAI,IAAI,IAAI,CAAC;IACb,2CAA2C;IAC3C,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,6CAA6C;IAC7C,QAAQ,IAAI,OAAO,CAAC;IACpB,0DAA0D;IAC1D,KAAK,IAAI,IAAI,CAAC;IACd,qHAAqH;IACrH,OAAO,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC/C,gDAAgD;IAChD,SAAS,IAAI,OAAO,CAAC;CACrB;AAqBD,KAAK,qBAAqB,GAAG;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IAC1C,QAAQ,EAAE,SAAS,EAAE,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAS;IAEzB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAEnC;IAED,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAMtC;IAED,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAKtC;IAED,KAAK,IAAI,IAAI,CAKZ;IAED,SAAS,IAAI,IAAI,CAEhB;IAED,OAAO,IAAI,IAAI,CAMd;IAED,UAAU,IAAI,IAAI,CAIjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB9B;CACD;AAED;;GAEG;AACH,qBAAa,GAAI,SAAQ,SAAS;;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,cAAc,CAA4B;IAElD,2GAA2G;IACpG,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAM;IACpD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAA0C;IACpE,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,6BAA6B,CAAK;IAC1C,OAAO,CAAC,6BAA6B,CAAqC;IAC1E,OAAO,CAAC,4BAA4B,CAAoD;IACxF,OAAO,CAAC,uCAAuC,CAAS;IAIxD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,mBAAmB,CAAoD;IAG/E,YAAY,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,qBAAqB,EASxE;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,qBAAqB,IAAI,OAAO,CAE/B;IAED,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO5C;IAED,gBAAgB,IAAI,OAAO,CAE1B;IAED;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEvC;IAED,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAE1C;IAED,OAAO,CAAC,gBAAgB;IAiExB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,2BAA2B;IAMnC,OAAO,CAAC,gCAAgC;IAMxC,OAAO,CAAC,6BAA6B;IASrC,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CA6FzE;IAED,2DAA2D;IAC3D,WAAW,IAAI,IAAI,CAalB;IAED,8CAA8C;IAC9C,UAAU,IAAI,OAAO,CAEpB;IAED,qDAAqD;IACrD,OAAO,CAAC,gBAAgB;IAQxB,kEAAkE;IAClE,OAAO,CAAC,wBAAwB;IAWvB,UAAU,IAAI,IAAI,CAG1B;IAED,KAAK,IAAI,IAAI,CAeZ;IAED,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAKpD;IAED,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAEjD;IAED,2BAA2B,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI,CAKvF;IAED,mCAAmC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D;IAED,OAAO,CAAC,aAAa;IAUrB,IAAI,IAAI,IAAI,CAoCX;IAYD,aAAa,CAAC,KAAK,UAAQ,EAAE,MAAM,SAAY,GAAG,IAAI,CAqCrD;IAED,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,WAAW;IA4EnB,OAAO,CAAC,8BAA8B;IAwBtC,OAAO,CAAC,gCAAgC;IAYxC,OAAO,CAAC,uBAAuB;IAoB/B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAoG5B,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,gBAAgB;IAiBxB,yFAAyF;IACzF,OAAO,CAAC,iBAAiB;IA6DzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAE9D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAyB;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAE1D,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,uBAAuB;IAuD/B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,gCAAgC;IAuBxC,OAAO,CAAC,oCAAoC;IAoB5C,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,8BAA8B;IAqDtC,OAAO,CAAC,0BAA0B;IA2ClC,OAAO,CAAC,sBAAsB;IAyC9B,OAAO,CAAC,wBAAwB;IA0ChC,2FAA2F;IAC3F,OAAO,CAAC,eAAe;IAkDvB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,QAAQ;IAkfhB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAkC9B;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAqBhG;IAED;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAoBvG;CACD"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
@@ -239,7 +239,8 @@ export class Container {
239
239
  * TUI - Main class for managing terminal UI with differential rendering
240
240
  */
241
241
  export class TUI extends Container {
242
- static { this.MIN_RENDER_INTERVAL_MS = 16; }
242
+ /** Minimum interval between scheduled renders. Default preserves the historic ~60fps cap. */
243
+ #minRenderIntervalMs;
243
244
  #lastCursorVisibility;
244
245
  #muxDetector;
245
246
  constructor(terminal, options) {
@@ -253,6 +254,8 @@ export class TUI extends Container {
253
254
  this.inputListeners = new Set();
254
255
  this.renderRequested = false;
255
256
  this.lastRenderAt = 0;
257
+ /** Minimum interval between scheduled renders. Default preserves the historic ~60fps cap. */
258
+ this.#minRenderIntervalMs = 16;
256
259
  this.inputRenderPending = false;
257
260
  this.cursorRow = 0; // Logical cursor row (end of rendered content)
258
261
  this.hardwareCursorRow = 0; // Actual terminal cursor row (may differ due to IME positioning)
@@ -700,12 +703,21 @@ export class TUI extends Container {
700
703
  this.renderRequested = true;
701
704
  process.nextTick(() => this.scheduleRender());
702
705
  }
706
+ /**
707
+ * Cap the render scheduler at `fps` frames per second. Values are clamped
708
+ * to 30-120fps (120fps yields an 8ms minimum interval). Never calling this
709
+ * preserves the historic 16ms (~60fps) throttle.
710
+ */
711
+ setMaxRenderFps(fps) {
712
+ const clamped = Math.min(120, Math.max(30, Math.round(fps)));
713
+ this.#minRenderIntervalMs = Math.floor(1000 / clamped);
714
+ }
703
715
  scheduleRender() {
704
716
  if (this.stopped || this.renderTimer || !this.renderRequested) {
705
717
  return;
706
718
  }
707
719
  const elapsed = performance.now() - this.lastRenderAt;
708
- const delay = Math.max(0, TUI.MIN_RENDER_INTERVAL_MS - elapsed);
720
+ const delay = Math.max(0, this.#minRenderIntervalMs - elapsed);
709
721
  this.renderTimer = setTimeout(() => {
710
722
  this.renderTimer = undefined;
711
723
  if (this.stopped || !this.renderRequested) {