cli-jaw 2.2.4 → 2.2.5

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 (631) hide show
  1. package/README.md +5 -4
  2. package/dist/bin/cli-jaw.js +9 -1
  3. package/dist/bin/cli-jaw.js.map +1 -1
  4. package/dist/bin/commands/chat.js +9 -1
  5. package/dist/bin/commands/chat.js.map +1 -1
  6. package/dist/bin/commands/design.js +172 -0
  7. package/dist/bin/commands/design.js.map +1 -0
  8. package/dist/bin/commands/dispatch-helpers.js +28 -0
  9. package/dist/bin/commands/dispatch-helpers.js.map +1 -1
  10. package/dist/bin/commands/dispatch.js +133 -31
  11. package/dist/bin/commands/dispatch.js.map +1 -1
  12. package/dist/bin/commands/doctor.js +1 -1
  13. package/dist/bin/commands/doctor.js.map +1 -1
  14. package/dist/bin/commands/init.js +1 -1
  15. package/dist/bin/commands/init.js.map +1 -1
  16. package/dist/bin/commands/map.js +53 -0
  17. package/dist/bin/commands/map.js.map +1 -0
  18. package/dist/bin/commands/mcp.js +1 -1
  19. package/dist/bin/commands/mcp.js.map +1 -1
  20. package/dist/bin/commands/skill.js +64 -3
  21. package/dist/bin/commands/skill.js.map +1 -1
  22. package/dist/bin/commands/status.js +1 -1
  23. package/dist/bin/commands/status.js.map +1 -1
  24. package/dist/bin/commands/tui/channel.js +20 -4
  25. package/dist/bin/commands/tui/channel.js.map +1 -1
  26. package/dist/bin/commands/tui/fullscreen-mode.js +17 -9
  27. package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -1
  28. package/dist/bin/commands/tui/input-handler.js +30 -22
  29. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  30. package/dist/bin/commands/tui/overlays.js +36 -8
  31. package/dist/bin/commands/tui/overlays.js.map +1 -1
  32. package/dist/bin/commands/tui/queue-command.js +71 -0
  33. package/dist/bin/commands/tui/queue-command.js.map +1 -0
  34. package/dist/bin/commands/tui/renderer.js +1 -0
  35. package/dist/bin/commands/tui/renderer.js.map +1 -1
  36. package/dist/bin/commands/tui/simple-mode.js +39 -1
  37. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  38. package/dist/bin/commands/tui/slash-command-runner.js +92 -4
  39. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  40. package/dist/bin/commands/tui/types.js +6 -4
  41. package/dist/bin/commands/tui/types.js.map +1 -1
  42. package/dist/bin/commands/tui/ws-handler.js +78 -9
  43. package/dist/bin/commands/tui/ws-handler.js.map +1 -1
  44. package/dist/bin/commands/worker.js +1 -3
  45. package/dist/bin/commands/worker.js.map +1 -1
  46. package/dist/bin/postinstall.js +3 -3
  47. package/dist/bin/postinstall.js.map +1 -1
  48. package/dist/server.js +7 -2
  49. package/dist/server.js.map +1 -1
  50. package/dist/src/agent/args.js +3 -0
  51. package/dist/src/agent/args.js.map +1 -1
  52. package/dist/src/agent/lifecycle-handler.js +20 -0
  53. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  54. package/dist/src/agent/spawn.js +24 -2
  55. package/dist/src/agent/spawn.js.map +1 -1
  56. package/dist/src/bgtask/notifier.js +2 -1
  57. package/dist/src/bgtask/notifier.js.map +1 -1
  58. package/dist/src/bgtask/recover.js +8 -7
  59. package/dist/src/bgtask/recover.js.map +1 -1
  60. package/dist/src/bgtask/registry.js +2 -1
  61. package/dist/src/bgtask/registry.js.map +1 -1
  62. package/dist/src/bgtask/runner.js +3 -2
  63. package/dist/src/bgtask/runner.js.map +1 -1
  64. package/dist/src/browser/vision.js +3 -1
  65. package/dist/src/browser/vision.js.map +1 -1
  66. package/dist/src/browser/web-ai/tab-lease-store.js +1 -3
  67. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -1
  68. package/dist/src/cli/commands.js +26 -4
  69. package/dist/src/cli/commands.js.map +1 -1
  70. package/dist/src/cli/handlers-runtime.js +7 -1
  71. package/dist/src/cli/handlers-runtime.js.map +1 -1
  72. package/dist/src/cli/handlers.js +1 -1
  73. package/dist/src/cli/handlers.js.map +1 -1
  74. package/dist/src/cli/tui/jawcode-bridge.js +13 -14
  75. package/dist/src/cli/tui/jawcode-bridge.js.map +1 -1
  76. package/dist/src/cli/tui/markdown.js +1 -1
  77. package/dist/src/cli/tui/markdown.js.map +1 -1
  78. package/dist/src/cli/tui/overlay.js +65 -10
  79. package/dist/src/cli/tui/overlay.js.map +1 -1
  80. package/dist/src/cli/tui/render/frame.js +109 -103
  81. package/dist/src/cli/tui/render/frame.js.map +1 -1
  82. package/dist/src/cli/tui/transcript.js +31 -9
  83. package/dist/src/cli/tui/transcript.js.map +1 -1
  84. package/dist/src/core/bus.js +2 -0
  85. package/dist/src/core/bus.js.map +1 -1
  86. package/dist/src/core/chat-sessions.js +2 -0
  87. package/dist/src/core/chat-sessions.js.map +1 -1
  88. package/dist/src/core/codex-config.js +2 -1
  89. package/dist/src/core/codex-config.js.map +1 -1
  90. package/dist/src/core/config.js +6 -3
  91. package/dist/src/core/config.js.map +1 -1
  92. package/dist/src/core/event-bus.js +1 -1
  93. package/dist/src/core/event-bus.js.map +1 -1
  94. package/dist/src/core/logger.js +9 -1
  95. package/dist/src/core/logger.js.map +1 -1
  96. package/dist/src/core/main-session.js +2 -1
  97. package/dist/src/core/main-session.js.map +1 -1
  98. package/dist/src/core/runtime-settings.js +2 -1
  99. package/dist/src/core/runtime-settings.js.map +1 -1
  100. package/dist/src/core/session-ops.js +1 -1
  101. package/dist/src/core/session-ops.js.map +1 -1
  102. package/dist/src/core/widget-watcher.js +113 -0
  103. package/dist/src/core/widget-watcher.js.map +1 -0
  104. package/dist/src/discord/bot.js +42 -31
  105. package/dist/src/discord/bot.js.map +1 -1
  106. package/dist/src/discord/channel-types.js +16 -0
  107. package/dist/src/discord/channel-types.js.map +1 -1
  108. package/dist/src/discord/commands.js +8 -6
  109. package/dist/src/discord/commands.js.map +1 -1
  110. package/dist/src/discord/discord-file.js +4 -2
  111. package/dist/src/discord/discord-file.js.map +1 -1
  112. package/dist/src/discord/forwarder.js +10 -6
  113. package/dist/src/discord/forwarder.js.map +1 -1
  114. package/dist/src/ide/diff.js +1 -1
  115. package/dist/src/ide/diff.js.map +1 -1
  116. package/dist/src/manager/dashboard-service.js +5 -5
  117. package/dist/src/manager/dashboard-service.js.map +1 -1
  118. package/dist/src/manager/design/path-guards.js +86 -0
  119. package/dist/src/manager/design/path-guards.js.map +1 -0
  120. package/dist/src/manager/design/schema.js +54 -0
  121. package/dist/src/manager/design/schema.js.map +1 -0
  122. package/dist/src/manager/design/snapshots.js +62 -0
  123. package/dist/src/manager/design/snapshots.js.map +1 -0
  124. package/dist/src/manager/design/store.js +269 -0
  125. package/dist/src/manager/design/store.js.map +1 -0
  126. package/dist/src/manager/design/watcher.js +49 -0
  127. package/dist/src/manager/design/watcher.js.map +1 -0
  128. package/dist/src/manager/memory/embedding/vec-store.js +1 -1
  129. package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
  130. package/dist/src/manager/registry.js +84 -0
  131. package/dist/src/manager/registry.js.map +1 -1
  132. package/dist/src/manager/routes/dashboard-design.js +234 -0
  133. package/dist/src/manager/routes/dashboard-design.js.map +1 -0
  134. package/dist/src/manager/routes/dashboard-memory.js +1 -1
  135. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  136. package/dist/src/manager/routes/embedded-browser.js +497 -0
  137. package/dist/src/manager/routes/embedded-browser.js.map +1 -0
  138. package/dist/src/manager/routes/telegram-hub.js +4 -3
  139. package/dist/src/manager/routes/telegram-hub.js.map +1 -1
  140. package/dist/src/manager/server.js +17 -2
  141. package/dist/src/manager/server.js.map +1 -1
  142. package/dist/src/manager/telegram-hub/hub-bot.js +127 -7
  143. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  144. package/dist/src/memory/heartbeat.js +15 -14
  145. package/dist/src/memory/heartbeat.js.map +1 -1
  146. package/dist/src/memory/identity.js +3 -2
  147. package/dist/src/memory/identity.js.map +1 -1
  148. package/dist/src/memory/memory.js +3 -2
  149. package/dist/src/memory/memory.js.map +1 -1
  150. package/dist/src/memory/reflect.js +2 -1
  151. package/dist/src/memory/reflect.js.map +1 -1
  152. package/dist/src/memory/runtime.js +3 -2
  153. package/dist/src/memory/runtime.js.map +1 -1
  154. package/dist/src/memory/shared.js +4 -3
  155. package/dist/src/memory/shared.js.map +1 -1
  156. package/dist/src/memory/worklog.js +3 -2
  157. package/dist/src/memory/worklog.js.map +1 -1
  158. package/dist/src/messaging/runtime.js +4 -3
  159. package/dist/src/messaging/runtime.js.map +1 -1
  160. package/dist/src/messaging/send.js +1 -1
  161. package/dist/src/messaging/send.js.map +1 -1
  162. package/dist/src/orchestrator/attestation.js +33 -0
  163. package/dist/src/orchestrator/attestation.js.map +1 -1
  164. package/dist/src/orchestrator/collect.js +9 -4
  165. package/dist/src/orchestrator/collect.js.map +1 -1
  166. package/dist/src/orchestrator/distribute.js +0 -142
  167. package/dist/src/orchestrator/distribute.js.map +1 -1
  168. package/dist/src/orchestrator/gateway.js +3 -3
  169. package/dist/src/orchestrator/gateway.js.map +1 -1
  170. package/dist/src/orchestrator/pipeline.js +19 -1
  171. package/dist/src/orchestrator/pipeline.js.map +1 -1
  172. package/dist/src/orchestrator/state-machine.js +93 -16
  173. package/dist/src/orchestrator/state-machine.js.map +1 -1
  174. package/dist/src/orchestrator/worker-replay-notice.js +31 -11
  175. package/dist/src/orchestrator/worker-replay-notice.js.map +1 -1
  176. package/dist/src/prompt/builder.js +20 -20
  177. package/dist/src/prompt/builder.js.map +1 -1
  178. package/dist/src/prompt/context-hooks.js +2 -1
  179. package/dist/src/prompt/context-hooks.js.map +1 -1
  180. package/dist/src/prompt/templates/a1-system.md +69 -45
  181. package/dist/src/prompt/templates/employee.md +3 -2
  182. package/dist/src/prompt/templates/orchestration.md +13 -15
  183. package/dist/src/prompt/templates/skills.md +1 -0
  184. package/dist/src/routes/avatar.js +4 -3
  185. package/dist/src/routes/avatar.js.map +1 -1
  186. package/dist/src/routes/bgtask.js +2 -1
  187. package/dist/src/routes/bgtask.js.map +1 -1
  188. package/dist/src/routes/browser.js +2 -1
  189. package/dist/src/routes/browser.js.map +1 -1
  190. package/dist/src/routes/command.js +32 -2
  191. package/dist/src/routes/command.js.map +1 -1
  192. package/dist/src/routes/messaging.js +6 -5
  193. package/dist/src/routes/messaging.js.map +1 -1
  194. package/dist/src/routes/orchestrate.js +144 -29
  195. package/dist/src/routes/orchestrate.js.map +1 -1
  196. package/dist/src/routes/quota.js +217 -33
  197. package/dist/src/routes/quota.js.map +1 -1
  198. package/dist/src/routes/settings.js +3 -2
  199. package/dist/src/routes/settings.js.map +1 -1
  200. package/dist/src/routes/static.js +37 -2
  201. package/dist/src/routes/static.js.map +1 -1
  202. package/dist/src/telegram/bot.js +123 -67
  203. package/dist/src/telegram/bot.js.map +1 -1
  204. package/dist/src/telegram/elicitation-buttons.js +71 -0
  205. package/dist/src/telegram/elicitation-buttons.js.map +1 -0
  206. package/dist/src/telegram/fetch-body.js +11 -0
  207. package/dist/src/telegram/fetch-body.js.map +1 -0
  208. package/dist/src/telegram/forwarder.js +3 -5
  209. package/dist/src/telegram/forwarder.js.map +1 -1
  210. package/dist/src/telegram/rich-message.js +85 -11
  211. package/dist/src/telegram/rich-message.js.map +1 -1
  212. package/dist/src/telegram/status-update-buffer.js +15 -0
  213. package/dist/src/telegram/status-update-buffer.js.map +1 -0
  214. package/dist/src/telegram/telegram-file.js +5 -4
  215. package/dist/src/telegram/telegram-file.js.map +1 -1
  216. package/dist/src/telegram/voice.js +5 -4
  217. package/dist/src/telegram/voice.js.map +1 -1
  218. package/dist/src/workflows/planaudit.js +2 -1
  219. package/dist/src/workflows/planaudit.js.map +1 -1
  220. package/dist/src/workflows/repo-map/index.js +157 -0
  221. package/dist/src/workflows/repo-map/index.js.map +1 -0
  222. package/dist/src/workflows/scope-sandbox.js +1 -0
  223. package/dist/src/workflows/scope-sandbox.js.map +1 -1
  224. package/package.json +5 -2
  225. package/public/css/chat.css +17 -1
  226. package/public/css/orc-state.css +2 -1
  227. package/public/css/variables.css +0 -1
  228. package/public/dist/assets/{AdvancedExport-qa01DKDO.js → AdvancedExport-DsDpqXoH.js} +1 -1
  229. package/public/dist/assets/{Agent-CHCXjXSN.js → Agent-CrLn42Jb.js} +1 -1
  230. package/public/dist/assets/{Browser-Df4B5cnl.js → Browser-B52Bdaeu.js} +1 -1
  231. package/public/dist/assets/BrowserPanel-Bh3JpkZO.js +3 -0
  232. package/public/dist/assets/BrowserPanel-DpntR8EJ.css +1 -0
  233. package/public/dist/assets/{ChannelsDiscord-BqPckWSY.js → ChannelsDiscord-Bt1_rtNC.js} +1 -1
  234. package/public/dist/assets/{ChannelsTelegram-B9Feggy7.js → ChannelsTelegram-BLV0m1oq.js} +1 -1
  235. package/public/dist/assets/{CodeCanvas-BzhNLZVF.js → CodeCanvas-COgs1P6U.js} +2 -2
  236. package/public/dist/assets/{DashboardEmbeddingSection-CocnWvOE.js → DashboardEmbeddingSection-DMgHZQnn.js} +1 -1
  237. package/public/dist/assets/{DashboardMeta-C9BshDiw.js → DashboardMeta-B7CVqXcU.js} +1 -1
  238. package/public/dist/assets/DesignPanel-3XpGjuEW.css +1 -0
  239. package/public/dist/assets/DesignPanel-BGMPhZSx.js +2 -0
  240. package/public/dist/assets/{DiffPanel-DsFwEFjd.js → DiffPanel-B_ljObDk.js} +1 -1
  241. package/public/dist/assets/{Display-D_r_BwdJ.js → Display-BF-rACK6.js} +1 -1
  242. package/public/dist/assets/{DocPanel-6Z_RELzd.js → DocPanel-DtYwv3n3.js} +1 -1
  243. package/public/dist/assets/{Employees-DL3R3z7K.js → Employees-D3hnciP0.js} +1 -1
  244. package/public/dist/assets/{FolderPanel-DdlzWAuK.js → FolderPanel-DbPhzzvi.js} +3 -3
  245. package/public/dist/assets/{Heartbeat-BblY8Z4a.js → Heartbeat-Dk-_TtKV.js} +1 -1
  246. package/public/dist/assets/{InlineWarn-DrqqH39Y.js → InlineWarn-DDzeHxQw.js} +1 -1
  247. package/public/dist/assets/{MarkdownRenderer-Cl0oEICj.js → MarkdownRenderer-CHacL2M_.js} +2 -2
  248. package/public/dist/assets/MarkdownRenderer-DyrB9FbZ.js +1 -0
  249. package/public/dist/assets/{Mcp-CP6h9IQP.js → Mcp-SfytKWGX.js} +1 -1
  250. package/public/dist/assets/{Memory-BWcfxzCz.js → Memory-BOicOlcn.js} +1 -1
  251. package/public/dist/assets/{MilkdownWysiwygEditor-B-j0IUe6.js → MilkdownWysiwygEditor-BNoLGbFC.js} +1 -1
  252. package/public/dist/assets/{ModelProvider-D4LBX7K2.js → ModelProvider-DQ2AA0gJ.js} +1 -1
  253. package/public/dist/assets/{Network-TkeE8ldB.js → Network-DISUhige.js} +1 -1
  254. package/public/dist/assets/{NotesGraphWorkspace-B55jfeiE.js → NotesGraphWorkspace-Dm1xUFl8.js} +1 -1
  255. package/public/dist/assets/PanelLayoutProvider-XpTo-i_s.js +1 -0
  256. package/public/dist/assets/{Permissions-Dc5xnPMu.js → Permissions-CnKt44dN.js} +1 -1
  257. package/public/dist/assets/Permissions-DNT0TxYL.js +1 -0
  258. package/public/dist/assets/{Profile-Bacunq6W.js → Profile-B8yBO3Ju.js} +1 -1
  259. package/public/dist/assets/{Prompts-D36Mj9HS.js → Prompts-5lNQ5qOm.js} +1 -1
  260. package/public/dist/assets/{SpeechKeys-Dda4Dt6M.js → SpeechKeys-BepaIHBa.js} +1 -1
  261. package/public/dist/assets/{TelegramHub-CuJoPPib.js → TelegramHub--DNjRAwW.js} +1 -1
  262. package/public/dist/assets/{TerminalPanel-DSCJeGjp.js → TerminalPanel-DQovYfwz.js} +1 -1
  263. package/public/dist/assets/{TransportStatusChips-C5QcQVCy.js → TransportStatusChips-Bld0yXi7.js} +1 -1
  264. package/public/dist/assets/app-BJVZZqTm.js +55 -0
  265. package/public/dist/assets/app-CvNmD8jx.css +1 -0
  266. package/public/dist/assets/architecture-7EHR7CIX-D-6Nx315.js +1 -0
  267. package/public/dist/assets/{architectureDiagram-3BPJPVTR-C4lVLx8A.js → architectureDiagram-3BPJPVTR-q8idz3H3.js} +1 -1
  268. package/public/dist/assets/{bgtask-badge-b7pj_Dbh.js → bgtask-badge-Bz8_kUKd.js} +1 -1
  269. package/public/dist/assets/bgtask-badge-iOk9R0RF.js +1 -0
  270. package/public/dist/assets/{blockDiagram-GPEHLZMM-BHjdqDcb.js → blockDiagram-GPEHLZMM-DGB0dsia.js} +1 -1
  271. package/public/dist/assets/{c4Diagram-AAUBKEIU-B1QuN7gf.js → c4Diagram-AAUBKEIU-ChP5YfVt.js} +1 -1
  272. package/public/dist/assets/channel-ByNDsZsH.js +1 -0
  273. package/public/dist/assets/{chunk-2J33WTMH-D1olIwij.js → chunk-2J33WTMH-D3OPoEHg.js} +1 -1
  274. package/public/dist/assets/{chunk-3OPIFGDE-Cf7991q8.js → chunk-3OPIFGDE-CULJ8ZHF.js} +1 -1
  275. package/public/dist/assets/{chunk-4BX2VUAB-zmO3Vjrm.js → chunk-4BX2VUAB-DGgktZYr.js} +1 -1
  276. package/public/dist/assets/{chunk-4EGX6M5U-B-uS9w6F.js → chunk-4EGX6M5U-BD3v8KR4.js} +1 -1
  277. package/public/dist/assets/chunk-55IACEB6-CQFLXxVc.js +1 -0
  278. package/public/dist/assets/{chunk-5DO6E6H7-AkI69lqb.js → chunk-5DO6E6H7-B-FbGqHn.js} +1 -1
  279. package/public/dist/assets/{chunk-5ZQYHXKU-C3d9OOmT.js → chunk-5ZQYHXKU-DVpWOoGS.js} +1 -1
  280. package/public/dist/assets/{chunk-727SXJPM-BOt5gU_h.js → chunk-727SXJPM-CZjR7q6H.js} +1 -1
  281. package/public/dist/assets/{chunk-AQP2D5EJ-CrRyjYkJ.js → chunk-AQP2D5EJ-BlGjnlsV.js} +1 -1
  282. package/public/dist/assets/{chunk-BR22UD5L-DR9GxWFk.js → chunk-BR22UD5L-MK8KuB9X.js} +1 -1
  283. package/public/dist/assets/{chunk-BSJP7CBP-B24w6Ihw.js → chunk-BSJP7CBP-ypXC4wBv.js} +1 -1
  284. package/public/dist/assets/{chunk-CSCIHK7Q-BPBO8B3q.js → chunk-CSCIHK7Q-CmvetykJ.js} +1 -1
  285. package/public/dist/assets/{chunk-FHYWG6QK-CXhRbK1g.js → chunk-FHYWG6QK-Do5csWDm.js} +1 -1
  286. package/public/dist/assets/{chunk-FMBD7UC4-tu50fn_l.js → chunk-FMBD7UC4-BXpT25MP.js} +1 -1
  287. package/public/dist/assets/{chunk-KSCS5N6A-CnJg0Z_l.js → chunk-KSCS5N6A-DtlfLqto.js} +1 -1
  288. package/public/dist/assets/{chunk-L5ZTLDWV-B3Ak80dW.js → chunk-L5ZTLDWV-Czv9NkHn.js} +1 -1
  289. package/public/dist/assets/{chunk-LZXEDZCA-C3fVGX8q.js → chunk-LZXEDZCA-vD7oFdiq.js} +1 -1
  290. package/public/dist/assets/{chunk-MPE355IW-iQbf4K4s.js → chunk-MPE355IW-2ei0PVn0.js} +1 -1
  291. package/public/dist/assets/{chunk-MZUSXYTE-BEKROhpC.js → chunk-MZUSXYTE-JO_qTk4K.js} +1 -1
  292. package/public/dist/assets/{chunk-N66VUXT2-DUtPpNne.js → chunk-N66VUXT2-BXL-FniY.js} +1 -1
  293. package/public/dist/assets/{chunk-ND2GUHAM-DW2SkbNq.js → chunk-ND2GUHAM-B9SIO-4a.js} +1 -1
  294. package/public/dist/assets/{chunk-NZK2D7GU-SJvHIVX3.js → chunk-NZK2D7GU-CqOo06-Z.js} +1 -1
  295. package/public/dist/assets/{chunk-O5CBEL6O-D_hkyy5c.js → chunk-O5CBEL6O-BWbe_grt.js} +1 -1
  296. package/public/dist/assets/{chunk-PUPMXCY4-DcRmz6F2.js → chunk-PUPMXCY4-aFTMGBaR.js} +1 -1
  297. package/public/dist/assets/chunk-QZHKN3VN-Becu19mF.js +1 -0
  298. package/public/dist/assets/{chunk-UIBZB4QT-CFemVDOF.js → chunk-UIBZB4QT-S8EH0jZR.js} +1 -1
  299. package/public/dist/assets/{chunk-WCWK7LTN-B6ske8a4.js → chunk-WCWK7LTN-EgrNk7Dj.js} +1 -1
  300. package/public/dist/assets/chunk-WU5MYG2G-CkoHFn0F.js +1 -0
  301. package/public/dist/assets/{chunk-XPW4576I-elhPZgkY.js → chunk-XPW4576I-8oydVjY6.js} +1 -1
  302. package/public/dist/assets/classDiagram-4FO5ZUOK-DVGoKviY.js +1 -0
  303. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BIZeptY-.js +1 -0
  304. package/public/dist/assets/{copy-text-BKruhU_y.js → copy-text-BDs2wKjA.js} +1 -1
  305. package/public/dist/assets/{cose-bilkent-S5V4N54A-B-gwVajW.js → cose-bilkent-S5V4N54A-PNmvcq_6.js} +1 -1
  306. package/public/dist/assets/{dagre-BM42HDAG-C9BDjgRM.js → dagre-BM42HDAG-BP_m3uo9.js} +1 -1
  307. package/public/dist/assets/{dagre-HAOs7bVl.js → dagre-Ct2n78X9.js} +1 -1
  308. package/public/dist/assets/{diagram-2AECGRRQ-CvEawheC.js → diagram-2AECGRRQ-DhgfR-ol.js} +1 -1
  309. package/public/dist/assets/{diagram-5GNKFQAL-Da4DwByP.js → diagram-5GNKFQAL-BRLvmdeK.js} +1 -1
  310. package/public/dist/assets/{diagram-KO2AKTUF-Cnhf5Czo.js → diagram-KO2AKTUF-Co3C18-Q.js} +1 -1
  311. package/public/dist/assets/{diagram-LMA3HP47-CMusMTT2.js → diagram-LMA3HP47-3SwoWQij.js} +1 -1
  312. package/public/dist/assets/{diagram-OG6HWLK6-D5nQR5rT.js → diagram-OG6HWLK6-bjEryAd3.js} +1 -1
  313. package/public/dist/assets/{dist-jZTs_0Zg.js → dist-B6T-R4xY.js} +1 -1
  314. package/public/dist/assets/{dist-woWoxWmX.js → dist-B8V2LYzt.js} +1 -1
  315. package/public/dist/assets/{dist-DL8oabBM.js → dist-BDPUxeoi.js} +1 -1
  316. package/public/dist/assets/{dist-Dpn3ujr3.js → dist-BMC_dTfR.js} +1 -1
  317. package/public/dist/assets/{dist-C4WouNM7.js → dist-BSf40pae.js} +1 -1
  318. package/public/dist/assets/{dist-CPOW-jfg.js → dist-BlMOeJym.js} +1 -1
  319. package/public/dist/assets/dist-BmXnOAlo.js +1 -0
  320. package/public/dist/assets/{dist-C_6E126b.js → dist-BqzMcuh8.js} +1 -1
  321. package/public/dist/assets/{dist-CHB0SFvU.js → dist-BvQlb9-o.js} +1 -1
  322. package/public/dist/assets/{dist-BvgkNZ7r.js → dist-C7pD0dEn.js} +1 -1
  323. package/public/dist/assets/{dist-DvlZh9GF.js → dist-CC2vK_6S.js} +1 -1
  324. package/public/dist/assets/{dist-wdt8RQwr.js → dist-CFU9RsAu.js} +1 -1
  325. package/public/dist/assets/{dist-Y5dy_sSf.js → dist-CS1XLdz3.js} +1 -1
  326. package/public/dist/assets/{dist-CiaEUSjf.js → dist-CjzfPsGt.js} +1 -1
  327. package/public/dist/assets/{dist-DlqIM5Y-.js → dist-CvzAXxlb.js} +1 -1
  328. package/public/dist/assets/{dist-CLMpv9qF.js → dist-D8SW_REQ.js} +1 -1
  329. package/public/dist/assets/dist-DLY5I6dK.js +1 -0
  330. package/public/dist/assets/{dist-DfOlJSUk.js → dist-DMZVNaIe.js} +1 -1
  331. package/public/dist/assets/{dist-BSwjNBYz.js → dist-DN-hkAIC.js} +1 -1
  332. package/public/dist/assets/dist-DPHcMCqI.js +1 -0
  333. package/public/dist/assets/{dist-DQR4gW5j.js → dist-DStWZVZ0.js} +1 -1
  334. package/public/dist/assets/{dist-BpbqDhsq.js → dist-DTcoHNXr.js} +1 -1
  335. package/public/dist/assets/{dist-DRKfpxOd.js → dist-DdJuxxG7.js} +1 -1
  336. package/public/dist/assets/{dist-KuP6Gt4m.js → dist-DhgwoIqj.js} +1 -1
  337. package/public/dist/assets/{dist-nbzW6Sn7.js → dist-DmjSXJAP.js} +1 -1
  338. package/public/dist/assets/{dist-8hLkyg-D.js → dist-cBBDKBli.js} +1 -1
  339. package/public/dist/assets/{dist-CKTQ2eXH.js → dist-ph7PUr0c.js} +1 -1
  340. package/public/dist/assets/{dist-DGJG2rr2.js → dist-qUky5WRy.js} +1 -1
  341. package/public/dist/assets/{dist-CYw9JGM_.js → dist-w2YzIhc5.js} +1 -1
  342. package/public/dist/assets/dist-xHOEvyuU.js +1 -0
  343. package/public/dist/assets/{dockerfile-Bq20q5i6.js → dockerfile-C0jniLkw.js} +1 -1
  344. package/public/dist/assets/{employees-DbgFV33i.js → employees-BYebrTfH.js} +1 -1
  345. package/public/dist/assets/{erDiagram-TEJ5UH35-BnsX5Dzt.js → erDiagram-TEJ5UH35-DQBxHU1q.js} +1 -1
  346. package/public/dist/assets/{error-normalize-DLzj47d_.js → error-normalize-BzeO0SXE.js} +1 -1
  347. package/public/dist/assets/eventmodeling-FCH6USID-BB1OVDLb.js +1 -0
  348. package/public/dist/assets/{factor-BfAVKjvH.js → factor-nzjoQ9cK.js} +1 -1
  349. package/public/dist/assets/{fields-MeoSVgIK.js → fields-zkeByFQW.js} +1 -1
  350. package/public/dist/assets/{flowDiagram-I6XJVG4X-BSy1p30u.js → flowDiagram-I6XJVG4X-BN90fCt5.js} +1 -1
  351. package/public/dist/assets/{ganttDiagram-6RSMTGT7-BILWylat.js → ganttDiagram-6RSMTGT7-B-JAlIhh.js} +1 -1
  352. package/public/dist/assets/gitGraph-WXDBUCRP-DAWTa5Fn.js +1 -0
  353. package/public/dist/assets/{gitGraphDiagram-PVQCEYII-BaRlZZ_k.js → gitGraphDiagram-PVQCEYII-CLL2G5U-.js} +1 -1
  354. package/public/dist/assets/{graphlib-DdtRn62K.js → graphlib-B6dRm8vZ.js} +1 -1
  355. package/public/dist/assets/idb-cache-ZH6lOebk.js +1 -0
  356. package/public/dist/assets/iframe-renderer-Clu9EYLW.js +1 -0
  357. package/public/dist/assets/iframe-renderer-DACMLTYf.js +142 -0
  358. package/public/dist/assets/info-J43DQDTF-C530y5-j.js +1 -0
  359. package/public/dist/assets/{infoDiagram-5YYISTIA-BElvxLr3.js → infoDiagram-5YYISTIA-CftYDPfc.js} +1 -1
  360. package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-DPQZsd5R.js → ishikawaDiagram-YF4QCWOH-BVa5AJbz.js} +1 -1
  361. package/public/dist/assets/javascript-DbM-pSY-.js +1 -0
  362. package/public/dist/assets/{journeyDiagram-JHISSGLW-BJZNR2qA.js → journeyDiagram-JHISSGLW-BeUKm6ME.js} +1 -1
  363. package/public/dist/assets/{kanban-definition-UN3LZRKU-OQLDtH0g.js → kanban-definition-UN3LZRKU-K5DYNY4p.js} +1 -1
  364. package/public/dist/assets/{manager-rHNwUB4e.css → manager-C4eNDNFt.css} +1 -1
  365. package/public/dist/assets/manager-pcvo6od1.js +13 -0
  366. package/public/dist/assets/{memory-QobGT0Kv.js → memory-DLD5Xpk8.js} +1 -1
  367. package/public/dist/assets/memory-oWWwCkg5.js +1 -0
  368. package/public/dist/assets/mermaid-loader-Bd9rYyxD.js +1 -0
  369. package/public/dist/assets/{mermaid-parser.core-D1KUUauv.js → mermaid-parser.core-Cz70RgAa.js} +1 -1
  370. package/public/dist/assets/mermaid-preprocess-0hqEN7sn.js +5 -0
  371. package/public/dist/assets/{mermaid.core-R6dUFqZC.js → mermaid.core-Dj5GOPe1.js} +2 -2
  372. package/public/dist/assets/mermaid.core-TSG49mwm.js +1 -0
  373. package/public/dist/assets/message-history-C6D4juRe.js +1 -0
  374. package/public/dist/assets/message-history-DdIshS4Q.js +1 -0
  375. package/public/dist/assets/{mindmap-definition-RKZ34NQL-B8WJHpYI.js → mindmap-definition-RKZ34NQL-PsH0E_3e.js} +1 -1
  376. package/public/dist/assets/{nsis-CIoRNUaw.js → nsis-BI3I3OhH.js} +1 -1
  377. package/public/dist/assets/packet-YPE3B663-BHcxn4sy.js +1 -0
  378. package/public/dist/assets/{page-shell-BeAyKBJW.js → page-shell-LF7vVVfG.js} +1 -1
  379. package/public/dist/assets/pi-settings-CBUGDAuT.js +1 -0
  380. package/public/dist/assets/pie-LRSECV5Y-DjigSia_.js +1 -0
  381. package/public/dist/assets/{pieDiagram-4H26LBE5-BuBruIcx.js → pieDiagram-4H26LBE5-Dtwtlr0z.js} +1 -1
  382. package/public/dist/assets/{pug-Cb8OCun5.js → pug-DHfNwv1w.js} +1 -1
  383. package/public/dist/assets/{quadrantDiagram-W4KKPZXB-B6rzGZvr.js → quadrantDiagram-W4KKPZXB-CAFUbaV6.js} +1 -1
  384. package/public/dist/assets/radar-GUYGQ44K-DPCrmsHJ.js +1 -0
  385. package/public/dist/assets/{react-dom-CZtrmbYs.js → react-dom-AWKMTIe7.js} +1 -1
  386. package/public/dist/assets/render-E2PXsTyS.js +122 -0
  387. package/public/dist/assets/{requirementDiagram-4Y6WPE33-Cvj5JknB.js → requirementDiagram-4Y6WPE33-CvBM4AjK.js} +1 -1
  388. package/public/dist/assets/{sankeyDiagram-5OEKKPKP-DNGNYR7j.js → sankeyDiagram-5OEKKPKP-cordQgRs.js} +1 -1
  389. package/public/dist/assets/{sequenceDiagram-3UESZ5HK-DuUAH96Z.js → sequenceDiagram-3UESZ5HK-DDAqRdga.js} +1 -1
  390. package/public/dist/assets/{settings-D70uFh8l.js → settings-DYIfnpYq.js} +1 -1
  391. package/public/dist/assets/settings-core-BURhLoX3.js +1 -0
  392. package/public/dist/assets/{settings-core-B2lw2bgO.js → settings-core-DRYE_5Wb.js} +1 -1
  393. package/public/dist/assets/settings-yyDc7X3c.js +1 -0
  394. package/public/dist/assets/{sidebar-BqWm2XWP.js → sidebar-Cn-KLQ0U.js} +3 -3
  395. package/public/dist/assets/{skills-CdNOfXlk.js → skills-Brt3opa5.js} +1 -1
  396. package/public/dist/assets/skills-KHfKUuAJ.js +1 -0
  397. package/public/dist/assets/{slash-commands-4Ntm5N7h.js → slash-commands-jMNf0b43.js} +1 -1
  398. package/public/dist/assets/slash-commands-nb096e6A.js +1 -0
  399. package/public/dist/assets/{stateDiagram-AJRCARHV-DGZNs20Q.js → stateDiagram-AJRCARHV-DUaoSRgZ.js} +1 -1
  400. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-BAesfdhr.js +1 -0
  401. package/public/dist/assets/{timeline-definition-PNZ67QCA-yDl1yISI.js → timeline-definition-PNZ67QCA-D85QNy9b.js} +1 -1
  402. package/public/dist/assets/{trace-drawer-DqAwwHHQ.js → trace-drawer-Dv5cDGLR.js} +1 -1
  403. package/public/dist/assets/treeView-BLDUP644-DmufUMul.js +1 -0
  404. package/public/dist/assets/treemap-LRROVOQU-Cg48uw_D.js +1 -0
  405. package/public/dist/assets/ui-BeyzLs7f.js +2 -0
  406. package/public/dist/assets/ui-DabvyDGc.js +1 -0
  407. package/public/dist/assets/{vennDiagram-CIIHVFJN-C0TNoBYO.js → vennDiagram-CIIHVFJN-CQSILdx8.js} +1 -1
  408. package/public/dist/assets/wardley-L42UT6IY-QZOEXU7f.js +1 -0
  409. package/public/dist/assets/{wardleyDiagram-YWT4CUSO-C6cJR4Ib.js → wardleyDiagram-YWT4CUSO-BZEVMlJ4.js} +1 -1
  410. package/public/dist/assets/{wiki-link-suggestions-BMHWTE4_.js → wiki-link-suggestions-DZQc78gj.js} +1 -1
  411. package/public/dist/assets/{xychartDiagram-2RQKCTM6-DqEqpcox.js → xychartDiagram-2RQKCTM6-C8573Tgs.js} +1 -1
  412. package/public/dist/index.html +2 -2
  413. package/public/dist/manager/index.html +2 -2
  414. package/public/js/diagram/iframe-renderer.ts +197 -49
  415. package/public/js/diagram/widget-validator.ts +17 -3
  416. package/public/js/features/chat-messages.ts +5 -1
  417. package/public/js/features/chat-scroll.ts +10 -5
  418. package/public/js/features/chat.ts +9 -1
  419. package/public/js/features/elicitation.ts +1 -5
  420. package/public/js/features/message-item-html.ts +3 -1
  421. package/public/js/features/process-block.ts +46 -3
  422. package/public/js/features/settings-mcp.ts +1 -1
  423. package/public/js/locale.ts +2 -2
  424. package/public/js/main.ts +15 -4
  425. package/public/js/preview-parent-origin.ts +73 -9
  426. package/public/js/render/chart-json.ts +2 -5
  427. package/public/js/render/compose-block.ts +2 -5
  428. package/public/js/render/dataframe.ts +2 -5
  429. package/public/js/render/diff-viewer.ts +2 -5
  430. package/public/js/render/link-preview.ts +1 -5
  431. package/public/js/render/markdown.ts +22 -0
  432. package/public/js/render/post-render.ts +7 -3
  433. package/public/js/render/sanitize.ts +6 -0
  434. package/public/js/render/search-results.ts +2 -5
  435. package/public/js/streaming-render.ts +12 -1
  436. package/public/js/ui.ts +6 -3
  437. package/public/js/ws.ts +39 -25
  438. package/public/locales/en.json +2 -1
  439. package/public/locales/ja.json +2 -1
  440. package/public/locales/ko.json +2 -1
  441. package/public/locales/zh.json +2 -1
  442. package/public/manager/src/InstancePreview.tsx +35 -0
  443. package/public/manager/src/SidebarRailRouter.tsx +209 -124
  444. package/public/manager/src/browser-panel/BrowserPanel.tsx +714 -17
  445. package/public/manager/src/browser-panel/browser-panel.css +305 -0
  446. package/public/manager/src/browser-panel/use-embedded-target-sync.ts +182 -0
  447. package/public/manager/src/components/DesktopPanelControls.tsx +1 -1
  448. package/public/manager/src/design-panel/DesignPageSelector.tsx +27 -0
  449. package/public/manager/src/design-panel/DesignPanel.tsx +265 -0
  450. package/public/manager/src/design-panel/DesignViewport.tsx +34 -0
  451. package/public/manager/src/design-panel/design-api.ts +106 -0
  452. package/public/manager/src/design-panel/design-panel.css +137 -0
  453. package/public/manager/src/design-panel/design-types.ts +43 -0
  454. package/public/manager/src/folder-panel/FolderPanel.tsx +15 -1
  455. package/public/manager/src/jaw-ceo/JawCeoWorkbenchButton.tsx +10 -5
  456. package/public/manager/src/jaw-ceo/jaw-ceo.css +8 -0
  457. package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +2 -1
  458. package/public/manager/src/panels/FileFolderSplitPanel.tsx +97 -0
  459. package/public/manager/src/panels/PanelErrorBoundary.tsx +44 -0
  460. package/public/manager/src/panels/PanelLayoutProvider.tsx +569 -86
  461. package/public/manager/src/panels/RightSidebar.tsx +389 -134
  462. package/public/manager/src/panels/desktop-bridge.ts +88 -0
  463. package/public/manager/src/panels/panel-layout-registry-state.ts +252 -10
  464. package/public/manager/src/panels/panels.css +479 -0
  465. package/public/manager/src/panels/right-sidebar-tab-display.ts +36 -0
  466. package/public/manager/src/panels/types.ts +79 -4
  467. package/public/manager/src/types.ts +11 -0
  468. package/scripts/bundle-sidecar.sh +3 -0
  469. package/scripts/check-strict-baseline.mjs +26 -2
  470. package/scripts/docs/check-docs.mts +87 -0
  471. package/scripts/docs/extract-commands.mts +215 -0
  472. package/scripts/docs/extract-routes.mts +350 -0
  473. package/scripts/release-gates.mjs +32 -0
  474. package/public/dist/assets/BrowserPanel-CV_bbQpM.css +0 -1
  475. package/public/dist/assets/BrowserPanel-Ua0Xck6V.js +0 -1
  476. package/public/dist/assets/MarkdownRenderer-BivJ4hJm.js +0 -1
  477. package/public/dist/assets/Permissions-CddCEaJl.js +0 -1
  478. package/public/dist/assets/app-BPsa7jSJ.css +0 -1
  479. package/public/dist/assets/app-DszWzakT.js +0 -55
  480. package/public/dist/assets/architecture-7EHR7CIX-GJhmD5MC.js +0 -1
  481. package/public/dist/assets/bgtask-badge-DZEQ5fMl.js +0 -1
  482. package/public/dist/assets/channel-Sut8CY6m.js +0 -1
  483. package/public/dist/assets/chunk-55IACEB6-C3KMx7HH.js +0 -1
  484. package/public/dist/assets/chunk-QZHKN3VN-C7Qk10ab.js +0 -1
  485. package/public/dist/assets/chunk-WU5MYG2G-BpCiJpUL.js +0 -1
  486. package/public/dist/assets/classDiagram-4FO5ZUOK-BVeAlcVw.js +0 -1
  487. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-mvRsJL7t.js +0 -1
  488. package/public/dist/assets/dist-BQ6IjZAx.js +0 -1
  489. package/public/dist/assets/dist-CB1yXHdY.js +0 -1
  490. package/public/dist/assets/dist-El7lM3OZ.js +0 -1
  491. package/public/dist/assets/dist-ZXqltO6b.js +0 -1
  492. package/public/dist/assets/eventmodeling-FCH6USID-BASBZB6y.js +0 -1
  493. package/public/dist/assets/gitGraph-WXDBUCRP-C6UAXKTO.js +0 -1
  494. package/public/dist/assets/idb-cache-DQM-odDV.js +0 -1
  495. package/public/dist/assets/info-J43DQDTF-DZvaZ8fx.js +0 -1
  496. package/public/dist/assets/javascript-ocJZALE4.js +0 -1
  497. package/public/dist/assets/manager-CdNOlCyS.js +0 -13
  498. package/public/dist/assets/memory-BT-rs3ag.js +0 -1
  499. package/public/dist/assets/mermaid-loader-BMIvbrMb.js +0 -1
  500. package/public/dist/assets/mermaid-preprocess-CqOBWYEb.js +0 -5
  501. package/public/dist/assets/mermaid.core-CE6des8A.js +0 -1
  502. package/public/dist/assets/message-history-BY1UNJAO.js +0 -1
  503. package/public/dist/assets/message-history-BmP5JKio.js +0 -142
  504. package/public/dist/assets/packet-YPE3B663-Br_gfHDJ.js +0 -1
  505. package/public/dist/assets/pi-settings-BVYmGHWD.js +0 -1
  506. package/public/dist/assets/pie-LRSECV5Y-CPSw09Lc.js +0 -1
  507. package/public/dist/assets/radar-GUYGQ44K-D5jGe4n0.js +0 -1
  508. package/public/dist/assets/render-C3r-9_-J.js +0 -119
  509. package/public/dist/assets/settings-CJm8ZSJs.js +0 -1
  510. package/public/dist/assets/settings-core-gdS0lo1b.js +0 -1
  511. package/public/dist/assets/skills-DG_CbTEf.js +0 -1
  512. package/public/dist/assets/slash-commands-B9kOEhJ_.js +0 -1
  513. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-D2I0t9Bo.js +0 -1
  514. package/public/dist/assets/treeView-BLDUP644-i3ZwrLGf.js +0 -1
  515. package/public/dist/assets/treemap-LRROVOQU-CJRBfbOx.js +0 -1
  516. package/public/dist/assets/ui-Anw2S64o.js +0 -1
  517. package/public/dist/assets/ui-DsK6r0Xv.js +0 -2
  518. package/public/dist/assets/wardley-L42UT6IY-B1NLyOET.js +0 -1
  519. /package/public/dist/assets/{agent-meta-FyI15KAa.js → agent-meta-tiPlp7OI.js} +0 -0
  520. /package/public/dist/assets/{api-DvCd2Uff.js → api-C9dOxby7.js} +0 -0
  521. /package/public/dist/assets/{apl-CUNx2Nxr.js → apl-2tE96F_Y.js} +0 -0
  522. /package/public/dist/assets/{asciiarmor-B9JjJqLb.js → asciiarmor-ynSKiC17.js} +0 -0
  523. /package/public/dist/assets/{asn1-NstwUq_r.js → asn1-CfqO1VY8.js} +0 -0
  524. /package/public/dist/assets/{asterisk-Box6GWx7.js → asterisk-DSiRJoqT.js} +0 -0
  525. /package/public/dist/assets/{brainfuck-DAD60u2v.js → brainfuck-DTcanv-8.js} +0 -0
  526. /package/public/dist/assets/{chunk-AGHRB4JF-BeNb9aN4.js → chunk-AGHRB4JF-BXLzSehp.js} +0 -0
  527. /package/public/dist/assets/{chunk-NNHCCRGN-hPUSf84G.js → chunk-NNHCCRGN-D69GtSOc.js} +0 -0
  528. /package/public/dist/assets/{clike-B-3e4_rA.js → clike-qn72CMAj.js} +0 -0
  529. /package/public/dist/assets/{clojure-DpNVclFl.js → clojure-m8yDiYVc.js} +0 -0
  530. /package/public/dist/assets/{cmake-DzNe63Ys.js → cmake-4AHAWHiF.js} +0 -0
  531. /package/public/dist/assets/{cobol-CoytNvhw.js → cobol-CxxJP5eX.js} +0 -0
  532. /package/public/dist/assets/{coffeescript-Cq3xHp7h.js → coffeescript-BAB3zi48.js} +0 -0
  533. /package/public/dist/assets/{commonlisp-CVjsh9SW.js → commonlisp-BPbWuAds.js} +0 -0
  534. /package/public/dist/assets/{constants-EMUBd5RQ.js → constants-DzwdndBj.js} +0 -0
  535. /package/public/dist/assets/{crystal-BlIILE-v.js → crystal-CGuSsWYR.js} +0 -0
  536. /package/public/dist/assets/{css-D1TAh_-V.js → css-DszbR74r.js} +0 -0
  537. /package/public/dist/assets/{cypher-ZntLuJzU.js → cypher-GUnmv522.js} +0 -0
  538. /package/public/dist/assets/{cytoscape.esm-89N3cqwG.js → cytoscape.esm-D_XyYSBG.js} +0 -0
  539. /package/public/dist/assets/{d-CzwXOQ5h.js → d-Cfm0cznj.js} +0 -0
  540. /package/public/dist/assets/{desktop-bridge-B1whMBS2.js → desktop-bridge-CvdhnJQo.js} +0 -0
  541. /package/public/dist/assets/{diff-DI7-Ikca.js → diff-C6rPA7NX.js} +0 -0
  542. /package/public/dist/assets/{dist-B51C28kc.js → dist-AgQwqBLq.js} +0 -0
  543. /package/public/dist/assets/{dtd-7UKQtPWR.js → dtd-Dxh5tS6M.js} +0 -0
  544. /package/public/dist/assets/{dylan-CM1mkXYp.js → dylan-BdIVFR1j.js} +0 -0
  545. /package/public/dist/assets/{ebnf-Llv_5uW5.js → ebnf-iU-8xYFu.js} +0 -0
  546. /package/public/dist/assets/{ecl-uqtp9saI.js → ecl-DjbzOHI6.js} +0 -0
  547. /package/public/dist/assets/{eiffel-BqzGlVPY.js → eiffel-B2ID8LZ3.js} +0 -0
  548. /package/public/dist/assets/{elm-bajSbBYX.js → elm-B6vPcfMj.js} +0 -0
  549. /package/public/dist/assets/{erlang-B5uEM5Ke.js → erlang-nDQwRdZV.js} +0 -0
  550. /package/public/dist/assets/{esm-3SgqVBY5.js → esm-CT1xxdH5.js} +0 -0
  551. /package/public/dist/assets/{fcl-BcH_K33Z.js → fcl-Bf86o55I.js} +0 -0
  552. /package/public/dist/assets/{folder-drag-payload-DE3ZS9PZ.js → folder-drag-payload-Bhln9Mk2.js} +0 -0
  553. /package/public/dist/assets/{forth-DpLesGXt.js → forth-CeQJji0n.js} +0 -0
  554. /package/public/dist/assets/{fortran--G-GJVGI.js → fortran-Dm_CqDsH.js} +0 -0
  555. /package/public/dist/assets/{gas-DpoQvniR.js → gas-e3EfgE3p.js} +0 -0
  556. /package/public/dist/assets/{gherkin-Dr59UACG.js → gherkin-Dn_7tSzg.js} +0 -0
  557. /package/public/dist/assets/{groovy-Cn2K6Dx3.js → groovy-LaKuGRkK.js} +0 -0
  558. /package/public/dist/assets/{haskell-B7lFmXEG.js → haskell-D9nNX9Mr.js} +0 -0
  559. /package/public/dist/assets/{haxe-BHWvyysr.js → haxe-Rp176QXJ.js} +0 -0
  560. /package/public/dist/assets/{http-DBZ5ODWR.js → http-BOeYLbuM.js} +0 -0
  561. /package/public/dist/assets/{idb-cache-DTKWSF12.js → idb-cache-BzzftUET.js} +0 -0
  562. /package/public/dist/assets/{idl-D6JLbJZt.js → idl-DHv3vdme.js} +0 -0
  563. /package/public/dist/assets/{javascript-CMsRa3Ah.js → javascript-Dk2fbl1a.js} +0 -0
  564. /package/public/dist/assets/{jsx-runtime-B3ZGMGGg.js → jsx-runtime-gFMgZ0TQ.js} +0 -0
  565. /package/public/dist/assets/{julia-BgEiFqoe.js → julia-D7CKCk5I.js} +0 -0
  566. /package/public/dist/assets/{livescript-Bl00ljSh.js → livescript-gRbr9rhj.js} +0 -0
  567. /package/public/dist/assets/{locale-GY3-GGWm.js → locale-DC-ZsWOf.js} +0 -0
  568. /package/public/dist/assets/{lua-C7XaZlrp.js → lua-CgZ_7bxf.js} +0 -0
  569. /package/public/dist/assets/{mathematica-8EcxUjYb.js → mathematica-B6bTyoab.js} +0 -0
  570. /package/public/dist/assets/{mbox-rZy25Spd.js → mbox-C8oQj1cJ.js} +0 -0
  571. /package/public/dist/assets/{mirc-BUmwqSCT.js → mirc-v6L6kZuh.js} +0 -0
  572. /package/public/dist/assets/{mllike-BqDqEdQF.js → mllike-CWu4RdWO.js} +0 -0
  573. /package/public/dist/assets/{modelica-MhacK6Xw.js → modelica-B3NBpX1d.js} +0 -0
  574. /package/public/dist/assets/{mscgen-B_VJszPL.js → mscgen-C8u7qRYw.js} +0 -0
  575. /package/public/dist/assets/{mumps-CEdRH9V2.js → mumps-DHjVG4PS.js} +0 -0
  576. /package/public/dist/assets/{nginx-CnXgGeyP.js → nginx-BMt87X3t.js} +0 -0
  577. /package/public/dist/assets/{notes-graph-settings-BaqO8hYl.js → notes-graph-settings-BgNrT_58.js} +0 -0
  578. /package/public/dist/assets/{ntriples-CyZcmI8c.js → ntriples-C8U-Jud2.js} +0 -0
  579. /package/public/dist/assets/{octave-DGH2kDhB.js → octave-Bq37AoFm.js} +0 -0
  580. /package/public/dist/assets/{oz-DUSpf7eX.js → oz-D6HxSRn3.js} +0 -0
  581. /package/public/dist/assets/{pascal-BYIqfrcG.js → pascal-BBqiAVg6.js} +0 -0
  582. /package/public/dist/assets/{path-utils-DX1HplvB.js → path-utils-LsJeDCKF.js} +0 -0
  583. /package/public/dist/assets/{perl-C7iNkbFR.js → perl-sHANlXjx.js} +0 -0
  584. /package/public/dist/assets/{pi-settings-D6opgoo4.js → pi-settings-Dh5lgb87.js} +0 -0
  585. /package/public/dist/assets/{pig-CR5p2dpV.js → pig-Cufgew--.js} +0 -0
  586. /package/public/dist/assets/{powershell-UK-_nKBG.js → powershell--Q4mDip6.js} +0 -0
  587. /package/public/dist/assets/{properties-CJAqwakm.js → properties-DoVpJ-kT.js} +0 -0
  588. /package/public/dist/assets/{protobuf-D3Vrac9j.js → protobuf-B5OiV2Zv.js} +0 -0
  589. /package/public/dist/assets/{provider-icons-BXm8sy5x.js → provider-icons-stsNmQKx.js} +0 -0
  590. /package/public/dist/assets/{puppet-DxgW6kGv.js → puppet-Ce_CFfqW.js} +0 -0
  591. /package/public/dist/assets/{python-C_ebQp0Y.js → python-pK7Wt6QH.js} +0 -0
  592. /package/public/dist/assets/{q-IMCDaQ03.js → q-Dd3Ltku0.js} +0 -0
  593. /package/public/dist/assets/{r-BXdh3mvZ.js → r-CsX__2f0.js} +0 -0
  594. /package/public/dist/assets/{rough.esm-BJMyUbab.js → rough.esm--LLpAgPj.js} +0 -0
  595. /package/public/dist/assets/{rpm-DA-4RGFa.js → rpm-D78AjDAl.js} +0 -0
  596. /package/public/dist/assets/{ruby-Bl1KGNRx.js → ruby-D_-KI498.js} +0 -0
  597. /package/public/dist/assets/{sas-vK1DtUVf.js → sas-D-GUPiy4.js} +0 -0
  598. /package/public/dist/assets/{scheme-DiOFQmiy.js → scheme-DF9WwQDv.js} +0 -0
  599. /package/public/dist/assets/{settings-client-Di8KLXq_.js → settings-client-CjbBShxm.js} +0 -0
  600. /package/public/dist/assets/{shell-DlO-WCDP.js → shell-BTUwbV-w.js} +0 -0
  601. /package/public/dist/assets/{sieve-CbtkgRpt.js → sieve--Z-EbGZo.js} +0 -0
  602. /package/public/dist/assets/{simple-mode-BlwHYanN.js → simple-mode-BUow4bpn.js} +0 -0
  603. /package/public/dist/assets/{smalltalk-BvKYa3AC.js → smalltalk-C2YIwVx3.js} +0 -0
  604. /package/public/dist/assets/{solr-BR4fru6p.js → solr-CYVq4fbf.js} +0 -0
  605. /package/public/dist/assets/{sparql-DXGln-02.js → sparql-Ccd4fsFv.js} +0 -0
  606. /package/public/dist/assets/{spreadsheet-vehQVAxe.js → spreadsheet-DW0WgMrS.js} +0 -0
  607. /package/public/dist/assets/{sql-DqGFyXDS.js → sql-C71Zp6qn.js} +0 -0
  608. /package/public/dist/assets/{stex-BMDhbycI.js → stex-CKuX0g_6.js} +0 -0
  609. /package/public/dist/assets/{stylus-KnS0CroG.js → stylus-CBH8s0NO.js} +0 -0
  610. /package/public/dist/assets/{swift-DgdcCI7r.js → swift-CfZoxKRA.js} +0 -0
  611. /package/public/dist/assets/{tcl-BdAMpvp9.js → tcl-D5MGbeQu.js} +0 -0
  612. /package/public/dist/assets/{textile-BHP2MzNo.js → textile-DJ3U30FW.js} +0 -0
  613. /package/public/dist/assets/{tiddlywiki-DXpY2p61.js → tiddlywiki-_fe1dHUq.js} +0 -0
  614. /package/public/dist/assets/{tiki-rmXXYsbl.js → tiki-Dd1udTrQ.js} +0 -0
  615. /package/public/dist/assets/{toml-C5KR4pi6.js → toml-xpw8pqjz.js} +0 -0
  616. /package/public/dist/assets/{troff-CCKOxFhE.js → troff-CgWiec8m.js} +0 -0
  617. /package/public/dist/assets/{ttcn-DbUUkNp1.js → ttcn-CSwmFrer.js} +0 -0
  618. /package/public/dist/assets/{ttcn-cfg-DXcL9aHC.js → ttcn-cfg-B5HVIC6z.js} +0 -0
  619. /package/public/dist/assets/{turtle-C8XIIixq.js → turtle-Cl_SuWQk.js} +0 -0
  620. /package/public/dist/assets/{vb-6dJ8H6C5.js → vb-BT131bSf.js} +0 -0
  621. /package/public/dist/assets/{vbscript-DIhYyfyM.js → vbscript-D6S8_XkU.js} +0 -0
  622. /package/public/dist/assets/{velocity-D4VFCVF7.js → velocity-9HkI645n.js} +0 -0
  623. /package/public/dist/assets/{vendor-utils-BgdgpA_R.js → vendor-utils-DJY0EWnQ.js} +0 -0
  624. /package/public/dist/assets/{verilog-CMPJNboz.js → verilog-BzMguKeI.js} +0 -0
  625. /package/public/dist/assets/{vhdl-CnU0dAe0.js → vhdl-bHScWzT1.js} +0 -0
  626. /package/public/dist/assets/{w3c-keyname-_Vjqp3zl.js → w3c-keyname-a_sRwNLm.js} +0 -0
  627. /package/public/dist/assets/{webidl-DrscPGMb.js → webidl-CbgaVHNS.js} +0 -0
  628. /package/public/dist/assets/{wiki-link-resolver-C197VhRP.js → wiki-link-resolver-BfNXN9px.js} +0 -0
  629. /package/public/dist/assets/{xquery-B8_nl088.js → xquery-DWZPmAiC.js} +0 -0
  630. /package/public/dist/assets/{yacas-BCnk2qQq.js → yacas-CEdW4z4K.js} +0 -0
  631. /package/public/dist/assets/{z80-CG_mQV7a.js → z80-CMH3qxNg.js} +0 -0
package/public/js/main.ts CHANGED
@@ -538,14 +538,17 @@ async function bootstrap(): Promise<void> {
538
538
  await initI18n();
539
539
  const langSel = document.getElementById('langSelect') as HTMLSelectElement | null;
540
540
  if (langSel) langSel.value = getLang();
541
- await loadCliRegistry();
542
- bindPerCliControlEvents();
543
541
  initHelpDialog();
544
542
  initChatSearch();
545
543
  initMediaLightbox();
546
544
  document.getElementById('chatSearchTrigger')?.addEventListener('click', toggleChatSearch);
547
545
  initAttentionBadge();
546
+ // Connect early (devlog 260705_frontend_perf H5): channel-up drives
547
+ // loadMessages(), which only needs i18n + the badge/help listeners above —
548
+ // the CLI-registry fetch below used to serially delay first history paint.
548
549
  connect();
550
+ await loadCliRegistry();
551
+ bindPerCliControlEvents();
549
552
  initDragDrop();
550
553
  initAutoResize();
551
554
  await loadCommands();
@@ -566,8 +569,16 @@ async function bootstrap(): Promise<void> {
566
569
  initGestures();
567
570
  try { sessionStorage.removeItem(STALE_BUNDLE_RELOAD_KEY); } catch {}
568
571
 
569
- // Phase 127-F2: prewarm Mermaid at idle so first diagram renders fast
570
- prewarmMermaid();
572
+ // Phase 127-F2: prewarm Mermaid at idle so first diagram renders fast.
573
+ // 260705_frontend_perf M6: check AFTER history has had a chance to load
574
+ // (channel-up → loadMessages is async) and only prewarm when the DOM
575
+ // actually contains a diagram candidate — otherwise skip the chunk fetch.
576
+ // renderMermaidBlocks still lazy-loads on demand if a diagram streams in.
577
+ setTimeout(() => {
578
+ if (document.querySelector('.mermaid-pending, [data-mermaid-code-raw], .diagram-widget-pending')) {
579
+ prewarmMermaid();
580
+ }
581
+ }, 3000);
571
582
 
572
583
  // Register Service Worker (production only — Vite HMR handles dev; skip embedded dashboard preview iframes)
573
584
  if ('serviceWorker' in navigator && !import.meta.env.DEV && !isEmbeddedPreviewFrame()) {
@@ -105,10 +105,66 @@ function isTextInputElement(element: Element): element is HTMLInputElement {
105
105
  return ['text', 'search', 'url', 'tel', 'email', 'password'].includes(element.type);
106
106
  }
107
107
 
108
+ function editableTargetFromElement(element: Element | null): HTMLInputElement | HTMLTextAreaElement | HTMLElement | null {
109
+ if (!element) return null;
110
+ if (element instanceof HTMLTextAreaElement) return element;
111
+ if (isTextInputElement(element)) return element;
112
+ const editable = element.closest('[contenteditable="true"]');
113
+ return editable instanceof HTMLElement ? editable : null;
114
+ }
115
+
116
+ function editableTargetAcceptsInput(target: HTMLInputElement | HTMLTextAreaElement | HTMLElement): boolean {
117
+ if (target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement) {
118
+ return !target.disabled && !target.readOnly;
119
+ }
120
+ return target.isContentEditable;
121
+ }
122
+
123
+ function isVisibleEditableTarget(target: HTMLInputElement | HTMLTextAreaElement | HTMLElement): boolean {
124
+ if (!editableTargetAcceptsInput(target)) return false;
125
+ if (target === document.activeElement) return true;
126
+ const style = window.getComputedStyle(target);
127
+ if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') return false;
128
+ const rect = target.getBoundingClientRect();
129
+ return rect.width > 0 && rect.height > 0;
130
+ }
131
+
132
+ function findPreviewInsertTarget(): HTMLInputElement | HTMLTextAreaElement | HTMLElement | null {
133
+ const activeTarget = editableTargetFromElement(document.activeElement);
134
+ if (activeTarget && isVisibleEditableTarget(activeTarget)) return activeTarget;
135
+
136
+ const selectors = [
137
+ '#chatInput',
138
+ 'textarea.chat-input',
139
+ 'textarea[data-chat-input="true"]',
140
+ 'textarea[aria-label*="chat" i]',
141
+ 'textarea[placeholder*="message" i]',
142
+ 'textarea[placeholder*="메시지" i]',
143
+ 'textarea[placeholder*="입력" i]',
144
+ 'textarea',
145
+ 'input[type="text"]',
146
+ 'input[type="search"]',
147
+ 'input:not([type])',
148
+ '[contenteditable="true"]',
149
+ ];
150
+ const seen = new Set<Element>();
151
+ for (const selector of selectors) {
152
+ for (const element of document.querySelectorAll(selector)) {
153
+ if (seen.has(element)) continue;
154
+ seen.add(element);
155
+ const target = editableTargetFromElement(element);
156
+ if (target && isVisibleEditableTarget(target)) return target;
157
+ }
158
+ }
159
+ return null;
160
+ }
161
+
108
162
  function insertIntoEditable(target: Element, text: string): boolean {
109
163
  if (target instanceof HTMLTextAreaElement || isTextInputElement(target)) {
110
- const start = target.selectionStart ?? target.value.length;
111
- const end = target.selectionEnd ?? start;
164
+ if (!editableTargetAcceptsInput(target)) return false;
165
+ const hasFocus = document.activeElement === target;
166
+ const start = hasFocus ? (target.selectionStart ?? target.value.length) : target.value.length;
167
+ const end = hasFocus ? (target.selectionEnd ?? start) : start;
112
168
  target.setRangeText(text, start, end, 'end');
113
169
  target.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));
114
170
  target.focus();
@@ -116,17 +172,25 @@ function insertIntoEditable(target: Element, text: string): boolean {
116
172
  }
117
173
  const editable = target.closest('[contenteditable="true"]');
118
174
  if (!(editable instanceof HTMLElement)) return false;
175
+ if (!editableTargetAcceptsInput(editable)) return false;
119
176
  const selection = window.getSelection();
120
- if (!selection || selection.rangeCount === 0) return false;
121
- const range = selection.getRangeAt(0);
122
- if (!editable.contains(range.commonAncestorContainer)) return false;
177
+ let range: Range | null = null;
178
+ if (selection && selection.rangeCount > 0) {
179
+ const selectedRange = selection.getRangeAt(0);
180
+ if (editable.contains(selectedRange.commonAncestorContainer)) range = selectedRange;
181
+ }
182
+ if (!range) {
183
+ range = document.createRange();
184
+ range.selectNodeContents(editable);
185
+ range.collapse(false);
186
+ }
123
187
  range.deleteContents();
124
188
  const node = document.createTextNode(text);
125
189
  range.insertNode(node);
126
190
  range.setStartAfter(node);
127
191
  range.setEndAfter(node);
128
- selection.removeAllRanges();
129
- selection.addRange(range);
192
+ selection?.removeAllRanges();
193
+ selection?.addRange(range);
130
194
  editable.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));
131
195
  editable.focus();
132
196
  return true;
@@ -150,8 +214,8 @@ export function ensurePreviewInsertTextListener(): void {
150
214
  reply(false, 'invalid insert request');
151
215
  return;
152
216
  }
153
- const active = document.activeElement;
154
- if (!active || !insertIntoEditable(active, text)) {
217
+ const target = findPreviewInsertTarget();
218
+ if (!target || !insertIntoEditable(target, text)) {
155
219
  reply(false, 'no editable target');
156
220
  return;
157
221
  }
@@ -1,3 +1,5 @@
1
+ import { escapeHtml } from './html.js';
2
+
1
3
  type ChartType = 'bar' | 'line' | 'pie';
2
4
 
3
5
  export type ChartJsonSpec = {
@@ -17,11 +19,6 @@ function escapeAttr(value: string): string {
17
19
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
18
20
  }
19
21
 
20
- function escapeHtml(value: string): string {
21
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
22
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
23
- }
24
-
25
22
  function clampText(value: unknown, max: number): string {
26
23
  const text = typeof value === 'string' ? value.trim() : '';
27
24
  return text.length > max ? `${text.slice(0, max - 1)}…` : text;
@@ -1,3 +1,5 @@
1
+ import { escapeHtml } from './html.js';
2
+
1
3
  type ComposeKind = 'email' | 'message' | 'document' | 'other';
2
4
 
3
5
  type ComposeVariant = {
@@ -30,11 +32,6 @@ function escapeAttr(value: string): string {
30
32
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
31
33
  }
32
34
 
33
- function escapeHtml(value: string): string {
34
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
35
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
36
- }
37
-
38
35
  function asText(value: unknown, max: number): string {
39
36
  const text = typeof value === 'string' ? value.trim() : '';
40
37
  return text.length > max ? text.slice(0, max) : text;
@@ -1,3 +1,5 @@
1
+ import { escapeHtml } from './html.js';
2
+
1
3
  type DataframeType = 'string' | 'number' | 'boolean' | 'date' | 'json';
2
4
 
3
5
  export type DataframeSpec = {
@@ -30,11 +32,6 @@ function escapeAttr(value: string): string {
30
32
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
31
33
  }
32
34
 
33
- function escapeHtml(value: string): string {
34
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
35
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
36
- }
37
-
38
35
  function clampText(value: unknown, max = MAX_CELL): string {
39
36
  let text = '';
40
37
  if (value === null || value === undefined) text = '';
@@ -1,11 +1,8 @@
1
+ import { escapeHtml } from './html.js';
2
+
1
3
  const DIFF_PATTERN = /^---\s+\S+\n\+\+\+\s+\S+\n@@\s/m;
2
4
  const MAX_LINES = 800;
3
5
 
4
- function escapeHtml(value: string): string {
5
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
6
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
7
- }
8
-
9
6
  export function isUnifiedDiff(text: string): boolean {
10
7
  return DIFF_PATTERN.test(text.trim());
11
8
  }
@@ -1,4 +1,5 @@
1
1
  import { API_BASE } from '../api.js';
2
+ import { escapeHtml } from './html.js';
2
3
 
3
4
  type LinkPreviewData = {
4
5
  title?: string;
@@ -25,11 +26,6 @@ function escapeAttr(value: string): string {
25
26
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
26
27
  }
27
28
 
28
- function escapeHtml(value: string): string {
29
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
30
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
31
- }
32
-
33
29
  function isPrivateHost(hostname: string): boolean {
34
30
  const host = hostname.replace(/^\[|\]$/g, '').toLowerCase();
35
31
  return host === 'localhost'
@@ -47,6 +47,20 @@ function renderCodeBlock(text: string, lang?: string): string {
47
47
  return `<div class="code-block"><div class="code-header"><span class="code-lang">${langDisplay}</span><button class="code-copy-btn" type="button" aria-label="${escapeHtml(copyLabel)}">${escapeHtml(copyLabel)}</button></div><pre><code class="hljs${lang ? ` language-${escapeHtml(lang)}` : ''}">${highlighted}</code></pre></div>`;
48
48
  }
49
49
 
50
+ function parseDiagramFileWidgetId(text: string): string {
51
+ const trimmed = text.trim();
52
+ if (!trimmed) return '';
53
+ if (trimmed.startsWith('{')) {
54
+ try {
55
+ const parsed = JSON.parse(trimmed) as { id?: unknown };
56
+ return typeof parsed.id === 'string' ? parsed.id.trim() : '';
57
+ } catch {
58
+ return '';
59
+ }
60
+ }
61
+ return trimmed;
62
+ }
63
+
50
64
  function ensureMarked(): boolean {
51
65
  if (markedReady) return true;
52
66
 
@@ -74,6 +88,14 @@ function ensureMarked(): boolean {
74
88
  <div class="diagram-spinner"></div>
75
89
  </div>`;
76
90
  }
91
+ if (normalizedLang === 'diagram-file') {
92
+ const widgetId = parseDiagramFileWidgetId(text);
93
+ if (!widgetId) return renderCodeBlock(text, lang);
94
+ return `<div class="diagram-widget-pending" data-widget-id="${escapeHtml(widgetId)}"
95
+ role="status" aria-label="Interactive widget loading">
96
+ <div class="diagram-spinner"></div>
97
+ </div>`;
98
+ }
77
99
  if (normalizedLang === 'elicitation' || normalizedLang === 'choice-buttons') {
78
100
  if (renderContextIsStreaming) return renderCodeBlock(text, lang);
79
101
  return renderElicitationPlaceholder(text, normalizedLang);
@@ -20,10 +20,14 @@ export function schedulePostRender(): void {
20
20
  postRenderTimer = null;
21
21
  postRenderRAF = requestAnimationFrame(() => {
22
22
  postRenderRAF = null;
23
- renderMermaidBlocks();
24
- rehighlightAll();
25
- bindDiagramZoom();
26
23
  const msgContainer = document.getElementById('chatMessages');
24
+ // Cheap guards (devlog 260705_frontend_perf M1): these three walk
25
+ // the whole container; skip when no candidate nodes exist. The
26
+ // hydrate* calls below stay unconditional — each is already a
27
+ // scoped selector scan and their call shape is a renderer contract.
28
+ if (!msgContainer || msgContainer.querySelector('.mermaid-pending, [data-mermaid-code-raw]')) renderMermaidBlocks();
29
+ if (!msgContainer || msgContainer.querySelector('.code-block pre code, .code-block-wrapper pre code')) rehighlightAll();
30
+ if (!msgContainer || msgContainer.querySelector('.diagram-zoom-btn, .mermaid-zoom-btn')) bindDiagramZoom();
27
31
  if (msgContainer) {
28
32
  hydrateElicitationBlocks(msgContainer);
29
33
  hydrateSearchResultsBlocks(msgContainer);
@@ -10,6 +10,11 @@ function purifier() {
10
10
  // and external url() references (resource loading / cookie exfiltration).
11
11
  // Internal fragment refs like url(#gradient) are preserved via negative lookahead.
12
12
  function sanitizeCssInStyleTags(html: string): string {
13
+ // Fast path: no <style> tag → nothing to strip. Avoids a full div
14
+ // innerHTML parse + serialize round-trip on every markdown render
15
+ // (devlog 260705_frontend_perf M2). False positives (literal "<style"
16
+ // in text) just take the slow path harmlessly.
17
+ if (!/<style/i.test(html)) return html;
13
18
  const div = document.createElement('div');
14
19
  div.innerHTML = html;
15
20
  for (const style of div.querySelectorAll('style')) {
@@ -59,6 +64,7 @@ export function sanitizeHtml(html: string): string {
59
64
  'data-compose-block-kind', 'data-compose-block-spec', 'data-compose-block-hydrated',
60
65
  'data-dataframe-kind', 'data-dataframe-spec', 'data-dataframe-hydrated',
61
66
  'data-chart-json-kind', 'data-chart-json-spec', 'data-chart-json-hydrated',
67
+ 'data-widget-id',
62
68
  'href', 'xlink:href', 'dominant-baseline'],
63
69
  });
64
70
  return sanitizeCssInStyleTags(clean);
@@ -1,3 +1,5 @@
1
+ import { escapeHtml } from './html.js';
2
+
1
3
  type RawSearchResult = {
2
4
  title?: unknown;
3
5
  url?: unknown;
@@ -28,11 +30,6 @@ function escapeAttr(value: string): string {
28
30
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
29
31
  }
30
32
 
31
- function escapeHtml(value: string): string {
32
- return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
33
- .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
34
- }
35
-
36
33
  function clampText(value: unknown, max = MAX_TEXT): string {
37
34
  const text = typeof value === 'string' ? value.trim().replace(/\s+/g, ' ') : '';
38
35
  return text.length > max ? `${text.slice(0, max - 1)}…` : text;
@@ -18,6 +18,17 @@ export interface StreamState {
18
18
  const FULL_RENDER_THRESHOLD = 2000;
19
19
  const THROTTLE_MS = 80; // ~12fps — was 32ms (30fps), reduced to avoid blocking input
20
20
 
21
+ // Adaptive throttle (devlog 260705_frontend_perf H4): each live render re-parses
22
+ // the FULL accumulated text (marked + sanitize), so per-render cost grows with
23
+ // message length. Stretch the interval as the text grows to keep total work
24
+ // near-linear: 80ms under 2k chars, up to 400ms past ~50k chars.
25
+ const THROTTLE_MAX_MS = 400;
26
+ function throttleMsFor(textLength: number): number {
27
+ if (textLength <= FULL_RENDER_THRESHOLD) return THROTTLE_MS;
28
+ const scaled = THROTTLE_MS * (textLength / FULL_RENDER_THRESHOLD);
29
+ return Math.min(THROTTLE_MAX_MS, Math.round(scaled));
30
+ }
31
+
21
32
  export function createStreamRenderer(el: HTMLElement): StreamState {
22
33
  return {
23
34
  chunks: [], fullText: '', textDirty: false,
@@ -57,7 +68,7 @@ export function appendChunk(ss: StreamState, chunk: string): void {
57
68
  if (ss.isFinalized) return;
58
69
  const now = performance.now();
59
70
  const text = getFullText(ss);
60
- if (text.length < FULL_RENDER_THRESHOLD || now - ss.lastRenderTime > THROTTLE_MS) {
71
+ if (text.length < FULL_RENDER_THRESHOLD || now - ss.lastRenderTime > throttleMsFor(text.length)) {
61
72
  ss.element.innerHTML = renderMarkdown(text, true) +
62
73
  '<span class="stream-cursor" aria-hidden="true"></span>';
63
74
  ss.lastRenderTime = now;
package/public/js/ui.ts CHANGED
@@ -494,11 +494,14 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
494
494
  const div = state.currentAgentDiv;
495
495
  clearMermaidTransientState(div);
496
496
  div.querySelectorAll('.diagram-widget').forEach(widget => {
497
- const encoded = (widget as HTMLElement).dataset['widgetHtml'];
498
- if (!encoded) return;
497
+ const widgetEl = widget as HTMLElement;
498
+ const encoded = widgetEl.dataset['widgetHtml'];
499
+ const widgetId = widgetEl.dataset['widgetId'];
500
+ if (!encoded && !widgetId) return;
499
501
  const pending = document.createElement('div');
500
502
  pending.className = 'diagram-widget-pending';
501
- pending.dataset['diagramHtml'] = encoded;
503
+ if (widgetId) pending.dataset['widgetId'] = widgetId;
504
+ else if (encoded) pending.dataset['diagramHtml'] = encoded;
502
505
  widget.replaceWith(pending);
503
506
  });
504
507
  if (durableToolLogJson) {
package/public/js/ws.ts CHANGED
@@ -35,10 +35,10 @@ function positionShark(roadmap: HTMLElement, shark: HTMLElement, phase: string):
35
35
  const dotRect = dot.getBoundingClientRect();
36
36
  const nextRect = nextDot.getBoundingClientRect();
37
37
  const mid = (dotRect.right + nextRect.left) / 2;
38
- shark.style.left = (mid - barRect.left - sharkW / 2) + 'px';
38
+ shark.style.transform = `translateX(${mid - barRect.left - sharkW / 2}px)`;
39
39
  } else {
40
40
  const dotRect = dot.getBoundingClientRect();
41
- shark.style.left = (dotRect.left - barRect.left + dotRect.width / 2 - sharkW / 2) + 'px';
41
+ shark.style.transform = `translateX(${dotRect.left - barRect.left + dotRect.width / 2 - sharkW / 2}px)`;
42
42
  }
43
43
  }
44
44
 
@@ -83,6 +83,7 @@ interface WsMessage {
83
83
  title?: string;
84
84
  isEmployee?: boolean;
85
85
  fromQueue?: boolean;
86
+ external?: boolean;
86
87
  reason?: HeartbeatRuntimeState['reason'];
87
88
  policy?: HeartbeatRuntimeState['policy'];
88
89
  jobId?: string;
@@ -904,6 +905,14 @@ function connectLegacyWebSocket(): void {
904
905
  }
905
906
 
906
907
  function wireEventChannel(): void {
908
+ subscribe('widget', 'widget_updated', (data) => {
909
+ const chatId = data['chatId'];
910
+ const widgetId = data['widgetId'];
911
+ if (typeof chatId !== 'string' || typeof widgetId !== 'string') return;
912
+ import('./diagram/iframe-renderer.js')
913
+ .then(m => m.refreshFileWidget(chatId, widgetId))
914
+ .catch(err => console.warn('[widget] refresh failed:', (err as Error).message));
915
+ });
907
916
  subscribe('*', null, (data) => {
908
917
  const msg = { ...data, type: data['event'] } as unknown as WsMessage;
909
918
  handleServerEvent(msg);
@@ -914,28 +923,12 @@ function wireEventChannel(): void {
914
923
  }
915
924
 
916
925
  function handleServerEvent(msg: WsMessage): void {
917
- if (msg.type === 'agent_status') {
918
- if (!msg.running && isRecentSteer()) return;
919
- if (msg.running && isRecentSteer()) clearSteer();
920
- if (msg.running !== undefined) {
921
- setStatus(msg.running ? 'running' : 'idle');
922
- } else {
923
- setStatus(msg.status || 'idle');
924
- }
925
- // Track per-agent phase for badge rendering
926
- if (msg.agentId && msg.phase) {
927
- agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };
928
- import('./features/employees.js').then(m => m.loadEmployees());
929
- }
930
- } else if (msg.type === 'bgtask_update') {
931
- import('./features/bgtask-badge.js').then(m => m.applyBgtaskUpdate(msg)).catch(() => {});
932
- } else if (msg.type === 'queue_update') {
933
- updateQueueBadge(msg.pending || 0);
934
- if (Array.isArray(msg.queued)) {
935
- renderPendingQueue(msg.queued);
936
- }
937
- syncOrchestrateSnapshot('queue_update').catch(() => { /* snapshot not critical — UI recovers on next event */ });
938
- } else if (msg.type === 'agent_tool') {
926
+ // Hot-path first (devlog 260705_frontend_perf M5): agent_tool/agent_output
927
+ // arrive many times per second during streaming — they head the chain so
928
+ // each event pays 1-2 string compares instead of walking cold branches.
929
+ // Textual order agent_tool < agent_output < agent_retry is a test contract
930
+ // (web-sse-replay-idempotency slices between those markers).
931
+ if (msg.type === 'agent_tool') {
939
932
  if (isRecentSteer()) return;
940
933
  const toolRunId = typeof msg.traceRunId === 'string' && msg.traceRunId ? msg.traceRunId : null;
941
934
  const toolSeq = positiveSeq(msg.traceSeq);
@@ -999,6 +992,27 @@ function handleServerEvent(msg: WsMessage): void {
999
992
  liveAppliedTextLen = msg.textLen;
1000
993
  }
1001
994
  appendAgentText(outputText);
995
+ } else if (msg.type === 'agent_status') {
996
+ if (!msg.running && isRecentSteer()) return;
997
+ if (msg.running && isRecentSteer()) clearSteer();
998
+ if (msg.running !== undefined) {
999
+ setStatus(msg.running ? 'running' : 'idle');
1000
+ } else {
1001
+ setStatus(msg.status || 'idle');
1002
+ }
1003
+ // Track per-agent phase for badge rendering
1004
+ if (msg.agentId && msg.phase) {
1005
+ agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };
1006
+ import('./features/employees.js').then(m => m.loadEmployees());
1007
+ }
1008
+ } else if (msg.type === 'bgtask_update') {
1009
+ import('./features/bgtask-badge.js').then(m => m.applyBgtaskUpdate(msg)).catch(() => {});
1010
+ } else if (msg.type === 'queue_update') {
1011
+ updateQueueBadge(msg.pending || 0);
1012
+ if (Array.isArray(msg.queued)) {
1013
+ renderPendingQueue(msg.queued);
1014
+ }
1015
+ syncOrchestrateSnapshot('queue_update').catch(() => { /* snapshot not critical — UI recovers on next event */ });
1002
1016
  } else if (msg.type === 'agent_retry') {
1003
1017
  const retryDelay = Number(msg.delay ?? 0);
1004
1018
  const retryReasonValue = (msg as WsMessage & { reason?: unknown }).reason;
@@ -1074,7 +1088,7 @@ function handleServerEvent(msg: WsMessage): void {
1074
1088
  markRunFinalized(null); // killed run — drop its replayed stream too
1075
1089
  finalizeAgent('');
1076
1090
  setStatus('steering');
1077
- } else if (msg.type === 'new_message' && (msg.source === 'telegram' || msg.source === 'discord' || msg.source === 'bgtask' || msg.fromQueue === true)) {
1091
+ } else if (msg.type === 'new_message' && (msg.source === 'telegram' || msg.source === 'discord' || msg.source === 'bgtask' || msg.source === 'cli' || msg.source === 'goal' || msg.external === true || msg.fromQueue === true)) {
1078
1092
  const newMessageRole = msg.role === 'assistant' ? 'agent' : (msg.role || 'user');
1079
1093
  const newMessageContent = msg.content || '';
1080
1094
  const newMessageCli = msg.cli;
@@ -801,5 +801,6 @@
801
801
  "help.keyboardShortcuts.subcmd.1": "/help — Show full command list",
802
802
  "help.keyboardShortcuts.subcmd.2": "/help <command> — Show detailed help for a specific command",
803
803
  "help.keyboardShortcuts.subcmd.3": "/commands — Open command palette (alias: /cmd)",
804
- "bgtask.title": "Background"
804
+ "bgtask.title": "Background",
805
+ "tg.elicitationExpired": "Selection expired. Please reply with text."
805
806
  }
@@ -790,5 +790,6 @@
790
790
  "help.keyboardShortcuts.subcmd.1": "/help — 全コマンド一覧を表示します",
791
791
  "help.keyboardShortcuts.subcmd.2": "/help <command> — 特定コマンドの詳細ヘルプを表示します",
792
792
  "help.keyboardShortcuts.subcmd.3": "/commands — コマンドパレットを開きます(エイリアス: /cmd)",
793
- "bgtask.title": "バックグラウンド"
793
+ "bgtask.title": "バックグラウンド",
794
+ "tg.elicitationExpired": "選択セッションの有効期限が切れました。テキストで返信してください。"
794
795
  }
@@ -801,5 +801,6 @@
801
801
  "help.keyboardShortcuts.subcmd.1": "/help — 전체 명령어 목록을 표시합니다",
802
802
  "help.keyboardShortcuts.subcmd.2": "/help <command> — 특정 명령어의 상세 도움말을 표시합니다",
803
803
  "help.keyboardShortcuts.subcmd.3": "/commands — 명령 팔레트를 엽니다 (별칭: /cmd)",
804
- "bgtask.title": "백그라운드"
804
+ "bgtask.title": "백그라운드",
805
+ "tg.elicitationExpired": "선택 세션이 만료되었습니다. 텍스트로 답해주세요."
805
806
  }
@@ -790,5 +790,6 @@
790
790
  "help.keyboardShortcuts.subcmd.1": "/help — 显示完整命令列表",
791
791
  "help.keyboardShortcuts.subcmd.2": "/help <command> — 显示特定命令的详细帮助",
792
792
  "help.keyboardShortcuts.subcmd.3": "/commands — 打开命令面板(别名: /cmd)",
793
- "bgtask.title": "后台任务"
793
+ "bgtask.title": "后台任务",
794
+ "tg.elicitationExpired": "选择会话已过期,请用文字回复。"
794
795
  }
@@ -18,10 +18,20 @@ type InstancePreviewProps = {
18
18
  onOpenDocFromPreview?: (absolutePath: string) => void;
19
19
  onPreviewDroppedFiles?: (files: File[]) => void;
20
20
  docPanelCapable?: boolean;
21
+ previewInsertTextRequest?: PreviewInsertTextRequest | null;
22
+ onPreviewInsertTextResult?: (id: string, result: PreviewInsertTextResult) => void;
21
23
  };
22
24
 
23
25
  const PREVIEW_IFRAME_SANDBOX = 'allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads';
24
26
 
27
+ export type PreviewInsertTextRequest = {
28
+ id: string;
29
+ port: number;
30
+ text: string;
31
+ };
32
+
33
+ export type PreviewInsertTextResult = { ok: true } | { ok: false; error: string };
34
+
25
35
  type PreviewOpenNotesMessage = {
26
36
  type?: unknown;
27
37
  path?: unknown;
@@ -240,6 +250,7 @@ function extractDroppedFiles(data: PreviewDroppedFilesMessage | null): File[] {
240
250
  export function InstancePreview(props: InstancePreviewProps) {
241
251
  const iframeRef = useRef<HTMLIFrameElement | null>(null);
242
252
  const loadedSrcRef = useRef<string | null>(null);
253
+ const handledInsertRequestRef = useRef<string | null>(null);
243
254
  const [pathDropStatus, setPathDropStatus] = useState<string | null>(null);
244
255
  const [folderDragActive, setFolderDragActive] = useState(false);
245
256
  const state = buildPreviewState(
@@ -259,6 +270,30 @@ export function InstancePreview(props: InstancePreviewProps) {
259
270
  postPreviewTheme(iframeRef.current, state.src, props.theme);
260
271
  }, [props.enabled, props.theme, state.canPreview, state.src]);
261
272
 
273
+ useEffect(() => {
274
+ const request = props.previewInsertTextRequest;
275
+ if (!request || handledInsertRequestRef.current === request.id) return;
276
+ handledInsertRequestRef.current = request.id;
277
+ const finish = (result: PreviewInsertTextResult): void => {
278
+ props.onPreviewInsertTextResult?.(request.id, result);
279
+ };
280
+ if (!props.instance?.ok || props.instance.port !== request.port) {
281
+ finish({ ok: false, error: 'selected instance preview is not mounted' });
282
+ return;
283
+ }
284
+ if (!props.enabled || !state.canPreview || !state.src) {
285
+ finish({ ok: false, error: disabledReason || 'selected instance preview is unavailable' });
286
+ return;
287
+ }
288
+ if (loadedSrcRef.current !== state.src) {
289
+ finish({ ok: false, error: 'selected instance preview is still loading' });
290
+ return;
291
+ }
292
+ void postPreviewInsertText(iframeRef.current, state.src, request.text)
293
+ .then(finish)
294
+ .catch(error => finish({ ok: false, error: (error as Error).message }));
295
+ }, [disabledReason, props.enabled, props.instance, props.onPreviewInsertTextResult, props.previewInsertTextRequest, state.canPreview, state.src]);
296
+
262
297
  const handleFolderPathDrop = useCallback(async (event: React.DragEvent): Promise<void> => {
263
298
  if (!hasFolderPanelDragPayload(event.dataTransfer)) return;
264
299
  event.preventDefault();