@schlenkr/ragents 0.1.18 → 0.1.20

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 (209) hide show
  1. package/apps/server/src/host-api.json +6 -2
  2. package/apps/server/src/host-api.ts +3 -2
  3. package/apps/server/src/host-web.ts +3 -0
  4. package/apps/server/src/plugin-support/actor-programs/contract.ts +0 -3
  5. package/apps/server/src/plugin-support/removed-layout.ts +94 -0
  6. package/apps/server/src/ragents/engine.ts +2 -1
  7. package/apps/server/src/title-compactor.ts +5 -7
  8. package/apps/web/dist/assets/highlighted-body-KPVGNVTW-k67VKdbw.js +1 -0
  9. package/apps/web/dist/assets/main-CVjIz7BS.js +674 -0
  10. package/apps/web/dist/help/guide-clients.html +22 -42
  11. package/apps/web/dist/help/guide-clients.md +24 -45
  12. package/apps/web/dist/help/guide-functions.html +1 -1
  13. package/apps/web/dist/help/guide-functions.md +1 -1
  14. package/apps/web/dist/help/guide-getting-started.html +14 -22
  15. package/apps/web/dist/help/guide-getting-started.md +17 -24
  16. package/apps/web/dist/help/guide-ideas.html +1 -1
  17. package/apps/web/dist/help/guide-ideas.md +1 -1
  18. package/apps/web/dist/help/guide-plugins.html +1 -1
  19. package/apps/web/dist/help/guide-plugins.md +1 -1
  20. package/apps/web/dist/help/guide-programs.html +1 -1
  21. package/apps/web/dist/help/guide-programs.md +1 -1
  22. package/apps/web/dist/help/index.html +12 -79
  23. package/apps/web/dist/help/mini-app.css +8 -502
  24. package/apps/web/dist/host-web.json +28 -23
  25. package/apps/web/dist/index.html +2 -3
  26. package/apps/web/dist/run-panel.html +3 -4
  27. package/apps/web/src/Overview.tsx +4 -143
  28. package/apps/web/src/PluginChat.tsx +22 -116
  29. package/apps/web/src/PluginRegistry.tsx +4 -9
  30. package/apps/web/src/RunPreparationChat.tsx +4 -1
  31. package/apps/web/src/host-modules.ts +2 -0
  32. package/apps/web/src/main.tsx +23 -3
  33. package/apps/web/src/panel/RunLine.tsx +5 -2
  34. package/apps/web/src/panel/RunsPage.tsx +6 -6
  35. package/apps/web/src/panel/StartPage.tsx +6 -5
  36. package/apps/web/src/panel/contract.ts +3 -0
  37. package/apps/web/src/panel/page-props.ts +2 -0
  38. package/apps/web/src/run-apps.ts +34 -0
  39. package/apps/web/src/run-overview.ts +0 -27
  40. package/apps/web/src/run-panel/PanelContributions.tsx +41 -0
  41. package/apps/web/src/run-panel/RunPanelApp.tsx +172 -91
  42. package/apps/web/src/run-panel/RunPanelMenu.tsx +4 -3
  43. package/apps/web/src/run-panel/RunPanelWorkspace.tsx +8 -2
  44. package/apps/web/src/run-panel/clipboard.ts +17 -14
  45. package/apps/web/src/run-panel/host-contract.ts +8 -9
  46. package/apps/web/src/run-panel/host.ts +5 -31
  47. package/apps/web/src/run-panel/input-bridge.ts +15 -7
  48. package/bundles/ragents.activity/ragents-bundle.json +2 -2
  49. package/bundles/ragents.actor-programs/prompt.hbs +4 -5
  50. package/bundles/ragents.actor-programs/ragents-bundle.json +4 -14
  51. package/bundles/ragents.actor-programs/server/index.js +2 -14
  52. package/bundles/ragents.actor-programs/server/index.js.map +2 -2
  53. package/bundles/ragents.actor-programs/web/classes.json +1 -1
  54. package/bundles/ragents.actor-programs/web/index.js +1 -3
  55. package/bundles/ragents.actor-programs/web/index.js.map +4 -4
  56. package/bundles/ragents.ask/ragents-bundle.json +2 -2
  57. package/bundles/ragents.browser/ragents-bundle.json +2 -2
  58. package/bundles/ragents.documents/ragents-bundle.json +2 -2
  59. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +2 -2
  60. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +2 -2
  61. package/bundles/ragents.lsp-typescript/ragents-bundle.json +2 -2
  62. package/bundles/ragents.model-relay/ragents-bundle.json +2 -2
  63. package/bundles/ragents.orchestration/ragents-bundle.json +15 -41
  64. package/bundles/ragents.orchestration/server/index.js +10 -249
  65. package/bundles/ragents.orchestration/server/index.js.map +4 -4
  66. package/bundles/ragents.orchestration/web/chunks/chunk-KU7O6MEX.js +2 -0
  67. package/bundles/ragents.orchestration/web/chunks/chunk-KU7O6MEX.js.map +7 -0
  68. package/bundles/ragents.orchestration/web/classes.json +1 -1
  69. package/bundles/ragents.orchestration/web/exports/web/program-slot.js +1 -1
  70. package/bundles/ragents.orchestration/web/index.js +10 -18
  71. package/bundles/ragents.orchestration/web/index.js.map +4 -4
  72. package/bundles/ragents.overseer/ragents-bundle.json +3 -3
  73. package/bundles/ragents.overseer/server/index.js +0 -1
  74. package/bundles/ragents.overseer/server/index.js.map +2 -2
  75. package/bundles/ragents.processes/ragents-bundle.json +2 -2
  76. package/bundles/ragents.product/ragents-bundle.json +2 -2
  77. package/bundles/ragents.profile-distribution/ragents-bundle.json +2 -2
  78. package/bundles/ragents.reference/ragents-bundle.json +3 -3
  79. package/bundles/ragents.reference/run-scripts/balcony-wizard/RUN.md +1 -1
  80. package/bundles/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -2
  81. package/bundles/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +6 -7
  82. package/bundles/ragents.reference/run-scripts/conversation-circle/RUN.md +3 -3
  83. package/bundles/ragents.reference/run-scripts/conversation-circle/src/server.ts +3 -13
  84. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  85. package/bundles/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +1 -6
  86. package/bundles/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -15
  87. package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
  88. package/bundles/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  89. package/bundles/ragents.reference/run-scripts/quick-note/RUN.md +1 -1
  90. package/bundles/ragents.reference/run-scripts/quick-note/src/server.ts +1 -2
  91. package/bundles/ragents.reference/run-scripts/quick-note/tests/program.test.ts +0 -2
  92. package/bundles/ragents.reference/run-scripts/run-roster/RUN.md +2 -2
  93. package/bundles/ragents.reference/run-scripts/run-roster/src/server.ts +1 -2
  94. package/bundles/ragents.reference/run-scripts/run-roster/tests/program.test.ts +0 -2
  95. package/bundles/ragents.reference/run-scripts/shared-actor-list/src/server.ts +1 -1
  96. package/bundles/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  97. package/bundles/ragents.reference/run-scripts/word-game/src/contract.ts +1 -1
  98. package/bundles/ragents.reference/run-scripts/word-game/src/server.ts +0 -1
  99. package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +1 -2
  100. package/bundles/ragents.reference/skills/80-actor-text-analysis/SKILL.md +1 -1
  101. package/bundles/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
  102. package/bundles/ragents.todo/ragents-bundle.json +2 -2
  103. package/bundles/ragents.transcript/ragents-bundle.json +2 -2
  104. package/bundles/ragents.watch/ragents-bundle.json +2 -2
  105. package/bundles/ragents.workspace/ragents-bundle.json +2 -2
  106. package/package.json +8 -8
  107. package/packages/agent/dist/core/agent-settings.d.ts +1 -1
  108. package/packages/agent/src/core/agent-settings.ts +2 -2
  109. package/packages/ai/dist/types.d.ts +2 -1
  110. package/packages/ai/src/api/ai-sdk.ts +15 -2
  111. package/packages/ai/src/types.ts +2 -1
  112. package/packages/ragents/src/runtime/journal.ts +4 -0
  113. package/plugins/ragents.actor-programs/prompt.hbs +4 -5
  114. package/plugins/ragents.actor-programs/server/access-projections.ts +1 -1
  115. package/plugins/ragents.actor-programs/server/index.ts +0 -2
  116. package/plugins/ragents.actor-programs/server/runtime.ts +2 -10
  117. package/plugins/ragents.actor-programs/web/ActorViewFrame.tsx +5 -20
  118. package/plugins/ragents.actor-programs/web/AppsPanel.tsx +3 -79
  119. package/plugins/ragents.actor-programs/web/EmbeddedApps.tsx +0 -9
  120. package/plugins/ragents.actor-programs/web/api.ts +0 -20
  121. package/plugins/ragents.actor-programs/web/context.ts +0 -3
  122. package/plugins/ragents.actor-programs/web/index.tsx +0 -9
  123. package/plugins/ragents.orchestration/ragents-plugin.json +1 -2
  124. package/plugins/ragents.orchestration/server/index.ts +1 -11
  125. package/plugins/ragents.orchestration/web/ActorChat.tsx +1 -1
  126. package/plugins/ragents.orchestration/web/ActorChatControls.tsx +1 -1
  127. package/plugins/ragents.orchestration/web/FlowInspector.tsx +2 -4
  128. package/plugins/ragents.orchestration/web/InspectionPanel.tsx +21 -0
  129. package/plugins/ragents.orchestration/web/index.tsx +13 -9
  130. package/plugins/ragents.orchestration/web/program-slot.ts +0 -3
  131. package/plugins/ragents.orchestration/web/run-panel/AddresseeControl.tsx +15 -36
  132. package/plugins/ragents.orchestration/web/run-panel/RunPanel.tsx +76 -451
  133. package/plugins/ragents.orchestration/web/run-panel/run-panel-actors.ts +0 -27
  134. package/plugins/ragents.orchestration/web/run-panel/run-panel-state.ts +7 -40
  135. package/plugins/ragents.overseer/server/coordinator-prompt.ts +0 -1
  136. package/plugins/ragents.reference/examples.ts +1 -2
  137. package/plugins/ragents.reference/run-scripts/balcony-wizard/RUN.md +1 -1
  138. package/plugins/ragents.reference/run-scripts/balcony-wizard/src/server.ts +1 -2
  139. package/plugins/ragents.reference/run-scripts/balcony-wizard/tests/program.test.ts +6 -7
  140. package/plugins/ragents.reference/run-scripts/conversation-circle/RUN.md +3 -3
  141. package/plugins/ragents.reference/run-scripts/conversation-circle/src/server.ts +3 -13
  142. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/helpers.ts +1 -1
  143. package/plugins/ragents.reference/run-scripts/conversation-circle/tests/program.test.ts +1 -6
  144. package/plugins/ragents.reference/run-scripts/learning-afternoon/src/server.ts +1 -15
  145. package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
  146. package/plugins/ragents.reference/run-scripts/moderated-round/tests/helpers.ts +1 -1
  147. package/plugins/ragents.reference/run-scripts/quick-note/RUN.md +1 -1
  148. package/plugins/ragents.reference/run-scripts/quick-note/src/server.ts +1 -2
  149. package/plugins/ragents.reference/run-scripts/quick-note/tests/program.test.ts +0 -2
  150. package/plugins/ragents.reference/run-scripts/run-roster/RUN.md +2 -2
  151. package/plugins/ragents.reference/run-scripts/run-roster/src/server.ts +1 -2
  152. package/plugins/ragents.reference/run-scripts/run-roster/tests/program.test.ts +0 -2
  153. package/plugins/ragents.reference/run-scripts/shared-actor-list/src/server.ts +1 -1
  154. package/plugins/ragents.reference/run-scripts/shared-actor-list/tests/helpers.ts +1 -1
  155. package/plugins/ragents.reference/run-scripts/word-game/src/contract.ts +1 -1
  156. package/plugins/ragents.reference/run-scripts/word-game/src/server.ts +0 -1
  157. package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +1 -2
  158. package/plugins/ragents.reference/skills/80-actor-text-analysis/SKILL.md +1 -1
  159. package/plugins/ragents.reference/skills/90-actor-notes/SKILL.md +1 -1
  160. package/plugins/ragents.reference/walkthroughs.ts +13 -14
  161. package/apps/web/dist/assets/highlighted-body-KPVGNVTW-BwD4uYEe.js +0 -1
  162. package/apps/web/dist/assets/main-KBrc5Q77.js +0 -11
  163. package/apps/web/dist/assets/mermaid-HWGCJPDP-CSCkaArr.js +0 -608
  164. package/apps/web/dist/assets/runPanel-BjG5NBKm.js +0 -26
  165. package/apps/web/src/App.tsx +0 -318
  166. package/apps/web/src/SessionList.tsx +0 -157
  167. package/apps/web/src/SurfaceShortcuts.tsx +0 -60
  168. package/apps/web/src/WorkspacePanel.tsx +0 -309
  169. package/apps/web/src/run-panel.tsx +0 -52
  170. package/bundles/ragents.orchestration/server/chunks/chunk-QS3WJ3D7.js +0 -11
  171. package/bundles/ragents.orchestration/server/chunks/chunk-QS3WJ3D7.js.map +0 -7
  172. package/bundles/ragents.orchestration/server/exports/server/contract.js +0 -9
  173. package/bundles/ragents.orchestration/server/exports/server/contract.js.map +0 -7
  174. package/bundles/ragents.orchestration/surface.hbs +0 -39
  175. package/bundles/ragents.orchestration/web/chunks/chunk-CFMJD5ZI.js +0 -2
  176. package/bundles/ragents.orchestration/web/chunks/chunk-CFMJD5ZI.js.map +0 -7
  177. package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js +0 -2
  178. package/bundles/ragents.orchestration/web/chunks/chunk-HOBLI364.js.map +0 -7
  179. package/bundles/ragents.orchestration/web/chunks/chunk-UCIMT2R4.js +0 -2
  180. package/bundles/ragents.orchestration/web/chunks/chunk-UCIMT2R4.js.map +0 -7
  181. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js +0 -2
  182. package/bundles/ragents.orchestration/web/chunks/chunk-XGPPQCZR.js.map +0 -7
  183. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js +0 -2
  184. package/bundles/ragents.orchestration/web/exports/web/surface-entities.js.map +0 -7
  185. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js +0 -2
  186. package/bundles/ragents.orchestration/web/exports/web/tile-docking.js.map +0 -7
  187. package/plugins/ragents.actor-programs/web/ExpandIcon.tsx +0 -5
  188. package/plugins/ragents.actor-programs/web/FullscreenHost.tsx +0 -31
  189. package/plugins/ragents.orchestration/contract.ts +0 -51
  190. package/plugins/ragents.orchestration/server/contract.ts +0 -14
  191. package/plugins/ragents.orchestration/server/surface-tool.ts +0 -198
  192. package/plugins/ragents.orchestration/surface.hbs +0 -39
  193. package/plugins/ragents.orchestration/tiled-layout.ts +0 -55
  194. package/plugins/ragents.orchestration/web/ActorChatPreview.tsx +0 -29
  195. package/plugins/ragents.orchestration/web/ActorShortcut.tsx +0 -74
  196. package/plugins/ragents.orchestration/web/ActorSurfaceControls.tsx +0 -130
  197. package/plugins/ragents.orchestration/web/ActorTile.tsx +0 -23
  198. package/plugins/ragents.orchestration/web/Center.tsx +0 -133
  199. package/plugins/ragents.orchestration/web/SurfaceTiles.tsx +0 -47
  200. package/plugins/ragents.orchestration/web/TiledSurface.tsx +0 -280
  201. package/plugins/ragents.orchestration/web/actor-header-settings.ts +0 -41
  202. package/plugins/ragents.orchestration/web/run-panel/RunPanelSettings.tsx +0 -50
  203. package/plugins/ragents.orchestration/web/run-panel/run-panel-settings.ts +0 -47
  204. package/plugins/ragents.orchestration/web/run-panel/sheet-status.ts +0 -30
  205. package/plugins/ragents.orchestration/web/surface-entities.ts +0 -21
  206. package/plugins/ragents.orchestration/web/surface-view-settings.ts +0 -42
  207. package/plugins/ragents.orchestration/web/tile-docking.ts +0 -105
  208. package/plugins/ragents.orchestration/web/tiled-view-settings.ts +0 -74
  209. /package/apps/web/dist/assets/{mermaid-HWGCJPDP-BPn4aV2r.css → main-BPn4aV2r.css} +0 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "inputs": {
3
3
  "apps/server/src/api/contracts.ts": "5dcbff61b0e317a674fa58475027e1d30da6ac9f1812aced1fdbf325c4271a91",
4
- "apps/server/src/host-api.ts": "e5cd123304fbf0567eef1985e0e1b9ce3b1cf845f111238fa755b36d928a3e1f",
5
- "apps/server/src/plugin-support/actor-programs/contract.ts": "e8a1ba7dde7b73ad8904bafba2f61b4ef1ea0f0aa957fae2a76920edfc668974",
4
+ "apps/server/src/host-api.ts": "b65b335eda3609c41f105a2c3feaeaa37723e2118059a7f47bc705c28e9e7c72",
5
+ "apps/server/src/plugin-support/actor-programs/contract.ts": "1216f5753d2eb0f4867aa4efae29d923a7a802e8af3b38c0e044714d06649c92",
6
6
  "apps/server/src/plugin-support/chat-display-contract.ts": "2fb8aab13b5a60b4fe28f87f93cc82afb34b7d8ef1463e376bc3cbc0bcdc797b",
7
7
  "apps/server/src/plugin-support/language-server/contract.ts": "01794d6b63c19bb3c201412b45480d8dde5bd0f3d50459fb936a5e9b314d5a83",
8
8
  "apps/server/src/plugin-support/product-model-settings-contract.ts": "40d139db6a5c9047ad832c4f29465321e939cdf610789c367f9d064878c3e5f7",
@@ -10,13 +10,11 @@
10
10
  "apps/server/src/plugin-support/start-options-contract.ts": "d56fe3df91c0c14cfab8ad58c688a47fc9215be47f62fe19f1ccb34c65065073",
11
11
  "apps/server/src/run-preparation-input.ts": "ee806e0e74d99f65e72a63ffddcdeedc70c7d59961d9bae6850f8e3c0de52c25",
12
12
  "apps/web/index.html": "4e01810a6b3f8d5924898324364b75ac03ea7eb3b631edf2e4c2ddb39dba3ae8",
13
- "apps/web/run-panel.html": "615084affe6f0aacec1a0607b4d11cc270fb2bbaa68f04538129b45abe5b494a",
14
13
  "apps/web/src/access-session.ts": "9628082681a6e426d0f4bc16fb18ecfce23f9b52538efd1910f6025a157711c2",
15
14
  "apps/web/src/access-token.ts": "d3040d9148dd31395da920e2c933d5066c20a249aa967200716070a2b1ecfcce",
16
15
  "apps/web/src/AccessContext.tsx": "38cffefabf8dd2bfb7171d1f1c6474c2cf6834c4134469fce460d1942d0ddfb4",
17
16
  "apps/web/src/actor-conversation.ts": "73063988356134a2dbf0f83c5cadbe7301870a29aebaf0163301bde792b96b24",
18
17
  "apps/web/src/api.ts": "13d17fb25c05aaf53220fe96be0bce9c7155270b7e3e22a0c605c3bd967bddd6",
19
- "apps/web/src/App.tsx": "95f5eee9b1cb1a359fecc11c6322484842f6cf7f545a29d11764a98d3bcab8d2",
20
18
  "apps/web/src/chat-view-settings.tsx": "8a8bd0a77093c0c657c401efd52143c88825b085c06b34bf37440a115e9b3ad5",
21
19
  "apps/web/src/chat/chat-target.ts": "44303252e87f172b93194fe0c0eba84217992cb17a438cb2cd2ba00fefccf012",
22
20
  "apps/web/src/chat/QuasselHost.tsx": "66b3e2f3549537b8daaf955251ae3ef8254229b92953b9583557d46c3515a486",
@@ -31,7 +29,7 @@
31
29
  "apps/web/src/HelpDialog.tsx": "f26779378c46b01516d64dfa4f40ee8bb395fe93e45188788b08ba54dd3d5f91",
32
30
  "apps/web/src/highlighting.css": "6a62919c7a97c46650d644c8e35c06f88a2a424fff76e1e813585eb942613b3c",
33
31
  "apps/web/src/highlighting.ts": "230fcce0809920d1aa4d461080ae87e045a953b7c837dde3548e8eb0a06e60c6",
34
- "apps/web/src/host-modules.ts": "4ee544df48225e8f8d1a1129c686607b24669bc4449dfc20ed45ff50e964af18",
32
+ "apps/web/src/host-modules.ts": "eb42c55b7f4d0a712020c43fb76be807fe6200bb5b6883666066f063c69b0406",
35
33
  "apps/web/src/language-server/api.ts": "e7ee2a9f951c7c3ef9418699cab508bfdcfd244e93275ca162f1d7a9c1c57460",
36
34
  "apps/web/src/language-server/language-server-plugin.tsx": "f9395456dc3394b27356f5960ef9ac96191ce4a959fd6006f6cb9fad287b5cbf",
37
35
  "apps/web/src/lib/format.ts": "b875bed8ad74e53c786c6449a7a87dffd597739c220014f46136326c0a84dfcc",
@@ -39,16 +37,25 @@
39
37
  "apps/web/src/lib/http.ts": "492eb2e36fc36d2e9766d1fa38aa164cc8056dda3c95f80222a2b0d6f556cd2b",
40
38
  "apps/web/src/lib/labels.ts": "4caffd0ec6a1c2793c863b63247a7f1cfae5a4f22ee9fc3d6f6ff3d6dbe7d66f",
41
39
  "apps/web/src/lib/local-storage-setting.ts": "10ceec06882fffebb1f01b8b05bf98b1c9a5c5d07592d1fa05150af7e9bda2e8",
42
- "apps/web/src/main.tsx": "645b2ab96af7f4b2d6453e102e4d5695f9516c7abc27b4a1c131471a35038735",
40
+ "apps/web/src/main.tsx": "aa28c092fc3c58bb2efd0f1ad9cb913c985fe71e6d4476c0f81b198e23347d34",
43
41
  "apps/web/src/model-settings-events.ts": "4c9761536fe8bc3e2994bfe358225a3976f375df8402b366a8a54cf2392ea095",
44
42
  "apps/web/src/offered-machines.ts": "46121a01a0e6e76de2143285bf01d46f1db2826e27311328eb47765e785cfd0e",
45
- "apps/web/src/Overview.tsx": "a419c8b2a581ec8a936df835b974a768a405583f6376927fcd5cdf476cf4c86d",
43
+ "apps/web/src/Overview.tsx": "d61f12b11ab668148e8494a0d8f1424b12cfa3b4d722b9502efea3f6bfd5fe50",
46
44
  "apps/web/src/page-opener.tsx": "a8a61e533137dedcef84d4bf39811278d4ba6cfc456dfad13df0d376f8d24ffb",
45
+ "apps/web/src/panel/connection-state.ts": "75e269fadf95d109a5bfd83bdc441e1eebf3e574b3cb505c72fefa5e858fdd0b",
46
+ "apps/web/src/panel/ConnectionsPage.tsx": "16a5b6c4ed88e7d67fda409eda2c3d0dd170060458dddd2e813ec35dcd355562",
47
+ "apps/web/src/panel/LoginForm.tsx": "a015ea1cb56f5fac28ff2cae145704d7af1d503438b973723c3d4f2f43060d9f",
48
+ "apps/web/src/panel/PanelDialogs.tsx": "b6ff682f572f5b6d483a19492f2ccd2e8ad73f51e23627f2f7d519ab009bcce1",
49
+ "apps/web/src/panel/PanelHeader.tsx": "8f470418fdc09d0414d0995c35ac502ba570ac6e1f9e88457ec82881655ec702",
50
+ "apps/web/src/panel/PanelPage.tsx": "732374a64a47ce62ce7591fe879c67947d73955426f3197644268f9cd7474469",
51
+ "apps/web/src/panel/RunLine.tsx": "54455c334ca9644f5de0912bd424be39eb5162d26066e01c14a0b4fe8938aadd",
52
+ "apps/web/src/panel/RunsPage.tsx": "01a34878c270c166a551b0c3a243e8cef304668ee2fb51d5227bd85ab8c54d33",
53
+ "apps/web/src/panel/StartPage.tsx": "824e12414af71b75639c16e331821f4cc73a33288efd4e396b5bacc89d33cfe1",
47
54
  "apps/web/src/plugin-bootstrap.ts": "57363e27011e78aa7a346d42e37eedeb840641aa55f14620fc8d782fff79cfac",
48
55
  "apps/web/src/PluginActivation.ts": "4e2fa7ca943f3b4dae1f0eee5b1543971cb2cf81a5a5e29df374f9b1c066c3ec",
49
- "apps/web/src/PluginChat.tsx": "769d216a285ace4951df7f7488517e4e39808ea1f049ccf5909d2e8296d15f1b",
56
+ "apps/web/src/PluginChat.tsx": "f525f5bba4de16faa92eea0c53c561844c9407f927b0aa76c3e0f22e36240d2d",
50
57
  "apps/web/src/PluginFailureNotice.tsx": "5443e628f50389ff6cc4f09be8b73f3d481efce5976f8955f853058c569bd932",
51
- "apps/web/src/PluginRegistry.tsx": "6eed3989ea350d4cc21b91c820824385c14c99489f97f87e92e8f27c323fdba6",
58
+ "apps/web/src/PluginRegistry.tsx": "4f5fdbfff4250bfb73dc606fc5ab1c4752016a4f909f7bc3be49a59820976f96",
52
59
  "apps/web/src/product/model-settings.ts": "445b05f8dd34e8145b474d04825408c4b7a2527559ec3ee549f9dba61ef91e13",
53
60
  "apps/web/src/product/ModelControl.tsx": "c3467c74fd0c595054b8be92f8df2cbf4be53cdceaac8f3337c96f3da547077a",
54
61
  "apps/web/src/product/ProductModelSettings.tsx": "e8513da26228da46ed04a5913967b5453d1276b712e26fa0d663369c904fb608",
@@ -56,27 +63,27 @@
56
63
  "apps/web/src/product/SystemPromptControl.tsx": "fcbabb5ae84ef29c89826e968bc3583075dba96423fdd003125bf23605920383",
57
64
  "apps/web/src/rpc.ts": "586f9307afa85f11f11faef801bb731230f2099685649aa7d9f666a851c490b5",
58
65
  "apps/web/src/rpc/client.ts": "5c50be675f7534b8a20a4e7db25cbe82444886b0f30a0aeed562e380c656f43a",
59
- "apps/web/src/run-overview.ts": "d87b462aecfbb4eff5292c3cdafb8bf6b46a6d823ddc305eacc243acddaefc61",
60
- "apps/web/src/run-panel.tsx": "aa28c092fc3c58bb2efd0f1ad9cb913c985fe71e6d4476c0f81b198e23347d34",
61
- "apps/web/src/run-panel/clipboard.ts": "844b2bd9d7982df158183ee131992d1d19d332f2eab3064981d9d5082dc89aba",
62
- "apps/web/src/run-panel/host-contract.ts": "d2d23b2f20345adc9cd2739ad73f2812a28fec65fc6a4d1c06bcdb4477727292",
63
- "apps/web/src/run-panel/host.ts": "79bd576c87d1b1075a338db827b056f6870a39c8b4f4cfa8895803ebce0c2ebb",
64
- "apps/web/src/run-panel/input-bridge.ts": "4c3deb8fe115286d20f29f92a6ae6cb38dbae8c883deb97e6f6c32c64fba843d",
66
+ "apps/web/src/run-apps.ts": "cfae1fa570a259bfb41bf1fd13e4d35e8e4a65aab352a76f4f78e65c056938d0",
67
+ "apps/web/src/run-overview.ts": "a6635f9fb20fda1bf92e757c2e345241898d34a1516a022eff57768a53c73e0b",
68
+ "apps/web/src/run-panel/clipboard.ts": "abe517f8d287be7bbbfcf425028b6f202ba228ae08689abc6b36e9548f4fe9bb",
69
+ "apps/web/src/run-panel/host-contract.ts": "85fc6843984f9380c62bde95695d9afe13d8c14a103bbac87574099099def7b0",
70
+ "apps/web/src/run-panel/host.ts": "b8e104c4ee9c98ede8fdf47f64c7523298c17999f97aaded6977122d0ea91897",
71
+ "apps/web/src/run-panel/input-bridge.ts": "44434c17c074dd5f2527aa262497cce848c8ba2c41df01b17b3c82516f7e0069",
65
72
  "apps/web/src/run-panel/keyboard.ts": "e89266a2e99c2d96dbec79f5c1aef937101cebdfa74fdc0b4bb1688986097526",
73
+ "apps/web/src/run-panel/PanelContributions.tsx": "fdeef503ae53f65741fdcbc0fbb67a276d4dfd893aced880c12387bf08ea2692",
66
74
  "apps/web/src/run-panel/run-panel-location.ts": "d191d3d9da695f277cd8f899b9682ba149c4bf1ae8e3cecc1bc2bc60bf3e7adb",
67
- "apps/web/src/run-panel/RunPanelApp.tsx": "a9541eafa3f67fc01e02ae3219bb6304bb0f91f43a97ade6a8313ab4c9b4c695",
75
+ "apps/web/src/run-panel/RunPanelApp.tsx": "5144c5d1c4629ca43aacf185737fca3b1b54a99a5a29669bf7ee0182e970fe8b",
68
76
  "apps/web/src/run-panel/RunPanelHeader.tsx": "a1ffbdbf4a705f14b859f11041f7954bfaccc7abe9b7640e7235774a953e0bad",
69
- "apps/web/src/run-panel/RunPanelMenu.tsx": "ea12a2e0a0867dbaee5e01473822ef238a9edb1739819140e3a669c01b219b28",
77
+ "apps/web/src/run-panel/RunPanelMenu.tsx": "c1e3820f6c215b4f5f2f5f75f766252beb7b8ed55d5c75664cdbd917728b154c",
70
78
  "apps/web/src/run-panel/RunPanelRail.tsx": "d3c0cddb28805690f92d1aeb5fe32a9d7459022cae2a4cdeb4c15b1c6196bd10",
71
- "apps/web/src/run-panel/RunPanelWorkspace.tsx": "f240418198b9b2dc39c041aa4f7dccd2412d9d46b06c8fa748e1f055aa04aeca",
79
+ "apps/web/src/run-panel/RunPanelWorkspace.tsx": "47156df91e276ff1c638f61d37c3b426bf78fe1946e9380950ab4a4b6744baff",
72
80
  "apps/web/src/run-panel/use-session-list.ts": "740a1040b50b597055b3950fcd99c42b3c6eef2cbbbac00eaee1c02370540838",
73
81
  "apps/web/src/run-panel/workspace-state.ts": "689d2f9cbbfccc15933b58084e84701af3be058320622b61581c7010406e9758",
74
82
  "apps/web/src/run-preparation.ts": "13726f2140a345b0d544758109004bdf05e1ce26df419cefa65001f4682c5422",
75
83
  "apps/web/src/run-read-state.ts": "f84c443dbcd8a4d3580c216908884fa5ea7c5a5f6157870eb7e514435bee4901",
76
84
  "apps/web/src/run-view.ts": "2f87b3d8a4e8b8dd613bc24def2e9a77b6058c6b527f37a7b90bc1b6d96ca49b",
77
- "apps/web/src/RunPreparationChat.tsx": "cd0eb63781cc60c68adb7ed2410fb52b1646fb1d0907a22dbbd6bb508e10616e",
85
+ "apps/web/src/RunPreparationChat.tsx": "dac9636cb6e53312da07c5cb5cb39f4e2749e6880a8d80282fd859c25821c58e",
78
86
  "apps/web/src/RunStore.ts": "3ca3b947521e8e5df5a11ced352d37f90fccbede5889fb873e9ab0157a1d4299",
79
- "apps/web/src/SessionList.tsx": "456fb59bd476ac480debc2eb21aafd5c6ac1a9e4bbcb9e471d18c02dc599148a",
80
87
  "apps/web/src/settings-contributions.ts": "5b5427293dde48cd85cbb99d1169823e0c89609d320363582bd131eb874ce893",
81
88
  "apps/web/src/SettingsModal.tsx": "014c227bdbdbe9029db720368b4a1aa826560474dc3f3992938345cbb0efef76",
82
89
  "apps/web/src/SourceCode.tsx": "bc80927cba80ac589dd89c8e0f9d1108dcf48d88a78e650051b084b9364c5001",
@@ -84,7 +91,6 @@
84
91
  "apps/web/src/StartSelection.tsx": "2b510e3a22ab099c795f47763043ee70294f663c442628d333aaa432ab7e0f08",
85
92
  "apps/web/src/StartTiles.tsx": "93b11279249ceeb2abf592bef24e9b6d853a313d08d10cc0b9ce65b3195eece3",
86
93
  "apps/web/src/StatusGroup.tsx": "e4638f895a6b03381b1927adadfef28c5c6c11d9291fb46af5d6136663e7dc98",
87
- "apps/web/src/SurfaceShortcuts.tsx": "89acfce21ebed770319afcb56e5f04ee95f54989c48e491bf5df656e43b07e9f",
88
94
  "apps/web/src/theme.ts": "c2dcd2cca4cf931748ad5848f996eddd9baf7f9cf6520219a33ad5226ad93f5c",
89
95
  "apps/web/src/ThemeSettings.tsx": "e4dedae92078d65945223128703cc99a3e9ad6fbce4b93285b10f3e6daeee633",
90
96
  "apps/web/src/title-model-settings.ts": "08718ba8a4d2e1a38b50642858a2a9ea5cc6f8ead3268bef956c55bb5fa5c7d3",
@@ -128,8 +134,7 @@
128
134
  "apps/web/src/ui/toggle.tsx": "039be815aed401e7e652271040fad53286ffa734743381a65f84ac61cb2ea4db",
129
135
  "apps/web/src/ui/tooltip.tsx": "6b09f531a1e3e9b9a4bda2c37f25f537963d084b752bcff6e7f9262947abdd2f",
130
136
  "apps/web/src/ui/useFileInput.ts": "ceeae0f796aabc947427fdc84454ede086c8dc38c667cf33a8145e427d001202",
131
- "apps/web/src/WorkspacePanel.tsx": "c220c1567eaa91bb309b7632fe6685c62231ac13714ac857b7e67ba979e74780",
132
- "apps/web/vite.config.ts": "6c9b8f92545455c36ab5f84324915052d056bdddb2321b21bfd9280aa5ab629e",
137
+ "apps/web/vite.config.ts": "02b6687438c3824d7444fa4f50b79cd1c5f84e4f0cf74ad0dbc69d5d49c9c651",
133
138
  "packages/ragents/src/access.ts": "1317e14439da69f1744bd28e74f1f0a60d74bf11fff02991ddbe4154a54d0f5a",
134
139
  "packages/ragents/src/domain/actor-reference.ts": "657f18122b55dfa9ceda91f4457a8cb95b51ff301c9e79387e1fd304a22d2da2",
135
140
  "packages/ragents/src/domain/events.ts": "152d943440fe1948f9a5f8dbd0755d1317196037ca3b0bbc9ea2bba6116884a7",
@@ -5,9 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="stylesheet" href="/ragents.css" />
7
7
  <title>RAgents</title>
8
- <script type="module" crossorigin src="/assets/main-KBrc5Q77.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-CSCkaArr.js">
10
- <link rel="stylesheet" crossorigin href="/assets/mermaid-HWGCJPDP-BPn4aV2r.css">
8
+ <script type="module" crossorigin src="/assets/main-CVjIz7BS.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/main-BPn4aV2r.css">
11
10
  </head>
12
11
  <body>
13
12
  <div id="root"></div>
@@ -4,10 +4,9 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="stylesheet" href="/ragents.css" />
7
- <title>RAgents Panel</title>
8
- <script type="module" crossorigin src="/assets/runPanel-BjG5NBKm.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-CSCkaArr.js">
10
- <link rel="stylesheet" crossorigin href="/assets/mermaid-HWGCJPDP-BPn4aV2r.css">
7
+ <title>RAgents</title>
8
+ <script type="module" crossorigin src="/assets/main-CVjIz7BS.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/main-BPn4aV2r.css">
11
10
  </head>
12
11
  <body>
13
12
  <div id="root"></div>
@@ -1,24 +1,7 @@
1
- import { useCallback, useEffect, useRef, useState, type ComponentType } from "react";
2
- import { Button, Card, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "./ui";
1
+ import { useCallback, useEffect, useRef, type ComponentType } from "react";
2
+ import { Card, DialogTitle } from "./ui";
3
3
  import { Modal } from "./ui/modal";
4
- import type { SessionInfo } from "./api";
5
4
  import type { OverviewPanelContext, OverviewPanelContribution, PluginRegistry } from "./PluginRegistry";
6
- import type { RunReadRevisions } from "./run-read-state";
7
- import { SessionList } from "./SessionList";
8
-
9
- /** The run list inside the overview; deletion is the host's job, the section only shows its outcome. */
10
- export interface RunsSectionProps {
11
- sessions: SessionInfo[];
12
- seenRevisions?: RunReadRevisions;
13
- activeId: string | undefined;
14
- registry: PluginRegistry;
15
- unreachable: boolean;
16
- canCreate: boolean;
17
- canDelete: boolean;
18
- onOpen: (id: string) => void;
19
- onCreate: () => void;
20
- onDelete: (ids: readonly string[]) => Promise<void>;
21
- }
22
5
 
23
6
  interface OverviewProps {
24
7
  open: boolean;
@@ -27,7 +10,6 @@ interface OverviewProps {
27
10
  registry: PluginRegistry;
28
11
  panels: readonly OverviewPanelContribution[];
29
12
  onBusy: (id: string, busy: boolean) => void;
30
- runs?: RunsSectionProps;
31
13
  }
32
14
 
33
15
  const FOCUSABLE_SELECTOR =
@@ -35,8 +17,8 @@ const FOCUSABLE_SELECTOR =
35
17
 
36
18
  const overviewSurfaceClass = "pointer-events-auto shadow-pop";
37
19
 
38
- /** The corner button opens the run list and contributions placed in the overview. */
39
- export function Overview({ onBusy, onClose, onOpen, open, panels, registry, runs }: OverviewProps) {
20
+ /** The shared shell opens contributions placed in the overview. */
21
+ export function Overview({ onBusy, onClose, onOpen, open, panels, registry }: OverviewProps) {
40
22
  const overviewRef = useRef<HTMLDivElement>(null);
41
23
 
42
24
  useEffect(() => {
@@ -56,7 +38,6 @@ export function Overview({ onBusy, onClose, onOpen, open, panels, registry, runs
56
38
  {panels.map(({ id, Panel }) => (
57
39
  <OverviewPanelHost id={id} key={id} onBusy={onBusy} onClose={onClose} onOpen={onOpen} open={open} Panel={Panel} registry={registry} />
58
40
  ))}
59
- {runs && <RunsSection {...runs} />}
60
41
  </div>
61
42
  </Modal>
62
43
  );
@@ -79,123 +60,3 @@ function OverviewPanelHost({ id, onBusy, onClose, onOpen, open, Panel, registry
79
60
  </Card>
80
61
  );
81
62
  }
82
-
83
- function RunsSection({ activeId, canCreate, canDelete, onCreate, onDelete, onOpen, registry, sessions, seenRevisions, unreachable }: RunsSectionProps) {
84
- const [error, setError] = useState<string>();
85
- const [selectMode, setSelectMode] = useState(false);
86
- const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(() => new Set());
87
- const [confirmBulkDelete, setConfirmBulkDelete] = useState(false);
88
- const [deleting, setDeleting] = useState(false);
89
-
90
- const exitSelectMode = () => {
91
- setSelectMode(false);
92
- setSelectedIds(new Set());
93
- };
94
-
95
- const toggleSelected = (id: string) => {
96
- setSelectedIds((current) => {
97
- const next = new Set(current);
98
- if (!next.delete(id)) next.add(id);
99
- return next;
100
- });
101
- };
102
-
103
- const remove = async (ids: readonly string[]) => {
104
- setDeleting(true);
105
- setError(undefined);
106
- try {
107
- await onDelete(ids);
108
- } catch (cause) {
109
- setError(cause instanceof Error ? cause.message : String(cause));
110
- } finally {
111
- setDeleting(false);
112
- }
113
- };
114
-
115
- const removeSelected = async () => {
116
- await remove(sessions.filter((session) => selectedIds.has(session.id)).map((session) => session.id));
117
- setConfirmBulkDelete(false);
118
- exitSelectMode();
119
- };
120
-
121
- return (
122
- <section aria-labelledby="overview-runs-title" className="flex min-h-0 min-w-0 flex-1 flex-col max-[900px]:flex-[1_1_50%]">
123
- <Card className={`${overviewSurfaceClass} min-h-0 flex-1 gap-workspace-inset overflow-y-auto overscroll-contain pt-workspace-inset pr-6 pb-6 pl-6 max-[900px]:px-3 max-[900px]:pt-3.5 max-[900px]:pb-4`}>
124
- <header className="flex flex-wrap items-center gap-x-3.5 gap-y-2.5">
125
- <h2 className="text-[0.95rem] font-semibold" id="overview-runs-title">
126
- Runs <span className="ml-1 text-[0.8rem] font-medium tabular-nums text-muted-foreground">{sessions.length}</span>
127
- </h2>
128
- {unreachable && <span className="text-[0.72rem] font-medium text-destructive" role="alert">Server unreachable</span>}
129
- {canDelete && sessions.length > 0 && (
130
- <div className="ml-auto flex flex-wrap items-center gap-1">
131
- {selectMode
132
- ? (
133
- <>
134
- <Button onClick={() => setSelectedIds(new Set(sessions.map((session) => session.id)))} size="sm" variant="ghost">
135
- All
136
- </Button>
137
- <Button onClick={() => setSelectedIds(new Set())} size="sm" variant="ghost">
138
- None
139
- </Button>
140
- <Button
141
- className="ml-auto"
142
- disabled={selectedIds.size === 0 || deleting}
143
- onClick={() => setConfirmBulkDelete(true)}
144
- size="sm"
145
- variant="destructive"
146
- >
147
- Delete ({selectedIds.size})
148
- </Button>
149
- <Button onClick={exitSelectMode} size="sm" variant="ghost">
150
- Done
151
- </Button>
152
- </>
153
- )
154
- : (
155
- <Button onClick={() => setSelectMode(true)} size="sm" variant="ghost">
156
- Select
157
- </Button>
158
- )}
159
- </div>
160
- )}
161
- </header>
162
- {error && <p className="text-[0.72rem] font-medium text-destructive" role="alert">{error}</p>}
163
- <p className="mb-5.5 text-[0.75rem] text-muted-foreground">By last activity in the run. New activity has come in since you last viewed it.</p>
164
- <SessionList
165
- seenRevisions={seenRevisions}
166
- activeId={activeId}
167
- onCreate={canCreate ? onCreate : undefined}
168
- onDelete={canDelete ? (id) => void remove([id]) : undefined}
169
- onSelect={onOpen}
170
- onToggleSelected={toggleSelected}
171
- registry={registry}
172
- selectMode={selectMode}
173
- selectedIds={selectedIds}
174
- sessions={sessions}
175
- />
176
- {confirmBulkDelete && (
177
- <Dialog open onOpenChange={(open) => { if (!open && !deleting) setConfirmBulkDelete(false); }}>
178
- <DialogContent scope="page" showCloseButton={false} size="small">
179
- <DialogHeader>
180
- <DialogTitle>Delete runs</DialogTitle>
181
- <DialogDescription>
182
- {selectedIds.size === 1
183
- ? "One run will be permanently deleted."
184
- : `${selectedIds.size} runs will be permanently deleted.`}
185
- </DialogDescription>
186
- </DialogHeader>
187
- <DialogFooter>
188
- <Button disabled={deleting} onClick={() => setConfirmBulkDelete(false)} variant="outline">
189
- Cancel
190
- </Button>
191
- <Button disabled={deleting} onClick={() => void removeSelected()}>
192
- {deleting ? "Deleting ..." : `Delete (${selectedIds.size})`}
193
- </Button>
194
- </DialogFooter>
195
- </DialogContent>
196
- </Dialog>
197
- )}
198
- </Card>
199
- </section>
200
- );
201
- }
@@ -1,3 +1,4 @@
1
+ import { runApps, selectedRunApp, RunAppView } from "./run-apps";
1
2
  import { isRecord } from "./lib/guards";
2
3
  import { useAccess } from "./AccessContext";
3
4
  import {
@@ -19,18 +20,15 @@ import { runUserLocation, type ChatRunLocation } from "./chat/user-location";
19
20
  import { dismissAction, interruptActorTurn, type SessionInfo } from "./api";
20
21
  import { useRunStore } from "./RunStore";
21
22
  import { withToolSummaries } from "./toolLine";
22
- import { StartOptionBadges, StartOptionControls, StartOptionsProvider, useStartOptions } from "./StartOptions";
23
+ import { StartOptionControls, StartOptionsProvider, useStartOptions } from "./StartOptions";
23
24
  import { useAttachmentCapabilities } from "./chat/useAttachmentCapabilities";
24
25
  import { StartSelection } from "./StartSelection";
25
- import { WorkspacePanel, useWorkspacePanelState, type WorkspacePanelState } from "./WorkspacePanel";
26
26
  import { StatusGroup } from "./StatusGroup";
27
- import { SurfaceShortcuts } from "./SurfaceShortcuts";
28
27
  import { RunPanelHeader } from "./run-panel/RunPanelHeader";
29
28
  import { RunPanelRail } from "./run-panel/RunPanelRail";
30
29
  import { RunPanelWorkspace } from "./run-panel/RunPanelWorkspace";
31
30
  import { activeWorkspaceTab, saveRunPanelWorkspaceState, useRunPanelWorkspaceState } from "./run-panel/workspace-state";
32
- import { ToolbarItem, ToolbarText } from "./Toolbar";
33
- import { cn, DialogTitle, Spinner } from "./ui";
31
+ import { cn, DialogTitle } from "./ui";
34
32
  import { SurfaceModalContext, RunModalContext } from "./ui/dialog";
35
33
  import { Modal } from "./ui/modal";
36
34
  import {
@@ -51,8 +49,8 @@ import {
51
49
 
52
50
  const chatElementClass = "flex h-full min-h-0 w-full min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-border-soft/60 bg-card/55";
53
51
 
54
- /** workspace: surface and workshop; panel: the run panel; element: exactly one surface element at full size. */
55
- export type ChatLayout = "workspace" | "panel" | { element: string };
52
+ /** The shared run panel or one mini-app in an editor. */
53
+ export type ChatLayout = "panel" | { element: string };
56
54
 
57
55
  interface PluginChatProps {
58
56
  autoFocusChat?: boolean;
@@ -61,7 +59,6 @@ interface PluginChatProps {
61
59
  toolbarContainer?: HTMLElement | null;
62
60
  statusContainer?: HTMLElement | null;
63
61
  headerContainer?: HTMLElement | null;
64
- workspaceHeaderContainer?: HTMLElement | null;
65
62
  startDialog?: { onClose: () => void; initialEntryId?: string };
66
63
  initialStartOptions?: Readonly<Record<string, unknown>>;
67
64
  onStarted?: () => void;
@@ -78,10 +75,9 @@ interface ChatWorkspaceProps {
78
75
  layout: ChatLayout;
79
76
  toolbarContainer?: HTMLElement | null;
80
77
  statusContainer?: HTMLElement | null;
81
- panelState: WorkspacePanelState;
78
+ panelState: "expanded" | "collapsed";
82
79
  onTogglePanel: () => void;
83
80
  headerContainer?: HTMLElement | null;
84
- workspaceHeaderContainer?: HTMLElement | null;
85
81
  startDialog?: { onClose: () => void; initialEntryId?: string };
86
82
  onStarted: () => void;
87
83
  onModalContainer: (element: HTMLDivElement | null) => void;
@@ -94,7 +90,7 @@ interface ChatWorkspaceProps {
94
90
  tabs: readonly WorkspaceTabContribution[];
95
91
  }
96
92
 
97
- export function PluginChat({ autoFocusChat, onAutoFocusChatSettled, layout = "workspace", headerContainer, toolbarContainer, workspaceHeaderContainer, statusContainer, initialStartOptions, onStarted, onLocationChange, onViewed, viewing = false, registry, session, startDialog }: PluginChatProps) {
93
+ export function PluginChat({ autoFocusChat, onAutoFocusChatSettled, layout = "panel", headerContainer, toolbarContainer, statusContainer, initialStartOptions, onStarted, onLocationChange, onViewed, viewing = false, registry, session, startDialog }: PluginChatProps) {
98
94
  const access = useAccess();
99
95
  const startOnly = startDialog !== undefined;
100
96
  const [modalContainer, setModalContainer] = useState<HTMLDivElement | null>(null);
@@ -156,7 +152,7 @@ export function PluginChat({ autoFocusChat, onAutoFocusChatSettled, layout = "wo
156
152
 
157
153
  const registeredTabs = useMemo(() => registry.registeredTabs(sessionContext, access), [access, registry, sessionContext]);
158
154
  const availableTabs = useMemo(() => registry.availableTabs(sessionContext, access), [access, registry, sessionContext]);
159
- const { activeTabId, panelState, showTab, togglePanel } = useWorkspaceTabs(session.id, layout, availableTabs);
155
+ const { activeTabId, panelState, showTab, togglePanel } = useWorkspaceTabs(session.id, availableTabs);
160
156
 
161
157
  const openTab = useCallback((tabId: string, selection?: unknown) => {
162
158
  if (!registeredTabs.some((tab) => tab.id === tabId)) {
@@ -228,7 +224,6 @@ export function PluginChat({ autoFocusChat, onAutoFocusChatSettled, layout = "wo
228
224
  panelState={panelState}
229
225
  onTogglePanel={togglePanel}
230
226
  headerContainer={headerContainer}
231
- workspaceHeaderContainer={workspaceHeaderContainer}
232
227
  statusContainer={statusContainer}
233
228
  onModalContainer={setModalContainer}
234
229
  onSurfaceModalContainer={setSurfaceModalContainer}
@@ -249,33 +244,18 @@ export function PluginChat({ autoFocusChat, onAutoFocusChatSettled, layout = "wo
249
244
  );
250
245
  }
251
246
 
252
- /** The tab state per layout: on the web a transient tab and the stored expand state, in the run panel the open sidebar tab stored per run. */
253
- function useWorkspaceTabs(runId: string, layout: ChatLayout, availableTabs: readonly WorkspaceTabContribution[]) {
254
- const [requestedTabId, setRequestedTabId] = useState<string>();
255
- const [workspaceState, updateWorkspaceState] = useWorkspacePanelState(runId);
247
+ function useWorkspaceTabs(runId: string, availableTabs: readonly WorkspaceTabContribution[]) {
256
248
  const stored = useRunPanelWorkspaceState(runId);
257
- const runPanel = layout === "panel";
258
- const activeTabId = runPanel
259
- ? activeWorkspaceTab(stored, availableTabs)
260
- : requestedTabId !== undefined && availableTabs.some((tab) => tab.id === requestedTabId) ? requestedTabId : availableTabs[0]?.id ?? "";
261
- const panelState: WorkspacePanelState = runPanel ? (activeTabId === "" ? "collapsed" : "expanded") : workspaceState;
249
+ const activeTabId = activeWorkspaceTab(stored, availableTabs);
250
+ const panelState = activeTabId === "" ? "collapsed" : "expanded";
262
251
  const firstTabId = availableTabs[0]?.id ?? null;
263
252
  const showTab = useCallback((tabId: string) => {
264
- if (runPanel) {
265
- saveRunPanelWorkspaceState(runId, { ...stored, tab: tabId });
266
- return;
267
- }
268
- setRequestedTabId(tabId);
269
- updateWorkspaceState("expanded");
270
- }, [runId, runPanel, stored, updateWorkspaceState]);
253
+ saveRunPanelWorkspaceState(runId, { ...stored, tab: tabId });
254
+ }, [runId, stored]);
271
255
  const togglePanel = useCallback(() => {
272
- if (runPanel) {
273
- saveRunPanelWorkspaceState(runId, { ...stored, tab: panelState === "expanded" ? null : stored.tab ?? firstTabId });
274
- return;
275
- }
276
- updateWorkspaceState(panelState === "expanded" ? "collapsed" : "expanded");
277
- }, [firstTabId, panelState, runId, runPanel, stored, updateWorkspaceState]);
278
- return { activeTabId, panelState, showTab, togglePanel };
256
+ saveRunPanelWorkspaceState(runId, { ...stored, tab: panelState === "expanded" ? null : stored.tab ?? firstTabId });
257
+ }, [firstTabId, panelState, runId, stored]);
258
+ return { activeTabId, panelState, showTab, togglePanel } as const;
279
259
  }
280
260
 
281
261
  function UserLocationReporter({ activeTabId, onChange, panelVisible, runId, tabs }: {
@@ -304,7 +284,6 @@ function ChatWorkspace({
304
284
  panelState,
305
285
  onTogglePanel,
306
286
  headerContainer,
307
- workspaceHeaderContainer,
308
287
  statusContainer = null,
309
288
  onModalContainer,
310
289
  onSurfaceModalContainer,
@@ -318,9 +297,7 @@ function ChatWorkspace({
318
297
  tabs,
319
298
  }: ChatWorkspaceProps) {
320
299
  const access = useAccess();
321
- const [runToolbarContainer, setRunToolbarContainer] = useState<HTMLDivElement | null>(null);
322
- const headerContributions = registry.headersFor(session, access, "header");
323
- const surfaceContributions = registry.headersFor(session, access, "surface");
300
+ const headerContributions = registry.headersFor(session, access);
324
301
  const startSession = useMemo<SessionContext>(() => {
325
302
  const attempt = async (work: () => Promise<void>) => {
326
303
  await work();
@@ -345,7 +322,6 @@ function ChatWorkspace({
345
322
  };
346
323
  }, [attentionActive]);
347
324
  const hasWorkspace = !startDialog && tabs.length > 0;
348
- const SurfaceCenter = registry.surface?.Center;
349
325
  const SurfaceRunPanel = registry.surface?.RunPanel;
350
326
  const bindCompactContainers = useCallback((element: HTMLDivElement | null) => {
351
327
  onModalContainer(element);
@@ -375,29 +351,10 @@ function ChatWorkspace({
375
351
  const status = registry.sessionStatus.filter((entry) => !entry.readRight || access.can(entry.readRight)).map(({ id, order, Status }) => <StatusGroup container={statusContainer} key={id} label="Run actions" order={order}>
376
352
  <Status navigation={navigation} session={session} />
377
353
  </StatusGroup>);
378
- const header = headerContainer && createPortal(layout === "panel"
379
- ? <RunPanelHeader attention={attention} contributions={headerContributions} navigation={navigation} registry={registry} runError={runError} session={session} working={session.running} />
380
- : <div className="flex min-w-0 flex-[1_0_auto] items-stretch">
381
- <div className="flex min-w-0 flex-none items-stretch text-[0.82rem] font-semibold text-foreground">
382
- <ToolbarItem className="min-w-[140px] max-w-[260px] justify-start font-semibold max-md:min-w-[120px] max-md:max-w-[180px]" title={session.session.title}><ToolbarText>{session.session.title || "New run"}</ToolbarText></ToolbarItem>
383
- {registry.sessionMetadata.map(({ id, Metadata }) => (
384
- <Metadata key={id} placement="header" session={session.session} />
385
- ))}
386
- <StartOptionBadges registry={registry} session={session} />
387
- {session.running && <ToolbarItem className="text-[0.72rem] font-normal text-muted-foreground"><Spinner aria-hidden className="size-2.5" /><ToolbarText>Processing</ToolbarText></ToolbarItem>}
388
- {runError && <ToolbarItem className="text-[0.72rem] font-medium text-destructive" title={runError}><ToolbarText>Run unreachable</ToolbarText></ToolbarItem>}
389
- </div>
390
- {headerContributions.length > 0 && (
391
- <div className="flex min-w-0 flex-none items-stretch overflow-visible">
392
- {headerContributions.map(({ id, Header }) => (
393
- <Header key={id} navigation={navigation} session={session} />
394
- ))}
395
- </div>
396
- )}
397
- {attention && <ToolbarItem as="div" className="bg-primary/10 text-[0.72rem] font-semibold text-primary" role="status"><ToolbarText>{attention.label}</ToolbarText></ToolbarItem>}
398
- </div>, headerContainer);
354
+ const header = headerContainer && createPortal(
355
+ <RunPanelHeader attention={attention} contributions={headerContributions} navigation={navigation} registry={registry} runError={runError} session={session} working={session.running} />, headerContainer);
399
356
 
400
- if (layout !== "workspace") return (
357
+ return (
401
358
  <div className="flex min-h-0 min-w-0 flex-1 flex-col">
402
359
  {status}
403
360
  {header}
@@ -409,7 +366,6 @@ function ChatWorkspace({
409
366
  {SurfaceRunPanel
410
367
  ? <SurfaceRunPanel
411
368
  toolbarContainer={toolbarContainer}
412
- runToolbarContainer={null}
413
369
  statusContainer={statusContainer}
414
370
  cardSections={registry.cardSections}
415
371
  surfaceElements={registry.surfaceElements}
@@ -426,54 +382,6 @@ function ChatWorkspace({
426
382
  </div>
427
383
  </div>
428
384
  );
429
-
430
- return (
431
- <div className="flex min-h-0 min-w-0 flex-1 flex-col">
432
- {status}
433
- {header}
434
- <div
435
- className="relative flex min-h-0 min-w-0 flex-1 data-[resizing=true]:cursor-col-resize data-[resizing=true]:select-none"
436
- ref={onModalContainer}
437
- >
438
- <div className="flex min-h-0 min-w-0 flex-1 flex-col">
439
- {(SurfaceCenter || surfaceContributions.length > 0) && <div aria-label="Apps and actors" className="flex min-h-[52px] min-w-0 flex-none items-stretch border-b border-border bg-[color-mix(in_srgb,var(--surface)_55%,var(--card))]" role="region">
440
- <div className="flex flex-none items-stretch empty:hidden" ref={setRunToolbarContainer} />
441
- <SurfaceShortcuts key={session.session.id}>
442
- {surfaceContributions.map(({ id, Header }) => <Header key={id} navigation={navigation} session={session} />)}
443
- </SurfaceShortcuts>
444
- </div>}
445
- <div className="relative isolate flex min-h-0 min-w-0 flex-1" ref={onSurfaceModalContainer}>
446
- {SurfaceCenter
447
- ? (
448
- <SurfaceCenter
449
- toolbarContainer={toolbarContainer}
450
- runToolbarContainer={runToolbarContainer}
451
- statusContainer={statusContainer}
452
- cardSections={registry.cardSections}
453
- surfaceElements={registry.surfaceElements}
454
- navigation={navigation}
455
- renderChat={renderChat}
456
- session={session}
457
- tabIds={tabs.map((tab) => tab.id)}
458
- />
459
- )
460
- : <DefaultCenter renderChat={renderChat} />}
461
- </div>
462
- </div>
463
- {hasWorkspace && (
464
- <WorkspacePanel
465
- headerContainer={workspaceHeaderContainer ?? null}
466
- navigation={navigation}
467
- onToggleState={onTogglePanel}
468
- pendingTabIds={pendingTabIds}
469
- session={session}
470
- state={panelState}
471
- tabs={tabs}
472
- />
473
- )}
474
- </div>
475
- </div>
476
- );
477
385
  }
478
386
 
479
387
  function DefaultCenter({ renderChat }: {
@@ -495,14 +403,12 @@ function SurfaceElementView({ elementId, navigation, registry, session }: {
495
403
  registry: PluginRegistry;
496
404
  session: SessionContext;
497
405
  }) {
498
- const match = registry.surfaceElements.flatMap((contribution) => contribution.select(session)
499
- .filter((definition) => definition.id === elementId && definition.visible !== false)
500
- .map((definition) => ({ Element: contribution.Element, definition })))[0];
406
+ const match = selectedRunApp(runApps(session, registry.surfaceElements), elementId);
501
407
  if (!match) return <div className="m-auto max-w-[420px] p-6 text-center text-muted-foreground" role="status">
502
408
  {session.runView === undefined ? "Loading run ..." : "This mini-app no longer exists in the run."}
503
409
  </div>;
504
410
  return <div className="flex min-h-0 min-w-0 flex-1 flex-col" data-view="element">
505
- <match.Element definition={match.definition} navigation={navigation} session={session} />
411
+ <RunAppView app={match} navigation={navigation} session={session} />
506
412
  </div>;
507
413
  }
508
414
 
@@ -109,7 +109,7 @@ export interface EntityReference {
109
109
  id: string;
110
110
  }
111
111
 
112
- /** The selection on the surface: tiles, actor entry points and pop-outs report it, the surface shows it, the chat reports it as the location. */
112
+ /** The selected actor or mini-app, reported as the current run location. */
113
113
  export interface SurfaceController {
114
114
  acceptSelection: (selection: EntityReference | undefined) => void;
115
115
  selection: EntityReference | undefined;
@@ -124,7 +124,6 @@ export interface ChatDisplayOptions {
124
124
  }
125
125
 
126
126
  export interface SurfaceCenterContext {
127
- runToolbarContainer: HTMLElement | null;
128
127
  toolbarContainer: HTMLElement | null;
129
128
  statusContainer: HTMLElement | null;
130
129
  cardSections: readonly CardSectionContribution[];
@@ -136,9 +135,7 @@ export interface SurfaceCenterContext {
136
135
  }
137
136
 
138
137
  export interface SurfaceContribution {
139
- Center: ComponentType<SurfaceCenterContext>;
140
- /** The run panel (run-panel.html) with the same context; without a contribution it shows only the chat. */
141
- RunPanel?: ComponentType<SurfaceCenterContext>;
138
+ RunPanel: ComponentType<SurfaceCenterContext>;
142
139
  }
143
140
 
144
141
  export interface SurfaceElementDefinition {
@@ -217,7 +214,6 @@ export interface SessionHeaderContribution {
217
214
  readRight?: string;
218
215
  /** The contribution needs the run's workspace and is missing where the viewer cannot reach it. */
219
216
  requiresWorkspace?: boolean;
220
- placement?: "header" | "surface";
221
217
  id: string;
222
218
  order: number;
223
219
  Header: ComponentType<SessionHeaderContext>;
@@ -495,9 +491,8 @@ export class PluginRegistry {
495
491
  .filter((tab) => (!tab.requiresWorkspace || workspaceAccessible(session.session)) && (tab.available?.(session) ?? true));
496
492
  }
497
493
 
498
- headersFor(session: SessionContext, access: AccessContext, placement: "header" | "surface"): readonly SessionHeaderContribution[] {
499
- return this.sessionHeaders.filter((entry) => (entry.placement ?? "header") === placement
500
- && (!entry.readRight || access.can(entry.readRight))
494
+ headersFor(session: SessionContext, access: AccessContext): readonly SessionHeaderContribution[] {
495
+ return this.sessionHeaders.filter((entry) => (!entry.readRight || access.can(entry.readRight))
501
496
  && (!entry.requiresWorkspace || workspaceAccessible(session.session)));
502
497
  }
503
498