cli-jaw 2.2.4-preview.20260703203439 → 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
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useState, type ReactNode, Suspense } from 'react';
1
+ import { useCallback, useEffect, useRef, useState, type ReactNode, Suspense } from 'react';
2
2
  import { ActivityDock } from './components/ActivityDock';
3
3
  import { InstanceDrawer } from './components/InstanceDrawer';
4
4
  import { InstanceNavigator } from './components/InstanceNavigator';
@@ -12,7 +12,7 @@ import { BottomPanel, type BottomPanelRenderControls } from './panels/BottomPane
12
12
  import { usePanelLayout } from './panels/PanelLayoutProvider';
13
13
  import { currentManagerSurface } from './panels/panel-capabilities';
14
14
  import { getDesktop } from './panels/desktop-bridge';
15
- import type { RightPanelMode, BottomPanelTab } from './panels/types';
15
+ import type { RightSidebarTabKind, RightSidebarOpenTab, BottomPanelTab } from './panels/types';
16
16
  import type { FolderPanelSessionState } from './folder-panel/folder-panel-session';
17
17
  import type { WorkbenchRepoRootMode } from './workbench/workbench-resource-types';
18
18
 
@@ -21,7 +21,9 @@ const DiffPanel = lazy(() => import('./diff-panel/DiffPanel').then(m => ({ defau
21
21
  const FolderPanel = lazy(() => import('./folder-panel/FolderPanel').then(m => ({ default: m.FolderPanel })));
22
22
  const DocPanel = lazy(() => import('./doc-panel/DocPanel').then(m => ({ default: m.DocPanel })));
23
23
  const BrowserPanel = lazy(() => import('./browser-panel/BrowserPanel').then(m => ({ default: m.BrowserPanel })));
24
- import { InstancePreview } from './InstancePreview';
24
+ const DesignPanel = lazy(() => import('./design-panel/DesignPanel').then(m => ({ default: m.DesignPanel })));
25
+ import { FileFolderSplitPanel } from './panels/FileFolderSplitPanel';
26
+ import { InstancePreview, type PreviewInsertTextRequest, type PreviewInsertTextResult } from './InstancePreview';
25
27
  import { DashboardSettingsSidebar, type DashboardSettingsSection } from './dashboard-settings/DashboardSettingsSidebar';
26
28
  import { DashboardSettingsWorkspace } from './dashboard-settings/DashboardSettingsWorkspace';
27
29
  import { NotesSidebar, type NotesSidebarMode } from './notes/NotesSidebar';
@@ -34,6 +36,7 @@ import { DashboardScheduleWorkspace } from './dashboard-schedule/DashboardSchedu
34
36
  import { DashboardRemindersSidebar, type RemindersView } from './dashboard-reminders/DashboardRemindersSidebar';
35
37
  import { DashboardRemindersWorkspace } from './dashboard-reminders/DashboardRemindersWorkspace';
36
38
  import { useRemindersFeed } from './dashboard-reminders/useRemindersFeed';
39
+ import { useEmbeddedBrowserTargetSync } from './browser-panel/use-embedded-target-sync';
37
40
  import {
38
41
  describeDroppedPathsEvent,
39
42
  firstDirectory,
@@ -65,7 +68,6 @@ import type { JawCeoVoiceController } from './jaw-ceo/useJawCeoVoice';
65
68
  import { ModeSwitch } from './code/ModeSwitch';
66
69
  const CodeCanvas = lazy(() => import('./code/CodeCanvas').then(m => ({ default: m.CodeCanvas })));
67
70
  import './code/code.css';
68
- import { useWorkbenchResourceState } from './workbench/useWorkbenchResourceState';
69
71
 
70
72
  type WorkspaceSurfaceProps = {
71
73
  active: boolean;
@@ -170,107 +172,162 @@ type Props = {
170
172
  workingDir: string;
171
173
  };
172
174
 
175
+ type RightPanelRenderContext = {
176
+ /** Active module tab id (keep-alive bodies need to know visibility). */
177
+ activeTabId: string | null;
178
+ /** Selected instance's primary projectDir (Design OD-2 snapshot source). */
179
+ primaryProjectDir: string | null;
180
+ /** Fallback Files root for tabs that have no root of their own yet. */
181
+ fallbackFolderRootPath: string | null;
182
+ /** The Files tab whose state feeds the singleton Diff panel (active or first). */
183
+ diffFilesTab: RightSidebarOpenTab | null;
184
+ gitRefreshVersion: number;
185
+ onOpenFileGlobal: (path: string) => void;
186
+ onTabPreviewFile: (tabId: string, path: string) => void;
187
+ onTabRootChange: (tabId: string, path: string | null) => void;
188
+ onTabRepoRootChange: (tabId: string, path: string | null, mode?: WorkbenchRepoRootMode) => void;
189
+ onFollowInstanceRepoRoot: (tabId: string | null, path: string | null) => void;
190
+ onBrowserPageState: (tabId: string, state: { url: string; title: string }) => void;
191
+ onOpenBrowserWindow: (url: string) => void;
192
+ onInsertCommentIntoPreview: (port: number, text: string) => Promise<PreviewInsertTextResult>;
193
+ onGitRefresh: () => void;
194
+ selectedInstance: DashboardInstance | null;
195
+ dashboardSettingsUi: DashboardRegistryUi;
196
+ onDashboardSettingsPatch: (patch: Partial<DashboardRegistryUi>) => void;
197
+ notesModel: NotesModelState;
198
+ folderSessions: Record<string, FolderPanelSessionState | null>;
199
+ onFolderSessionChange: (tabId: string, state: FolderPanelSessionState) => void;
200
+ };
201
+
173
202
  function renderRightPanelContent(
174
- mode: RightPanelMode,
175
- previewFilePath: string | null,
176
- folderRootPath: string | null,
177
- repoRootPath: string | null,
178
- repoRootMode: WorkbenchRepoRootMode,
179
- gitRefreshVersion: number,
180
- onPreviewFile: (path: string) => void,
181
- onFolderRootChange: (path: string | null) => void,
182
- onRepoRootChange: (path: string | null, mode?: WorkbenchRepoRootMode) => void,
183
- onFollowInstanceRepoRoot: (path: string | null) => void,
184
- onGitRefresh: () => void,
185
- selectedInstance: DashboardInstance | null,
186
- dashboardSettingsUi: DashboardRegistryUi,
187
- onDashboardSettingsPatch: (patch: Partial<DashboardRegistryUi>) => void,
188
- notesModel: NotesModelState,
189
- jawCeoPanel: ReactNode,
190
- folderPanelSession: FolderPanelSessionState | null,
191
- onFolderPanelSessionChange: (state: FolderPanelSessionState) => void,
203
+ kind: RightSidebarTabKind,
204
+ tab: RightSidebarOpenTab,
205
+ ctx: RightPanelRenderContext,
192
206
  ): ReactNode {
193
207
  const fallback = <div style={{ padding: '12px', color: 'var(--text-dim)', fontSize: '12px' }}>Loading...</div>;
194
- switch (mode) {
195
- case 'diff': return <Suspense fallback={fallback}><DiffPanel
196
- selectedInstance={selectedInstance}
197
- settings={dashboardSettingsUi}
198
- folderRootPath={folderRootPath}
199
- repoRootPath={repoRootPath}
200
- repoRootMode={repoRootMode}
201
- selectedFilePath={previewFilePath}
202
- onRepoRootChange={onRepoRootChange}
203
- onFollowInstanceRepoRoot={onFollowInstanceRepoRoot}
204
- onPreviewFile={onPreviewFile}
205
- onGitRefresh={onGitRefresh}
206
- onSettingsPatch={onDashboardSettingsPatch}
208
+ switch (kind) {
209
+ case 'diff': {
210
+ const refTab = ctx.diffFilesTab;
211
+ const files = refTab?.files ?? {};
212
+ return <Suspense fallback={fallback}><DiffPanel
213
+ selectedInstance={ctx.selectedInstance}
214
+ settings={ctx.dashboardSettingsUi}
215
+ folderRootPath={files.folderRootPath ?? ctx.fallbackFolderRootPath}
216
+ repoRootPath={files.repoRootPath ?? null}
217
+ repoRootMode={files.repoRootMode ?? 'instance'}
218
+ selectedFilePath={files.activeFilePath ?? null}
219
+ onRepoRootChange={(path, mode) => { if (refTab) ctx.onTabRepoRootChange(refTab.id, path, mode); }}
220
+ onFollowInstanceRepoRoot={path => ctx.onFollowInstanceRepoRoot(refTab?.id ?? null, path)}
221
+ onPreviewFile={ctx.onOpenFileGlobal}
222
+ onGitRefresh={ctx.onGitRefresh}
223
+ onSettingsPatch={ctx.onDashboardSettingsPatch}
224
+ /></Suspense>;
225
+ }
226
+ case 'files': {
227
+ const files = tab.files ?? {};
228
+ const folderRoot = files.folderRootPath ?? ctx.fallbackFolderRootPath;
229
+ const repoRootMode = files.repoRootMode ?? 'instance';
230
+ return <FileFolderSplitPanel
231
+ filePane={<Suspense fallback={fallback}><DocPanel filePath={files.activeFilePath ?? undefined} onOpenLocalFile={path => ctx.onTabPreviewFile(tab.id, path)} /></Suspense>}
232
+ folderPane={<Suspense fallback={fallback}><FolderPanel selectedFilePath={files.activeFilePath ?? null} externalRootPath={folderRoot} repoRootPath={repoRootMode === 'instance' ? files.repoRootPath ?? null : null} gitRefreshVersion={ctx.gitRefreshVersion} notesTree={ctx.notesModel.tree} notesRoot={ctx.notesModel.notesRoot} onRootChange={path => ctx.onTabRootChange(tab.id, path)} onRepoRootChange={path => ctx.onTabRepoRootChange(tab.id, path)} onGitRefresh={ctx.onGitRefresh} onPreviewFile={path => ctx.onTabPreviewFile(tab.id, path)} sessionState={ctx.folderSessions[tab.id] ?? null} onSessionStateChange={state => ctx.onFolderSessionChange(tab.id, state)} /></Suspense>}
233
+ />;
234
+ }
235
+ case 'browser': return <Suspense fallback={fallback}><BrowserPanel
236
+ singlePage
237
+ initialUrl={tab.browser?.url}
238
+ isActivePanel={tab.id === ctx.activeTabId}
239
+ moduleTabId={tab.id}
240
+ selectedInstancePort={ctx.selectedInstance?.port ?? null}
241
+ onInsertCommentIntoPreview={ctx.onInsertCommentIntoPreview}
242
+ onPageStateChange={state => ctx.onBrowserPageState(tab.id, state)}
243
+ onOpenNewWindow={ctx.onOpenBrowserWindow}
244
+ /></Suspense>;
245
+ case 'design': return <Suspense fallback={fallback}><DesignPanel
246
+ tab={tab}
247
+ primaryProjectDir={ctx.primaryProjectDir}
248
+ selectedInstancePort={ctx.selectedInstance?.port ?? null}
249
+ onOpenInBrowser={ctx.onOpenBrowserWindow}
207
250
  /></Suspense>;
208
- case 'folder': return <Suspense fallback={fallback}><FolderPanel selectedFilePath={previewFilePath} externalRootPath={folderRootPath} repoRootPath={repoRootMode === 'instance' ? repoRootPath : null} gitRefreshVersion={gitRefreshVersion} notesTree={notesModel.tree} notesRoot={notesModel.notesRoot} onRootChange={onFolderRootChange} onRepoRootChange={onRepoRootChange} onGitRefresh={onGitRefresh} onPreviewFile={onPreviewFile} sessionState={folderPanelSession} onSessionStateChange={onFolderPanelSessionChange} /></Suspense>;
209
- case 'doc': return <Suspense fallback={fallback}><DocPanel filePath={previewFilePath ?? undefined} onOpenLocalFile={onPreviewFile} /></Suspense>;
210
- case 'browser': return <Suspense fallback={fallback}><BrowserPanel /></Suspense>;
211
- case 'ceo': return jawCeoPanel;
212
251
  default: return null;
213
252
  }
214
253
  }
215
254
 
216
- function renderBottomTabContent(tab: BottomPanelTab, controls: BottomPanelRenderControls): ReactNode {
255
+ function renderBottomTabContent(tab: BottomPanelTab, controls: BottomPanelRenderControls, selectedInstancePort: number | null, onInsertCommentIntoPreview: (port: number, text: string) => Promise<PreviewInsertTextResult>): ReactNode {
217
256
  const fallback = <div style={{ padding: '12px', color: 'var(--text-dim)', fontSize: '12px' }}>Loading...</div>;
218
257
  switch (tab) {
219
258
  case 'terminal': return <Suspense fallback={fallback}><TerminalPanel onCollapse={controls.onCollapse} onEmptySessions={controls.onCloseTab} /></Suspense>;
220
- case 'browser': return <Suspense fallback={fallback}><BrowserPanel onCollapse={controls.onCollapse} /></Suspense>;
259
+ case 'browser': return <Suspense fallback={fallback}><BrowserPanel onCollapse={controls.onCollapse} selectedInstancePort={selectedInstancePort} onInsertCommentIntoPreview={onInsertCommentIntoPreview} /></Suspense>;
221
260
  default: return null;
222
261
  }
223
262
  }
224
263
 
225
264
  export function SidebarRailRouter(props: Props) {
226
265
  const panelLayout = usePanelLayout();
227
- const workbenchResource = useWorkbenchResourceState({ initialFolderRootPath: props.dashboardSettingsUi.rightFolderRootPath });
228
- const {
229
- activeResourcePath: rightPreviewFilePath,
230
- folderRootPath: rightFolderRootPath,
231
- repoRootPath,
232
- repoRootMode,
233
- gitRefreshVersion,
234
- setActiveResource,
235
- setFolderRootPath,
236
- setRepoRootPath,
237
- followInstanceRepoRoot,
238
- bumpGitRefresh,
239
- } = workbenchResource;
240
- const [folderPanelSession, setFolderPanelSession] = useState<FolderPanelSessionState | null>(null);
266
+ // Per-Files-tab resource state lives in the tab metadata (020 §5 Option B).
267
+ // The registry's rightFolderRootPath remains the fallback root for tabs
268
+ // that have not picked their own root yet.
269
+ const fallbackFolderRootPath = props.dashboardSettingsUi.rightFolderRootPath;
270
+ const openTabs = panelLayout.state.rightPanel.tabs.openTabs;
271
+ const activeTabId = panelLayout.state.rightPanel.tabs.activeTabId;
272
+ const activeTab = openTabs.find(t => t.id === activeTabId) ?? null;
273
+ const targetFilesTab = activeTab?.kind === 'files' ? activeTab : (openTabs.find(t => t.kind === 'files') ?? null);
274
+ const [gitRefreshVersion, setGitRefreshVersion] = useState(0);
275
+ const bumpGitRefresh = useCallback(() => setGitRefreshVersion(version => version + 1), []);
276
+ const [folderSessions, setFolderSessions] = useState<Record<string, FolderPanelSessionState | null>>({});
241
277
  const [, setRecentDroppedPaths] = useState<ElectronDroppedPathsEvent | null>(null);
242
278
  const [dropNotice, setDropNotice] = useState<string | null>(null);
243
279
  const [remindersView, setRemindersView] = useState<RemindersView>('matrix');
244
280
  const remindersFeed = useRemindersFeed({ active: props.sidebarMode === 'reminders' });
245
281
  const isElectron = currentManagerSurface() === 'electron';
246
282
  const desktopPanelsAvailable = isElectron;
283
+ const [previewInsertTextRequest, setPreviewInsertTextRequest] = useState<PreviewInsertTextRequest | null>(null);
284
+ const previewInsertSeqRef = useRef(0);
285
+ const previewInsertResolversRef = useRef(new Map<string, (result: PreviewInsertTextResult) => void>());
286
+ // 030 v2/v3: keep the server registry in sync, deliver shares to the
287
+ // selected instance's runtime-context, and relay screenshot commands.
288
+ useEmbeddedBrowserTargetSync(isElectron, props.selectedInstance?.port ?? null);
247
289
  const rightPanelOpen = desktopPanelsAvailable && panelLayout.effectiveRightOpen;
248
- const rightPanelCeoActive = panelLayout.state.rightPanel.topMode === 'ceo'
249
- || panelLayout.state.rightPanel.bottomMode === 'ceo';
250
- const codeWorkingDir = rightFolderRootPath || props.workingDir || '';
290
+ const codeWorkingDir = targetFilesTab?.files?.folderRootPath || fallbackFolderRootPath || props.workingDir || '';
251
291
 
252
- useEffect(() => {
253
- if (rightPanelCeoActive && props.jawCeoOpen) {
254
- props.onJawCeoOpenChange?.(false);
292
+ const handleInsertCommentIntoPreview = useCallback((port: number, text: string): Promise<PreviewInsertTextResult> => {
293
+ if (props.selectedInstance?.port !== port) {
294
+ return Promise.resolve({ ok: false, error: 'selected instance changed before preview insert' });
255
295
  }
256
- }, [rightPanelCeoActive]);
257
-
258
- useEffect(() => {
259
- if (isElectron && props.jawCeoOpen && !rightPanelCeoActive) {
260
- panelLayout.dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'ceo', slot: 'top', direct: true });
261
- props.onJawCeoOpenChange?.(false);
296
+ if (!props.previewEnabled) {
297
+ return Promise.resolve({ ok: false, error: 'Preview is off. Turn it on before inserting a browser comment.' });
298
+ }
299
+ if (props.sidebarMode !== 'instances' || props.viewMode !== 'jaw' || props.activeDetailTab !== 'preview') {
300
+ return Promise.resolve({ ok: false, error: 'Open the selected instance Preview tab before inserting a browser comment.' });
262
301
  }
263
- }, [isElectron, props.jawCeoOpen]);
302
+ const id = `browser-comment-${Date.now()}-${++previewInsertSeqRef.current}`;
303
+ setPreviewInsertTextRequest({ id, port, text });
304
+ return new Promise(resolve => {
305
+ const timer = window.setTimeout(() => {
306
+ previewInsertResolversRef.current.delete(id);
307
+ setPreviewInsertTextRequest(current => current?.id === id ? null : current);
308
+ resolve({ ok: false, error: 'preview insert timed out; reopen the selected instance Preview tab and try again' });
309
+ }, 1400);
310
+ previewInsertResolversRef.current.set(id, result => {
311
+ window.clearTimeout(timer);
312
+ resolve(result);
313
+ });
314
+ });
315
+ }, [props.activeDetailTab, props.previewEnabled, props.selectedInstance?.port, props.sidebarMode, props.viewMode]);
264
316
 
265
- const ceoConsoleOpen = rightPanelCeoActive || (!isElectron && props.jawCeoOpen);
317
+ const handlePreviewInsertTextResult = useCallback((id: string, result: PreviewInsertTextResult): void => {
318
+ const resolve = previewInsertResolversRef.current.get(id);
319
+ if (!resolve) return;
320
+ previewInsertResolversRef.current.delete(id);
321
+ setPreviewInsertTextRequest(current => current?.id === id ? null : current);
322
+ resolve(result);
323
+ }, []);
324
+
325
+ // CEO: handled through right sidebar tab system now. CEO is hidden in v1,
326
+ // but we keep the overlay console for non-Electron surfaces.
327
+ const ceoConsoleOpen = !isElectron && props.jawCeoOpen;
266
328
  const handleCloseCeo = useCallback(() => {
267
- if (rightPanelCeoActive) {
268
- const slot = panelLayout.state.rightPanel.topMode === 'ceo' ? 'top' : 'bottom';
269
- panelLayout.dispatch({ type: 'CLOSE_RIGHT_SUB', slot });
270
- } else {
271
- props.onJawCeoOpenChange?.(false);
272
- }
273
- }, [rightPanelCeoActive, panelLayout, props.onJawCeoOpenChange]);
329
+ props.onJawCeoOpenChange?.(false);
330
+ }, [props.onJawCeoOpenChange]);
274
331
 
275
332
  const jawCeoPanel = (ceoConsoleOpen && props.jawCeo && props.jawCeoVoice) ? (
276
333
  <JawCeoConsole
@@ -289,35 +346,59 @@ export function SidebarRailRouter(props: Props) {
289
346
  && props.notesSelectedNote
290
347
  && !props.notesSelectedNote.tags?.includes(props.notesModel.tagFilter),
291
348
  );
349
+ // External file open: focus/create a Files tab and assign the file to it.
292
350
  function handleRightPreviewFile(path: string): void {
293
351
  const previewPath = expandDesktopHomePath(path.trim());
294
352
  if (!previewPath) return;
295
- setActiveResource(previewPath, 'doc');
296
- panelLayout.dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'doc', slot: 'bottom' });
353
+ panelLayout.dispatch({ type: 'OPEN_FILE_IN_FILES_TAB', path: previewPath });
297
354
  }
298
355
 
299
- useEffect(() => {
300
- if (rightFolderRootPath !== props.dashboardSettingsUi.rightFolderRootPath) {
301
- setFolderRootPath(props.dashboardSettingsUi.rightFolderRootPath);
302
- setRepoRootPath(null);
303
- }
304
- setFolderPanelSession(current => (
305
- current?.rootPath === props.dashboardSettingsUi.rightFolderRootPath
306
- ? current
307
- : null
308
- ));
309
- }, [props.dashboardSettingsUi.rightFolderRootPath, rightFolderRootPath, setFolderRootPath, setRepoRootPath]);
356
+ // Per-tab callbacks bound to a specific Files module tab.
357
+ const handleTabPreviewFile = useCallback((tabId: string, path: string): void => {
358
+ const previewPath = expandDesktopHomePath(path.trim());
359
+ if (!previewPath) return;
360
+ panelLayout.dispatch({ type: 'SET_FILES_TAB_FILE', tabId, path: previewPath });
361
+ }, [panelLayout]);
310
362
 
311
- const updateRightFolderRoot = useCallback((path: string | null): void => {
312
- if (rightFolderRootPath !== path) setFolderPanelSession(null);
313
- setFolderRootPath(path);
314
- setRepoRootPath(null);
363
+ const handleTabRootChange = useCallback((tabId: string, path: string | null): void => {
364
+ setFolderSessions(current => (current[tabId] ? { ...current, [tabId]: null } : current));
365
+ panelLayout.dispatch({ type: 'SET_FILES_TAB_ROOT', tabId, path });
315
366
  props.onDashboardSettingsPatch({ rightFolderRootPath: path });
316
- }, [props.onDashboardSettingsPatch, rightFolderRootPath, setFolderRootPath, setRepoRootPath]);
367
+ }, [panelLayout, props.onDashboardSettingsPatch]);
368
+
369
+ const handleTabRepoRootChange = useCallback((tabId: string, path: string | null, mode: WorkbenchRepoRootMode = 'instance'): void => {
370
+ panelLayout.dispatch({ type: 'SET_FILES_TAB_REPO_ROOT', tabId, path, mode });
371
+ }, [panelLayout]);
372
+
373
+ const handleFollowInstanceRepoRoot = useCallback((tabId: string | null, path: string | null): void => {
374
+ if (!tabId) return;
375
+ // Explicit follow-instance reset clears a manual pin.
376
+ panelLayout.dispatch({ type: 'SET_FILES_TAB_REPO_ROOT', tabId, path, mode: 'follow-instance' });
377
+ }, [panelLayout]);
378
+
379
+ const handleFolderSessionChange = useCallback((tabId: string, state: FolderPanelSessionState): void => {
380
+ setFolderSessions(current => ({ ...current, [tabId]: state }));
381
+ }, []);
317
382
 
318
- const updateRepoRoot = useCallback((path: string | null, mode: WorkbenchRepoRootMode = 'instance'): void => {
319
- setRepoRootPath(path, mode);
320
- }, [setRepoRootPath]);
383
+ // Browser module page state: the module tab owns its page url/title.
384
+ const handleBrowserPageState = useCallback((tabId: string, state: { url: string; title: string }): void => {
385
+ panelLayout.dispatch({ type: 'SET_BROWSER_TAB_STATE', tabId, url: state.url, title: state.title });
386
+ }, [panelLayout]);
387
+
388
+ // "Open in new tab" from an embedded page creates a new Browser module tab.
389
+ const handleOpenBrowserWindow = useCallback((url: string): void => {
390
+ panelLayout.dispatch({ type: 'OPEN_BROWSER_MODULE_TAB', url });
391
+ }, [panelLayout]);
392
+
393
+ // Code workspace root change: update the target Files tab root (without
394
+ // forcing the sidebar open) and keep the registry fallback in sync.
395
+ const targetFilesTabId = targetFilesTab?.id ?? null;
396
+ const handleCodeWorkingDirChange = useCallback((path: string | null): void => {
397
+ if (targetFilesTabId) {
398
+ panelLayout.dispatch({ type: 'SET_FILES_TAB_ROOT', tabId: targetFilesTabId, path });
399
+ }
400
+ props.onDashboardSettingsPatch({ rightFolderRootPath: path });
401
+ }, [panelLayout, props.onDashboardSettingsPatch, targetFilesTabId]);
321
402
 
322
403
  const handleDroppedPaths = useCallback((event: ElectronDroppedPathsEvent): void => {
323
404
  setRecentDroppedPaths(event);
@@ -325,13 +406,13 @@ export function SidebarRailRouter(props: Props) {
325
406
  if (event.source === 'preview') return;
326
407
  const directory = firstDirectory(event.entries);
327
408
  if (directory) {
328
- updateRightFolderRoot(directory.path);
329
- panelLayout.dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'folder', slot: 'top' });
409
+ panelLayout.dispatch({ type: 'OPEN_FOLDER_IN_FILES_TAB', path: directory.path });
410
+ props.onDashboardSettingsPatch({ rightFolderRootPath: directory.path });
330
411
  return;
331
412
  }
332
413
  const file = firstFile(event.entries);
333
414
  if (file) handleRightPreviewFile(file.path);
334
- }, [panelLayout, updateRightFolderRoot]);
415
+ }, [panelLayout, props.onDashboardSettingsPatch]);
335
416
 
336
417
  const electronDrop = useElectronDroppedPaths({ onDroppedPaths: handleDroppedPaths });
337
418
 
@@ -341,26 +422,9 @@ export function SidebarRailRouter(props: Props) {
341
422
  const primaryProjectDir = props.selectedInstance?.projectDirs?.[0]?.trim() || null;
342
423
  const handleLoadPrimaryProjectDir = useCallback((): void => {
343
424
  if (!primaryProjectDir) return;
344
- updateRightFolderRoot(primaryProjectDir);
345
- const { topMode, bottomMode } = panelLayout.state.rightPanel;
346
- if (topMode !== 'folder' && bottomMode !== 'folder') {
347
- panelLayout.dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'folder', slot: 'top' });
348
- }
349
- }, [panelLayout, primaryProjectDir, updateRightFolderRoot]);
350
- const renderRightHeaderAction = useCallback((mode: RightPanelMode): ReactNode => {
351
- if (mode !== 'folder') return null;
352
- return (
353
- <button
354
- type="button"
355
- className="right-sub-action right-sub-load-folder"
356
- disabled={!primaryProjectDir || rightFolderRootPath === primaryProjectDir}
357
- title={primaryProjectDir ? `Load ${primaryProjectDir}` : 'No project folder'}
358
- onClick={handleLoadPrimaryProjectDir}
359
- >
360
- 불러오기
361
- </button>
362
- );
363
- }, [handleLoadPrimaryProjectDir, primaryProjectDir, rightFolderRootPath]);
425
+ panelLayout.dispatch({ type: 'OPEN_FOLDER_IN_FILES_TAB', path: primaryProjectDir });
426
+ props.onDashboardSettingsPatch({ rightFolderRootPath: primaryProjectDir });
427
+ }, [panelLayout, primaryProjectDir, props.onDashboardSettingsPatch]);
364
428
 
365
429
  return (
366
430
  <NotesCommandProvider>
@@ -374,10 +438,31 @@ export function SidebarRailRouter(props: Props) {
374
438
  onCloseDrawer={props.onCloseDrawer}
375
439
  rightPanelOpen={rightPanelOpen}
376
440
  rightPanelWidth={panelLayout.state.rightPanel.width}
377
- rightPanelContent={rightPanelOpen ? <RightSidebar renderPanel={mode => renderRightPanelContent(mode, rightPreviewFilePath, rightFolderRootPath, repoRootPath, repoRootMode, gitRefreshVersion, handleRightPreviewFile, updateRightFolderRoot, updateRepoRoot, followInstanceRepoRoot, bumpGitRefresh, props.selectedInstance, props.dashboardSettingsUi, props.onDashboardSettingsPatch, props.notesModel, jawCeoPanel, folderPanelSession, setFolderPanelSession)} renderHeaderAction={renderRightHeaderAction} /> : undefined}
441
+ rightPanelContent={rightPanelOpen ? <RightSidebar onLoadProjectFolder={handleLoadPrimaryProjectDir} loadProjectFolderDisabled={!primaryProjectDir || (targetFilesTab?.files?.folderRootPath ?? fallbackFolderRootPath) === primaryProjectDir} renderPanel={(kind, tab) => renderRightPanelContent(kind, tab, {
442
+ activeTabId,
443
+ primaryProjectDir,
444
+ fallbackFolderRootPath,
445
+ diffFilesTab: targetFilesTab,
446
+ gitRefreshVersion,
447
+ onOpenFileGlobal: handleRightPreviewFile,
448
+ onTabPreviewFile: handleTabPreviewFile,
449
+ onTabRootChange: handleTabRootChange,
450
+ onTabRepoRootChange: handleTabRepoRootChange,
451
+ onFollowInstanceRepoRoot: handleFollowInstanceRepoRoot,
452
+ onBrowserPageState: handleBrowserPageState,
453
+ onOpenBrowserWindow: handleOpenBrowserWindow,
454
+ onInsertCommentIntoPreview: handleInsertCommentIntoPreview,
455
+ onGitRefresh: bumpGitRefresh,
456
+ selectedInstance: props.selectedInstance,
457
+ dashboardSettingsUi: props.dashboardSettingsUi,
458
+ onDashboardSettingsPatch: props.onDashboardSettingsPatch,
459
+ notesModel: props.notesModel,
460
+ folderSessions,
461
+ onFolderSessionChange: handleFolderSessionChange,
462
+ })} /> : undefined}
378
463
  bottomPanelOpen={bottomPanelOpen}
379
464
  bottomPanelHeight={panelLayout.state.bottomPanel.height}
380
- bottomPanelContent={panelLayout.state.bottomPanel.tabs.length > 0 ? <BottomPanel renderTab={renderBottomTabContent} /> : undefined}
465
+ bottomPanelContent={panelLayout.state.bottomPanel.tabs.length > 0 ? <BottomPanel renderTab={(tab, controls) => renderBottomTabContent(tab, controls, props.selectedInstance?.port ?? null, handleInsertCommentIntoPreview)} /> : undefined}
381
466
  navigator={(
382
467
  <>
383
468
  <SidebarRail
@@ -433,13 +518,13 @@ export function SidebarRailRouter(props: Props) {
433
518
  <div className="workspace-surface-layer">
434
519
  <WorkspaceSurface active={props.sidebarMode === 'instances' && props.viewMode === 'jaw'}>
435
520
  <Workbench mode={props.activeDetailTab} onModeChange={props.onDetailTabChange} header={props.workbenchHeader} modeActions={props.jawCeoWorkbenchButton} overview={props.detailContent('overview')} preview={(
436
- <InstancePreview instance={props.selectedInstance} data={props.data} enabled={props.previewEnabled} active={props.sidebarMode === 'instances' && props.activeDetailTab === 'preview'} refreshKey={props.previewRefreshKey} theme={props.previewTheme} {...(props.onOpenNotesFromPreview ? { onOpenNotesFromPreview: props.onOpenNotesFromPreview } : {})} onOpenDocFromPreview={handleRightPreviewFile} onPreviewDroppedFiles={handlePreviewDroppedFiles} docPanelCapable={desktopPanelsAvailable} />
521
+ <InstancePreview instance={props.selectedInstance} data={props.data} enabled={props.previewEnabled} active={props.sidebarMode === 'instances' && props.activeDetailTab === 'preview'} refreshKey={props.previewRefreshKey} theme={props.previewTheme} {...(props.onOpenNotesFromPreview ? { onOpenNotesFromPreview: props.onOpenNotesFromPreview } : {})} onOpenDocFromPreview={handleRightPreviewFile} onPreviewDroppedFiles={handlePreviewDroppedFiles} docPanelCapable={desktopPanelsAvailable} previewInsertTextRequest={previewInsertTextRequest} onPreviewInsertTextResult={handlePreviewInsertTextResult} />
437
522
  )} logs={props.detailContent('logs')} settings={props.detailContent('settings')} />
438
523
  </WorkspaceSurface>
439
524
  {props.viewMode === 'code' && props.sidebarMode === 'instances' ? (
440
525
  <WorkspaceSurface active>
441
526
  <Suspense fallback={<div style={{ padding: '24px', color: 'var(--text-dim)', fontSize: '13px' }}>Loading Code workspace...</div>}>
442
- <CodeCanvas port={props.port} workingDir={codeWorkingDir} onWorkingDirChange={updateRightFolderRoot} onOpenLocalFile={handleRightPreviewFile} />
527
+ <CodeCanvas port={props.port} workingDir={codeWorkingDir} onWorkingDirChange={handleCodeWorkingDirChange} onOpenLocalFile={handleRightPreviewFile} />
443
528
  </Suspense>
444
529
  </WorkspaceSurface>
445
530
  ) : null}