@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,958 @@
1
+ 'use client';
2
+ /**
3
+ * kortix-master React Query layer — the generic (host-agnostic) hooks over
4
+ * the `./kortix-master` transport client: query keys, caching/polling config,
5
+ * optimistic-update/invalidation wiring, and the pure normalization/derivation
6
+ * helpers that used to live inline in six apps/web hook files
7
+ * (`use-credentials.ts`, `use-kortix-projects.ts`, `use-kortix-tasks.ts`,
8
+ * `use-kortix-tickets.ts`, `use-milestones.ts`, `use-sandbox-services.ts`).
9
+ *
10
+ * Everything here is transport + cache plumbing — it has zero knowledge of
11
+ * any host's auth stack. The one thing the original web hooks pulled from
12
+ * `useAuth()`/`getUserHandle()` (the current human's id + derived @handle,
13
+ * used to partition query-cache keys and to stamp audit/authorship fields on
14
+ * ticket mutations) is threaded through as an explicit `identity` parameter
15
+ * (`KortixMasterIdentity`) instead — see that type below. Any host (web,
16
+ * mobile, whitelabel-demo, …) supplies its own identity and gets the same
17
+ * hooks.
18
+ *
19
+ * The "active server" resolution (which sandbox these calls hit) does NOT
20
+ * need injecting: `useServerStore`/`getActiveOpenCodeUrl` (`../state/server-store`)
21
+ * is already a host-agnostic part of this SDK — apps/web's
22
+ * `@/stores/server-store` is already just a re-export of it. Hooks here use
23
+ * it directly, exactly like the existing `./use-runtime-reconnect` and
24
+ * `./use-opencode-events` SDK hooks do.
25
+ *
26
+ * Query keys below are copied VERBATIM from the pre-migration web hooks
27
+ * (array literal contents, ordering, and types unchanged) — this is a hard
28
+ * cache-compatibility requirement, not a style choice.
29
+ */
30
+ import { useMutation, useQuery, useQueryClient, keepPreviousData, } from '@tanstack/react-query';
31
+ import { useServerStore } from '../state/server-store.js';
32
+ import {
33
+ // Credentials
34
+ listCredentials, listCredentialEvents, upsertCredential, revealCredential, deleteCredential,
35
+ // Projects
36
+ listKortixProjects, getKortixProject, getKortixProjectBySession, listKortixProjectSessions, deleteKortixProject, patchKortixProject,
37
+ // Tasks
38
+ listTasks, getTask, listTaskEvents, getTaskStatus, createTask, updateTask, startTask, approveTask, deleteTask,
39
+ // Tickets
40
+ listTickets, getTicket, listTicketEvents, createTicket, updateTicket, updateTicketStatus, assignTicket, unassignTicket, commentTicket, deleteTicket, listColumns, replaceColumns, listFields, replaceFields, listTemplates, replaceTemplates, ensurePmSession, listProjectAgents, createProjectAgent, updateProjectAgent, deleteProjectAgent, getAgentPersona, getProjectActivity,
41
+ // Milestones
42
+ listMilestones, getMilestone, listMilestoneEvents, createMilestone, updateMilestone, closeMilestone, reopenMilestone, deleteMilestone,
43
+ // Services
44
+ listServices, listServiceTemplates, getServiceLogs, serviceAction as sdkServiceAction, reconcileServices, registerService, systemReload, } from '../opencode/client.js';
45
+ // ═════════════════════════════════════════════════════════════════════════
46
+ // Credentials — /kortix/projects/:id/credentials
47
+ // ═════════════════════════════════════════════════════════════════════════
48
+ export const credentialKeys = {
49
+ list: (pid) => ['kortix', 'credentials', pid ?? ''],
50
+ events: (pid, name) => ['kortix', 'credentials', pid, name, 'events'],
51
+ };
52
+ export function useCredentials(projectId) {
53
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
54
+ return useQuery({
55
+ queryKey: credentialKeys.list(projectId),
56
+ queryFn: () => listCredentials(serverUrl, projectId),
57
+ enabled: !!projectId,
58
+ refetchInterval: 10_000,
59
+ refetchIntervalInBackground: false,
60
+ placeholderData: keepPreviousData,
61
+ });
62
+ }
63
+ export function useCredentialEvents(projectId, name) {
64
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
65
+ return useQuery({
66
+ queryKey: credentialKeys.events(projectId ?? '', name ?? ''),
67
+ queryFn: () => listCredentialEvents(serverUrl, projectId, name),
68
+ enabled: !!projectId && !!name,
69
+ refetchInterval: 10_000,
70
+ });
71
+ }
72
+ export function useUpsertCredential() {
73
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
74
+ const qc = useQueryClient();
75
+ return useMutation({
76
+ mutationFn: ({ projectId, ...body }) => upsertCredential(serverUrl, projectId, body),
77
+ onSuccess: (_res, vars) => {
78
+ qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
79
+ },
80
+ });
81
+ }
82
+ /** Reveal returns the decrypted value. Each call is audit-logged as a read. */
83
+ export function useRevealCredential() {
84
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
85
+ const qc = useQueryClient();
86
+ return useMutation({
87
+ mutationFn: ({ projectId, name }) => revealCredential(serverUrl, projectId, name),
88
+ onSuccess: (_res, vars) => {
89
+ // Refresh list so last_read_at updates on the card
90
+ qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
91
+ qc.invalidateQueries({ queryKey: credentialKeys.events(vars.projectId, vars.name) });
92
+ },
93
+ });
94
+ }
95
+ export function useDeleteCredential() {
96
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
97
+ const qc = useQueryClient();
98
+ return useMutation({
99
+ mutationFn: ({ projectId, name }) => deleteCredential(serverUrl, projectId, name),
100
+ onSuccess: (_res, vars) => {
101
+ qc.invalidateQueries({ queryKey: credentialKeys.list(vars.projectId) });
102
+ },
103
+ });
104
+ }
105
+ // ═════════════════════════════════════════════════════════════════════════
106
+ // Kortix projects — /kortix/projects
107
+ // ═════════════════════════════════════════════════════════════════════════
108
+ export const kortixKeys = {
109
+ projects: () => ['kortix', 'projects'],
110
+ project: (id) => ['kortix', 'projects', id],
111
+ };
112
+ export function useKortixProjects(identity, _args, options = {}) {
113
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
114
+ return useQuery({
115
+ queryKey: [...kortixKeys.projects(), identity.userId ?? 'anonymous', serverUrl],
116
+ queryFn: () => listKortixProjects(serverUrl),
117
+ enabled: !identity.isLoading && !!identity.userId && !!serverUrl && (options.enabled ?? true),
118
+ staleTime: 30_000,
119
+ gcTime: 5 * 60 * 1000,
120
+ refetchOnWindowFocus: true,
121
+ retry: 3,
122
+ retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 10000),
123
+ });
124
+ }
125
+ export function useKortixProject(identity, id) {
126
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
127
+ return useQuery({
128
+ queryKey: [...kortixKeys.project(id), identity.userId ?? 'anonymous', serverUrl],
129
+ queryFn: () => getKortixProject(serverUrl, id),
130
+ enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!id,
131
+ staleTime: 15_000,
132
+ gcTime: 5 * 60 * 1000,
133
+ retry: 2,
134
+ // Keep previous data while a new query (e.g. from a runtime URL change)
135
+ // is loading. Prevents the skeleton flash.
136
+ placeholderData: keepPreviousData,
137
+ });
138
+ }
139
+ export function useKortixProjectForSession(identity, sessionId, options = {}) {
140
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
141
+ return useQuery({
142
+ queryKey: ['kortix', 'projects', 'by-session', sessionId, identity.userId ?? 'anonymous', serverUrl],
143
+ queryFn: async () => {
144
+ try {
145
+ return await getKortixProjectBySession(serverUrl, sessionId);
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ },
151
+ enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!sessionId && (options.enabled ?? true),
152
+ staleTime: 15_000,
153
+ gcTime: 5 * 60 * 1000,
154
+ placeholderData: keepPreviousData,
155
+ });
156
+ }
157
+ /**
158
+ * Fetch sessions linked to a specific project.
159
+ * Returns OpenCode session objects enriched with title, time, etc.
160
+ */
161
+ export function useKortixProjectSessions(identity, projectId, options = {}) {
162
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
163
+ // `listKortixProjectSessions` itself returns `unknown[]` (its enriched
164
+ // OpenCode-session shape isn't schema-typed at the source) — mirror that
165
+ // here rather than lying about the element shape with `any`.
166
+ return useQuery({
167
+ queryKey: ['kortix', 'projects', projectId, 'sessions', identity.userId ?? 'anonymous', serverUrl],
168
+ queryFn: () => listKortixProjectSessions(serverUrl, projectId),
169
+ enabled: !identity.isLoading && !!identity.userId && !!serverUrl && !!projectId && (options.enabled ?? true),
170
+ staleTime: 15_000,
171
+ gcTime: 5 * 60 * 1000,
172
+ refetchOnWindowFocus: true,
173
+ retry: 2,
174
+ placeholderData: keepPreviousData,
175
+ });
176
+ }
177
+ export function useDeleteProject() {
178
+ const qc = useQueryClient();
179
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
180
+ return useMutation({
181
+ mutationFn: (id) => deleteKortixProject(serverUrl, id),
182
+ onSuccess: () => {
183
+ qc.invalidateQueries({ queryKey: kortixKeys.projects() });
184
+ },
185
+ });
186
+ }
187
+ export function usePatchProject() {
188
+ const qc = useQueryClient();
189
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
190
+ return useMutation({
191
+ mutationFn: ({ id, ...body }) => patchKortixProject(serverUrl, id, body),
192
+ onSuccess: (_d, vars) => {
193
+ qc.invalidateQueries({ queryKey: kortixKeys.project(vars.id) });
194
+ qc.invalidateQueries({ queryKey: kortixKeys.projects() });
195
+ },
196
+ });
197
+ }
198
+ const taskKeys = {
199
+ all: ['kortix', 'tasks'],
200
+ byProject: (projectId) => ['kortix', 'tasks', projectId],
201
+ single: (id) => ['kortix', 'tasks', 'detail', id],
202
+ events: (id) => ['kortix', 'tasks', 'events', id],
203
+ status: (id) => ['kortix', 'tasks', 'status', id],
204
+ };
205
+ const VALID_STATUSES = [
206
+ 'todo', 'in_progress', 'input_needed', 'awaiting_review',
207
+ 'completed', 'cancelled',
208
+ ];
209
+ /** Pure — the daemon's `status` isn't schema-validated, so this normalizes
210
+ * raw rows (defaulting an unrecognized status to `'todo'`) before trusting
211
+ * `KortixTask['status']`. `raw` is genuinely unvalidated wire data — duck-type
212
+ * via `unknown` rather than assume the shape. Exported for direct unit testing. */
213
+ export function normalizeTask(raw) {
214
+ const r = (raw && typeof raw === 'object' ? raw : {});
215
+ const status = VALID_STATUSES.includes(r.status)
216
+ ? r.status
217
+ : 'todo';
218
+ return {
219
+ id: r.id,
220
+ project_id: r.project_id,
221
+ title: r.title || '',
222
+ description: r.description || '',
223
+ verification_condition: r.verification_condition || '',
224
+ status,
225
+ result: r.result ?? null,
226
+ verification_summary: r.verification_summary ?? null,
227
+ blocking_question: r.blocking_question ?? null,
228
+ owner_session_id: r.owner_session_id ?? null,
229
+ owner_agent: r.owner_agent ?? null,
230
+ requested_by_session_id: r.requested_by_session_id ?? null,
231
+ started_at: r.started_at ?? null,
232
+ completed_at: r.completed_at ?? null,
233
+ created_at: r.created_at,
234
+ updated_at: r.updated_at,
235
+ };
236
+ }
237
+ export function useKortixTasks(projectId, status, options = {}) {
238
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
239
+ return useQuery({
240
+ queryKey: [...taskKeys.all, projectId, status],
241
+ queryFn: async () => {
242
+ const rows = await listTasks(serverUrl, { projectId, status });
243
+ return Array.isArray(rows) ? rows.map(normalizeTask) : [];
244
+ },
245
+ enabled: !!projectId && (options.enabled ?? true),
246
+ refetchInterval: options.pollingEnabled === false ? false : 3000,
247
+ refetchIntervalInBackground: false,
248
+ placeholderData: keepPreviousData,
249
+ });
250
+ }
251
+ export function useKortixTask(id, options = {}) {
252
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
253
+ return useQuery({
254
+ queryKey: taskKeys.single(id),
255
+ queryFn: async () => {
256
+ const raw = await getTask(serverUrl, id);
257
+ return normalizeTask(raw);
258
+ },
259
+ enabled: !!id && (options.enabled ?? true),
260
+ refetchInterval: options.pollingEnabled === false ? false : 3000,
261
+ refetchIntervalInBackground: false,
262
+ placeholderData: keepPreviousData,
263
+ });
264
+ }
265
+ export function useKortixTaskEvents(id, options = {}) {
266
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
267
+ return useQuery({
268
+ queryKey: taskKeys.events(id),
269
+ queryFn: async () => {
270
+ const rows = await listTaskEvents(serverUrl, id);
271
+ return Array.isArray(rows) ? rows : [];
272
+ },
273
+ enabled: !!id && (options.enabled ?? true),
274
+ refetchInterval: options.pollingEnabled === false ? false : 3000,
275
+ refetchIntervalInBackground: false,
276
+ placeholderData: keepPreviousData,
277
+ });
278
+ }
279
+ export function useKortixTaskStatus(id, options = {}) {
280
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
281
+ return useQuery({
282
+ queryKey: taskKeys.status(id),
283
+ queryFn: async () => {
284
+ return getTaskStatus(serverUrl, id);
285
+ },
286
+ enabled: !!id && (options.enabled ?? true),
287
+ refetchInterval: options.pollingEnabled === false ? false : 3000,
288
+ refetchIntervalInBackground: false,
289
+ placeholderData: keepPreviousData,
290
+ });
291
+ }
292
+ export function useCreateKortixTask() {
293
+ const qc = useQueryClient();
294
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
295
+ return useMutation({
296
+ mutationFn: (data) => createTask(serverUrl, data),
297
+ onSuccess: () => {
298
+ qc.invalidateQueries({ queryKey: taskKeys.all });
299
+ },
300
+ });
301
+ }
302
+ export function useUpdateKortixTask() {
303
+ const qc = useQueryClient();
304
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
305
+ return useMutation({
306
+ mutationFn: ({ id, ...data }) => updateTask(serverUrl, id, data),
307
+ onSuccess: () => {
308
+ qc.invalidateQueries({ queryKey: taskKeys.all });
309
+ },
310
+ });
311
+ }
312
+ export function useStartKortixTask() {
313
+ const qc = useQueryClient();
314
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
315
+ return useMutation({
316
+ mutationFn: ({ id }) => startTask(serverUrl, id),
317
+ onSuccess: (task) => {
318
+ qc.invalidateQueries({ queryKey: taskKeys.all });
319
+ qc.invalidateQueries({ queryKey: ['kortix', 'projects'] });
320
+ if (task?.project_id) {
321
+ qc.invalidateQueries({ queryKey: ['kortix', 'projects', task.project_id] });
322
+ qc.invalidateQueries({ queryKey: ['kortix', 'projects', task.project_id, 'sessions'] });
323
+ }
324
+ },
325
+ });
326
+ }
327
+ export function useApproveKortixTask() {
328
+ const qc = useQueryClient();
329
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
330
+ return useMutation({
331
+ mutationFn: (id) => approveTask(serverUrl, id),
332
+ onSuccess: () => {
333
+ qc.invalidateQueries({ queryKey: taskKeys.all });
334
+ },
335
+ });
336
+ }
337
+ export function useDeleteKortixTask() {
338
+ const qc = useQueryClient();
339
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
340
+ return useMutation({
341
+ mutationFn: (id) => deleteTask(serverUrl, id),
342
+ onSuccess: () => {
343
+ qc.invalidateQueries({ queryKey: taskKeys.all });
344
+ },
345
+ });
346
+ }
347
+ // ═════════════════════════════════════════════════════════════════════════
348
+ // Tickets — /kortix/tickets, plus columns/fields/templates/agents/pm-session
349
+ // /activity project sub-routes
350
+ // ═════════════════════════════════════════════════════════════════════════
351
+ export const ticketKeys = {
352
+ tickets: (pid) => ['kortix', 'tickets', pid ?? ''],
353
+ ticket: (id) => ['kortix', 'ticket', id],
354
+ events: (id) => ['kortix', 'ticket', id, 'events'],
355
+ columns: (pid) => ['kortix', 'columns', pid],
356
+ fields: (pid) => ['kortix', 'fields', pid],
357
+ templates: (pid) => ['kortix', 'templates', pid],
358
+ agents: (pid) => ['kortix', 'agents', pid],
359
+ };
360
+ export function useTickets(projectId, opts) {
361
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
362
+ return useQuery({
363
+ queryKey: ticketKeys.tickets(projectId),
364
+ queryFn: () => listTickets(serverUrl, projectId),
365
+ enabled: !!projectId && (opts?.enabled ?? true),
366
+ refetchInterval: opts?.pollingEnabled === false ? false : 3000,
367
+ refetchIntervalInBackground: false,
368
+ placeholderData: keepPreviousData,
369
+ });
370
+ }
371
+ export function useTicket(id, opts) {
372
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
373
+ return useQuery({
374
+ queryKey: ticketKeys.ticket(id ?? ''),
375
+ queryFn: () => getTicket(serverUrl, id),
376
+ enabled: !!id && (opts?.enabled ?? true),
377
+ refetchInterval: opts?.pollingEnabled === false ? false : 3000,
378
+ refetchIntervalInBackground: false,
379
+ placeholderData: keepPreviousData,
380
+ });
381
+ }
382
+ export function useTicketEvents(id, opts) {
383
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
384
+ return useQuery({
385
+ queryKey: ticketKeys.events(id ?? ''),
386
+ queryFn: () => listTicketEvents(serverUrl, id),
387
+ enabled: !!id && (opts?.enabled ?? true),
388
+ refetchInterval: opts?.pollingEnabled === false ? false : 3000,
389
+ refetchIntervalInBackground: false,
390
+ placeholderData: keepPreviousData,
391
+ });
392
+ }
393
+ export function useCreateTicket(identity) {
394
+ const qc = useQueryClient();
395
+ const handle = identity.handle;
396
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
397
+ return useMutation({
398
+ mutationFn: (body) => createTicket(serverUrl, {
399
+ ...body,
400
+ actor_type: 'user',
401
+ actor_id: handle,
402
+ created_by_type: 'user',
403
+ created_by_id: handle,
404
+ }),
405
+ onSuccess: (_d, vars) => {
406
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(vars.project_id) });
407
+ },
408
+ });
409
+ }
410
+ export function useUpdateTicket(identity) {
411
+ const qc = useQueryClient();
412
+ const handle = identity.handle;
413
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
414
+ return useMutation({
415
+ mutationFn: ({ id, ...body }) => updateTicket(serverUrl, id, { ...body, actor_type: 'user', actor_id: handle }),
416
+ onSuccess: (t) => {
417
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(t.project_id) });
418
+ qc.invalidateQueries({ queryKey: ticketKeys.ticket(t.id) });
419
+ qc.invalidateQueries({ queryKey: ticketKeys.events(t.id) });
420
+ },
421
+ });
422
+ }
423
+ export function useUpdateTicketStatus(identity) {
424
+ const qc = useQueryClient();
425
+ const handle = identity.handle;
426
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
427
+ return useMutation({
428
+ mutationFn: ({ id, status }) => updateTicketStatus(serverUrl, id, { status, actor_type: 'user', actor_id: handle }),
429
+ onSuccess: (r) => {
430
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
431
+ qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
432
+ qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
433
+ },
434
+ });
435
+ }
436
+ export function useAssignTicket(identity) {
437
+ const qc = useQueryClient();
438
+ const handle = identity.handle;
439
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
440
+ return useMutation({
441
+ mutationFn: ({ id, assignee_type, assignee_id }) => assignTicket(serverUrl, id, { assignee_type, assignee_id, actor_type: 'user', actor_id: handle }),
442
+ onSuccess: (r) => {
443
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
444
+ qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
445
+ qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
446
+ },
447
+ });
448
+ }
449
+ export function useUnassignTicket(identity) {
450
+ const qc = useQueryClient();
451
+ const handle = identity.handle;
452
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
453
+ return useMutation({
454
+ mutationFn: ({ id, assignee_type, assignee_id }) => unassignTicket(serverUrl, id, { assignee_type, assignee_id, actor_type: 'user', actor_id: handle }),
455
+ onSuccess: (r) => {
456
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(r.ticket.project_id) });
457
+ qc.invalidateQueries({ queryKey: ticketKeys.ticket(r.ticket.id) });
458
+ qc.invalidateQueries({ queryKey: ticketKeys.events(r.ticket.id) });
459
+ },
460
+ });
461
+ }
462
+ export function useCommentTicket(identity) {
463
+ const qc = useQueryClient();
464
+ const handle = identity.handle;
465
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
466
+ return useMutation({
467
+ mutationFn: ({ id, body }) => commentTicket(serverUrl, id, { body, actor_type: 'user', actor_id: handle }),
468
+ onSuccess: (_d, vars) => {
469
+ qc.invalidateQueries({ queryKey: ticketKeys.events(vars.id) });
470
+ qc.invalidateQueries({ queryKey: ticketKeys.ticket(vars.id) });
471
+ },
472
+ });
473
+ }
474
+ export function useDeleteTicket() {
475
+ const qc = useQueryClient();
476
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
477
+ return useMutation({
478
+ mutationFn: (id) => deleteTicket(serverUrl, id),
479
+ onSuccess: () => { qc.invalidateQueries({ queryKey: ['kortix', 'tickets'] }); },
480
+ });
481
+ }
482
+ // ── Columns ──────────────────────────────────────────────────────────────────
483
+ export function useColumns(projectId) {
484
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
485
+ return useQuery({
486
+ queryKey: ticketKeys.columns(projectId ?? ''),
487
+ queryFn: () => listColumns(serverUrl, projectId),
488
+ enabled: !!projectId,
489
+ staleTime: 30_000,
490
+ });
491
+ }
492
+ export function useReplaceColumns() {
493
+ const qc = useQueryClient();
494
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
495
+ return useMutation({
496
+ mutationFn: ({ projectId, columns }) => replaceColumns(serverUrl, projectId, columns),
497
+ onSuccess: (_d, vars) => {
498
+ qc.invalidateQueries({ queryKey: ticketKeys.columns(vars.projectId) });
499
+ qc.invalidateQueries({ queryKey: ticketKeys.tickets(vars.projectId) });
500
+ },
501
+ });
502
+ }
503
+ // ── Fields ───────────────────────────────────────────────────────────────────
504
+ export function useFields(projectId) {
505
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
506
+ return useQuery({
507
+ queryKey: ticketKeys.fields(projectId ?? ''),
508
+ queryFn: () => listFields(serverUrl, projectId),
509
+ enabled: !!projectId,
510
+ staleTime: 30_000,
511
+ });
512
+ }
513
+ export function useReplaceFields() {
514
+ const qc = useQueryClient();
515
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
516
+ return useMutation({
517
+ mutationFn: ({ projectId, fields }) => replaceFields(serverUrl, projectId, fields),
518
+ onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.fields(vars.projectId) }); },
519
+ });
520
+ }
521
+ // ── Templates ────────────────────────────────────────────────────────────────
522
+ export function useTemplates(projectId) {
523
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
524
+ return useQuery({
525
+ queryKey: ticketKeys.templates(projectId ?? ''),
526
+ queryFn: () => listTemplates(serverUrl, projectId),
527
+ enabled: !!projectId,
528
+ staleTime: 30_000,
529
+ });
530
+ }
531
+ export function useReplaceTemplates() {
532
+ const qc = useQueryClient();
533
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
534
+ return useMutation({
535
+ mutationFn: ({ projectId, templates }) => replaceTemplates(serverUrl, projectId, templates),
536
+ onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.templates(vars.projectId) }); },
537
+ });
538
+ }
539
+ // ── PM chat session ──────────────────────────────────────────────────────────
540
+ /**
541
+ * Ensure (create-if-missing) a project-level session bound to the Project
542
+ * Manager agent. Idempotent on the backend — first call creates + binds,
543
+ * subsequent calls return the existing session id so the thread continues.
544
+ */
545
+ export function useEnsurePmSession() {
546
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
547
+ return useMutation({
548
+ mutationFn: ({ projectId }) => ensurePmSession(serverUrl, projectId),
549
+ });
550
+ }
551
+ // ── Agents (team) ────────────────────────────────────────────────────────────
552
+ export function useProjectAgents(projectId) {
553
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
554
+ return useQuery({
555
+ queryKey: ticketKeys.agents(projectId ?? ''),
556
+ queryFn: () => listProjectAgents(serverUrl, projectId),
557
+ enabled: !!projectId,
558
+ staleTime: 30_000,
559
+ });
560
+ }
561
+ export function useCreateProjectAgent() {
562
+ const qc = useQueryClient();
563
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
564
+ return useMutation({
565
+ mutationFn: ({ projectId, slug, name, body_md, execution_mode, tool_groups, default_assignee_columns, default_model, color_hue, icon, }) => createProjectAgent(serverUrl, projectId, {
566
+ slug, name, body_md, execution_mode, tool_groups, default_assignee_columns, default_model, color_hue, icon,
567
+ }),
568
+ onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
569
+ });
570
+ }
571
+ export function useUpdateProjectAgent() {
572
+ const qc = useQueryClient();
573
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
574
+ return useMutation({
575
+ mutationFn: ({ projectId, slug, ...body }) => updateProjectAgent(serverUrl, projectId, slug, body),
576
+ onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
577
+ });
578
+ }
579
+ export function useDeleteProjectAgent() {
580
+ const qc = useQueryClient();
581
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
582
+ return useMutation({
583
+ mutationFn: ({ projectId, slug }) => deleteProjectAgent(serverUrl, projectId, slug),
584
+ onSuccess: (_d, vars) => { qc.invalidateQueries({ queryKey: ticketKeys.agents(vars.projectId) }); },
585
+ });
586
+ }
587
+ export function useAgentPersona(projectId, slug, opts) {
588
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
589
+ return useQuery({
590
+ queryKey: ['kortix', 'agent-persona', projectId ?? '', slug ?? ''],
591
+ queryFn: () => getAgentPersona(serverUrl, projectId, slug),
592
+ enabled: !!projectId && !!slug && (opts?.enabled ?? true),
593
+ });
594
+ }
595
+ // ── Project activity / notifications ─────────────────────────────────────────
596
+ export function useProjectActivity(projectId, opts) {
597
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
598
+ return useQuery({
599
+ queryKey: ['kortix', 'project-activity', projectId ?? ''],
600
+ queryFn: () => getProjectActivity(serverUrl, projectId, 200),
601
+ enabled: !!projectId && (opts?.enabled ?? true),
602
+ refetchInterval: opts?.pollingEnabled === false ? false : 10_000,
603
+ refetchIntervalInBackground: false,
604
+ placeholderData: keepPreviousData,
605
+ });
606
+ }
607
+ /**
608
+ * Count events that are meaningful for the current human:
609
+ * - they were assigned to this user (user.assignee_id === handle)
610
+ * - they were @-mentioned in a comment body (message contains `@handle`)
611
+ * - a teammate commented on a ticket the user is tracking (not implemented;
612
+ * for v1 the assignment/@-mention covers the critical surface).
613
+ *
614
+ * Filters out events the user themselves produced. Uses the client-side
615
+ * `sinceIso` (usually localStorage last-seen for the project) as the cutoff.
616
+ *
617
+ * Pure — takes `handle` as an explicit parameter rather than reading it from
618
+ * an auth hook. Exported for direct unit testing.
619
+ */
620
+ export function computeUnread(events, handle, sinceIso) {
621
+ const byTicket = new Map();
622
+ let latest = null;
623
+ let total = 0;
624
+ if (!events)
625
+ return { total, byTicket, latestAt: null };
626
+ const h = handle.toLowerCase();
627
+ const mentionRe = new RegExp(`(^|\\s)@${h.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\b`, 'i');
628
+ for (const ev of events) {
629
+ if (sinceIso && ev.created_at <= sinceIso)
630
+ continue;
631
+ if (!latest || ev.created_at > latest)
632
+ latest = ev.created_at;
633
+ // Skip events the user themselves initiated (actor_type=user,actor_id=handle).
634
+ if (ev.actor_type === 'user' && (ev.actor_id ?? '').toLowerCase() === h)
635
+ continue;
636
+ let hit = false;
637
+ if (ev.type === 'assigned') {
638
+ try {
639
+ const p = ev.payload_json ? JSON.parse(ev.payload_json) : null;
640
+ if (p?.assignee_type === 'user' && (p.assignee_id ?? '').toLowerCase() === h)
641
+ hit = true;
642
+ }
643
+ catch { }
644
+ }
645
+ else if (ev.type === 'comment' && ev.message && mentionRe.test(ev.message)) {
646
+ hit = true;
647
+ }
648
+ if (!hit)
649
+ continue;
650
+ total++;
651
+ byTicket.set(ev.ticket_id, (byTicket.get(ev.ticket_id) ?? 0) + 1);
652
+ }
653
+ return { total, byTicket, latestAt: latest };
654
+ }
655
+ /**
656
+ * Turn the raw activity stream into a list of user-facing notifications.
657
+ * Scoped to assignments + @mentions, same rule set as computeUnread — we
658
+ * just keep the event itself so the UI can render actor avatars, ticket
659
+ * titles, relative times, and the comment body that caused a mention.
660
+ *
661
+ * Pure — same `handle`-as-parameter shape as {@link computeUnread}.
662
+ */
663
+ export function computeNotifications(events, handle, sinceIso) {
664
+ if (!events)
665
+ return [];
666
+ const h = handle.toLowerCase();
667
+ const mentionRe = new RegExp(`(^|\\s)@${h.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\b`, 'i');
668
+ const out = [];
669
+ for (const ev of events) {
670
+ if (sinceIso && ev.created_at <= sinceIso)
671
+ continue;
672
+ if (ev.actor_type === 'user' && (ev.actor_id ?? '').toLowerCase() === h)
673
+ continue;
674
+ if (ev.type === 'assigned') {
675
+ try {
676
+ const p = ev.payload_json ? JSON.parse(ev.payload_json) : null;
677
+ if (p?.assignee_type === 'user' && (p.assignee_id ?? '').toLowerCase() === h) {
678
+ out.push({ event: ev, ticket_id: ev.ticket_id, kind: 'assigned' });
679
+ }
680
+ }
681
+ catch { }
682
+ }
683
+ else if (ev.type === 'comment' && ev.message && mentionRe.test(ev.message)) {
684
+ out.push({ event: ev, ticket_id: ev.ticket_id, kind: 'mention', relatedComment: ev });
685
+ }
686
+ }
687
+ return out;
688
+ }
689
+ const LAST_SEEN_KEY = (projectId, handle) => `kortix:activity-last-seen:${projectId}:${handle}`;
690
+ export const LAST_SEEN_EVENT = 'kortix:last-seen-changed';
691
+ export function readLastSeen(projectId, handle) {
692
+ if (typeof window === 'undefined')
693
+ return null;
694
+ try {
695
+ return window.localStorage.getItem(LAST_SEEN_KEY(projectId, handle));
696
+ }
697
+ catch {
698
+ return null;
699
+ }
700
+ }
701
+ export function writeLastSeen(projectId, handle, iso) {
702
+ if (typeof window === 'undefined')
703
+ return;
704
+ try {
705
+ window.localStorage.setItem(LAST_SEEN_KEY(projectId, handle), iso);
706
+ // Same-tab listeners (e.g. the sidebar project rows) don't receive the
707
+ // native 'storage' event — emit a custom one so they refresh instantly.
708
+ window.dispatchEvent(new CustomEvent(LAST_SEEN_EVENT, { detail: { projectId, handle, iso } }));
709
+ }
710
+ catch { }
711
+ }
712
+ // ── Helpers ──────────────────────────────────────────────────────────────────
713
+ export function safeParseJsonArray(s) {
714
+ if (!s)
715
+ return [];
716
+ try {
717
+ const v = JSON.parse(s);
718
+ return Array.isArray(v) ? v.map(String) : [];
719
+ }
720
+ catch {
721
+ return [];
722
+ }
723
+ }
724
+ export function parseCustomFields(json) {
725
+ if (!json)
726
+ return {};
727
+ try {
728
+ const v = JSON.parse(json);
729
+ return v && typeof v === 'object' ? v : {};
730
+ }
731
+ catch {
732
+ return {};
733
+ }
734
+ }
735
+ // ═════════════════════════════════════════════════════════════════════════
736
+ // Milestones — /kortix/projects/:id/milestones
737
+ // ═════════════════════════════════════════════════════════════════════════
738
+ export const milestoneKeys = {
739
+ list: (pid, status = 'all') => ['kortix', 'milestones', pid ?? '', status],
740
+ detail: (pid, ref) => ['kortix', 'milestone', pid, ref],
741
+ events: (pid, ref) => ['kortix', 'milestone', pid, ref, 'events'],
742
+ };
743
+ export function useMilestones(projectId, statusFilter = 'all') {
744
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
745
+ return useQuery({
746
+ queryKey: milestoneKeys.list(projectId, statusFilter),
747
+ queryFn: () => listMilestones(serverUrl, projectId, statusFilter),
748
+ enabled: !!projectId,
749
+ refetchInterval: 5000,
750
+ refetchIntervalInBackground: false,
751
+ placeholderData: keepPreviousData,
752
+ });
753
+ }
754
+ export function useMilestone(projectId, ref) {
755
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
756
+ return useQuery({
757
+ queryKey: milestoneKeys.detail(projectId ?? '', ref ?? ''),
758
+ queryFn: () => getMilestone(serverUrl, projectId, ref),
759
+ enabled: !!projectId && !!ref,
760
+ refetchInterval: 5000,
761
+ refetchIntervalInBackground: false,
762
+ placeholderData: keepPreviousData,
763
+ });
764
+ }
765
+ export function useMilestoneEvents(projectId, ref) {
766
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
767
+ return useQuery({
768
+ queryKey: milestoneKeys.events(projectId ?? '', ref ?? ''),
769
+ queryFn: () => listMilestoneEvents(serverUrl, projectId, ref),
770
+ enabled: !!projectId && !!ref,
771
+ refetchInterval: 5000,
772
+ placeholderData: keepPreviousData,
773
+ });
774
+ }
775
+ export function useCreateMilestone() {
776
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
777
+ const qc = useQueryClient();
778
+ return useMutation({
779
+ mutationFn: ({ projectId, ...body }) => createMilestone(serverUrl, projectId, body),
780
+ onSuccess: (_res, vars) => {
781
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
782
+ },
783
+ });
784
+ }
785
+ export function useUpdateMilestone() {
786
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
787
+ const qc = useQueryClient();
788
+ return useMutation({
789
+ mutationFn: ({ projectId, ref, patch }) => updateMilestone(serverUrl, projectId, ref, patch),
790
+ onSuccess: (_res, vars) => {
791
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
792
+ qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
793
+ },
794
+ });
795
+ }
796
+ export function useCloseMilestone() {
797
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
798
+ const qc = useQueryClient();
799
+ return useMutation({
800
+ mutationFn: ({ projectId, ref, summary_md, cancelled }) => closeMilestone(serverUrl, projectId, ref, { summary_md, cancelled }),
801
+ onSuccess: (_res, vars) => {
802
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
803
+ qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
804
+ },
805
+ });
806
+ }
807
+ export function useReopenMilestone() {
808
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
809
+ const qc = useQueryClient();
810
+ return useMutation({
811
+ mutationFn: ({ projectId, ref }) => reopenMilestone(serverUrl, projectId, ref),
812
+ onSuccess: (_res, vars) => {
813
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
814
+ qc.invalidateQueries({ queryKey: milestoneKeys.detail(vars.projectId, vars.ref) });
815
+ },
816
+ });
817
+ }
818
+ export function useDeleteMilestone() {
819
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
820
+ const qc = useQueryClient();
821
+ return useMutation({
822
+ mutationFn: ({ projectId, ref }) => deleteMilestone(serverUrl, projectId, ref),
823
+ onSuccess: (_res, vars) => {
824
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
825
+ },
826
+ });
827
+ }
828
+ /** Link or unlink a ticket's milestone. Goes through PATCH /kortix/tickets/:id. */
829
+ export function useSetTicketMilestone() {
830
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
831
+ const qc = useQueryClient();
832
+ return useMutation({
833
+ mutationFn: ({ ticketId, milestoneId }) => updateTicket(serverUrl, ticketId, { milestone_id: milestoneId }),
834
+ onSuccess: (_res, vars) => {
835
+ qc.invalidateQueries({ queryKey: ['kortix', 'milestones', vars.projectId] });
836
+ qc.invalidateQueries({ queryKey: ['kortix', 'tickets', vars.projectId] });
837
+ qc.invalidateQueries({ queryKey: ['kortix', 'ticket', vars.ticketId] });
838
+ },
839
+ });
840
+ }
841
+ // ═════════════════════════════════════════════════════════════════════════
842
+ // Sandbox services — /kortix/services
843
+ // ═════════════════════════════════════════════════════════════════════════
844
+ const getActiveServerUrl = () => {
845
+ return useServerStore.getState().getActiveServerUrl();
846
+ };
847
+ export const serviceKeys = {
848
+ all: ['sandbox-services'],
849
+ list: (serverUrl, includeAll) => ['sandbox-services', serverUrl, includeAll ? 'all' : 'visible'],
850
+ logs: (serverUrl, serviceId) => ['sandbox-services', serverUrl, 'logs', serviceId],
851
+ templates: (serverUrl) => ['sandbox-services', serverUrl, 'templates'],
852
+ };
853
+ export function useSandboxServices(identity, options) {
854
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
855
+ const includeAll = options?.includeAll ?? false;
856
+ return useQuery({
857
+ queryKey: [...serviceKeys.list(serverUrl, includeAll), identity.userId ?? 'anonymous'],
858
+ queryFn: async () => {
859
+ if (!serverUrl)
860
+ return [];
861
+ return listServices(serverUrl, includeAll);
862
+ },
863
+ enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl,
864
+ staleTime: 5_000,
865
+ gcTime: 60_000,
866
+ refetchInterval: 5_000,
867
+ refetchIntervalInBackground: false,
868
+ refetchOnWindowFocus: true,
869
+ });
870
+ }
871
+ export function useSandboxServiceTemplates(identity, options) {
872
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
873
+ return useQuery({
874
+ queryKey: [...serviceKeys.templates(serverUrl), identity.userId ?? 'anonymous'],
875
+ queryFn: async () => {
876
+ if (!serverUrl)
877
+ return [];
878
+ return listServiceTemplates(serverUrl);
879
+ },
880
+ enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl,
881
+ staleTime: 60_000,
882
+ gcTime: 5 * 60_000,
883
+ });
884
+ }
885
+ export function useSandboxServiceLogs(identity, serviceId, options) {
886
+ const serverUrl = useServerStore((s) => s.getActiveServerUrl());
887
+ return useQuery({
888
+ queryKey: serviceId
889
+ ? [...serviceKeys.logs(serverUrl, serviceId), identity.userId ?? 'anonymous']
890
+ : ['sandbox-services', serverUrl, 'logs', 'none', identity.userId ?? 'anonymous'],
891
+ queryFn: async () => {
892
+ if (!serverUrl || !serviceId)
893
+ return [];
894
+ return getServiceLogs(serverUrl, serviceId);
895
+ },
896
+ enabled: (options?.enabled ?? true) && !identity.isLoading && !!identity.userId && !!serverUrl && !!serviceId,
897
+ staleTime: 3_000,
898
+ gcTime: 60_000,
899
+ refetchInterval: serviceId ? 3_000 : false,
900
+ refetchIntervalInBackground: false,
901
+ });
902
+ }
903
+ export function useSandboxServiceAction() {
904
+ const queryClient = useQueryClient();
905
+ return useMutation({
906
+ mutationFn: async ({ serviceId, action }) => {
907
+ const serverUrl = getActiveServerUrl();
908
+ if (!serverUrl)
909
+ throw new Error('No active instance selected');
910
+ return sdkServiceAction(serverUrl, serviceId, action);
911
+ },
912
+ onSuccess: () => {
913
+ const serverUrl = getActiveServerUrl();
914
+ queryClient.invalidateQueries({ queryKey: serviceKeys.all });
915
+ if (serverUrl) {
916
+ queryClient.invalidateQueries({ queryKey: serviceKeys.templates(serverUrl) });
917
+ }
918
+ },
919
+ });
920
+ }
921
+ export function useSandboxServiceReconcile() {
922
+ const queryClient = useQueryClient();
923
+ return useMutation({
924
+ mutationFn: async ({ reload } = {}) => {
925
+ const serverUrl = getActiveServerUrl();
926
+ if (!serverUrl)
927
+ throw new Error('No active instance selected');
928
+ return reconcileServices(serverUrl, reload);
929
+ },
930
+ onSuccess: () => {
931
+ queryClient.invalidateQueries({ queryKey: serviceKeys.all });
932
+ },
933
+ });
934
+ }
935
+ export function useRegisterSandboxService() {
936
+ const queryClient = useQueryClient();
937
+ return useMutation({
938
+ mutationFn: async (payload) => {
939
+ const serverUrl = getActiveServerUrl();
940
+ if (!serverUrl)
941
+ throw new Error('No active instance selected');
942
+ return registerService(serverUrl, payload);
943
+ },
944
+ onSuccess: () => {
945
+ queryClient.invalidateQueries({ queryKey: serviceKeys.all });
946
+ },
947
+ });
948
+ }
949
+ // Reload already has a home in the SDK (`systemReload` in `../opencode/client`,
950
+ // backing `POST /kortix/services/system/reload`) — reused directly rather
951
+ // than duplicated here. It resolves the active runtime URL itself (the same
952
+ // zustand state `getActiveServerUrl()` above reads).
953
+ export function useSandboxRuntimeReload() {
954
+ return useMutation({
955
+ mutationFn: ({ mode }) => systemReload(mode),
956
+ });
957
+ }
958
+ //# sourceMappingURL=use-kortix-master.js.map