@openchambery/web 2.0.0-beta.3 → 2.0.0-beta.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 (178) hide show
  1. package/dist/assets/{AgentAvatar-B_JQoreg.js → AgentAvatar-BBmQXYDq.js} +1 -1
  2. package/dist/assets/AssistantView-BG8hK4y9.js +3 -0
  3. package/dist/assets/{DiagramView-BNnda8qO.js → DiagramView-CN0qWNU5.js} +1 -1
  4. package/dist/assets/{FadeInOnReveal-VYQTSAkr.js → FadeInOnReveal-w_BQ7K7K.js} +1 -1
  5. package/dist/assets/Icon-B9kZgYZn.js +1 -0
  6. package/dist/assets/{MarkdownRenderer-CJHSsWin.js → MarkdownRenderer-Ds61--LT.js} +2 -2
  7. package/dist/assets/{MarkdownRendererImpl-DwrHFGUp.js → MarkdownRendererImpl-DOMmiOH0.js} +1 -1
  8. package/dist/assets/{MarkstreamRendererImpl-CSnbQMu3.js → MarkstreamRendererImpl-F7MGg5ER.js} +1 -1
  9. package/dist/assets/{MobileDetailNavigation-BXr6AGLT.js → MobileDetailNavigation-DcmVOjkw.js} +1 -1
  10. package/dist/assets/{MobileShareBridge-D7OE9OP_.js → MobileShareBridge-C1Fc4ErB.js} +2 -2
  11. package/dist/assets/MobileSurface-BA7eS5Yd.js +2 -0
  12. package/dist/assets/{MultiRunWindow-DF3iIFCd.js → MultiRunWindow-BoTnH6Yp.js} +1 -1
  13. package/dist/assets/{OnboardingScreen-BjHmlwlw.js → OnboardingScreen-BxItVnnO.js} +1 -1
  14. package/dist/assets/{OverlayScrollbar-DLtWO_Gp.js → OverlayScrollbar-B4e0QD05.js} +1 -1
  15. package/dist/assets/SettingsView-CjesWNLw.js +25 -0
  16. package/dist/assets/{SettingsWindow-BI5swspb.js → SettingsWindow-CReMbg-w.js} +1 -1
  17. package/dist/assets/TerminalView-C64-QYOG.js +8 -0
  18. package/dist/assets/{ToolOutputDialog-BEWhBcRd.js → ToolOutputDialog-CJu8DNrt.js} +1 -1
  19. package/dist/assets/{appThemeRegistry-4MR0F7Jz.js → appThemeRegistry-CF4lIxNt.js} +1 -1
  20. package/dist/assets/{assistant-attachment-cache-C0aRnFkj.js → assistant-attachment-cache-DphJleHr.js} +1 -1
  21. package/dist/assets/{button-DKuz3L8l.js → button-CwXyux0a.js} +1 -1
  22. package/dist/assets/collapsible-BZ6_cYJd.js +1 -0
  23. package/dist/assets/context-menu-DHrRifPE.js +1 -0
  24. package/dist/assets/{desktopHosts-CoDkOnyS.js → desktopHosts-JGFqhlaM.js} +1 -1
  25. package/dist/assets/{desktopRelayRestore-DDlVKyOE.js → desktopRelayRestore-CHEwrI93.js} +1 -1
  26. package/dist/assets/{diagram-D7T8HQgj.js → diagram-BwnPNKWt.js} +1 -1
  27. package/dist/assets/{dialog-DQYl3W_o.js → dialog-Dp0lQv5K.js} +1 -1
  28. package/dist/assets/es-DicJ8lKD.js +15 -0
  29. package/dist/assets/{fileMentionTouchSelection-BZ6ovBYH.js → fileMentionTouchSelection-DPZRxNa2.js} +3 -4
  30. package/dist/assets/{fileQueries-JrpcsOCs.js → fileQueries-DN6gbLhM.js} +1 -1
  31. package/dist/assets/fr-lhgVcBW_.js +13 -0
  32. package/dist/assets/{gitApi-CM42qUed.js → gitApi-D8R7ic-T.js} +3 -3
  33. package/dist/assets/{imageSource-CIl0FL10.js → imageSource-BMztRu0c.js} +1 -1
  34. package/dist/assets/{input-CzQy8UhV.js → input-Biw8aNzR.js} +1 -1
  35. package/dist/assets/insertionBoundaries-DdwCD4S2.js +1 -0
  36. package/dist/assets/ja-B9EZwOcw.js +15 -0
  37. package/dist/assets/ko-Dxk-uJRb.js +15 -0
  38. package/dist/assets/main-BhlwwJ2c.js +169 -0
  39. package/dist/assets/main-D2BzpnUt.css +1 -0
  40. package/dist/assets/main-DSPCkT74.js +2 -0
  41. package/dist/assets/{markdownHeightCache-Cj1I5NDw.js → markdownHeightCache-BOOrGCuG.js} +1 -1
  42. package/dist/assets/markdownTheme-DM5h1i18.js +1 -0
  43. package/dist/assets/{mcpQueries-D5mQymgM.js → mcpQueries-CE9tk-Jz.js} +1 -1
  44. package/dist/assets/miniChat-Ckk9ABql.js +2 -0
  45. package/dist/assets/mobile-cLMRZqI9.js +2 -0
  46. package/dist/assets/multirun-DVnFRb1V.js +4 -0
  47. package/dist/assets/persistence-D0y7226-.js +3 -0
  48. package/dist/assets/pl-CFhwWLJj.js +15 -0
  49. package/dist/assets/platform-D_c-T5nO.js +6 -0
  50. package/dist/assets/projectMeta-CSQgHequ.js +3 -0
  51. package/dist/assets/pt-BR-Ba6GfZ6J.js +15 -0
  52. package/dist/assets/{relay-image-stream-DM7atqJs.js → relay-image-stream-DrdVj99c.js} +1 -1
  53. package/dist/assets/renderElectronMiniChatApp-gGFkwoL_.js +2 -0
  54. package/dist/assets/renderMobileApp-B2w50kAc.js +28 -0
  55. package/dist/assets/runtime-fetch-Fs9ZV2V8.js +1 -0
  56. package/dist/assets/{runtimeConfig-BIGBRGQI.js → runtimeConfig-BHH1hJDd.js} +1 -1
  57. package/dist/assets/runtimeEndpointReset-5uJ4sJk0.js +149 -0
  58. package/dist/assets/{sessionChangeSummary-eIbpSfrO.js → sessionChangeSummary-spf_atO8.js} +2 -2
  59. package/dist/assets/{sessionLookup-myHe5ltu.js → sessionLookup-BGjjwiCq.js} +1 -1
  60. package/dist/assets/{sortable-tabs-strip-BQtmHx9r.js → sortable-tabs-strip-CTY_wG46.js} +1 -1
  61. package/dist/assets/src-BjEyU6if.css +2 -0
  62. package/dist/assets/store-DmowK-GO.js +15 -0
  63. package/dist/assets/{terminalApi-BxcdiduX.js → terminalApi-Dhqqp4xi.js} +1 -1
  64. package/dist/assets/textarea-QxsmcBGj.js +1 -0
  65. package/dist/assets/{tooltip-Cx5gTbdY.js → tooltip-CpMLl5_k.js} +1 -1
  66. package/dist/assets/uk-ChchBzy6.js +15 -0
  67. package/dist/assets/{url-CDHnjlsm.js → url-CGbJbiJq.js} +1 -1
  68. package/dist/assets/{useAppFontEffects-CNeo0aZs.js → useAppFontEffects-B1h7ab_J.js} +55 -50
  69. package/dist/assets/{useAssistantUIStore-asNG6K7n.js → useAssistantUIStore-Bz4tRflF.js} +1 -1
  70. package/dist/assets/useDesktopWindowControlsLayout-Cxsx84NO.js +1 -0
  71. package/dist/assets/{useEffectiveDirectory-B4LvR8Gt.js → useEffectiveDirectory-DsqhqsJR.js} +1 -1
  72. package/dist/assets/{useFontPreferences-CUnQ4TVm.js → useFontPreferences-Xw1vSkmC.js} +1 -1
  73. package/dist/assets/useMobileNavigationStore-B1axS4g-.js +414 -0
  74. package/dist/assets/{useRuntimeAPIs-DwLtO0c_.js → useRuntimeAPIs-DSLXJybW.js} +1 -1
  75. package/dist/assets/useSessionAutoCleanup-B5FTG_qf.js +2 -0
  76. package/dist/assets/{useThemeSystem-BlNUWH47.js → useThemeSystem-DMzWVJaW.js} +1 -1
  77. package/dist/assets/useUIStore-syVmbuDA.js +1 -0
  78. package/dist/assets/{useWorkerHighlightedLines-CJZbJDW3.js → useWorkerHighlightedLines-DC_Bc-RV.js} +1 -1
  79. package/dist/assets/{vendor-base-ui-CDjyofeD.js → vendor-base-ui-CnHfUmDN.js} +1 -1
  80. package/dist/assets/{vendor-cmdk-BFH0UpXX.js → vendor-cmdk-CeAGfrLo.js} +1 -1
  81. package/dist/assets/{vendor-dnd-kit-accessibility-BrR3AKvM.js → vendor-dnd-kit-accessibility-BY5LhhUB.js} +1 -1
  82. package/dist/assets/{vendor-dnd-kit-core-CNfdvk6H.js → vendor-dnd-kit-core-CvWxUPdb.js} +1 -1
  83. package/dist/assets/{vendor-dnd-kit-sortable-DQUaTeGj.js → vendor-dnd-kit-sortable-hHdP9lLb.js} +1 -1
  84. package/dist/assets/{vendor-framer-motion-4dogsUk3.js → vendor-framer-motion-DFy_BSVd.js} +1 -1
  85. package/dist/assets/{vendor-legendapp-list-BU7MdPZR.js → vendor-legendapp-list-WE32lwNk.js} +1 -1
  86. package/dist/assets/{vendor-markstream-react-qHC2FykU.js → vendor-markstream-react-DX55XLGO.js} +3 -3
  87. package/dist/assets/vendor-opencode-client-C12gfjag.js +12 -0
  88. package/dist/assets/{vendor-pierre-diffs-CUfqC003.js → vendor-pierre-diffs-DX7XTPG3.js} +1 -1
  89. package/dist/assets/{vendor-react-C94A0AHl.js → vendor-react-DLPElpoQ.js} +1 -1
  90. package/dist/assets/{vendor-react-drawio-FVlWqKVE.js → vendor-react-drawio-ECtEwvbc.js} +1 -1
  91. package/dist/assets/{vendor-reactuses-core-C2A3EjUi.js → vendor-reactuses-core-B8parU1Y.js} +1 -1
  92. package/dist/assets/{vendor-sonner-DNqHmUQs.js → vendor-sonner-DVzioF3d.js} +1 -1
  93. package/dist/assets/{vendor-stream-diffs-CwbKsmlv.js → vendor-stream-diffs-DWy3xSmp.js} +2 -2
  94. package/dist/assets/{vendor-tanstack-react-query-D0iFK57C.js → vendor-tanstack-react-query-D7pys_c9.js} +1 -1
  95. package/dist/assets/{vendor-tanstack-react-virtual-B2kV6cnT.js → vendor-tanstack-react-virtual-tlDgH6PG.js} +1 -1
  96. package/dist/assets/{vendor-zustand-BqLKf6ZY.js → vendor-zustand-B4dlGEM2.js} +1 -1
  97. package/dist/assets/zh-CN-Z_bkUQk5.js +15 -0
  98. package/dist/assets/zh-TW-CZeTm7kd.js +15 -0
  99. package/dist/index.html +14 -14
  100. package/dist/mini-chat.html +14 -14
  101. package/dist/mobile.html +14 -14
  102. package/package.json +3 -2
  103. package/server/index.js +38 -7
  104. package/server/lib/browser-provider/DOCUMENTATION.md +141 -0
  105. package/server/lib/browser-provider/contract.js +312 -0
  106. package/server/lib/browser-provider/host.js +421 -0
  107. package/server/lib/browser-provider/host.test.js +304 -0
  108. package/server/lib/browser-provider/routes.js +122 -0
  109. package/server/lib/browser-provider/routes.test.js +120 -0
  110. package/server/lib/browser-provider/selection-store.js +43 -0
  111. package/server/lib/browser-provider/selection-store.test.js +35 -0
  112. package/server/lib/event-stream/DOCUMENTATION.md +3 -1
  113. package/server/lib/event-stream/reasoning-projection.js +16 -1
  114. package/server/lib/event-stream/reasoning-projection.test.js +15 -0
  115. package/server/lib/notifications/DOCUMENTATION.md +3 -1
  116. package/server/lib/notifications/runtime.js +128 -31
  117. package/server/lib/notifications/runtime.test.js +103 -0
  118. package/server/lib/notifications/template-runtime.js +130 -38
  119. package/server/lib/notifications/template-runtime.test.js +96 -0
  120. package/server/lib/opencode/DOCUMENTATION.md +8 -0
  121. package/server/lib/opencode/config-entity-routes.js +6 -1
  122. package/server/lib/opencode/config-entity-routes.test.js +25 -0
  123. package/server/lib/opencode/ensure-cli.d.ts +8 -0
  124. package/server/lib/opencode/feature-routes-runtime.js +10 -0
  125. package/server/lib/opencode/feature-routes-runtime.test.js +7 -0
  126. package/server/lib/opencode/proxy.js +6 -1
  127. package/server/lib/opencode/proxy.test.js +18 -3
  128. package/server/lib/opencode/routes.js +30 -0
  129. package/server/lib/opencode/upgrade-screen.d.ts +30 -0
  130. package/server/lib/opencode/upgrade-screen.js +299 -0
  131. package/server/lib/opencode/upgrade-screen.test.js +196 -0
  132. package/server/lib/session-metadata/DOCUMENTATION.md +27 -17
  133. package/server/lib/session-metadata/opencode-session-record.d.ts +57 -0
  134. package/server/lib/session-metadata/opencode-session-record.js +316 -0
  135. package/server/lib/session-metadata/opencode-session-record.test.js +242 -0
  136. package/server/lib/session-metadata/routes.js +5 -1
  137. package/server/lib/session-metadata/session-archive.js +1 -1
  138. package/server/lib/session-metadata/session-metadata-store.d.ts +2 -0
  139. package/server/lib/session-metadata/session-metadata-store.js +63 -16
  140. package/server/lib/session-metadata/session-projection.js +26 -2
  141. package/dist/assets/AssistantView-ClQAfGOT.js +0 -3
  142. package/dist/assets/Icon-BiEQEcih.js +0 -1
  143. package/dist/assets/MobileSurface-D2jUkX9l.js +0 -2
  144. package/dist/assets/SettingsView-BRxELjow.js +0 -25
  145. package/dist/assets/TerminalView-BU3x8-fr.js +0 -8
  146. package/dist/assets/collapsible-DXbDynN4.js +0 -3
  147. package/dist/assets/context-menu-CqolsLCm.js +0 -1
  148. package/dist/assets/es-CN3E_zXj.js +0 -15
  149. package/dist/assets/fr-9zZvQZD2.js +0 -13
  150. package/dist/assets/insertionBoundaries-CtkZ9720.js +0 -1
  151. package/dist/assets/ja-Dnjk_82N.js +0 -15
  152. package/dist/assets/ko-BxCEE99C.js +0 -15
  153. package/dist/assets/main-BILgBI3B.js +0 -169
  154. package/dist/assets/main-BeveiW6F.js +0 -2
  155. package/dist/assets/main-qSeeJRW1.css +0 -1
  156. package/dist/assets/markdownTheme-CKac3wKC.js +0 -1
  157. package/dist/assets/miniChat-BgrzM3u7.js +0 -2
  158. package/dist/assets/mobile-DtYoQE8C.js +0 -2
  159. package/dist/assets/multirun-jy8dEI96.js +0 -4
  160. package/dist/assets/persistence-C9LQpiOS.js +0 -3
  161. package/dist/assets/pl-CNNsWnPM.js +0 -15
  162. package/dist/assets/platform-BQghHRfp.js +0 -6
  163. package/dist/assets/pt-BR-BZB2DJMp.js +0 -15
  164. package/dist/assets/renderElectronMiniChatApp-BGrrmeME.js +0 -2
  165. package/dist/assets/renderMobileApp-u3c4GtFC.js +0 -28
  166. package/dist/assets/runtime-fetch-zIalUnbb.js +0 -1
  167. package/dist/assets/runtimeEndpointReset-D2savkuw.js +0 -147
  168. package/dist/assets/src-CLN7Z-zx.css +0 -2
  169. package/dist/assets/store-DLCiZaA6.js +0 -15
  170. package/dist/assets/textarea-CakKvqFw.js +0 -1
  171. package/dist/assets/uk-rwQrxeYM.js +0 -15
  172. package/dist/assets/useDesktopWindowControlsLayout-DBJ56qIo.js +0 -1
  173. package/dist/assets/useMobileNavigationStore-ZHJPxlHt.js +0 -414
  174. package/dist/assets/useSessionAutoCleanup-BIVmrnYU.js +0 -2
  175. package/dist/assets/useUIStore-CQYKJnrg.js +0 -1
  176. package/dist/assets/vendor-opencode-client-BOe2qpQb.js +0 -12
  177. package/dist/assets/zh-CN-BvmBDnkD.js +0 -15
  178. package/dist/assets/zh-TW-9wcHTX0y.js +0 -15
package/dist/index.html CHANGED
@@ -552,28 +552,28 @@
552
552
  opacity: 0.72;
553
553
  }
554
554
  </style>
555
- <script type="module" crossorigin src="/assets/main-BeveiW6F.js"></script>
555
+ <script type="module" crossorigin src="/assets/main-DSPCkT74.js"></script>
556
556
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
557
557
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
558
558
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
559
- <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-zIalUnbb.js">
560
- <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CDjyofeD.js">
561
- <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-BqLKf6ZY.js">
562
- <link rel="modulepreload" crossorigin href="/assets/useUIStore-CQYKJnrg.js">
563
- <link rel="modulepreload" crossorigin href="/assets/vendor-react-C94A0AHl.js">
559
+ <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-Fs9ZV2V8.js">
560
+ <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
561
+ <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
562
+ <link rel="modulepreload" crossorigin href="/assets/useUIStore-syVmbuDA.js">
563
+ <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
564
564
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
565
565
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
566
- <link rel="modulepreload" crossorigin href="/assets/persistence-C9LQpiOS.js">
567
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-CoDkOnyS.js">
568
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-DDlVKyOE.js">
569
- <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-BOe2qpQb.js">
566
+ <link rel="modulepreload" crossorigin href="/assets/persistence-D0y7226-.js">
567
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-JGFqhlaM.js">
568
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-CHEwrI93.js">
569
+ <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-C12gfjag.js">
570
570
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
571
- <link rel="modulepreload" crossorigin href="/assets/platform-BQghHRfp.js">
572
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-BxcdiduX.js">
571
+ <link rel="modulepreload" crossorigin href="/assets/platform-D_c-T5nO.js">
572
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-Dhqqp4xi.js">
573
573
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
574
574
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
575
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BIGBRGQI.js">
576
- <link rel="stylesheet" crossorigin href="/assets/src-CLN7Z-zx.css">
575
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BHH1hJDd.js">
576
+ <link rel="stylesheet" crossorigin href="/assets/src-BjEyU6if.css">
577
577
  </head>
578
578
  <body class="h-full bg-background text-foreground">
579
579
  <!-- Keep the startup layer outside #root. React replaces every child of
@@ -74,28 +74,28 @@
74
74
  }
75
75
  </style>
76
76
 
77
- <script type="module" crossorigin src="/assets/miniChat-BgrzM3u7.js"></script>
77
+ <script type="module" crossorigin src="/assets/miniChat-Ckk9ABql.js"></script>
78
78
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
81
- <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-zIalUnbb.js">
82
- <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CDjyofeD.js">
83
- <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-BqLKf6ZY.js">
84
- <link rel="modulepreload" crossorigin href="/assets/useUIStore-CQYKJnrg.js">
85
- <link rel="modulepreload" crossorigin href="/assets/vendor-react-C94A0AHl.js">
81
+ <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-Fs9ZV2V8.js">
82
+ <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
83
+ <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
84
+ <link rel="modulepreload" crossorigin href="/assets/useUIStore-syVmbuDA.js">
85
+ <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
86
86
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
87
87
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
88
- <link rel="modulepreload" crossorigin href="/assets/persistence-C9LQpiOS.js">
89
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-CoDkOnyS.js">
90
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-DDlVKyOE.js">
91
- <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-BOe2qpQb.js">
88
+ <link rel="modulepreload" crossorigin href="/assets/persistence-D0y7226-.js">
89
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-JGFqhlaM.js">
90
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-CHEwrI93.js">
91
+ <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-C12gfjag.js">
92
92
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
93
- <link rel="modulepreload" crossorigin href="/assets/platform-BQghHRfp.js">
94
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-BxcdiduX.js">
93
+ <link rel="modulepreload" crossorigin href="/assets/platform-D_c-T5nO.js">
94
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-Dhqqp4xi.js">
95
95
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
96
96
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
97
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BIGBRGQI.js">
98
- <link rel="stylesheet" crossorigin href="/assets/src-CLN7Z-zx.css">
97
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BHH1hJDd.js">
98
+ <link rel="stylesheet" crossorigin href="/assets/src-BjEyU6if.css">
99
99
  </head>
100
100
  <body class="h-full bg-background text-foreground">
101
101
  <div id="root" class="h-full">
package/dist/mobile.html CHANGED
@@ -63,28 +63,28 @@
63
63
  })();
64
64
  </script>
65
65
 
66
- <script type="module" crossorigin src="/assets/mobile-DtYoQE8C.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-cLMRZqI9.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/runtime-auth-D66yq6ie.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/runtime-switch-LvWDU-SL.js">
70
- <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-zIalUnbb.js">
71
- <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CDjyofeD.js">
72
- <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-BqLKf6ZY.js">
73
- <link rel="modulepreload" crossorigin href="/assets/useUIStore-CQYKJnrg.js">
74
- <link rel="modulepreload" crossorigin href="/assets/vendor-react-C94A0AHl.js">
70
+ <link rel="modulepreload" crossorigin href="/assets/runtime-fetch-Fs9ZV2V8.js">
71
+ <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
72
+ <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
73
+ <link rel="modulepreload" crossorigin href="/assets/useUIStore-syVmbuDA.js">
74
+ <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
75
75
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
76
76
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
77
- <link rel="modulepreload" crossorigin href="/assets/persistence-C9LQpiOS.js">
78
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-CoDkOnyS.js">
79
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-DDlVKyOE.js">
80
- <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-BOe2qpQb.js">
77
+ <link rel="modulepreload" crossorigin href="/assets/persistence-D0y7226-.js">
78
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-JGFqhlaM.js">
79
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-CHEwrI93.js">
80
+ <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-client-C12gfjag.js">
81
81
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
82
- <link rel="modulepreload" crossorigin href="/assets/platform-BQghHRfp.js">
83
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-BxcdiduX.js">
82
+ <link rel="modulepreload" crossorigin href="/assets/platform-D_c-T5nO.js">
83
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-Dhqqp4xi.js">
84
84
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
85
85
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
86
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BIGBRGQI.js">
87
- <link rel="stylesheet" crossorigin href="/assets/src-CLN7Z-zx.css">
86
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BHH1hJDd.js">
87
+ <link rel="stylesheet" crossorigin href="/assets/src-BjEyU6if.css">
88
88
  </head>
89
89
  <body class="h-full bg-background text-foreground">
90
90
  <div id="root" class="h-full"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openchambery/web",
3
- "version": "2.0.0-beta.3",
3
+ "version": "2.0.0-beta.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
@@ -27,7 +27,8 @@
27
27
  "@clack/prompts": "^1.1.0",
28
28
  "@earendil-works/pi-agent-core": "0.84.4",
29
29
  "@octokit/rest": "^22.0.1",
30
- "@opencode/client": "2.0.12",
30
+ "@opencode/client": "2.0.15",
31
+ "@opencode/schema": "2.0.15",
31
32
  "@simplewebauthn/server": "13.3.1",
32
33
  "adm-zip": "^0.5.16",
33
34
  "better-sqlite3": "^12.10.0",
package/server/index.js CHANGED
@@ -56,6 +56,7 @@ import { createServerUtilsRuntime } from './lib/opencode/server-utils-runtime.js
56
56
  import {
57
57
  configureServerOpenCodeFetchGate,
58
58
  createServerOpenCodeFetch,
59
+ wrapFetchWithRuntimeContractGate,
59
60
  } from './lib/opencode/server-opencode-fetch.js';
60
61
  import { createStaticRoutesRuntime } from './lib/opencode/static-routes-runtime.js';
61
62
  import { createSettingsRuntime } from './lib/opencode/settings-runtime.js';
@@ -79,13 +80,17 @@ import {
79
80
  withGoalExecutionGeneration,
80
81
  } from './lib/session-goal/runtime.js';
81
82
  import { createSessionMetadataStore } from './lib/session-metadata/session-metadata-store.js';
83
+ import {
84
+ createHttpSessionRecordClient,
85
+ retainOpenCodeSessions,
86
+ startSideStoreMigration,
87
+ } from './lib/session-metadata/opencode-session-record.js';
82
88
  import {
83
89
  createSessionArchiveService,
84
90
  createUpstreamSessionFetcher,
85
91
  } from './lib/session-metadata/session-archive.js';
86
92
  import {
87
93
  projectSessionLifecyclePayload,
88
- projectSessionWithHostMetadata,
89
94
  projectSessionWithStoredMap,
90
95
  } from './lib/session-metadata/session-projection.js';
91
96
  import { createScheduledTasksRuntime } from './lib/scheduled-tasks/runtime.js';
@@ -766,7 +771,32 @@ let questionAutoDelegateRuntime = null;
766
771
  /** Filled inside main() once the SQLite session index is constructed. */
767
772
  let sessionIndexServiceRef = null;
768
773
 
769
- const sessionMetadataStore = createSessionMetadataStore({ dataDir: OPENCHAMBER_DATA_DIR });
774
+ const sessionRecordClient = createHttpSessionRecordClient({
775
+ buildSessionUrl: (sessionID, directory) => {
776
+ const url = new URL(buildOpenCodeUrl(`/session/${encodeURIComponent(sessionID)}`));
777
+ if (directory) url.searchParams.set('directory', directory);
778
+ return url.toString();
779
+ },
780
+ getHeaders: () => getOpenCodeAuthHeaders(),
781
+ fetchFn: wrapFetchWithRuntimeContractGate(fetch),
782
+ });
783
+ const sessionMetadataStore = createSessionMetadataStore({
784
+ dataDir: OPENCHAMBER_DATA_DIR,
785
+ recordReader: (sessionID, directory) => sessionRecordClient.read(sessionID, directory),
786
+ recordWriter: (sessionID, metadata, directory) => sessionRecordClient.write({
787
+ sessionID,
788
+ metadata,
789
+ directory,
790
+ }),
791
+ });
792
+ const stopSessionRecordMigration = startSideStoreMigration({
793
+ load: () => sessionMetadataStore.load(),
794
+ readSession: (sessionID) => sessionRecordClient.read(sessionID),
795
+ writeMetadata: async (sessionID, metadata, record) => {
796
+ const directory = record?.location?.directory || record?.directory || undefined;
797
+ await sessionRecordClient.write({ sessionID, metadata, directory });
798
+ },
799
+ });
770
800
  /**
771
801
  * load() resolves `{ ok:false }` on read/corrupt failure (does not reject).
772
802
  * Callers must check ok / isLoaded — never treat unresolved as empty success.
@@ -1621,10 +1651,11 @@ async function main(options = {}) {
1621
1651
  projectSessions: (sessions) => {
1622
1652
  const snap = sessionMetadataStore.getSnapshotSync();
1623
1653
  // Not ready / unavailable — throw so sync keeps prior directory rows.
1654
+ // A missing side-store row must not drop a session OpenCode still has.
1624
1655
  if (!snap) {
1625
1656
  throw new Error('session metadata is unavailable: Host store not ready');
1626
1657
  }
1627
- return sessions.map((session) => projectSessionWithStoredMap(session, snap));
1658
+ return retainOpenCodeSessions(sessions, snap);
1628
1659
  },
1629
1660
  onRevisionTip: (tip) => {
1630
1661
  broadcastOpenChamberEvent({
@@ -1664,10 +1695,9 @@ async function main(options = {}) {
1664
1695
  isHostReady: () => sessionMetadataStore.isLoaded(),
1665
1696
  projectSession: (session) => {
1666
1697
  if (!sessionMetadataStore.isLoaded()) return null;
1667
- return projectSessionWithHostMetadata(
1668
- session,
1669
- readHostMetadataForSession(session?.id),
1670
- );
1698
+ const snap = sessionMetadataStore.getSnapshotSync();
1699
+ if (!snap) return null;
1700
+ return projectSessionWithStoredMap(session, snap);
1671
1701
  },
1672
1702
  onSessionDeleted: (sessionID) => sessionArchiveServiceRef?.forgetSession(sessionID),
1673
1703
  })) {
@@ -2165,6 +2195,7 @@ async function main(options = {}) {
2165
2195
  sessionIndexSyncRuntime?.stop();
2166
2196
  sessionIndexService?.close();
2167
2197
  sessionArchiveServiceRef?.stop?.();
2198
+ stopSessionRecordMigration();
2168
2199
  } catch {
2169
2200
  // The index is a local cache; a failed close must not block shutdown.
2170
2201
  }
@@ -0,0 +1,141 @@
1
+ # Browser Provider Host
2
+
3
+ ## Purpose
4
+
5
+ An installed extension can declare that it provides `browser`. Agent `browser.*`
6
+ actions then go to that extension, and the host adopts the extension's result.
7
+ This fork has no `packages/sdk` and no guest process platform, so this module is
8
+ the minimal host: recognize the declaration, list reachable providers, send one
9
+ action to the selected provider, and refuse when none is selected.
10
+
11
+ It does not render a settings dropdown, a live rail, or takeover / handoff.
12
+ Those belong to a later surface that calls this contract.
13
+
14
+ ## What this fork does not do
15
+
16
+ - It does not spawn extension processes, approve capabilities, or proxy a guest panel.
17
+ - It does not drive the in-app browser pane. No provider means the action is
18
+ refused. The pane's existing behavior is unchanged because this module never
19
+ calls it.
20
+ - It does not persist the installed-extension catalog. Registration is
21
+ in-process. The selected id is persisted; the extension must be registered
22
+ again after a restart before that id is listed or used.
23
+ - It does not write `browser.capture` images to disk. The extension's `data` is
24
+ returned as-is.
25
+
26
+ ## Declaration
27
+
28
+ An extension declares the role with the first array among:
29
+
30
+ 1. `service.provides`
31
+ 2. `provides`
32
+ 3. `contributes.service.provides`
33
+
34
+ `"browser"` in that array is the declaration. A service array that does not
35
+ include `browser` is not a browser provider, even if another field says it is.
36
+ The host recognizes that declaration with `extensionDeclaresBrowser`.
37
+
38
+ Registration is in-process, not an open HTTP install route (an endpoint field
39
+ would otherwise be a client-controlled fetch):
40
+
41
+ ```js
42
+ getBrowserProviderHost().install({
43
+ id: 'server-chrome',
44
+ name: 'Server Chrome',
45
+ service: { provides: ['browser'] },
46
+ answer: async (request) => ({ ok: true, data: { url, title } }),
47
+ // or endpoint: 'http://127.0.0.1:9' → POST /browser-control
48
+ });
49
+ ```
50
+
51
+ `answer` wins when both are set. `endpoint` must be loopback `http:` or
52
+ `https:` with no userinfo. A bare origin is posted to `/browser-control`.
53
+ A disabled extension, a missing id, or a declaration with no way to answer is
54
+ rejected and not listed.
55
+
56
+ ## Agent action
57
+
58
+ `host.dispatchAgentBrowserAction({ action, parameters, context, providerId, signal })`
59
+ is the agent entry. `providerId` overrides the stored selection for that call
60
+ only. Otherwise the stored selection is used. The model does not supply
61
+ `context`; callers pass `{ directory, sessionId }`, each `null` when unknown.
62
+
63
+ The extension receives:
64
+
65
+ ```json
66
+ {
67
+ "requestId": "…",
68
+ "action": "browser.click",
69
+ "parameters": { "selector": "#save" },
70
+ "context": { "directory": "/repo", "sessionId": "ses_1" }
71
+ }
72
+ ```
73
+
74
+ It answers `{ "ok": true, "data": { } }` or `{ "ok": false, "error": "…" }`.
75
+ `data` is what the agent gets. `ok: false` is the agent-visible error, not an
76
+ empty success. A missing, non-JSON, or non-200 answer is unknown page state.
77
+ A call that was sent and then lost may have run; a call that never left the
78
+ host did not.
79
+
80
+ Actions: `browser.open`, `browser.snapshot`, `browser.click`, `browser.type`,
81
+ `browser.scroll`, `browser.back`, `browser.forward`, `browser.inspect`,
82
+ `browser.capture`, `browser.resize`. Parameters are validated before send.
83
+ `browser.open` waits 45s; other actions wait 20s.
84
+
85
+ ## HTTP contract
86
+
87
+ Registered on the web server before the generic OpenCode proxy. The global
88
+ `/api` auth gate already covers these routes; this module does not add a second
89
+ one. Web, Electron
90
+ (in-process server), hosted mobile, and Capacitor mobile use these routes.
91
+ VS Code returns **501** `{ ok: false, code: "UNSUPPORTED", error }` for the
92
+ same paths and does not proxy them. That is not an empty catalog.
93
+
94
+ Settings and the rail call the first two routes. Provider ids match
95
+ `^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$`. `surface` is always `false` here: this
96
+ host does not push a live picture, and reporting `true` would open a socket
97
+ that does not exist.
98
+
99
+ | Call | Success | Refusal |
100
+ |---|---|---|
101
+ | `GET /api/browser-providers` | `200 { providers: [{ id, name, surface: false }], selectedId }` | `503 { error, code: "CATALOG_UNAVAILABLE" }` — never `providers: []` |
102
+ | `PUT /api/browser-providers/selection` body `{ id }` | `200 { selectedId }` naming that same id | `404 PROVIDER_NOT_FOUND`, `400 INVALID_SELECTION`, or `503 SELECTION_UNAVAILABLE`; selection unchanged |
103
+ | `POST /api/browser-providers/actions` body `{ action, parameters?, context?, providerId? }` | `200 { ok: true, providerId, data }` | `ok: false` plus `code` — never `{ ok: true, data: {} }` |
104
+
105
+ `selectedId` is `null` unless it names a provider in `providers`. A saved id
106
+ for an extension that is not installed right now is kept on disk but not
107
+ reported as connected. The selection file is
108
+ `browser-provider-selection.json` under the OpenChamber data dir and stores
109
+ only `{ selectedId }`. A missing file is no selection. A read or write failure
110
+ is not an empty catalog and does not change the previous choice.
111
+
112
+ No endpoint, handler, or credential is returned.
113
+
114
+ Action codes:
115
+
116
+ | code | status | meaning |
117
+ |---|---|---|
118
+ | `NO_PROVIDER` | 409 | nothing selected; nothing ran |
119
+ | `PROVIDER_NOT_FOUND` | 404 | id is not a reachable provider; nothing ran |
120
+ | `CATALOG_UNAVAILABLE` | 503 | catalog read failed; nothing ran |
121
+ | `INVALID_ACTION` | 400 | action or parameters rejected; nothing sent |
122
+ | `PROVIDER_REJECTED` | 400 | extension `ok: false`; `error` is the extension text |
123
+ | `UNKNOWN_RESULT` | 502 | answer was not a browser result; page state unknown |
124
+ | `REQUEST_FAILED` | 504 | sent, no usable answer; may have run |
125
+ | `PROVIDER_UNAVAILABLE` | 503 | never sent |
126
+ | `CANCELLED` | 499 | cancelled before send |
127
+ | `UNSUPPORTED` | 501 | VS Code only |
128
+
129
+ An empty `providers` array with status 200 means the catalog was read and no
130
+ reachable browser provider is installed. That is not a connected browser.
131
+
132
+ ## Invariants
133
+
134
+ - No selected provider does not fall through to the in-app pane and does not
135
+ return success.
136
+ - A catalog read failure is not "no providers" and does not run the action.
137
+ - The extension is re-read from the catalog on every action. A stale selection
138
+ that is no longer listed fails; it is not silently retargeted.
139
+ - Choosing an unknown id does not clear a previous valid selection.
140
+ - Failure after the request was handed to the extension is not described as
141
+ "nothing changed".