@kortix/sdk 0.9.98

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 (618) hide show
  1. package/README.md +313 -0
  2. package/dist/files/client.d.ts +96 -0
  3. package/dist/files/client.d.ts.map +1 -0
  4. package/dist/files/client.js +346 -0
  5. package/dist/files/client.js.map +1 -0
  6. package/dist/files/types.d.ts +82 -0
  7. package/dist/files/types.d.ts.map +1 -0
  8. package/dist/files/types.js +6 -0
  9. package/dist/files/types.js.map +1 -0
  10. package/dist/index.d.ts +119 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +93 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/kortix.d.ts +897 -0
  15. package/dist/kortix.d.ts.map +1 -0
  16. package/dist/kortix.js +772 -0
  17. package/dist/kortix.js.map +1 -0
  18. package/dist/opencode/client.d.ts +89 -0
  19. package/dist/opencode/client.d.ts.map +1 -0
  20. package/dist/opencode/client.js +191 -0
  21. package/dist/opencode/client.js.map +1 -0
  22. package/dist/opencode/env.d.ts +13 -0
  23. package/dist/opencode/env.d.ts.map +1 -0
  24. package/dist/opencode/env.js +63 -0
  25. package/dist/opencode/env.js.map +1 -0
  26. package/dist/opencode/kortix-master.d.ts +487 -0
  27. package/dist/opencode/kortix-master.d.ts.map +1 -0
  28. package/dist/opencode/kortix-master.js +313 -0
  29. package/dist/opencode/kortix-master.js.map +1 -0
  30. package/dist/opencode/triggers.d.ts +6 -0
  31. package/dist/opencode/triggers.d.ts.map +1 -0
  32. package/dist/opencode/triggers.js +34 -0
  33. package/dist/opencode/triggers.js.map +1 -0
  34. package/dist/platform/api/errors.d.ts +106 -0
  35. package/dist/platform/api/errors.d.ts.map +1 -0
  36. package/dist/platform/api/errors.js +137 -0
  37. package/dist/platform/api/errors.js.map +1 -0
  38. package/dist/platform/api-client.d.ts +35 -0
  39. package/dist/platform/api-client.d.ts.map +1 -0
  40. package/dist/platform/api-client.js +279 -0
  41. package/dist/platform/api-client.js.map +1 -0
  42. package/dist/platform/auth-core.d.ts +60 -0
  43. package/dist/platform/auth-core.d.ts.map +1 -0
  44. package/dist/platform/auth-core.js +104 -0
  45. package/dist/platform/auth-core.js.map +1 -0
  46. package/dist/platform/auth.d.ts +88 -0
  47. package/dist/platform/auth.d.ts.map +1 -0
  48. package/dist/platform/auth.js +161 -0
  49. package/dist/platform/auth.js.map +1 -0
  50. package/dist/platform/config-node.d.ts +33 -0
  51. package/dist/platform/config-node.d.ts.map +1 -0
  52. package/dist/platform/config-node.js +63 -0
  53. package/dist/platform/config-node.js.map +1 -0
  54. package/dist/platform/config.d.ts +77 -0
  55. package/dist/platform/config.d.ts.map +1 -0
  56. package/dist/platform/config.js +62 -0
  57. package/dist/platform/config.js.map +1 -0
  58. package/dist/platform/feature-flags.d.ts +25 -0
  59. package/dist/platform/feature-flags.d.ts.map +1 -0
  60. package/dist/platform/feature-flags.js +114 -0
  61. package/dist/platform/feature-flags.js.map +1 -0
  62. package/dist/platform/fresh-sessions.d.ts +4 -0
  63. package/dist/platform/fresh-sessions.d.ts.map +1 -0
  64. package/dist/platform/fresh-sessions.js +22 -0
  65. package/dist/platform/fresh-sessions.js.map +1 -0
  66. package/dist/platform/instance-routes.d.ts +17 -0
  67. package/dist/platform/instance-routes.d.ts.map +1 -0
  68. package/dist/platform/instance-routes.js +105 -0
  69. package/dist/platform/instance-routes.js.map +1 -0
  70. package/dist/platform/logger.d.ts +20 -0
  71. package/dist/platform/logger.d.ts.map +1 -0
  72. package/dist/platform/logger.js +44 -0
  73. package/dist/platform/logger.js.map +1 -0
  74. package/dist/platform/opencode-errors.d.ts +20 -0
  75. package/dist/platform/opencode-errors.d.ts.map +1 -0
  76. package/dist/platform/opencode-errors.js +71 -0
  77. package/dist/platform/opencode-errors.js.map +1 -0
  78. package/dist/platform/platform-client/backups.d.ts +22 -0
  79. package/dist/platform/platform-client/backups.d.ts.map +1 -0
  80. package/dist/platform/platform-client/backups.js +16 -0
  81. package/dist/platform/platform-client/backups.js.map +1 -0
  82. package/dist/platform/platform-client/index.d.ts +21 -0
  83. package/dist/platform/platform-client/index.d.ts.map +1 -0
  84. package/dist/platform/platform-client/index.js +21 -0
  85. package/dist/platform/platform-client/index.js.map +1 -0
  86. package/dist/platform/platform-client/instance-admin.d.ts +67 -0
  87. package/dist/platform/platform-client/instance-admin.d.ts.map +1 -0
  88. package/dist/platform/platform-client/instance-admin.js +59 -0
  89. package/dist/platform/platform-client/instance-admin.js.map +1 -0
  90. package/dist/platform/platform-client/invites.d.ts +35 -0
  91. package/dist/platform/platform-client/invites.d.ts.map +1 -0
  92. package/dist/platform/platform-client/invites.js +25 -0
  93. package/dist/platform/platform-client/invites.js.map +1 -0
  94. package/dist/platform/platform-client/lifecycle.d.ts +78 -0
  95. package/dist/platform/platform-client/lifecycle.d.ts.map +1 -0
  96. package/dist/platform/platform-client/lifecycle.js +151 -0
  97. package/dist/platform/platform-client/lifecycle.js.map +1 -0
  98. package/dist/platform/platform-client/members.d.ts +81 -0
  99. package/dist/platform/platform-client/members.d.ts.map +1 -0
  100. package/dist/platform/platform-client/members.js +59 -0
  101. package/dist/platform/platform-client/members.js.map +1 -0
  102. package/dist/platform/platform-client/shared.d.ts +44 -0
  103. package/dist/platform/platform-client/shared.d.ts.map +1 -0
  104. package/dist/platform/platform-client/shared.js +177 -0
  105. package/dist/platform/platform-client/shared.js.map +1 -0
  106. package/dist/platform/platform-client/ssh.d.ts +29 -0
  107. package/dist/platform/platform-client/ssh.d.ts.map +1 -0
  108. package/dist/platform/platform-client/ssh.js +14 -0
  109. package/dist/platform/platform-client/ssh.js.map +1 -0
  110. package/dist/platform/platform-client/types.d.ts +56 -0
  111. package/dist/platform/platform-client/types.d.ts.map +1 -0
  112. package/dist/platform/platform-client/types.js +19 -0
  113. package/dist/platform/platform-client/types.js.map +1 -0
  114. package/dist/platform/platform-client/updates.d.ts +117 -0
  115. package/dist/platform/platform-client/updates.d.ts.map +1 -0
  116. package/dist/platform/platform-client/updates.js +97 -0
  117. package/dist/platform/platform-client/updates.js.map +1 -0
  118. package/dist/platform/platform-client/urls.d.ts +18 -0
  119. package/dist/platform/platform-client/urls.d.ts.map +1 -0
  120. package/dist/platform/platform-client/urls.js +31 -0
  121. package/dist/platform/platform-client/urls.js.map +1 -0
  122. package/dist/platform/projects-client/access.d.ts +273 -0
  123. package/dist/platform/projects-client/access.d.ts.map +1 -0
  124. package/dist/platform/projects-client/access.js +89 -0
  125. package/dist/platform/projects-client/access.js.map +1 -0
  126. package/dist/platform/projects-client/accounts.d.ts +184 -0
  127. package/dist/platform/projects-client/accounts.d.ts.map +1 -0
  128. package/dist/platform/projects-client/accounts.js +78 -0
  129. package/dist/platform/projects-client/accounts.js.map +1 -0
  130. package/dist/platform/projects-client/agent-config.d.ts +58 -0
  131. package/dist/platform/projects-client/agent-config.d.ts.map +1 -0
  132. package/dist/platform/projects-client/agent-config.js +9 -0
  133. package/dist/platform/projects-client/agent-config.js.map +1 -0
  134. package/dist/platform/projects-client/agent-scope.d.ts +12 -0
  135. package/dist/platform/projects-client/agent-scope.d.ts.map +1 -0
  136. package/dist/platform/projects-client/agent-scope.js +6 -0
  137. package/dist/platform/projects-client/agent-scope.js.map +1 -0
  138. package/dist/platform/projects-client/apps.d.ts +98 -0
  139. package/dist/platform/projects-client/apps.d.ts.map +1 -0
  140. package/dist/platform/projects-client/apps.js +29 -0
  141. package/dist/platform/projects-client/apps.js.map +1 -0
  142. package/dist/platform/projects-client/audit.d.ts +85 -0
  143. package/dist/platform/projects-client/audit.d.ts.map +1 -0
  144. package/dist/platform/projects-client/audit.js +51 -0
  145. package/dist/platform/projects-client/audit.js.map +1 -0
  146. package/dist/platform/projects-client/billing.d.ts +336 -0
  147. package/dist/platform/projects-client/billing.d.ts.map +1 -0
  148. package/dist/platform/projects-client/billing.js +260 -0
  149. package/dist/platform/projects-client/billing.js.map +1 -0
  150. package/dist/platform/projects-client/change-requests.d.ts +119 -0
  151. package/dist/platform/projects-client/change-requests.d.ts.map +1 -0
  152. package/dist/platform/projects-client/change-requests.js +56 -0
  153. package/dist/platform/projects-client/change-requests.js.map +1 -0
  154. package/dist/platform/projects-client/channels.d.ts +135 -0
  155. package/dist/platform/projects-client/channels.d.ts.map +1 -0
  156. package/dist/platform/projects-client/channels.js +103 -0
  157. package/dist/platform/projects-client/channels.js.map +1 -0
  158. package/dist/platform/projects-client/connectors.d.ts +148 -0
  159. package/dist/platform/projects-client/connectors.d.ts.map +1 -0
  160. package/dist/platform/projects-client/connectors.js +66 -0
  161. package/dist/platform/projects-client/connectors.js.map +1 -0
  162. package/dist/platform/projects-client/files.d.ts +37 -0
  163. package/dist/platform/projects-client/files.d.ts.map +1 -0
  164. package/dist/platform/projects-client/files.js +58 -0
  165. package/dist/platform/projects-client/files.js.map +1 -0
  166. package/dist/platform/projects-client/gateway.d.ts +177 -0
  167. package/dist/platform/projects-client/gateway.d.ts.map +1 -0
  168. package/dist/platform/projects-client/gateway.js +59 -0
  169. package/dist/platform/projects-client/gateway.js.map +1 -0
  170. package/dist/platform/projects-client/git-history.d.ts +74 -0
  171. package/dist/platform/projects-client/git-history.d.ts.map +1 -0
  172. package/dist/platform/projects-client/git-history.js +40 -0
  173. package/dist/platform/projects-client/git-history.js.map +1 -0
  174. package/dist/platform/projects-client/github.d.ts +62 -0
  175. package/dist/platform/projects-client/github.d.ts.map +1 -0
  176. package/dist/platform/projects-client/github.js +30 -0
  177. package/dist/platform/projects-client/github.js.map +1 -0
  178. package/dist/platform/projects-client/index.d.ts +32 -0
  179. package/dist/platform/projects-client/index.d.ts.map +1 -0
  180. package/dist/platform/projects-client/index.js +34 -0
  181. package/dist/platform/projects-client/index.js.map +1 -0
  182. package/dist/platform/projects-client/marketplace-catalog.d.ts +76 -0
  183. package/dist/platform/projects-client/marketplace-catalog.d.ts.map +1 -0
  184. package/dist/platform/projects-client/marketplace-catalog.js +48 -0
  185. package/dist/platform/projects-client/marketplace-catalog.js.map +1 -0
  186. package/dist/platform/projects-client/marketplace.d.ts +80 -0
  187. package/dist/platform/projects-client/marketplace.d.ts.map +1 -0
  188. package/dist/platform/projects-client/marketplace.js +52 -0
  189. package/dist/platform/projects-client/marketplace.js.map +1 -0
  190. package/dist/platform/projects-client/model-defaults.d.ts +36 -0
  191. package/dist/platform/projects-client/model-defaults.d.ts.map +1 -0
  192. package/dist/platform/projects-client/model-defaults.js +16 -0
  193. package/dist/platform/projects-client/model-defaults.js.map +1 -0
  194. package/dist/platform/projects-client/policies.d.ts +21 -0
  195. package/dist/platform/projects-client/policies.d.ts.map +1 -0
  196. package/dist/platform/projects-client/policies.js +10 -0
  197. package/dist/platform/projects-client/policies.js.map +1 -0
  198. package/dist/platform/projects-client/projects.d.ts +235 -0
  199. package/dist/platform/projects-client/projects.d.ts.map +1 -0
  200. package/dist/platform/projects-client/projects.js +161 -0
  201. package/dist/platform/projects-client/projects.js.map +1 -0
  202. package/dist/platform/projects-client/public-session-shares.d.ts +52 -0
  203. package/dist/platform/projects-client/public-session-shares.d.ts.map +1 -0
  204. package/dist/platform/projects-client/public-session-shares.js +54 -0
  205. package/dist/platform/projects-client/public-session-shares.js.map +1 -0
  206. package/dist/platform/projects-client/review.d.ts +57 -0
  207. package/dist/platform/projects-client/review.d.ts.map +1 -0
  208. package/dist/platform/projects-client/review.js +28 -0
  209. package/dist/platform/projects-client/review.js.map +1 -0
  210. package/dist/platform/projects-client/sandbox-shares.d.ts +25 -0
  211. package/dist/platform/projects-client/sandbox-shares.d.ts.map +1 -0
  212. package/dist/platform/projects-client/sandbox-shares.js +29 -0
  213. package/dist/platform/projects-client/sandbox-shares.js.map +1 -0
  214. package/dist/platform/projects-client/sandbox.d.ts +123 -0
  215. package/dist/platform/projects-client/sandbox.d.ts.map +1 -0
  216. package/dist/platform/projects-client/sandbox.js +45 -0
  217. package/dist/platform/projects-client/sandbox.js.map +1 -0
  218. package/dist/platform/projects-client/secrets.d.ts +122 -0
  219. package/dist/platform/projects-client/secrets.d.ts.map +1 -0
  220. package/dist/platform/projects-client/secrets.js +34 -0
  221. package/dist/platform/projects-client/secrets.js.map +1 -0
  222. package/dist/platform/projects-client/session-sandbox.d.ts +61 -0
  223. package/dist/platform/projects-client/session-sandbox.d.ts.map +1 -0
  224. package/dist/platform/projects-client/session-sandbox.js +82 -0
  225. package/dist/platform/projects-client/session-sandbox.js.map +1 -0
  226. package/dist/platform/projects-client/sessions.d.ts +216 -0
  227. package/dist/platform/projects-client/sessions.d.ts.map +1 -0
  228. package/dist/platform/projects-client/sessions.js +74 -0
  229. package/dist/platform/projects-client/sessions.js.map +1 -0
  230. package/dist/platform/projects-client/setup-links.d.ts +35 -0
  231. package/dist/platform/projects-client/setup-links.d.ts.map +1 -0
  232. package/dist/platform/projects-client/setup-links.js +24 -0
  233. package/dist/platform/projects-client/setup-links.js.map +1 -0
  234. package/dist/platform/projects-client/shared.d.ts +66 -0
  235. package/dist/platform/projects-client/shared.d.ts.map +1 -0
  236. package/dist/platform/projects-client/shared.js +44 -0
  237. package/dist/platform/projects-client/shared.js.map +1 -0
  238. package/dist/platform/projects-client/tokens.d.ts +77 -0
  239. package/dist/platform/projects-client/tokens.d.ts.map +1 -0
  240. package/dist/platform/projects-client/tokens.js +43 -0
  241. package/dist/platform/projects-client/tokens.js.map +1 -0
  242. package/dist/platform/projects-client/transcription.d.ts +5 -0
  243. package/dist/platform/projects-client/transcription.d.ts.map +1 -0
  244. package/dist/platform/projects-client/transcription.js +14 -0
  245. package/dist/platform/projects-client/transcription.js.map +1 -0
  246. package/dist/platform/projects-client/triggers.d.ts +102 -0
  247. package/dist/platform/projects-client/triggers.d.ts.map +1 -0
  248. package/dist/platform/projects-client/triggers.js +27 -0
  249. package/dist/platform/projects-client/triggers.js.map +1 -0
  250. package/dist/platform/session-id.d.ts +9 -0
  251. package/dist/platform/session-id.d.ts.map +1 -0
  252. package/dist/platform/session-id.js +23 -0
  253. package/dist/platform/session-id.js.map +1 -0
  254. package/dist/platform/storage/managed-storage.d.ts +97 -0
  255. package/dist/platform/storage/managed-storage.d.ts.map +1 -0
  256. package/dist/platform/storage/managed-storage.js +271 -0
  257. package/dist/platform/storage/managed-storage.js.map +1 -0
  258. package/dist/platform/strings.d.ts +12 -0
  259. package/dist/platform/strings.d.ts.map +1 -0
  260. package/dist/platform/strings.js +17 -0
  261. package/dist/platform/strings.js.map +1 -0
  262. package/dist/platform/ui.d.ts +11 -0
  263. package/dist/platform/ui.d.ts.map +1 -0
  264. package/dist/platform/ui.js +22 -0
  265. package/dist/platform/ui.js.map +1 -0
  266. package/dist/react/chat/index.d.ts +3 -0
  267. package/dist/react/chat/index.d.ts.map +1 -0
  268. package/dist/react/chat/index.js +7 -0
  269. package/dist/react/chat/index.js.map +1 -0
  270. package/dist/react/chat/render-parts.d.ts +39 -0
  271. package/dist/react/chat/render-parts.d.ts.map +1 -0
  272. package/dist/react/chat/render-parts.js +34 -0
  273. package/dist/react/chat/render-parts.js.map +1 -0
  274. package/dist/react/chat/use-chat-turns.d.ts +19 -0
  275. package/dist/react/chat/use-chat-turns.d.ts.map +1 -0
  276. package/dist/react/chat/use-chat-turns.js +27 -0
  277. package/dist/react/chat/use-chat-turns.js.map +1 -0
  278. package/dist/react/file-keys.d.ts +18 -0
  279. package/dist/react/file-keys.d.ts.map +1 -0
  280. package/dist/react/file-keys.js +18 -0
  281. package/dist/react/file-keys.js.map +1 -0
  282. package/dist/react/index.d.ts +12 -0
  283. package/dist/react/index.d.ts.map +1 -0
  284. package/dist/react/index.js +49 -0
  285. package/dist/react/index.js.map +1 -0
  286. package/dist/react/model-flatten.d.ts +33 -0
  287. package/dist/react/model-flatten.d.ts.map +1 -0
  288. package/dist/react/model-flatten.js +59 -0
  289. package/dist/react/model-flatten.js.map +1 -0
  290. package/dist/react/opencode.d.ts +43 -0
  291. package/dist/react/opencode.d.ts.map +1 -0
  292. package/dist/react/opencode.js +100 -0
  293. package/dist/react/opencode.js.map +1 -0
  294. package/dist/react/prefetch-session-start.d.ts +10 -0
  295. package/dist/react/prefetch-session-start.d.ts.map +1 -0
  296. package/dist/react/prefetch-session-start.js +17 -0
  297. package/dist/react/prefetch-session-start.js.map +1 -0
  298. package/dist/react/provider-refresh.d.ts +7 -0
  299. package/dist/react/provider-refresh.d.ts.map +1 -0
  300. package/dist/react/provider-refresh.js +28 -0
  301. package/dist/react/provider-refresh.js.map +1 -0
  302. package/dist/react/provider-selection.d.ts +31 -0
  303. package/dist/react/provider-selection.d.ts.map +1 -0
  304. package/dist/react/provider-selection.js +135 -0
  305. package/dist/react/provider-selection.js.map +1 -0
  306. package/dist/react/route-project.d.ts +7 -0
  307. package/dist/react/route-project.d.ts.map +1 -0
  308. package/dist/react/route-project.js +19 -0
  309. package/dist/react/route-project.js.map +1 -0
  310. package/dist/react/session-start-stash.d.ts +56 -0
  311. package/dist/react/session-start-stash.d.ts.map +1 -0
  312. package/dist/react/session-start-stash.js +202 -0
  313. package/dist/react/session-start-stash.js.map +1 -0
  314. package/dist/react/use-canonical-opencode-session.d.ts +35 -0
  315. package/dist/react/use-canonical-opencode-session.d.ts.map +1 -0
  316. package/dist/react/use-canonical-opencode-session.js +52 -0
  317. package/dist/react/use-canonical-opencode-session.js.map +1 -0
  318. package/dist/react/use-change-requests.d.ts +321 -0
  319. package/dist/react/use-change-requests.d.ts.map +1 -0
  320. package/dist/react/use-change-requests.js +43 -0
  321. package/dist/react/use-change-requests.js.map +1 -0
  322. package/dist/react/use-current-runtime.d.ts +8 -0
  323. package/dist/react/use-current-runtime.d.ts.map +1 -0
  324. package/dist/react/use-current-runtime.js +12 -0
  325. package/dist/react/use-current-runtime.js.map +1 -0
  326. package/dist/react/use-gateway-catalog-sync.d.ts +2 -0
  327. package/dist/react/use-gateway-catalog-sync.d.ts.map +1 -0
  328. package/dist/react/use-gateway-catalog-sync.js +39 -0
  329. package/dist/react/use-gateway-catalog-sync.js.map +1 -0
  330. package/dist/react/use-kortix-master.d.ts +384 -0
  331. package/dist/react/use-kortix-master.d.ts.map +1 -0
  332. package/dist/react/use-kortix-master.js +958 -0
  333. package/dist/react/use-kortix-master.js.map +1 -0
  334. package/dist/react/use-model-store.d.ts +71 -0
  335. package/dist/react/use-model-store.d.ts.map +1 -0
  336. package/dist/react/use-model-store.js +411 -0
  337. package/dist/react/use-model-store.js.map +1 -0
  338. package/dist/react/use-opencode-config.d.ts +15 -0
  339. package/dist/react/use-opencode-config.d.ts.map +1 -0
  340. package/dist/react/use-opencode-config.js +79 -0
  341. package/dist/react/use-opencode-config.js.map +1 -0
  342. package/dist/react/use-opencode-events/diagnostics.d.ts +11 -0
  343. package/dist/react/use-opencode-events/diagnostics.d.ts.map +1 -0
  344. package/dist/react/use-opencode-events/diagnostics.js +58 -0
  345. package/dist/react/use-opencode-events/diagnostics.js.map +1 -0
  346. package/dist/react/use-opencode-events/handle-event.d.ts +20 -0
  347. package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -0
  348. package/dist/react/use-opencode-events/handle-event.js +450 -0
  349. package/dist/react/use-opencode-events/handle-event.js.map +1 -0
  350. package/dist/react/use-opencode-events/helpers.d.ts +30 -0
  351. package/dist/react/use-opencode-events/helpers.d.ts.map +1 -0
  352. package/dist/react/use-opencode-events/helpers.js +93 -0
  353. package/dist/react/use-opencode-events/helpers.js.map +1 -0
  354. package/dist/react/use-opencode-events/index.d.ts +25 -0
  355. package/dist/react/use-opencode-events/index.d.ts.map +1 -0
  356. package/dist/react/use-opencode-events/index.js +242 -0
  357. package/dist/react/use-opencode-events/index.js.map +1 -0
  358. package/dist/react/use-opencode-events/types.d.ts +10 -0
  359. package/dist/react/use-opencode-events/types.d.ts.map +1 -0
  360. package/dist/react/use-opencode-events/types.js +2 -0
  361. package/dist/react/use-opencode-events/types.js.map +1 -0
  362. package/dist/react/use-opencode-events/use-event-stream-refs.d.ts +22 -0
  363. package/dist/react/use-opencode-events/use-event-stream-refs.d.ts.map +1 -0
  364. package/dist/react/use-opencode-events/use-event-stream-refs.js +158 -0
  365. package/dist/react/use-opencode-events/use-event-stream-refs.js.map +1 -0
  366. package/dist/react/use-opencode-local.d.ts +139 -0
  367. package/dist/react/use-opencode-local.d.ts.map +1 -0
  368. package/dist/react/use-opencode-local.js +484 -0
  369. package/dist/react/use-opencode-local.js.map +1 -0
  370. package/dist/react/use-opencode-mcp.d.ts +34 -0
  371. package/dist/react/use-opencode-mcp.d.ts.map +1 -0
  372. package/dist/react/use-opencode-mcp.js +190 -0
  373. package/dist/react/use-opencode-mcp.js.map +1 -0
  374. package/dist/react/use-opencode-pty.d.ts +30 -0
  375. package/dist/react/use-opencode-pty.d.ts.map +1 -0
  376. package/dist/react/use-opencode-pty.js +126 -0
  377. package/dist/react/use-opencode-pty.js.map +1 -0
  378. package/dist/react/use-opencode-sessions/agents.d.ts +14 -0
  379. package/dist/react/use-opencode-sessions/agents.d.ts.map +1 -0
  380. package/dist/react/use-opencode-sessions/agents.js +82 -0
  381. package/dist/react/use-opencode-sessions/agents.js.map +1 -0
  382. package/dist/react/use-opencode-sessions/commands.d.ts +8 -0
  383. package/dist/react/use-opencode-sessions/commands.d.ts.map +1 -0
  384. package/dist/react/use-opencode-sessions/commands.js +46 -0
  385. package/dist/react/use-opencode-sessions/commands.js.map +1 -0
  386. package/dist/react/use-opencode-sessions/files.d.ts +2 -0
  387. package/dist/react/use-opencode-sessions/files.d.ts.map +1 -0
  388. package/dist/react/use-opencode-sessions/files.js +181 -0
  389. package/dist/react/use-opencode-sessions/files.js.map +1 -0
  390. package/dist/react/use-opencode-sessions/index.d.ts +15 -0
  391. package/dist/react/use-opencode-sessions/index.d.ts.map +1 -0
  392. package/dist/react/use-opencode-sessions/index.js +21 -0
  393. package/dist/react/use-opencode-sessions/index.js.map +1 -0
  394. package/dist/react/use-opencode-sessions/keys.d.ts +94 -0
  395. package/dist/react/use-opencode-sessions/keys.d.ts.map +1 -0
  396. package/dist/react/use-opencode-sessions/keys.js +39 -0
  397. package/dist/react/use-opencode-sessions/keys.js.map +1 -0
  398. package/dist/react/use-opencode-sessions/mcp.d.ts +3 -0
  399. package/dist/react/use-opencode-sessions/mcp.d.ts.map +1 -0
  400. package/dist/react/use-opencode-sessions/mcp.js +23 -0
  401. package/dist/react/use-opencode-sessions/mcp.js.map +1 -0
  402. package/dist/react/use-opencode-sessions/messages.d.ts +75 -0
  403. package/dist/react/use-opencode-sessions/messages.d.ts.map +1 -0
  404. package/dist/react/use-opencode-sessions/messages.js +319 -0
  405. package/dist/react/use-opencode-sessions/messages.js.map +1 -0
  406. package/dist/react/use-opencode-sessions/parts.d.ts +23 -0
  407. package/dist/react/use-opencode-sessions/parts.d.ts.map +1 -0
  408. package/dist/react/use-opencode-sessions/parts.js +49 -0
  409. package/dist/react/use-opencode-sessions/parts.js.map +1 -0
  410. package/dist/react/use-opencode-sessions/permissions.d.ts +17 -0
  411. package/dist/react/use-opencode-sessions/permissions.d.ts.map +1 -0
  412. package/dist/react/use-opencode-sessions/permissions.js +66 -0
  413. package/dist/react/use-opencode-sessions/permissions.js.map +1 -0
  414. package/dist/react/use-opencode-sessions/projects.d.ts +5 -0
  415. package/dist/react/use-opencode-sessions/projects.d.ts.map +1 -0
  416. package/dist/react/use-opencode-sessions/projects.js +54 -0
  417. package/dist/react/use-opencode-sessions/projects.js.map +1 -0
  418. package/dist/react/use-opencode-sessions/providers.d.ts +10 -0
  419. package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -0
  420. package/dist/react/use-opencode-sessions/providers.js +98 -0
  421. package/dist/react/use-opencode-sessions/providers.js.map +1 -0
  422. package/dist/react/use-opencode-sessions/sessions.d.ts +35 -0
  423. package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -0
  424. package/dist/react/use-opencode-sessions/sessions.js +380 -0
  425. package/dist/react/use-opencode-sessions/sessions.js.map +1 -0
  426. package/dist/react/use-opencode-sessions/shared.d.ts +43 -0
  427. package/dist/react/use-opencode-sessions/shared.d.ts.map +1 -0
  428. package/dist/react/use-opencode-sessions/shared.js +109 -0
  429. package/dist/react/use-opencode-sessions/shared.js.map +1 -0
  430. package/dist/react/use-opencode-sessions/sharing.d.ts +4 -0
  431. package/dist/react/use-opencode-sessions/sharing.d.ts.map +1 -0
  432. package/dist/react/use-opencode-sessions/sharing.js +57 -0
  433. package/dist/react/use-opencode-sessions/sharing.js.map +1 -0
  434. package/dist/react/use-opencode-sessions/tools.d.ts +5 -0
  435. package/dist/react/use-opencode-sessions/tools.d.ts.map +1 -0
  436. package/dist/react/use-opencode-sessions/tools.js +54 -0
  437. package/dist/react/use-opencode-sessions/tools.js.map +1 -0
  438. package/dist/react/use-permission-self-heal.d.ts +45 -0
  439. package/dist/react/use-permission-self-heal.d.ts.map +1 -0
  440. package/dist/react/use-permission-self-heal.js +144 -0
  441. package/dist/react/use-permission-self-heal.js.map +1 -0
  442. package/dist/react/use-project-config.d.ts +11 -0
  443. package/dist/react/use-project-config.d.ts.map +1 -0
  444. package/dist/react/use-project-config.js +22 -0
  445. package/dist/react/use-project-config.js.map +1 -0
  446. package/dist/react/use-project-models.d.ts +11 -0
  447. package/dist/react/use-project-models.d.ts.map +1 -0
  448. package/dist/react/use-project-models.js +25 -0
  449. package/dist/react/use-project-models.js.map +1 -0
  450. package/dist/react/use-project-secrets.d.ts +265 -0
  451. package/dist/react/use-project-secrets.d.ts.map +1 -0
  452. package/dist/react/use-project-secrets.js +41 -0
  453. package/dist/react/use-project-secrets.js.map +1 -0
  454. package/dist/react/use-project-triggers.d.ts +228 -0
  455. package/dist/react/use-project-triggers.d.ts.map +1 -0
  456. package/dist/react/use-project-triggers.js +42 -0
  457. package/dist/react/use-project-triggers.js.map +1 -0
  458. package/dist/react/use-question-self-heal.d.ts +36 -0
  459. package/dist/react/use-question-self-heal.d.ts.map +1 -0
  460. package/dist/react/use-question-self-heal.js +95 -0
  461. package/dist/react/use-question-self-heal.js.map +1 -0
  462. package/dist/react/use-runtime-phase.d.ts +9 -0
  463. package/dist/react/use-runtime-phase.d.ts.map +1 -0
  464. package/dist/react/use-runtime-phase.js +20 -0
  465. package/dist/react/use-runtime-phase.js.map +1 -0
  466. package/dist/react/use-runtime-reconnect.d.ts +90 -0
  467. package/dist/react/use-runtime-reconnect.d.ts.map +1 -0
  468. package/dist/react/use-runtime-reconnect.js +234 -0
  469. package/dist/react/use-runtime-reconnect.js.map +1 -0
  470. package/dist/react/use-session-picks.d.ts +17 -0
  471. package/dist/react/use-session-picks.d.ts.map +1 -0
  472. package/dist/react/use-session-picks.js +36 -0
  473. package/dist/react/use-session-picks.js.map +1 -0
  474. package/dist/react/use-session-prefetch.d.ts +18 -0
  475. package/dist/react/use-session-prefetch.d.ts.map +1 -0
  476. package/dist/react/use-session-prefetch.js +84 -0
  477. package/dist/react/use-session-prefetch.js.map +1 -0
  478. package/dist/react/use-session-send.d.ts +183 -0
  479. package/dist/react/use-session-send.d.ts.map +1 -0
  480. package/dist/react/use-session-send.js +287 -0
  481. package/dist/react/use-session-send.js.map +1 -0
  482. package/dist/react/use-session-sync.d.ts +24 -0
  483. package/dist/react/use-session-sync.d.ts.map +1 -0
  484. package/dist/react/use-session-sync.js +375 -0
  485. package/dist/react/use-session-sync.js.map +1 -0
  486. package/dist/react/use-session.d.ts +171 -0
  487. package/dist/react/use-session.d.ts.map +1 -0
  488. package/dist/react/use-session.js +396 -0
  489. package/dist/react/use-session.js.map +1 -0
  490. package/dist/react/use-visible-agents.d.ts +22 -0
  491. package/dist/react/use-visible-agents.d.ts.map +1 -0
  492. package/dist/react/use-visible-agents.js +45 -0
  493. package/dist/react/use-visible-agents.js.map +1 -0
  494. package/dist/server.d.ts +55 -0
  495. package/dist/server.d.ts.map +1 -0
  496. package/dist/server.js +122 -0
  497. package/dist/server.js.map +1 -0
  498. package/dist/session/health.d.ts +49 -0
  499. package/dist/session/health.d.ts.map +1 -0
  500. package/dist/session/health.js +57 -0
  501. package/dist/session/health.js.map +1 -0
  502. package/dist/session/index.d.ts +19 -0
  503. package/dist/session/index.d.ts.map +1 -0
  504. package/dist/session/index.js +19 -0
  505. package/dist/session/index.js.map +1 -0
  506. package/dist/session/preview.d.ts +24 -0
  507. package/dist/session/preview.d.ts.map +1 -0
  508. package/dist/session/preview.js +85 -0
  509. package/dist/session/preview.js.map +1 -0
  510. package/dist/session/url.d.ts +160 -0
  511. package/dist/session/url.d.ts.map +1 -0
  512. package/dist/session/url.js +522 -0
  513. package/dist/session/url.js.map +1 -0
  514. package/dist/state/chat-events.d.ts +141 -0
  515. package/dist/state/chat-events.d.ts.map +1 -0
  516. package/dist/state/chat-events.js +135 -0
  517. package/dist/state/chat-events.js.map +1 -0
  518. package/dist/state/current-runtime.d.ts +44 -0
  519. package/dist/state/current-runtime.d.ts.map +1 -0
  520. package/dist/state/current-runtime.js +44 -0
  521. package/dist/state/current-runtime.js.map +1 -0
  522. package/dist/state/diagnostics-store.d.ts +114 -0
  523. package/dist/state/diagnostics-store.d.ts.map +1 -0
  524. package/dist/state/diagnostics-store.js +319 -0
  525. package/dist/state/diagnostics-store.js.map +1 -0
  526. package/dist/state/event-stream.d.ts +134 -0
  527. package/dist/state/event-stream.d.ts.map +1 -0
  528. package/dist/state/event-stream.js +424 -0
  529. package/dist/state/event-stream.js.map +1 -0
  530. package/dist/state/idb-sync-cache.d.ts +18 -0
  531. package/dist/state/idb-sync-cache.d.ts.map +1 -0
  532. package/dist/state/idb-sync-cache.js +209 -0
  533. package/dist/state/idb-sync-cache.js.map +1 -0
  534. package/dist/state/opencode-compaction-store.d.ts +10 -0
  535. package/dist/state/opencode-compaction-store.d.ts.map +1 -0
  536. package/dist/state/opencode-compaction-store.js +32 -0
  537. package/dist/state/opencode-compaction-store.js.map +1 -0
  538. package/dist/state/opencode-pending-store.d.ts +19 -0
  539. package/dist/state/opencode-pending-store.d.ts.map +1 -0
  540. package/dist/state/opencode-pending-store.js +76 -0
  541. package/dist/state/opencode-pending-store.js.map +1 -0
  542. package/dist/state/sandbox-connection-store.d.ts +62 -0
  543. package/dist/state/sandbox-connection-store.d.ts.map +1 -0
  544. package/dist/state/sandbox-connection-store.js +290 -0
  545. package/dist/state/sandbox-connection-store.js.map +1 -0
  546. package/dist/state/server-store/active.d.ts +49 -0
  547. package/dist/state/server-store/active.d.ts.map +1 -0
  548. package/dist/state/server-store/active.js +76 -0
  549. package/dist/state/server-store/active.js.map +1 -0
  550. package/dist/state/server-store/types.d.ts +12 -0
  551. package/dist/state/server-store/types.d.ts.map +1 -0
  552. package/dist/state/server-store/types.js +2 -0
  553. package/dist/state/server-store/types.js.map +1 -0
  554. package/dist/state/server-store/url-helpers.d.ts +33 -0
  555. package/dist/state/server-store/url-helpers.d.ts.map +1 -0
  556. package/dist/state/server-store/url-helpers.js +55 -0
  557. package/dist/state/server-store/url-helpers.js.map +1 -0
  558. package/dist/state/server-store.d.ts +18 -0
  559. package/dist/state/server-store.d.ts.map +1 -0
  560. package/dist/state/server-store.js +23 -0
  561. package/dist/state/server-store.js.map +1 -0
  562. package/dist/state/session-runtime-registry.d.ts +49 -0
  563. package/dist/state/session-runtime-registry.d.ts.map +1 -0
  564. package/dist/state/session-runtime-registry.js +85 -0
  565. package/dist/state/session-runtime-registry.js.map +1 -0
  566. package/dist/state/sync-store/ascending-id.d.ts +2 -0
  567. package/dist/state/sync-store/ascending-id.d.ts.map +1 -0
  568. package/dist/state/sync-store/ascending-id.js +21 -0
  569. package/dist/state/sync-store/ascending-id.js.map +1 -0
  570. package/dist/state/sync-store/binary.d.ts +7 -0
  571. package/dist/state/sync-store/binary.d.ts.map +1 -0
  572. package/dist/state/sync-store/binary.js +21 -0
  573. package/dist/state/sync-store/binary.js.map +1 -0
  574. package/dist/state/sync-store/stream-cache.d.ts +2 -0
  575. package/dist/state/sync-store/stream-cache.d.ts.map +1 -0
  576. package/dist/state/sync-store/stream-cache.js +29 -0
  577. package/dist/state/sync-store/stream-cache.js.map +1 -0
  578. package/dist/state/sync-store/types.d.ts +29 -0
  579. package/dist/state/sync-store/types.d.ts.map +1 -0
  580. package/dist/state/sync-store/types.js +2 -0
  581. package/dist/state/sync-store/types.js.map +1 -0
  582. package/dist/state/sync-store.d.ts +39 -0
  583. package/dist/state/sync-store.d.ts.map +1 -0
  584. package/dist/state/sync-store.js +692 -0
  585. package/dist/state/sync-store.js.map +1 -0
  586. package/dist/state/tab-store.d.ts +91 -0
  587. package/dist/state/tab-store.d.ts.map +1 -0
  588. package/dist/state/tab-store.js +369 -0
  589. package/dist/state/tab-store.js.map +1 -0
  590. package/dist/transcript.d.ts +40 -0
  591. package/dist/transcript.d.ts.map +1 -0
  592. package/dist/transcript.js +126 -0
  593. package/dist/transcript.js.map +1 -0
  594. package/dist/turns/classify.d.ts +166 -0
  595. package/dist/turns/classify.d.ts.map +1 -0
  596. package/dist/turns/classify.js +259 -0
  597. package/dist/turns/classify.js.map +1 -0
  598. package/dist/turns/errors.d.ts +11 -0
  599. package/dist/turns/errors.d.ts.map +1 -0
  600. package/dist/turns/errors.js +85 -0
  601. package/dist/turns/errors.js.map +1 -0
  602. package/dist/turns/index.d.ts +264 -0
  603. package/dist/turns/index.d.ts.map +1 -0
  604. package/dist/turns/index.js +1243 -0
  605. package/dist/turns/index.js.map +1 -0
  606. package/dist/turns/tool-registry.d.ts +33 -0
  607. package/dist/turns/tool-registry.d.ts.map +1 -0
  608. package/dist/turns/tool-registry.js +108 -0
  609. package/dist/turns/tool-registry.js.map +1 -0
  610. package/dist/turns/types.d.ts +125 -0
  611. package/dist/turns/types.d.ts.map +1 -0
  612. package/dist/turns/types.js +12 -0
  613. package/dist/turns/types.js.map +1 -0
  614. package/dist/turns/view-model.d.ts +127 -0
  615. package/dist/turns/view-model.d.ts.map +1 -0
  616. package/dist/turns/view-model.js +401 -0
  617. package/dist/turns/view-model.js.map +1 -0
  618. package/package.json +155 -0
@@ -0,0 +1,375 @@
1
+ "use client";
2
+ import { useEffect, useRef } from "react";
3
+ import { getClient } from "../opencode/client.js";
4
+ import { useSyncStore, } from "../state/sync-store.js";
5
+ import { useSandboxConnectionStore } from "../state/sandbox-connection-store.js";
6
+ import { loadSessionFromIDB, saveSessionToIDB } from "../state/idb-sync-cache.js";
7
+ import { canQueryOpenCodeSession } from "./use-opencode-sessions/index.js";
8
+ const EMPTY_MESSAGES = [];
9
+ const EMPTY_DIFFS = [];
10
+ const EMPTY_TODOS = [];
11
+ const IDLE_STATUS = { type: "idle" };
12
+ const MESSAGE_POLL_INTERVAL_MS = 10_000;
13
+ const NETWORK_REVALIDATE_COOLDOWN_MS = 60_000;
14
+ /**
15
+ * Build MessageWithParts[] with reference caching.
16
+ * Returns the same array reference if nothing relevant changed.
17
+ * This is a module-level cache keyed by sessionId so multiple components
18
+ * using the same sessionId share the cache (e.g. SessionLayout + SessionChat).
19
+ */
20
+ const MESSAGE_CACHE_MAX = 20;
21
+ const messageCache = new Map();
22
+ const inFlightInitialLoads = new Map();
23
+ const lastNetworkLoadAttemptAt = new Map();
24
+ const pollInFlightSessions = new Set();
25
+ function markNetworkLoadAttempt(sessionId) {
26
+ lastNetworkLoadAttemptAt.delete(sessionId);
27
+ lastNetworkLoadAttemptAt.set(sessionId, Date.now());
28
+ if (lastNetworkLoadAttemptAt.size > MESSAGE_CACHE_MAX) {
29
+ const oldest = lastNetworkLoadAttemptAt.keys().next().value;
30
+ if (oldest)
31
+ lastNetworkLoadAttemptAt.delete(oldest);
32
+ }
33
+ }
34
+ function touchMessageCache(sessionId) {
35
+ const entry = messageCache.get(sessionId);
36
+ if (entry) {
37
+ messageCache.delete(sessionId);
38
+ messageCache.set(sessionId, entry);
39
+ }
40
+ if (messageCache.size > MESSAGE_CACHE_MAX) {
41
+ const oldest = messageCache.keys().next().value;
42
+ if (oldest)
43
+ messageCache.delete(oldest);
44
+ }
45
+ }
46
+ function buildMessages(sessionId, msgs, parts) {
47
+ if (!msgs || msgs.length === 0)
48
+ return EMPTY_MESSAGES;
49
+ const cached = messageCache.get(sessionId);
50
+ if (cached && cached.msgs === msgs) {
51
+ // Same message array — check if any part arrays changed
52
+ let same = cached.partRefs.length === msgs.length;
53
+ if (same) {
54
+ for (let i = 0; i < msgs.length; i++) {
55
+ if (parts[msgs[i].id] !== cached.partRefs[i]) {
56
+ same = false;
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ if (same)
62
+ return cached.result;
63
+ }
64
+ // Rebuild
65
+ const partRefs = [];
66
+ const result = [];
67
+ for (const info of msgs) {
68
+ const pa = parts[info.id];
69
+ partRefs.push(pa);
70
+ result.push({ info, parts: pa ?? [] });
71
+ }
72
+ messageCache.set(sessionId, { msgs, partRefs, result });
73
+ touchMessageCache(sessionId);
74
+ return result;
75
+ }
76
+ /**
77
+ * Single hook that provides all session data from the sync store.
78
+ * Replaces: useOpenCodeMessages + useOpenCodeSessionStatusStore + useOpenCodePendingStore
79
+ *
80
+ * On first access, fetches messages from the server and populates the store.
81
+ * After that, SSE events keep the store updated in real time.
82
+ */
83
+ export function useSessionSync(sessionId) {
84
+ const fetchedRef = useRef(null);
85
+ const runtimeHealthy = useSandboxConnectionStore((s) => s.healthy === true);
86
+ // Fetch messages on first access (or session change).
87
+ // On failure, retries with backoff (500ms, 1s, 2s) up to 3 times.
88
+ // Without retry, a transient failure (server not ready on page refresh)
89
+ // permanently prevents messages from loading because fetchedRef blocks re-fetch.
90
+ useEffect(() => {
91
+ if (!canQueryOpenCodeSession(sessionId))
92
+ return;
93
+ // Guard against duplicate concurrent fetches for the same session.
94
+ if (fetchedRef.current === sessionId)
95
+ return;
96
+ fetchedRef.current = sessionId;
97
+ // NOTE: We intentionally do NOT skip the fetch when the store already
98
+ // has messages from SSE. SSE only delivers events from the connection
99
+ // point forward — it doesn't replay history. If the agent is actively
100
+ // streaming when the user navigates to a session, SSE stub messages
101
+ // would be the only messages in the store, missing the full thread
102
+ // history. Always fetch and let hydrate() merge safely.
103
+ let cancelled = false;
104
+ // Phase 2: Hydrate from IndexedDB cache FIRST for instant display.
105
+ // Server fetch still runs in background to revalidate.
106
+ const hydrateFromCache = async () => {
107
+ const existing = useSyncStore.getState().messages[sessionId];
108
+ if (existing && existing.length > 0)
109
+ return;
110
+ try {
111
+ const cached = await loadSessionFromIDB(sessionId);
112
+ if (cancelled)
113
+ return;
114
+ if (cached && cached.messages.length > 0) {
115
+ const current = useSyncStore.getState().messages[sessionId];
116
+ if (!current || current.length === 0) {
117
+ useSyncStore.getState().hydrate(sessionId, cached.messages.map((info) => ({
118
+ info,
119
+ parts: cached.parts[info.id] ?? [],
120
+ })));
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // IDB unavailable — fall through to network fetch
126
+ }
127
+ };
128
+ hydrateFromCache();
129
+ if (!runtimeHealthy) {
130
+ fetchedRef.current = null;
131
+ return () => {
132
+ cancelled = true;
133
+ messageCache.delete(sessionId);
134
+ };
135
+ }
136
+ const existingMessages = useSyncStore.getState().messages[sessionId];
137
+ const lastNetworkLoad = lastNetworkLoadAttemptAt.get(sessionId) ?? 0;
138
+ if (existingMessages &&
139
+ existingMessages.length > 0 &&
140
+ Date.now() - lastNetworkLoad < NETWORK_REVALIDATE_COOLDOWN_MS) {
141
+ return () => {
142
+ cancelled = true;
143
+ fetchedRef.current = null;
144
+ messageCache.delete(sessionId);
145
+ };
146
+ }
147
+ // IMPORTANT: do NOT short-circuit hydrate on `cancelled`. The
148
+ // store is keyed by sessionID — writing into it is always safe
149
+ // even if this effect's component has unmounted. Strict Mode
150
+ // fires effect → cleanup (cancelled=true) → effect, and the
151
+ // in-flight dedup map below would otherwise drop the only fetch
152
+ // because the cancelled first run bails before hydrating.
153
+ const fetchWithRetry = async (attempt = 0) => {
154
+ try {
155
+ const res = await getClient().session.messages({
156
+ sessionID: sessionId,
157
+ });
158
+ const data = res.data ?? [];
159
+ if (data.length === 0) {
160
+ const freshState = useSyncStore.getState();
161
+ const existingMsgs = freshState.messages[sessionId];
162
+ if (existingMsgs && existingMsgs.length > 0) {
163
+ return;
164
+ }
165
+ // Mark session as loaded (empty) immediately so
166
+ // isLoading becomes false — no extra round-trip.
167
+ // If the session is busy (agent running), SSE events
168
+ // will deliver messages as they arrive.
169
+ freshState.clearSession(sessionId);
170
+ return;
171
+ }
172
+ if (res.data) {
173
+ useSyncStore.getState().hydrate(sessionId, res.data);
174
+ // Persist to IDB for next cold load
175
+ const state = useSyncStore.getState();
176
+ const msgs = state.messages[sessionId] ?? [];
177
+ if (msgs.length > 0) {
178
+ saveSessionToIDB(sessionId, msgs, state.parts);
179
+ }
180
+ }
181
+ }
182
+ catch {
183
+ // Stop retrying ONLY if the effect has been torn down
184
+ // (no live consumer wants this data anymore). Don't gate
185
+ // the success-path hydrate on `cancelled` — see comment
186
+ // above the function.
187
+ if (cancelled)
188
+ return;
189
+ if (attempt < 3) {
190
+ const delay = 500 * 2 ** attempt;
191
+ setTimeout(() => fetchWithRetry(attempt + 1), delay);
192
+ }
193
+ else {
194
+ // All retries exhausted — unblock the UI by marking
195
+ // the session as loaded (empty). Without this,
196
+ // isLoading stays true forever on cold boot when the
197
+ // sandbox isn't ready yet.
198
+ fetchedRef.current = null;
199
+ const state = useSyncStore.getState();
200
+ if (!(sessionId in state.messages)) {
201
+ state.clearSession(sessionId);
202
+ }
203
+ }
204
+ }
205
+ };
206
+ const startFetch = () => {
207
+ const loadPromise = fetchWithRetry().finally(() => {
208
+ markNetworkLoadAttempt(sessionId);
209
+ inFlightInitialLoads.delete(sessionId);
210
+ });
211
+ inFlightInitialLoads.set(sessionId, loadPromise);
212
+ return loadPromise;
213
+ };
214
+ const existingLoad = inFlightInitialLoads.get(sessionId);
215
+ if (existingLoad) {
216
+ // A prior mount fired the fetch. In Strict Mode that prior run
217
+ // may have been cancelled mid-flight and skipped hydrate.
218
+ // Await it, then verify the store actually has data — re-fire
219
+ // if it doesn't.
220
+ existingLoad
221
+ .catch(() => {
222
+ // Error handling is already performed by the owner.
223
+ })
224
+ .then(() => {
225
+ if (cancelled)
226
+ return;
227
+ const after = useSyncStore.getState().messages[sessionId];
228
+ if (after === undefined && !inFlightInitialLoads.has(sessionId)) {
229
+ startFetch();
230
+ }
231
+ });
232
+ }
233
+ else {
234
+ startFetch();
235
+ }
236
+ return () => {
237
+ cancelled = true;
238
+ // Allow a future real remount/navigation to fetch again while still
239
+ // relying on the module-level in-flight map to dedupe Strict Mode.
240
+ fetchedRef.current = null;
241
+ // Evict stale cache entry to prevent unbounded memory growth
242
+ messageCache.delete(sessionId);
243
+ };
244
+ }, [sessionId, runtimeHealthy]);
245
+ // ── Polling fallback ──
246
+ // When the session is busy, SSE should deliver streaming events. But if
247
+ // SSE is broken (502, ERR_QUIC_PROTOCOL_ERROR, etc.), no events arrive
248
+ // and the UI is stuck on "Considering next steps..." forever. As a
249
+ // fallback, poll for messages while the session is busy.
250
+ // The poll stops as soon as the session goes idle or the component unmounts.
251
+ const pollTimerRef = useRef(null);
252
+ const lastPartCountRef = useRef(0);
253
+ const pollInFlightRef = useRef(false);
254
+ useEffect(() => {
255
+ if (!sessionId)
256
+ return;
257
+ if (!runtimeHealthy) {
258
+ if (pollTimerRef.current) {
259
+ clearInterval(pollTimerRef.current);
260
+ pollTimerRef.current = null;
261
+ }
262
+ return;
263
+ }
264
+ const state = useSyncStore.getState();
265
+ const currentStatus = state.sessionStatus[sessionId];
266
+ const isBusyNow = currentStatus?.type === "busy" || currentStatus?.type === "retry";
267
+ if (isBusyNow) {
268
+ // Start polling if not already active
269
+ if (!pollTimerRef.current) {
270
+ // Track part count to detect SSE liveness — if parts are
271
+ // growing between polls, SSE is working and we skip the fetch.
272
+ const countParts = () => {
273
+ const s = useSyncStore.getState();
274
+ const msgs = s.messages[sessionId] ?? [];
275
+ let count = 0;
276
+ for (const m of msgs) {
277
+ const parts = s.parts[m.id];
278
+ if (parts)
279
+ count += parts.length;
280
+ }
281
+ return count;
282
+ };
283
+ lastPartCountRef.current = countParts();
284
+ pollTimerRef.current = setInterval(async () => {
285
+ const s = useSyncStore.getState();
286
+ const st = s.sessionStatus[sessionId];
287
+ if (st?.type !== "busy" && st?.type !== "retry") {
288
+ // Session went idle — stop polling
289
+ if (pollTimerRef.current) {
290
+ clearInterval(pollTimerRef.current);
291
+ pollTimerRef.current = null;
292
+ }
293
+ return;
294
+ }
295
+ // Skip fetch if SSE is delivering data (part count grew)
296
+ const currentCount = countParts();
297
+ if (currentCount > lastPartCountRef.current) {
298
+ lastPartCountRef.current = currentCount;
299
+ return;
300
+ }
301
+ if (pollInFlightRef.current || pollInFlightSessions.has(sessionId))
302
+ return;
303
+ // SSE appears stalled — fetch messages AND session status
304
+ pollInFlightRef.current = true;
305
+ pollInFlightSessions.add(sessionId);
306
+ try {
307
+ const [msgRes, statusRes] = await Promise.all([
308
+ getClient().session.messages({ sessionID: sessionId }),
309
+ getClient().session.status().catch(() => null),
310
+ ]);
311
+ if (msgRes.data) {
312
+ useSyncStore.getState().hydrate(sessionId, msgRes.data);
313
+ }
314
+ // Update session status from server — without this,
315
+ // a dead SSE means session.idle never arrives and the
316
+ // UI stays stuck on "busy" forever.
317
+ if (statusRes?.data) {
318
+ const statuses = statusRes.data;
319
+ const serverStatus = statuses[sessionId];
320
+ if (serverStatus) {
321
+ useSyncStore.getState().setStatus(sessionId, serverStatus);
322
+ }
323
+ else {
324
+ // Session not in busy statuses map → it's idle
325
+ useSyncStore.getState().setStatus(sessionId, { type: "idle" });
326
+ }
327
+ }
328
+ }
329
+ catch {
330
+ // Silently ignore — will retry on next interval
331
+ }
332
+ finally {
333
+ pollInFlightRef.current = false;
334
+ pollInFlightSessions.delete(sessionId);
335
+ lastPartCountRef.current = countParts();
336
+ }
337
+ }, MESSAGE_POLL_INTERVAL_MS);
338
+ }
339
+ }
340
+ else {
341
+ // Session is idle — stop polling
342
+ if (pollTimerRef.current) {
343
+ clearInterval(pollTimerRef.current);
344
+ pollTimerRef.current = null;
345
+ }
346
+ }
347
+ });
348
+ // Cleanup polling on unmount
349
+ useEffect(() => {
350
+ return () => {
351
+ if (pollTimerRef.current) {
352
+ clearInterval(pollTimerRef.current);
353
+ pollTimerRef.current = null;
354
+ }
355
+ };
356
+ }, []);
357
+ // Single selector that derives MessageWithParts[] with reference caching.
358
+ // The buildMessages function returns the same array reference if nothing
359
+ // relevant to this session changed — preventing unnecessary re-renders.
360
+ const messages = useSyncStore((s) => buildMessages(sessionId, s.messages[sessionId], s.parts));
361
+ const status = useSyncStore((s) => s.sessionStatus[sessionId] ?? IDLE_STATUS);
362
+ const diffs = useSyncStore((s) => s.diffs[sessionId]);
363
+ const todos = useSyncStore((s) => s.todos[sessionId]);
364
+ const isBusy = status?.type === "busy" || status?.type === "retry";
365
+ const isLoading = !useSyncStore((s) => sessionId in s.messages);
366
+ return {
367
+ messages,
368
+ status,
369
+ isBusy,
370
+ isLoading,
371
+ diffs: diffs ?? EMPTY_DIFFS,
372
+ todos: todos ?? EMPTY_TODOS,
373
+ };
374
+ }
375
+ //# sourceMappingURL=use-session-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-session-sync.js","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import { BillingError } from '../platform/api/errors.js';
2
+ import type { ModelKey } from './use-model-store.js';
3
+ /** Coarse session lifecycle for the host's top-level gating. */
4
+ export type SessionPhase = 'starting' | 'ready' | 'error';
5
+ /**
6
+ * Whether the `/start` poll should retry. A 404 on a freshly-minted session is
7
+ * the optimistic create-vs-start race (the create POST hasn't landed yet), so
8
+ * retry it for the grace window; a 404 on any other (non-fresh) session is a
9
+ * genuinely-missing/no-access session and is terminal at once. Other terminal
10
+ * SessionStartErrors never retry; transient transport failures retry a few times.
11
+ */
12
+ export declare function shouldRetrySessionStart(failureCount: number, error: unknown, sessionId: string): boolean;
13
+ /** Discriminant for `KortixSendError` — what kind of failure interrupted a send. */
14
+ export type KortixSendErrorKind = 'billing' | 'runtime-not-ready' | 'runtime-error';
15
+ /** Typed failure surfaced by `send` (via `sendError`) and thrown by
16
+ * `answerQuestion`/`rejectQuestion`/`answerPermission`. */
17
+ export interface KortixSendError {
18
+ kind: KortixSendErrorKind;
19
+ /** Human-readable message, already formatted for display. */
20
+ message: string;
21
+ /** Present when `kind === 'billing'` — the parsed 402 detail. */
22
+ billing?: BillingError;
23
+ /** The original thrown value, for callers that want more detail. */
24
+ cause: unknown;
25
+ }
26
+ /** Classify a thrown/rejected error from a send or a permission/question reply
27
+ * into a `KortixSendError`. Pure — safe to unit test without a runtime. */
28
+ export declare function classifySendError(error: unknown): KortixSendError;
29
+ /** The optimistic-send + last-error state `send` drives. Modeled as a small
30
+ * reducer-ish pair of pure helpers so the transition logic is unit-testable
31
+ * without rendering the hook. */
32
+ export interface SendState {
33
+ /** Pending optimistic message text, or null. */
34
+ pending: string | null;
35
+ /** Last send failure, or null. Reset on every new `send` call. */
36
+ sendError: KortixSendError | null;
37
+ }
38
+ /** New state when a send is kicked off — always clears any previous error. */
39
+ export declare function sendStateOnStart(text: string): SendState;
40
+ /** New state when a send fails — drops the optimistic message and classifies
41
+ * the error. */
42
+ export declare function sendStateOnError(error: unknown): SendState;
43
+ /**
44
+ * Answer an agent question through the session's runtime and drop it from
45
+ * local pending state — but only once the server has actually accepted the
46
+ * reply. On failure the question stays pending and a `KortixSendError` is
47
+ * thrown.
48
+ */
49
+ export declare function answerQuestion(requestId: string, answers: string[][]): Promise<void>;
50
+ /** Reject an agent question through the session's runtime (see `answerQuestion`). */
51
+ export declare function rejectQuestion(requestId: string): Promise<void>;
52
+ /** Answer an agent permission request through the session's runtime (see `answerQuestion`). */
53
+ export declare function answerPermission(requestId: string, reply: 'once' | 'always' | 'reject', message?: string): Promise<void>;
54
+ export interface UseSessionOptions {
55
+ /** Long-poll budget (ms) the client requests on `/start`; the server clamps it. */
56
+ waitMs?: number;
57
+ /**
58
+ * Replay a stashed first message (prompt + model + agent from the "new session"
59
+ * screen) once the runtime is ready and the thread is empty. Default true. Hosts
60
+ * with their own first-message hand-off (e.g. apps/web) set this false.
61
+ */
62
+ replayStartStash?: boolean;
63
+ /**
64
+ * Gate the whole hook (the /start poll + switch + SSE). Default true. Set false
65
+ * to hold off until a precondition is met (e.g. a billing gate resolves) — mirrors
66
+ * a query `enabled` flag.
67
+ */
68
+ enabled?: boolean;
69
+ /**
70
+ * Mount the chat-consumption engine — `useSessionSync` (messages/status/diffs/
71
+ * todos, including its 10s busy-poll SSE-stall fallback) and `useQuestionSelfHeal`
72
+ * (the 2s missed-`question.asked` self-heal poll) — on top of the boot/lifecycle
73
+ * machinery every host needs. Default true.
74
+ *
75
+ * Set this false when the host mounts its OWN chat surface for the same
76
+ * `(projectId, sessionId)` (e.g. apps/web's `SessionChat`, which has its own
77
+ * `useSessionSync` + `useQuestionSelfHeal`): with two callers of `useSession`
78
+ * alive for the same session — this hook (for boot/lifecycle) and the host's
79
+ * chat component — leaving it `true` would double-mount both pollers, running
80
+ * the question self-heal poll twice and the busy-poll fallback at ~2x cadence
81
+ * for no benefit, since nothing reads this hook's chat fields anyway.
82
+ *
83
+ * When `false`: `messages`/`diffs`/`todos` are empty arrays, `status` is the
84
+ * idle status, `isBusy`/`isLoading` are `false`, `questions`/`permissions` stay
85
+ * live (populated by SSE via the still-active event stream, just without the
86
+ * self-heal poll backstop), and `replayStartStash` is force-disabled (it reads
87
+ * the now-empty chat state, so it would never fire correctly). Everything the
88
+ * boot/lifecycle fields need — `start`/`switch`/`runtimePhase`/`sandbox`/`stage`/
89
+ * `opencodeSessionId` — is unaffected.
90
+ */
91
+ chatEngine?: boolean;
92
+ }
93
+ export declare function useSession(projectId: string, sessionId: string, options?: UseSessionOptions): {
94
+ projectId: string;
95
+ sessionId: string;
96
+ /** Canonical OpenCode root id, or null while resolving. */
97
+ opencodeSessionId: string | null;
98
+ messages: import("../state/sync-store.js").MessageWithParts[];
99
+ status: import("@opencode-ai/sdk/v2/types").SessionStatus;
100
+ questions: import("@opencode-ai/sdk/v2/types").QuestionRequest[];
101
+ permissions: import("@opencode-ai/sdk/v2/types").PermissionRequest[];
102
+ diffs: (Omit<import("@opencode-ai/sdk/v2/types").SnapshotFileDiff, "patch"> & {
103
+ patch?: string;
104
+ before?: string;
105
+ after?: string;
106
+ })[];
107
+ todos: import("@opencode-ai/sdk/v2/types").Todo[];
108
+ phase: SessionPhase;
109
+ /** Raw /start stage (provisioning|starting|ready|stopped|failed), for boot UI. */
110
+ stage: import("../platform/projects-client/index.js").SessionStartStage | null;
111
+ /** The serialized session_sandboxes row from /start (status, metadata, ids), or null. */
112
+ sandbox: import("../platform/projects-client/index.js").ProjectSessionSandbox | null;
113
+ /** True once the runtime is switched in and ready (equivalent to phase==='ready'). */
114
+ switched: boolean;
115
+ /** Whether polling /start again can still make progress (false = terminal). */
116
+ retriable: boolean;
117
+ /** Terminal /start failure, for hosts to render instead of spinning forever. */
118
+ startError: import("../platform/projects-client/index.js").SessionStartError | null;
119
+ /** Granular boot phase (connecting|booting|ready|unreachable) for detailed UI. */
120
+ runtimePhase: import("./use-runtime-phase.js").RuntimePhase;
121
+ isBusy: boolean;
122
+ isLoading: boolean;
123
+ isError: boolean;
124
+ /** Whether there are open interactive prompts (questions/permissions). */
125
+ hasPending: boolean;
126
+ /** Latest /start reason (e.g. 'runtime_waking'), surfaced for boot/error UI. */
127
+ reason: string | null;
128
+ /** Pending optimistic message text, or null. */
129
+ pending: string | null;
130
+ /** True while the current `send` mutation is in flight. */
131
+ isSending: boolean;
132
+ /** Last `send` failure, typed (billing / runtime-not-ready / runtime-error),
133
+ * or null. Reset on every new `send` call. */
134
+ sendError: KortixSendError | null;
135
+ models: import("./model-flatten.js").FlatModel[];
136
+ agents: import("@opencode-ai/sdk/v2/types").Agent[];
137
+ defaultAgent: string | null;
138
+ commands: {
139
+ name: string;
140
+ path: string;
141
+ description: string | null;
142
+ }[];
143
+ picks: import("./use-session-picks.js").SessionPicks;
144
+ send: (text: string, override?: {
145
+ model?: ModelKey | null;
146
+ agent?: string | null;
147
+ variant?: string | null;
148
+ }) => void;
149
+ cancel: () => void;
150
+ runCommand: (command: string, args: string) => void;
151
+ /** Answer an agent question through the server and drop it from pending
152
+ * state on success; throws a `KortixSendError` and leaves it pending on
153
+ * failure. */
154
+ answerQuestion: typeof answerQuestion;
155
+ /** Reject an agent question through the server (see `answerQuestion`). */
156
+ rejectQuestion: typeof rejectQuestion;
157
+ /** Answer an agent permission request through the server (see `answerQuestion`). */
158
+ answerPermission: typeof answerPermission;
159
+ /** @deprecated Drops the question from local state WITHOUT replying to the
160
+ * server — the agent run stays blocked waiting on it. Use `answerQuestion`
161
+ * / `rejectQuestion` instead. */
162
+ removeQuestion: (requestId: string) => void;
163
+ /** @deprecated Drops the permission request from local state WITHOUT
164
+ * replying to the server — the agent run stays blocked waiting on it. Use
165
+ * `answerPermission` instead. */
166
+ removePermission: (requestId: string) => void;
167
+ /** Force a re-poll of /start (e.g. a Retry button on the boot screen). */
168
+ retry: () => void;
169
+ };
170
+ export type UseSessionResult = ReturnType<typeof useSession>;
171
+ //# sourceMappingURL=use-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-session.d.ts","sourceRoot":"","sources":["../../src/react/use-session.ts"],"names":[],"mappings":"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"}