@openchambery/web 2.0.0-beta.1 → 2.0.0-beta.4

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 (287) hide show
  1. package/README.md +15 -11
  2. package/bin/cli-opencode.test.js +4 -4
  3. package/bin/cli.js +1 -1
  4. package/bin/lib/cli-startup.js +1 -1
  5. package/bin/lib/cli-startup.test.js +18 -4
  6. package/dist/assets/{AgentAvatar-CLWWNu_Q.js → AgentAvatar-Q1SmFRx2.js} +1 -1
  7. package/dist/assets/AssistantView-CwXkiCAd.js +3 -0
  8. package/dist/assets/{DiagramView-xuSJTnv7.js → DiagramView-BW92schO.js} +1 -1
  9. package/dist/assets/{FadeInOnReveal-Ov0D96d0.js → FadeInOnReveal-BZmwl-zE.js} +1 -1
  10. package/dist/assets/{Icon-DD-BuMfZ.js → Icon-AQPvxMiU.js} +1 -1
  11. package/dist/assets/{MarkdownRenderer-bc_p1H7l.js → MarkdownRenderer-Bv05iDZZ.js} +2 -2
  12. package/dist/assets/{MarkdownRendererImpl-SKi4oG0c.js → MarkdownRendererImpl-C81xqYib.js} +3 -3
  13. package/dist/assets/MarkstreamRendererImpl-CXUCQuKJ.js +3 -0
  14. package/dist/assets/{MobileDetailNavigation-Bnx59U_J.js → MobileDetailNavigation-BMgIu7zc.js} +1 -1
  15. package/dist/assets/{MobileShareBridge-BQlP4J-F.js → MobileShareBridge-BOXGNHmC.js} +2 -2
  16. package/dist/assets/MobileSurface-xuc_z0_G.js +2 -0
  17. package/dist/assets/{MultiRunWindow-ChZGob0v.js → MultiRunWindow-B5At2Z95.js} +1 -1
  18. package/dist/assets/{OnboardingScreen-DtQJxZG-.js → OnboardingScreen-bsPLgz4r.js} +1 -1
  19. package/dist/assets/OverlayScrollbar-4wp4migh.js +2 -0
  20. package/dist/assets/SettingsView-CJ6tcH5_.js +25 -0
  21. package/dist/assets/{SettingsWindow-DfnsFa8y.js → SettingsWindow-CMtX2bMl.js} +1 -1
  22. package/dist/assets/{TerminalView-Dh9MWCpS.js → TerminalView-Dvr-ysTS.js} +1 -1
  23. package/dist/assets/{ToolOutputDialog-BejmjrRk.js → ToolOutputDialog-uH1ZZDSS.js} +2 -2
  24. package/dist/assets/appThemeRegistry-DK7q2juD.js +1 -0
  25. package/dist/assets/{assistant-attachment-cache-C0aRnFkj.js → assistant-attachment-cache-DphJleHr.js} +1 -1
  26. package/dist/assets/{button-D-rATN7w.js → button-CcNJUxUd.js} +1 -1
  27. package/dist/assets/collapsible-ZmZ6rLWs.js +3 -0
  28. package/dist/assets/context-menu-B2LXJgXL.js +1 -0
  29. package/dist/assets/{desktopHosts-B1ixEylr.js → desktopHosts-C6HrP0jq.js} +1 -1
  30. package/dist/assets/{desktopRelayRestore-4JmFUw8r.js → desktopRelayRestore-DdVBp45U.js} +1 -1
  31. package/dist/assets/{diagram-DQf7Y_uR.js → diagram-CxTs9hCQ.js} +1 -1
  32. package/dist/assets/{dialog-bfbvR4VH.js → dialog-KMVL9QKF.js} +1 -1
  33. package/dist/assets/es-CN3E_zXj.js +15 -0
  34. package/dist/assets/{fileMentionTouchSelection-BvrNCroG.js → fileMentionTouchSelection-7RIwlpkB.js} +1 -1
  35. package/dist/assets/{fileQueries-DQc8EJUf.js → fileQueries-CjdBRy8y.js} +1 -1
  36. package/dist/assets/fr-9zZvQZD2.js +13 -0
  37. package/dist/assets/gitApi-yuWg9BN4.js +10 -0
  38. package/dist/assets/{imageSource-BlAJJUEI.js → imageSource-9vQBq3zp.js} +1 -1
  39. package/dist/assets/{input-8r6F_Fza.js → input-CrIvk3HZ.js} +1 -1
  40. package/dist/assets/insertionBoundaries-BiUCSkx-.js +1 -0
  41. package/dist/assets/ja-Dnjk_82N.js +15 -0
  42. package/dist/assets/ko-BxCEE99C.js +15 -0
  43. package/dist/assets/{main-CCE_4y5F.js → main-C9mIBo77.js} +2 -2
  44. package/dist/assets/main-DiL6w6KF.js +169 -0
  45. package/dist/assets/markdown-worker-bS5OgGO3.js +2 -0
  46. package/dist/assets/{markdownHeightCache-1Qo6y6IJ.js → markdownHeightCache-BmXVY_gc.js} +1 -1
  47. package/dist/assets/{markdownTheme-DOfGg-A7.js → markdownTheme-CKac3wKC.js} +1 -1
  48. package/dist/assets/mcpQueries-C7jknHV8.js +1 -0
  49. package/dist/assets/miniChat-CwtUaElU.js +2 -0
  50. package/dist/assets/mobile-DB-6--ws.js +2 -0
  51. package/dist/assets/multirun-TAsxFI8e.js +4 -0
  52. package/dist/assets/{persistence-Ce3AnpEr.js → persistence-56kq8Z4V.js} +2 -2
  53. package/dist/assets/pl-CNNsWnPM.js +15 -0
  54. package/dist/assets/platform-C13fMVEs.js +6 -0
  55. package/dist/assets/pt-BR-BZB2DJMp.js +15 -0
  56. package/dist/assets/{relay-image-stream-DM7atqJs.js → relay-image-stream-DrdVj99c.js} +1 -1
  57. package/dist/assets/renderElectronMiniChatApp-CGj0MNRU.js +2 -0
  58. package/dist/assets/renderMobileApp-CGMMqbsO.js +28 -0
  59. package/dist/assets/runtime-fetch-Fs9ZV2V8.js +1 -0
  60. package/dist/assets/{runtimeConfig-BMvqa5we.js → runtimeConfig-BEANkvOd.js} +1 -1
  61. package/dist/assets/runtimeEndpointReset-A_ZBUJFS.js +147 -0
  62. package/dist/assets/sessionChangeSummary-qOLrP9fw.js +2 -0
  63. package/dist/assets/{sessionLookup-gh-hVRIc.js → sessionLookup-34XFmP9C.js} +1 -1
  64. package/dist/assets/{sortable-tabs-strip-CudoSgV4.js → sortable-tabs-strip-DyEV0Heg.js} +1 -1
  65. package/dist/assets/src-ubCWXZhR.css +2 -0
  66. package/dist/assets/store-DLCiZaA6.js +15 -0
  67. package/dist/assets/{terminalApi-DiF6JmBP.js → terminalApi-CXaBEoa_.js} +1 -1
  68. package/dist/assets/textarea-BBOlRI9O.js +1 -0
  69. package/dist/assets/{tooltip-CQvpK-UV.js → tooltip-CPI4fr1a.js} +1 -1
  70. package/dist/assets/uk-rwQrxeYM.js +15 -0
  71. package/dist/assets/{url-_z7evzdK.js → url-DRDQXjyX.js} +1 -1
  72. package/dist/assets/{useAppFontEffects-Cpmpo7Wb.js → useAppFontEffects-CiDe42I5.js} +57 -43
  73. package/dist/assets/{useAssistantUIStore-CMutVh9B.js → useAssistantUIStore-asNG6K7n.js} +1 -1
  74. package/dist/assets/useDesktopWindowControlsLayout-BlizAlOt.js +1 -0
  75. package/dist/assets/useEffectiveDirectory-C_CouL5v.js +1 -0
  76. package/dist/assets/{useFontPreferences-DcbXQOkc.js → useFontPreferences-B0oUZAiB.js} +1 -1
  77. package/dist/assets/useMobileNavigationStore-DfPClaW-.js +414 -0
  78. package/dist/assets/{useRuntimeAPIs-DSLXJybW.js → useRuntimeAPIs-DwLtO0c_.js} +1 -1
  79. package/dist/assets/useSessionAutoCleanup-DtrfbxAp.js +2 -0
  80. package/dist/assets/{useThemeSystem-DMzWVJaW.js → useThemeSystem-BlNUWH47.js} +1 -1
  81. package/dist/assets/useUIStore-CQYKJnrg.js +1 -0
  82. package/dist/assets/{useWorkerHighlightedLines-Bqn4AiBL.js → useWorkerHighlightedLines-CPNYz6Wf.js} +2 -2
  83. package/dist/assets/{vendor-base-ui-CnHfUmDN.js → vendor-base-ui-CDjyofeD.js} +1 -1
  84. package/dist/assets/{vendor-cmdk-CeAGfrLo.js → vendor-cmdk-BFH0UpXX.js} +1 -1
  85. package/dist/assets/{vendor-dnd-kit-accessibility-BY5LhhUB.js → vendor-dnd-kit-accessibility-BrR3AKvM.js} +1 -1
  86. package/dist/assets/{vendor-dnd-kit-core-CvWxUPdb.js → vendor-dnd-kit-core-CNfdvk6H.js} +1 -1
  87. package/dist/assets/{vendor-dnd-kit-sortable-hHdP9lLb.js → vendor-dnd-kit-sortable-DQUaTeGj.js} +1 -1
  88. package/dist/assets/{vendor-framer-motion-DFy_BSVd.js → vendor-framer-motion-4dogsUk3.js} +1 -1
  89. package/dist/assets/{vendor-legendapp-list-WE32lwNk.js → vendor-legendapp-list-BU7MdPZR.js} +1 -1
  90. package/dist/assets/{vendor-markstream-react-DX55XLGO.js → vendor-markstream-react-qHC2FykU.js} +3 -3
  91. package/dist/assets/{vendor-pierre-diffs-DX7XTPG3.js → vendor-pierre-diffs-CUfqC003.js} +1 -1
  92. package/dist/assets/{vendor-react-DLPElpoQ.js → vendor-react-C94A0AHl.js} +1 -1
  93. package/dist/assets/{vendor-react-drawio-ECtEwvbc.js → vendor-react-drawio-FVlWqKVE.js} +1 -1
  94. package/dist/assets/{vendor-reactuses-core-BnW6GxJt.js → vendor-reactuses-core-C2A3EjUi.js} +1 -1
  95. package/dist/assets/{vendor-sonner-DVzioF3d.js → vendor-sonner-DNqHmUQs.js} +1 -1
  96. package/dist/assets/{vendor-stream-diffs-DWy3xSmp.js → vendor-stream-diffs-CwbKsmlv.js} +2 -2
  97. package/dist/assets/{vendor-tanstack-react-query-D7pys_c9.js → vendor-tanstack-react-query-D0iFK57C.js} +1 -1
  98. package/dist/assets/{vendor-tanstack-react-virtual-tlDgH6PG.js → vendor-tanstack-react-virtual-B2kV6cnT.js} +1 -1
  99. package/dist/assets/{vendor-zustand-B4dlGEM2.js → vendor-zustand-BqLKf6ZY.js} +1 -1
  100. package/dist/assets/zh-CN-BvmBDnkD.js +15 -0
  101. package/dist/assets/zh-TW-9wcHTX0y.js +15 -0
  102. package/dist/index.html +13 -13
  103. package/dist/mini-chat.html +13 -13
  104. package/dist/mobile.html +13 -13
  105. package/package.json +1 -1
  106. package/server/index.js +327 -62
  107. package/server/lib/assistants/DOCUMENTATION.md +14 -9
  108. package/server/lib/assistants/contracts.js +11 -1
  109. package/server/lib/assistants/projection-history.test.js +265 -18
  110. package/server/lib/assistants/routes.js +6 -0
  111. package/server/lib/assistants/service.js +417 -231
  112. package/server/lib/assistants/service.test.js +392 -148
  113. package/server/lib/conversations/DOCUMENTATION.md +1 -1
  114. package/server/lib/conversations/service.js +1 -0
  115. package/server/lib/conversations/service.test.js +16 -0
  116. package/server/lib/conversations/validation.js +11 -1
  117. package/server/lib/event-stream/DOCUMENTATION.md +3 -1
  118. package/server/lib/event-stream/directory-ws-bridge.js +13 -2
  119. package/server/lib/event-stream/global-hub.js +49 -4
  120. package/server/lib/event-stream/reasoning-projection.js +16 -1
  121. package/server/lib/event-stream/reasoning-projection.test.js +15 -0
  122. package/server/lib/event-stream/runtime.js +57 -20
  123. package/server/lib/event-stream/runtime.test.js +112 -0
  124. package/server/lib/llm/DOCUMENTATION.md +33 -9
  125. package/server/lib/llm/catalog.js +1 -1
  126. package/server/lib/llm/completions.js +5 -1
  127. package/server/lib/llm/completions.test.js +3 -3
  128. package/server/lib/llm/generate.js +237 -145
  129. package/server/lib/llm/generate.test.js +201 -46
  130. package/server/lib/llm/routes.js +2 -0
  131. package/server/lib/message-queue/runtime.js +15 -2
  132. package/server/lib/notifications/runtime.js +23 -5
  133. package/server/lib/notifications/runtime.test.js +11 -0
  134. package/server/lib/opencode/DOCUMENTATION.md +85 -17
  135. package/server/lib/opencode/agent-document.d.ts +28 -0
  136. package/server/lib/opencode/agent-document.js +280 -0
  137. package/server/lib/opencode/agent-document.test.js +137 -0
  138. package/server/lib/opencode/agents.js +96 -0
  139. package/server/lib/opencode/auth-state-runtime.js +5 -0
  140. package/server/lib/opencode/bootstrap-runtime.js +2 -0
  141. package/server/lib/opencode/config-entity-routes.js +42 -99
  142. package/server/lib/opencode/config-entity-routes.test.js +107 -0
  143. package/server/lib/opencode/config-hot-reload.integration.test.js +105 -0
  144. package/server/lib/opencode/ensure-cli.js +1 -2
  145. package/server/lib/opencode/env-runtime.js +40 -26
  146. package/server/lib/opencode/env-runtime.test.js +10 -17
  147. package/server/lib/opencode/feature-routes-runtime.js +43 -4
  148. package/server/lib/opencode/feature-routes-runtime.test.js +18 -0
  149. package/server/lib/opencode/http-server-connections.js +98 -0
  150. package/server/lib/opencode/http-server-connections.test.js +321 -0
  151. package/server/lib/opencode/lifecycle.js +349 -39
  152. package/server/lib/opencode/lifecycle.test.js +322 -0
  153. package/server/lib/opencode/managed-capabilities-runtime.js +15 -2
  154. package/server/lib/opencode/managed-capabilities-runtime.test.js +1 -0
  155. package/server/lib/opencode/openchamber-routes.js +7 -1
  156. package/server/lib/opencode/opencode2-pin.js +4 -4
  157. package/server/lib/opencode/opencode2-pin.test.js +1 -0
  158. package/server/lib/opencode/opencode2-sidecar.e2e.test.js +127 -4
  159. package/server/lib/opencode/owned-runtime-upgrade.js +431 -0
  160. package/server/lib/opencode/owned-runtime-upgrade.test.js +160 -0
  161. package/server/lib/opencode/plugin-routes.js +3 -18
  162. package/server/lib/opencode/plugin-routes.test.js +9 -9
  163. package/server/lib/opencode/provider-catalog.js +58 -12
  164. package/server/lib/opencode/provider-catalog.test.js +48 -0
  165. package/server/lib/opencode/proxy.js +252 -46
  166. package/server/lib/opencode/proxy.test.js +235 -2
  167. package/server/lib/opencode/routes.js +296 -62
  168. package/server/lib/opencode/routes.test.js +278 -12
  169. package/server/lib/opencode/runtime-contract.js +401 -0
  170. package/server/lib/opencode/runtime-contract.test.js +214 -0
  171. package/server/lib/opencode/server-opencode-fetch.js +242 -0
  172. package/server/lib/opencode/server-opencode-fetch.test.js +130 -0
  173. package/server/lib/opencode/server-utils-runtime.js +33 -0
  174. package/server/lib/opencode/shared-service.integration.test.js +66 -0
  175. package/server/lib/opencode/shared-service.js +147 -0
  176. package/server/lib/opencode/shared-service.test.js +93 -0
  177. package/server/lib/opencode/shared.js +3 -3
  178. package/server/lib/opencode/shutdown-runtime.js +15 -6
  179. package/server/lib/opencode/shutdown-runtime.test.js +49 -1
  180. package/server/lib/opencode/skill-routes.js +20 -33
  181. package/server/lib/opencode/skill-routes.test.js +35 -2
  182. package/server/lib/opencode/skills.test.js +15 -0
  183. package/server/lib/opencode/startup-pipeline-runtime.js +4 -0
  184. package/server/lib/opencode/static-routes-runtime.js +3 -1
  185. package/server/lib/opencode/static-routes-runtime.test.js +33 -0
  186. package/server/lib/opencode/v2-client.js +14 -3
  187. package/server/lib/opencode/v2-plugin-host-shim/index.mjs +155 -0
  188. package/server/lib/opencode/v2-plugin-host-shim/package.json +4 -0
  189. package/server/lib/permission-auto-accept/DOCUMENTATION.md +5 -5
  190. package/server/lib/permission-auto-accept/runtime.js +14 -7
  191. package/server/lib/permission-auto-accept/runtime.test.js +27 -12
  192. package/server/lib/relay/reasoning-projection.e2e.test.ts +22 -7
  193. package/server/lib/scheduled-tasks/DOCUMENTATION.md +8 -0
  194. package/server/lib/scheduled-tasks/runtime.js +52 -4
  195. package/server/lib/scheduled-tasks/runtime.test.js +80 -1
  196. package/server/lib/session-goal/DOCUMENTATION.md +113 -13
  197. package/server/lib/session-goal/routes.js +9 -0
  198. package/server/lib/session-goal/runtime.js +1579 -117
  199. package/server/lib/session-goal/runtime.test.js +1453 -84
  200. package/server/lib/session-index/DOCUMENTATION.md +18 -15
  201. package/server/lib/session-index/event-ingest.js +89 -16
  202. package/server/lib/session-index/event-ingest.test.js +73 -0
  203. package/server/lib/session-index/host-authority-snapshot.js +92 -0
  204. package/server/lib/session-index/routes.host-archive.test.js +201 -0
  205. package/server/lib/session-index/routes.js +63 -10
  206. package/server/lib/session-index/routes.test.js +8 -8
  207. package/server/lib/session-index/service.js +7 -1
  208. package/server/lib/session-index/sync-runtime.js +161 -34
  209. package/server/lib/session-index/sync-runtime.test.js +155 -1
  210. package/server/lib/session-metadata/DOCUMENTATION.md +61 -16
  211. package/server/lib/session-metadata/routes.js +108 -9
  212. package/server/lib/session-metadata/routes.test.js +47 -2
  213. package/server/lib/session-metadata/session-archive.d.ts +73 -0
  214. package/server/lib/session-metadata/session-archive.js +654 -0
  215. package/server/lib/session-metadata/session-archive.test.js +359 -0
  216. package/server/lib/session-metadata/session-metadata-store.d.ts +36 -0
  217. package/server/lib/session-metadata/session-metadata-store.js +212 -72
  218. package/server/lib/session-metadata/session-metadata-store.test.js +205 -10
  219. package/server/lib/session-metadata/session-projection.d.ts +41 -0
  220. package/server/lib/session-metadata/session-projection.js +255 -0
  221. package/server/lib/session-metadata/session-projection.test.js +64 -0
  222. package/server/lib/session-metadata/system-session.js +55 -0
  223. package/server/lib/session-metadata/system-session.test.js +55 -0
  224. package/server/lib/session-title/DOCUMENTATION.md +40 -7
  225. package/server/lib/session-title/native-runtime.test.js +167 -0
  226. package/server/lib/session-title/runtime.js +67 -42
  227. package/server/lib/session-title/session-access.js +46 -0
  228. package/server/lib/session-title/session-access.test.js +91 -0
  229. package/server/lib/session-turn-pages/DOCUMENTATION.md +9 -8
  230. package/server/lib/session-turn-pages/routes.js +17 -102
  231. package/server/lib/session-turn-pages/routes.test.js +281 -0
  232. package/server/lib/session-turn-pages/session-message-projection.d.ts +13 -0
  233. package/server/lib/session-turn-pages/session-message-projection.js +281 -0
  234. package/server/lib/small-model/DOCUMENTATION.md +101 -147
  235. package/server/lib/small-model/catalog.js +31 -51
  236. package/server/lib/small-model/catalog.test.js +65 -10
  237. package/server/lib/small-model/custom-api.js +68 -0
  238. package/server/lib/small-model/custom-api.test.js +64 -0
  239. package/server/lib/small-model/index.js +124 -240
  240. package/server/lib/small-model/resolve.js +35 -120
  241. package/server/lib/small-model/resolve.test.js +20 -110
  242. package/server/lib/small-model/routes.js +1 -3
  243. package/server/lib/small-model/summary-settings.test.js +157 -253
  244. package/server/opencode-proxy.test.js +2 -0
  245. package/dist/assets/AssistantView-BTCkm8yk.js +0 -3
  246. package/dist/assets/MarkstreamRendererImpl-CnkodGJW.js +0 -3
  247. package/dist/assets/MobileSurface-BXLeiZ4d.js +0 -2
  248. package/dist/assets/OverlayScrollbar-pMwxaCca.js +0 -2
  249. package/dist/assets/SettingsView-B5I0KDTZ.js +0 -25
  250. package/dist/assets/appThemeRegistry-COGfxTFV.js +0 -1
  251. package/dist/assets/collapsible-BXRd5_Hr.js +0 -1
  252. package/dist/assets/context-menu-jGtH6fR9.js +0 -1
  253. package/dist/assets/es-c52LTHHe.js +0 -15
  254. package/dist/assets/fr-PisFbUE8.js +0 -13
  255. package/dist/assets/gitApi-ButwzQ0N.js +0 -9
  256. package/dist/assets/insertionBoundaries-DGs7S5zv.js +0 -1
  257. package/dist/assets/ja-C8Ikun3Z.js +0 -15
  258. package/dist/assets/ko-ClFys5o2.js +0 -15
  259. package/dist/assets/main-Dn9rpsgl.js +0 -169
  260. package/dist/assets/markdown-worker-CptoICmq.js +0 -2
  261. package/dist/assets/miniChat-BpjxVqgg.js +0 -2
  262. package/dist/assets/mobile-nMJCaNq1.js +0 -2
  263. package/dist/assets/multirun-BvSG94mW.js +0 -4
  264. package/dist/assets/pl-CnaKWN5F.js +0 -15
  265. package/dist/assets/platform-CWTIp02q.js +0 -4
  266. package/dist/assets/projectMeta-DOe49dM_.js +0 -3
  267. package/dist/assets/pt-BR-s8OpfRI6.js +0 -15
  268. package/dist/assets/renderElectronMiniChatApp-R6dKh79f.js +0 -2
  269. package/dist/assets/renderMobileApp-y-S8y8v_.js +0 -28
  270. package/dist/assets/runtime-fetch-zIalUnbb.js +0 -1
  271. package/dist/assets/runtimeEndpointReset-B6BxhvR0.js +0 -147
  272. package/dist/assets/sessionChangeSummary-VVBlEXuh.js +0 -2
  273. package/dist/assets/src-BzX5UI-c.css +0 -2
  274. package/dist/assets/store-DJczmczv.js +0 -15
  275. package/dist/assets/textarea-3XR8sUfy.js +0 -1
  276. package/dist/assets/uk-CaX0iqkB.js +0 -15
  277. package/dist/assets/useDesktopWindowControlsLayout-B1GX59-L.js +0 -1
  278. package/dist/assets/useEffectiveDirectory-CN6JoCFw.js +0 -1
  279. package/dist/assets/useMobileNavigationStore-BVjFtXSy.js +0 -414
  280. package/dist/assets/useSessionAutoCleanup-BLjymaFt.js +0 -2
  281. package/dist/assets/useUIStore-Bxv3f23A.js +0 -1
  282. package/dist/assets/zh-CN-20MYEjha.js +0 -15
  283. package/dist/assets/zh-TW-DiN04qTw.js +0 -15
  284. package/server/lib/small-model/call.js +0 -427
  285. package/server/lib/small-model/call.test.js +0 -382
  286. package/server/lib/small-model/opencode-session.js +0 -183
  287. package/server/lib/small-model/opencode-session.test.js +0 -147
@@ -1,4 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-heic2any-CUPf3g2A.js","assets/rolldown-runtime-C0FnF6B9.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{C as t,D as n,k as r}from"./runtime-auth-D66yq6ie.js";import{c as i,f as a,i as o,n as s,r as c,s as l}from"./runtime-switch-LvWDU-SL.js";import{n as u}from"./runtime-fetch-zIalUnbb.js";import{Cn as d,It as f,Pt as p,Qt as ee,Vt as m,ct as h,ht as te,it as ne,lt as re,r as g,tn as ie}from"./persistence-Ce3AnpEr.js";import{a as ae,r as oe}from"./vendor-zustand-B4dlGEM2.js";import{n as se,r as ce,t as le}from"./vendor-opencode-client-BOe2qpQb.js";import{b as ue}from"./useUIStore-Bxv3f23A.js";import{i as de}from"./vendor-pathe-vBmvQE8f.js";import{o as fe}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";var pe=(e,t)=>e!==t;function _(e){return{...e,directory:e.location?.directory}}function me(e){let t={};for(let n of e){let e=n;!e||e.type!==`document`||!e.info||typeof e.info!=`object`||Object.assign(t,e.info)}return t}var he=new Set([`image/heic`,`image/heif`]),ge=!1,_e=()=>{let e=globalThis.window?.Capacitor;return e&&typeof e==`object`?e:null},ve=e=>he.has((e.type||``).toLowerCase()),ye=async e=>{let t=new Uint8Array(await e.arrayBuffer()),n=``,r=32768;for(let e=0;e<t.byteLength;e+=r){let i=t.subarray(e,Math.min(e+r,t.byteLength));n+=String.fromCharCode(...i)}return btoa(n)},be=(e,t)=>{let n=atob(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return new Blob([r],{type:t})},xe=async e=>{if(!ve(e)||ge)return null;let t=_e();if(!t||typeof t.isNativePlatform!=`function`||!t.isNativePlatform())return null;let n=t.Plugins?.OpenChamberMedia?.transcode;if(typeof n!=`function`)return null;try{let t=await n({data:await ye(e),mime:e.type.toLowerCase(),quality:.9});if(typeof t?.data!=`string`||!t.data)return null;let r=typeof t.mime==`string`&&t.mime?t.mime:`image/jpeg`;return be(t.data,r)}catch(e){return ge=!0,console.warn(`Native HEIC transcode failed`,e),null}},Se=e=>e.trim().toLowerCase(),Ce=e=>e.source===`local`||e.source===`server`||e.source===`vscode`,we=(e,t)=>{if(!e||!e.includes(`[`)||t.length===0)return[];let n=new Set(t.map(Se)),r=[],i=0;for(;i<e.length;){let t=e.indexOf(`[`,i);if(t===-1)break;let a=e.indexOf(`]`,t+1);if(a===-1)break;if(e[a+1]!==`(`){let i=te(e.slice(t+1,a)).trim();n.has(Se(i))&&r.push({start:t,end:a+1})}i=a+1}return r},Te=(e,t)=>{let n=t.start,r=t.end;return r<e.length&&/\s/.test(e[r])?r+=1:n>0&&/\s/.test(e[n-1])&&--n,{start:n,end:r}},Ee=(e,t,n,r)=>{let i=we(e,t);if(i.length===0)return{text:e,mentions:[...n],composerReferences:r===void 0?void 0:[...r],changed:!1};let a=e,o=[...n],s=r===void 0?[]:[...r];for(let e=i.length-1;e>=0;--e){let{start:t,end:n}=Te(a,i[e]),r=n-t;a=`${a.slice(0,t)}${a.slice(n)}`,o=o.flatMap(e=>e.range.end<=t?[e]:e.range.start>=n?[{...e,range:{start:e.range.start-r,end:e.range.end-r}}]:[]),s=s.flatMap(e=>e.end<=t?[e]:e.start>=n?[{...e,start:e.start-r,end:e.end-r}]:[])}return{text:a,mentions:o,composerReferences:r===void 0?void 0:s,changed:!0}},De=new Set([`image`,`screenshot`,`screen-shot`,`clipboard`,`pasted-image`,`pastedimage`,`untitled`,`unknown`,`file`,`blob`]),Oe={"image/avif":`avif`,"image/bmp":`bmp`,"image/gif":`gif`,"image/heic":`heic`,"image/heif":`heif`,"image/jpeg":`jpg`,"image/jpg":`jpg`,"image/png":`png`,"image/svg+xml":`svg`,"image/tiff":`tiff`,"image/webp":`webp`},v=e=>e.trim().toLowerCase(),ke=e=>e.charCodeAt(0)<32||`<>:"/\\|?*[]`.includes(e),Ae=e=>{let t=e.replace(/\\/g,`/`).split(`/`).pop()??``;return Array.from(t).map(e=>ke(e)?`-`:e).join(``).replace(/\s+/g,` `).replace(/-+/g,`-`).trim()},je=e=>Oe[e?.trim().toLowerCase()??``]??`png`,Me=e=>{let t=Ae(e.name),n=je(e.type),r=t.lastIndexOf(`.`);if(r>0&&r<t.length-1){let e=t.slice(r+1).toLowerCase();if(/^[a-z0-9]{1,10}$/.test(e))return{base:t.slice(0,r).trim()||`image`,ext:e}}return{base:t.trim()||`image`,ext:n}},Ne=e=>{let{base:t}=Me({name:e}),n=t.trim().toLowerCase().replace(/[\s_]+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``);if(De.has(n))return!0;let r=n.replace(/-\(\d+\)$/g,``);return r!==n&&De.has(r)?!0:/^(image|file|unknown|untitled|blob)-\d+$/.test(n)},y=(e,t)=>`${e}.${t}`,Pe=(e,t,n)=>{let r=y(e,t);if(!n.has(v(r)))return r;for(let r=2;r<2**53-1;r+=1){let i=y(`${e}-${r}`,t);if(!n.has(v(i)))return i}return y(`${e}-${Date.now()}`,t)},Fe=(e,t)=>{for(let n=1;n<2**53-1;n+=1){let r=y(`image-${n}`,e);if(!Array.from(t).some(e=>e.startsWith(`image-${n}.`))&&!t.has(v(r)))return r}return y(`image-${Date.now()}`,e)},Ie=(e,t)=>{let n=new Set(t.map(v));return e.map(e=>{let{base:t,ext:r}=Me(e),i=Ne(y(t,r))?Fe(r,n):Pe(t,r,n);return n.add(v(i)),i})},Le=e=>e.map(e=>re(e)).join(` `),Re=(e,t,n)=>{if(t===n)return[];let r=[];for(let i of e){let e=[re(i),`[${i}]`],a=e.some(e=>t.includes(e)),o=e.some(e=>n.includes(e));a&&!o&&r.push(i)}return r},ze=(e,t)=>{if(t.length>=e.length)return null;let n=0,r=Math.min(e.length,t.length);for(;n<r&&e[n]===t[n];)n+=1;let i=0;for(;i<e.length-n&&i<t.length-n&&e[e.length-1-i]===t[t.length-1-i];)i+=1;let a=e.length-i;return t.length-i!==n||a<=n?null:{start:n,end:a}},Be=(e,t,n)=>{if(e===t||n.length===0)return null;let r=[...n],i=ze(e,t);if(i){let t=Ze(e,r,{key:`Backspace`,selectionStart:i.start,selectionEnd:i.end});if(t)return t}let a=Re(r,e,t);return a.length===0?null:{text:t,caret:t.length,removedFilenames:a}},Ve=e=>e.replaceAll(`[${h}`,`[`),He=/\.(?:png|jpe?g|gif|webp|svg|avif|bmp|heic|heif|tiff?)$/i,Ue=e=>{let t=e.trim();return t.startsWith(`/`)||/^[A-Za-z]:[\\/]/.test(t)||t.startsWith(`\\\\`)},We=(e,t)=>{let n=e;for(let e of t){let t=e.filename.trim(),r=e.path.trim();if(!t||!r||t===r||Ue(t)||!He.test(t)&&!He.test(r))continue;let i=`[${r}]`;n=n.split(re(t)).join(i).split(`[${t}]`).join(i)}return n},Ge=(e,t)=>{let n=e;for(let e of t??[]){if(e.source!==`vscode`||e.vscodeSource!==`selection`||!e.vscodePath)continue;let t=e.filename.match(/:(\d+(?:-\d+)?)$/)?.[1];if(!t)continue;let r=`[${e.vscodePath}:${t}]`;n=n.split(re(e.filename)).join(r).split(`[${e.filename}]`).join(r)}return n},Ke=e=>e.mime===`text/plain`&&typeof e.filename==`string`&&/:\d+(?:-\d+)?$/.test(e.filename),qe=`application/x-directory`,Je=e=>typeof e==`string`&&e.trim().toLowerCase()===`application/x-directory`,Ye=e=>typeof e==`string`&&/[/\\]$/.test(e.trim()),Xe=(e,t,n)=>{if(t===`Backspace`){let t=n;for(;t>0&&/\s/.test(e[t-1]);)--t;for(;t>0&&!/\s/.test(e[t-1]);)--t;return{start:t,end:n}}let r=n;for(;r<e.length&&/\s/.test(e[r]);)r+=1;for(;r<e.length&&!/\s/.test(e[r]);)r+=1;return{start:n,end:r}},Ze=(e,t,n)=>{let r=Math.max(0,Math.min(n.selectionStart,e.length)),i=Math.max(r,Math.min(n.selectionEnd,e.length)),a;if(a=r===i?n.altKey?Xe(e,n.key,r):n.key===`Backspace`?{start:Math.max(0,r-1),end:r}:{start:r,end:Math.min(e.length,r+1)}:{start:r,end:i},a.start===a.end)return null;let o=we(e,t).filter(e=>e.start<a.end&&e.end>a.start);if(o.length===0)return null;let s=Math.min(a.start,...o.map(e=>e.start)),c=Math.max(a.end,...o.map(e=>e.end));return c<e.length&&/\s/.test(e[c])&&(s===0||/\s/.test(e[s-1]))?c+=1:c===e.length&&s>0&&/\s/.test(e[s-1])&&--s,{text:`${e.slice(0,s)}${e.slice(c)}`,caret:s,removedFilenames:o.map(t=>te(e.slice(t.start+1,t.end-1)).trim())}},b=class extends Error{status;code;constructor(e,t,n=`Failed to upload prompt attachment`){super(n),this.name=`PromptAttachmentUploadError`,this.status=e,this.code=t}},Qe=`file://`,$e=e=>{let t=e.trim();if(t.toLowerCase().startsWith(Qe))return t;let n=de(t).split(`/`).map(e=>/^[A-Za-z]:$/.test(e)?e:encodeURIComponent(e)).join(`/`);return/^[A-Za-z]:/.test(n)?`${Qe}/${n}`:`${Qe}${n}`},et=e=>{let t=e.trim();if(!t.toLowerCase().startsWith(Qe))return t;let n=t.slice(7);n.toLowerCase().startsWith(`localhost/`)&&(n=n.slice(9));let r=n.split(`/`).map(e=>{if(/^[A-Za-z]:$/.test(e))return e;try{return decodeURIComponent(e)}catch{return e}}).join(`/`);return/^\/[A-Za-z]:/.test(r)?r.slice(1):r},tt=async e=>[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,await e.arrayBuffer()))].map(e=>e.toString(16).padStart(2,`0`)).join(``),nt=e=>typeof e==`object`&&!!e&&!Array.isArray(e),rt=async e=>{let t;try{t=await e.json()}catch{throw new b(e.status,`unavailable`)}if(!nt(t)||typeof t.path!=`string`||!t.path)throw new b(e.status,`unavailable`);let n=typeof t.mime==`string`&&t.mime?t.mime:`application/octet-stream`,r=typeof t.size==`number`&&Number.isSafeInteger(t.size)?t.size:0,i=typeof t.sha256==`string`?t.sha256:``;return{path:t.path,url:$e(t.path),mime:n,size:r,sha256:i}},it=e=>{let t=typeof crypto.randomUUID==`function`?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`,n=e?.replace(/[^a-z0-9._-]+/gi,`-`).replace(/^-+|-+$/g,``).slice(0,32);return n?`att-${t}-${n}`:`att-${t}`},at=(e,t)=>{if(!e.startsWith(`data:`))return null;let n=e.indexOf(`,`);if(n===-1)return null;let r=e.slice(5,n),i=e.slice(n+1),a=r.split(`;`,1)[0]?.trim()||t||`application/octet-stream`;try{if(r.toLowerCase().includes(`;base64`)){let e=atob(i),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return new Blob([t],{type:a})}return new Blob([decodeURIComponent(i)],{type:a})}catch{return null}},ot=e=>e.startsWith(`data:`)||e.startsWith(`blob:`),st=async e=>{let t=e.mime||e.body.type||`application/octet-stream`,n=e.body.type===t?e.body:new Blob([e.body],{type:t});if(!Number.isSafeInteger(n.size)||n.size<0||n.size>26214400)throw new b(413,`too-large`);let r=await tt(n),i=it(e.filename),a;try{a=await u(`/api/fs/prompt-attachments/${encodeURIComponent(i)}`,{method:`PUT`,headers:{"Content-Type":t,"Content-Length":String(n.size),"X-OpenChamber-Content-Length":String(n.size),"X-OpenChamber-Sha256":r,"X-OpenChamber-Mime":t,...e.filename?{"X-OpenChamber-Filename":encodeURIComponent(e.filename)}:{}},body:n,signal:e.signal})}catch{throw new b(0,`unavailable`)}if(a.status===413)throw new b(413,`too-large`);if(!a.ok)throw new b(a.status,a.status>=500||a.status===0?`unavailable`:`rejected`);let o=await rt(a);if(o.size!==n.size)throw new b(a.status,`unavailable`);return{...o,mime:t}},ct=500,lt=()=>{if(typeof window>`u`)return!1;try{return new URLSearchParams(window.location.search).get(`startupTrace`)===`1`||window.localStorage?.getItem(`OPENCHAMBER_STARTUP_TRACE`)===`1`}catch{return!1}},ut=()=>lt(),x=(e,t)=>{if(!lt())return;let n=typeof performance<`u`?performance.now():Date.now();window.__OPENCHAMBER_STARTUP_TRACE_START__??=n,window.__OPENCHAMBER_STARTUP_TRACE__??=[],window.__OPENCHAMBER_STARTUP_TRACE__.push({t:Math.round(n-window.__OPENCHAMBER_STARTUP_TRACE_START__),name:e,...t?{data:t}:{}}),window.__OPENCHAMBER_STARTUP_TRACE__.length>ct&&window.__OPENCHAMBER_STARTUP_TRACE__.splice(0,window.__OPENCHAMBER_STARTUP_TRACE__.length-ct)};typeof window<`u`&&(window.__OPENCHAMBER_STARTUP_TRACE_SUMMARY__=()=>{let e=typeof window<`u`?window.__OPENCHAMBER_STARTUP_TRACE__??[]:[],t=e.findIndex(e=>e.name===`ModelControls:ready`),n=t>=0?Math.min(e.length,t+8):e.length;return e.slice(0,n).filter(e=>e.name.includes(`checkConnection`)||e.name.includes(`checkHealth`)||e.name.includes(`initializeApp`)||e.name.includes(`initApp`)||e.name.includes(`loadProviders`)||e.name.includes(`loadAgents`)||e.name.includes(`config.defaults`)||e.name.includes(`ModelControls`)||e.name.includes(`activateDirectory`)||e.name.includes(`opencodeClient:setDirectory`))});var dt=async(e,t,n)=>{let r=typeof performance<`u`?performance.now():Date.now();x(`${e}:start`,n);try{let n=await t(),i=typeof performance<`u`?performance.now():Date.now();return x(`${e}:end`,{durationMs:Math.round(i-r)}),n}catch(t){let n=typeof performance<`u`?performance.now():Date.now();throw x(`${e}:error`,{durationMs:Math.round(n-r),error:t instanceof Error?t.message:String(t)}),t}},ft=e=>({kind:`session-inbox`,requestID:e.requestID,queueItemID:e.id,operationID:e.id,messageID:e.id,content:e.payload.text,createdAt:e.timeCreated,delivery:e.delivery,attachmentCount:Array.isArray(e.payload.files)?e.payload.files.length:0}),pt=[],mt=[],ht=(e,t,n)=>{let r={...e};return n.length===0?delete r[t]:r[t]=n,r},S=ae((e,t)=>({bySession:{},remember(t){e(e=>{let n=e.bySession[t.sessionID]??[],r=n.findIndex(e=>e.id===t.id),i={...t,requestID:t.id};if(r>=0){let a=n.slice();return a[r]=i,{bySession:{...e.bySession,[t.sessionID]:a}}}return{bySession:{...e.bySession,[t.sessionID]:[...n,i]}}})},forget(t,n){e(e=>{let r=e.bySession[t];if(!r?.length)return e;let i=r.filter(e=>e.id!==n);return i.length===r.length?e:{bySession:ht(e.bySession,t,i)}})},forgetSession(t){e(e=>{if(!e.bySession[t])return e;let n={...e.bySession};return delete n[t],{bySession:n}})},forgetPromoted(t,n){let r=new Set(n);e(e=>{let n=e.bySession[t];if(!n?.length)return e;let i=n.filter(e=>!r.has(e.id));return i.length===n.length?e:{bySession:ht(e.bySession,t,i)}})},replaceFromAuthority(t,n){e(e=>{let r=n.map(e=>({...e,requestID:e.id}));return{bySession:ht(e.bySession,t,r)}})},updateDelivery(t,n,r){e(e=>{let i=e.bySession[t];if(!i?.length)return e;let a=i.findIndex(e=>e.id===n);if(a<0||i[a].delivery===r)return e;let o=i.slice();return o[a]={...i[a],delivery:r},{bySession:{...e.bySession,[t]:o}}})},list(e){return t().bySession[e]??pt}}));function gt(e,t){S.getState().forget(e,t)}function _t(e,t){S.getState().forgetPromoted(e,t)}function vt(e,t){S.getState().replaceFromAuthority(e,t)}function yt(e,t,n){S.getState().updateDelivery(e,t,n)}function bt(e){return!!e&&typeof e==`object`&&e.kind===`session-inbox`}var xt=`desc`;function C(e){return!w(e)||e.type!==`compaction`?!1:e.status===`running`||e.status===`completed`||e.status===`failed`}function St(e){if(e)return e.find(C)}var Ct=e=>e?e.toLowerCase().includes(`application/json`):!1,wt=e=>e?e.toLowerCase().includes(`text/html`):!1;function w(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function T(e){return typeof e==`string`&&e.length>0?e:void 0}function Tt(e){if(!w(e))return null;let t=T(e.id);return t?{...e,id:t}:null}function Et(e,t,n){return`${e}:${t}:${n}`}function E(e,t,n,r,i=`text`){return i===`reasoning`?{id:Et(t,i,n),sessionID:e,messageID:t,type:`reasoning`,text:r}:{id:Et(t,i,n),sessionID:e,messageID:t,type:`text`,text:r}}function Dt(e){let t=e.content;return Array.isArray(t)?t.flatMap(e=>w(e)&&e.type===`text`&&typeof e.text==`string`?[e.text]:[]).join(`
3
- `):typeof e.output==`string`?e.output:void 0}function Ot(e,t,n){let r=T(n.id)??`${t}:tool`,i=T(n.name)??`tool`,a=w(n.state)?n.state:{},o=T(a.status)??`completed`;return{id:r,sessionID:e,messageID:t,type:`tool`,tool:i,callID:r,state:{status:o===`streaming`?`pending`:o,input:a.input??{},output:Dt(a),error:w(a.error)?T(a.error.message):T(a.error),metadata:w(a.metadata)?a.metadata:{}}}}function kt(e){return w(e)?{created:typeof e.created==`number`?e.created:0,...typeof e.completed==`number`?{completed:e.completed}:{},...typeof e.start==`number`?{start:e.start}:{},...typeof e.end==`number`?{end:e.end}:{}}:{created:0}}function At(e){if(!w(e))return;let t=w(e.cache)?{...typeof e.cache.read==`number`?{read:e.cache.read}:{},...typeof e.cache.write==`number`?{write:e.cache.write}:{}}:void 0,n={...typeof e.input==`number`?{input:e.input}:{},...typeof e.output==`number`?{output:e.output}:{},...typeof e.reasoning==`number`?{reasoning:e.reasoning}:{},...t&&(t.read!==void 0||t.write!==void 0)?{cache:t}:{}};return Object.keys(n).length>0?n:void 0}function D(e,t,n){return{id:t.id,sessionID:e,role:n,time:kt(t.time)}}function jt(e,t){let n=Tt(t);if(!n)return null;let r=n.id,i=T(n.type)??`unknown`;if(i===`idle`||i===`model-switched`||i===`agent-selected`||i===`location-switched`)return null;if(i===`user`){let t=D(e,n,`user`),i=[],a=T(n.text);a&&i.push(E(e,r,0,a));let o=n.files;return Array.isArray(o)&&o.forEach((t,n)=>{if(!w(t))return;let a=T(t.mime)??`application/octet-stream`,o=w(t.source)?t.source:{},s=o.type===`uri`?T(o.uri):void 0,c=T(t.data),l=s||(c?`data:${a};base64,${c}`:``),u={id:`${r}:file:${n}`,sessionID:e,messageID:r,type:`file`,mime:a,filename:T(t.name),url:l};i.push(u)}),{info:t,parts:i}}if(i===`assistant`){let t=D(e,n,`assistant`);if(w(n.model)){t.modelID=T(n.model.id),t.providerID=T(n.model.providerID);let e=T(n.model.variant);(t.modelID||t.providerID||e)&&(t.model={...t.providerID?{providerID:t.providerID}:{},...t.modelID?{modelID:t.modelID}:{},...e?{variant:e}:{}})}let i=T(n.agent);i&&(t.agent=i);let a=T(n.finish);a&&(t.finish=a),w(n.error)&&(t.error={type:T(n.error.type)??`error`,message:T(n.error.message)??``}),typeof n.cost==`number`&&Number.isFinite(n.cost)&&(t.cost=n.cost);let o=At(n.tokens);o&&(t.tokens=o);let s=[],c=Array.isArray(n.content)?n.content:[],l=0,u=0;for(let t of c){if(!w(t))continue;let n=T(t.type);if(n===`text`&&typeof t.text==`string`){s.push(E(e,r,l++,t.text));continue}if(n===`reasoning`&&typeof t.text==`string`){s.push(E(e,r,u++,t.text,`reasoning`));continue}n===`tool`&&s.push(Ot(e,r,t))}return{info:t,parts:s}}if(i===`synthetic`){let t=D(e,n,`user`),i=T(n.text)??T(n.description)??``;return{info:t,parts:i?[E(e,r,0,i)]:[]}}if(i===`system`){let t=D(e,n,`assistant`),i=T(n.text)??T(n.description)??``;return{info:t,parts:i?[E(e,r,0,i)]:[]}}if(i===`compaction`){let t=n.status===`failed`?`failed`:n.status===`completed`?`completed`:`running`,i={...D(e,n,`assistant`),clientRole:`compaction`},a=w(n.error)?{type:T(n.error.type)??`error`,message:T(n.error.message)??``}:void 0;return{info:i,parts:[{id:`${r}:compaction`,sessionID:e,messageID:r,type:`compaction`,status:t,reason:n.reason===`auto`?`auto`:`manual`,...typeof n.summary==`string`?{summary:n.summary}:{},...typeof n.recent==`string`?{recent:n.recent}:{},...a?{error:a}:{}}]}}return{info:D(e,n,`assistant`),parts:[E(e,r,0,T(n.text)??`[${i}]`)]}}function Mt(e,t,n=xt){if(!w(e))throw Error(`session projection: expected JSON object`);if(!Array.isArray(e.data))throw Error(`session projection: data must be an array`);let r=[];for(let n of e.data){let e=jt(t,n);e&&r.push(e)}n===`desc`&&r.reverse();let i=w(e.cursor)?e.cursor:void 0,a=T(i?i.previous:e.cursor);return{records:r,cursor:a,complete:!a,turnCount:r.filter(e=>e.info.role===`user`).length}}async function Nt(e){let t=e.limit??20,n=e.order??`desc`,r=`/api/session/${encodeURIComponent(e.sessionID)}/message`,i={directory:e.directory,limit:String(t),order:n};e.cursor&&(i.cursor=e.cursor);let a=await u(r,{method:`GET`,query:i,signal:e.signal});if(!a.ok)throw Error(`session projection failed (${a.status})`);let o=a.headers.get(`content-type`);if(wt(o))throw Error(`session projection: unexpected HTML response`);Ct(o);let s;try{s=await a.json()}catch{throw Error(`session projection: malformed JSON`)}return Mt(s,e.sessionID,n)}function Pt(e,t){if(!w(e))throw Error(`session context: expected JSON object`);if(!Array.isArray(e.data))throw Error(`session context: data must be an array`);let n=[];for(let r of e.data){let e=jt(t,r);e&&n.push(e)}return{records:n,cursor:void 0,complete:!1,turnCount:n.filter(e=>e.info.role===`user`).length}}async function Ft(e){let t=`/api/session/${encodeURIComponent(e.sessionID)}/context`,n=await u(t,{method:`GET`,query:{directory:e.directory},signal:e.signal});if(!n.ok)throw Error(`session context failed (${n.status})`);if(wt(n.headers.get(`content-type`)))throw Error(`session context: unexpected HTML response`);let r;try{r=await n.json()}catch{throw Error(`session context: malformed JSON`)}return Pt(r,e.sessionID)}function It(e){let t=e.fetched.filter(e=>!!e.info?.id),n=e.previous.filter(e=>!!e.info?.id),r=e.touched??new Set,i=new Map(t.map(e=>[e.info.id,e])),a=new Map(n.map(e=>[e.info.id,e])),o=new Set(t.map(e=>e.info.id)),s=n.findIndex(e=>o.has(e.info.id));if(!e.completeTail)for(let[e,t]of n.entries())i.has(t.info.id)||(s===-1||e<s)&&i.set(t.info.id,t);for(let e of r){let t=a.get(e);t?i.set(e,t):i.delete(e)}let c=[],l=new Set;for(let e of n)!i.has(e.info.id)||l.has(e.info.id)||(c.push(e.info.id),l.add(e.info.id));for(let e of t)!i.has(e.info.id)||l.has(e.info.id)||(c.push(e.info.id),l.add(e.info.id));for(let e of i.keys())l.has(e)||c.push(e);return c.map(e=>i.get(e))}var Lt=e=>e?e.toLowerCase().includes(`application/json`):!1,Rt=e=>e?e.toLowerCase().includes(`text/html`):!1;function O(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function k(e){return typeof e==`string`&&e.length>0?e:void 0}function zt(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Bt(e,t,n){let r=n?`: ${n}`:``,i=Error(`${e} (${t})${r}`);throw i.status=t,i}async function Vt(e){try{return(await e.text()).trim()}catch{return``}}async function Ht(e,t){let n=e.headers.get(`content-type`);if(Rt(n))throw Error(`${t}: unexpected HTML response`);let r;try{r=await e.json()}catch{throw Error(`${t}: malformed JSON`)}if(!Lt(n)&&r==null)throw Error(`${t}: empty response`);return r}var Ut=ae((e,t)=>({runningBySession:{},setRunning(t,n){e(e=>{let r={...e.runningBySession};return n?r[t]=!0:delete r[t],{runningBySession:r}})},isRunning(e){return t().runningBySession[e]===!0},reset(){e({runningBySession:{}})}}));function A(e,t){Ut.getState().setRunning(e,t)}function Wt(e){return Ut.getState().isRunning(e)}function Gt(e){return!Wt(e.sessionID)}function Kt(e){let t=O(e)?e:null,n=t&&O(t.data)?t.data:t;if(!n)throw Error(`session compact: expected inbox item`);let r=k(n.id),i=k(n.sessionID);if(!r||!i)throw Error(`session compact: inbox item missing id`);if(n.type&&n.type!==`compaction`)throw Error(`session compact: expected compaction inbox item`);return{id:r,sessionID:i,type:`compaction`,delivery:n.delivery===`queue`?`queue`:n.delivery===`steer`?`steer`:void 0,timeCreated:zt(n.timeCreated)}}function qt(e){let t=O(e)?e:null,n=t&&Array.isArray(t.data)?t.data:Array.isArray(e)?e:null;if(!n)throw Error(`session inbox: expected list`);let r=[];for(let e of n)!O(e)||e.type!==`compaction`||r.push(Kt(e));return r}function Jt(e,t){t.some(e=>e.type===`compaction`)&&A(e,!0)}function Yt(e,t){t.some(e=>(e.parts??[]).find(C)?.status===`running`)&&A(e,!0)}async function Xt(e){let t=`/api/session/${encodeURIComponent(e.sessionID)}/compact`,n={};e.messageID&&(n.id=e.messageID),e.delivery&&(n.delivery=e.delivery);let r=await u(t,{method:`POST`,headers:{"Content-Type":`application/json`},query:{directory:e.directory},body:JSON.stringify(n),signal:e.signal});r.ok||Bt(`session compact`,r.status,await Vt(r));let i=Kt(await Ht(r,`session compact`));return A(i.sessionID,!0),i}var Zt=`compaction:`;function Qt(e,t){return t&&t.length>0?t:`${Zt}${e}`}function $t(e,t){let n=e.message[t]??[];for(let t of n)if((e.part[t.id]??[]).some(C))return t.id;let r=`${Zt}${t}`;if(n.some(e=>e.id===r))return r}function en(e,t,n,r){let i=e.message[t]?[...e.message[t]]:[];i.some(e=>e.id===n)||(i.push({id:n,sessionID:t,role:`assistant`,clientRole:`compaction`,time:{created:Date.now()}}),e.message[t]=i);let a=e.part[n]?[...e.part[n]]:[],o=a.findIndex(C),s=r(o>=0?a[o]:{id:`${n}:compaction`,sessionID:t,messageID:n,type:`compaction`,status:`running`,reason:`manual`});o>=0?a[o]=s:a.push(s),e.part[n]=a}function tn(e,t){let n=String(t.type??``);if(!n.startsWith(`session.compaction.`))return!1;let r=O(t.properties)?t.properties:null;if(!r)return!1;let i=k(r.sessionID);if(!i)return!1;let a=k(r.inputID),o=$t(e,i)??Qt(i,a);if(n===`session.compaction.started`)return en(e,i,o,e=>({...e,status:`running`,reason:r.reason===`auto`?`auto`:`manual`,...typeof r.recent==`string`?{recent:r.recent}:{}})),A(i,!0),!0;if(n===`session.compaction.delta`){let t=typeof r.text==`string`?r.text:``;return t?(en(e,i,o,e=>({...e,status:`running`,summary:(e.summary??``)+t})),A(i,!0),!0):!1}if(n===`session.compaction.ended`)return en(e,i,o,e=>({...e,status:`completed`,summary:typeof r.text==`string`?r.text:e.summary,...typeof r.recent==`string`?{recent:r.recent}:{}})),A(i,!1),!0;if(n===`session.compaction.failed`){let t=O(r.error)?r.error:{};return en(e,i,o,e=>({...e,status:`failed`,error:{type:k(t.type)??`error`,message:k(t.message)??``}})),A(i,!1),!0}return!1}var nn=e=>e?e.toLowerCase().includes(`application/json`):!1,rn=e=>e?e.toLowerCase().includes(`text/html`):!1;function j(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function an(e){return typeof e==`string`&&e.length>0?e:void 0}function on(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function M(e,t,n){let r=n?`: ${n}`:``,i=Error(`${e} (${t})${r}`);throw i.status=t,i}async function N(e){try{return(await e.text()).trim()}catch{return``}}function sn(e){return e?{directory:e}:{}}function cn(e,t,n){let r=`/api/session/${encodeURIComponent(e)}/inbox`;if(!t)return r;let i=`${r}/${encodeURIComponent(t)}`;return n?`${i}/${n}`:i}async function ln(e,t){let n=e.headers.get(`content-type`);if(rn(n))throw Error(`${t}: unexpected HTML response`);let r;try{r=await e.json()}catch{throw Error(`${t}: malformed JSON`)}if(!nn(n)&&r==null)throw Error(`${t}: empty response`);return r}function un(e){let t=j(e)?e:null,n=t&&j(t.data)?t.data:t;if(!n)throw Error(`session prompt: expected inbox item`);let r=an(n.id),i=an(n.sessionID);if(!r||!i)throw Error(`session prompt: inbox item missing id`);let a=j(n.payload)?n.payload:{},o=n.delivery===`queue`?`queue`:`steer`;return{id:r,sessionID:i,timeCreated:on(n.timeCreated)??Date.now(),type:`user`,delivery:o,payload:{text:an(a.text)??an(n.text)??``,...a.files===void 0?{}:{files:a.files},...a.agents===void 0?{}:{agents:a.agents},...a.skills===void 0?{}:{skills:a.skills},...j(a.metadata)?{metadata:a.metadata}:{}}}}function dn(e){let t=j(e)?e:null,n=t&&Array.isArray(t.data)?t.data:Array.isArray(e)?e:null;if(!n)throw Error(`session inbox: expected list`);let r=[];for(let e of n)j(e)&&(e.type&&e.type!==`user`||r.push(un(e)));return r}async function fn(e){let t=`/api/session/${encodeURIComponent(e.sessionID)}/prompt`,n={id:e.messageID,text:e.text,delivery:e.delivery===`queue`?`queue`:`steer`};e.files?.length&&(n.files=e.files),e.agents?.length&&(n.agents=e.agents),e.skills?.length&&(n.skills=e.skills),e.metadata&&(n.metadata=e.metadata);let r=await u(t,{method:`POST`,headers:{"Content-Type":`application/json`},query:{directory:e.directory},body:JSON.stringify(n),signal:e.signal});if(!r.ok){let e=await N(r);M(`Failed to send message`,r.status,e)}return un(await ln(r,`session prompt`))}async function pn(e){let t=await u(cn(e.sessionID),{method:`GET`,query:sn(e.directory),signal:e.signal});t.ok||M(`session inbox`,t.status,await N(t));let n=await ln(t,`session inbox`),r=dn(n);return Jt(e.sessionID,qt(n)),r}async function mn(e){let t=await u(cn(e.sessionID,e.inboxID,`steer`),{method:`POST`,query:sn(e.directory),signal:e.signal});return t.ok||M(`session inbox steer`,t.status,await N(t)),un(await ln(t,`session inbox steer`))}async function hn(e){let t=await u(cn(e.sessionID,e.inboxID,`queue`),{method:`POST`,query:sn(e.directory),signal:e.signal});return t.ok||M(`session inbox queue`,t.status,await N(t)),un(await ln(t,`session inbox queue`))}async function gn(e){let t=await u(cn(e.sessionID,e.inboxID),{method:`DELETE`,query:sn(e.directory),signal:e.signal});t.ok||M(`session inbox cancel`,t.status,await N(t))}function _n(e,t){vt(e,t)}async function vn(e){await gn(e),gt(e.sessionID,e.inboxID);try{let t=await pn({sessionID:e.sessionID,directory:e.directory,signal:e.signal});_n(e.sessionID,t)}catch{}return{overlay:S.getState().list(e.sessionID),transcriptRows:[]}}async function yn(e){let t=`/api/session/${encodeURIComponent(e.sessionID)}/interrupt`,n={};e.directory&&(n.directory=e.directory);let r=await u(t,{method:`POST`,query:n,signal:e.signal});if(!r.ok)throw Error(`Session interrupt failed (${r.status})`)}async function bn(e){return e.promotedIDs.includes(e.optimisticID)?`confirmed`:(e.removeOptimistic(e.optimisticID),await e.refreshFromAuthority(),`refreshed`)}var xn=`session-revert-busy`,Sn=e=>e?e.toLowerCase().includes(`text/html`):!1;function Cn(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function P(e){return typeof e==`string`&&e.length>0?e:void 0}function wn(e,t,n){if(t===409)throw Tn();let r=n?`: ${n}`:``,i=Error(`${e} (${t})${r}`);throw i.status=t,i}function Tn(){let e=Error(xn);return e.name=`SessionRevertBusyError`,e}function En(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.name===`SessionRevertBusyError`||t.message===`session-revert-busy`}async function Dn(e){try{return(await e.text()).trim()}catch{return``}}async function On(e,t){if(Sn(e.headers.get(`content-type`)))throw Error(`${t}: unexpected HTML response`);if(e.status===204)return null;let n=await e.text();if(!n.trim()){if(e.ok)return null;throw Error(`${t}: empty response`)}try{return JSON.parse(n)}catch{throw Error(`${t}: malformed JSON`)}}function kn(e){return e?{directory:e}:{}}function An(e,t){return`/api/session/${encodeURIComponent(e)}/revert/${t}`}function jn(e){let t=Cn(e)?e:null,n=t&&Cn(t.data)?t.data:t;if(!n)throw Error(`session revert: expected revert payload`);let r=P(n.messageID);if(!r)throw Error(`session revert: missing messageID`);let i=Array.isArray(n.files)?n.files.flatMap(e=>{if(!Cn(e))return[];let t=P(e.file)??P(e.path);return t?[{file:t,...e.status===`added`||e.status===`deleted`||e.status===`modified`?{status:e.status}:{},...typeof e.additions==`number`?{additions:e.additions}:{},...typeof e.deletions==`number`?{deletions:e.deletions}:{},...typeof e.patch==`string`?{patch:e.patch}:{}}]:[]}):void 0;return{messageID:r,...P(n.partID)?{partID:P(n.partID)}:{},...P(n.snapshot)?{snapshot:P(n.snapshot)}:{},...i?{files:i}:{}}}function Mn(e){return e?.files?e.files.flatMap(e=>{let t=typeof e.file==`string`&&e.file.length>0?e.file:typeof e.path==`string`&&e.path.length>0?e.path:``;return t?[t]:[]}):[]}async function Nn(e){let t=await u(An(e.sessionID,`stage`),{method:`POST`,headers:{"Content-Type":`application/json`},query:kn(e.directory),body:JSON.stringify({messageID:e.messageID,files:e.files!==!1}),signal:e.signal});return t.ok||wn(`session revert stage`,t.status,await Dn(t)),jn(await On(t,`session revert stage`))}async function Pn(e){let t=await u(An(e.sessionID,`clear`),{method:`POST`,query:kn(e.directory),signal:e.signal});t.ok||wn(`session revert clear`,t.status,await Dn(t))}async function Fn(e){let t=await u(An(e.sessionID,`commit`),{method:`POST`,query:kn(e.directory),signal:e.signal});t.ok||wn(`session revert commit`,t.status,await Dn(t))}var In=e=>e?e.toLowerCase().includes(`text/html`):!1;function Ln(e,t,n){let r=n?`: ${n}`:``,i=Error(`${e} (${t})${r}`);throw i.status=t,i}async function Rn(e){try{return(await e.text()).trim()}catch{return``}}function zn(e){return e?{directory:e}:{}}function Bn(e,t){return`/api/session/${encodeURIComponent(e)}/permission/${encodeURIComponent(t)}/reply`}async function Vn(e){let t=await u(Bn(e.sessionID,e.requestID),{method:`POST`,headers:{"Content-Type":`application/json`},query:zn(e.directory),body:JSON.stringify({reply:e.reply,...e.message?{message:e.message}:{}}),signal:e.signal});if(t.ok||Ln(`session permission reply`,t.status,await Rn(t)),t.status!==204&&In(t.headers.get(`content-type`)))throw Error(`session permission reply: unexpected HTML response`)}function Hn(e){let t=Error(`${e} is not available on OpenCode v2`);return t.name=`V2CapabilityUnavailableError`,t}function Un(e){let t=typeof e.directory==`string`?e.directory:``;return{state:``,config:``,worktree:typeof e.project?.directory==`string`?e.project.directory:t,directory:t,home:``}}function Wn(e){return{id:e.id,worktree:e.canonical,canonical:e.canonical,sandboxes:e.sandboxes,name:e.name}}function Gn(e){return e.worktree||e.canonical||``}function Kn(e,t){let n={};if(t.size===0)return n;for(let[r,i]of Object.entries(e))t.has(r)&&i?.type===`running`&&(n[r]={type:`busy`});return n}function qn(e){return{id:e.id,sessionID:e.sessionID,permission:e.action,patterns:Array.isArray(e.resources)?e.resources:[],metadata:e.metadata??{},always:Array.isArray(e.save)?e.save:[],...e.source?.messageID?{tool:{messageID:e.source.messageID,callID:e.source.id??``}}:{}}}function Jn(e){let t=e.fields;if(!t||t.length===0){let t=typeof e.title==`string`&&e.title.length>0?e.title:`Form`;return[{question:t,header:t,options:[]}]}return t.map(t=>{let n=typeof t.title==`string`&&t.title.length>0?t.title:t.key;return{question:typeof t.description==`string`&&t.description.length>0?t.description:typeof e.title==`string`&&e.title.length>0?e.title:n,header:n,options:(t.options??[]).map(e=>({label:e.label||e.value||``,description:typeof e.description==`string`?e.description:``})).filter(e=>e.label.length>0),...t.type===`multiselect`?{multiple:!0}:{}}})}function Yn(e){let t=e.questions&&e.questions.length>0?e.questions.map(e=>({question:e.question,header:e.header,options:e.options??[],...e.multiple?{multiple:!0}:{}})):Jn(e);return{id:e.id,sessionID:e.sessionID,questions:t,...e.tool?.messageID?{tool:{messageID:e.tool.messageID,callID:e.tool.id??``}}:{}}}function Xn(e,t){let n=t&&t.length>0?t:e.map((e,t)=>`field_${t}`),r={};if(n.length===0)return r;for(let t=0;t<n.length;t+=1){let i=n[t],a=e[t]??[];r[i]=a.length>1?a:a[0]??``}return r}var Zn=3,Qn=3e4,$n=32e3,er=36e5,tr=6e5,nr=new Set([429,502,503,504]),F=new Map;function rr(){let e=Date.now();for(let[t,n]of F)n.consecutiveErrors===0&&e-n.lastErrorAt>er&&F.delete(t)}typeof setInterval<`u`&&setInterval(rr,tr).unref?.();function ir(e){let t=F.get(e);return t||(t={consecutiveErrors:0,lastErrorAt:0,circuitOpen:!1,circuitOpenAt:0,circuitCooldownMs:Qn},F.set(e,t)),t}function ar(e){if(!e)return;let t=F.get(e);t&&(t.consecutiveErrors=0,t.lastErrorAt=0)}function or(e,t){if(!e)return;let n=ir(e);n.consecutiveErrors+=1,n.lastErrorAt=Date.now(),sr(t)&&n.consecutiveErrors>=Zn&&(n.circuitOpen=!0,n.circuitOpenAt=Date.now(),console.warn(`[provider-tracker] Circuit opened for ${e} after ${n.consecutiveErrors} consecutive errors`))}function sr(e){return e!==void 0&&nr.has(e)}function cr(e){let t=F.get(e);return t?.circuitOpen?Date.now()-t.circuitOpenAt>=t.circuitCooldownMs?(t.circuitOpen=!1,t.consecutiveErrors=0,t.circuitCooldownMs=Math.min(t.circuitCooldownMs*2,$n*4),!1):!0:!1}function lr(e){if(!(!e||!cr(e)))throw Error(`Provider ${e} is temporarily unavailable after repeated errors. Please retry shortly.`)}var ur=new Map;function dr(e,t){if(!e)return;let n=(t??[]).map(e=>typeof e?.key==`string`?e.key:``).filter(e=>e.length>0);n.length>0&&ur.set(e,n)}function fr(e){let t=ur.get(e);return ur.delete(e),t}var pr=`/api`,mr=1e4,hr=4e3,gr=3e3,_r=1e3,vr=12e3;function I(e){if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`message`in e&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}function L(e){let t=Error(`${e} is not available on OpenCode v2`);return t.name=`V2CapabilityUnavailableError`,t}function yr(e){if(e instanceof ce&&e.reason===`UnexpectedStatus`){let t=e.cause;if(t&&typeof t==`object`&&`status`in t){let e=t.status;if(typeof e==`number`)return e}}if(e&&typeof e==`object`&&`status`in e){let t=e.status;if(typeof t==`number`)return t}}function br(e){return e===404||e===405||e===501}function R(e){if(typeof e!=`string`)return;let t=e.trim();if(t)return{location:{directory:t}}}function xr(e){let t=e.replace(/\/+$/,``);if(t.endsWith(`/api`)){let e=t.slice(0,-4);if(e.length>0)return e}return wr(Er()||`/`)}function Sr(e){return!e||typeof e.id!=`string`||e.id.length===0||typeof e.sessionID!=`string`||e.sessionID.length===0?null:{id:e.id,sessionID:e.sessionID,permission:e.action,patterns:Array.isArray(e.resources)?e.resources:[],metadata:e.metadata??{},always:Array.isArray(e.save)?e.save:[],...e.source?{tool:{messageID:e.source.messageID,callID:e.source.id}}:{}}}var Cr=/^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//,wr=e=>{let t=typeof e==`string`&&e.trim().length>0?e.trim():`/api`;if(Cr.test(t)||typeof window>`u`)return t;let n=window.location?.href||window.location?.origin;if(!n)return t;try{return new URL(t,n).toString()}catch(e){return console.warn(`Failed to normalize OpenCode base URL:`,e),t}},Tr=()=>{try{return a().api(`/api`)}catch{return null}},Er=()=>{try{return a().api(`/`)}catch{return null}},Dr=e=>{let t=typeof AbortSignal<`u`?AbortSignal:void 0;if(typeof t?.timeout==`function`)return{signal:t.timeout(e),cleanup:()=>void 0};let n=new AbortController,r=setTimeout(()=>n.abort(),e);return{signal:n.signal,cleanup:()=>clearTimeout(r)}},Or=e=>{let t=e.filter(e=>e!=null);if(t.length===0)return{signal:new AbortController().signal,cleanup:()=>void 0};if(t.length===1)return{signal:t[0],cleanup:()=>void 0};let n=typeof AbortSignal<`u`?AbortSignal:void 0;if(typeof n?.any==`function`)return{signal:n.any(t),cleanup:()=>void 0};let r=new AbortController,i=()=>r.abort();for(let e of t){if(e.aborted){r.abort();break}e.addEventListener(`abort`,i)}return{signal:r.signal,cleanup:()=>{for(let e of t)e.removeEventListener(`abort`,i)}}},kr=e=>{let t=e.session?.message,n=t&&typeof t==`object`&&typeof t.get==`function`?t.get.bind(t):null;if(!n)return e;let r=Object.assign((e,t)=>n(e,t),t);return{...e,session:{...e.session,message:r}}},Ar=e=>kr(le.make({baseUrl:e.baseUrl,...e.headers?{headers:e.headers}:{},fetch:u})),jr=e=>typeof e.mime==`string`&&e.mime.startsWith(`image/`)?!0:typeof e.filename==`string`&&/\.(?:png|jpe?g|gif|webp|svg|avif|bmp|heic|heif|tiff?)$/i.test(e.filename),Mr=e=>{let t=[];for(let n of e){if(!jr(n))continue;let e=typeof n.filename==`string`?n.filename.trim():``,r=typeof n.url==`string`?n.url:``;if(!e||!r.toLowerCase().startsWith(`file://`))continue;let i=et(r).trim();i&&t.push({filename:e,path:i})}return t},Nr=async(e,t)=>{let n=[],r=e.files?.length?await Promise.all(e.files.map(e=>t(e))):[],i=e.additionalParts?.length?await Promise.all(e.additionalParts.map(async e=>({text:e.text,synthetic:e.synthetic,files:e.files?.length?await Promise.all(e.files.map(e=>t(e))):[]}))):[],a=e=>We(e,Mr([...r,...i.flatMap(e=>e.files)]));if(e.prefaceText&&e.prefaceText.trim()&&n.push({type:`text`,text:a(e.prefaceText),synthetic:e.prefaceTextSynthetic!==!1}),e.text&&e.text.trim()&&n.push({type:`text`,text:a(e.text)}),n.push(...r),i.length>0)for(let e of i){if(e.text&&e.text.trim()){let t={type:`text`,text:a(e.text)};e.synthetic&&(t.synthetic=!0),n.push(t)}n.push(...e.files)}if(e.agentMentions&&e.agentMentions.length>0)for(let t of e.agentMentions){if(!t?.name)continue;let e={type:`agent`,name:t.name};t.source&&(e.source=t.source),n.push(e)}if(n.length===0)throw Error(`Message must have at least one part (text or file)`);return n},z=e=>e.replace(/\\/g,`/`),Pr=400,Fr=()=>{let e=d();return e&&e.runtime?.isDesktop&&e.files?e.files:null},B=new class{client;baseUrl;scopedClients=new Map;currentDirectory=void 0;directoryContextQueue=Promise.resolve();listDirectoryInFlight=new Map;configProvidersInFlight=new Map;listAgentsInFlight=new Map;configInFlight=new Map;configCache=new Map;configCacheGeneration=0;listDirectoryCache=new Map;healthInFlight=new Map;healthCache=new Map;healthCacheGeneration=0;constructor(e=pr){let t=Tr()||e;this.baseUrl=wr(t),this.client=Ar({baseUrl:xr(this.baseUrl)})}getBaseUrl(){return this.baseUrl}reconnectToRuntimeBaseUrl(){let e=wr(Tr()||pr);e!==this.baseUrl&&(this.baseUrl=e,this.client=Ar({baseUrl:xr(this.baseUrl)}),this.scopedClients.clear(),this.listDirectoryInFlight.clear(),this.configProvidersInFlight.clear(),this.listAgentsInFlight.clear(),this.clearConfigCache(),this.listDirectoryCache.clear(),this.clearHealthCache())}getSdkClient(){return this.client}getScopedSdkClient(e){return this.getScopedApiClient(e)}getScopedApiClient(e){let t=(this.normalizeCandidatePath(e)??e)||``,n=this.scopedClients.get(t);if(n)return n;let r=Ar({baseUrl:xr(this.baseUrl)});return this.scopedClients.set(t,r),r}normalizeCandidatePath(e){if(typeof e!=`string`)return null;let t=e.trim();if(!t)return null;let n=t.replace(/\\/g,`/`).replace(/^([a-z]):/,(e,t)=>t.toUpperCase()+`:`);return(n.length>1?n.replace(/\/+$/,``):n)||null}deriveHomeDirectory(e){let t=e.match(/^([A-Za-z]:)(?:\/|$)/);if(t){let n=t[1],r=e.slice(n.length+ +(e.charAt(n.length)===`/`)).split(`/`).filter(Boolean);return r.length>=2?{homeDirectory:`${n}/${r[0]}/${r[1]}`,username:r[1]}:r.length===1?{homeDirectory:`${n}/${r[0]}`,username:r[0]}:{homeDirectory:n,username:void 0}}let n=e.startsWith(`/`),r=e.split(`/`).filter(Boolean);return r.length>=2&&(r[0]===`Users`||r[0]===`home`)?{homeDirectory:`${n?`/`:``}${r[0]}/${r[1]}`,username:r[1]}:n?r.length===0?{homeDirectory:`/`,username:void 0}:{homeDirectory:`/${r.join(`/`)}`,username:r[r.length-1]}:r.length>0?{homeDirectory:`/${r.join(`/`)}`,username:r[r.length-1]}:{homeDirectory:`/`,username:void 0}}setDirectory(e){let t=this.normalizeCandidatePath(e)??e;this.currentDirectory!==t&&x(`opencodeClient:setDirectory`,{previous:this.currentDirectory??null,next:t??null}),this.currentDirectory=t}getDirectory(){return this.currentDirectory}async withDirectory(e,t){let n=async()=>{if(e==null)return t();let n=this.currentDirectory,r=this.normalizeCandidatePath(e)??e;this.currentDirectory=r;try{return await t()}finally{this.currentDirectory===r&&(this.currentDirectory=n)}},r=this.directoryContextQueue.then(n,n);return this.directoryContextQueue=r.then(()=>void 0,()=>void 0),r}getApiClient(){return this.client}async getSystemInfo(){let e=new Set,t=t=>{let n=this.normalizeCandidatePath(t);n&&e.add(n)};try{let e=await this.client.location.get(R(this.currentDirectory));e&&(t(e.directory),t(e.project?.directory),t(e.project?.canonical))}catch{}if(!e.size)try{let e=await this.client.location.get(R(this.currentDirectory));t(e?.project?.directory),t(e?.project?.canonical)}catch{}if(!e.size)try{(await this.listSessions()).forEach(e=>t(e.directory))}catch{}if(t(this.currentDirectory),typeof window<`u`)try{t(p(`lastDirectory`)),t(p(`homeDirectory`))}catch{}if(!e.size&&typeof process<`u`&&typeof process.cwd==`function`&&t(process.cwd()),!e.size)return{homeDirectory:`/`,username:void 0};let[n]=Array.from(e);return this.deriveHomeDirectory(n)}async probeDirectory(e){let t=this.normalizeCandidatePath(e);if(!t)return!1;try{let e=await this.client.location.get({location:{directory:t}}),n=typeof e?.directory==`string`?e.directory:null;return!!(n&&n.trim().length>0)}catch{return!1}}async listSessions(){let e=await this.client.session.list(this.currentDirectory?{directory:this.currentDirectory}:void 0);return Array.isArray(e.data)?e.data.map(_):[]}async createSession(e,t){let n=this.normalizeCandidatePath(t)??this.currentDirectory;if(e?.metadata,e?.parentID){let t=await this.client.session.fork({sessionID:e.parentID});return e.title?(await this.client.session.update({sessionID:t.id,title:e.title}),_(await this.client.session.get({sessionID:t.id}))):_(t)}return _(await this.client.session.create({...n?{location:{directory:n}}:{},title:e?.title}))}async getSession(e,t){return _(await this.client.session.get({sessionID:e}))}async deleteSession(e,t){return await this.client.session.remove({sessionID:e}),!0}async deleteSessionMessage(e,t,n){throw L(`session.deleteMessage`)}async updateSession(e,t,n){if(t.time?.archived!==void 0)throw L(`session.update.metadata|archive`);if(t.metadata!==void 0&&t.title===void 0){let r=this.normalizeCandidatePath(n)??this.currentDirectory,i={patch:t.metadata};r&&(i.directory=r);let a=await u(`${this.baseUrl}/openchamber/sessions/${encodeURIComponent(e)}/metadata`,{method:`PUT`,headers:{Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify(i)});if(!a.ok){let e=Error(`session.metadata update failed (${a.status})`);throw e.status=a.status,e}let o=await a.json().catch(()=>null),s=typeof o==`object`&&o&&!Array.isArray(o)&&`metadata`in o&&o.metadata!==null&&typeof o.metadata==`object`&&!Array.isArray(o.metadata)?o.metadata:null,c=await this.getSession(e,n);return s?{...c,metadata:s}:c}if(t.title===void 0)throw L(`session.update`);return await this.client.session.update({sessionID:e,title:t.title}),_(await this.client.session.get({sessionID:e}))}async getSessionMessages(e,t){return(await Nt({sessionID:e,directory:this.currentDirectory??``,...typeof t==`number`?{limit:t}:{}})).records}async getSessionDiff(e,t){let n=this.normalizeCandidatePath(e.directory)??this.currentDirectory,r=typeof e.messageID==`string`&&e.messageID.trim().length>0?e.messageID.trim():void 0,i=new URLSearchParams;n&&i.set(`directory`,n),r&&i.set(`messageID`,r);let a=i.toString(),o=await u(`${this.baseUrl}/session/${encodeURIComponent(e.sessionID)}/diff${a?`?${a}`:``}`,{method:`GET`,headers:{Accept:`application/json`},signal:t?.signal});if(!o.ok){let e=Error(`session.diff failed (${o.status})`);throw e.status=o.status,e}let s=await o.json().catch(()=>null),c=typeof s==`object`&&s&&Array.isArray(s.data)?s.data:null;if(!c)throw Error(`session.diff failed: empty response`);return c}async getSessionTodos(e){throw L(`session.todo`)}shouldNormalizeToTextPlain(e){if(!e)return!1;let t=e.toLowerCase();return t.startsWith(`text/`)&&t!==`text/plain`?!0:[`application/json`,`application/xml`,`application/javascript`,`application/typescript`,`application/x-yaml`,`application/yaml`,`application/toml`,`application/x-sh`,`application/x-shellscript`,`application/octet-stream`,`image/svg+xml`].includes(t)}isHeicMime(e){if(!e)return!1;let t=e.toLowerCase();return t===`image/heic`||t===`image/heif`}async convertHeicToJpeg(t){try{let n=at(t.url,t.mime);if(!n)return t;let r=await xe(n)??await(await fe(async()=>{let{default:t}=await import(`./vendor-heic2any-CUPf3g2A.js`).then(t=>e(t.t(),1));return{default:t}},__vite__mapDeps([0,1]))).default({blob:n,toType:`image/jpeg`,quality:.9}),i=await new Promise((e,t)=>{let n=new FileReader;n.onload=()=>e(n.result),n.onerror=t,n.readAsDataURL(r)}),a=t.filename;return a&&=a.replace(/\.heic$/i,`.jpg`).replace(/\.heif$/i,`.jpg`),{mime:`image/jpeg`,filename:a,url:i}}catch(e){return console.warn(`Failed to convert HEIC to JPEG:`,e),t}}async normalizeFilePart(e){if(this.isHeicMime(e.mime))return this.convertHeicToJpeg(e);if(!this.shouldNormalizeToTextPlain(e.mime))return e;let t=e.url;if(e.url.startsWith(`data:`)){let n=e.url.indexOf(`,`);if(n!==-1){let r=e.url.substring(5,n),i=e.url.substring(n);t=`data:${r.replace(/^[^;,]+/,`text/plain`)}${i}`}}return{mime:`text/plain`,filename:e.filename,url:t}}async toNormalizedFilePartInput(e){let t=await this.normalizeFilePart(e),n=t.url;if(ot(n)){let e=at(n,t.mime);if(!e)throw Error(`Failed to materialize attachment bytes for ${t.filename??`file`}`);n=(await st({body:e,mime:t.mime,filename:t.filename})).url}return{...e.id?{id:e.id}:{},type:`file`,mime:t.mime,filename:t.filename,url:n}}async buildMessageParts(e){return Nr(e,e=>this.toNormalizedFilePartInput(e))}async sendMessage(e){let t=e.messageId??ne(`msg`),n=await this.buildMessageParts({text:e.text,prefaceText:e.prefaceText,prefaceTextSynthetic:e.prefaceTextSynthetic,files:e.files,additionalParts:e.additionalParts,agentMentions:e.agentMentions}),r=this.normalizeCandidatePath(e.directory??null)??this.currentDirectory;e.format&&(e.id,e.providerID,e.modelID,e.agent,e.variant,this.baseUrl,e.format.type),lr(e.providerID);let i=n.flatMap(e=>e.type===`text`&&typeof e.text==`string`?[e.text]:[]).join(`
4
- `)||e.text,a=n.flatMap(e=>e.type!==`file`||typeof e.url!=`string`?[]:[{uri:e.url,...e.filename?{name:e.filename}:{}}]),o=n.flatMap(e=>e.type===`agent`&&typeof e.name==`string`?[{name:e.name}]:[]);try{let n=await fn({sessionID:e.id,directory:r??``,messageID:t,text:i,delivery:e.delivery,...a.length>0?{files:a}:{},...o.length>0?{agents:o}:{},...e.agent||e.variant||e.format?{metadata:{...e.agent?{agent:e.agent}:{},...e.variant?{variant:e.variant}:{},model:{providerID:e.providerID,modelID:e.modelID},...e.format?{format:e.format}:{}}}:{}});return ar(e.providerID),n.id}catch(t){throw or(e.providerID,t.status),t}}async sendCommand(e){let t=e.messageId??ne(`msg`),n=[];if(e.files&&e.files.length>0)for(let t of e.files){let e=await this.toNormalizedFilePartInput(t);n.push({uri:e.url,...e.filename?{name:e.filename}:{}})}return e.directory,e.providerID,e.modelID,e.agent,e.variant,await this.client.session.command({sessionID:e.id,name:e.command,text:e.arguments??``,...n.length>0?{files:n}:{}}),t}async abortSession(e){return await yn({sessionID:e,directory:this.currentDirectory}),!0}async shellSession(e){return e.directory,await this.client.session.shell({sessionID:e.sessionId,command:e.command,...e.messageId?{id:e.messageId}:{}}),{info:{id:e.messageId??``,sessionID:e.sessionId,role:`assistant`,time:{created:Date.now()},clientRole:`shell`,agent:e.agent,modelID:e.model.modelID,providerID:e.model.providerID},parts:[]}}async revertSession(e,t,n,r){let i=await Nn({sessionID:e,directory:this.normalizeCandidatePath(r)??this.currentDirectory,messageID:t,files:!0});return{id:e,time:{created:0,updated:Date.now()},revert:i}}async summarizeSession(e,t,n,r){return await Xt({sessionID:e,directory:this.normalizeCandidatePath(r)??this.currentDirectory??``}),!0}async unrevertSession(e,t){return await Pn({sessionID:e,directory:this.normalizeCandidatePath(t)??this.currentDirectory}),{id:e,time:{created:0,updated:Date.now()}}}async forkSession(e,t,n){this.normalizeCandidatePath(n)??this.currentDirectory;let r=await this.client.session.fork({sessionID:e,...t?{before:t}:{}});return r.id,_(r)}async getSessionStatus(){return await this.getSessionStatusForDirectory(this.currentDirectory??null)??{}}async getSessionStatusForDirectory(e,t){return null}async getSessionActive(e){try{let t=await this.client.session.active(e?{signal:e}:void 0),n=t&&typeof t==`object`&&`data`in t&&t.data!==void 0?t.data:t;if(!n||typeof n!=`object`||Array.isArray(n))return{state:`unknown`};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||e.length===0||!t||typeof t!=`object`||t.type!==`running`)return{state:`unknown`};r[e]={type:`running`}}return{state:`supported`,membership:r}}catch(e){return br(yr(e))?{state:`unsupported`}:{state:`unknown`}}}async getGlobalSessionStatus(){return await this.getSessionStatusForDirectory(null)??{}}async getWebServerSessionActivity(){try{let e=await u(`/api/session-activity`,{method:`GET`,headers:{Accept:`application/json`}});if(!e.ok)return null;let t=await e.json().catch(()=>null);return!t||typeof t!=`object`?null:t}catch{return null}}async listToolIds(e){throw L(`tool.ids`)}async replyToPermission(e,t,n){let r=this.normalizeCandidatePath(n?.directory??null)??this.currentDirectory;if(!n?.sessionID)throw L(`permission.reply (sessionID required)`);return await Vn({sessionID:n.sessionID,requestID:e,reply:t,...n.message?{message:n.message}:{},directory:r}),!0}async createPermission(e,t,n,r){try{let i=await this.client.permission.create({sessionID:e,action:t,resources:n,...r?.id?{id:r.id}:{},...r?.save?{save:r.save}:{},...r?.metadata?{metadata:r.metadata}:{},...r?.source?{source:r.source}:{},...r?.agent?{agent:r.agent}:{}});return!i||typeof i.id!=`string`?null:{id:i.id,effect:i.effect}}catch{return null}}async fetchPermission(e,t){try{let n=await this.client.permission.get({sessionID:e,requestID:t});return n===void 0?{state:`unknown`}:{state:`ok`,permission:n}}catch(e){return se(e)||yr(e)===404?{state:`resolved`}:{state:`unknown`}}}async listPendingPermissions(e){let t=[],n=async e=>{let t=await this.client.permission.request.list(R(e));if(!t||!Array.isArray(t.data))throw Error(`permission.list failed: ${I(t)}`);return t.data.flatMap(e=>{let t=Sr(e);return t?[t]:[]})};t.push(n(null));let r=new Set;for(let t of e?.directories??[]){let e=this.normalizeCandidatePath(t??null);e&&r.add(e)}for(let e of r)t.push(n(e));let i=await Promise.all(t),a=[],o=new Set;for(let e of i)for(let t of e){if(!t||typeof t!=`object`)continue;let e=t.id;typeof e==`string`&&e.length!==0&&(o.has(e)||(o.add(e),a.push(t)))}return a}async replyToQuestion(e,t,n,r){let i=!Array.isArray(t)||t.length===0?[]:Array.isArray(t[0])?t:[t];if(!r)throw L(`session.form.reply (sessionID required)`);let a=fr(e);return await this.client.session.form.reply({sessionID:r,formID:e,answer:Xn(i,a)}),!0}async rejectQuestion(e,t){if(!t)throw L(`session.form.cancel (sessionID required)`);return ur.delete(e),await this.client.session.form.cancel({sessionID:t,formID:e}),!0}async listPendingQuestions(e){let t=[],n=async e=>{let t=await this.client.form.list(R(e));if(!t||!Array.isArray(t.data))throw Error(`form.list failed: ${I(t)}`);return t.data.map(e=>(dr(e.id,e.fields),Yn({id:e.id,sessionID:e.sessionID,title:e.title,fields:e.fields,...e.metadata?{metadata:e.metadata}:{}})))};t.push(n(null));let r=new Set;for(let t of e?.directories??[]){let e=this.normalizeCandidatePath(t??null);e&&r.add(e)}for(let e of r)t.push(n(e));let i=await Promise.all(t),a=[],o=new Set;for(let e of i)for(let t of e){if(!t||typeof t!=`object`)continue;let e=t.id;typeof e==`string`&&e.length!==0&&(o.has(e)||(o.add(e),a.push(t)))}return a}clearConfigCache(){this.configCacheGeneration+=1,this.configInFlight.clear(),this.configCache.clear()}clearHealthCache(){this.healthCacheGeneration+=1,this.healthInFlight.clear(),this.healthCache.clear()}async getConfig(e){let t=this.normalizeCandidatePath(e)??e??this.currentDirectory??void 0,n=t??``,r=this.configCache.get(n);if(r&&r.expiresAt>Date.now())return x(`opencodeClient.getConfig:cacheHit`,{directory:t??null}),r.config;let i=this.configInFlight.get(n);if(i)return x(`opencodeClient.getConfig:deduped`,{directory:t??null}),i;let a=this.configCacheGeneration,o=(async()=>{x(`opencodeClient.getConfig:start`,{directory:t??null});let e=typeof performance<`u`?performance.now():Date.now(),r=await this.client.config.get(R(t));if(!Array.isArray(r))throw Error(`Failed to get config`);let i=me(r),o=typeof performance<`u`?performance.now():Date.now();return x(`opencodeClient.getConfig:end`,{directory:t??null,durationMs:Math.round(o-e)}),a===this.configCacheGeneration&&this.configCache.set(n,{config:i,expiresAt:Date.now()+mr}),i})();this.configInFlight.set(n,o);try{return await o}finally{this.configInFlight.get(n)===o&&this.configInFlight.delete(n)}}async updateConfig(e){throw L(`config.update`)}async updateConfigPartial(e){let t=e(await this.getConfig());return await this.updateConfig(t)}async getProviders(){return this.getProvidersForConfig(this.currentDirectory)}async getProvidersForConfig(e){let t=e===void 0?this.currentDirectory??void 0:this.normalizeCandidatePath(e)??void 0,n=t??``,r=this.configProvidersInFlight.get(n);if(r)return r;let i=(async()=>{let e=await this.client.provider.list(R(t));if(!e||!Array.isArray(e.data))throw Error(`config.providers failed: ${I(e)}`);let n={};try{let e=await this.client.model.default(R(t));e?.data&&(n[e.data.providerID]=e.data.modelID)}catch{}return{providers:e.data,default:n}})();this.configProvidersInFlight.set(n,i);try{return await i}finally{this.configProvidersInFlight.delete(n)}}async getApp(){return{version:`0.0.3`,config:await this.getConfig()}}async initApp(){try{return await this.checkHealth()}catch{return!1}}async listAgents(e,t){let n=e===void 0?this.currentDirectory??void 0:this.normalizeCandidatePath(e)??void 0,r=n??``;if(!t){let e=this.listAgentsInFlight.get(r);if(e)return e}let i=(async()=>{let e=Dr(vr),r=Or(t?[t,e.signal]:[e.signal]);try{let e=R(n),t=await this.client.agent.list(e,{signal:r.signal});if(!t||!Array.isArray(t.data))throw Error(`app.agents failed: ${I(t)}`);return t.data}finally{e.cleanup(),r.cleanup()}})();if(t)return i;this.listAgentsInFlight.set(r,i);try{return await i}finally{this.listAgentsInFlight.delete(r)}}async readFile(e){try{let t=await this.client.file.read({path:e,...R(this.currentDirectory)});return new TextDecoder().decode(t)}catch{return`// Content of ${e}\n// This would be loaded from the server`}}async listFiles(e){try{let t=e||this.currentDirectory||`/`,n=(await this.client.file.list({path:t,...R(this.currentDirectory)})).data;return Array.isArray(n)?n:[]}catch{return[]}}async listCommands(){let e=await this.client.command.list(R(this.currentDirectory)),t=e.data;if(!Array.isArray(t))throw Error(`command.list failed: ${I(e)}`);return t.map(e=>({name:e.name,description:e.description,agent:void 0,model:void 0,source:void 0}))}async listCommandsWithDetails(){let e=await this.client.command.list(R(this.currentDirectory)),t=e.data;if(!Array.isArray(t))throw Error(`command.list failed: ${I(e)}`);return t.map(e=>({name:e.name,description:e.description,agent:void 0,model:void 0,source:void 0,template:``}))}async listSkillsWithDetails(){try{let e=(await this.client.skill.list(R(this.currentDirectory))).data;if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=typeof n.name==`string`?n.name.trim():``,r=typeof n.path==`string`?n.path:``;if(!e||!r)continue;let i={name:e,location:r};typeof n.description==`string`&&(i.description=n.description),typeof n.content==`string`&&(i.content=n.content),t.push(i)}return t}catch{return[]}}async getCommandDetails(e){try{let t=await this.client.command.list(R(this.currentDirectory));if(t.data){let n=t.data.find(t=>t.name===e);if(n)return{name:n.name,template:``,description:n.description,agent:void 0,model:void 0}}return null}catch{return null}}async checkHealth(){let e=c(),t=this.healthCache.get(e);if(t&&t.expiresAt>Date.now())return t.healthy;let n=this.healthInFlight.get(e);if(n)return n;let r=this.healthCacheGeneration,i=(async()=>{let t=!1;try{let e=this.baseUrl.endsWith(`/`)?this.baseUrl.replace(/\/+$/,``):this.baseUrl,n=e===`/api`||e.endsWith(`/api`)?`/api/opencode/health`:`${e}/opencode/health`;x(`opencodeClient.checkHealth:url`,{baseUrl:this.baseUrl,healthUrl:n});let r=Dr(hr),i=await u(n,{signal:r.signal}).finally(r.cleanup);if(x(`opencodeClient.checkHealth:response`,{status:i.status}),i.ok){let e=await i.json();x(`opencodeClient.checkHealth:result`,{healthy:e?.healthy}),t=e?.healthy===!0}}catch{t=!1}return r!==this.healthCacheGeneration||e!==c()?!1:(this.healthCache.set(e,{healthy:t,expiresAt:Date.now()+(t?gr:_r)}),t)})();this.healthInFlight.set(e,i);try{return await i}finally{this.healthInFlight.get(e)===i&&this.healthInFlight.delete(e)}}async createDirectory(e,t){let n=Fr();if(n?.createDirectory)try{return await n.createDirectory(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(t||`Failed to create directory`)}let r={path:e,...t?.allowOutsideWorkspace?{allowOutsideWorkspace:!0}:{}},i=await u(`${this.baseUrl}/fs/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(r)});if(!i.ok){let e=await i.json().catch(()=>({error:`Failed to create directory`}));throw Error(e.error||`Failed to create directory`)}return await i.json()}async cloneRepository(e){let t=await u(`${this.baseUrl}/fs/clone`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({error:`Failed to clone repository`}));throw Error(e.error||`Failed to clone repository`)}return await t.json()}async listLocalDirectory(e,t){let n=`${typeof e==`string`?z(e.trim()):``}|${t?.respectGitignore?`1`:`0`}`,r=Date.now(),i=this.listDirectoryCache.get(n);if(i&&i.expiresAt>r)return i.entries;let a=this.listDirectoryInFlight.get(n);if(a)return a;let o=(async()=>{let r=Fr();if(r)try{let i=await r.listDirectory(e||``,t);if(!i||!Array.isArray(i.entries))return[];let a=i.entries.map(e=>({name:e.name,path:z(e.path),isDirectory:!!e.isDirectory,isFile:!e.isDirectory,isSymbolicLink:!1}));return this.listDirectoryCache.set(n,{entries:a,expiresAt:Date.now()+Pr}),a}catch(e){throw console.error(`Failed to list directory contents:`,e),e}try{let r=new URLSearchParams;e&&e.trim().length>0&&r.set(`path`,e),t?.respectGitignore&&r.set(`respectGitignore`,`true`);let i=r.toString(),a=await u(`${this.baseUrl}/fs/list${i?`?${i}`:``}`);if(!a.ok){let e=await a.json().catch(()=>({})),t=typeof e.error==`string`?e.error:`Failed to list directory`;throw Error(t)}let o=await a.json();if(!o||!Array.isArray(o.entries))return[];let s=o.entries;return this.listDirectoryCache.set(n,{entries:s,expiresAt:Date.now()+Pr}),s}catch(e){throw console.error(`Failed to list directory contents:`,e),e}})().finally(()=>{this.listDirectoryInFlight.get(n)===o&&this.listDirectoryInFlight.delete(n)});return this.listDirectoryInFlight.set(n,o),o}async searchFiles(e,t){let n=typeof t?.directory==`string`&&t.directory.trim().length>0?t.directory.trim():this.currentDirectory,r=n?z(n):null;try{let i=await this.client.file.find({query:e,...R(n),limit:typeof t?.limit==`number`&&Number.isFinite(t.limit)?t.limit:void 0,type:t?.type});return(Array.isArray(i?.data)?i.data:[]).map(e=>{let t=z(e.path),n=t.split(`/`).filter(Boolean).pop()||t;return{name:n,path:z(r?`${r}/${t}`:t),relativePath:t,extension:n.includes(`.`)?n.split(`.`).pop()?.toLowerCase():void 0,isDirectory:e.type===`directory`}})}catch(e){throw console.error(`Failed to search files:`,e),e}}async getFilesystemHome(){let e=c();if(!e||e===`local`){let e=await m();if(e)return e}try{let e=await u(`${this.baseUrl}/fs/home`,{method:`GET`,headers:{Accept:`application/json`}});if(!e.ok){let t=await e.json().catch(()=>({})),n=typeof t.error==`string`&&t.error.length>0?t.error:`Failed to resolve home directory`;throw Error(n)}let t=await e.json();return t&&typeof t.home==`string`&&t.home.length>0?t.home:null}catch(e){return console.warn(`Failed to resolve filesystem home directory:`,e),null}}async setOpenCodeWorkingDirectory(e){if(!e||typeof e!=`string`||!e.trim())return console.warn(`[OpencodeClient] setOpenCodeWorkingDirectory: invalid path`,e),null;let t=`${this.baseUrl}/opencode/directory`;try{let n=await u(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})}),r=await n.json().catch(()=>null);if(!n.ok){let e=r??{},t=typeof e.error==`string`&&e.error.length>0?e.error:`Failed to update OpenCode working directory`;throw Error(t)}return r&&typeof r==`object`?r:{success:!0,restarted:!1,path:e}}catch(e){throw console.warn(`Failed to update OpenCode working directory:`,e),e}}},Ir=3e4,Lr=40,Rr=60,zr=(e,t,n,r,i,a)=>{let o=e.trim(),s=t.trim().toLowerCase();return JSON.stringify([o,s,n,r,i,a])},Br=(e,t)=>{try{let n=JSON.parse(e);return Array.isArray(n)&&n[0]===t}catch{return!1}},Vr=ae()(oe((e,t)=>({cache:{},cacheKeys:[],inFlight:{},async searchFiles(n,r,i=Rr,a){if(!n||n.trim().length===0)return[];let o=n.trim(),s=typeof r==`string`?r.trim():``,c=!!a?.includeHidden,l=a?.respectGitignore??!0,u=a?.type===`directory`?`directory`:`file`,d=zr(o,s,i,c,l,u),f=Date.now(),p=t().cache[d];if(p&&f-p.timestamp<Ir)return p.files;let ee=t().inFlight[d];if(ee)return ee;let m=B.searchFiles(s,{directory:o,limit:i,includeHidden:c,respectGitignore:l,dirs:u!==`file`,type:u}).then(t=>(e(e=>{if(e.inFlight[d]!==m)return e;let n={...e.cache,[d]:{files:t,timestamp:Date.now()}},r=e.cacheKeys.filter(e=>e!==d);for(r.push(d);r.length>Lr;){let e=r.shift();e&&delete n[e]}return{cache:n,cacheKeys:r}}),t)).finally(()=>{e(e=>{if(e.inFlight[d]!==m)return e;let t={...e.inFlight};return delete t[d],{inFlight:t}})});return e(e=>({inFlight:{...e.inFlight,[d]:m}})),m},invalidateDirectory(t){if(!t||t.trim().length===0){e({cache:{},cacheKeys:[],inFlight:{}});return}let n=t.trim();e(e=>{let t={...e.cache},r=e.cacheKeys.filter(e=>!Br(e,n)||(delete t[e],!1)),i=Object.entries(e.inFlight).filter(([e])=>!Br(e,n));return{cache:t,cacheKeys:r,inFlight:Object.fromEntries(i)}})}}),{name:`file-search-store`})),Hr=()=>{if(typeof window>`u`)return!1;try{return window.localStorage.getItem(`openchamber_stream_debug`)===`1`}catch{return!1}},Ur=`openchamber_stream_perf`,V=()=>{if(typeof window>`u`)return!1;try{return window.localStorage.getItem(Ur)===`1`}catch{return!1}},Wr=()=>typeof performance<`u`&&typeof performance.now==`function`?performance.now():Date.now(),Gr=()=>{if(!V()||typeof window>`u`)return null;if(!window.__openchamberStreamPerfState){let e=Date.now();window.__openchamberStreamPerfState={counters:new Map,startedAt:e,lastUpdatedAt:e}}return window.__openchamberStreamPerfState},Kr=e=>Array.from(e.entries()).map(([e,t])=>({metric:e,count:t.count,avg:t.count>0?Number((t.total/t.count).toFixed(3)):0,max:Number(t.max.toFixed(3)),total:Number(t.total.toFixed(3)),last:Number(t.last.toFixed(3))})).sort((e,t)=>t.total-e.total||t.count-e.count),qr=(e,t)=>{let n=Gr();if(!n)return;let r=n.counters.get(e)??{count:0,total:0,max:0,last:0};r.count+=1,r.total+=t,r.max=Math.max(r.max,t),r.last=t,n.counters.set(e,r),n.lastUpdatedAt=Date.now()},Jr=e=>{if(!(typeof window>`u`))try{if(e){window.localStorage.setItem(Ur,`1`),window.__openchamberStreamPerfState={counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()};return}window.localStorage.removeItem(Ur),delete window.__openchamberStreamPerfState,delete window.__openchamberVsCodeStreamPerfState}catch{}},Yr=()=>{typeof window>`u`||(V()&&(window.__openchamberStreamPerfState={counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()}),window.__openchamberVsCodeStreamPerfState&&(window.__openchamberVsCodeStreamPerfState={...window.__openchamberVsCodeStreamPerfState,counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()}))},Xr=()=>{if(typeof window>`u`)return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};let e=window.__openchamberStreamPerfState;return!V()||!e?{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]}:{enabled:!0,startedAt:e.startedAt,lastUpdatedAt:e.lastUpdatedAt,durationMs:Math.max(0,Date.now()-e.startedAt),entries:Kr(e.counters)}},Zr=()=>{if(typeof window>`u`)return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};let e=window.__openchamberVsCodeStreamPerfState;if(!V()||!e)return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};let t=typeof e.startedAt==`number`?e.startedAt:null;return{enabled:!0,startedAt:t,lastUpdatedAt:typeof e.lastUpdatedAt==`number`?e.lastUpdatedAt:null,durationMs:t?Math.max(0,Date.now()-t):0,entries:Kr(e.counters)}},Qr=(e,t=1)=>{qr(e,t)},$r=(e,t)=>{qr(e,t)},ei=(e,t)=>{if(!V())return t();let n=Wr();try{return t()}finally{qr(e,Wr()-n)}},H=null,ti=0,U=ue(),ni=p(`lastDirectory`,{storage:U}),ri=typeof ni==`string`&&ni.length>0,W=e=>{try{Vr.getState().invalidateDirectory(e)}catch(e){console.warn(`Failed to invalidate file search cache:`,e)}},G=e=>{let t=e.trim();if(!t)return t;let n=t.replace(/\\/g,`/`).replace(/^([a-z]):/,(e,t)=>t.toUpperCase()+`:`);return n.length>1?n.replace(/\/+$/,``):n},ii=(e,t)=>{let n=e.trim();return n.startsWith(`~`)?n===`~`?t||n:(n.startsWith(`~/`)||n.startsWith(`~\\`))&&t?`${t}${n.slice(1)}`:n:n},ai=(e,t)=>G(ii(e,t)),oi=()=>{let e=p(`homeDirectory`,{storage:U});if(typeof e!=`string`||e.trim().length===0)return null;let t=G(e);return t.length>0?t:null},si=()=>{let e=p(`lastDirectory`,{storage:U});if(typeof e!=`string`||e.trim().length===0)return null;let t=G(e);return t.length>0?t:null},ci=()=>{if(typeof process>`u`)return null;let e={},t=e?.HOME||e?.USERPROFILE||(e?.HOMEDRIVE&&e?.HOMEPATH?`${e.HOMEDRIVE}${e.HOMEPATH}`:void 0);if(typeof t==`string`&&t.trim().length>0){let e=G(t);return e.length>0?e:null}let n=process?.cwd?.();if(typeof n==`string`&&n.trim().length>0){let e=G(n);return e.length>0?e:null}return null},li=()=>{if(typeof window<`u`){if(H)return H;let e=typeof window.__OPENCHAMBER_HOME__==`string`&&window.__OPENCHAMBER_HOME__.length>0?window.__OPENCHAMBER_HOME__:null;if(e&&e.length>0)return H=e,f(`homeDirectory`,e,{storage:U}),e;let t=oi();if(t&&!ie())return H=t,t}return ci()||`/`},ui=e=>{if(typeof e!=`string`)return null;let t=e.trim();if(!t)return null;let n=t.replace(/\\/g,`/`);if(n.length>1){let e=n.replace(/\/+$/,``);if(e&&e.length>0)return e===`/`?null:e}return n===`/`||n.length===0?null:n},di=e=>(H=e,typeof window<`u`&&f(`homeDirectory`,e,{storage:U}),g({homeDirectory:e}),e),fi=async()=>{let e=e=>{let t=ui(e);return t?di(t):null};try{let t=e(await B.getFilesystemHome());if(t)return t}catch(e){console.warn(`Failed to obtain filesystem home directory:`,e)}try{let t=e((await B.getSystemInfo())?.homeDirectory);if(t)return t}catch(e){console.warn(`Failed to get home directory from system info:`,e)}try{let t=e(await m());if(t)return t}catch(e){console.warn(`Failed to obtain desktop-integrated home directory:`,e)}let t=li();return e(t)||t},K=(()=>{if(!ie())return null;let e=window.__VSCODE_CONFIG__?.workspaceFolder;if(typeof e!=`string`||e.trim().length===0)return null;let t=G(e);return t.length>0?t:null})()||li(),pi=(()=>{let e=si();return e&&!ie()?ai(e,K):K})();pi&&B.setDirectory(pi);var mi=!!(K&&K!==`/`),hi=ae()(oe((e,t)=>({currentDirectory:pi,directoryHistory:[pi],historyIndex:0,homeDirectory:K,hasPersistedDirectory:ri,isHomeReady:mi,isSwitchingDirectory:!1,setDirectory:(n,r)=>{let i=ai(n,H||t().homeDirectory||p(`homeDirectory`,{storage:U}));Hr(),pe(t().currentDirectory,i)&&(B.setDirectory(i),W(),e(e=>{let t=[...e.directoryHistory.slice(0,e.historyIndex+1),i];return f(`lastDirectory`,i,{storage:U}),g({lastDirectory:i}),{currentDirectory:i,directoryHistory:t,historyIndex:t.length-1,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1}}))},goBack:()=>{let n=t();if(n.historyIndex>0){let t=n.historyIndex-1,r=n.directoryHistory[t];B.setDirectory(r),W(),f(`lastDirectory`,r,{storage:U}),g({lastDirectory:r}),e({currentDirectory:r,historyIndex:t,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1})}},goForward:()=>{let n=t();if(n.historyIndex<n.directoryHistory.length-1){let t=n.historyIndex+1,r=n.directoryHistory[t];B.setDirectory(r),W(),f(`lastDirectory`,r,{storage:U}),g({lastDirectory:r}),e({currentDirectory:r,historyIndex:t,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1})}},goToParent:()=>{let{currentDirectory:e,setDirectory:n}=t();if(e===(H||t().homeDirectory||li())||e===`/`)return;let r=e.endsWith(`/`)?e.slice(0,-1):e,i=r.lastIndexOf(`/`);n(i===-1?H||li():i===0?`/`:r.substring(0,i))},goHome:async()=>{let e=H||t().homeDirectory||await fi();t().setDirectory(e)},synchronizeHomeDirectory:n=>{let r=t(),i=n;H=i;let a=r.homeDirectory!==i,o=p(`lastDirectory`,{storage:U}),s=typeof o==`string`&&o.length>0,c=!s&&(r.currentDirectory===`/`||r.currentDirectory===r.homeDirectory||!r.currentDirectory);if(!a&&!c){r.isHomeReady||e({isHomeReady:!0});return}let l=typeof i==`string`&&i!==``&&i!==`/`,u=r.currentDirectory?ai(r.currentDirectory,i):r.currentDirectory,d=r.directoryHistory.map(e=>ai(e,i)),ee=d.some((e,t)=>e!==r.directoryHistory[t]),m=!!(u&&u!==r.currentDirectory),h={homeDirectory:i,hasPersistedDirectory:s,isHomeReady:l};if(c?(h.currentDirectory=i,h.directoryHistory=[i],h.historyIndex=0,h.isSwitchingDirectory=!1):(m||ee)&&(h.currentDirectory=u,h.directoryHistory=d,h.historyIndex=Math.min(r.historyIndex,d.length-1),h.isSwitchingDirectory=!1),e(()=>h),(c||m)&&l){let e=c?i:u;B.setDirectory(e),W(),f(`lastDirectory`,e,{storage:U}),g({lastDirectory:e})}g({homeDirectory:i})}}),{name:`directory-store`}));typeof window<`u`&&(fi().then(e=>{hi.getState().synchronizeHomeDirectory(e)}),i(e=>{H=null;let t=++ti;if(l(e)){let e=oi(),t=si(),n=e||`/`,r=t||n;H=e,hi.setState({currentDirectory:r,directoryHistory:[r],historyIndex:0,homeDirectory:n,hasPersistedDirectory:!!t,isHomeReady:!!(e&&e!==`/`),isSwitchingDirectory:!1}),r&&(B.setDirectory(r),W())}fi().then(e=>{t===ti&&hi.getState().synchronizeHomeDirectory(e)})}));var gi=(e,i)=>{let a=t();return a?a.openWebSocket(r(e),i):n(i?new WebSocket(e,i):new WebSocket(e))},q=`/api/git`,_i=1200,vi=5e3,yi=2,bi=5e3,xi=`${q}/worktrees/queue-activation`,Si=`message_queue_activation_pending`,Ci=`worktree_lifecycle_busy`,wi=`worktree_activation_stale`,Ti=5e3,Ei=3e4,Di=[0,500,1e3,2e3,4e3,8e3,14e3],Oi=new Map,J=new Map,ki=new Map,Ai=new Map,ji=new Map,Mi=new Map,Ni=new Map,Pi=new Map,Y=new Map,Fi=new Map,Ii=new Set,Li=0,Ri=[],zi=()=>Li<yi?(Li+=1,Promise.resolve()):new Promise(e=>{Ri.push(e)}),Bi=()=>{let e=Ri.shift();if(e){e();return}Li=Math.max(0,Li-1)},Vi=async e=>{await zi();try{return await e()}finally{Bi()}},Hi=Symbol.for(`openchamber.git.discoveryGated`),Ui=e=>(Object.defineProperty(e,Hi,{value:!0,configurable:!0}),e),Wi=e=>typeof e==`function`&&e[Hi]===!0,X=e=>e.trim(),Gi=(e,t)=>t===`light`?`${X(e)}::light`:X(e),Ki=e=>ki.get(X(e))??0,Z=e=>{let t=X(e);ki.set(t,Ki(e)+1);for(let e of Array.from(Oi.keys()))(e===t||e.startsWith(`${t}::`))&&Oi.delete(e);for(let e of Array.from(J.keys()))(e===t||e.startsWith(`${t}::`))&&J.delete(e)},qi=e=>Fi.get(X(e))??0,Q=e=>{let t=X(e);t&&(Fi.set(t,qi(e)+1),Pi.delete(t),Y.delete(t))};function $(e,t,n){let r={...n};return t&&(r.directory=t),a().api(e,r)}var Ji=(e,t,n)=>{let r=X(e);if(!r)return;let i=Date.now()+bi;Ai.set(r,{value:t,expiresAt:i});let a=typeof n==`string`&&n?n:e;Mi.set(r,{value:{root:a},expiresAt:i})};async function Yi(e){let t=Array.from(new Set(e.map(e=>X(e)).filter(Boolean))),n=new Map;if(t.length===0)return n;let r=Date.now(),i=[];for(let e of t){let t=Ai.get(e),a=Mi.get(e);if(t&&t.expiresAt>r&&a&&a.expiresAt>r){n.set(e,{isGitRepository:t.value,primaryRoot:a.value.root});continue}i.push(e)}if(i.length===0)return n;let o=e=>{for(let t of e){let e=typeof t.directory==`string`?X(t.directory):``;if(!e)continue;let r=!!t.isGitRepository,i=typeof t.primaryRoot==`string`&&t.primaryRoot?t.primaryRoot:null;Ji(e,r,i),n.set(e,{isGitRepository:r,primaryRoot:i})}},s=async e=>{await Promise.all(e.map(async e=>{try{let[t,r]=await Promise.all([Xi(e),Qi(e).then(e=>e.root).catch(()=>e)]);Ji(e,t,t?r:null),n.set(e,{isGitRepository:t,primaryRoot:t?r:null})}catch{Ji(e,!1,null),n.set(e,{isGitRepository:!1,primaryRoot:null})}}))};try{await Vi(async()=>{let e=new URLSearchParams;for(let t of i)e.append(`directories`,t);let t=a().api(`${q}/discover`),n=e.toString(),r=n?t.includes(`?`)?`${t}&${n}`:`${t}?${n}`:t,s=await u(r);if(s.status===501||!s.ok)throw Error(`Batch git discover unavailable: ${s.status} ${s.statusText}`);let c=await s.json().catch(()=>null),l=Array.isArray(c)?c:[];if(l.length===0&&i.length>0)throw Error(`Batch git discover returned empty payload`);o(l)})}catch{}let c=i.filter(e=>!n.has(e));return c.length>0&&await s(c),n}async function Xi(e){let t=X(e),n=Date.now(),r=Ai.get(t);if(r&&r.expiresAt>n)return r.value;let i=ji.get(t);if(i)return i;let a=(async()=>{let n=await u($(`${q}/check`,e));if(!n.ok)throw Error(`Failed to check git repository: ${n.statusText}`);let r=!!(await n.json()).isGitRepository;return Ai.set(t,{value:r,expiresAt:Date.now()+vi}),r})();ji.set(t,a);try{return await a}finally{ji.get(t)===a&&ji.delete(t)}}async function Zi(e,t){let n=t?.mode,r=Gi(e,n),i=Date.now(),a=Oi.get(r);if(a&&a.expiresAt>i)return a.value;let o=J.get(r);if(o)return o;let s=(async()=>{let t=Ki(e),i=await u($(`${q}/status`,e,n?{mode:n}:void 0));if(!i.ok)throw Error(`Failed to get git status: ${i.statusText}`);let a=await i.json();return Ki(e)===t&&Oi.set(r,{value:a,expiresAt:Date.now()+_i}),a})();J.set(r,s);try{return await s}finally{J.get(r)===s&&J.delete(r)}}async function Qi(e){let t=X(e),n=Date.now(),r=Mi.get(t);if(r&&r.expiresAt>n)return r.value;let i=Ni.get(t);if(i)return i;let a=Vi(async()=>{let n=await u($(`${q}/primary-root`,e));if(!n.ok)throw Error(`Failed to resolve git primary root: ${n.statusText}`);let r=await n.json().catch(()=>({})),i={root:typeof r.root==`string`&&r.root?r.root:e};return Mi.set(t,{value:i,expiresAt:Date.now()+bi}),i});Ni.set(t,a);try{return await a}finally{Ni.get(t)===a&&Ni.delete(t)}}async function $i(e){let t=await u($(`${q}/toplevel`,e));if(!t.ok)throw Error(`Failed to resolve git toplevel: ${t.statusText}`);let n=await t.json().catch(()=>({}));return{root:typeof n.root==`string`&&n.root?n.root:e}}async function ea(e,t){let{path:n,staged:r,contextLines:i}=t;if(!n)throw Error(`path is required to fetch git diff`);let a=await u($(`${q}/diff`,e,{path:n,staged:r?`true`:void 0,context:i}));if(!a.ok)throw Error(`Failed to get git diff: ${a.statusText}`);return a.json()}async function ta(e,t){let{path:n,staged:r}=t;if(!n)throw Error(`path is required to fetch git file diff`);let i=await u($(`${q}/file-diff`,e,{path:n,staged:r?`true`:void 0}));if(!i.ok)throw Error(`Failed to get git file diff: ${i.statusText}`);return i.json()}async function na(e,t,n){if(!t)throw Error(`path is required to revert git changes`);let r=await u($(`${q}/revert`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t,scope:n?.scope})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to revert git changes`)}Z(e)}async function ra(e,t){await ia(e,[t])}async function ia(e,t){let n=t.map(e=>e.trim()).filter(Boolean);if(n.length===0)throw Error(`path is required to stage git changes`);let r=await u($(`${q}/stage`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({paths:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to stage git changes`)}Z(e)}async function aa(e,t){await oa(e,[t])}async function oa(e,t){let n=t.map(e=>e.trim()).filter(Boolean);if(n.length===0)throw Error(`path is required to unstage git changes`);let r=await u($(`${q}/unstage`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({paths:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to unstage git changes`)}Z(e)}async function sa(e,t,n){await ua(e,t,n,`stage`)}async function ca(e,t,n){await ua(e,t,n,`unstage`)}async function la(e,t,n){await ua(e,t,n,`discard`)}async function ua(e,t,n,r){if(!t)throw Error(`path is required to apply a git hunk`);if(typeof n!=`string`||!n.trim())throw Error(`patch is required to apply a git hunk`);let i=await u($(`${q}/apply-hunk`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t,patch:n,action:r})});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Failed to apply git hunk`)}Z(e)}async function da(e){if(!e)return!1;let t=await u($(`${q}/worktree-type`,e));if(!t.ok)throw Error(`Failed to detect worktree type: ${t.statusText}`);return!!(await t.json()).linked}async function fa(e,t){let n=await u($(`${q}/branches`,e),{signal:t?.signal});if(!n.ok)throw Error(`Failed to get branches: ${n.statusText}`);return n.json()}async function pa(e,t){if(!t?.branch)throw Error(`branch is required to delete a branch`);let n=await u($(`${q}/branches`,e),{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to delete branch`)}return n.json()}async function ma(e,t){if(!t?.branch)throw Error(`branch is required to delete remote branch`);let n=await u($(`${q}/remote-branches`,e),{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to delete remote branch`)}return n.json()}async function ha(e,t){let n=t?.remote?.trim();if(!n)throw Error(`remote is required to remove a remote`);let r=await u($(`${q}/remotes`,e),{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({remote:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to remove remote`)}return r.json()}async function ga(e,t,n){if(!Array.isArray(t)||t.length===0)throw Error(`No files provided to generate commit message`);let r={files:t};n?.zenModel&&(r.zenModel=n.zenModel),n?.providerId&&(r.providerId=n.providerId),n?.modelId&&(r.modelId=n.modelId);let i=await u($(`${q}/commit-message`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(r)});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));console.error(`[git-generation][browser] http error`,{status:i.status,statusText:i.statusText,error:e});let t=typeof e?.traceId==`string`&&e.traceId?` (traceId: ${e.traceId})`:``;throw Error(`${e.error||`Failed to generate commit message`}${t}`)}let a=await i.json();if(!a?.message||typeof a.message!=`object`)throw Error(`Malformed commit generation response`);return{message:{subject:typeof a.message.subject==`string`&&a.message.subject.trim().length>0?a.message.subject.trim():``,highlights:Array.isArray(a.message.highlights)?a.message.highlights.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim()):[]}}}async function _a(e,t){let{base:n,head:r,context:i,zenModel:a,providerId:o,modelId:s}=t;if(!n||!r)throw Error(`base and head are required`);let c={base:n,head:r};i?.trim()&&(c.context=i.trim()),a&&(c.zenModel=a),o&&(c.providerId=o),s&&(c.modelId=s);let l=await u($(`${q}/pr-description`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(c)});if(!l.ok){let e=await l.json().catch(()=>({error:l.statusText}));throw Error(e.error||`Failed to generate PR description`)}let d=await l.json().catch(()=>null),f=typeof d?.title==`string`?d.title:``,p=typeof d?.body==`string`?d.body:``;if(!f&&!p)throw Error(`Malformed PR description response`);return{title:f,body:p}}async function va(e){let t=X(e),n=Date.now(),r=Pi.get(t);if(r&&r.expiresAt>n)return r.value;let i=Y.get(t);if(i)return i;let a=qi(e),o=Vi(async()=>{let n=await u($(`${q}/worktrees`,e));if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to list worktrees`)}let r=await n.json();return a===qi(e)&&Pi.set(t,{value:r,expiresAt:Date.now()+bi}),r});Y.set(t,o);try{return await o}finally{Y.get(t)===o&&Y.delete(t)}}Ui(va);async function ya(e,t){let n=await u($(`${q}/worktrees/validate`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to validate worktree`)}return n.json()}async function ba(e){let t=await u($(`${q}/worktrees/bootstrap-status`,e));if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to get worktree bootstrap status`)}return t.json()}async function xa(e,t){let n=await u($(`${q}/worktrees/preview`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to preview worktree`)}return n.json()}var Sa=e=>typeof e==`string`&&e.length>0,Ca=e=>{if(!e||typeof e!=`object`)return null;let t=e;if(!Sa(t.name)||!Sa(t.path))return null;let n={head:typeof t.head==`string`?t.head:``,name:t.name,branch:typeof t.branch==`string`?t.branch:``,path:t.path};return t.directoryCreated===!0&&(n.directoryCreated=!0),t.bootstrapStatus&&typeof t.bootstrapStatus==`object`&&(n.bootstrapStatus=t.bootstrapStatus),n},wa=(e,t,n)=>{if(e!==503||!t||typeof t!=`object`)return null;let r=t;if(r.code!==Si)return null;let i=Ca(r.worktree);if(!i)return null;let a=r.repair;if(!a||typeof a!=`object`)return null;let o=a;if(o.method!==`POST`||o.path!==xi)return null;let s=o.body;if(!s||typeof s!=`object`)return null;let c=s;return c.projectDirectory!==n||c.directory!==i.path?null:i},Ta=(e,t,n,r)=>`${e}\u0000${t}\u0000${n}\u0000${r}`,Ea=e=>new Promise(t=>{setTimeout(t,e)}),Da=async e=>{if(e.status===409){let t=await e.json().catch(()=>null);return t?.code===Ci||t?.code===wi}return e.status===503&&(await e.json().catch(()=>null))?.code===Si},Oa=e=>e===400||e===401||e===403||e===501,ka=(e,t)=>{let n=o(),r=s(),i=Ta(n,r,e,t);if(Ii.has(i))return;Ii.add(i);let a=()=>o()===n&&s()===r;(async()=>{let n=Date.now(),r=0;for(;Date.now()-n<Ei;){if(!a())return;let i=Di[Math.min(r,Di.length-1)]??0;if(i>0){let e=Ei-(Date.now()-n);if(e<=0||(await Ea(Math.min(i,e)),!a()))return}let o=new AbortController,s=setTimeout(()=>o.abort(),Ti);try{let n=await u($(xi,void 0),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectDirectory:e,directory:t}),signal:o.signal});if(n.ok||Oa(n.status))return;if(await Da(n)){r+=1;continue}return}catch{r+=1}finally{clearTimeout(s)}}})().catch(()=>{}).finally(()=>{Ii.delete(i)})};async function Aa(e,t){let n=await u($(`${q}/worktrees`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})}),r=await n.json().catch(()=>null);if(n.ok){let t=Ca(r);if(t)return Q(e),t;if(r&&typeof r==`object`)return Q(e),r;throw Error(`Failed to create worktree`)}let i=wa(n.status,r,e);if(i)return Q(e),ka(e,i.path),i;let a=r&&typeof r==`object`?r:{error:n.statusText};throw Error(a.error||`Failed to create worktree`)}async function ja(e,t){let n=await u($(`${q}/worktrees`,e),{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to delete worktree`)}let r=await n.json();return Q(e),r}async function Ma(e,t,n={}){let r=await u($(`${q}/commit`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:t,addAll:n.addAll??!1,files:n.files,stageFiles:n.stageFiles})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to create commit`)}let i=await r.json();return Z(e),i}async function Na(e,t={}){let n=await u($(`${q}/push`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to push`)}let r=await n.json();return Z(e),r}async function Pa(e,t={}){let n=await u($(`${q}/pull`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to pull`)}let r=await n.json();return Z(e),r}async function Fa(e,t={}){let n=await u($(`${q}/fetch`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to fetch`)}let r=await n.json();return Z(e),r}async function Ia(e){let t=await u($(`${q}/stashes`,e));if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to list stashes`)}return t.json()}async function La(e,t){let n=await u($(`${q}/stashes/file-counts`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({refs:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to count stash files`)}return n.json()}async function Ra(e,t={}){let n=await u($(`${q}/stash`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to stash changes`)}return n.json()}var za=async(e,t,n)=>{let r=await u($(`${q}/${t}`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to ${t}`)}return r.json()},Ba=(e,t)=>za(e,`stash/apply`,t),Va=(e,t)=>za(e,`stash/pop`,t),Ha=(e,t)=>za(e,`stash/drop`,t);async function Ua(e,t){let n=await u($(`${q}/checkout`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({branch:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to checkout branch`)}return n.json()}async function Wa(e,t,n){let r=await u($(`${q}/branches`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t,startPoint:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to create branch`)}return r.json()}async function Ga(e,t,n){let r=await u($(`${q}/branches/rename`,e),{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldName:t,newName:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to rename branch`)}return r.json()}async function Ka(e,t={}){let n=await u($(`${q}/log`,e,{maxCount:t.maxCount,from:t.from,to:t.to,file:t.file,all:t.all?`true`:void 0}));if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(`Failed to get git log: ${e.error||n.statusText}`)}return n.json()}async function qa(e,t){let n=await u($(`${q}/commit-files`,e,{hash:t}));if(!n.ok)throw Error(`Failed to get commit files: ${n.statusText}`);return n.json()}async function Ja(e,t,n,r){let i=await u($(`${q}/commit-file-diff`,e,{hash:t,path:n,binary:r?`true`:void 0}));if(!i.ok)throw Error(`Failed to get commit file diff: ${i.statusText}`);return i.json()}async function Ya(){let e=await u($(`${q}/identities`,void 0));if(!e.ok)throw Error(`Failed to get git identities: ${e.statusText}`);return e.json()}async function Xa(e){let t=await u($(`${q}/identities`,void 0),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to create git identity`)}return t.json()}async function Za(e,t){let n=await u($(`${q}/identities/${e}`,void 0),{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to update git identity`)}return n.json()}async function Qa(e){let t=await u($(`${q}/identities/${e}`,void 0),{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to delete git identity`)}}async function $a(e){if(!e)return null;let t=await u($(`${q}/current-identity`,e));if(!t.ok)throw Error(`Failed to get current git identity: ${t.statusText}`);let n=await t.json();return n?{userName:n.userName??null,userEmail:n.userEmail??null,sshCommand:n.sshCommand??null}:null}async function eo(e){if(!e)return!1;let t=await u($(`${q}/has-local-identity`,e));if(!t.ok)throw Error(`Failed to check local identity: ${t.statusText}`);return(await t.json().catch(()=>null))?.hasLocalIdentity===!0}async function to(){let e=await u($(`${q}/global-identity`,void 0));if(!e.ok)throw Error(`Failed to get global git identity: ${e.statusText}`);let t=await e.json();return!t||!t.userName&&!t.userEmail?null:{userName:t.userName??null,userEmail:t.userEmail??null,sshCommand:t.sshCommand??null}}async function no(e,t){let n=await u($(`${q}/set-identity`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({profileId:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to set git identity`)}return n.json()}async function ro(){let e=await u($(`${q}/discover-credentials`,void 0));if(!e.ok)throw Error(`Failed to discover git credentials: ${e.statusText}`);return e.json()}async function io(e,t){let n=await u($(`${q}/remotes`,e),{signal:t?.signal});if(!n.ok)throw Error(`Failed to get remotes: ${n.statusText}`);return n.json()}async function ao(e,t){let n=await u($(`${q}/rebase`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to rebase`)}return n.json()}async function oo(e){let t=await u($(`${q}/rebase/abort`,e),{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to abort rebase`)}return t.json()}async function so(e,t){let n=await u($(`${q}/merge`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to merge`)}return n.json()}async function co(e,t){let n=await u($(`${q}/checkout-commit`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({hash:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to checkout commit`)}return n.json()}async function lo(e,t){let n=await u($(`${q}/cherry-pick`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({hash:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to cherry-pick`)}return n.json()}async function uo(e,t){let n=await u($(`${q}/revert-commit`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({hash:t})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to revert commit`)}return n.json()}async function fo(e,t,n,r){let i=await u($(`${q}/reset-to-commit`,e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({hash:t,mode:n,force:r})});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Failed to reset`)}return i.json()}async function po(e){let t=await u($(`${q}/merge/abort`,e),{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to abort merge`)}return t.json()}async function mo(e){let t=await u($(`${q}/rebase/continue`,e),{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to continue rebase`)}return t.json()}async function ho(e){let t=await u($(`${q}/merge/continue`,e),{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to continue merge`)}return t.json()}async function go(e,t){return await Ra(e,{message:t?.message}),{success:!0}}async function _o(e){return await Va(e,{ref:`stash@{0}`}),{success:!0}}async function vo(e){let t=await u($(`${q}/conflict-details`,e));if(!t.ok)throw Error(`Failed to get conflict details: ${t.statusText}`);return t.json()}async function yo(e,t){let n=await u(`${q}/validate-directory`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({directory:e,worktreeRoot:t})});if(!n.ok)throw Error(`Failed to validate worktree directory: ${n.statusText}`);return n.json()}async function bo(e){let t=await u(`${q}/canonicalize-worktree-state`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({directory:e})});if(!t.ok)throw Error(`Failed to canonicalize worktree state: ${t.statusText}`);return t.json()}var xo=()=>typeof window>`u`?!1:window.Capacitor?.isNativePlatform?.()===!0||window.location.protocol===`capacitor:`,So=()=>{if(typeof window>`u`||!xo()||Co()!==`ios`)return!1;let e=navigator.userAgent||``,t=navigator.maxTouchPoints??0;return/iPad/i.test(e)||/Macintosh|MacIntel/i.test(e)&&t>1},Co=()=>{if(typeof window<`u`){let e=window.Capacitor?.getPlatform?.();if(e===`ios`||e===`android`)return e}return ie()?`vscode`:ee()?`desktop`:`web`};export{ao as $,mn as $t,vo as A,we as An,ei as At,io as B,Gn as Bt,ro as C,Ge as Cn,hi as Ct,_a as D,Be as Dn,Jr as Dt,ga as E,Ye as En,Yr as Et,Ya as F,Xn as Ft,Q as G,Fn as Gt,Pa as H,Vn as Ht,Ka as I,Un as It,Ia as J,vn as Jt,Wi as K,Nn as Kt,Zi as L,qn as Lt,fa as M,Ee as Mn,Vr as Mt,ea as N,me as Nn,B as Nt,Ja as O,Ze as On,Hr as Ot,ta as P,_ as Pn,Kn as Pt,xa as Q,hn as Qt,ba as R,Wn as Rt,ma as S,Re as Sn,gi as St,Ha as T,Je as Tn,Zr as Tt,Na as U,En as Ut,Fa as V,Hn as Vt,eo as W,Pn as Wt,so as X,pn as Xt,va as Y,bn as Yt,Va as Z,yn as Zt,Xa as _,dt as _n,ca as _t,oo as a,Nt as an,uo as at,Qa as b,Ie as bn,yo as bt,Xi as c,jt as cn,no as ct,lo as d,_t as dn,sa as dt,tn as en,ha as et,ho as f,bt as fn,go as ft,Ma as g,x as gn,oa as gt,Wa as h,S as hn,aa as ht,po as i,Ft as in,$i as it,$a as j,Ce as jn,$r as jt,qa as k,Ve as kn,Qr as kt,Ua as l,It as ln,ra as lt,La as m,yt as mn,_o as mt,xo as n,Yt as nn,fo as nt,Ba as o,St as on,na as ot,mo as p,ft as pn,Ra as pt,da as q,Mn as qt,So as r,Ut as rn,Qi as rt,bo as s,C as sn,la as st,Co as t,Gt as tn,Ga as tt,co as u,mt as un,ia as ut,Aa as v,ut as vn,Za as vt,Yi as w,Ke as wn,Xr as wt,ja as x,Le as xn,Vi as xt,pa as y,qe as yn,ya as yt,to as z,Yn as zt};