@openchambery/web 1.19.22-beta.1 → 2.0.0-beta.3

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 (311) hide show
  1. package/README.md +13 -7
  2. package/bin/cli-opencode.test.js +208 -0
  3. package/bin/cli.js +62 -9
  4. package/bin/lib/cli-startup.js +105 -2
  5. package/bin/lib/cli-startup.test.js +179 -0
  6. package/dist/assets/{AgentAvatar-CRaBJXKs.js → AgentAvatar-B_JQoreg.js} +1 -1
  7. package/dist/assets/AssistantView-ClQAfGOT.js +3 -0
  8. package/dist/assets/{DiagramView-D1LGK_s2.js → DiagramView-BNnda8qO.js} +1 -1
  9. package/dist/assets/{FadeInOnReveal-B0kJo9Ii.js → FadeInOnReveal-VYQTSAkr.js} +1 -1
  10. package/dist/assets/{Icon-BgdfPhNs.js → Icon-BiEQEcih.js} +1 -1
  11. package/dist/assets/MarkdownRenderer-CJHSsWin.js +2 -0
  12. package/dist/assets/{MarkdownRendererImpl-DfoCJ1Mq.js → MarkdownRendererImpl-DwrHFGUp.js} +3 -3
  13. package/dist/assets/{MarkstreamRendererImpl-D2dsW5Lg.js → MarkstreamRendererImpl-CSnbQMu3.js} +1 -1
  14. package/dist/assets/MobileDetailNavigation-BXr6AGLT.js +1 -0
  15. package/dist/assets/{MobileShareBridge-2Yjn6wXg.js → MobileShareBridge-D7OE9OP_.js} +2 -2
  16. package/dist/assets/MobileSurface-D2jUkX9l.js +2 -0
  17. package/dist/assets/{MultiRunWindow-tTbMFowS.js → MultiRunWindow-DF3iIFCd.js} +1 -1
  18. package/dist/assets/{OnboardingScreen-CD2KtlF3.js → OnboardingScreen-BjHmlwlw.js} +1 -1
  19. package/dist/assets/OverlayScrollbar-DLtWO_Gp.js +2 -0
  20. package/dist/assets/SettingsView-BRxELjow.js +25 -0
  21. package/dist/assets/{SettingsWindow-zIa76s4t.js → SettingsWindow-BI5swspb.js} +1 -1
  22. package/dist/assets/{TerminalView-CDdzF4yi.js → TerminalView-BU3x8-fr.js} +1 -1
  23. package/dist/assets/{ToolOutputDialog-DNqA4uBl.js → ToolOutputDialog-BEWhBcRd.js} +2 -2
  24. package/dist/assets/appThemeRegistry-4MR0F7Jz.js +1 -0
  25. package/dist/assets/{button-CI7Q-Zw_.js → button-DKuz3L8l.js} +1 -1
  26. package/dist/assets/collapsible-DXbDynN4.js +3 -0
  27. package/dist/assets/context-menu-CqolsLCm.js +1 -0
  28. package/dist/assets/{desktopHosts-B1ixEylr.js → desktopHosts-CoDkOnyS.js} +1 -1
  29. package/dist/assets/{desktopRelayRestore-4JmFUw8r.js → desktopRelayRestore-DDlVKyOE.js} +1 -1
  30. package/dist/assets/{diagram-DdLO8HZ9.js → diagram-D7T8HQgj.js} +1 -1
  31. package/dist/assets/{dialog-B6pnIYmp.js → dialog-DQYl3W_o.js} +1 -1
  32. package/dist/assets/es-CN3E_zXj.js +15 -0
  33. package/dist/assets/{fileMentionTouchSelection-DNeiqns-.js → fileMentionTouchSelection-BZ6ovBYH.js} +1 -1
  34. package/dist/assets/{fileQueries-DQc8EJUf.js → fileQueries-JrpcsOCs.js} +1 -1
  35. package/dist/assets/fr-9zZvQZD2.js +13 -0
  36. package/dist/assets/gitApi-CM42qUed.js +10 -0
  37. package/dist/assets/{imageSource-BlAJJUEI.js → imageSource-CIl0FL10.js} +1 -1
  38. package/dist/assets/{input-D-__fwRi.js → input-CzQy8UhV.js} +1 -1
  39. package/dist/assets/insertionBoundaries-CtkZ9720.js +1 -0
  40. package/dist/assets/ja-Dnjk_82N.js +15 -0
  41. package/dist/assets/ko-BxCEE99C.js +15 -0
  42. package/dist/assets/main-BILgBI3B.js +169 -0
  43. package/dist/assets/main-BeveiW6F.js +2 -0
  44. package/dist/assets/markdown-worker-bS5OgGO3.js +2 -0
  45. package/dist/assets/{markdownHeightCache-BhxqJOvf.js → markdownHeightCache-Cj1I5NDw.js} +1 -1
  46. package/dist/assets/{markdownTheme-DOfGg-A7.js → markdownTheme-CKac3wKC.js} +1 -1
  47. package/dist/assets/mcpQueries-D5mQymgM.js +1 -0
  48. package/dist/assets/miniChat-BgrzM3u7.js +2 -0
  49. package/dist/assets/mobile-DtYoQE8C.js +2 -0
  50. package/dist/assets/multirun-jy8dEI96.js +4 -0
  51. package/dist/assets/{persistence-Ce3AnpEr.js → persistence-C9LQpiOS.js} +2 -2
  52. package/dist/assets/pl-CNNsWnPM.js +15 -0
  53. package/dist/assets/platform-BQghHRfp.js +6 -0
  54. package/dist/assets/pt-BR-BZB2DJMp.js +15 -0
  55. package/dist/assets/renderElectronMiniChatApp-BGrrmeME.js +2 -0
  56. package/dist/assets/renderMobileApp-u3c4GtFC.js +28 -0
  57. package/dist/assets/{runtimeConfig-CMkwoQ_X.js → runtimeConfig-BIGBRGQI.js} +1 -1
  58. package/dist/assets/{runtimeEndpointReset-ChOxt-J7.js → runtimeEndpointReset-D2savkuw.js} +12 -12
  59. package/dist/assets/{sessionChangeSummary-NnxcqCTI.js → sessionChangeSummary-eIbpSfrO.js} +1 -1
  60. package/dist/assets/{sessionLookup-BrU3rFHJ.js → sessionLookup-myHe5ltu.js} +1 -1
  61. package/dist/assets/{sortable-tabs-strip-Fnfhf3K9.js → sortable-tabs-strip-BQtmHx9r.js} +1 -1
  62. package/dist/assets/src-CLN7Z-zx.css +2 -0
  63. package/dist/assets/store-DLCiZaA6.js +15 -0
  64. package/dist/assets/{terminalApi-xjqssKke.js → terminalApi-BxcdiduX.js} +1 -1
  65. package/dist/assets/{textarea-bHYxZtfH.js → textarea-CakKvqFw.js} +1 -1
  66. package/dist/assets/{tooltip-0T5jv0cu.js → tooltip-Cx5gTbdY.js} +1 -1
  67. package/dist/assets/uk-rwQrxeYM.js +15 -0
  68. package/dist/assets/{url-_z7evzdK.js → url-CDHnjlsm.js} +1 -1
  69. package/dist/assets/{useAppFontEffects-C02YFyAv.js → useAppFontEffects-CNeo0aZs.js} +59 -45
  70. package/dist/assets/{useAssistantUIStore-CMutVh9B.js → useAssistantUIStore-asNG6K7n.js} +1 -1
  71. package/dist/assets/useDesktopWindowControlsLayout-DBJ56qIo.js +1 -0
  72. package/dist/assets/useEffectiveDirectory-B4LvR8Gt.js +1 -0
  73. package/dist/assets/{useFontPreferences-B1JYyzpK.js → useFontPreferences-CUnQ4TVm.js} +1 -1
  74. package/dist/assets/useMobileNavigationStore-ZHJPxlHt.js +414 -0
  75. package/dist/assets/{useRuntimeAPIs-DSLXJybW.js → useRuntimeAPIs-DwLtO0c_.js} +1 -1
  76. package/dist/assets/useSessionAutoCleanup-BIVmrnYU.js +2 -0
  77. package/dist/assets/{useThemeSystem-DMzWVJaW.js → useThemeSystem-BlNUWH47.js} +1 -1
  78. package/dist/assets/useUIStore-CQYKJnrg.js +1 -0
  79. package/dist/assets/{useWorkerHighlightedLines-C9z0ML1z.js → useWorkerHighlightedLines-CJZbJDW3.js} +2 -2
  80. package/dist/assets/{vendor-base-ui-CnHfUmDN.js → vendor-base-ui-CDjyofeD.js} +1 -1
  81. package/dist/assets/{vendor-cmdk-CeAGfrLo.js → vendor-cmdk-BFH0UpXX.js} +1 -1
  82. package/dist/assets/{vendor-dnd-kit-accessibility-BY5LhhUB.js → vendor-dnd-kit-accessibility-BrR3AKvM.js} +1 -1
  83. package/dist/assets/{vendor-dnd-kit-core-CvWxUPdb.js → vendor-dnd-kit-core-CNfdvk6H.js} +1 -1
  84. package/dist/assets/{vendor-dnd-kit-sortable-hHdP9lLb.js → vendor-dnd-kit-sortable-DQUaTeGj.js} +1 -1
  85. package/dist/assets/{vendor-framer-motion-DFy_BSVd.js → vendor-framer-motion-4dogsUk3.js} +1 -1
  86. package/dist/assets/{vendor-legendapp-list-WE32lwNk.js → vendor-legendapp-list-BU7MdPZR.js} +1 -1
  87. package/dist/assets/{vendor-markstream-react-DX55XLGO.js → vendor-markstream-react-qHC2FykU.js} +3 -3
  88. package/dist/assets/vendor-opencode-client-BOe2qpQb.js +12 -0
  89. package/dist/assets/{vendor-pierre-diffs-DX7XTPG3.js → vendor-pierre-diffs-CUfqC003.js} +1 -1
  90. package/dist/assets/{vendor-react-DLPElpoQ.js → vendor-react-C94A0AHl.js} +1 -1
  91. package/dist/assets/{vendor-react-drawio-ECtEwvbc.js → vendor-react-drawio-FVlWqKVE.js} +1 -1
  92. package/dist/assets/{vendor-reactuses-core-BnW6GxJt.js → vendor-reactuses-core-C2A3EjUi.js} +1 -1
  93. package/dist/assets/{vendor-sonner-DVzioF3d.js → vendor-sonner-DNqHmUQs.js} +1 -1
  94. package/dist/assets/{vendor-stream-diffs-DWy3xSmp.js → vendor-stream-diffs-CwbKsmlv.js} +2 -2
  95. package/dist/assets/{vendor-tanstack-react-query-D7pys_c9.js → vendor-tanstack-react-query-D0iFK57C.js} +1 -1
  96. package/dist/assets/{vendor-tanstack-react-virtual-tlDgH6PG.js → vendor-tanstack-react-virtual-B2kV6cnT.js} +1 -1
  97. package/dist/assets/{vendor-yaml-DIcAK3EC.js → vendor-yaml-C9KlJAlj.js} +37 -37
  98. package/dist/assets/{vendor-zustand-B4dlGEM2.js → vendor-zustand-BqLKf6ZY.js} +1 -1
  99. package/dist/assets/zh-CN-BvmBDnkD.js +15 -0
  100. package/dist/assets/zh-TW-9wcHTX0y.js +15 -0
  101. package/dist/index.html +13 -13
  102. package/dist/mini-chat.html +13 -13
  103. package/dist/mobile.html +13 -13
  104. package/package.json +2 -2
  105. package/server/index.js +392 -20
  106. package/server/lib/assistants/DOCUMENTATION.md +26 -21
  107. package/server/lib/assistants/assign.js +2 -1
  108. package/server/lib/assistants/contact-store.js +37 -19
  109. package/server/lib/assistants/contracts.js +11 -1
  110. package/server/lib/assistants/projection-history.test.js +454 -0
  111. package/server/lib/assistants/routes.js +11 -5
  112. package/server/lib/assistants/service.js +850 -294
  113. package/server/lib/assistants/service.test.js +588 -274
  114. package/server/lib/conversations/DOCUMENTATION.md +5 -5
  115. package/server/lib/conversations/service.js +87 -57
  116. package/server/lib/conversations/service.test.js +132 -100
  117. package/server/lib/conversations/validation.js +11 -1
  118. package/server/lib/event-stream/directory-ws-bridge.js +13 -2
  119. package/server/lib/event-stream/global-hub.js +51 -5
  120. package/server/lib/event-stream/runtime.js +57 -20
  121. package/server/lib/event-stream/runtime.test.js +112 -0
  122. package/server/lib/llm/DOCUMENTATION.md +95 -84
  123. package/server/lib/llm/catalog.js +111 -45
  124. package/server/lib/llm/catalog.test.js +121 -59
  125. package/server/lib/llm/completions.js +41 -12
  126. package/server/lib/llm/completions.test.js +45 -4
  127. package/server/lib/llm/generate.js +516 -453
  128. package/server/lib/llm/generate.test.js +705 -484
  129. package/server/lib/llm/routes.js +8 -4
  130. package/server/lib/message-queue/DOCUMENTATION.md +5 -5
  131. package/server/lib/message-queue/opencode-adapter.js +191 -104
  132. package/server/lib/message-queue/opencode-adapter.test.js +328 -58
  133. package/server/lib/message-queue/runtime.js +15 -2
  134. package/server/lib/message-queue/runtime.test.js +6 -6
  135. package/server/lib/message-queue/worker.js +7 -1
  136. package/server/lib/notifications/runtime.js +5 -0
  137. package/server/lib/opencode/DOCUMENTATION.md +103 -16
  138. package/server/lib/opencode/agent-document.d.ts +28 -0
  139. package/server/lib/opencode/agent-document.js +280 -0
  140. package/server/lib/opencode/agent-document.test.js +137 -0
  141. package/server/lib/opencode/agents.js +96 -0
  142. package/server/lib/opencode/auth-state-runtime.js +5 -0
  143. package/server/lib/opencode/bootstrap-runtime.js +2 -0
  144. package/server/lib/opencode/config-entity-routes.js +111 -102
  145. package/server/lib/opencode/config-entity-routes.test.js +123 -10
  146. package/server/lib/opencode/config-hot-reload.integration.test.js +105 -0
  147. package/server/lib/opencode/ensure-cli.js +238 -0
  148. package/server/lib/opencode/ensure-cli.test.js +119 -0
  149. package/server/lib/opencode/env-runtime.js +208 -111
  150. package/server/lib/opencode/env-runtime.test.js +211 -14
  151. package/server/lib/opencode/feature-routes-runtime.js +80 -5
  152. package/server/lib/opencode/feature-routes-runtime.test.js +18 -0
  153. package/server/lib/opencode/http-server-connections.js +98 -0
  154. package/server/lib/opencode/http-server-connections.test.js +321 -0
  155. package/server/lib/opencode/lifecycle.js +539 -95
  156. package/server/lib/opencode/lifecycle.test.js +698 -6
  157. package/server/lib/opencode/managed-capabilities-runtime.js +15 -2
  158. package/server/lib/opencode/managed-capabilities-runtime.test.js +1 -0
  159. package/server/lib/opencode/network-runtime.js +28 -16
  160. package/server/lib/opencode/network-runtime.test.js +68 -4
  161. package/server/lib/opencode/openchamber-routes.js +7 -1
  162. package/server/lib/opencode/opencode2-pin.js +139 -0
  163. package/server/lib/opencode/opencode2-pin.test.js +88 -0
  164. package/server/lib/opencode/opencode2-sidecar.e2e.test.js +326 -0
  165. package/server/lib/opencode/owned-runtime-upgrade.js +431 -0
  166. package/server/lib/opencode/owned-runtime-upgrade.test.js +160 -0
  167. package/server/lib/opencode/plugin-compatibility.js +15 -0
  168. package/server/lib/opencode/plugin-compatibility.test.js +21 -0
  169. package/server/lib/opencode/plugin-routes.js +3 -18
  170. package/server/lib/opencode/plugin-routes.test.js +9 -9
  171. package/server/lib/opencode/plugins.js +4 -3
  172. package/server/lib/opencode/plugins.test.js +12 -0
  173. package/server/lib/opencode/provider-catalog.js +58 -12
  174. package/server/lib/opencode/provider-catalog.test.js +48 -0
  175. package/server/lib/opencode/proxy.js +368 -28
  176. package/server/lib/opencode/proxy.test.js +338 -0
  177. package/server/lib/opencode/routes.js +303 -76
  178. package/server/lib/opencode/routes.test.js +315 -50
  179. package/server/lib/opencode/runtime-contract.js +401 -0
  180. package/server/lib/opencode/runtime-contract.test.js +214 -0
  181. package/server/lib/opencode/server-opencode-fetch.js +242 -0
  182. package/server/lib/opencode/server-opencode-fetch.test.js +130 -0
  183. package/server/lib/opencode/server-utils-runtime.js +35 -0
  184. package/server/lib/opencode/shared-service.integration.test.js +66 -0
  185. package/server/lib/opencode/shared-service.js +147 -0
  186. package/server/lib/opencode/shared-service.test.js +93 -0
  187. package/server/lib/opencode/shared.js +3 -3
  188. package/server/lib/opencode/shutdown-runtime.js +15 -6
  189. package/server/lib/opencode/shutdown-runtime.test.js +49 -1
  190. package/server/lib/opencode/skill-routes.js +26 -40
  191. package/server/lib/opencode/skill-routes.test.js +71 -7
  192. package/server/lib/opencode/skills.test.js +15 -0
  193. package/server/lib/opencode/startup-pipeline-runtime.js +4 -0
  194. package/server/lib/opencode/static-routes-runtime.js +3 -1
  195. package/server/lib/opencode/static-routes-runtime.test.js +33 -0
  196. package/server/lib/opencode/v1-migration-gate.js +157 -0
  197. package/server/lib/opencode/v1-migration-gate.test.js +111 -0
  198. package/server/lib/opencode/v2-client.js +60 -0
  199. package/server/lib/opencode/v2-plugin-host-shim/index.mjs +155 -0
  200. package/server/lib/opencode/v2-plugin-host-shim/package.json +4 -0
  201. package/server/lib/opencode/watcher.js +2 -1
  202. package/server/lib/opencode/watcher.test.js +1 -1
  203. package/server/lib/permission-auto-accept/DOCUMENTATION.md +5 -5
  204. package/server/lib/permission-auto-accept/runtime.js +14 -7
  205. package/server/lib/permission-auto-accept/runtime.test.js +27 -12
  206. package/server/lib/relay/reasoning-projection.e2e.test.ts +22 -7
  207. package/server/lib/scheduled-tasks/DOCUMENTATION.md +79 -39
  208. package/server/lib/scheduled-tasks/managed-tool-route.js +31 -1
  209. package/server/lib/scheduled-tasks/managed-tool-route.test.js +23 -0
  210. package/server/lib/scheduled-tasks/routes.js +27 -0
  211. package/server/lib/scheduled-tasks/routes.test.js +94 -0
  212. package/server/lib/scheduled-tasks/runtime.js +381 -310
  213. package/server/lib/scheduled-tasks/runtime.test.js +600 -309
  214. package/server/lib/session-goal/DOCUMENTATION.md +173 -22
  215. package/server/lib/session-goal/capability.js +57 -0
  216. package/server/lib/session-goal/capability.test.js +33 -0
  217. package/server/lib/session-goal/routes.js +240 -2
  218. package/server/lib/session-goal/routes.test.js +211 -0
  219. package/server/lib/session-goal/runtime.js +1617 -113
  220. package/server/lib/session-goal/runtime.test.js +1500 -70
  221. package/server/lib/session-index/DOCUMENTATION.md +18 -15
  222. package/server/lib/session-index/event-ingest.js +89 -16
  223. package/server/lib/session-index/event-ingest.test.js +73 -0
  224. package/server/lib/session-index/host-authority-snapshot.js +92 -0
  225. package/server/lib/session-index/routes.host-archive.test.js +201 -0
  226. package/server/lib/session-index/routes.js +63 -10
  227. package/server/lib/session-index/routes.test.js +8 -8
  228. package/server/lib/session-index/service.js +7 -1
  229. package/server/lib/session-index/sync-runtime.js +171 -41
  230. package/server/lib/session-index/sync-runtime.test.js +164 -9
  231. package/server/lib/session-metadata/DOCUMENTATION.md +86 -0
  232. package/server/lib/session-metadata/routes.js +193 -0
  233. package/server/lib/session-metadata/routes.test.js +156 -0
  234. package/server/lib/session-metadata/session-archive.d.ts +73 -0
  235. package/server/lib/session-metadata/session-archive.js +654 -0
  236. package/server/lib/session-metadata/session-archive.test.js +359 -0
  237. package/server/lib/session-metadata/session-metadata-store.d.ts +36 -0
  238. package/server/lib/session-metadata/session-metadata-store.js +375 -0
  239. package/server/lib/session-metadata/session-metadata-store.test.js +379 -0
  240. package/server/lib/session-metadata/session-projection.d.ts +41 -0
  241. package/server/lib/session-metadata/session-projection.js +255 -0
  242. package/server/lib/session-metadata/session-projection.test.js +64 -0
  243. package/server/lib/session-metadata/system-session.js +55 -0
  244. package/server/lib/session-metadata/system-session.test.js +55 -0
  245. package/server/lib/session-title/DOCUMENTATION.md +40 -7
  246. package/server/lib/session-title/native-runtime.test.js +167 -0
  247. package/server/lib/session-title/runtime.js +67 -42
  248. package/server/lib/session-title/session-access.js +46 -0
  249. package/server/lib/session-title/session-access.test.js +91 -0
  250. package/server/lib/session-turn-pages/DOCUMENTATION.md +12 -11
  251. package/server/lib/session-turn-pages/reconcile.service.js +1 -1
  252. package/server/lib/session-turn-pages/reconcile.service.test.js +16 -0
  253. package/server/lib/session-turn-pages/routes.js +123 -75
  254. package/server/lib/session-turn-pages/routes.test.js +566 -0
  255. package/server/lib/session-turn-pages/service.js +6 -2
  256. package/server/lib/session-turn-pages/service.test.js +34 -0
  257. package/server/lib/session-turn-pages/session-message-projection.d.ts +13 -0
  258. package/server/lib/session-turn-pages/session-message-projection.js +281 -0
  259. package/server/lib/small-model/DOCUMENTATION.md +101 -146
  260. package/server/lib/small-model/catalog.js +84 -54
  261. package/server/lib/small-model/catalog.test.js +111 -9
  262. package/server/lib/small-model/custom-api.js +68 -0
  263. package/server/lib/small-model/custom-api.test.js +64 -0
  264. package/server/lib/small-model/index.js +125 -241
  265. package/server/lib/small-model/resolve.js +35 -120
  266. package/server/lib/small-model/resolve.test.js +20 -110
  267. package/server/lib/small-model/routes.js +1 -3
  268. package/server/lib/small-model/summary-settings.test.js +157 -253
  269. package/server/opencode-proxy.test.js +63 -12
  270. package/dist/assets/AssistantView-BUveAgc4.js +0 -3
  271. package/dist/assets/MarkdownRenderer-BbrbDH6-.js +0 -2
  272. package/dist/assets/MobileDetailNavigation-B0aqKXd7.js +0 -1
  273. package/dist/assets/MobileSurface-DW7WfPsy.js +0 -2
  274. package/dist/assets/OverlayScrollbar-DrA0Vsg5.js +0 -2
  275. package/dist/assets/SettingsView-PkXIavr7.js +0 -25
  276. package/dist/assets/appThemeRegistry-D5Yxg4YF.js +0 -1
  277. package/dist/assets/collapsible-D5Phaykh.js +0 -1
  278. package/dist/assets/context-menu-CubSDW2g.js +0 -1
  279. package/dist/assets/es-DA3MqOo0.js +0 -15
  280. package/dist/assets/fr-Dbz0CdIA.js +0 -13
  281. package/dist/assets/gitApi-DXyC4MiV.js +0 -7
  282. package/dist/assets/insertionBoundaries-KlOVrHHt.js +0 -1
  283. package/dist/assets/ja-DumanVQA.js +0 -15
  284. package/dist/assets/ko-C0IkiUjQ.js +0 -15
  285. package/dist/assets/main-BPS5ylib.js +0 -2
  286. package/dist/assets/main-Cpd9VWYs.js +0 -169
  287. package/dist/assets/markdown-worker-CptoICmq.js +0 -2
  288. package/dist/assets/miniChat-B8_KLWiY.js +0 -2
  289. package/dist/assets/mobile-CtktKrXn.js +0 -2
  290. package/dist/assets/multirun-CYfP9Cfm.js +0 -4
  291. package/dist/assets/pl-B9No6MQp.js +0 -15
  292. package/dist/assets/platform-0w_Q9_ji.js +0 -2
  293. package/dist/assets/projectMeta-S1hJ7oBp.js +0 -3
  294. package/dist/assets/pt-BR-DyQ0WTDh.js +0 -15
  295. package/dist/assets/renderElectronMiniChatApp-iK14LWm8.js +0 -2
  296. package/dist/assets/renderMobileApp-DORLPWnb.js +0 -28
  297. package/dist/assets/src-rS3zCcsC.css +0 -2
  298. package/dist/assets/store-5B_LDnLM.js +0 -15
  299. package/dist/assets/uk-C_1KkqyP.js +0 -15
  300. package/dist/assets/useDesktopWindowControlsLayout-Dnr-jX0C.js +0 -1
  301. package/dist/assets/useEffectiveDirectory-CZLLyarc.js +0 -1
  302. package/dist/assets/useMobileNavigationStore-CoCiqNgm.js +0 -413
  303. package/dist/assets/useSessionAutoCleanup-xQyETQkG.js +0 -2
  304. package/dist/assets/useUIStore-Bxv3f23A.js +0 -1
  305. package/dist/assets/vendor-opencode-sdk-C07HQypa.js +0 -7
  306. package/dist/assets/zh-CN-uWILgBdt.js +0 -15
  307. package/dist/assets/zh-TW-MYfdvhbD.js +0 -15
  308. package/server/lib/small-model/call.js +0 -427
  309. package/server/lib/small-model/call.test.js +0 -382
  310. package/server/lib/small-model/opencode-session.js +0 -339
  311. package/server/lib/small-model/opencode-session.test.js +0 -177
@@ -3,6 +3,8 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { mergePathValues } from './path-utils.js';
6
+ import { PINNED_OPENCODE2_VERSION, isAcceptableOpenCode2HealthVersion, isOpenCode1xVersion } from './opencode2-pin.js';
7
+ import { ensurePinnedOpenCode2Cli, installedOpenCode2BinaryPath, readOpenCode2BinaryVersion } from './ensure-cli.js';
6
8
 
7
9
  export const createOpenCodeEnvRuntime = (deps) => {
8
10
  const {
@@ -12,6 +14,9 @@ export const createOpenCodeEnvRuntime = (deps) => {
12
14
  } = deps;
13
15
  const runSpawnSync = typeof deps.spawnSync === 'function' ? deps.spawnSync : spawnSync;
14
16
  const resolveHomeDir = typeof deps.homedir === 'function' ? deps.homedir : () => os.homedir();
17
+ const ensurePinnedCli = typeof deps.ensurePinnedOpenCode2Cli === 'function'
18
+ ? deps.ensurePinnedOpenCode2Cli
19
+ : ensurePinnedOpenCode2Cli;
15
20
 
16
21
  const parseNullSeparatedEnvSnapshot = (raw) => {
17
22
  if (typeof raw !== 'string' || raw.length === 0) {
@@ -275,41 +280,20 @@ export const createOpenCodeEnvRuntime = (deps) => {
275
280
  return normalized.endsWith(`${path.sep}programs${path.sep}opencode${path.sep}opencode.exe`);
276
281
  };
277
282
 
278
- const bundledOpenCodeCliCandidates = () => {
279
- const names = process.platform === 'win32' ? ['opencode.exe'] : ['opencode'];
280
- const roots = [
281
- process.env.OPENCHAMBER_BUNDLED_OPENCODE_CLI_DIR,
282
- typeof process.resourcesPath === 'string' ? path.join(process.resourcesPath, 'opencode-cli') : null,
283
- ]
284
- .map((value) => (typeof value === 'string' ? value.trim() : ''))
285
- .filter(Boolean);
286
-
287
- const candidates = [];
288
- for (const root of roots) {
289
- for (const name of names) {
290
- candidates.push(path.join(root, name));
291
- }
292
- }
293
- return candidates;
294
- };
295
-
296
- const resolveBundledOpenCodeCliPath = () => {
297
- for (const candidate of bundledOpenCodeCliCandidates()) {
298
- if (isExecutable(candidate) && !isWindowsOpenCodeDesktopAppPath(candidate)) {
299
- return candidate;
300
- }
283
+ const resolveInstalledOpenCodeCliPath = () => {
284
+ const installed = installedOpenCode2BinaryPath(PINNED_OPENCODE2_VERSION, {
285
+ env: process.env,
286
+ homedir: resolveHomeDir,
287
+ platform: process.platform,
288
+ });
289
+ if (isExecutable(installed) && !isWindowsOpenCodeDesktopAppPath(installed)) {
290
+ clearWslOpencodeResolution();
291
+ state.resolvedOpencodeBinarySource = 'installed';
292
+ return installed;
301
293
  }
302
294
  return null;
303
295
  };
304
296
 
305
- const bundledOpenCodeCliFallback = () => {
306
- const bundled = resolveBundledOpenCodeCliPath();
307
- if (!bundled) return null;
308
- clearWslOpencodeResolution();
309
- state.resolvedOpencodeBinarySource = 'bundled';
310
- return bundled;
311
- };
312
-
313
297
  const clearWslOpencodeResolution = () => {
314
298
  state.useWslForOpencode = false;
315
299
  state.resolvedWslBinary = null;
@@ -330,6 +314,20 @@ export const createOpenCodeEnvRuntime = (deps) => {
330
314
  return trimmed;
331
315
  };
332
316
 
317
+ const acceptOpenCodeV2Candidate = (candidate, source) => {
318
+ if (typeof candidate !== 'string' || !candidate.trim()) return null;
319
+ if (!isExecutable(candidate) || isWindowsOpenCodeDesktopAppPath(candidate) || isMacOpenCodeAppBundlePath(candidate)) {
320
+ return null;
321
+ }
322
+ const version = readOpenCode2BinaryVersion(candidate);
323
+ if (!isAcceptableOpenCode2HealthVersion(version)) {
324
+ return null;
325
+ }
326
+ clearWslOpencodeResolution();
327
+ state.resolvedOpencodeBinarySource = source;
328
+ return candidate;
329
+ };
330
+
333
331
  const resolveOpencodeCliPath = () => {
334
332
  const explicit = [
335
333
  process.env.OPENCODE_BINARY,
@@ -341,118 +339,114 @@ export const createOpenCodeEnvRuntime = (deps) => {
341
339
  .filter(Boolean);
342
340
 
343
341
  for (const candidate of explicit) {
344
- if (isExecutable(candidate) && !isWindowsOpenCodeDesktopAppPath(candidate)) {
345
- clearWslOpencodeResolution();
346
- state.resolvedOpencodeBinarySource = 'env';
347
- return candidate;
342
+ if (isWindowsOpenCodeDesktopAppPath(candidate) || isMacOpenCodeAppBundlePath(candidate)) {
343
+ continue;
348
344
  }
345
+ if (!isExecutable(candidate)) continue;
346
+ const version = readOpenCode2BinaryVersion(candidate);
347
+ if (isOpenCode1xVersion(version)) {
348
+ // Inherited OPENCODE_BINARY often points at a still-installed 1.x.
349
+ // Skip it and keep looking; never overwrite that binary.
350
+ console.warn(`Skipping OpenCode 1.x at ${candidate} (${version}); looking for v2.`);
351
+ continue;
352
+ }
353
+ const accepted = acceptOpenCodeV2Candidate(candidate, 'env');
354
+ if (accepted) return accepted;
349
355
  }
350
356
 
351
- // The bundled CLI is the LAST resort (see bundledOpenCodeCliFallback at the
352
- // exit points below): a user's own OpenCode install — PATH, known install
353
- // locations, or shell-resolved — must win over the pinned bundled copy.
354
- const resolvedFromPath = searchPathFor('opencode');
355
- if (resolvedFromPath) {
356
- clearWslOpencodeResolution();
357
- state.resolvedOpencodeBinarySource = 'path';
358
- return resolvedFromPath;
357
+ // Match master: reuse a globally installed CLI. Official v2 is `opencode`;
358
+ // Skip 1.x binaries by version; auto-discovery uses only the official name.
359
+ for (const name of ['opencode']) {
360
+ const resolvedFromPath = searchPathFor(name);
361
+ const accepted = acceptOpenCodeV2Candidate(resolvedFromPath, 'path');
362
+ if (accepted) return accepted;
359
363
  }
360
364
 
361
365
  const home = resolveHomeDir();
362
- const unixFallbacks = [
363
- path.join(home, '.opencode', 'bin', 'opencode'),
364
- path.join(home, '.bun', 'bin', 'opencode'),
365
- path.join(home, '.local', 'bin', 'opencode'),
366
- path.join(home, 'bin', 'opencode'),
367
- '/opt/homebrew/bin/opencode',
368
- '/usr/local/bin/opencode',
369
- '/home/linuxbrew/.linuxbrew/bin/opencode',
370
- '/usr/bin/opencode',
371
- '/bin/opencode',
372
- ];
366
+ const unixFallbacks = ['opencode'].flatMap((name) => [
367
+ path.join(home, '.opencode', 'bin', name),
368
+ path.join(home, '.bun', 'bin', name),
369
+ path.join(home, '.local', 'bin', name),
370
+ path.join(home, 'bin', name),
371
+ `/opt/homebrew/bin/${name}`,
372
+ `/usr/local/bin/${name}`,
373
+ `/home/linuxbrew/.linuxbrew/bin/${name}`,
374
+ `/usr/bin/${name}`,
375
+ `/bin/${name}`,
376
+ ]);
373
377
 
374
378
  const winFallbacks = (() => {
375
379
  const userProfile = process.env.USERPROFILE || home;
376
380
  const appData = process.env.APPDATA || '';
377
381
  const localAppData = process.env.LOCALAPPDATA || '';
378
382
  const programData = process.env.ProgramData || 'C:\\ProgramData';
379
-
380
383
  const programFiles = process.env.ProgramFiles || 'C:\\Program Files';
381
-
382
- return [
383
- path.join(userProfile, '.opencode', 'bin', 'opencode.exe'),
384
- path.join(userProfile, '.opencode', 'bin', 'opencode.cmd'),
385
- path.join(appData, 'npm', 'opencode.cmd'),
386
- // System-wide Node installer keeps the global npm prefix here
387
- // (npm i -g opencode-ai → opencode.cmd shim).
388
- path.join(programFiles, 'nodejs', 'opencode.cmd'),
389
- path.join(userProfile, 'scoop', 'shims', 'opencode.exe'),
390
- path.join(userProfile, 'scoop', 'shims', 'opencode.cmd'),
391
- path.join(programData, 'chocolatey', 'bin', 'opencode.exe'),
392
- path.join(programData, 'chocolatey', 'bin', 'opencode.cmd'),
393
- path.join(userProfile, '.bun', 'bin', 'opencode.exe'),
394
- path.join(userProfile, '.bun', 'bin', 'opencode.cmd'),
395
- ].filter(Boolean);
384
+ const names = ['opencode.exe', 'opencode.cmd'];
385
+ const dirs = [
386
+ path.join(userProfile, '.opencode', 'bin'),
387
+ path.join(appData, 'npm'),
388
+ path.join(programFiles, 'nodejs'),
389
+ path.join(userProfile, 'scoop', 'shims'),
390
+ path.join(programData, 'chocolatey', 'bin'),
391
+ path.join(userProfile, '.bun', 'bin'),
392
+ ];
393
+ return dirs.flatMap((dir) => names.map((name) => path.join(dir, name))).filter(Boolean);
396
394
  })();
397
395
 
398
396
  const fallbacks = process.platform === 'win32' ? winFallbacks : unixFallbacks;
399
397
  for (const candidate of fallbacks) {
400
- if (isExecutable(candidate)) {
401
- clearWslOpencodeResolution();
402
- state.resolvedOpencodeBinarySource = 'fallback';
403
- return candidate;
404
- }
398
+ const accepted = acceptOpenCodeV2Candidate(candidate, 'fallback');
399
+ if (accepted) return accepted;
405
400
  }
406
401
 
407
402
  if (process.platform === 'win32') {
408
- try {
409
- const result = runSpawnSync('where', ['opencode'], {
410
- encoding: 'utf8',
411
- stdio: ['ignore', 'pipe', 'pipe'],
412
- windowsHide: true,
413
- });
414
- if (result.status === 0) {
415
- const lines = (result.stdout || '')
416
- .split(/\r?\n/)
417
- .map((line) => line.trim())
418
- .filter(Boolean);
419
- const found = lines.find((line) => isExecutable(line) && !isWindowsOpenCodeDesktopAppPath(line));
420
- if (found) {
421
- clearWslOpencodeResolution();
422
- state.resolvedOpencodeBinarySource = 'where';
423
- return found;
403
+ for (const name of ['opencode']) {
404
+ try {
405
+ const result = runSpawnSync('where', [name], {
406
+ encoding: 'utf8',
407
+ stdio: ['ignore', 'pipe', 'pipe'],
408
+ windowsHide: true,
409
+ });
410
+ if (result.status === 0) {
411
+ const lines = (result.stdout || '')
412
+ .split(/\r?\n/)
413
+ .map((line) => line.trim())
414
+ .filter(Boolean);
415
+ for (const line of lines) {
416
+ const accepted = acceptOpenCodeV2Candidate(line, 'where');
417
+ if (accepted) return accepted;
418
+ }
424
419
  }
420
+ } catch {
425
421
  }
426
- } catch {
427
422
  }
428
423
  // Do not auto-detect OpenCode from WSL. OpenCode sessions are keyed by
429
424
  // server-visible directories, and mixing Windows paths with WSL paths
430
425
  // creates duplicate/missing project state in the desktop app.
431
- return bundledOpenCodeCliFallback();
426
+ return resolveInstalledOpenCodeCliPath();
432
427
  }
433
428
 
434
429
  const shells = [process.env.SHELL, '/bin/zsh', '/bin/bash', '/bin/sh'].filter(Boolean);
435
- for (const shell of shells) {
436
- if (!isExecutable(shell)) continue;
437
- try {
438
- const result = runSpawnSync(shell, ['-lic', 'command -v opencode'], {
439
- encoding: 'utf8',
440
- stdio: ['ignore', 'pipe', 'pipe'],
441
- windowsHide: true,
442
- });
443
- if (result.status === 0) {
444
- const found = (result.stdout || '').trim().split(/\s+/).pop() || '';
445
- if (found && isExecutable(found)) {
446
- clearWslOpencodeResolution();
447
- state.resolvedOpencodeBinarySource = 'shell';
448
- return found;
430
+ for (const name of ['opencode']) {
431
+ for (const shell of shells) {
432
+ if (!isExecutable(shell)) continue;
433
+ try {
434
+ const result = runSpawnSync(shell, ['-lic', `command -v ${name}`], {
435
+ encoding: 'utf8',
436
+ stdio: ['ignore', 'pipe', 'pipe'],
437
+ windowsHide: true,
438
+ });
439
+ if (result.status === 0) {
440
+ const found = (result.stdout || '').trim().split(/\s+/).pop() || '';
441
+ const accepted = acceptOpenCodeV2Candidate(found, 'shell');
442
+ if (accepted) return accepted;
449
443
  }
444
+ } catch {
450
445
  }
451
- } catch {
452
446
  }
453
447
  }
454
448
 
455
- return bundledOpenCodeCliFallback();
449
+ return resolveInstalledOpenCodeCliPath();
456
450
  };
457
451
 
458
452
  const resolveNodeCliPath = () => {
@@ -912,7 +906,7 @@ export const createOpenCodeEnvRuntime = (deps) => {
912
906
  const createConfiguredOpencodeBinaryError = (raw, normalized) => {
913
907
  const configured = typeof raw === 'string' ? raw.trim() : '';
914
908
  const candidate = typeof normalized === 'string' && normalized.trim().length > 0 ? normalized.trim() : configured;
915
- const messageSuffix = 'OpenChamber needs the standalone opencode CLI. Install it and set settings.opencodeBinary to the CLI path, for example ~/.opencode/bin/opencode, or leave the setting empty to use PATH lookup.';
909
+ const messageSuffix = 'OpenChamber needs the standalone OpenCode v2 CLI (`opencode`). Install it and set settings.opencodeBinary to the CLI path, for example ~/.opencode/bin/opencode, or leave the setting empty to use PATH lookup.';
916
910
  const error = (() => {
917
911
  if (isKnownOpenCodeDesktopAppPath(candidate) || isKnownOpenCodeDesktopAppPath(configured)) {
918
912
  const platformName = process.platform === 'win32' ? 'Windows desktop app install' : 'macOS desktop app bundle';
@@ -1013,6 +1007,22 @@ export const createOpenCodeEnvRuntime = (deps) => {
1013
1007
  return null;
1014
1008
  }
1015
1009
 
1010
+ if (normalized && isKnownOpenCodeDesktopAppPath(normalized)) {
1011
+ if (strict) {
1012
+ throw createConfiguredOpencodeBinaryError(raw, normalized);
1013
+ }
1014
+ console.warn(`Configured settings.opencodeBinary points at a desktop app, not the CLI: ${normalized}`);
1015
+ return null;
1016
+ }
1017
+
1018
+ if (normalized && isExecutable(normalized)) {
1019
+ const version = readOpenCode2BinaryVersion(normalized);
1020
+ if (isOpenCode1xVersion(version)) {
1021
+ console.warn(`Skipping configured OpenCode 1.x at ${normalized} (${version}); looking for v2.`);
1022
+ return null;
1023
+ }
1024
+ }
1025
+
1016
1026
  if (normalized && isExecutable(normalized) && !isKnownOpenCodeDesktopAppPath(normalized)) {
1017
1027
  clearWslOpencodeResolution();
1018
1028
  process.env.OPENCODE_BINARY = normalized;
@@ -1043,12 +1053,16 @@ export const createOpenCodeEnvRuntime = (deps) => {
1043
1053
  if (state.useWslForOpencode) {
1044
1054
  return state.resolvedOpencodeBinary;
1045
1055
  }
1056
+ process.env.OPENCODE_BINARY = state.resolvedOpencodeBinary;
1046
1057
  ensureOpencodeShimRuntime(state.resolvedOpencodeBinary);
1047
1058
  return state.resolvedOpencodeBinary;
1048
1059
  }
1049
1060
 
1050
1061
  const existing = typeof process.env.OPENCODE_BINARY === 'string' ? process.env.OPENCODE_BINARY.trim() : '';
1051
- if (existing && isExecutable(existing)) {
1062
+ if (existing && isExecutable(existing) && isOpenCode1xVersion(readOpenCode2BinaryVersion(existing))) {
1063
+ console.warn(`Ignoring OpenCode 1.x OPENCODE_BINARY at ${existing}; looking for v2.`);
1064
+ delete process.env.OPENCODE_BINARY;
1065
+ } else if (existing && isExecutable(existing)) {
1052
1066
  clearWslOpencodeResolution();
1053
1067
  state.resolvedOpencodeBinary = existing;
1054
1068
  state.resolvedOpencodeBinarySource = state.resolvedOpencodeBinarySource || 'env';
@@ -1079,6 +1093,67 @@ export const createOpenCodeEnvRuntime = (deps) => {
1079
1093
  return null;
1080
1094
  };
1081
1095
 
1096
+ // Last-resort only: used after pin install fails. Never consulted by resolveOpencodeCliPath.
1097
+ const resolveBundledOpenCodeCliPath = () => {
1098
+ const dirs = [];
1099
+ const envDir = typeof process.env.OPENCHAMBER_BUNDLED_OPENCODE_CLI_DIR === 'string'
1100
+ ? process.env.OPENCHAMBER_BUNDLED_OPENCODE_CLI_DIR.trim()
1101
+ : '';
1102
+ if (envDir) {
1103
+ dirs.push(envDir);
1104
+ }
1105
+ if (typeof process.resourcesPath === 'string' && process.resourcesPath.trim()) {
1106
+ dirs.push(path.join(process.resourcesPath, 'opencode-cli'));
1107
+ }
1108
+
1109
+ // Runtime and packaging use the official v2 executable name.
1110
+ const names = ['opencode', 'opencode.exe'];
1111
+ for (const dir of dirs) {
1112
+ for (const name of names) {
1113
+ const accepted = acceptOpenCodeV2Candidate(path.join(dir, name), 'bundled');
1114
+ if (accepted) {
1115
+ return accepted;
1116
+ }
1117
+ }
1118
+ }
1119
+ return null;
1120
+ };
1121
+
1122
+ const ensurePinnedOpenCode2CliEnv = async (options = {}) => {
1123
+ const discovered = state.resolvedOpencodeBinary || resolveOpencodeCliPath();
1124
+ const source = state.resolvedOpencodeBinarySource;
1125
+ const explicit = source === 'env' || source === 'settings';
1126
+ try {
1127
+ const result = await ensurePinnedCli({
1128
+ discoveredPath: discovered,
1129
+ preferDiscovered: explicit,
1130
+ env: process.env,
1131
+ homedir: resolveHomeDir,
1132
+ ...options,
1133
+ });
1134
+ if (!result?.path) {
1135
+ return ensureOpencodeCliEnv();
1136
+ }
1137
+ if (result.path) {
1138
+ clearWslOpencodeResolution();
1139
+ process.env.OPENCODE_BINARY = result.path;
1140
+ state.resolvedOpencodeBinary = result.path;
1141
+ state.resolvedOpencodeBinarySource = result.source === 'installed' ? 'installed' : (state.resolvedOpencodeBinarySource || 'discovered');
1142
+ }
1143
+ return ensureOpencodeCliEnv();
1144
+ } catch (error) {
1145
+ const bundled = resolveBundledOpenCodeCliPath();
1146
+ if (!bundled) {
1147
+ throw error;
1148
+ }
1149
+ clearWslOpencodeResolution();
1150
+ process.env.OPENCODE_BINARY = bundled;
1151
+ state.resolvedOpencodeBinary = bundled;
1152
+ state.resolvedOpencodeBinarySource = 'bundled';
1153
+ return ensureOpencodeCliEnv();
1154
+ }
1155
+ };
1156
+
1082
1157
  const resolveGitBinaryForSpawn = () => {
1083
1158
  if (process.platform !== 'win32') {
1084
1159
  return 'git';
@@ -1159,9 +1234,30 @@ export const createOpenCodeEnvRuntime = (deps) => {
1159
1234
  state.resolvedOpencodeBinary = null;
1160
1235
  };
1161
1236
 
1237
+ /**
1238
+ * Pin managed launch to an explicit binary for the duration of an owned-cache
1239
+ * upgrade (ticket 12). Avoids rediscovery that would re-attach a global CLI.
1240
+ */
1241
+ const forceResolvedOpenCodeBinary = (binaryPath, source = 'installed') => {
1242
+ const trimmed = typeof binaryPath === 'string' ? binaryPath.trim() : '';
1243
+ if (!trimmed) {
1244
+ const error = new Error('forceResolvedOpenCodeBinary requires a binary path');
1245
+ error.code = 'OPENCODE_BINARY_INVALID';
1246
+ throw error;
1247
+ }
1248
+ clearWslOpencodeResolution();
1249
+ process.env.OPENCODE_BINARY = trimmed;
1250
+ state.resolvedOpencodeBinary = trimmed;
1251
+ state.resolvedOpencodeBinarySource = source || 'installed';
1252
+ prependToPath(path.dirname(trimmed));
1253
+ ensureOpencodeShimRuntime(trimmed);
1254
+ return trimmed;
1255
+ };
1256
+
1162
1257
  return {
1163
1258
  applyLoginShellEnvSnapshot,
1164
1259
  ensureOpencodeCliEnv,
1260
+ ensurePinnedOpenCode2CliEnv,
1165
1261
  applyOpencodeBinaryFromSettings,
1166
1262
  getLoginShellEnvSnapshot,
1167
1263
  resolveOpencodeCliPath,
@@ -1170,5 +1266,6 @@ export const createOpenCodeEnvRuntime = (deps) => {
1170
1266
  searchPathFor,
1171
1267
  resolveGitBinaryForSpawn,
1172
1268
  clearResolvedOpenCodeBinary,
1269
+ forceResolvedOpenCodeBinary,
1173
1270
  };
1174
1271
  };