@pentoshi/clai 4.11.16 → 4.11.18

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 (279) hide show
  1. package/README.md +31 -22
  2. package/dist/agent/compaction/summary-execution.d.ts +1 -0
  3. package/dist/agent/compaction/summary-execution.js +25 -16
  4. package/dist/agent/compaction/summary-execution.js.map +1 -1
  5. package/dist/agent/context/compact-with-summary.js +18 -0
  6. package/dist/agent/context/compact-with-summary.js.map +1 -1
  7. package/dist/agent/context/compaction-source-prefix.d.ts +8 -0
  8. package/dist/agent/context/compaction-source-prefix.js +26 -0
  9. package/dist/agent/context/compaction-source-prefix.js.map +1 -0
  10. package/dist/agent/plan-decision.js +5 -1
  11. package/dist/agent/plan-decision.js.map +1 -1
  12. package/dist/agent/runner.js +3 -0
  13. package/dist/agent/runner.js.map +1 -1
  14. package/dist/agent/subagents/manager.d.ts +5 -0
  15. package/dist/agent/subagents/manager.js +52 -5
  16. package/dist/agent/subagents/manager.js.map +1 -1
  17. package/dist/agent/subagents/model-chain.d.ts +31 -0
  18. package/dist/agent/subagents/model-chain.js +146 -0
  19. package/dist/agent/subagents/model-chain.js.map +1 -0
  20. package/dist/agent/subagents/read-only-tools.js +362 -54
  21. package/dist/agent/subagents/read-only-tools.js.map +1 -1
  22. package/dist/agent/subagents/tools.js +21 -1
  23. package/dist/agent/subagents/tools.js.map +1 -1
  24. package/dist/agent/subagents/types.d.ts +5 -0
  25. package/dist/agent/subagents/worker.js +106 -45
  26. package/dist/agent/subagents/worker.js.map +1 -1
  27. package/dist/agent/turn/compaction-summarizer.d.ts +1 -0
  28. package/dist/agent/turn/compaction-summarizer.js +2 -0
  29. package/dist/agent/turn/compaction-summarizer.js.map +1 -1
  30. package/dist/agent/turn/loop/run-rounds.js +2 -0
  31. package/dist/agent/turn/loop/run-rounds.js.map +1 -1
  32. package/dist/agent/turn/loop/stream-request.js +1 -0
  33. package/dist/agent/turn/loop/stream-request.js.map +1 -1
  34. package/dist/agent/turn/setup/compaction-services.d.ts +2 -1
  35. package/dist/agent/turn/setup/compaction-services.js +14 -0
  36. package/dist/agent/turn/setup/compaction-services.js.map +1 -1
  37. package/dist/agent/turn/setup/turn-budget.js +1 -9
  38. package/dist/agent/turn/setup/turn-budget.js.map +1 -1
  39. package/dist/agent/turn/subagent-inbox.d.ts +1 -0
  40. package/dist/agent/turn/subagent-inbox.js +12 -1
  41. package/dist/agent/turn/subagent-inbox.js.map +1 -1
  42. package/dist/app/commands/catalog.js +2 -1
  43. package/dist/app/commands/catalog.js.map +1 -1
  44. package/dist/app/controllers/session-compact-helper.d.ts +2 -0
  45. package/dist/app/controllers/session-compact-helper.js +7 -3
  46. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  47. package/dist/app/controllers/session-context-usage.d.ts +2 -5
  48. package/dist/app/controllers/session-context-usage.js +28 -101
  49. package/dist/app/controllers/session-context-usage.js.map +1 -1
  50. package/dist/app/controllers/session-controller.d.ts +8 -1
  51. package/dist/app/controllers/session-controller.js +14 -11
  52. package/dist/app/controllers/session-controller.js.map +1 -1
  53. package/dist/app/controllers/session-subagents.d.ts +1 -0
  54. package/dist/app/controllers/session-subagents.js +7 -1
  55. package/dist/app/controllers/session-subagents.js.map +1 -1
  56. package/dist/classic/app/ClassicApp.js +4 -0
  57. package/dist/classic/app/ClassicApp.js.map +1 -1
  58. package/dist/classic/chrome/Chrome.d.ts +1 -1
  59. package/dist/classic/chrome/Chrome.js +1 -0
  60. package/dist/classic/chrome/Chrome.js.map +1 -1
  61. package/dist/classic/chrome/SubagentsStrip.d.ts +3 -0
  62. package/dist/classic/chrome/SubagentsStrip.js +9 -0
  63. package/dist/classic/chrome/SubagentsStrip.js.map +1 -0
  64. package/dist/classic/chrome/row-budget.d.ts +2 -0
  65. package/dist/classic/chrome/row-budget.js +4 -1
  66. package/dist/classic/chrome/row-budget.js.map +1 -1
  67. package/dist/classic/chrome/subagents-row.d.ts +9 -0
  68. package/dist/classic/chrome/subagents-row.js +13 -0
  69. package/dist/classic/chrome/subagents-row.js.map +1 -0
  70. package/dist/classic/panels/keys-panel.d.ts +2 -2
  71. package/dist/classic/panels/keys-panel.js +24 -8
  72. package/dist/classic/panels/keys-panel.js.map +1 -1
  73. package/dist/classic/panels/pager-panel.d.ts +2 -2
  74. package/dist/classic/panels/pager-panel.js +7 -6
  75. package/dist/classic/panels/pager-panel.js.map +1 -1
  76. package/dist/classic/panels/panel-host.js +7 -2
  77. package/dist/classic/panels/panel-host.js.map +1 -1
  78. package/dist/commands/providers.js +8 -0
  79. package/dist/commands/providers.js.map +1 -1
  80. package/dist/llm/anthropic.js +29 -1
  81. package/dist/llm/anthropic.js.map +1 -1
  82. package/dist/llm/bynara.js +9 -20
  83. package/dist/llm/bynara.js.map +1 -1
  84. package/dist/llm/capabilities.d.ts +6 -1
  85. package/dist/llm/capabilities.js +130 -6
  86. package/dist/llm/capabilities.js.map +1 -1
  87. package/dist/llm/capability/state.d.ts +1 -1
  88. package/dist/llm/capability/state.js +16 -2
  89. package/dist/llm/capability/state.js.map +1 -1
  90. package/dist/llm/capability/tool-dialect.js +4 -0
  91. package/dist/llm/capability/tool-dialect.js.map +1 -1
  92. package/dist/llm/capability/vision-patterns.d.ts +1 -0
  93. package/dist/llm/capability/vision-patterns.js +31 -1
  94. package/dist/llm/capability/vision-patterns.js.map +1 -1
  95. package/dist/llm/capability/vision-registry.js +8 -2
  96. package/dist/llm/capability/vision-registry.js.map +1 -1
  97. package/dist/llm/context-windows.js +1 -0
  98. package/dist/llm/context-windows.js.map +1 -1
  99. package/dist/llm/deepseek.d.ts +2 -0
  100. package/dist/llm/deepseek.js +91 -0
  101. package/dist/llm/deepseek.js.map +1 -0
  102. package/dist/llm/glm.d.ts +2 -0
  103. package/dist/llm/glm.js +91 -0
  104. package/dist/llm/glm.js.map +1 -0
  105. package/dist/llm/kimi.d.ts +2 -0
  106. package/dist/llm/kimi.js +91 -0
  107. package/dist/llm/kimi.js.map +1 -0
  108. package/dist/llm/learned-capabilities.js +9 -3
  109. package/dist/llm/learned-capabilities.js.map +1 -1
  110. package/dist/llm/lowest-reasoning.js +20 -7
  111. package/dist/llm/lowest-reasoning.js.map +1 -1
  112. package/dist/llm/minimax.d.ts +2 -0
  113. package/dist/llm/minimax.js +91 -0
  114. package/dist/llm/minimax.js.map +1 -0
  115. package/dist/llm/modal.js +5 -0
  116. package/dist/llm/modal.js.map +1 -1
  117. package/dist/llm/model-layers/model-rules.js +24 -0
  118. package/dist/llm/model-layers/model-rules.js.map +1 -1
  119. package/dist/llm/ollama.js +26 -1
  120. package/dist/llm/ollama.js.map +1 -1
  121. package/dist/llm/provider-identity.js +25 -0
  122. package/dist/llm/provider-identity.js.map +1 -1
  123. package/dist/llm/provider-info-text.js +121 -3
  124. package/dist/llm/provider-info-text.js.map +1 -1
  125. package/dist/llm/provider-profile-layers.js +118 -0
  126. package/dist/llm/provider-profile-layers.js.map +1 -1
  127. package/dist/llm/provider.js +14 -2
  128. package/dist/llm/provider.js.map +1 -1
  129. package/dist/llm/reasoning-capability.js +4 -0
  130. package/dist/llm/reasoning-capability.js.map +1 -1
  131. package/dist/llm/reasoning-errors.js +1 -1
  132. package/dist/llm/reasoning-errors.js.map +1 -1
  133. package/dist/llm/request-purpose.d.ts +3 -0
  134. package/dist/llm/request-purpose.js +11 -0
  135. package/dist/llm/request-purpose.js.map +1 -0
  136. package/dist/llm/responses-config.d.ts +1 -0
  137. package/dist/llm/responses-config.js +6 -0
  138. package/dist/llm/responses-config.js.map +1 -1
  139. package/dist/llm/responses-http.d.ts +1 -1
  140. package/dist/llm/responses-http.js +2 -1
  141. package/dist/llm/responses-http.js.map +1 -1
  142. package/dist/llm/responses-stream.d.ts +2 -2
  143. package/dist/llm/responses-stream.js +3 -2
  144. package/dist/llm/responses-stream.js.map +1 -1
  145. package/dist/llm/routing/attempt-complete.js +15 -3
  146. package/dist/llm/routing/attempt-complete.js.map +1 -1
  147. package/dist/llm/routing/attempt-request.d.ts +11 -0
  148. package/dist/llm/routing/attempt-request.js +56 -5
  149. package/dist/llm/routing/attempt-request.js.map +1 -1
  150. package/dist/llm/routing/attempt-stream.js +15 -3
  151. package/dist/llm/routing/attempt-stream.js.map +1 -1
  152. package/dist/llm/routing/error-classification.d.ts +2 -0
  153. package/dist/llm/routing/error-classification.js +26 -6
  154. package/dist/llm/routing/error-classification.js.map +1 -1
  155. package/dist/llm/routing/key-rotation.js +26 -11
  156. package/dist/llm/routing/key-rotation.js.map +1 -1
  157. package/dist/llm/routing/provider-selection.js +12 -0
  158. package/dist/llm/routing/provider-selection.js.map +1 -1
  159. package/dist/llm/session-affinity.d.ts +1 -0
  160. package/dist/llm/session-affinity.js +4 -0
  161. package/dist/llm/session-affinity.js.map +1 -1
  162. package/dist/llm/session-route.d.ts +7 -0
  163. package/dist/llm/session-route.js +16 -0
  164. package/dist/llm/session-route.js.map +1 -0
  165. package/dist/llm/wire/capability-errors.js +4 -4
  166. package/dist/llm/wire/capability-errors.js.map +1 -1
  167. package/dist/llm/wire/chat-body.js +5 -4
  168. package/dist/llm/wire/chat-body.js.map +1 -1
  169. package/dist/llm/wire/effort-preflight.d.ts +15 -0
  170. package/dist/llm/wire/effort-preflight.js +141 -0
  171. package/dist/llm/wire/effort-preflight.js.map +1 -0
  172. package/dist/llm/wire/image-payloads.d.ts +2 -0
  173. package/dist/llm/wire/image-payloads.js +34 -0
  174. package/dist/llm/wire/image-payloads.js.map +1 -0
  175. package/dist/llm/wire/openai-complete.d.ts +4 -1
  176. package/dist/llm/wire/openai-complete.js +11 -3
  177. package/dist/llm/wire/openai-complete.js.map +1 -1
  178. package/dist/llm/wire/openai-stream.d.ts +5 -2
  179. package/dist/llm/wire/openai-stream.js +17 -8
  180. package/dist/llm/wire/openai-stream.js.map +1 -1
  181. package/dist/llm/wire/responses-first.d.ts +4 -1
  182. package/dist/llm/wire/responses-first.js +11 -7
  183. package/dist/llm/wire/responses-first.js.map +1 -1
  184. package/dist/llm/wire/responses-preflight.js +29 -12
  185. package/dist/llm/wire/responses-preflight.js.map +1 -1
  186. package/dist/prompts/embedded.js +1 -1
  187. package/dist/prompts/embedded.js.map +1 -1
  188. package/dist/prompts/index.js +42 -21
  189. package/dist/prompts/index.js.map +1 -1
  190. package/dist/prompts/system.agent.md +3 -3
  191. package/dist/store/config/endpoints.d.ts +11 -0
  192. package/dist/store/config/endpoints.js +19 -1
  193. package/dist/store/config/endpoints.js.map +1 -1
  194. package/dist/store/config/subagent-models.d.ts +7 -0
  195. package/dist/store/config/subagent-models.js +73 -0
  196. package/dist/store/config/subagent-models.js.map +1 -0
  197. package/dist/store/config.d.ts +4 -3
  198. package/dist/store/config.js +7 -2
  199. package/dist/store/config.js.map +1 -1
  200. package/dist/store/keys.js +8 -1
  201. package/dist/store/keys.js.map +1 -1
  202. package/dist/store/subagents.js +8 -1
  203. package/dist/store/subagents.js.map +1 -1
  204. package/dist/tools/definitions/subagents.d.ts +1 -1
  205. package/dist/tools/definitions/subagents.js +15 -6
  206. package/dist/tools/definitions/subagents.js.map +1 -1
  207. package/dist/tui-v2/app/App.js +4 -0
  208. package/dist/tui-v2/app/App.js.map +1 -1
  209. package/dist/tui-v2/bootstrap/patch-opentui-text.js +14 -13
  210. package/dist/tui-v2/bootstrap/patch-opentui-text.js.map +1 -1
  211. package/dist/tui-v2/bootstrap/renderer-handle.d.ts +1 -0
  212. package/dist/tui-v2/bootstrap/renderer-handle.js +2 -1
  213. package/dist/tui-v2/bootstrap/renderer-handle.js.map +1 -1
  214. package/dist/tui-v2/bootstrap/shrink-resize-guard.d.ts +27 -0
  215. package/dist/tui-v2/bootstrap/shrink-resize-guard.js +118 -0
  216. package/dist/tui-v2/bootstrap/shrink-resize-guard.js.map +1 -0
  217. package/dist/tui-v2/bootstrap/start-tui-v2.js +3 -0
  218. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  219. package/dist/tui-v2/components/jobs/subagents-panel.d.ts +11 -0
  220. package/dist/tui-v2/components/jobs/subagents-panel.js +80 -0
  221. package/dist/tui-v2/components/jobs/subagents-panel.js.map +1 -0
  222. package/dist/tui-v2/components/modal/keys-modal-pick.d.ts +9 -0
  223. package/dist/tui-v2/components/modal/keys-modal-pick.js +15 -0
  224. package/dist/tui-v2/components/modal/keys-modal-pick.js.map +1 -0
  225. package/dist/tui-v2/components/modal/keys-modal.js +46 -12
  226. package/dist/tui-v2/components/modal/keys-modal.js.map +1 -1
  227. package/dist/tui-v2/components/pager/pager-line.js +3 -2
  228. package/dist/tui-v2/components/pager/pager-line.js.map +1 -1
  229. package/dist/tui-v2/components/pager/pager.js +47 -35
  230. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  231. package/dist/tui-v2/components/transcript/thinking-block.js +1 -3
  232. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  233. package/dist/tui-v2/components/transcript/thinking-presentation.d.ts +0 -1
  234. package/dist/tui-v2/components/transcript/thinking-presentation.js +1 -3
  235. package/dist/tui-v2/components/transcript/thinking-presentation.js.map +1 -1
  236. package/dist/tui-v2/rendering/pager-markdown.d.ts +2 -0
  237. package/dist/tui-v2/rendering/pager-markdown.js +10 -6
  238. package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
  239. package/dist/tui-v2/rendering/subagent-ansi.d.ts +4 -0
  240. package/dist/tui-v2/rendering/subagent-ansi.js +10 -0
  241. package/dist/tui-v2/rendering/subagent-ansi.js.map +1 -0
  242. package/dist/types.d.ts +2 -1
  243. package/dist/types.js +4 -0
  244. package/dist/types.js.map +1 -1
  245. package/dist/ui-core/commands/picker-commands.d.ts +12 -0
  246. package/dist/ui-core/commands/picker-commands.js +9 -5
  247. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  248. package/dist/ui-core/commands/session-commands.js +5 -3
  249. package/dist/ui-core/commands/session-commands.js.map +1 -1
  250. package/dist/ui-core/commands/subagent-commands.d.ts +8 -0
  251. package/dist/ui-core/commands/subagent-commands.js +81 -21
  252. package/dist/ui-core/commands/subagent-commands.js.map +1 -1
  253. package/dist/ui-core/commands/subagent-models-editor.d.ts +2 -0
  254. package/dist/ui-core/commands/subagent-models-editor.js +123 -0
  255. package/dist/ui-core/commands/subagent-models-editor.js.map +1 -0
  256. package/dist/ui-core/controllers/overlay-controller.d.ts +10 -0
  257. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  258. package/dist/ui-core/rendering/format-usage.js +5 -0
  259. package/dist/ui-core/rendering/format-usage.js.map +1 -1
  260. package/dist/ui-core/rendering/markdown.d.ts +2 -0
  261. package/dist/ui-core/rendering/markdown.js +1 -1
  262. package/dist/ui-core/rendering/markdown.js.map +1 -1
  263. package/dist/ui-core/rendering/sanitize-display.d.ts +3 -0
  264. package/dist/ui-core/rendering/sanitize-display.js +33 -2
  265. package/dist/ui-core/rendering/sanitize-display.js.map +1 -1
  266. package/dist/ui-core/rendering/status-segments.js +3 -1
  267. package/dist/ui-core/rendering/status-segments.js.map +1 -1
  268. package/dist/ui-core/rendering/subagent-presentation.d.ts +2 -0
  269. package/dist/ui-core/rendering/subagent-presentation.js +9 -0
  270. package/dist/ui-core/rendering/subagent-presentation.js.map +1 -1
  271. package/dist/ui-core/rendering/subagent-source.d.ts +2 -0
  272. package/dist/ui-core/rendering/subagent-source.js +10 -1
  273. package/dist/ui-core/rendering/subagent-source.js.map +1 -1
  274. package/dist/version.generated.d.ts +2 -2
  275. package/dist/version.generated.js +2 -2
  276. package/package.json +1 -1
  277. package/dist/llm/effort-fallback.d.ts +0 -6
  278. package/dist/llm/effort-fallback.js +0 -67
  279. package/dist/llm/effort-fallback.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { TextRenderable, stringToStyledText, StyledText } from "@opentui/core";
2
- import { sanitizeDisplayText } from "../../ui-core/rendering/sanitize-display.js";
1
+ import { TextBuffer, TextRenderable, stringToStyledText, StyledText } from "@opentui/core";
2
+ import { sanitizeDisplayText, sanitizeDisplayTextChunks } from "../../ui-core/rendering/sanitize-display.js";
3
3
  let patched = false;
4
4
  function isStyledText(value) {
5
5
  return (value instanceof StyledText ||
@@ -17,17 +17,8 @@ export function sanitizeOpenTuiTextContent(value) {
17
17
  if (isStyledText(value)) {
18
18
  if (!value.chunks || value.chunks.length === 0)
19
19
  return " ";
20
- let changed = false;
21
- const chunks = value.chunks.map((chunk) => {
22
- const sanitized = sanitizeDisplayText(chunk.text);
23
- if (sanitized === chunk.text)
24
- return chunk;
25
- changed = true;
26
- return { ...chunk, text: sanitized };
27
- });
28
- if (chunks.every((chunk) => chunk.text.length === 0))
29
- return " ";
30
- return changed ? new StyledText(chunks) : value;
20
+ const sanitized = sanitizeStyledText(value);
21
+ return sanitized.chunks.length === 0 ? " " : sanitized;
31
22
  }
32
23
  try {
33
24
  const sanitized = sanitizeDisplayText(String(value));
@@ -37,10 +28,20 @@ export function sanitizeOpenTuiTextContent(value) {
37
28
  return " ";
38
29
  }
39
30
  }
31
+ function sanitizeStyledText(value) {
32
+ const chunks = sanitizeDisplayTextChunks(value.chunks).filter((chunk) => chunk.text.length > 0);
33
+ return chunks.length === value.chunks.length && chunks.every((chunk, index) => chunk === value.chunks[index])
34
+ ? value
35
+ : new StyledText(chunks);
36
+ }
40
37
  export function patchOpenTuiTextContent() {
41
38
  if (patched)
42
39
  return;
43
40
  patched = true;
41
+ const setStyledText = TextBuffer.prototype.setStyledText;
42
+ TextBuffer.prototype.setStyledText = function (value) {
43
+ setStyledText.call(this, sanitizeStyledText(value));
44
+ };
44
45
  const proto = TextRenderable.prototype;
45
46
  const desc = Object.getOwnPropertyDescriptor(proto, "content");
46
47
  if (!desc?.set || !desc.get)
@@ -1 +1 @@
1
- {"version":3,"file":"patch-opentui-text.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/patch-opentui-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"patch-opentui-text.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/patch-opentui-text.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { RendererHandle } from "../../ui-core/bootstrap/lifecycle.js";
2
2
  export interface OpenTuiRendererControl {
3
+ pause(): void;
3
4
  suspend(): void;
4
5
  idle(): Promise<void>;
5
6
  destroy(): void;
@@ -16,8 +16,9 @@ export function createOpenTuiRendererHandle(parts) {
16
16
  unmountError = error;
17
17
  }
18
18
  try {
19
- parts.renderer.suspend();
19
+ parts.renderer.pause();
20
20
  await parts.renderer.idle();
21
+ parts.renderer.suspend();
21
22
  parts.renderer.destroy();
22
23
  await parts.finalized;
23
24
  parts.disarmTerminalRescue();
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-handle.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/renderer-handle.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,2BAA2B,CACzC,KAAiC;IAEjC,IAAI,WAAW,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACzC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB;QAC7B,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,OAAO;YACX,IAAI,YAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,SAAS,CAAC;gBACtB,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,YAAY,KAAK,SAAS;gBAAE,MAAM,YAAY,CAAC;QACrD,CAAC;KACF,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"renderer-handle.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/renderer-handle.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,2BAA2B,CACzC,KAAiC;IAEjC,IAAI,WAAW,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACzC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB;QAC7B,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,OAAO;YACX,IAAI,YAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,SAAS,CAAC;gBACtB,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,YAAY,KAAK,SAAS;gBAAE,MAAM,YAAY,CAAC;QACrD,CAAC;KACF,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface RenderBufferLike {
2
+ clear?(color?: unknown): void;
3
+ }
4
+ export interface ShrinkResizeRenderer {
5
+ resize(columns: number, rows: number): void;
6
+ requestRender(): void;
7
+ readonly isDestroyed?: boolean | undefined;
8
+ readonly currentRenderBuffer?: RenderBufferLike | undefined;
9
+ readonly nextRenderBuffer?: RenderBufferLike | undefined;
10
+ }
11
+ export interface ResizeSignalSource {
12
+ on(event: "SIGWINCH", listener: () => void): unknown;
13
+ off(event: "SIGWINCH", listener: () => void): unknown;
14
+ }
15
+ export interface TerminalSizeSource {
16
+ getWindowSize?(): [number, number] | undefined;
17
+ readonly columns?: number | undefined;
18
+ readonly rows?: number | undefined;
19
+ write?(text: string): unknown;
20
+ }
21
+ export interface ShrinkResizeGuardOptions {
22
+ readonly renderer: ShrinkResizeRenderer;
23
+ readonly terminal?: TerminalSizeSource | undefined;
24
+ readonly signals?: ResizeSignalSource | undefined;
25
+ readonly settleMs?: number | undefined;
26
+ }
27
+ export declare function installShrinkResizeGuard(options: ShrinkResizeGuardOptions): () => void;
@@ -0,0 +1,118 @@
1
+ import { writeTerminalDirect } from "../../os/terminal-write.js";
2
+ import { forceFullRepaint } from "./resize-repaint.js";
3
+ const DEFAULT_SETTLE_MS = 150;
4
+ const CLEAR_SCREEN_SEQUENCE = "\x1b[r\x1b[0m\x1b[H\x1b[2J\x1b[3J\x1b[H";
5
+ function readSize(source) {
6
+ const windowSize = source.getWindowSize?.();
7
+ return {
8
+ columns: windowSize?.[0] ?? source.columns ?? 0,
9
+ rows: windowSize?.[1] ?? source.rows ?? 0,
10
+ };
11
+ }
12
+ function isShrink(previous, next) {
13
+ if (next.columns <= 0 || next.rows <= 0)
14
+ return false;
15
+ const narrower = previous.columns > 0 && next.columns < previous.columns;
16
+ const shorter = previous.rows > 0 && next.rows < previous.rows;
17
+ return narrower || shorter;
18
+ }
19
+ function clearScreen(renderer, terminal) {
20
+ const writeOut = renderer
21
+ .writeOut;
22
+ if (typeof writeOut === "function") {
23
+ writeOut.call(renderer, CLEAR_SCREEN_SEQUENCE);
24
+ return;
25
+ }
26
+ if (typeof terminal?.write === "function") {
27
+ terminal.write(CLEAR_SCREEN_SEQUENCE);
28
+ return;
29
+ }
30
+ writeTerminalDirect(CLEAR_SCREEN_SEQUENCE);
31
+ }
32
+ function cancelPendingRendererResize(renderer) {
33
+ const target = renderer;
34
+ if (target.resizeTimeoutId == null)
35
+ return;
36
+ if (target.clock && typeof target.clock.clearTimeout === "function") {
37
+ target.clock.clearTimeout(target.resizeTimeoutId);
38
+ }
39
+ else {
40
+ clearTimeout(target.resizeTimeoutId);
41
+ }
42
+ target.resizeTimeoutId = null;
43
+ }
44
+ export function installShrinkResizeGuard(options) {
45
+ const terminal = options.terminal ?? process.stdout;
46
+ const signals = options.signals ?? process;
47
+ const settleMs = options.settleMs ?? DEFAULT_SETTLE_MS;
48
+ let active = true;
49
+ let previous = readSize(terminal);
50
+ let settling;
51
+ let suppressed = false;
52
+ let originalRequestRender;
53
+ const restore = () => {
54
+ if (!suppressed)
55
+ return;
56
+ suppressed = false;
57
+ if (originalRequestRender !== undefined) {
58
+ options.renderer.requestRender = originalRequestRender;
59
+ originalRequestRender = undefined;
60
+ }
61
+ };
62
+ const heal = () => {
63
+ if (options.renderer.isDestroyed)
64
+ return;
65
+ cancelPendingRendererResize(options.renderer);
66
+ clearScreen(options.renderer, terminal);
67
+ const bgColor = options.renderer.backgroundColor;
68
+ options.renderer.currentRenderBuffer?.clear?.(bgColor);
69
+ options.renderer.nextRenderBuffer?.clear?.(bgColor);
70
+ if (!forceFullRepaint(options.renderer))
71
+ options.renderer.requestRender();
72
+ };
73
+ const onSettled = () => {
74
+ settling = undefined;
75
+ restore();
76
+ if (!active)
77
+ return;
78
+ heal();
79
+ };
80
+ const onResizeSignal = () => {
81
+ if (!active || options.renderer.isDestroyed)
82
+ return;
83
+ const next = readSize(terminal);
84
+ const shrunk = isShrink(previous, next);
85
+ previous = next;
86
+ if (!shrunk) {
87
+ if (!suppressed)
88
+ return;
89
+ if (settling !== undefined)
90
+ clearTimeout(settling);
91
+ onSettled();
92
+ return;
93
+ }
94
+ if (!suppressed) {
95
+ suppressed = true;
96
+ originalRequestRender = options.renderer.requestRender.bind(options.renderer);
97
+ options.renderer.requestRender = () => undefined;
98
+ }
99
+ cancelPendingRendererResize(options.renderer);
100
+ options.renderer.resize(next.columns, next.rows);
101
+ if (settling !== undefined)
102
+ clearTimeout(settling);
103
+ settling = setTimeout(onSettled, settleMs);
104
+ };
105
+ signals.on("SIGWINCH", onResizeSignal);
106
+ return () => {
107
+ if (!active)
108
+ return;
109
+ active = false;
110
+ if (settling !== undefined) {
111
+ clearTimeout(settling);
112
+ settling = undefined;
113
+ }
114
+ restore();
115
+ signals.off("SIGWINCH", onResizeSignal);
116
+ };
117
+ }
118
+ //# sourceMappingURL=shrink-resize-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrink-resize-guard.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/shrink-resize-guard.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ import { bindRuntimeChildBridge } from "../../session-runtime/binding.js";
26
26
  import { seedSessionModel } from "../../store/session-model.js";
27
27
  import { createOpenTuiRendererHandle } from "./renderer-handle.js";
28
28
  import { repaintAttachedScreen } from "./resize-repaint.js";
29
+ import { installShrinkResizeGuard } from "./shrink-resize-guard.js";
29
30
  export async function startTuiV2(options = {}) {
30
31
  patchOpenTuiTextContent();
31
32
  setAllowInteractiveStdinInherit(false);
@@ -144,9 +145,11 @@ export async function startTuiV2(options = {}) {
144
145
  disarmTerminalRescue,
145
146
  disposeServices: () => services.dispose(),
146
147
  });
148
+ const disposeShrinkResizeGuard = installShrinkResizeGuard({ renderer });
147
149
  const lifecycle = new RendererLifecycle({
148
150
  handle,
149
151
  disposers: [
152
+ disposeShrinkResizeGuard,
150
153
  () => disposeRuntimeBridge(),
151
154
  epilogue.capture,
152
155
  async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"start-tui-v2.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/start-tui-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AAE9F,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EACL,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAEpB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAY5D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAA6B,EAAE;IAE/B,uBAAuB,EAAE,CAAC;IAC1B,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,qBAA6E,CAAC;IAClF,MAAM,cAAc,GAAG,mBAAmB,CAAC;QACzC,MAAM,EAAE,cAAc,EAAE;QACxB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;KACvE,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAG,2BAA2B,EAAE,CAAC;IAC3D,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAC;IACtD,IAAI,qBAAqB,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;IAClD,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACtD,qBAAqB,GAAG,OAAO,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACvC,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,oBAAoB,CAAC,aAAa;YAClD,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YACtC,CAAC,CAAC,IAAI;QACR,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,qBAAqB;KACjC,CAAC,CAAC;IACH,IAAI,CAAC;QACF,QAAiE,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CACT,aAAa,CAAC,KAAK,EAAE;QACnB,KAAK,EAAE;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,QAAQ;YACvB,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,QAAQ;SACrB;KACF,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAC3D,CAAC;IACF,MAAM,cAAc,GAAG,GAAY,EAAE,CACnC,qBAAqB,CAAC;QACpB,QAAQ;QACR,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,WAAW,EAAE,GAAG,EAAE,CAChB,QAAQ,CAAC,YAAY,KAAK,oBAAoB,CAAC,kBAAkB;KACpE,CAAC,CAAC;IACL,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,aAAa,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,aAAa;QAAE,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IACjD,IAAI,oBAAoB,GAAG,GAAS,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;IAChE,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACjF,IAAI,iBAAiB,KAAK,MAAM,IAAI,iBAAiB,KAAK,OAAO,EAAE,CAAC;QAClE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,IAAI,mBAAmB,EAAE,IAAI,IAAI,CAAC;IACrE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,YAAY,CAAC;IACjD,MAAM,YAAY,GAAG,0BAA0B,CAC7C,oBAAoB,EACpB,OAAO,CAAC,GAAG,EACX;QACE,SAAS;QACT,GAAG,EAAE,kBAAkB,EAAE,GAAG;QAC5B,OAAO,EAAE,kBAAkB,EAAE,OAAO;KACrC,CACF,CAAC;IACF,MAAM,oBAAoB,GAAG,qBAAqB,EAAE,CAAC;IACrD,MAAM,YAAY,GAA+C;QAC/D,OAAO,EAAE,SAAS;KACnB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE;QACvD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,IAAI;QAC7C,eAAe,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;QAC7C,mBAAmB,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;KAClD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY;QACZ,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,KAAK;QACzD,oBAAoB,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CACvD,aAAa,EAAE,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,KAAK;QACvE,SAAS,EAAE,wBAAwB,CAAC;YAClC,QAAQ;YACR,QAAQ,EAAE,iBAAiB;YAC3B,OAAO,EAAE,YAAY,CAAC,KAAK;SAC5B,CAAC;QACF,WAAW,EAAE,qBAAqB,CAAC,QAAQ,CAAC;QAC5C,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;IACH,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,qBAAqB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1C,IAAI,0BAA0B,CAAC,OAAO,CAAC;gBAAE,OAAO;YAChD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnD,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,QAAQ;QACR,SAAS;QACT,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;QACrC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,kBAAkB,GAAG,IAAI,EAAE,CAAC;KACtE,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM;QAClC,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAErD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,2BAA2B,CAAC;QACnD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CACT,aAAa,CACX,gBAAgB,EAChB,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAC3C,CACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;QAC7B,QAAQ;QACR,SAAS,EAAE,iBAAiB;QAC5B,oBAAoB;QACpB,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE;KAC1C,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC;QACtC,MAAM;QACN,SAAS,EAAE;YACT,GAAG,EAAE,CAAC,oBAAoB,EAAE;YAC5B,QAAQ,CAAC,OAAO;YAChB,KAAK,IAAI,EAAE;gBACT,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;YACD,cAAc;YACd,KAAK,IAAI,EAAE;gBACT,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,mBAAmB;qBACpD,QAAQ,CAAC,cAAc,CAAC;qBACxB,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;oBAC7C,OAAO,CAAC,IAAI,CACV,sCAAsC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CACzE,CAAC;gBACJ,CAAC;YACH,CAAC;SACF;QACD,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAC1D,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;gBACxC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrB,MAAM,EACN,SAAS;oBACP,CAAC,CAAC,yCAAyC;oBAC3C,CAAC,CAAC,qCAAqC,CAC1C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrB,MAAM,EACN,SAAS;oBACP,CAAC,CAAC,yCAAyC;oBAC3C,CAAC,CAAC,sBAAsB,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,CAAC,KAAK,CACX,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IAEjC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,IAAI,aAAa,EAAE,CAAC;QAClB,oBAAoB,GAAG,sBAAsB,CAC3C,aAAa,EACb,QAAQ,EACR,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,EACvC,cAAc,CACf,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,CAAC;IACX,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"start-tui-v2.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/start-tui-v2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** @jsxImportSource @opentui/react */
2
+ import { type ReactNode } from "react";
3
+ import type { AppServices } from "../../../ui-core/bootstrap/composition-root.js";
4
+ import type { Theme } from "../../../ui-core/rendering/theme.js";
5
+ export interface SubagentsPanelProps {
6
+ readonly services: AppServices;
7
+ readonly theme: Theme;
8
+ readonly width: number;
9
+ readonly blockingOverlay?: boolean | undefined;
10
+ }
11
+ export declare const SubagentsPanel: import("react").MemoExoticComponent<(props: SubagentsPanelProps) => ReactNode>;
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ /** @jsxImportSource @opentui/react */
3
+ import { memo, useEffect, useState } from "react";
4
+ import { TextAttributes } from "@opentui/core";
5
+ import { useSessionState } from "../../../ui-core/react/use-session-state.js";
6
+ import { orderSubagentRuns, subagentsBarVisible, watchSubagents } from "../../../ui-core/rendering/subagent-source.js";
7
+ import { openSubagentRun, SUBAGENT_STATUS_ICON } from "../../../ui-core/commands/subagent-commands.js";
8
+ const MAX_ROWS = 3;
9
+ function statusColor(run, theme) {
10
+ const status = SUBAGENT_STATUS_ICON[run.status];
11
+ if (status?.tone === "success")
12
+ return theme.success;
13
+ if (status?.tone === "error")
14
+ return theme.failedBg;
15
+ if (status?.tone === "warn")
16
+ return theme.accent;
17
+ return theme.muted;
18
+ }
19
+ export const SubagentsPanel = memo(function SubagentsPanel(props) {
20
+ const { services, theme, width, blockingOverlay } = props;
21
+ const session = useSessionState(services.session);
22
+ const manager = services.session.subagents;
23
+ const [collapsed, setCollapsed] = useState(true);
24
+ const [runs, setRuns] = useState(() => manager.list());
25
+ useEffect(() => {
26
+ const refresh = () => {
27
+ if (services.session.subagents !== manager)
28
+ return;
29
+ setRuns(manager.list());
30
+ };
31
+ refresh();
32
+ const stopManager = manager.subscribe(refresh);
33
+ const stopWatch = watchSubagents(manager, refresh);
34
+ const stopSession = services.session.subscribe(() => {
35
+ if (services.session.subagents === manager)
36
+ refresh();
37
+ else
38
+ setRuns([]);
39
+ });
40
+ return () => {
41
+ stopManager();
42
+ stopWatch();
43
+ stopSession();
44
+ };
45
+ }, [services.session, manager]);
46
+ if (blockingOverlay || !subagentsBarVisible(runs))
47
+ return null;
48
+ const ordered = orderSubagentRuns(runs);
49
+ const running = ordered.filter((run) => run.status === "running" || run.status === "stopping").length;
50
+ const settled = ordered.length - running;
51
+ const shown = ordered.slice(0, MAX_ROWS);
52
+ const hidden = Math.max(0, ordered.length - shown.length);
53
+ const stateColor = running > 0 ? theme.cyan : settled > 0 ? theme.success : theme.muted;
54
+ const header = `${collapsed ? "▸" : "▾"} Subagents: ${running} running · ${settled} done`;
55
+ function toggle(event) {
56
+ event.preventDefault();
57
+ event.stopPropagation();
58
+ setCollapsed((value) => !value);
59
+ }
60
+ return (_jsxs("box", { border: true, borderStyle: "rounded", style: {
61
+ flexDirection: "column",
62
+ width,
63
+ flexShrink: 0,
64
+ borderColor: stateColor,
65
+ backgroundColor: theme.statusBackground,
66
+ paddingLeft: 1,
67
+ paddingRight: 1,
68
+ }, children: [_jsx("box", { onMouseDown: toggle, style: { width: "100%", height: 1, flexShrink: 0 }, children: _jsx("text", { content: header, wrapMode: "none", style: { width: "100%", height: 1, fg: stateColor, attributes: TextAttributes.BOLD } }) }), !collapsed
69
+ ? shown.map((run) => {
70
+ const icon = SUBAGENT_STATUS_ICON[run.status]?.icon ?? "•";
71
+ const route = `${run.activeProvider ?? run.provider}/${run.activeModel ?? run.model}`;
72
+ return (_jsxs("box", { onMouseDown: (event) => {
73
+ event.preventDefault();
74
+ event.stopPropagation();
75
+ openSubagentRun(services, manager, run.id);
76
+ }, style: { flexDirection: "column", width: "100%", flexShrink: 0 }, children: [_jsx("text", { content: ` ${icon} ${run.title}`, wrapMode: "none", style: { width: "100%", height: 1, fg: statusColor(run, theme) } }), _jsx("text", { content: ` ${run.status} · ${route}`, wrapMode: "none", style: { width: "100%", height: 1, fg: theme.muted } })] }, `${run.id}:${run.attempt}`));
77
+ })
78
+ : null, !collapsed && hidden > 0 ? (_jsx("text", { content: ` +${hidden} more · /agents`, wrapMode: "none", style: { width: "100%", height: 1, fg: theme.muted } })) : null] }));
79
+ });
80
+ //# sourceMappingURL=subagents-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagents-panel.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/jobs/subagents-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { KeysEditorAnswer } from "../../../ui-core/controllers/overlay-controller.js";
2
+ export interface KeysModalPickRow {
3
+ readonly slotId?: string | undefined;
4
+ readonly placeholder: string;
5
+ readonly text: string;
6
+ readonly disabled: boolean;
7
+ }
8
+ export declare function buildKeysPickerAnswer(rows: readonly KeysModalPickRow[], activeIndex: number): KeysEditorAnswer;
9
+ export declare function keysAddAtCapacity(rows: readonly KeysModalPickRow[], maxRows: number): boolean;
@@ -0,0 +1,15 @@
1
+ export function buildKeysPickerAnswer(rows, activeIndex) {
2
+ return {
3
+ action: "pick",
4
+ rows: rows.map((row) => ({
5
+ ...(row.slotId ? { slotId: row.slotId } : {}),
6
+ value: row.text.trim() || row.placeholder,
7
+ disabled: row.disabled,
8
+ })),
9
+ activeIndex,
10
+ };
11
+ }
12
+ export function keysAddAtCapacity(rows, maxRows) {
13
+ return rows.filter((row) => row.slotId !== undefined || row.text.trim().length > 0).length >= maxRows;
14
+ }
15
+ //# sourceMappingURL=keys-modal-pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys-modal-pick.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/keys-modal-pick.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,qBAAqB,CACnC,IAAiC,EACjC,WAAmB;IAEnB,OAAO;QACL,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,WAAW;YACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QACH,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAiC,EACjC,OAAe;IAEf,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;AACxG,CAAC"}
@@ -5,6 +5,7 @@ import { useKeyboard } from "@opentui/react";
5
5
  import { TextAttributes } from "@opentui/core";
6
6
  import { chordFromKeyEvent } from "../../input/chord-from-opentui-key.js";
7
7
  import { MAX_PROVIDER_KEYS } from "../../../llm/key-rotation.js";
8
+ import { buildKeysPickerAnswer, keysAddAtCapacity } from "./keys-modal-pick.js";
8
9
  const ACCENT = "#e0b000";
9
10
  const ACTIVE_FG = "#f5c542";
10
11
  let nextRowId = 1;
@@ -13,6 +14,15 @@ function itemLabelOf(request) {
13
14
  }
14
15
  function rowsFromRequest(request) {
15
16
  const label = itemLabelOf(request);
17
+ if (request.addViaPicker) {
18
+ return request.initialKeys.map((k) => ({
19
+ id: nextRowId++,
20
+ slotId: k.id,
21
+ placeholder: k.masked,
22
+ text: "",
23
+ disabled: k.disabled === true,
24
+ }));
25
+ }
16
26
  if (request.initialKeys.length === 0) {
17
27
  return [{ id: nextRowId++, placeholder: `paste ${label}`, text: "", disabled: false }];
18
28
  }
@@ -81,9 +91,13 @@ export function KeysModal(props) {
81
91
  }
82
92
  function addRow() {
83
93
  const synced = syncFromInputs();
84
- const nonEmpty = synced.filter((r) => r.slotId || r.text.trim().length > 0);
85
- if (nonEmpty.length >= MAX_PROVIDER_KEYS) {
86
- services.session.notice("warn", `at most ${MAX_PROVIDER_KEYS} ${itemLabelPlural} per provider`);
94
+ const maxRows = request.maxRows ?? MAX_PROVIDER_KEYS;
95
+ if (keysAddAtCapacity(synced, maxRows)) {
96
+ services.session.notice("warn", `at most ${maxRows} ${itemLabelPlural} per provider`);
97
+ return;
98
+ }
99
+ if (request.addViaPicker) {
100
+ services.overlay.answerKeys(buildKeysPickerAnswer(synced, activeKeyIdx));
87
101
  return;
88
102
  }
89
103
  const next = [
@@ -95,6 +109,12 @@ export function KeysModal(props) {
95
109
  }
96
110
  function removeRow(index) {
97
111
  const synced = syncFromInputs();
112
+ if (request.addViaPicker && synced.length <= 1) {
113
+ setRows([]);
114
+ setFocusIdx(0);
115
+ setActiveKeyIdx(0);
116
+ return;
117
+ }
98
118
  if (synced.length <= 1) {
99
119
  const only = {
100
120
  id: nextRowId++,
@@ -131,7 +151,7 @@ export function KeysModal(props) {
131
151
  const synced = syncFromInputs();
132
152
  const out = [];
133
153
  for (const row of synced) {
134
- const value = row.text.trim();
154
+ const value = request.addViaPicker ? row.text.trim() || row.placeholder : row.text.trim();
135
155
  if (row.slotId) {
136
156
  out.push({ slotId: row.slotId, value, disabled: row.disabled });
137
157
  }
@@ -168,9 +188,17 @@ export function KeysModal(props) {
168
188
  resetAll();
169
189
  return;
170
190
  }
171
- if (chord === "ctrl+enter" || chord === "meta+enter" || chord === "enter") {
191
+ if (chord === "ctrl+enter" || chord === "meta+enter") {
172
192
  key.preventDefault();
173
193
  submit();
194
+ return;
195
+ }
196
+ if (chord === "enter") {
197
+ key.preventDefault();
198
+ if (request.addViaPicker)
199
+ addRow();
200
+ else
201
+ submit();
174
202
  }
175
203
  });
176
204
  const typedCount = rows.filter((r) => r.text.trim().length > 0).length;
@@ -188,9 +216,11 @@ export function KeysModal(props) {
188
216
  fg: theme.background,
189
217
  bg: ACCENT,
190
218
  attributes: TextAttributes.BOLD,
191
- }, children: ` ${request.heading ?? "KEYS"} ` }), _jsx("text", { content: " " }), _jsxs("text", { style: { fg: theme.muted, attributes: TextAttributes.DIM }, children: [request.provider, " \u00B7 multi ", itemLabelPlural, " \u00B7 empty existing = keep"] })] }), _jsx("text", { content: existingCount > 0
192
- ? `${existingCount} stored · type to replace a slot · + adds another (max ${MAX_PROVIDER_KEYS})${showActiveToggle ? " · ★ = active" : ""}`
193
- : `Nothing stored yet · paste one or more ${itemLabelPlural} (max ${MAX_PROVIDER_KEYS})`, style: { fg: theme.muted, attributes: TextAttributes.DIM } }), rows.map((row, index) => {
219
+ }, children: ` ${request.heading ?? "KEYS"} ` }), _jsx("text", { content: " " }), _jsxs("text", { style: { fg: theme.muted, attributes: TextAttributes.DIM }, children: [request.provider, " \u00B7 multi ", itemLabelPlural, " \u00B7 empty existing = keep"] })] }), _jsx("text", { content: request.addViaPicker
220
+ ? `${existingCount} stored · choose models from the catalogue${showActiveToggle ? " · ★ = active" : ""}`
221
+ : existingCount > 0
222
+ ? `${existingCount} stored · type to replace a slot · + adds another (max ${MAX_PROVIDER_KEYS})${showActiveToggle ? " · ★ = active" : ""}`
223
+ : `Nothing stored yet · paste one or more ${itemLabelPlural} (max ${MAX_PROVIDER_KEYS})`, style: { fg: theme.muted, attributes: TextAttributes.DIM } }), rows.map((row, index) => {
194
224
  const isExisting = Boolean(row.slotId);
195
225
  const isActive = isExisting && index === activeKeyIdx;
196
226
  return (_jsxs("box", { style: { flexDirection: "row", width: "100%", alignItems: "center" }, children: [_jsx("text", { content: `${index + 1}. `, style: { fg: theme.muted, width: 4, flexShrink: 0 } }), _jsx("text", { content: row.disabled ? " ⊘ " : " ○ ", style: {
@@ -205,19 +235,23 @@ export function KeysModal(props) {
205
235
  }, onMouseDown: () => {
206
236
  if (isExisting)
207
237
  setActiveKeyIdx(index);
208
- } })) : null, _jsx("input", { ref: (el) => {
238
+ } })) : null, request.addViaPicker ? (_jsx("text", { content: row.placeholder, style: {
239
+ fg: row.disabled ? theme.muted : theme.foreground,
240
+ flexGrow: 1,
241
+ minWidth: 20,
242
+ } })) : (_jsx("input", { ref: (el) => {
209
243
  inputRefs.current.set(row.id, el);
210
244
  }, focused: focusIdx === index, placeholder: row.placeholder, onContentChange: () => {
211
245
  const el = inputRefs.current.get(row.id);
212
246
  updateRowText(row.id, el?.plainText ?? "");
213
247
  setFocusIdx(index);
214
- }, backgroundColor: theme.background, textColor: row.disabled ? theme.muted : theme.foreground, focusedBackgroundColor: theme.background, focusedTextColor: row.disabled ? theme.muted : theme.foreground, cursorColor: ACCENT, style: { flexGrow: 1, minWidth: 20 } }), _jsx("text", { content: " " }), _jsx("text", { content: " \u2715 ", style: {
248
+ }, backgroundColor: theme.background, textColor: row.disabled ? theme.muted : theme.foreground, focusedBackgroundColor: theme.background, focusedTextColor: row.disabled ? theme.muted : theme.foreground, cursorColor: ACCENT, style: { flexGrow: 1, minWidth: 20 } })), _jsx("text", { content: " " }), _jsx("text", { content: " \u2715 ", style: {
215
249
  fg: theme.white,
216
250
  bg: theme.failedBg,
217
251
  attributes: TextAttributes.BOLD,
218
252
  flexShrink: 0,
219
253
  }, onMouseDown: () => removeRow(index) })] }, row.id));
220
- }), _jsxs("box", { style: { flexDirection: "row", width: "100%" }, children: [_jsx("text", { content: " + add ", style: {
254
+ }), _jsxs("box", { style: { flexDirection: "row", width: "100%" }, children: [_jsx("text", { content: request.addViaPicker ? " + add from models " : " + add ", style: {
221
255
  fg: theme.background,
222
256
  bg: ACCENT,
223
257
  attributes: TextAttributes.BOLD,
@@ -229,6 +263,6 @@ export function KeysModal(props) {
229
263
  fg: theme.white,
230
264
  bg: theme.failedBg,
231
265
  attributes: TextAttributes.BOLD,
232
- }, onMouseDown: () => resetAll() }), _jsx("text", { content: " " }), _jsx("text", { content: " Cancel ", style: { fg: theme.foreground, bg: theme.chip }, onMouseDown: () => services.overlay.answerKeys(undefined) })] }), _jsx("text", { content: `enter:save · ^a / +:add · ✕:remove${showActiveToggle ? " · ★:set active" : ""} · ^d / ○:disable · ^r:reset all · esc:cancel${typedCount ? ` · ${typedCount} new/edited` : ""}`, style: { fg: theme.muted, attributes: TextAttributes.DIM } })] }));
266
+ }, onMouseDown: () => resetAll() }), _jsx("text", { content: " " }), _jsx("text", { content: " Cancel ", style: { fg: theme.foreground, bg: theme.chip }, onMouseDown: () => services.overlay.answerKeys(undefined) })] }), _jsx("text", { content: `${request.addViaPicker ? "enter:add from models · ^a:add from models" : "enter:save · ^a / +:add"} · ✕:remove${showActiveToggle ? " · ★:set active" : ""} · ^d / ○:disable · ^r:reset all · esc:cancel${typedCount ? ` · ${typedCount} new/edited` : ""}`, style: { fg: theme.muted, attributes: TextAttributes.DIM } })] }));
233
267
  }
234
268
  //# sourceMappingURL=keys-modal.js.map