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
@@ -1,22 +1,382 @@
1
1
  import { createContext, useContext, useReducer, useCallback, useMemo, useEffect, useRef } from 'react';
2
2
  import type { ReactNode } from 'react';
3
3
  import { panelShortcutBus } from './panel-shortcut-bus';
4
- import type { RightPanelMode, BottomPanelTab } from './types';
4
+ import type { BottomPanelTab, RightSidebarTabKind, RightSidebarOpenTab, RightSidebarTabsState, RightSidebarFilesTabState, RightSidebarDesignTabState, FileFolderLayoutState, FileFolderViewMode } from './types';
5
5
  import {
6
6
  RIGHT_PANEL_DEFAULT_WIDTH, RIGHT_PANEL_MIN_WIDTH, RIGHT_PANEL_MAX_WIDTH,
7
- RIGHT_SPLIT_MIN_RATIO, RIGHT_SPLIT_MAX_RATIO,
8
7
  BOTTOM_PANEL_DEFAULT_HEIGHT, BOTTOM_PANEL_MIN_HEIGHT, BOTTOM_PANEL_MAX_HEIGHT,
9
- RIGHT_PANEL_MODES, BOTTOM_PANEL_TABS,
8
+ BOTTOM_PANEL_TABS,
9
+ RIGHT_SIDEBAR_TAB_KINDS, RIGHT_SIDEBAR_TAB_TITLES,
10
+ RIGHT_SIDEBAR_MULTI_INSTANCE_KINDS, RIGHT_SIDEBAR_DIFF_DEFAULT_NAME,
11
+ FILE_FOLDER_SPLIT_RATIO_DEFAULT,
12
+ FILE_FOLDER_FOLDER_ONLY_THRESHOLD,
13
+ FILE_FOLDER_FILE_ONLY_THRESHOLD,
10
14
  } from './types';
11
15
 
16
+ // --- Right sidebar tab helpers (020A) ---
17
+
18
+ function isMultiInstanceKind(kind: RightSidebarTabKind): boolean {
19
+ return RIGHT_SIDEBAR_MULTI_INSTANCE_KINDS.includes(kind);
20
+ }
21
+
22
+ function makeTabId(kind: RightSidebarTabKind, ordinal?: number): string {
23
+ return kind === 'diff' ? 'right-diff' : `right-${kind}-${ordinal ?? 1}`;
24
+ }
25
+
26
+ function defaultSpecificName(kind: RightSidebarTabKind, ordinal?: number): string {
27
+ if (kind === 'diff') return RIGHT_SIDEBAR_DIFF_DEFAULT_NAME;
28
+ return `${RIGHT_SIDEBAR_TAB_TITLES[kind]} ${ordinal ?? 1}`;
29
+ }
30
+
31
+ /**
32
+ * Create a new module tab of the given kind and activate it.
33
+ * Diff is singleton: creating while a diff tab exists focuses the existing tab
34
+ * and does not allocate an ordinal. Multi-instance kinds (files, browser)
35
+ * allocate the next ordinal and increment nextOrdinalByKind.
36
+ */
37
+ export function createRightSidebarTab(
38
+ tabs: RightSidebarTabsState,
39
+ kind: RightSidebarTabKind,
40
+ options?: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>>,
41
+ ): RightSidebarTabsState {
42
+ if (kind === 'diff') {
43
+ const existing = tabs.openTabs.find(t => t.kind === 'diff');
44
+ if (existing) return { ...tabs, activeTabId: existing.id };
45
+ const tab: RightSidebarOpenTab = {
46
+ id: makeTabId('diff'),
47
+ kind: 'diff',
48
+ title: options?.title ?? RIGHT_SIDEBAR_TAB_TITLES.diff,
49
+ specificName: options?.specificName ?? RIGHT_SIDEBAR_DIFF_DEFAULT_NAME,
50
+ ...(options?.sourceLabel ? { sourceLabel: options.sourceLabel } : {}),
51
+ };
52
+ return { ...tabs, openTabs: [...tabs.openTabs, tab], activeTabId: tab.id };
53
+ }
54
+ const maxExisting = tabs.openTabs
55
+ .filter(t => t.kind === kind)
56
+ .reduce((max, t) => Math.max(max, t.ordinal ?? 1), 0);
57
+ const ordinal = Math.max(tabs.nextOrdinalByKind[kind] ?? 1, maxExisting + 1);
58
+ const tab: RightSidebarOpenTab = {
59
+ id: makeTabId(kind, ordinal),
60
+ kind,
61
+ title: options?.title ?? RIGHT_SIDEBAR_TAB_TITLES[kind],
62
+ specificName: options?.specificName ?? defaultSpecificName(kind, ordinal),
63
+ ordinal,
64
+ ...(options?.sourceLabel ? { sourceLabel: options.sourceLabel } : {}),
65
+ };
66
+ const nextOrdinalByKind = isMultiInstanceKind(kind)
67
+ ? { ...tabs.nextOrdinalByKind, [kind]: ordinal + 1 }
68
+ : tabs.nextOrdinalByKind;
69
+ return {
70
+ openTabs: [...tabs.openTabs, tab],
71
+ activeTabId: tab.id,
72
+ nextOrdinalByKind,
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Launcher semantics: focus the first already-open tab of the requested kind;
78
+ * if none exists, create the first tab of that kind and activate it.
79
+ */
80
+ export function focusOrCreateFirstRightSidebarTab(
81
+ tabs: RightSidebarTabsState,
82
+ kind: RightSidebarTabKind,
83
+ ): RightSidebarTabsState {
84
+ const existing = tabs.openTabs.find(t => t.kind === kind);
85
+ if (existing) {
86
+ return { ...tabs, activeTabId: existing.id };
87
+ }
88
+ return createRightSidebarTab(tabs, kind);
89
+ }
90
+
91
+ /**
92
+ * Activate a tab by id. No-op if the id is not in openTabs.
93
+ */
94
+ export function activateRightSidebarTab(
95
+ tabs: RightSidebarTabsState,
96
+ tabId: string,
97
+ ): RightSidebarTabsState {
98
+ const tab = tabs.openTabs.find(t => t.id === tabId);
99
+ if (!tab) return tabs;
100
+ return { ...tabs, activeTabId: tabId };
101
+ }
102
+
103
+ /**
104
+ * Update a tab's display metadata without changing tab order or the active
105
+ * tab identity.
106
+ */
107
+ export function updateRightSidebarTabMeta(
108
+ tabs: RightSidebarTabsState,
109
+ tabId: string,
110
+ patch: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>>,
111
+ ): RightSidebarTabsState {
112
+ const idx = tabs.openTabs.findIndex(t => t.id === tabId);
113
+ if (idx === -1) return tabs;
114
+ const current = tabs.openTabs[idx]!;
115
+ const next: RightSidebarOpenTab = {
116
+ ...current,
117
+ ...(patch.title !== undefined ? { title: patch.title } : {}),
118
+ ...(patch.specificName !== undefined ? { specificName: patch.specificName } : {}),
119
+ ...(patch.sourceLabel !== undefined ? { sourceLabel: patch.sourceLabel } : {}),
120
+ };
121
+ if (next.title === current.title && next.specificName === current.specificName && next.sourceLabel === current.sourceLabel) {
122
+ return tabs;
123
+ }
124
+ const openTabs = [...tabs.openTabs];
125
+ openTabs[idx] = next;
126
+ return { ...tabs, openTabs };
127
+ }
128
+
129
+ // --- Files module per-tab resource state (020 §5, Option B) ---
130
+
131
+ function pathBasename(path: string | null | undefined): string | null {
132
+ if (!path) return null;
133
+ const normalized = path.replace(/\\/g, '/').replace(/\/+$/, '');
134
+ const segments = normalized.split('/').filter(Boolean);
135
+ return segments[segments.length - 1] ?? null;
136
+ }
137
+
138
+ /** Files tab display name: active file basename, else folder root basename, else the ordinal default. */
139
+ function filesTabSpecificName(tab: RightSidebarOpenTab, files: RightSidebarFilesTabState): string {
140
+ return pathBasename(files.activeFilePath)
141
+ ?? pathBasename(files.folderRootPath)
142
+ ?? defaultSpecificName('files', tab.ordinal);
143
+ }
144
+
145
+ function applyFilesTabState(
146
+ tabs: RightSidebarTabsState,
147
+ tabId: string,
148
+ patch: RightSidebarFilesTabState,
149
+ ): RightSidebarTabsState {
150
+ const idx = tabs.openTabs.findIndex(t => t.id === tabId && t.kind === 'files');
151
+ if (idx === -1) return tabs;
152
+ const current = tabs.openTabs[idx]!;
153
+ const files: RightSidebarFilesTabState = { ...current.files, ...patch };
154
+ const specificName = filesTabSpecificName(current, files);
155
+ const sourceLabel = files.activeFilePath ?? files.folderRootPath ?? undefined;
156
+ const openTabs = [...tabs.openTabs];
157
+ openTabs[idx] = {
158
+ ...current,
159
+ files,
160
+ specificName,
161
+ ...(sourceLabel ? { sourceLabel } : {}),
162
+ };
163
+ return { ...tabs, openTabs };
164
+ }
165
+
166
+ /**
167
+ * Repo root updates keep the sticky-manual rule: a manual repo root pins the
168
+ * tab, instance updates are ignored while pinned, and 'follow-instance' is
169
+ * the explicit reset that clears the pin.
170
+ */
171
+ function applyFilesTabRepoRoot(
172
+ tabs: RightSidebarTabsState,
173
+ tabId: string,
174
+ path: string | null,
175
+ mode: 'instance' | 'manual' | 'follow-instance',
176
+ ): RightSidebarTabsState {
177
+ const tab = tabs.openTabs.find(t => t.id === tabId && t.kind === 'files');
178
+ if (!tab) return tabs;
179
+ if (mode === 'follow-instance') {
180
+ return applyFilesTabState(tabs, tabId, { repoRootPath: path, repoRootMode: 'instance' });
181
+ }
182
+ if (mode === 'instance' && tab.files?.repoRootMode === 'manual') return tabs;
183
+ return applyFilesTabState(tabs, tabId, { repoRootPath: path, repoRootMode: mode });
184
+ }
185
+
186
+ /**
187
+ * Resolve the Files tab an external file-open should target: the active tab
188
+ * when it is a Files module, else the first open Files tab, else null.
189
+ */
190
+ export function resolveTargetFilesTab(tabs: RightSidebarTabsState): RightSidebarOpenTab | null {
191
+ const active = tabs.openTabs.find(t => t.id === tabs.activeTabId);
192
+ if (active?.kind === 'files') return active;
193
+ return tabs.openTabs.find(t => t.kind === 'files') ?? null;
194
+ }
195
+
196
+ /**
197
+ * External file open (020 §4): focus or create a Files tab, then assign the
198
+ * file to that tab, updating its specificName/sourceLabel.
199
+ */
200
+ export function openFileInFilesTab(
201
+ tabs: RightSidebarTabsState,
202
+ path: string,
203
+ ): RightSidebarTabsState {
204
+ let next = tabs;
205
+ let target = resolveTargetFilesTab(next);
206
+ if (!target) {
207
+ next = createRightSidebarTab(next, 'files');
208
+ target = next.openTabs[next.openTabs.length - 1] ?? null;
209
+ } else {
210
+ next = activateRightSidebarTab(next, target.id);
211
+ }
212
+ if (!target) return next;
213
+ return applyFilesTabState(next, target.id, { activeFilePath: path });
214
+ }
215
+
216
+ /**
217
+ * External folder open: focus or create a Files tab, then assign the folder
218
+ * root. Assigning a new root clears the tab's repo-root pin.
219
+ */
220
+ export function openFolderInFilesTab(
221
+ tabs: RightSidebarTabsState,
222
+ path: string | null,
223
+ ): RightSidebarTabsState {
224
+ let next = tabs;
225
+ let target = resolveTargetFilesTab(next);
226
+ if (!target) {
227
+ next = createRightSidebarTab(next, 'files');
228
+ target = next.openTabs[next.openTabs.length - 1] ?? null;
229
+ } else {
230
+ next = activateRightSidebarTab(next, target.id);
231
+ }
232
+ if (!target) return next;
233
+ return applyFilesTabState(next, target.id, { folderRootPath: path, repoRootPath: null, repoRootMode: 'instance' });
234
+ }
235
+
236
+ // --- Browser module per-tab page state (one module tab = one page) ---
237
+
238
+ function browserHostname(url: string | null | undefined): string | null {
239
+ if (!url) return null;
240
+ try {
241
+ return new URL(url).hostname.replace(/^www\./, '') || null;
242
+ } catch {
243
+ return null;
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Update a Browser module tab's page state. The tab label follows the page
249
+ * title when known, else the hostname, else the ordinal default. Never
250
+ * changes tab order or active tab identity.
251
+ */
252
+ export function applyBrowserTabState(
253
+ tabs: RightSidebarTabsState,
254
+ tabId: string,
255
+ patch: { url?: string; title?: string },
256
+ ): RightSidebarTabsState {
257
+ const idx = tabs.openTabs.findIndex(t => t.id === tabId && t.kind === 'browser');
258
+ if (idx === -1) return tabs;
259
+ const current = tabs.openTabs[idx]!;
260
+ const url = patch.url ?? current.browser?.url;
261
+ const title = patch.title?.trim();
262
+ const specificName = title
263
+ || browserHostname(url)
264
+ || defaultSpecificName('browser', current.ordinal);
265
+ const next: RightSidebarOpenTab = {
266
+ ...current,
267
+ ...(url ? { browser: { ...current.browser, url } } : {}),
268
+ specificName,
269
+ ...(url ? { sourceLabel: url } : {}),
270
+ };
271
+ if (next.specificName === current.specificName
272
+ && next.sourceLabel === current.sourceLabel
273
+ && next.browser?.url === current.browser?.url) {
274
+ return tabs;
275
+ }
276
+ const openTabs = [...tabs.openTabs];
277
+ openTabs[idx] = next;
278
+ return { ...tabs, openTabs };
279
+ }
280
+
281
+ // --- Design module per-tab state (186 Phase 1) ---
282
+
283
+ /**
284
+ * Update a Design module tab's per-tab state (pageId/projectKey/zoom). The
285
+ * projectKey is a create-time snapshot (OD-2): once set it is never
286
+ * overwritten by later instance switches — callers may only fill it when
287
+ * absent. Never changes tab order or active identity.
288
+ */
289
+ export function applyDesignTabState(
290
+ tabs: RightSidebarTabsState,
291
+ tabId: string,
292
+ patch: RightSidebarDesignTabState,
293
+ ): RightSidebarTabsState {
294
+ const idx = tabs.openTabs.findIndex(t => t.id === tabId && t.kind === 'design');
295
+ if (idx === -1) return tabs;
296
+ const current = tabs.openTabs[idx]!;
297
+ const design: RightSidebarDesignTabState = { ...current.design };
298
+ if (patch.pageId !== undefined) design.pageId = patch.pageId;
299
+ if (patch.zoom !== undefined) design.zoom = patch.zoom;
300
+ if (patch.projectKey !== undefined && (design.projectKey === undefined || design.projectKey === null)) {
301
+ design.projectKey = patch.projectKey;
302
+ }
303
+ if (design.pageId === current.design?.pageId
304
+ && design.projectKey === current.design?.projectKey
305
+ && design.zoom === current.design?.zoom) {
306
+ return tabs;
307
+ }
308
+ const openTabs = [...tabs.openTabs];
309
+ openTabs[idx] = { ...current, design };
310
+ return { ...tabs, openTabs };
311
+ }
312
+
313
+ /**
314
+ * "Open in new window/tab" from an embedded page: create a NEW Browser module
315
+ * tab that owns the URL as its page.
316
+ */
317
+ export function openBrowserModuleTab(
318
+ tabs: RightSidebarTabsState,
319
+ url: string,
320
+ ): RightSidebarTabsState {
321
+ const next = createRightSidebarTab(tabs, 'browser');
322
+ const created = next.openTabs[next.openTabs.length - 1];
323
+ if (!created) return next;
324
+ return applyBrowserTabState(next, created.id, { url });
325
+ }
326
+
327
+ /**
328
+ * Close a tab by id. If closing the active tab, activate the nearest left
329
+ * neighbor, else nearest right. Closing the last tab leaves activeTabId null.
330
+ */
331
+ export function closeRightSidebarTab(
332
+ tabs: RightSidebarTabsState,
333
+ tabId: string,
334
+ ): RightSidebarTabsState {
335
+ const idx = tabs.openTabs.findIndex(t => t.id === tabId);
336
+ if (idx === -1) return tabs;
337
+ const nextTabs = tabs.openTabs.filter(t => t.id !== tabId);
338
+ let nextActiveId = tabs.activeTabId;
339
+ if (tabs.activeTabId === tabId) {
340
+ if (nextTabs.length === 0) {
341
+ nextActiveId = null;
342
+ } else {
343
+ // nearest left, else nearest right
344
+ const newIdx = Math.min(idx, nextTabs.length - 1);
345
+ const preferred = idx > 0 ? nextTabs[idx - 1] : nextTabs[newIdx];
346
+ nextActiveId = preferred?.id ?? null;
347
+ }
348
+ }
349
+ return { openTabs: nextTabs, activeTabId: nextActiveId, nextOrdinalByKind: tabs.nextOrdinalByKind };
350
+ }
351
+
352
+ // --- File/folder layout helpers ---
353
+
354
+ export function fileFolderViewModeFromRatio(ratio: number): FileFolderViewMode {
355
+ if (ratio <= FILE_FOLDER_FOLDER_ONLY_THRESHOLD) return 'folder-only';
356
+ if (ratio >= FILE_FOLDER_FILE_ONLY_THRESHOLD) return 'file-only';
357
+ return 'split';
358
+ }
359
+
360
+ function clampFileFolderRatio(r: number): number {
361
+ if (typeof r !== 'number' || !Number.isFinite(r)) return FILE_FOLDER_SPLIT_RATIO_DEFAULT;
362
+ return Math.max(0, Math.min(1, r));
363
+ }
364
+
365
+ /** Opening a file from folder-only restores the split so the file pane is visible. */
366
+ function restoreSplitOnFileOpen(layout: FileFolderLayoutState): FileFolderLayoutState {
367
+ if (layout.mode !== 'folder-only') return layout;
368
+ const ratio = layout.lastSplitRatio || FILE_FOLDER_SPLIT_RATIO_DEFAULT;
369
+ return { mode: 'split', splitRatio: ratio, lastSplitRatio: ratio };
370
+ }
371
+
372
+ // --- State types ---
373
+
12
374
  export type PanelLayoutState = {
13
375
  rightPanel: {
14
376
  open: boolean;
15
377
  width: number;
16
- topMode: RightPanelMode | null;
17
- bottomMode: RightPanelMode | null;
18
- splitRatio: number;
19
- ceoDirectOpen: boolean;
378
+ tabs: RightSidebarTabsState;
379
+ fileFolderLayout: FileFolderLayoutState;
20
380
  };
21
381
  bottomPanel: {
22
382
  open: boolean;
@@ -29,12 +389,22 @@ export type PanelLayoutState = {
29
389
  type Action =
30
390
  | { type: 'SET_RIGHT_OPEN'; open: boolean }
31
391
  | { type: 'SET_RIGHT_WIDTH'; width: number }
32
- | { type: 'SET_RIGHT_TOP_MODE'; mode: RightPanelMode | null }
33
- | { type: 'SET_RIGHT_BOTTOM_MODE'; mode: RightPanelMode | null }
34
- | { type: 'SET_RIGHT_SPLIT_RATIO'; ratio: number }
35
- | { type: 'OPEN_RIGHT_PANEL'; mode: RightPanelMode; slot?: 'top' | 'bottom' | undefined; direct?: boolean }
36
- | { type: 'CLOSE_RIGHT_SUB'; slot: 'top' | 'bottom' }
37
- | { type: 'SOLO_RIGHT_SUB'; slot: 'top' | 'bottom' }
392
+ | { type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB'; kind: RightSidebarTabKind }
393
+ | { type: 'CREATE_RIGHT_SIDEBAR_TAB'; kind: RightSidebarTabKind; tab?: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>> }
394
+ | { type: 'ACTIVATE_RIGHT_SIDEBAR_TAB'; tabId: string }
395
+ | { type: 'SET_RIGHT_SIDEBAR_TAB_META'; tabId: string; patch: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>> }
396
+ | { type: 'CLOSE_RIGHT_SIDEBAR_TAB'; tabId: string }
397
+ | { type: 'OPEN_FILE_IN_FILES_TAB'; path: string }
398
+ | { type: 'OPEN_FOLDER_IN_FILES_TAB'; path: string | null }
399
+ | { type: 'SET_FILES_TAB_FILE'; tabId: string; path: string | null }
400
+ | { type: 'SET_FILES_TAB_ROOT'; tabId: string; path: string | null }
401
+ | { type: 'SET_FILES_TAB_REPO_ROOT'; tabId: string; path: string | null; mode: 'instance' | 'manual' | 'follow-instance' }
402
+ | { type: 'SET_BROWSER_TAB_STATE'; tabId: string; url?: string; title?: string }
403
+ | { type: 'OPEN_BROWSER_MODULE_TAB'; url: string }
404
+ | { type: 'SET_DESIGN_TAB_STATE'; tabId: string; patch: RightSidebarDesignTabState }
405
+ | { type: 'SET_FILE_FOLDER_SPLIT_RATIO'; ratio: number }
406
+ | { type: 'SET_FILE_FOLDER_VIEW_MODE'; mode: FileFolderViewMode }
407
+ | { type: 'RESTORE_FILE_FOLDER_SPLIT' }
38
408
  | { type: 'SET_BOTTOM_OPEN'; open: boolean }
39
409
  | { type: 'SET_BOTTOM_HEIGHT'; height: number }
40
410
  | { type: 'OPEN_BOTTOM_TAB'; tab: BottomPanelTab }
@@ -52,25 +422,25 @@ function clampHeight(h: number): number {
52
422
  return Math.min(BOTTOM_PANEL_MAX_HEIGHT, Math.max(BOTTOM_PANEL_MIN_HEIGHT, Math.round(h)));
53
423
  }
54
424
 
55
- function clampRatio(r: number): number {
56
- if (typeof r !== 'number' || !Number.isFinite(r)) return 0.5;
57
- return Math.min(RIGHT_SPLIT_MAX_RATIO, Math.max(RIGHT_SPLIT_MIN_RATIO, r));
58
- }
59
-
60
425
  function normalizeRightPanel(panel: PanelLayoutState['rightPanel']): PanelLayoutState['rightPanel'] {
61
426
  const next = { ...panel };
62
427
  next.width = clampWidth(next.width);
63
- next.splitRatio = clampRatio(next.splitRatio);
64
- if (next.topMode !== null && !RIGHT_PANEL_MODES.includes(next.topMode)) next.topMode = null;
65
- if (next.bottomMode !== null && !RIGHT_PANEL_MODES.includes(next.bottomMode)) next.bottomMode = null;
66
- if (next.topMode === null && next.bottomMode !== null) {
67
- next.topMode = next.bottomMode;
68
- next.bottomMode = null;
428
+ // Validate tab kinds
429
+ const validTabs = next.tabs.openTabs.filter(t => RIGHT_SIDEBAR_TAB_KINDS.includes(t.kind));
430
+ if (validTabs.length !== next.tabs.openTabs.length) {
431
+ next.tabs = { ...next.tabs, openTabs: validTabs };
432
+ }
433
+ if (next.tabs.activeTabId && !validTabs.find(t => t.id === next.tabs.activeTabId)) {
434
+ next.tabs = { ...next.tabs, activeTabId: validTabs[0]?.id ?? null };
435
+ }
436
+ // A null active id with open tabs would blank the sidebar body entirely.
437
+ if (!next.tabs.activeTabId && validTabs.length > 0) {
438
+ next.tabs = { ...next.tabs, activeTabId: validTabs[0]!.id };
439
+ }
440
+ if (next.tabs.openTabs.length === 0 && next.open) {
441
+ // No open tabs -> close the panel
442
+ next.open = false;
69
443
  }
70
- if (next.topMode !== null && next.topMode === next.bottomMode) next.bottomMode = null;
71
- if (next.topMode === null && next.bottomMode === null) next.open = false;
72
- if (next.ceoDirectOpen && next.topMode !== 'ceo' && next.bottomMode !== 'ceo') next.ceoDirectOpen = false;
73
- if (typeof next.ceoDirectOpen !== 'boolean') next.ceoDirectOpen = false;
74
444
  return next;
75
445
  }
76
446
 
@@ -80,50 +450,139 @@ function reducer(state: PanelLayoutState, action: Action): PanelLayoutState {
80
450
  return { ...state, rightPanel: { ...state.rightPanel, open: action.open } };
81
451
  case 'SET_RIGHT_WIDTH':
82
452
  return { ...state, rightPanel: { ...state.rightPanel, width: clampWidth(action.width) } };
83
- case 'SET_RIGHT_TOP_MODE':
84
- return { ...state, rightPanel: { ...state.rightPanel, topMode: action.mode } };
85
- case 'SET_RIGHT_BOTTOM_MODE':
86
- return { ...state, rightPanel: { ...state.rightPanel, bottomMode: action.mode } };
87
- case 'SET_RIGHT_SPLIT_RATIO':
88
- return { ...state, rightPanel: { ...state.rightPanel, splitRatio: clampRatio(action.ratio) } };
89
- case 'OPEN_RIGHT_PANEL': {
90
- const rp = state.rightPanel;
91
- const slot = action.slot ?? (rp.topMode === null ? 'top' : 'bottom');
453
+ case 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB': {
454
+ const nextTabs = focusOrCreateFirstRightSidebarTab(state.rightPanel.tabs, action.kind);
455
+ return {
456
+ ...state,
457
+ rightPanel: { ...state.rightPanel, open: true, tabs: nextTabs },
458
+ };
459
+ }
460
+ case 'CREATE_RIGHT_SIDEBAR_TAB': {
461
+ const nextTabs = createRightSidebarTab(state.rightPanel.tabs, action.kind, action.tab);
92
462
  return {
93
463
  ...state,
94
- rightPanel: normalizeRightPanel({
95
- ...rp,
464
+ rightPanel: { ...state.rightPanel, open: true, tabs: nextTabs },
465
+ };
466
+ }
467
+ case 'ACTIVATE_RIGHT_SIDEBAR_TAB': {
468
+ const nextTabs = activateRightSidebarTab(state.rightPanel.tabs, action.tabId);
469
+ return {
470
+ ...state,
471
+ rightPanel: { ...state.rightPanel, tabs: nextTabs },
472
+ };
473
+ }
474
+ case 'SET_RIGHT_SIDEBAR_TAB_META': {
475
+ const nextTabs = updateRightSidebarTabMeta(state.rightPanel.tabs, action.tabId, action.patch);
476
+ if (nextTabs === state.rightPanel.tabs) return state;
477
+ return {
478
+ ...state,
479
+ rightPanel: { ...state.rightPanel, tabs: nextTabs },
480
+ };
481
+ }
482
+ case 'CLOSE_RIGHT_SIDEBAR_TAB': {
483
+ const nextTabs = closeRightSidebarTab(state.rightPanel.tabs, action.tabId);
484
+ const open = nextTabs.openTabs.length > 0;
485
+ return {
486
+ ...state,
487
+ rightPanel: { ...state.rightPanel, open, tabs: nextTabs },
488
+ };
489
+ }
490
+ case 'OPEN_FILE_IN_FILES_TAB': {
491
+ const nextTabs = openFileInFilesTab(state.rightPanel.tabs, action.path);
492
+ return {
493
+ ...state,
494
+ rightPanel: {
495
+ ...state.rightPanel,
96
496
  open: true,
97
- [slot === 'top' ? 'topMode' : 'bottomMode']: action.mode,
98
- ceoDirectOpen: action.mode === 'ceo' && action.direct === true,
99
- }),
497
+ tabs: nextTabs,
498
+ fileFolderLayout: restoreSplitOnFileOpen(state.rightPanel.fileFolderLayout),
499
+ },
500
+ };
501
+ }
502
+ case 'OPEN_FOLDER_IN_FILES_TAB': {
503
+ const nextTabs = openFolderInFilesTab(state.rightPanel.tabs, action.path);
504
+ return {
505
+ ...state,
506
+ rightPanel: { ...state.rightPanel, open: true, tabs: nextTabs },
100
507
  };
101
508
  }
102
- case 'CLOSE_RIGHT_SUB': {
103
- const rp = state.rightPanel;
104
- const next = {
105
- ...rp,
106
- [action.slot === 'top' ? 'topMode' : 'bottomMode']: null,
509
+ case 'SET_FILES_TAB_FILE': {
510
+ const nextTabs = applyFilesTabState(state.rightPanel.tabs, action.tabId, { activeFilePath: action.path });
511
+ if (nextTabs === state.rightPanel.tabs) return state;
512
+ const fileFolderLayout = action.path
513
+ ? restoreSplitOnFileOpen(state.rightPanel.fileFolderLayout)
514
+ : state.rightPanel.fileFolderLayout;
515
+ return { ...state, rightPanel: { ...state.rightPanel, tabs: nextTabs, fileFolderLayout } };
516
+ }
517
+ case 'SET_FILES_TAB_ROOT': {
518
+ const nextTabs = applyFilesTabState(state.rightPanel.tabs, action.tabId, { folderRootPath: action.path, repoRootPath: null, repoRootMode: 'instance' });
519
+ if (nextTabs === state.rightPanel.tabs) return state;
520
+ return { ...state, rightPanel: { ...state.rightPanel, tabs: nextTabs } };
521
+ }
522
+ case 'SET_FILES_TAB_REPO_ROOT': {
523
+ const nextTabs = applyFilesTabRepoRoot(state.rightPanel.tabs, action.tabId, action.path, action.mode);
524
+ if (nextTabs === state.rightPanel.tabs) return state;
525
+ return { ...state, rightPanel: { ...state.rightPanel, tabs: nextTabs } };
526
+ }
527
+ case 'SET_BROWSER_TAB_STATE': {
528
+ const patch: { url?: string; title?: string } = {};
529
+ if (action.url !== undefined) patch.url = action.url;
530
+ if (action.title !== undefined) patch.title = action.title;
531
+ const nextTabs = applyBrowserTabState(state.rightPanel.tabs, action.tabId, patch);
532
+ if (nextTabs === state.rightPanel.tabs) return state;
533
+ return { ...state, rightPanel: { ...state.rightPanel, tabs: nextTabs } };
534
+ }
535
+ case 'OPEN_BROWSER_MODULE_TAB': {
536
+ const nextTabs = openBrowserModuleTab(state.rightPanel.tabs, action.url);
537
+ return {
538
+ ...state,
539
+ rightPanel: { ...state.rightPanel, open: true, tabs: nextTabs },
107
540
  };
108
- if (next.topMode === null && next.bottomMode !== null) {
109
- next.topMode = next.bottomMode;
110
- next.bottomMode = null;
541
+ }
542
+ case 'SET_DESIGN_TAB_STATE': {
543
+ const nextTabs = applyDesignTabState(state.rightPanel.tabs, action.tabId, action.patch);
544
+ if (nextTabs === state.rightPanel.tabs) return state;
545
+ return { ...state, rightPanel: { ...state.rightPanel, tabs: nextTabs } };
546
+ }
547
+ case 'SET_FILE_FOLDER_SPLIT_RATIO': {
548
+ const ratio = clampFileFolderRatio(action.ratio);
549
+ const mode = fileFolderViewModeFromRatio(ratio);
550
+ const lastSplitRatio = mode === 'split' ? ratio : state.rightPanel.fileFolderLayout.lastSplitRatio;
551
+ return {
552
+ ...state,
553
+ rightPanel: {
554
+ ...state.rightPanel,
555
+ fileFolderLayout: { mode, splitRatio: ratio, lastSplitRatio },
556
+ },
557
+ };
558
+ }
559
+ case 'SET_FILE_FOLDER_VIEW_MODE': {
560
+ const ffl = state.rightPanel.fileFolderLayout;
561
+ if (action.mode === ffl.mode) return state;
562
+ let ratio = ffl.splitRatio;
563
+ let lastSplitRatio = ffl.lastSplitRatio;
564
+ if (action.mode === 'folder-only') ratio = 0;
565
+ else if (action.mode === 'file-only') ratio = 1;
566
+ else {
567
+ ratio = lastSplitRatio || FILE_FOLDER_SPLIT_RATIO_DEFAULT;
568
+ lastSplitRatio = ratio;
111
569
  }
112
- if (next.topMode === null && next.bottomMode === null) next.open = false;
113
- return { ...state, rightPanel: next };
570
+ return {
571
+ ...state,
572
+ rightPanel: {
573
+ ...state.rightPanel,
574
+ fileFolderLayout: { mode: action.mode, splitRatio: ratio, lastSplitRatio },
575
+ },
576
+ };
114
577
  }
115
- case 'SOLO_RIGHT_SUB': {
116
- const rp = state.rightPanel;
117
- const mode = action.slot === 'top' ? rp.topMode : rp.bottomMode;
118
- if (mode === null) return state;
578
+ case 'RESTORE_FILE_FOLDER_SPLIT': {
579
+ const ffl = state.rightPanel.fileFolderLayout;
580
+ const ratio = ffl.lastSplitRatio || FILE_FOLDER_SPLIT_RATIO_DEFAULT;
119
581
  return {
120
582
  ...state,
121
583
  rightPanel: {
122
- ...rp,
123
- open: true,
124
- topMode: mode,
125
- bottomMode: null,
126
- splitRatio: 0.5,
584
+ ...state.rightPanel,
585
+ fileFolderLayout: { mode: 'split', splitRatio: ratio, lastSplitRatio: ratio },
127
586
  },
128
587
  };
129
588
  }
@@ -159,14 +618,24 @@ function reducer(state: PanelLayoutState, action: Action): PanelLayoutState {
159
618
  }
160
619
  }
161
620
 
621
+ const defaultFileFolderLayout: FileFolderLayoutState = {
622
+ mode: 'split',
623
+ splitRatio: FILE_FOLDER_SPLIT_RATIO_DEFAULT,
624
+ lastSplitRatio: FILE_FOLDER_SPLIT_RATIO_DEFAULT,
625
+ };
626
+
627
+ const defaultTabsState: RightSidebarTabsState = {
628
+ openTabs: [],
629
+ activeTabId: null,
630
+ nextOrdinalByKind: {},
631
+ };
632
+
162
633
  const initialState: PanelLayoutState = {
163
634
  rightPanel: {
164
635
  open: false,
165
636
  width: RIGHT_PANEL_DEFAULT_WIDTH,
166
- topMode: null,
167
- bottomMode: null,
168
- splitRatio: 0.5,
169
- ceoDirectOpen: false,
637
+ tabs: defaultTabsState,
638
+ fileFolderLayout: defaultFileFolderLayout,
170
639
  },
171
640
  bottomPanel: {
172
641
  open: false,
@@ -180,7 +649,7 @@ type PanelLayoutContextValue = {
180
649
  state: PanelLayoutState;
181
650
  dispatch: React.Dispatch<Action>;
182
651
  effectiveRightOpen: boolean;
183
- rightPanelSplit: boolean;
652
+ activeRightTabKind: RightSidebarTabKind | null;
184
653
  };
185
654
 
186
655
  const PanelLayoutContext = createContext<PanelLayoutContextValue | null>(null);
@@ -197,6 +666,13 @@ function dispatchTerminalShortcutAfterMount(detail: 'focusTerminal' | 'newTermin
197
666
  }, 0);
198
667
  }
199
668
 
669
+ function getActiveRightTabKind(state: PanelLayoutState): RightSidebarTabKind | null {
670
+ const { tabs } = state.rightPanel;
671
+ if (!tabs.activeTabId) return null;
672
+ const tab = tabs.openTabs.find(t => t.id === tabs.activeTabId);
673
+ return tab?.kind ?? null;
674
+ }
675
+
200
676
  export function PanelLayoutProvider(props: {
201
677
  children: ReactNode;
202
678
  initialPanelState?: Partial<PanelLayoutState> | undefined;
@@ -219,9 +695,8 @@ export function PanelLayoutProvider(props: {
219
695
  return () => clearTimeout(timer);
220
696
  }, [state]);
221
697
 
222
- const effectiveRightOpen = state.rightPanel.open
223
- && (state.rightPanel.topMode !== null || state.rightPanel.bottomMode !== null);
224
- const rightPanelSplit = state.rightPanel.topMode !== null && state.rightPanel.bottomMode !== null;
698
+ const effectiveRightOpen = state.rightPanel.open && state.rightPanel.tabs.openTabs.length > 0 && state.rightPanel.tabs.activeTabId !== null;
699
+ const activeRightTabKind = getActiveRightTabKind(state);
225
700
 
226
701
  useEffect(() => {
227
702
  return panelShortcutBus.register((action) => {
@@ -231,10 +706,10 @@ export function PanelLayoutProvider(props: {
231
706
  else dispatch({ type: 'OPEN_BOTTOM_TAB', tab: 'terminal' });
232
707
  return true;
233
708
  case 'toggleRightPanel':
234
- if (state.rightPanel.open && (state.rightPanel.topMode !== null || state.rightPanel.bottomMode !== null)) {
709
+ if (effectiveRightOpen) {
235
710
  dispatch({ type: 'SET_RIGHT_OPEN', open: false });
236
711
  } else {
237
- dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'folder', slot: 'top' });
712
+ dispatch({ type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB', kind: 'files' });
238
713
  }
239
714
  return true;
240
715
  case 'focusTerminal':
@@ -246,10 +721,10 @@ export function PanelLayoutProvider(props: {
246
721
  dispatchTerminalShortcutAfterMount('newTerminalSession');
247
722
  return true;
248
723
  case 'openDiff':
249
- dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'diff' });
724
+ dispatch({ type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB', kind: 'diff' });
250
725
  return true;
251
726
  case 'openFolderTree':
252
- dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'folder' });
727
+ dispatch({ type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB', kind: 'files' });
253
728
  return true;
254
729
  case 'closeActiveBottomTab':
255
730
  if (state.bottomPanel.activeTab) {
@@ -260,11 +735,11 @@ export function PanelLayoutProvider(props: {
260
735
  return false;
261
736
  }
262
737
  });
263
- }, [state.bottomPanel.open, state.bottomPanel.activeTab, state.rightPanel.open, state.rightPanel.topMode, state.rightPanel.bottomMode]);
738
+ }, [state.bottomPanel.open, state.bottomPanel.activeTab, effectiveRightOpen]);
264
739
 
265
740
  const value = useMemo(() => ({
266
- state, dispatch, effectiveRightOpen, rightPanelSplit,
267
- }), [state, effectiveRightOpen, rightPanelSplit]);
741
+ state, dispatch, effectiveRightOpen, activeRightTabKind,
742
+ }), [state, effectiveRightOpen, activeRightTabKind]);
268
743
 
269
744
  return (
270
745
  <PanelLayoutContext.Provider value={value}>
@@ -283,20 +758,28 @@ export function usePanelActions() {
283
758
  const { dispatch, state } = usePanelLayout();
284
759
 
285
760
  return useMemo(() => ({
286
- openRightPanel: (mode: RightPanelMode, slot?: 'top' | 'bottom') =>
287
- dispatch({ type: 'OPEN_RIGHT_PANEL', mode, slot }),
288
- closeRightSub: (slot: 'top' | 'bottom') =>
289
- dispatch({ type: 'CLOSE_RIGHT_SUB', slot }),
290
- soloRightSub: (slot: 'top' | 'bottom') =>
291
- dispatch({ type: 'SOLO_RIGHT_SUB', slot }),
761
+ focusOrCreateFirstRightSidebarTab: (kind: RightSidebarTabKind) =>
762
+ dispatch({ type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB', kind }),
763
+ createRightSidebarTab: (kind: RightSidebarTabKind, tab?: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>>) =>
764
+ dispatch({ type: 'CREATE_RIGHT_SIDEBAR_TAB', kind, ...(tab ? { tab } : {}) }),
765
+ activateRightSidebarTab: (tabId: string) =>
766
+ dispatch({ type: 'ACTIVATE_RIGHT_SIDEBAR_TAB', tabId }),
767
+ setRightSidebarTabMeta: (tabId: string, patch: Partial<Pick<RightSidebarOpenTab, 'title' | 'specificName' | 'sourceLabel'>>) =>
768
+ dispatch({ type: 'SET_RIGHT_SIDEBAR_TAB_META', tabId, patch }),
769
+ closeRightSidebarTab: (tabId: string) =>
770
+ dispatch({ type: 'CLOSE_RIGHT_SIDEBAR_TAB', tabId }),
292
771
  setRightWidth: (width: number) =>
293
772
  dispatch({ type: 'SET_RIGHT_WIDTH', width }),
294
- setRightSplitRatio: (ratio: number) =>
295
- dispatch({ type: 'SET_RIGHT_SPLIT_RATIO', ratio }),
773
+ setFileFolderSplitRatio: (ratio: number) =>
774
+ dispatch({ type: 'SET_FILE_FOLDER_SPLIT_RATIO', ratio }),
775
+ setFileFolderViewMode: (mode: FileFolderViewMode) =>
776
+ dispatch({ type: 'SET_FILE_FOLDER_VIEW_MODE', mode }),
777
+ restoreFileFolderSplit: () =>
778
+ dispatch({ type: 'RESTORE_FILE_FOLDER_SPLIT' }),
296
779
  toggleRightPanel: () =>
297
- state.rightPanel.open && (state.rightPanel.topMode !== null || state.rightPanel.bottomMode !== null)
780
+ state.rightPanel.open && state.rightPanel.tabs.openTabs.length > 0
298
781
  ? dispatch({ type: 'SET_RIGHT_OPEN', open: false })
299
- : dispatch({ type: 'OPEN_RIGHT_PANEL', mode: 'folder', slot: 'top' }),
782
+ : dispatch({ type: 'FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB', kind: 'files' }),
300
783
  openBottomTab: (tab: BottomPanelTab) =>
301
784
  dispatch({ type: 'OPEN_BOTTOM_TAB', tab }),
302
785
  closeBottomTab: (tab: BottomPanelTab) =>