cli-jaw 2.1.1 → 2.1.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 (355) hide show
  1. package/README.ja.md +8 -6
  2. package/README.ko.md +8 -6
  3. package/README.md +12 -6
  4. package/README.zh-CN.md +8 -6
  5. package/dist/bin/cli-jaw.js +5 -1
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser.js +1 -1
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/chat.js +98 -58
  10. package/dist/bin/commands/chat.js.map +1 -1
  11. package/dist/bin/commands/dispatch.js +130 -5
  12. package/dist/bin/commands/dispatch.js.map +1 -1
  13. package/dist/bin/commands/goal.js +18 -6
  14. package/dist/bin/commands/goal.js.map +1 -1
  15. package/dist/bin/commands/orchestrate.js.map +1 -1
  16. package/dist/bin/commands/tui/fullscreen-mode.js +237 -0
  17. package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -0
  18. package/dist/bin/commands/tui/input-handler.js +139 -52
  19. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  20. package/dist/bin/commands/tui/overlays.js +177 -70
  21. package/dist/bin/commands/tui/overlays.js.map +1 -1
  22. package/dist/bin/commands/tui/renderer.js +70 -20
  23. package/dist/bin/commands/tui/renderer.js.map +1 -1
  24. package/dist/bin/commands/tui/simple-mode.js +1 -1
  25. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  26. package/dist/bin/commands/tui/tui-io.js +8 -0
  27. package/dist/bin/commands/tui/tui-io.js.map +1 -0
  28. package/dist/bin/commands/tui/types.js +9 -0
  29. package/dist/bin/commands/tui/types.js.map +1 -1
  30. package/dist/bin/commands/tui/ws-handler.js +115 -23
  31. package/dist/bin/commands/tui/ws-handler.js.map +1 -1
  32. package/dist/bin/commands/worker.js +159 -0
  33. package/dist/bin/commands/worker.js.map +1 -0
  34. package/dist/bin/postinstall.js +0 -76
  35. package/dist/bin/postinstall.js.map +1 -1
  36. package/dist/lib/mcp/format-converters.js +21 -2
  37. package/dist/lib/mcp/format-converters.js.map +1 -1
  38. package/dist/lib/mcp/mcp-registry.js +75 -0
  39. package/dist/lib/mcp/mcp-registry.js.map +1 -0
  40. package/dist/lib/stt.js +1 -1
  41. package/dist/lib/stt.js.map +1 -1
  42. package/dist/scripts/fresh-install-smoke.js +1 -1
  43. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  44. package/dist/server.js +27 -6
  45. package/dist/server.js.map +1 -1
  46. package/dist/src/agent/args.js +33 -1
  47. package/dist/src/agent/args.js.map +1 -1
  48. package/dist/src/agent/claude-e-runtime.js +1 -1
  49. package/dist/src/agent/claude-e-runtime.js.map +1 -1
  50. package/dist/src/agent/codex-app-client.js +1 -1
  51. package/dist/src/agent/error-classifier.js +6 -1
  52. package/dist/src/agent/error-classifier.js.map +1 -1
  53. package/dist/src/agent/events/claude.js +1 -0
  54. package/dist/src/agent/events/claude.js.map +1 -1
  55. package/dist/src/agent/events/codex.js +0 -44
  56. package/dist/src/agent/events/codex.js.map +1 -1
  57. package/dist/src/agent/events/helpers.js +52 -5
  58. package/dist/src/agent/events/helpers.js.map +1 -1
  59. package/dist/src/agent/events/opencode.js +6 -2
  60. package/dist/src/agent/events/opencode.js.map +1 -1
  61. package/dist/src/agent/events/summary.js +3 -2
  62. package/dist/src/agent/events/summary.js.map +1 -1
  63. package/dist/src/agent/events/tool-labels.js +8 -5
  64. package/dist/src/agent/events/tool-labels.js.map +1 -1
  65. package/dist/src/agent/kiro-auth.js +213 -0
  66. package/dist/src/agent/kiro-auth.js.map +1 -0
  67. package/dist/src/agent/kiro-models.js +79 -0
  68. package/dist/src/agent/kiro-models.js.map +1 -0
  69. package/dist/src/agent/kiro-runtime.js +306 -0
  70. package/dist/src/agent/kiro-runtime.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +190 -12
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/memory-flush-controller.js +1 -3
  74. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  75. package/dist/src/agent/resume-classifier.js +18 -1
  76. package/dist/src/agent/resume-classifier.js.map +1 -1
  77. package/dist/src/agent/session-persistence.js +1 -1
  78. package/dist/src/agent/session-persistence.js.map +1 -1
  79. package/dist/src/agent/smoke-detector.js +3 -0
  80. package/dist/src/agent/smoke-detector.js.map +1 -1
  81. package/dist/src/agent/spawn/queue.js +10 -4
  82. package/dist/src/agent/spawn/queue.js.map +1 -1
  83. package/dist/src/agent/spawn/resume.js +6 -1
  84. package/dist/src/agent/spawn/resume.js.map +1 -1
  85. package/dist/src/agent/spawn-env.js +1 -1
  86. package/dist/src/agent/spawn-env.js.map +1 -1
  87. package/dist/src/agent/spawn.js +188 -28
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/browser/web-ai/grok-live.js +2 -0
  90. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  91. package/dist/src/cli/claude-models.js +2 -2
  92. package/dist/src/cli/claude-models.js.map +1 -1
  93. package/dist/src/cli/commands.js +3 -2
  94. package/dist/src/cli/commands.js.map +1 -1
  95. package/dist/src/cli/handlers-runtime.js +2 -0
  96. package/dist/src/cli/handlers-runtime.js.map +1 -1
  97. package/dist/src/cli/handlers-workflows.js +9 -4
  98. package/dist/src/cli/handlers-workflows.js.map +1 -1
  99. package/dist/src/cli/handlers.js +47 -7
  100. package/dist/src/cli/handlers.js.map +1 -1
  101. package/dist/src/cli/readiness.js +17 -1
  102. package/dist/src/cli/readiness.js.map +1 -1
  103. package/dist/src/cli/registry-live.js +17 -0
  104. package/dist/src/cli/registry-live.js.map +1 -0
  105. package/dist/src/cli/registry.js +44 -3
  106. package/dist/src/cli/registry.js.map +1 -1
  107. package/dist/src/cli/tui/composer.js +135 -5
  108. package/dist/src/cli/tui/composer.js.map +1 -1
  109. package/dist/src/cli/tui/diffview.js +41 -0
  110. package/dist/src/cli/tui/diffview.js.map +1 -0
  111. package/dist/src/cli/tui/editor.js +45 -0
  112. package/dist/src/cli/tui/editor.js.map +1 -0
  113. package/dist/src/cli/tui/file-mention.js +78 -0
  114. package/dist/src/cli/tui/file-mention.js.map +1 -0
  115. package/dist/src/cli/tui/highlight.js +82 -0
  116. package/dist/src/cli/tui/highlight.js.map +1 -0
  117. package/dist/src/cli/tui/keymap.js +21 -0
  118. package/dist/src/cli/tui/keymap.js.map +1 -1
  119. package/dist/src/cli/tui/markdown.js +124 -0
  120. package/dist/src/cli/tui/markdown.js.map +1 -0
  121. package/dist/src/cli/tui/mode.js +26 -0
  122. package/dist/src/cli/tui/mode.js.map +1 -0
  123. package/dist/src/cli/tui/overlay.js +121 -98
  124. package/dist/src/cli/tui/overlay.js.map +1 -1
  125. package/dist/src/cli/tui/render/frame.js +72 -0
  126. package/dist/src/cli/tui/render/frame.js.map +1 -0
  127. package/dist/src/cli/tui/render/layout.js +22 -0
  128. package/dist/src/cli/tui/render/layout.js.map +1 -0
  129. package/dist/src/cli/tui/render/mouse.js +25 -0
  130. package/dist/src/cli/tui/render/mouse.js.map +1 -0
  131. package/dist/src/cli/tui/render/scheduler.js +37 -0
  132. package/dist/src/cli/tui/render/scheduler.js.map +1 -0
  133. package/dist/src/cli/tui/render/viewport.js +82 -0
  134. package/dist/src/cli/tui/render/viewport.js.map +1 -0
  135. package/dist/src/cli/tui/renderers.js +37 -0
  136. package/dist/src/cli/tui/renderers.js.map +1 -1
  137. package/dist/src/cli/tui/stream.js +48 -0
  138. package/dist/src/cli/tui/stream.js.map +1 -0
  139. package/dist/src/cli/tui/text-buffer.js +143 -0
  140. package/dist/src/cli/tui/text-buffer.js.map +1 -0
  141. package/dist/src/cli/tui/theme.js +128 -0
  142. package/dist/src/cli/tui/theme.js.map +1 -0
  143. package/dist/src/cli/tui/transcript.js +4 -0
  144. package/dist/src/cli/tui/transcript.js.map +1 -1
  145. package/dist/src/command-contract/help-renderer.js +1 -1
  146. package/dist/src/command-contract/help-renderer.js.map +1 -1
  147. package/dist/src/core/cli-detection.js +14 -0
  148. package/dist/src/core/cli-detection.js.map +1 -1
  149. package/dist/src/core/config.js +5 -0
  150. package/dist/src/core/config.js.map +1 -1
  151. package/dist/src/core/db.js +7 -0
  152. package/dist/src/core/db.js.map +1 -1
  153. package/dist/src/core/employees.js +2 -2
  154. package/dist/src/core/employees.js.map +1 -1
  155. package/dist/src/discord/bot.js.map +1 -1
  156. package/dist/src/discord/discord-file.js +1 -1
  157. package/dist/src/discord/discord-file.js.map +1 -1
  158. package/dist/src/discord/send-only-client.js +1 -3
  159. package/dist/src/discord/send-only-client.js.map +1 -1
  160. package/dist/src/goal/heartbeat.js +30 -7
  161. package/dist/src/goal/heartbeat.js.map +1 -1
  162. package/dist/src/goal/store.js +6 -2
  163. package/dist/src/goal/store.js.map +1 -1
  164. package/dist/src/ide/diff.js +37 -0
  165. package/dist/src/ide/diff.js.map +1 -1
  166. package/dist/src/manager/launchd-service.js +1 -1
  167. package/dist/src/manager/launchd-service.js.map +1 -1
  168. package/dist/src/manager/lifecycle-helpers.js +14 -0
  169. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  170. package/dist/src/manager/lifecycle.js +49 -4
  171. package/dist/src/manager/lifecycle.js.map +1 -1
  172. package/dist/src/manager/notes/routes.js +0 -31
  173. package/dist/src/manager/notes/routes.js.map +1 -1
  174. package/dist/src/manager/notes/ws.js.map +1 -1
  175. package/dist/src/manager/registry.js.map +1 -1
  176. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  177. package/dist/src/manager/scan.js +36 -1
  178. package/dist/src/manager/scan.js.map +1 -1
  179. package/dist/src/manager/server.js +21 -2
  180. package/dist/src/manager/server.js.map +1 -1
  181. package/dist/src/manager/systemd-service.js +1 -1
  182. package/dist/src/manager/systemd-service.js.map +1 -1
  183. package/dist/src/memory/keyword-expand.js +0 -187
  184. package/dist/src/memory/keyword-expand.js.map +1 -1
  185. package/dist/src/memory/runtime.js +2 -2
  186. package/dist/src/memory/runtime.js.map +1 -1
  187. package/dist/src/memory/shared.js.map +1 -1
  188. package/dist/src/orchestrator/collect.js +3 -2
  189. package/dist/src/orchestrator/collect.js.map +1 -1
  190. package/dist/src/orchestrator/distribute.js +7 -1
  191. package/dist/src/orchestrator/distribute.js.map +1 -1
  192. package/dist/src/orchestrator/friction.js +59 -0
  193. package/dist/src/orchestrator/friction.js.map +1 -0
  194. package/dist/src/orchestrator/pipeline.js +88 -45
  195. package/dist/src/orchestrator/pipeline.js.map +1 -1
  196. package/dist/src/orchestrator/sanitize.js +19 -0
  197. package/dist/src/orchestrator/sanitize.js.map +1 -0
  198. package/dist/src/orchestrator/seed.js +50 -0
  199. package/dist/src/orchestrator/seed.js.map +1 -0
  200. package/dist/src/orchestrator/state-machine.js +206 -74
  201. package/dist/src/orchestrator/state-machine.js.map +1 -1
  202. package/dist/src/orchestrator/worker-monitor.js +1 -1
  203. package/dist/src/orchestrator/worker-monitor.js.map +1 -1
  204. package/dist/src/orchestrator/worker-progress.js +29 -0
  205. package/dist/src/orchestrator/worker-progress.js.map +1 -0
  206. package/dist/src/orchestrator/worker-registry.js +63 -2
  207. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  208. package/dist/src/prompt/builder.js +19 -29
  209. package/dist/src/prompt/builder.js.map +1 -1
  210. package/dist/src/prompt/templates/a1-system.md +40 -5
  211. package/dist/src/prompt/templates/control-system.md +2 -2
  212. package/dist/src/prompt/templates/employee.md +4 -1
  213. package/dist/src/prompt/templates/orchestration.md +23 -8
  214. package/dist/src/routes/employees.js +4 -4
  215. package/dist/src/routes/employees.js.map +1 -1
  216. package/dist/src/routes/goal.js +11 -3
  217. package/dist/src/routes/goal.js.map +1 -1
  218. package/dist/src/routes/heartbeat.js +1 -1
  219. package/dist/src/routes/heartbeat.js.map +1 -1
  220. package/dist/src/routes/i18n.js +1 -1
  221. package/dist/src/routes/i18n.js.map +1 -1
  222. package/dist/src/routes/jaw-memory.js +1 -1
  223. package/dist/src/routes/jaw-memory.js.map +1 -1
  224. package/dist/src/routes/memory.js.map +1 -1
  225. package/dist/src/routes/messaging.js.map +1 -1
  226. package/dist/src/routes/orchestrate.js +265 -116
  227. package/dist/src/routes/orchestrate.js.map +1 -1
  228. package/dist/src/routes/quota-agy-reverse.js +0 -5
  229. package/dist/src/routes/quota-agy-reverse.js.map +1 -1
  230. package/dist/src/routes/quota-kiro-reverse.js +187 -0
  231. package/dist/src/routes/quota-kiro-reverse.js.map +1 -0
  232. package/dist/src/routes/settings.js +31 -2
  233. package/dist/src/routes/settings.js.map +1 -1
  234. package/dist/src/routes/skills.js.map +1 -1
  235. package/dist/src/security/security-audit-log.js.map +1 -1
  236. package/dist/src/shared/shell-command-display.js +51 -0
  237. package/dist/src/shared/shell-command-display.js.map +1 -0
  238. package/dist/src/telegram/bot.js.map +1 -1
  239. package/dist/src/trace/store.js +32 -0
  240. package/dist/src/trace/store.js.map +1 -1
  241. package/dist/src/types/cli-engine.js +1 -0
  242. package/dist/src/types/cli-engine.js.map +1 -1
  243. package/dist/src/workflows/employee-boundary.js +7 -7
  244. package/dist/src/workflows/employee-boundary.js.map +1 -1
  245. package/dist/src/workflows/handoff.js +16 -16
  246. package/dist/src/workflows/handoff.js.map +1 -1
  247. package/dist/src/workflows/scope-sandbox.js +46 -0
  248. package/dist/src/workflows/scope-sandbox.js.map +1 -0
  249. package/package.json +1 -1
  250. package/public/assets/providers/kiro-color.svg +15 -0
  251. package/public/assets/providers/kiro.svg +14 -0
  252. package/public/css/modals.css +79 -0
  253. package/public/css/sidebar.css +85 -0
  254. package/public/css/variables.css +2 -2
  255. package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DkH7eoHd.js} +1 -1
  256. package/public/dist/assets/{DocPanel-C1pGgE-S.js → DocPanel-BU16GUlB.js} +1 -1
  257. package/public/dist/assets/DocPanel-gU-WkgyA.css +1 -0
  258. package/public/dist/assets/Employees-F0ssNuO-.js +1 -0
  259. package/public/dist/assets/Heartbeat-C3JS6gkF.js +1 -0
  260. package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
  261. package/public/dist/assets/{Memory-BgN8djV4.js → Memory-C-EQubN2.js} +1 -1
  262. package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-BD2KrypI.js} +1 -1
  263. package/public/dist/assets/agent-meta-B1098B_a.js +1 -0
  264. package/public/dist/assets/app-ByHYOMZE.js +48 -0
  265. package/public/dist/assets/app-CYdhP6Vh.css +1 -0
  266. package/public/dist/assets/constants-s2UJodER.js +1 -0
  267. package/public/dist/assets/{employees-DiNLzEXS.js → employees-_A-p_bZg.js} +7 -7
  268. package/public/dist/assets/idb-cache-0LNMskFB.js +1 -0
  269. package/public/dist/assets/idb-cache-5H89a4l8.js +1 -0
  270. package/public/dist/assets/{manager-DyrwJLZr.css → manager-B2qEQRxN.css} +1 -1
  271. package/public/dist/assets/manager-CR9BA-wO.js +12 -0
  272. package/public/dist/assets/memory-D1RKYvyu.js +1 -0
  273. package/public/dist/assets/{memory-B_nn0A4v.js → memory-D9AUn8fG.js} +9 -9
  274. package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-CVVK5xUP.js} +35 -6
  275. package/public/dist/assets/{render-CgDEBoCX.js → render-DFBujF8n.js} +4 -4
  276. package/public/dist/assets/settings-B4ZkeaU-.js +1 -0
  277. package/public/dist/assets/settings-D9jTceN0.js +151 -0
  278. package/public/dist/assets/sidebar-DPPRNiTc.js +48 -0
  279. package/public/dist/assets/skills-8nHJkv-r.js +1 -0
  280. package/public/dist/assets/{skills-COa4iSwL.js → skills-BDVLIrVT.js} +6 -6
  281. package/public/dist/assets/{slash-commands-C_ePvrPi.js → slash-commands-C5da3q1p.js} +1 -1
  282. package/public/dist/assets/slash-commands-RJWO8wJZ.js +1 -0
  283. package/public/dist/assets/{trace-drawer-CY4z_Ie8.js → trace-drawer-5kqBzFMk.js} +1 -1
  284. package/public/dist/assets/ui-Crnp79bG.js +142 -0
  285. package/public/dist/assets/ui-HtSKByR3.js +1 -0
  286. package/public/dist/index.html +113 -86
  287. package/public/dist/manager/index.html +2 -2
  288. package/public/index.html +111 -84
  289. package/public/js/constants.ts +30 -7
  290. package/public/js/features/chat-search.ts +5 -1
  291. package/public/js/features/employees.ts +7 -2
  292. package/public/js/features/idb-cache.ts +4 -0
  293. package/public/js/features/message-history.ts +55 -7
  294. package/public/js/features/pending-queue.ts +8 -2
  295. package/public/js/features/process-block.ts +32 -17
  296. package/public/js/features/process-log-adapter.ts +11 -2
  297. package/public/js/features/settings-cli-status-render.ts +163 -0
  298. package/public/js/features/settings-cli-status.ts +130 -185
  299. package/public/js/features/settings-core.ts +5 -1
  300. package/public/js/features/settings-mcp.ts +513 -7
  301. package/public/js/features/settings.ts +1 -1
  302. package/public/js/features/tool-ui.ts +18 -4
  303. package/public/js/features/transport-status-row.ts +3 -0
  304. package/public/js/main.ts +3 -0
  305. package/public/js/preview-parent-origin.ts +14 -0
  306. package/public/js/provider-icons.ts +6 -1
  307. package/public/js/render/file-links.ts +10 -2
  308. package/public/js/ui.ts +5 -2
  309. package/public/js/virtual-scroll.ts +19 -0
  310. package/public/js/ws.ts +133 -8
  311. package/public/locales/en.json +8 -2
  312. package/public/locales/ja.json +8 -2
  313. package/public/locales/ko.json +8 -2
  314. package/public/locales/zh.json +8 -2
  315. package/public/manager/src/App.tsx +13 -70
  316. package/public/manager/src/InstancePreview.tsx +36 -11
  317. package/public/manager/src/SidebarRailRouter.tsx +1 -1
  318. package/public/manager/src/doc-panel/DocPanel.tsx +14 -1
  319. package/public/manager/src/doc-panel/doc-panel.css +16 -0
  320. package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
  321. package/public/manager/src/manager-components.css +1 -1
  322. package/public/manager/src/manager-polish.css +1 -1
  323. package/public/manager/src/manager-shortcut-runner.ts +107 -0
  324. package/public/manager/src/manager-shortcuts.ts +15 -0
  325. package/public/manager/src/panels/desktop-bridge.ts +2 -0
  326. package/public/manager/src/settings/SettingsSidebar.tsx +1 -1
  327. package/public/manager/src/settings/components/sidebar-filter.ts +2 -0
  328. package/public/manager/src/settings/pages/Mcp.tsx +311 -43
  329. package/public/manager/src/settings/pages/components/McpServerCard.tsx +89 -55
  330. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +29 -6
  331. package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
  332. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
  333. package/public/manager/src/settings/pages/mcp-helpers.ts +54 -12
  334. package/public/manager/src/settings/types.ts +1 -0
  335. package/public/manager/src/types.ts +2 -1
  336. package/scripts/fresh-install-smoke.ts +1 -1
  337. package/public/dist/assets/DocPanel-CL1scIfq.css +0 -1
  338. package/public/dist/assets/Employees-BL9MAzzx.js +0 -1
  339. package/public/dist/assets/Heartbeat-D64JCg4t.js +0 -1
  340. package/public/dist/assets/Mcp-wYwJA_61.js +0 -3
  341. package/public/dist/assets/agent-meta-BhEbjy4P.js +0 -1
  342. package/public/dist/assets/app-2Rz848bQ.js +0 -48
  343. package/public/dist/assets/app-BW-Xz2p6.css +0 -1
  344. package/public/dist/assets/constants-ahKI_aEG.js +0 -1
  345. package/public/dist/assets/idb-cache-BnZfG5FD.js +0 -1
  346. package/public/dist/assets/idb-cache-CZ3JdK8r.js +0 -1
  347. package/public/dist/assets/manager-CfyZloIP.js +0 -12
  348. package/public/dist/assets/memory-CCjNFWmO.js +0 -1
  349. package/public/dist/assets/settings-CY_6tGuS.js +0 -1
  350. package/public/dist/assets/settings-DWW4GzNc.js +0 -66
  351. package/public/dist/assets/sidebar-DQKE5IA1.js +0 -23
  352. package/public/dist/assets/skills-DYTlqoke.js +0 -1
  353. package/public/dist/assets/slash-commands-D7CU5oso.js +0 -1
  354. package/public/dist/assets/ui-Car1OUvV.js +0 -1
  355. package/public/dist/assets/ui-DK_9ndj0.js +0 -140
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Full-screen region solver (Phase 4). Footer + composer fixed; transcript fills rest.
3
+ */
4
+ export function solveLayout(cols, rows, composerLines, headerLines = 0) {
5
+ const safeCols = Math.max(20, cols);
6
+ const safeRows = Math.max(4, rows);
7
+ const footerH = 1;
8
+ const composerH = Math.max(1, Math.min(composerLines, safeRows - footerH - 1));
9
+ const headerH = Math.max(0, Math.min(headerLines, safeRows - footerH - composerH - 1));
10
+ const transcriptH = Math.max(1, safeRows - headerH - composerH - footerH);
11
+ const headerY = 1;
12
+ const transcriptY = headerY + headerH;
13
+ const composerY = transcriptY + transcriptH;
14
+ const footerY = composerY + composerH;
15
+ return {
16
+ header: { x: 1, y: headerY, width: safeCols, height: headerH },
17
+ transcript: { x: 1, y: transcriptY, width: safeCols, height: transcriptH },
18
+ composer: { x: 1, y: composerY, width: safeCols, height: composerH },
19
+ footer: { x: 1, y: footerY, width: safeCols, height: footerH },
20
+ };
21
+ }
22
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../../src/cli/tui/render/layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,MAAM,UAAU,WAAW,CACvB,IAAY,EACZ,IAAY,EACZ,aAAqB,EACrB,WAAW,GAAG,CAAC;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IACtC,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAEtC,OAAO;QACH,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAC9D,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;QAC1E,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE;QACpE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;KACjE,CAAC;AACN,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SGR mouse sequence parser (Phase 4). Wheel + click in alt-screen mode.
3
+ */
4
+ /** Parse `\x1b[<btn;col;rowM` / `\x1b[<btn;col;rowm` sequences. Returns consumed length. */
5
+ export function parseSgrMouse(data) {
6
+ const m = /^\x1b\[<(\d+);(\d+);(\d+)([mM])/.exec(data);
7
+ if (!m)
8
+ return null;
9
+ const btn = Number(m[1]);
10
+ const col = Number(m[2]);
11
+ const row = Number(m[3]);
12
+ const release = m[4] === 'm';
13
+ if (btn === 64)
14
+ return { event: { kind: 'wheel-up', col, row }, length: m[0].length };
15
+ if (btn === 65)
16
+ return { event: { kind: 'wheel-down', col, row }, length: m[0].length };
17
+ return {
18
+ event: { kind: release ? 'release' : 'press', button: btn, col, row },
19
+ length: m[0].length,
20
+ };
21
+ }
22
+ export function isMouseSequence(data) {
23
+ return data.startsWith('\x1b[<');
24
+ }
25
+ //# sourceMappingURL=mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../../../../src/cli/tui/render/mouse.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IAC7B,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtF,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACxF,OAAO;QACH,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;KACtB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Coalesced frame scheduler (~16ms) for alt-screen redraw (Phase 4).
3
+ */
4
+ export function createScheduler(draw, targetMs = 16) {
5
+ let timer = null;
6
+ let pending = false;
7
+ const run = () => {
8
+ timer = null;
9
+ if (!pending)
10
+ return;
11
+ pending = false;
12
+ draw();
13
+ };
14
+ return {
15
+ request() {
16
+ pending = true;
17
+ if (timer)
18
+ return;
19
+ timer = setTimeout(run, targetMs);
20
+ },
21
+ flush() {
22
+ if (timer) {
23
+ clearTimeout(timer);
24
+ timer = null;
25
+ }
26
+ pending = false;
27
+ draw();
28
+ },
29
+ dispose() {
30
+ if (timer)
31
+ clearTimeout(timer);
32
+ timer = null;
33
+ pending = false;
34
+ },
35
+ };
36
+ }
37
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../../../src/cli/tui/render/scheduler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,QAAQ,GAAG,EAAE;IAC3D,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,GAAG,GAAG,GAAS,EAAE;QACnB,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,GAAG,KAAK,CAAC;QAChB,IAAI,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,OAAO;QACH,OAAO;YACH,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,KAAK;YACD,IAAI,KAAK,EAAE,CAAC;gBACR,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,EAAE,CAAC;QACX,CAAC;QACD,OAAO;YACH,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,GAAG,KAAK,CAAC;QACpB,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,82 @@
1
+ export class Viewport {
2
+ cells = [];
3
+ scrollTop = 0;
4
+ follow = true;
5
+ width = 80;
6
+ setWidth(cols) {
7
+ this.width = Math.max(20, cols);
8
+ for (const c of this.cells)
9
+ c.revision += 1;
10
+ }
11
+ setItems(items, renderLine, visibleRows = 1) {
12
+ this.cells = items.map((item, i) => ({
13
+ lines: renderLine(item, this.width),
14
+ revision: i,
15
+ }));
16
+ if (this.follow)
17
+ this.scrollToBottom(visibleRows);
18
+ }
19
+ updateTail(item, renderLine, visibleRows = 1) {
20
+ if (!this.cells.length) {
21
+ this.setItems([item], renderLine);
22
+ return;
23
+ }
24
+ const tail = this.cells[this.cells.length - 1];
25
+ tail.lines = renderLine(item, this.width);
26
+ tail.revision += 1;
27
+ if (this.follow)
28
+ this.scrollToBottom(visibleRows);
29
+ }
30
+ appendCell(item, renderLine, visibleRows = 1) {
31
+ this.cells.push({
32
+ lines: renderLine(item, this.width),
33
+ revision: this.cells.length,
34
+ });
35
+ if (this.follow)
36
+ this.scrollToBottom(visibleRows);
37
+ }
38
+ followTail(on, visibleRows = 1) {
39
+ this.follow = on;
40
+ if (on)
41
+ this.scrollToBottom(visibleRows);
42
+ }
43
+ scrollBy(lines, visibleRows = 1) {
44
+ this.follow = false;
45
+ this.scrollTop = Math.max(0, this.scrollTop + lines);
46
+ this.clampScroll(visibleRows);
47
+ }
48
+ pageUp(regionHeight) { this.scrollBy(-Math.max(1, regionHeight - 1), regionHeight); }
49
+ pageDown(regionHeight) { this.scrollBy(Math.max(1, regionHeight - 1), regionHeight); }
50
+ scrollToBottom(visibleRows = 1) {
51
+ this.follow = true;
52
+ this.scrollTop = Math.max(0, this.totalLines() - visibleRows);
53
+ }
54
+ scrollToTop() {
55
+ this.scrollTop = 0;
56
+ this.follow = false;
57
+ }
58
+ isFollowingTail() {
59
+ return this.follow;
60
+ }
61
+ totalLines() {
62
+ return this.cells.reduce((n, c) => n + c.lines.length, 0);
63
+ }
64
+ composeRegion(region) {
65
+ const flat = [];
66
+ for (const cell of this.cells)
67
+ flat.push(...cell.lines);
68
+ this.clampScroll(region.height);
69
+ const start = this.scrollTop;
70
+ const out = [];
71
+ for (let i = 0; i < region.height; i++) {
72
+ out.push(flat[start + i] ?? '');
73
+ }
74
+ return out;
75
+ }
76
+ clampScroll(visibleRows = 1) {
77
+ const max = Math.max(0, this.totalLines() - visibleRows);
78
+ if (this.scrollTop > max)
79
+ this.scrollTop = max;
80
+ }
81
+ }
82
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../../../src/cli/tui/render/viewport.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { toGraphemes } from './text-buffer.js';
1
2
  export function visualWidth(str) {
2
3
  // Strip ANSI escape codes first so width matches visible cells.
3
4
  const stripped = str.replace(/\x1b\[[0-9;]*m/g, '');
@@ -37,4 +38,40 @@ export function clipTextToCols(str, maxCols) {
37
38
  }
38
39
  return out;
39
40
  }
41
+ /**
42
+ * On-screen position of a cursor within rendered composer text. The display text
43
+ * splits into logical lines by '\n' (first line uses firstPrefixWidth, the rest
44
+ * contPrefixWidth); lines soft-wrap at `cols`. Returns the cursor screen {row,col}
45
+ * and total rows rendered. Pure — used to place the terminal cursor after a redraw.
46
+ */
47
+ export function cursorScreenPos(displayText, cursorOffset, firstPrefixWidth, contPrefixWidth, cols) {
48
+ const safeCols = Math.max(1, cols);
49
+ const g = toGraphemes(displayText);
50
+ const cur = Math.max(0, Math.min(cursorOffset, g.length));
51
+ let row = 0;
52
+ let scol = firstPrefixWidth;
53
+ let curRow = 0;
54
+ let curCol = firstPrefixWidth;
55
+ for (let i = 0; i <= g.length; i += 1) {
56
+ if (i === cur) {
57
+ curRow = row;
58
+ curCol = scol;
59
+ }
60
+ if (i === g.length)
61
+ break;
62
+ const ch = g[i] ?? '';
63
+ if (ch === '\n') {
64
+ row += 1;
65
+ scol = contPrefixWidth;
66
+ continue;
67
+ }
68
+ const w = Math.max(1, visualWidth(ch));
69
+ if (scol + w > safeCols) {
70
+ row += 1;
71
+ scol = 0;
72
+ }
73
+ scol += w;
74
+ }
75
+ return { row: curRow, col: curCol, totalRows: row + 1 };
76
+ }
40
77
  //# sourceMappingURL=renderers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../src/cli/tui/renderers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,GAAW;IACnC,gEAAgE;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACb,CAAC;QACD,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,CAAC,CAAC;QACf,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,OAAe;IACvD,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,KAAK,GAAG,SAAS,GAAG,OAAO;YAAE,MAAM;QACvC,GAAG,IAAI,EAAE,CAAC;QACV,KAAK,IAAI,SAAS,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../src/cli/tui/renderers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Footer-safe streaming sink (Phase 1, devlog 260529_tui_parity, doc 06).
3
+ * Buffers assistant deltas and renders+commits only *complete* markdown blocks
4
+ * (a blank line outside a fenced code block, or a just-closed fence). The
5
+ * in-progress block is held until its boundary completes; end() flushes the rest.
6
+ * This guarantees marked always sees complete blocks and the scroll-region footer
7
+ * is never corrupted by a half-rendered fence/table (doc 15 §2).
8
+ */
9
+ import { renderMarkdown } from './markdown.js';
10
+ export function createStreamSink(opts) {
11
+ let buf = '';
12
+ const flush = (force) => {
13
+ const idx = force ? buf.length : findSafeCommitPoint(buf);
14
+ if (idx <= 0)
15
+ return;
16
+ const seg = buf.slice(0, idx);
17
+ buf = buf.slice(idx);
18
+ // gutter defaulted here so MdOpts.gutter is `string`, not `string | undefined`
19
+ // (tsconfig exactOptionalPropertyTypes).
20
+ if (seg.trim())
21
+ opts.write(renderMarkdown(seg, { width: opts.width, gutter: opts.gutter ?? ' ' }));
22
+ };
23
+ return {
24
+ push(chunk) { buf += chunk; flush(false); },
25
+ end() { flush(true); },
26
+ };
27
+ }
28
+ /** Largest index that ends on a completed block boundary outside any open fence. */
29
+ export function findSafeCommitPoint(s) {
30
+ const lines = s.split('\n');
31
+ let inFence = false;
32
+ let safe = 0;
33
+ let pos = 0;
34
+ for (const line of lines) {
35
+ const end = pos + line.length + 1;
36
+ if (/^\s*```/.test(line)) {
37
+ inFence = !inFence;
38
+ if (!inFence)
39
+ safe = end; // a fence just closed → safe to commit through it
40
+ }
41
+ else if (!inFence && line.trim() === '') {
42
+ safe = end; // blank line outside a fence → block boundary
43
+ }
44
+ pos = end;
45
+ }
46
+ return Math.min(safe, s.length);
47
+ }
48
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/cli/tui/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAa/C,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACjD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO;QACrB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,+EAA+E;QAC/E,yCAAyC;QACzC,IAAI,GAAG,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC,CAAC;IACF,OAAO;QACH,IAAI,CAAC,KAAa,IAAU,GAAG,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,GAAG,KAAW,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC/B,CAAC;AACN,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,CAAS;IACzC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,IAAI,CAAC,OAAO;gBAAE,IAAI,GAAG,GAAG,CAAC,CAAC,kDAAkD;QAChF,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,CAAC,CAAC,8CAA8C;QAC9D,CAAC;QACD,GAAG,GAAG,GAAG,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * TextBuffer — grapheme-aware single-line/multi-line edit buffer (Phase 3a,
3
+ * devlog 260529_tui_parity, doc 08). Pure data structure (no I/O), so the
4
+ * delicate composer/input-handler wiring (Phase 3b) builds on a tested core.
5
+ *
6
+ * Cursor is a GRAPHEME index (so CJK/emoji move as one unit). Supports
7
+ * insert/backspace/delete, left/right + word motions, home/end, an Emacs-style
8
+ * kill-ring (kill-to-end / kill-to-start / kill-word + yank), and undo/redo with
9
+ * insert-run coalescing.
10
+ */
11
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
12
+ /** Split a string into grapheme clusters (CJK/emoji safe). Shared with composer.ts. */
13
+ export function toGraphemes(s) {
14
+ if (!s)
15
+ return [];
16
+ return Array.from(segmenter.segment(s), (seg) => seg.segment);
17
+ }
18
+ function isSpace(g) {
19
+ return g !== undefined && /\s/.test(g);
20
+ }
21
+ export function createTextBuffer(initial = '') {
22
+ let graphemes = toGraphemes(initial);
23
+ let cursor = graphemes.length;
24
+ let killRing = '';
25
+ const undoStack = [];
26
+ const redoStack = [];
27
+ let lastMutation = null;
28
+ const clamp = (n) => Math.max(0, Math.min(n, graphemes.length));
29
+ function snapshot(kind) {
30
+ // Coalesce consecutive inserts into a single undo entry.
31
+ if (!(kind === 'insert' && lastMutation === 'insert')) {
32
+ undoStack.push({ graphemes: [...graphemes], cursor });
33
+ redoStack.length = 0;
34
+ }
35
+ lastMutation = kind;
36
+ }
37
+ function spliceIn(parts) {
38
+ graphemes.splice(cursor, 0, ...parts);
39
+ cursor += parts.length;
40
+ }
41
+ function wordLeftIndex() {
42
+ let i = cursor;
43
+ while (i > 0 && isSpace(graphemes[i - 1]))
44
+ i--;
45
+ while (i > 0 && !isSpace(graphemes[i - 1]))
46
+ i--;
47
+ return i;
48
+ }
49
+ return {
50
+ text: () => graphemes.join(''),
51
+ cursor: () => cursor,
52
+ length: () => graphemes.length,
53
+ insert(s) {
54
+ const parts = toGraphemes(s);
55
+ if (!parts.length)
56
+ return;
57
+ snapshot('insert');
58
+ spliceIn(parts);
59
+ },
60
+ backspace() {
61
+ if (cursor <= 0)
62
+ return;
63
+ snapshot('other');
64
+ graphemes.splice(cursor - 1, 1);
65
+ cursor--;
66
+ },
67
+ delete() {
68
+ if (cursor >= graphemes.length)
69
+ return;
70
+ snapshot('other');
71
+ graphemes.splice(cursor, 1);
72
+ },
73
+ left() { cursor = clamp(cursor - 1); },
74
+ right() { cursor = clamp(cursor + 1); },
75
+ wordLeft() { cursor = wordLeftIndex(); },
76
+ wordRight() {
77
+ let i = cursor;
78
+ while (i < graphemes.length && isSpace(graphemes[i]))
79
+ i++;
80
+ while (i < graphemes.length && !isSpace(graphemes[i]))
81
+ i++;
82
+ cursor = i;
83
+ },
84
+ home() { cursor = 0; },
85
+ end() { cursor = graphemes.length; },
86
+ killToEnd() {
87
+ if (cursor >= graphemes.length)
88
+ return;
89
+ snapshot('other');
90
+ killRing = graphemes.splice(cursor).join('');
91
+ },
92
+ killToStart() {
93
+ if (cursor <= 0)
94
+ return;
95
+ snapshot('other');
96
+ killRing = graphemes.splice(0, cursor).join('');
97
+ cursor = 0;
98
+ },
99
+ killWord() {
100
+ const start = wordLeftIndex();
101
+ if (start === cursor)
102
+ return;
103
+ snapshot('other');
104
+ killRing = graphemes.splice(start, cursor - start).join('');
105
+ cursor = start;
106
+ },
107
+ yank() {
108
+ if (!killRing)
109
+ return;
110
+ snapshot('other');
111
+ spliceIn(toGraphemes(killRing));
112
+ },
113
+ undo() {
114
+ const prev = undoStack.pop();
115
+ if (!prev)
116
+ return;
117
+ redoStack.push({ graphemes: [...graphemes], cursor });
118
+ graphemes = prev.graphemes;
119
+ cursor = clamp(prev.cursor);
120
+ lastMutation = null;
121
+ },
122
+ redo() {
123
+ const next = redoStack.pop();
124
+ if (!next)
125
+ return;
126
+ undoStack.push({ graphemes: [...graphemes], cursor });
127
+ graphemes = next.graphemes;
128
+ cursor = clamp(next.cursor);
129
+ lastMutation = null;
130
+ },
131
+ setText(s, c) {
132
+ snapshot('other');
133
+ graphemes = toGraphemes(s);
134
+ cursor = c === undefined ? graphemes.length : clamp(c);
135
+ },
136
+ clear() {
137
+ snapshot('other');
138
+ graphemes = [];
139
+ cursor = 0;
140
+ },
141
+ };
142
+ }
143
+ //# sourceMappingURL=text-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-buffer.js","sourceRoot":"","sources":["../../../../src/cli/tui/text-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * TUI theme tokens + color-capability ladder (Phase 3, devlog 260529_tui_parity, doc 14).
3
+ * Colors aligned to public/manager/src/manager-tokens.css. Four tiers:
4
+ * truecolor → ansi256 → ansi16 → mono, resolved from env/TTY. dark + light palettes.
5
+ * Backward-compatible API (paint/fgToken/attr/colorLevel) — truecolor output is
6
+ * byte-identical to the Phase-1 version.
7
+ */
8
+ export const RESET = '\x1b[0m';
9
+ export const BOLD = '\x1b[1m';
10
+ export const DIM = '\x1b[2m';
11
+ export const ITALIC = '\x1b[3m';
12
+ export const UNDER = '\x1b[4m';
13
+ /** Pure capability resolution (testable). Order matches doc 14 §3. */
14
+ export function resolveColorLevel(env, isTTY) {
15
+ if (env['NO_COLOR'] != null)
16
+ return 'mono';
17
+ if (env['CLICOLOR'] === '0')
18
+ return 'mono';
19
+ const fc = env['FORCE_COLOR'];
20
+ if (fc === '0')
21
+ return 'mono';
22
+ if (fc === '1')
23
+ return 'ansi16';
24
+ if (fc === '2')
25
+ return 'ansi256';
26
+ if (fc === '3' || fc === 'true')
27
+ return 'truecolor';
28
+ if (!isTTY)
29
+ return 'mono';
30
+ if (env['TERM'] === 'dumb')
31
+ return 'mono';
32
+ const ct = env['COLORTERM'];
33
+ if (ct === 'truecolor' || ct === '24bit')
34
+ return 'truecolor';
35
+ if (/256color/.test(env['TERM'] ?? ''))
36
+ return 'ansi256';
37
+ return 'ansi16';
38
+ }
39
+ /** Computed live so tests + runtime env changes are honored. */
40
+ export function colorLevel() {
41
+ return resolveColorLevel(process.env, Boolean(process.stdout.isTTY));
42
+ }
43
+ export function activeTheme() {
44
+ return process.env['JAW_TUI_THEME'] === 'light' ? 'light' : 'dark';
45
+ }
46
+ const DARK = {
47
+ 'text.primary': '#e7edf5', 'text.muted': '#657283', 'accent': '#62a8f5',
48
+ 'heading': '#e7edf5', 'code.fence': '#657283', 'quote': '#9aa6b5', 'link': '#62a8f5',
49
+ 'status.error': '#f87171', 'diff.add': '#34d399', 'diff.del': '#f87171',
50
+ 'code.keyword': '#62a8f5', 'code.string': '#34d399', 'code.number': '#f5a524',
51
+ 'code.comment': '#657283', 'code.title': '#8fb8f7', 'code.type': '#5eead4',
52
+ 'code.built_in': '#f87171',
53
+ };
54
+ const LIGHT = {
55
+ 'text.primary': '#111418', 'text.muted': '#6b7382', 'accent': '#1f6feb',
56
+ 'heading': '#111418', 'code.fence': '#6b7382', 'quote': '#4d5662', 'link': '#1f6feb',
57
+ 'status.error': '#b91c1c', 'diff.add': '#15803d', 'diff.del': '#b91c1c',
58
+ 'code.keyword': '#1f6feb', 'code.string': '#15803d', 'code.number': '#b45309',
59
+ 'code.comment': '#6b7382', 'code.title': '#155bbb', 'code.type': '#0f766e',
60
+ 'code.built_in': '#b91c1c',
61
+ };
62
+ function rgb(hex) {
63
+ const n = parseInt(hex.slice(1), 16);
64
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
65
+ }
66
+ // hex → xterm-256 index (6×6×6 cube + grayscale ramp). Deterministic.
67
+ function to256([r, g, b]) {
68
+ if (r === g && g === b) {
69
+ if (r < 8)
70
+ return 16;
71
+ if (r > 248)
72
+ return 231;
73
+ return 232 + Math.round(((r - 8) / 247) * 24);
74
+ }
75
+ const q = (v) => Math.round((v / 255) * 5);
76
+ return 16 + 36 * q(r) + 6 * q(g) + q(b);
77
+ }
78
+ // Standard xterm 16-color palette (RGB) for nearest-match downgrade.
79
+ const ANSI16 = [
80
+ [0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], [128, 0, 128], [0, 128, 128], [192, 192, 192],
81
+ [128, 128, 128], [255, 0, 0], [0, 255, 0], [255, 255, 0], [0, 0, 255], [255, 0, 255], [0, 255, 255], [255, 255, 255],
82
+ ];
83
+ function to16([r, g, b]) {
84
+ let best = 0;
85
+ let bestDist = Infinity;
86
+ for (let i = 0; i < ANSI16.length; i++) {
87
+ const p = ANSI16[i] ?? [0, 0, 0];
88
+ const d = (r - p[0]) ** 2 + (g - p[1]) ** 2 + (b - p[2]) ** 2;
89
+ if (d < bestDist) {
90
+ bestDist = d;
91
+ best = i;
92
+ }
93
+ }
94
+ return best;
95
+ }
96
+ function fgEscape(hex, level) {
97
+ const c = rgb(hex);
98
+ if (level === 'truecolor')
99
+ return `\x1b[38;2;${c[0]};${c[1]};${c[2]}m`;
100
+ if (level === 'ansi256')
101
+ return `\x1b[38;5;${to256(c)}m`;
102
+ if (level === 'ansi16') {
103
+ const idx = to16(c);
104
+ return idx < 8 ? `\x1b[3${idx}m` : `\x1b[9${idx - 8}m`;
105
+ }
106
+ return '';
107
+ }
108
+ function tokenHex(t) {
109
+ return activeTheme() === 'light' ? LIGHT[t] : DARK[t];
110
+ }
111
+ /** Raw fg escape for a token ('' in mono). highlight.ts manages its own RESET. */
112
+ export function fgToken(t) {
113
+ const level = colorLevel();
114
+ return level === 'mono' ? '' : fgEscape(tokenHex(t), level);
115
+ }
116
+ /** Wrap text in a token color (+ optional attributes). Mono keeps attributes only. */
117
+ export function paint(t, s, attrs = '') {
118
+ if (colorLevel() === 'mono')
119
+ return attrs ? `${attrs}${s}${RESET}` : s;
120
+ return `${attrs}${fgToken(t)}${s}${RESET}`;
121
+ }
122
+ /** Apply raw ANSI attributes (bold/italic/…) to text. */
123
+ export function attr(s, a) {
124
+ if (a === '')
125
+ return s;
126
+ return `${a}${s}${RESET}`;
127
+ }
128
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../src/cli/tui/theme.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,10 @@ export function finalizeAssistant(state, fallbackText) {
28
28
  }
29
29
  return true;
30
30
  }
31
+ export function appendToolItem(state, text) {
32
+ // Persistent (unlike status): tool activity accumulates and is never replaced.
33
+ state.items.push({ type: 'tool', text, timestamp: Date.now() });
34
+ }
31
35
  export function appendStatusItem(state, text) {
32
36
  // Ephemeral — replace previous status if it exists
33
37
  const last = state.items[state.items.length - 1];
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../../src/cli/tui/transcript.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,qBAAqB;IACjC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAsB,EAAE,WAAmB,EAAE,UAAkB;IAC1F,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACrD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAsB,EAAE,KAAa;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;IACnB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAsB,EAAE,YAAqB;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACtB,2CAA2C;QAC3C,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB,EAAE,IAAY;IACjE,mDAAmD;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO;IACX,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACvD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnF,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../../src/cli/tui/transcript.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { getVisibleCommands } from './policy.js';
9
9
  * @param {'text'|'html'} [opts.format='text']
10
10
  * @returns {{ ok: boolean, text: string }}
11
11
  */
12
- export function renderHelp({ iface, commandName, format = 'text' } = {}) {
12
+ export function renderHelp({ iface, commandName, format: _format = 'text' } = {}) {
13
13
  const cmds = getVisibleCommands(iface || 'cli');
14
14
  if (!commandName) {
15
15
  const lines = cmds.map(c => {
@@ -1 +1 @@
1
- {"version":3,"file":"help-renderer.js","sourceRoot":"","sources":["../../../src/command-contract/help-renderer.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,kCAAkC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAgE,EAAE;IAC9H,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtB,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,WAAW,EAAE,EAAE,CAAC;IAEhE,OAAO;QACH,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACF,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE;YACnE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACzD,GAA2B,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAS,GAA2B,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAClJ,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;iBACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC7B,IAAI,CAAC,IAAI,CAAC,EAAE;SACpB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC/B,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"help-renderer.js","sourceRoot":"","sources":["../../../src/command-contract/help-renderer.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,kCAAkC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAgE,EAAE;IACvI,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtB,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,WAAW,EAAE,EAAE,CAAC;IAEhE,OAAO;QACH,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACF,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE;YACnE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACzD,GAA2B,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAS,GAA2B,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAClJ,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;iBACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC7B,IAAI,CAAC,IAAI,CAAC,EAAE;SACpB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC/B,CAAC;AACN,CAAC"}