@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
@@ -263,11 +263,11 @@ describe('opencode plugin routes', () => {
263
263
  expect(response.body.results[0]).toMatchObject({ kind: 'npm-ok', spec: '@scope/foo@1.0.0', name: '@scope/foo' });
264
264
  });
265
265
 
266
- test('POST /entry creates entry and requires reload', async () => {
266
+ test('POST /entry persists for V2 hot reload without restarting', async () => {
267
267
  const response = await createEntry('a');
268
268
 
269
- expect(response.body).toMatchObject({ success: true, requiresReload: true, reloadDelayMs: 25 });
270
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin entry creation');
269
+ expect(response.body).toMatchObject({ success: true, requiresReload: false, application: 'watch' });
270
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
271
271
  });
272
272
 
273
273
  test('GET after POST returns created entry', async () => {
@@ -302,7 +302,7 @@ describe('opencode plugin routes', () => {
302
302
  expect(response.body.success).toBe(true);
303
303
  const after = await request(app).get('/api/config/plugins').expect(200);
304
304
  expect(after.body.entries[0]).toEqual(expect.objectContaining({ spec: 'b', scope: 'user' }));
305
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin entry update');
305
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
306
306
  });
307
307
 
308
308
  test('DELETE /entry/:id removes entry and prunes plugin key', async () => {
@@ -315,15 +315,15 @@ describe('opencode plugin routes', () => {
315
315
  const after = await request(app).get('/api/config/plugins').expect(200);
316
316
  expect(after.body.entries).toEqual([]);
317
317
  expect(readJson(userConfigPath).plugin).toBeUndefined();
318
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin entry deletion');
318
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
319
319
  });
320
320
 
321
321
  test('POST /file writes plugin dir file', async () => {
322
322
  const response = await createFile('test.js', '//x');
323
323
 
324
- expect(response.body).toMatchObject({ success: true, requiresReload: true });
324
+ expect(response.body).toMatchObject({ success: true, requiresReload: false, application: 'watch' });
325
325
  expect(fs.readFileSync(path.join(rootDir, 'plugins', 'test.js'), 'utf8')).toBe('//x');
326
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin file creation');
326
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
327
327
  });
328
328
 
329
329
  test('POST duplicate file returns 409', async () => {
@@ -348,7 +348,7 @@ describe('opencode plugin routes', () => {
348
348
  .expect(200);
349
349
 
350
350
  expect(fs.readFileSync(path.join(rootDir, 'plugins', 'test.js'), 'utf8')).toBe('//y');
351
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin file update');
351
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
352
352
  });
353
353
 
354
354
  test('DELETE /file/:id unlinks file', async () => {
@@ -359,7 +359,7 @@ describe('opencode plugin routes', () => {
359
359
  await request(app).delete(`/api/config/plugins/file/${encodeURIComponent(id)}`).expect(200);
360
360
 
361
361
  expect(fs.existsSync(path.join(rootDir, 'plugins', 'test.js'))).toBe(false);
362
- expect(refreshOpenCodeAfterConfigChange).toHaveBeenCalledWith('plugin file deletion');
362
+ expect(refreshOpenCodeAfterConfigChange).not.toHaveBeenCalled();
363
363
  });
364
364
 
365
365
  test('PATCH unknown entry id returns 404', async () => {
@@ -7,6 +7,7 @@ import {
7
7
  writeConfig,
8
8
  } from './shared.js';
9
9
  import { isPathSpec } from './plugin-spec.js';
10
+ import { withV1PluginIncompatibility } from './plugin-compatibility.js';
10
11
 
11
12
  const PLUGIN_FILE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_.]*\.(js|ts|mjs|cjs)$/;
12
13
 
@@ -248,7 +249,7 @@ function listPluginEntries(workingDirectory) {
248
249
  }
249
250
  return source.config.plugin.map((raw) => {
250
251
  const parsed = parsePluginRaw(raw);
251
- return {
252
+ return withV1PluginIncompatibility({
252
253
  id: encodePluginId('config', `${source.scope}:${parsed.spec}`),
253
254
  spec: parsed.spec,
254
255
  ...(parsed.options !== undefined ? { options: parsed.options } : {}),
@@ -256,7 +257,7 @@ function listPluginEntries(workingDirectory) {
256
257
  kind: 'config',
257
258
  parsedKind: parsedKindForSpec(parsed.spec),
258
259
  sourcePath: source.filePath,
259
- };
260
+ });
260
261
  });
261
262
  });
262
263
  }
@@ -333,7 +334,7 @@ function listPluginDirFiles(workingDirectory) {
333
334
  }
334
335
  return fs.readdirSync(dir, { withFileTypes: true })
335
336
  .filter((entry) => entry.isFile() && PLUGIN_FILE_NAME_PATTERN.test(entry.name) && !entry.name.includes('..'))
336
- .map((entry) => ({
337
+ .map((entry) => withV1PluginIncompatibility({
337
338
  id: encodePluginId('file', `${scope}:${entry.name}`),
338
339
  fileName: entry.name,
339
340
  scope,
@@ -138,6 +138,18 @@ describe('opencode plugins data layer', () => {
138
138
  ]);
139
139
  });
140
140
 
141
+ test('lists V1 plugins as incompatible instead of a silent load failure', () => {
142
+ writeJson(userConfigPath, { plugin: ['oh-my-opencode'] });
143
+ const entries = plugins.listPluginEntries(projectDir);
144
+ expect(entries).toEqual([
145
+ expect.objectContaining({
146
+ spec: 'oh-my-opencode',
147
+ compatibility: 'v1-incompatible',
148
+ compatible: false,
149
+ }),
150
+ ]);
151
+ });
152
+
141
153
  test('encodes and decodes ids', () => {
142
154
  const id = plugins.encodePluginId('config', 'user:oh-my-openagent@4.3.0');
143
155
  expect(plugins.decodePluginId(id)).toEqual({ prefix: 'config', value: 'user:oh-my-openagent@4.3.0' });
@@ -56,20 +56,37 @@ const projectModalities = (source) => {
56
56
  return ownKeys(projected).length > 0 ? projected : undefined;
57
57
  };
58
58
 
59
+ // v2 ModelCapabilities.input/output are modality name arrays, not boolean maps.
60
+ const projectModalityList = (source) => {
61
+ if (!Array.isArray(source)) return undefined;
62
+ const projected = createDictionary();
63
+ for (const item of source) {
64
+ if (typeof item !== 'string' || !MODALITIES.has(item) || !isSafeIdentifier(item)) continue;
65
+ projected[item] = true;
66
+ }
67
+ return ownKeys(projected).length > 0 ? projected : undefined;
68
+ };
69
+
59
70
  const projectCapabilities = (source) => {
60
71
  if (!isRecord(source)) return undefined;
61
72
  const capabilities = createDictionary();
62
73
  const flags = projectBooleanFields(source, ['temperature', 'reasoning', 'attachment', 'toolcall']);
63
74
  if (flags) Object.assign(capabilities, flags);
75
+ // v2 names tool support `tools`. Keep an explicit catalog `toolcall` flag when both exist.
76
+ if (!Object.hasOwn(capabilities, 'toolcall') && typeof source.tools === 'boolean') {
77
+ capabilities.toolcall = source.tools;
78
+ }
64
79
  for (const field of ['input', 'output']) {
65
80
  if (!Object.hasOwn(source, field)) continue;
66
- const modalities = projectModalities(source[field]);
81
+ const modalities = Array.isArray(source[field])
82
+ ? projectModalityList(source[field])
83
+ : projectModalities(source[field]);
67
84
  if (modalities) capabilities[field] = modalities;
68
85
  }
69
86
  return ownKeys(capabilities).length > 0 ? capabilities : undefined;
70
87
  };
71
88
 
72
- const projectCost = (source) => {
89
+ const projectCostEntry = (source) => {
73
90
  if (!isRecord(source)) return undefined;
74
91
  const cost = createDictionary();
75
92
  for (const field of ['input', 'output']) {
@@ -87,6 +104,30 @@ const projectCost = (source) => {
87
104
  return ownKeys(cost).length > 0 ? cost : undefined;
88
105
  };
89
106
 
107
+ // v2 ModelInfo.cost is a tier array. The untiered entry is the base price.
108
+ const projectCost = (source) => {
109
+ if (Array.isArray(source)) {
110
+ const base = source.find((item) => isRecord(item) && !isRecord(item.tier))
111
+ || source.find((item) => isRecord(item));
112
+ return projectCostEntry(base);
113
+ }
114
+ return projectCostEntry(source);
115
+ };
116
+
117
+ // v2 ModelInfo.variants is `{ id, settings?, headers?, body? }[]`. Catalog consumers
118
+ // still read a name→{} record. Request payloads stay server-side.
119
+ const projectVariantNames = (source) => {
120
+ if (Array.isArray(source)) {
121
+ return source.map((item) => {
122
+ if (typeof item === 'string') return item;
123
+ if (isRecord(item) && typeof item.id === 'string') return item.id;
124
+ return undefined;
125
+ });
126
+ }
127
+ if (isRecord(source)) return ownKeys(source);
128
+ return null;
129
+ };
130
+
90
131
  function projectModel(source) {
91
132
  if (!isRecord(source) || !isSafeIdentifier(source.id) || !isSafeDisplayName(source.name)) return null;
92
133
  // partial is structural only (e.g. variant truncation). Soft allowlist stripping of optional
@@ -113,18 +154,23 @@ function projectModel(source) {
113
154
  if (Object.hasOwn(source, 'release_date') && source.release_date !== '' && source.release_date !== null) {
114
155
  if (isSafeReleaseDate(source.release_date)) model.release_date = source.release_date;
115
156
  }
116
- if (Object.hasOwn(source, 'variants') && isRecord(source.variants)) {
117
- const variants = createDictionary();
118
- let variantCount = 0;
119
- for (const variantName of ownKeys(source.variants)) {
120
- if (variantCount >= MAX_VARIANTS_PER_MODEL) {
121
- partial = true;
122
- break;
157
+ if (Object.hasOwn(source, 'variants')) {
158
+ const names = projectVariantNames(source.variants);
159
+ if (names) {
160
+ const variants = createDictionary();
161
+ let variantCount = 0;
162
+ for (const variantName of names) {
163
+ if (variantCount >= MAX_VARIANTS_PER_MODEL) {
164
+ partial = true;
165
+ break;
166
+ }
167
+ variantCount += 1;
168
+ if (typeof variantName === 'string' && isSafeIdentifier(variantName) && !Object.hasOwn(variants, variantName)) {
169
+ variants[variantName] = createDictionary();
170
+ }
123
171
  }
124
- variantCount += 1;
125
- if (isSafeIdentifier(variantName)) variants[variantName] = createDictionary();
172
+ if (ownKeys(variants).length > 0) model.variants = variants;
126
173
  }
127
- if (ownKeys(variants).length > 0) model.variants = variants;
128
174
  }
129
175
  return { value: model, partial };
130
176
  }
@@ -204,6 +204,54 @@ describe('projectProviderCatalog', () => {
204
204
  expect(result.value.partial).toBe(true);
205
205
  });
206
206
 
207
+ it('projects v2 variant arrays, capability lists, and tiered cost without leaking request payloads', () => {
208
+ const result = projectProviderCatalog({
209
+ providers: [{
210
+ id: 'openai',
211
+ name: 'OpenAI',
212
+ models: {
213
+ 'gpt-5': {
214
+ id: 'gpt-5',
215
+ name: 'GPT 5',
216
+ capabilities: {
217
+ tools: true,
218
+ input: ['text', 'image', 'secret-modality'],
219
+ output: ['text'],
220
+ },
221
+ cost: [
222
+ { tier: { type: 'context', size: 200000 }, input: 9, output: 9, cache: { read: 1, write: 1 } },
223
+ { input: 1, output: 2, cache: { read: 0.1, write: 0.2 }, secret: 'cost-sentinel' },
224
+ ],
225
+ variants: [
226
+ { id: 'low', settings: { reasoningEffort: 'low', apiKey: 'variant-settings-sentinel' }, headers: { Authorization: 'variant-headers-sentinel' } },
227
+ { id: 'high', body: { store: false } },
228
+ { id: 'low' },
229
+ { id: 'constructor' },
230
+ 'max',
231
+ { settings: { token: 'variant-missing-id-sentinel' } },
232
+ ],
233
+ },
234
+ },
235
+ }],
236
+ default: {},
237
+ });
238
+
239
+ expect(result.ok).toBe(true);
240
+ expect(result.value.partial).toBe(false);
241
+ expect(result.value.providers[0].models['gpt-5']).toEqual({
242
+ id: 'gpt-5',
243
+ name: 'GPT 5',
244
+ capabilities: {
245
+ toolcall: true,
246
+ input: { text: true, image: true },
247
+ output: { text: true },
248
+ },
249
+ cost: { input: 1, output: 2, cache: { read: 0.1, write: 0.2 } },
250
+ variants: { low: {}, high: {}, max: {} },
251
+ });
252
+ expect(JSON.stringify(result.value)).not.toContain('sentinel');
253
+ });
254
+
207
255
  it('treats empty/null release_date as absent without marking the catalog partial', () => {
208
256
  const catalog = safeCatalog();
209
257
  catalog.providers[0].models['gpt-5'].release_date = '';