@opengeni/react 1.0.1 → 1.0.2-canary.37202341988001

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 (632) hide show
  1. package/README.md +660 -21
  2. package/dist/accounts.d.ts +64 -0
  3. package/dist/accounts.js +822 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/approvals.d.ts +2 -1
  6. package/dist/artifacts-document.js +3 -2
  7. package/dist/artifacts-presentation.js +3 -2
  8. package/dist/artifacts-spreadsheet.js +2 -2
  9. package/dist/artifacts.d.ts +4 -1
  10. package/dist/artifacts.js +518 -42
  11. package/dist/artifacts.js.map +1 -1
  12. package/dist/browser-viewer-SHYKQRNX.js +16 -0
  13. package/dist/capability-catalog-row.d.ts +20 -0
  14. package/dist/capability-logo-fallback.d.ts +3 -0
  15. package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
  16. package/dist/chat-interactive-block-UGBTNB3L.js.map +1 -0
  17. package/dist/chunk-26ZNDDLZ.js +453 -0
  18. package/dist/chunk-26ZNDDLZ.js.map +1 -0
  19. package/dist/chunk-3CTRFMAK.js +359 -0
  20. package/dist/chunk-3CTRFMAK.js.map +1 -0
  21. package/dist/chunk-447JLCBU.js +209 -0
  22. package/dist/chunk-447JLCBU.js.map +1 -0
  23. package/dist/chunk-4RVYOY4O.js +379 -0
  24. package/dist/chunk-4RVYOY4O.js.map +1 -0
  25. package/dist/chunk-5CVXZA3Y.js +292 -0
  26. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  27. package/dist/chunk-5J4FOW6Q.js +108 -0
  28. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  29. package/dist/chunk-742CZ3L3.js +481 -0
  30. package/dist/chunk-742CZ3L3.js.map +1 -0
  31. package/dist/chunk-A2PI6UMY.js +41 -0
  32. package/dist/chunk-A2PI6UMY.js.map +1 -0
  33. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  34. package/dist/chunk-A4UJB2MM.js.map +1 -0
  35. package/dist/chunk-B3V6TG77.js +41 -0
  36. package/dist/chunk-B3V6TG77.js.map +1 -0
  37. package/dist/chunk-BRM6FVZA.js +302 -0
  38. package/dist/chunk-BRM6FVZA.js.map +1 -0
  39. package/dist/chunk-C5X5AJXK.js +182 -0
  40. package/dist/chunk-C5X5AJXK.js.map +1 -0
  41. package/dist/{chunk-6KLX2RH5.js → chunk-DO544OSV.js} +1075 -79
  42. package/dist/chunk-DO544OSV.js.map +1 -0
  43. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  44. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  45. package/dist/{chunk-HA46CYQK.js → chunk-EESD3PY3.js} +792 -537
  46. package/dist/chunk-EESD3PY3.js.map +1 -0
  47. package/dist/{chunk-5UQPNLIO.js → chunk-EN3YTHKR.js} +4117 -3896
  48. package/dist/chunk-EN3YTHKR.js.map +1 -0
  49. package/dist/chunk-ERGYJIBB.js +21 -0
  50. package/dist/chunk-ERGYJIBB.js.map +1 -0
  51. package/dist/chunk-FZCP527Y.js +116 -0
  52. package/dist/chunk-FZCP527Y.js.map +1 -0
  53. package/dist/chunk-GIMRELBW.js +14 -0
  54. package/dist/chunk-GIMRELBW.js.map +1 -0
  55. package/dist/chunk-GYVRFZDY.js +2733 -0
  56. package/dist/chunk-GYVRFZDY.js.map +1 -0
  57. package/dist/{chunk-LLOLUHVG.js → chunk-HDJWDK7W.js} +1358 -2746
  58. package/dist/chunk-HDJWDK7W.js.map +1 -0
  59. package/dist/chunk-I7IWRQLN.js +1608 -0
  60. package/dist/chunk-I7IWRQLN.js.map +1 -0
  61. package/dist/chunk-IT4BJUGF.js +13055 -0
  62. package/dist/chunk-IT4BJUGF.js.map +1 -0
  63. package/dist/chunk-IWIDV7SB.js +1 -0
  64. package/dist/chunk-IWIDV7SB.js.map +1 -0
  65. package/dist/chunk-J2QWVSQY.js +312 -0
  66. package/dist/chunk-J2QWVSQY.js.map +1 -0
  67. package/dist/chunk-J6DBS4T3.js +371 -0
  68. package/dist/chunk-J6DBS4T3.js.map +1 -0
  69. package/dist/{chunk-B6WPZSTT.js → chunk-JIQYUGVL.js} +1331 -1163
  70. package/dist/chunk-JIQYUGVL.js.map +1 -0
  71. package/dist/chunk-JT4JW7BC.js +54 -0
  72. package/dist/chunk-JT4JW7BC.js.map +1 -0
  73. package/dist/chunk-K3HQAKQX.js +24 -0
  74. package/dist/chunk-K3HQAKQX.js.map +1 -0
  75. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  76. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  77. package/dist/chunk-RHREZ7BO.js +11 -0
  78. package/dist/chunk-RHREZ7BO.js.map +1 -0
  79. package/dist/chunk-RLUSC2WA.js +299 -0
  80. package/dist/chunk-RLUSC2WA.js.map +1 -0
  81. package/dist/{chunk-IGC6A2ZI.js → chunk-RSI7XYXL.js} +777 -246
  82. package/dist/chunk-RSI7XYXL.js.map +1 -0
  83. package/dist/chunk-SCOTPE2I.js +589 -0
  84. package/dist/chunk-SCOTPE2I.js.map +1 -0
  85. package/dist/{chunk-C5ZPSSS5.js → chunk-TKOTKRWY.js} +5 -4
  86. package/dist/{chunk-C5ZPSSS5.js.map → chunk-TKOTKRWY.js.map} +1 -1
  87. package/dist/chunk-TMYGL6X5.js +742 -0
  88. package/dist/chunk-TMYGL6X5.js.map +1 -0
  89. package/dist/chunk-UGLEYEMP.js +33 -0
  90. package/dist/chunk-UGLEYEMP.js.map +1 -0
  91. package/dist/chunk-UK4TINKT.js +27 -0
  92. package/dist/chunk-UK4TINKT.js.map +1 -0
  93. package/dist/chunk-UTRTG6LH.js +220 -0
  94. package/dist/chunk-UTRTG6LH.js.map +1 -0
  95. package/dist/chunk-WEHMPOXK.js +39 -0
  96. package/dist/chunk-WEHMPOXK.js.map +1 -0
  97. package/dist/chunk-WGXVEJO5.js +319 -0
  98. package/dist/chunk-WGXVEJO5.js.map +1 -0
  99. package/dist/chunk-WRHIZYZF.js +988 -0
  100. package/dist/chunk-WRHIZYZF.js.map +1 -0
  101. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  102. package/dist/chunk-WUISZ3WU.js.map +1 -0
  103. package/dist/chunk-XCHWDJ22.js +107 -0
  104. package/dist/chunk-XCHWDJ22.js.map +1 -0
  105. package/dist/{chunk-KCGXPP5V.js → chunk-Y2PRMYLC.js} +11 -6
  106. package/dist/chunk-Y2PRMYLC.js.map +1 -0
  107. package/dist/chunk-YBXQDQFX.js +1772 -0
  108. package/dist/chunk-YBXQDQFX.js.map +1 -0
  109. package/dist/chunk-YM2DE7BQ.js +3124 -0
  110. package/dist/chunk-YM2DE7BQ.js.map +1 -0
  111. package/dist/{chunk-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  112. package/dist/chunk-YQEAA6LT.js.map +1 -0
  113. package/dist/chunk-YV4L3ILF.js +9 -0
  114. package/dist/chunk-YV4L3ILF.js.map +1 -0
  115. package/dist/chunk-ZYRGEKWS.js +216 -0
  116. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  117. package/dist/client.d.ts +7 -4
  118. package/dist/clipboard.js +1 -0
  119. package/dist/commands/types.d.ts +2 -0
  120. package/dist/components/anthropic-mark.d.ts +3 -0
  121. package/dist/components/approval-surface.d.ts +15 -0
  122. package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
  123. package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
  124. package/dist/components/artifacts/artifact-surface.d.ts +3 -1
  125. package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
  126. package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
  127. package/dist/components/artifacts/document-editor.d.ts +4 -2
  128. package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
  129. package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
  130. package/dist/components/artifacts/editable-document.d.ts +1 -1
  131. package/dist/components/artifacts/editable-presentation.d.ts +2 -2
  132. package/dist/components/artifacts/editable-spreadsheet.d.ts +2 -1
  133. package/dist/components/artifacts/index.d.ts +8 -1
  134. package/dist/components/artifacts/inline-html-document.d.ts +2 -0
  135. package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
  136. package/dist/components/artifacts/presentation-editor.d.ts +6 -2
  137. package/dist/components/artifacts/published-html-artifact-frame.d.ts +48 -3
  138. package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
  139. package/dist/components/artifacts/site-view.d.ts +23 -0
  140. package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
  141. package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
  142. package/dist/components/browser-select-control.d.ts +16 -0
  143. package/dist/components/browser-viewer.d.ts +10 -1
  144. package/dist/components/chat-composer.d.ts +21 -3
  145. package/dist/components/child-session-link.d.ts +5 -0
  146. package/dist/components/claude-mark.d.ts +3 -0
  147. package/dist/components/code-editor.d.ts +1 -4
  148. package/dist/components/composer.d.ts +45 -4
  149. package/dist/components/computer-viewer.d.ts +4 -1
  150. package/dist/components/copy-button.d.ts +3 -1
  151. package/dist/components/desktop-viewer.d.ts +1 -1
  152. package/dist/components/enrollment-consent.d.ts +6 -3
  153. package/dist/components/file-browser.d.ts +10 -1
  154. package/dist/components/fleet-tile.d.ts +2 -2
  155. package/dist/components/grok-mark.d.ts +26 -0
  156. package/dist/components/human-input-form.d.ts +21 -2
  157. package/dist/components/human-input-surface.d.ts +6 -3
  158. package/dist/components/machine-card.d.ts +4 -1
  159. package/dist/components/machines/machine-detail.d.ts +4 -1
  160. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  161. package/dist/components/machines-dashboard.d.ts +3 -1
  162. package/dist/components/markdown-table-layout.d.ts +12 -0
  163. package/dist/components/markdown.d.ts +47 -3
  164. package/dist/components/message-timeline.d.ts +72 -9
  165. package/dist/components/model-mark.d.ts +29 -0
  166. package/dist/components/model-policy-picker-menu.d.ts +9 -0
  167. package/dist/components/model-policy-picker.d.ts +62 -13
  168. package/dist/components/open-geni-chat.d.ts +58 -0
  169. package/dist/components/open-geni-links.d.ts +68 -0
  170. package/dist/components/openrouter-mark.d.ts +6 -0
  171. package/dist/components/pierre-file.d.ts +1 -1
  172. package/dist/components/preview-loading.d.ts +2 -0
  173. package/dist/components/queue-item-content.d.ts +9 -0
  174. package/dist/components/sandbox-files.d.ts +13 -2
  175. package/dist/components/sandbox-workspace.d.ts +43 -3
  176. package/dist/components/session-capability-frame.d.ts +35 -0
  177. package/dist/components/session-chrome.d.ts +66 -8
  178. package/dist/components/session-commands-panel.d.ts +6 -0
  179. package/dist/components/session-commands.d.ts +6 -0
  180. package/dist/components/session-connection-request.d.ts +8 -0
  181. package/dist/components/session-conversation.d.ts +89 -0
  182. package/dist/components/session-list.d.ts +36 -0
  183. package/dist/components/session-mcp-capability-card.d.ts +41 -0
  184. package/dist/components/session-proxy-scope.d.ts +21 -0
  185. package/dist/components/timeline-anchor.d.ts +24 -0
  186. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  187. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  188. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  189. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  190. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  191. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  192. package/dist/components/timeline-annotations.d.ts +13 -3
  193. package/dist/components/timeline-reading-progress.d.ts +11 -0
  194. package/dist/components/timeline-search.d.ts +34 -0
  195. package/dist/components/timeline-settlement.d.ts +16 -0
  196. package/dist/components/tip-follow.d.ts +16 -0
  197. package/dist/components/usage-limit-notice.d.ts +49 -0
  198. package/dist/components/usage-member-list.d.ts +91 -0
  199. package/dist/components/usage-meter.d.ts +73 -0
  200. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  201. package/dist/components/user-message-body.d.ts +10 -1
  202. package/dist/components/workspace-dock.d.ts +6 -2
  203. package/dist/composer.d.ts +5 -4
  204. package/dist/composer.js +15 -9
  205. package/dist/computer-viewer-6SRGWRUX.js +19 -0
  206. package/dist/computer-viewer-6SRGWRUX.js.map +1 -0
  207. package/dist/connect-account-identity.d.ts +8 -0
  208. package/dist/connect-accounts.d.ts +15 -0
  209. package/dist/connect-chooser.d.ts +18 -0
  210. package/dist/connect-panel.d.ts +18 -0
  211. package/dist/connect-setup.d.ts +16 -0
  212. package/dist/connect.d.ts +21 -0
  213. package/dist/connect.js +2129 -0
  214. package/dist/connect.js.map +1 -0
  215. package/dist/connection-catalog.d.ts +38 -0
  216. package/dist/connection-discovery.d.ts +12 -0
  217. package/dist/connection-installed.d.ts +17 -0
  218. package/dist/connection-logo.d.ts +9 -0
  219. package/dist/connection-service-logo.d.ts +8 -0
  220. package/dist/connection-service-presentation.d.ts +13 -0
  221. package/dist/connection-skeleton.d.ts +5 -0
  222. package/dist/connection-type-picker.d.ts +6 -0
  223. package/dist/conversation-timeline.d.ts +5 -0
  224. package/dist/desktop.d.ts +7 -0
  225. package/dist/desktop.js +26 -0
  226. package/dist/desktop.js.map +1 -0
  227. package/dist/device-authorization.d.ts +23 -0
  228. package/dist/diffs.d.ts +8 -0
  229. package/dist/diffs.js +14 -0
  230. package/dist/diffs.js.map +1 -0
  231. package/dist/discovery-cache.d.ts +5 -0
  232. package/dist/editor.d.ts +7 -0
  233. package/dist/editor.js +21 -0
  234. package/dist/editor.js.map +1 -0
  235. package/dist/embedded-session-client.d.ts +23 -0
  236. package/dist/file-node-visibility.d.ts +15 -0
  237. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  238. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  239. package/dist/hooks/channel-cache.d.ts +23 -0
  240. package/dist/hooks/latest-question.d.ts +25 -0
  241. package/dist/hooks/shared-machines-list.d.ts +14 -0
  242. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  243. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  244. package/dist/hooks/use-browser-session.d.ts +12 -1
  245. package/dist/hooks/use-channels.d.ts +1 -0
  246. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  247. package/dist/hooks/use-composer.d.ts +45 -9
  248. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  249. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  250. package/dist/hooks/use-computer-session.d.ts +2 -0
  251. package/dist/hooks/use-connect.d.ts +22 -0
  252. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  253. package/dist/hooks/use-file-attachments.d.ts +21 -2
  254. package/dist/hooks/use-machine-chip.d.ts +3 -3
  255. package/dist/hooks/use-machines.d.ts +19 -1
  256. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  257. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  258. package/dist/hooks/use-session-events.d.ts +30 -8
  259. package/dist/hooks/use-session-lineage.d.ts +4 -0
  260. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  261. package/dist/hooks/use-session.d.ts +6 -0
  262. package/dist/hooks/use-turn-queue.d.ts +12 -0
  263. package/dist/hooks/use-usage.d.ts +40 -0
  264. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  265. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  266. package/dist/human-input.d.ts +3 -1
  267. package/dist/identity-link-accounts.d.ts +11 -0
  268. package/dist/identity-link-consent.d.ts +18 -0
  269. package/dist/index.d.ts +60 -17
  270. package/dist/index.js +2238 -6201
  271. package/dist/index.js.map +1 -1
  272. package/dist/interaction.d.ts +1 -1
  273. package/dist/interaction.js +35 -184
  274. package/dist/interaction.js.map +1 -1
  275. package/dist/latest-question-HTRIS4KJ.js +117 -0
  276. package/dist/latest-question-HTRIS4KJ.js.map +1 -0
  277. package/dist/lib/error-message.d.ts +7 -0
  278. package/dist/lib/format.d.ts +36 -2
  279. package/dist/lib/host-theme.d.ts +70 -0
  280. package/dist/lib/interaction-errors.d.ts +6 -0
  281. package/dist/lib/menu-styles.d.ts +22 -0
  282. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  283. package/dist/lib/workbench-peers.d.ts +36 -0
  284. package/dist/lib/xterm-theme.d.ts +7 -5
  285. package/dist/machines.d.ts +4 -2
  286. package/dist/machines.js +14 -4
  287. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  288. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  289. package/dist/mcp-connection-status.d.ts +14 -0
  290. package/dist/model-policy-picker-menu-M54ISBMN.js +14 -0
  291. package/dist/model-policy-picker-menu-M54ISBMN.js.map +1 -0
  292. package/dist/model-policy.d.ts +19 -3
  293. package/dist/model-policy.js +9 -1
  294. package/dist/older-history.d.ts +30 -0
  295. package/dist/platform-activity-row-627BFZ46.js +182 -0
  296. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  297. package/dist/plugin-details.d.ts +14 -0
  298. package/dist/plugin-discovery.d.ts +25 -0
  299. package/dist/provider.d.ts +13 -1
  300. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  301. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  302. package/dist/realtime/realtime-control.d.ts +6 -3
  303. package/dist/realtime.js +133 -74
  304. package/dist/realtime.js.map +1 -1
  305. package/dist/sandbox-files-GORZOUUJ.js +20 -0
  306. package/dist/sandbox-files-GORZOUUJ.js.map +1 -0
  307. package/dist/session-auth-recommendation.d.ts +5 -0
  308. package/dist/session-capability-policy.d.ts +12 -0
  309. package/dist/session-ui.d.ts +30 -2
  310. package/dist/session-ui.js +85 -7
  311. package/dist/session-ui.js.map +1 -1
  312. package/dist/session.d.ts +8 -2
  313. package/dist/session.js +30 -19
  314. package/dist/sites-ui.d.ts +34 -0
  315. package/dist/sites.d.ts +3 -0
  316. package/dist/sites.js +11 -0
  317. package/dist/sites.js.map +1 -0
  318. package/dist/skill-discovery.d.ts +47 -0
  319. package/dist/terminal.d.ts +8 -0
  320. package/dist/terminal.js +31 -0
  321. package/dist/terminal.js.map +1 -0
  322. package/dist/timeline/activity-rail.d.ts +11 -2
  323. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  324. package/dist/timeline/compaction-copy.d.ts +10 -0
  325. package/dist/timeline/entrance.d.ts +13 -1
  326. package/dist/timeline/genie-loading.d.ts +34 -0
  327. package/dist/timeline/index.d.ts +6 -2
  328. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  329. package/dist/timeline/platform-activity-row.d.ts +14 -0
  330. package/dist/timeline/presented-image.d.ts +6 -0
  331. package/dist/timeline/projection.d.ts +31 -2
  332. package/dist/timeline/registry.d.ts +2 -0
  333. package/dist/timeline/retained-image.d.ts +18 -0
  334. package/dist/timeline/rolling-activity.d.ts +11 -0
  335. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  336. package/dist/timeline/shared.d.ts +8 -3
  337. package/dist/timeline/startup-preference.d.ts +3 -0
  338. package/dist/timeline/startup-timings.d.ts +4 -0
  339. package/dist/timeline/tool-display-name.d.ts +2 -1
  340. package/dist/timeline/turn-summary.d.ts +34 -3
  341. package/dist/timeline/types.d.ts +147 -7
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  343. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  345. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  347. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  348. package/dist/types/machines.d.ts +2 -2
  349. package/dist/usage/allowance-copy.d.ts +25 -0
  350. package/dist/usage/summary.d.ts +35 -0
  351. package/dist/usage.d.ts +13 -0
  352. package/dist/usage.js +1074 -0
  353. package/dist/usage.js.map +1 -0
  354. package/package.json +44 -4
  355. package/src/accounts.tsx +1072 -0
  356. package/src/approvals.ts +8 -1
  357. package/src/artifacts.ts +42 -0
  358. package/src/assets/README.md +8 -0
  359. package/src/assets/gmail.ico +0 -0
  360. package/src/assets/outlook.ico +0 -0
  361. package/src/capability-catalog-row.tsx +94 -0
  362. package/src/capability-logo-fallback.ts +22 -0
  363. package/src/client.ts +22 -13
  364. package/src/commands/registry.ts +18 -15
  365. package/src/commands/types.ts +2 -0
  366. package/src/components/anthropic-mark.tsx +10 -0
  367. package/src/components/approval-surface.tsx +171 -37
  368. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  369. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  370. package/src/components/artifacts/artifact-surface.tsx +39 -19
  371. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  372. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  373. package/src/components/artifacts/document-editor.tsx +141 -16
  374. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  375. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  376. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  377. package/src/components/artifacts/editable-document.tsx +37 -36
  378. package/src/components/artifacts/editable-presentation.tsx +36 -18
  379. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  380. package/src/components/artifacts/index.ts +44 -0
  381. package/src/components/artifacts/inline-html-document.ts +24 -0
  382. package/src/components/artifacts/latest-task-runner.ts +49 -0
  383. package/src/components/artifacts/presentation-editor.tsx +323 -67
  384. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  385. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  386. package/src/components/artifacts/site-view.tsx +116 -0
  387. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  388. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  389. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  390. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  391. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  392. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  393. package/src/components/browser-select-control.tsx +312 -0
  394. package/src/components/browser-viewer.tsx +1054 -314
  395. package/src/components/chat-composer.tsx +131 -85
  396. package/src/components/child-session-link.tsx +27 -0
  397. package/src/components/claude-mark.tsx +10 -0
  398. package/src/components/code-editor.tsx +13 -16
  399. package/src/components/composer-transcription-control.tsx +7 -5
  400. package/src/components/composer.tsx +376 -49
  401. package/src/components/computer-viewer.tsx +1041 -329
  402. package/src/components/copy-button.tsx +13 -5
  403. package/src/components/desktop-viewer.tsx +1 -1
  404. package/src/components/enrollment-consent.tsx +65 -7
  405. package/src/components/enrollment-device-flow.tsx +1 -1
  406. package/src/components/file-browser.tsx +158 -34
  407. package/src/components/fleet-tile.tsx +8 -16
  408. package/src/components/generated-video-player.tsx +4 -2
  409. package/src/components/grok-mark.tsx +33 -0
  410. package/src/components/human-input-form.tsx +455 -114
  411. package/src/components/human-input-surface.tsx +18 -7
  412. package/src/components/interaction-intervention-banner.tsx +2 -2
  413. package/src/components/machine-card.tsx +119 -4
  414. package/src/components/machine-dock-bar.tsx +1 -1
  415. package/src/components/machine-input-display.ts +23 -2
  416. package/src/components/machines/machine-detail.tsx +52 -2
  417. package/src/components/machines/machine-operation-policy.tsx +179 -0
  418. package/src/components/machines-dashboard.tsx +8 -17
  419. package/src/components/markdown-table-layout.ts +132 -0
  420. package/src/components/markdown.tsx +473 -44
  421. package/src/components/message-timeline.tsx +2754 -665
  422. package/src/components/model-mark.tsx +90 -0
  423. package/src/components/model-picker.tsx +15 -4
  424. package/src/components/model-policy-picker-menu.tsx +424 -0
  425. package/src/components/model-policy-picker.tsx +337 -381
  426. package/src/components/open-geni-chat.tsx +338 -0
  427. package/src/components/open-geni-links.tsx +179 -0
  428. package/src/components/openrouter-mark.tsx +13 -0
  429. package/src/components/pierre-diff.tsx +41 -16
  430. package/src/components/pierre-file.tsx +36 -11
  431. package/src/components/preview-loading.tsx +154 -0
  432. package/src/components/queue-item-content.ts +14 -0
  433. package/src/components/queue-surface-implementation.tsx +132 -42
  434. package/src/components/queue-surface-state.tsx +3 -1
  435. package/src/components/sandbox-files.tsx +267 -35
  436. package/src/components/sandbox-terminal.tsx +48 -11
  437. package/src/components/sandbox-workspace.tsx +337 -135
  438. package/src/components/session-capability-frame.tsx +192 -0
  439. package/src/components/session-chrome.tsx +1027 -328
  440. package/src/components/session-commands-panel.tsx +126 -0
  441. package/src/components/session-commands.tsx +18 -0
  442. package/src/components/session-connection-request.tsx +97 -0
  443. package/src/components/session-conversation.tsx +526 -0
  444. package/src/components/session-list.tsx +250 -0
  445. package/src/components/session-mcp-capability-card.tsx +680 -0
  446. package/src/components/session-proxy-scope.tsx +92 -0
  447. package/src/components/session-status.tsx +1 -1
  448. package/src/components/timeline-anchor.tsx +119 -0
  449. package/src/components/timeline-annotation-chrome.tsx +196 -0
  450. package/src/components/timeline-annotation-layout.ts +268 -0
  451. package/src/components/timeline-annotation-markers.tsx +185 -0
  452. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  453. package/src/components/timeline-annotation-selection.tsx +106 -54
  454. package/src/components/timeline-annotation-shared.ts +245 -0
  455. package/src/components/timeline-annotations-dialog.tsx +185 -128
  456. package/src/components/timeline-annotations.tsx +189 -45
  457. package/src/components/timeline-reading-progress.ts +80 -0
  458. package/src/components/timeline-search.tsx +168 -0
  459. package/src/components/timeline-settlement.ts +60 -0
  460. package/src/components/tip-follow.ts +70 -7
  461. package/src/components/tooltip.tsx +38 -5
  462. package/src/components/usage-limit-notice.tsx +179 -0
  463. package/src/components/usage-member-list.tsx +792 -0
  464. package/src/components/usage-meter.tsx +382 -0
  465. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  466. package/src/components/user-message-body.tsx +194 -49
  467. package/src/components/workspace-dock.tsx +141 -175
  468. package/src/composer.ts +6 -1
  469. package/src/connect-account-identity.tsx +34 -0
  470. package/src/connect-accounts.tsx +233 -0
  471. package/src/connect-chooser.tsx +336 -0
  472. package/src/connect-panel.tsx +99 -0
  473. package/src/connect-setup.tsx +307 -0
  474. package/src/connect.ts +60 -0
  475. package/src/connection-assets.d.ts +4 -0
  476. package/src/connection-catalog.tsx +162 -0
  477. package/src/connection-discovery.tsx +235 -0
  478. package/src/connection-installed.tsx +51 -0
  479. package/src/connection-logo.tsx +37 -0
  480. package/src/connection-service-logo.tsx +55 -0
  481. package/src/connection-service-presentation.ts +46 -0
  482. package/src/connection-skeleton.tsx +16 -0
  483. package/src/connection-type-picker.tsx +36 -0
  484. package/src/conversation-timeline.ts +92 -0
  485. package/src/desktop.ts +24 -0
  486. package/src/device-authorization.tsx +98 -0
  487. package/src/diffs.ts +16 -0
  488. package/src/discovery-cache.ts +42 -0
  489. package/src/editor.ts +13 -0
  490. package/src/embedded-session-client.ts +104 -0
  491. package/src/file-node-visibility.ts +66 -0
  492. package/src/hooks/channel-cache.ts +104 -0
  493. package/src/hooks/internal.ts +3 -2
  494. package/src/hooks/latest-question.ts +164 -0
  495. package/src/hooks/shared-machines-list.ts +239 -0
  496. package/src/hooks/use-attached-browsers.ts +5 -1
  497. package/src/hooks/use-available-models.ts +20 -14
  498. package/src/hooks/use-browser-frame-stream.ts +25 -3
  499. package/src/hooks/use-browser-session.ts +271 -71
  500. package/src/hooks/use-browser-sessions.ts +7 -1
  501. package/src/hooks/use-channels.ts +32 -10
  502. package/src/hooks/use-codex-accounts.ts +78 -21
  503. package/src/hooks/use-composer.ts +1034 -320
  504. package/src/hooks/use-computer-frame-stream.ts +39 -16
  505. package/src/hooks/use-computer-input-posture.ts +94 -0
  506. package/src/hooks/use-computer-session.ts +110 -32
  507. package/src/hooks/use-computer-sessions.ts +8 -1
  508. package/src/hooks/use-connect.ts +23 -0
  509. package/src/hooks/use-desktop-stream.ts +19 -28
  510. package/src/hooks/use-file-attachments.ts +118 -10
  511. package/src/hooks/use-goal.ts +36 -9
  512. package/src/hooks/use-human-input.ts +31 -4
  513. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  514. package/src/hooks/use-machine-chip.ts +23 -6
  515. package/src/hooks/use-machines.ts +104 -6
  516. package/src/hooks/use-sandbox-files.ts +253 -150
  517. package/src/hooks/use-sandbox-git.ts +58 -29
  518. package/src/hooks/use-session-background-commands.ts +67 -0
  519. package/src/hooks/use-session-capabilities.ts +21 -2
  520. package/src/hooks/use-session-events.ts +759 -433
  521. package/src/hooks/use-session-lineage.ts +28 -6
  522. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  523. package/src/hooks/use-session.ts +75 -16
  524. package/src/hooks/use-slash-commands.ts +6 -11
  525. package/src/hooks/use-turn-queue.ts +113 -13
  526. package/src/hooks/use-usage.ts +100 -0
  527. package/src/hooks/use-video-artifact-playback.ts +1 -1
  528. package/src/hooks/use-voice-input.ts +12 -1
  529. package/src/hooks/use-workspace-capture.ts +3 -2
  530. package/src/hooks/use-workspace-edit.ts +23 -5
  531. package/src/hooks/use-workspace-sessions.ts +99 -11
  532. package/src/human-input.ts +12 -1
  533. package/src/identity-link-accounts.tsx +148 -0
  534. package/src/identity-link-consent.tsx +192 -0
  535. package/src/index.ts +157 -12
  536. package/src/interaction.ts +1 -0
  537. package/src/lib/error-message.ts +37 -0
  538. package/src/lib/format.ts +150 -14
  539. package/src/lib/host-theme.ts +511 -0
  540. package/src/lib/interaction-errors.ts +33 -0
  541. package/src/lib/menu-styles.ts +44 -0
  542. package/src/lib/pierre-diffs-loader.ts +53 -0
  543. package/src/lib/workbench-peers.ts +62 -0
  544. package/src/lib/xterm-theme.ts +23 -21
  545. package/src/machines.ts +9 -1
  546. package/src/mcp-connection-status.ts +35 -0
  547. package/src/model-policy.ts +223 -69
  548. package/src/older-history.ts +87 -0
  549. package/src/plugin-details.tsx +185 -0
  550. package/src/plugin-discovery.tsx +196 -0
  551. package/src/provider.tsx +55 -14
  552. package/src/realtime/dropdown-menu.tsx +19 -12
  553. package/src/realtime/realtime-control.tsx +133 -46
  554. package/src/session-auth-recommendation.ts +48 -0
  555. package/src/session-capability-policy.ts +83 -0
  556. package/src/session-context.ts +4 -3
  557. package/src/session-ui.ts +66 -2
  558. package/src/session.ts +18 -1
  559. package/src/sites-ui.tsx +402 -0
  560. package/src/sites.ts +3 -0
  561. package/src/skill-discovery.tsx +208 -0
  562. package/src/terminal.ts +26 -0
  563. package/src/timeline/activity-rail.tsx +171 -80
  564. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  565. package/src/timeline/compaction-copy.ts +42 -0
  566. package/src/timeline/entrance.tsx +28 -3
  567. package/src/timeline/fleet-decision-projection.ts +2 -1
  568. package/src/timeline/fleet-decision-row.tsx +1 -0
  569. package/src/timeline/genie-loading.tsx +136 -0
  570. package/src/timeline/index.ts +11 -0
  571. package/src/timeline/knowledge-receipt.tsx +100 -0
  572. package/src/timeline/parsers.ts +2 -2
  573. package/src/timeline/platform-activity-row.tsx +216 -0
  574. package/src/timeline/presented-image.ts +49 -0
  575. package/src/timeline/projection.ts +1609 -84
  576. package/src/timeline/registry.ts +15 -3
  577. package/src/timeline/retained-image.ts +97 -0
  578. package/src/timeline/rolling-activity.tsx +92 -0
  579. package/src/timeline/screenshot-lightbox.tsx +115 -17
  580. package/src/timeline/shared.tsx +47 -15
  581. package/src/timeline/startup-preference.ts +33 -0
  582. package/src/timeline/startup-timings.tsx +145 -0
  583. package/src/timeline/tool-display-name.ts +8 -6
  584. package/src/timeline/tool-renderers.tsx +497 -128
  585. package/src/timeline/turn-summary.tsx +218 -44
  586. package/src/timeline/types.ts +192 -7
  587. package/src/types/machines.ts +10 -0
  588. package/src/usage/allowance-copy.ts +64 -0
  589. package/src/usage/summary.ts +93 -0
  590. package/src/usage.ts +50 -0
  591. package/styles/compiled.css +2098 -757
  592. package/styles/connect.css +284 -0
  593. package/styles/connect.d.ts +1 -0
  594. package/styles/effective-tokens.css +1 -0
  595. package/styles/index.css +201 -9
  596. package/styles/responsive.css +27 -1
  597. package/styles/session-capability.css +44 -0
  598. package/styles/tokens.css +135 -65
  599. package/dist/chunk-5UQPNLIO.js.map +0 -1
  600. package/dist/chunk-6KLX2RH5.js.map +0 -1
  601. package/dist/chunk-7WCLAEFV.js.map +0 -1
  602. package/dist/chunk-B6WPZSTT.js.map +0 -1
  603. package/dist/chunk-FK6VG4LL.js +0 -90
  604. package/dist/chunk-FK6VG4LL.js.map +0 -1
  605. package/dist/chunk-HA46CYQK.js.map +0 -1
  606. package/dist/chunk-HUIKIDM5.js.map +0 -1
  607. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  608. package/dist/chunk-KCGXPP5V.js.map +0 -1
  609. package/dist/chunk-KZ73RL76.js.map +0 -1
  610. package/dist/chunk-LAKLF4PA.js +0 -141
  611. package/dist/chunk-LAKLF4PA.js.map +0 -1
  612. package/dist/chunk-LLOLUHVG.js.map +0 -1
  613. package/dist/chunk-MKPIAGVL.js +0 -465
  614. package/dist/chunk-MKPIAGVL.js.map +0 -1
  615. package/dist/chunk-PEI6RANI.js.map +0 -1
  616. package/dist/chunk-R3AZOAB5.js.map +0 -1
  617. package/dist/chunk-WSK7G5LE.js +0 -170
  618. package/dist/chunk-WSK7G5LE.js.map +0 -1
  619. package/dist/chunk-XBZWOM2K.js +0 -218
  620. package/dist/chunk-XBZWOM2K.js.map +0 -1
  621. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  622. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  623. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  624. package/dist/hooks/use-packs.d.ts +0 -32
  625. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  626. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  627. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  628. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  629. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  630. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  631. package/src/hooks/use-packs.ts +0 -157
  632. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-SHYKQRNX.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-composer.ts"],"sourcesContent":["import {\n DEFAULT_FILE_RESOURCE_MOUNT_ROOT,\n type ComposerDraft,\n type DraftTimelineAnnotation,\n type EffectiveControlResumeOption,\n type EffectiveSessionControl,\n type OpenGeniApiError,\n type ResourceRef,\n type SaveComposerDraftRequest,\n type SendMessageInput,\n type SessionEvent,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useEmbeddedSession, type EmbeddedSessionClientOverride } from \"../session-context\";\nimport { useSessionEventTrigger, type SessionEventFeedOptions } from \"./internal\";\n\nexport type ComposerSendExtras = Omit<SendMessageInput, \"text\" | \"clientEventId\" | \"annotations\">;\n\nexport type UseComposerOptions = EmbeddedSessionClientOverride &\n SessionEventFeedOptions & {\n /** Called synchronously after an ordinary Send is accepted by the local UI. */\n onSubmitted?: ((text: string, input: SendMessageInput) => void) | undefined;\n /** Called with the exact accepted wire input after a successful send. */\n onSent?: ((text: string, input: SendMessageInput) => void) | undefined;\n /**\n * Extra message fields (resources, tools, model, reasoningEffort, latencyMode) merged\n * into every send. A function is evaluated at send time so it can read the\n * surrounding UI state (attachment pickers, model selectors, ...).\n */\n sendExtras?: ComposerSendExtras | (() => ComposerSendExtras) | undefined;\n /**\n * Fail-closed delivery guard evaluated at send time. Attachment hosts use\n * this to preserve unresolved upload cards until the operator waits,\n * retries, or removes them; direct hook callers cannot bypass the UI gate.\n */\n sendBlocked?: (() => boolean) | undefined;\n /** Latest server-derived workstream control; bound into Send/Steer OCC. */\n effectiveControl?: EffectiveSessionControl | null | undefined;\n /** Apply durable model/tool/reasoning settings in the host's controlled UI. */\n onDraftApplied?: ((draft: ComposerDraft) => void) | undefined;\n /** Disable remote composer-draft reads and writes for embedded hosts. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n };\n\ntype ComposerDraftShadow = {\n text: string;\n resources: ResourceRef[];\n annotations: DraftTimelineAnnotation[];\n};\n\ntype PendingComposerOperation = {\n delivery: \"send\" | \"steer\";\n input: SendMessageInput;\n draftAtSend: string;\n resourcesAtSend: ResourceRef[];\n annotationsAtSend: DraftTimelineAnnotation[];\n /** Latest local text/resources that must survive an uncertain delivery. */\n newerShadow: ComposerDraftShadow;\n clearDraftOnAccept: boolean;\n /** False after remount when the original input carried secret credentials. */\n canRetry: boolean;\n};\n\ntype StoredPendingComposerOperation = Omit<PendingComposerOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nexport type ComposerOptimisticMessage = {\n clientEventId: string;\n text: string;\n annotations: DraftTimelineAnnotation[];\n resources: ResourceRef[];\n occurredAt: string;\n state: \"sending\" | \"queued\" | \"failed\";\n error?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n};\n\ntype OptimisticSendOperation = ComposerOptimisticMessage & {\n input: SendMessageInput;\n draftPayload: SaveComposerDraftRequest | null;\n /** Latest unsent local draft that must survive this operation and remounts. */\n newerShadow: ComposerDraftShadow;\n canRetry: boolean;\n};\n\ntype StoredOptimisticSendOperation = Omit<OptimisticSendOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nconst PENDING_COMPOSER_STORAGE_PREFIX = \"opengeni.pending-composer.v1:\";\nconst OPTIMISTIC_SEND_STORAGE_PREFIX = \"opengeni.optimistic-sends.v1:\";\n\n// A remount must not manufacture a new operation while the previous mutation\n// is still outcome-unknown. Keep only non-credential request fields here; the\n// mounted hook retains the exact input, including any credential updates. The\n// safe shadow is also session-scoped so a refresh cannot lose newer edits.\nconst pendingComposerOperations = new Map<string, StoredPendingComposerOperation>();\nconst optimisticSendOperations = new Map<string, StoredOptimisticSendOperation[]>();\n\nfunction pendingComposerOperationKey(\n workspaceId: string,\n sessionId: string | null | undefined,\n): string | null {\n return sessionId ? `${workspaceId}\\u0000${sessionId}` : null;\n}\n\nfunction pendingComposerStorage(): Storage | null {\n try {\n return typeof window === \"undefined\" ? null : window.sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction pendingComposerStorageKey(key: string): string {\n return `${PENDING_COMPOSER_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction optimisticSendStorageKey(key: string): string {\n return `${OPTIMISTIC_SEND_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction restoreOptimisticSendOperations(key: string | null): OptimisticSendOperation[] {\n if (!key) return [];\n let stored = optimisticSendOperations.get(key);\n if (!stored) {\n const storage = pendingComposerStorage();\n try {\n const parsed: unknown = JSON.parse(storage?.getItem(optimisticSendStorageKey(key)) ?? \"[]\");\n stored = Array.isArray(parsed)\n ? (parsed.filter(\n (candidate): candidate is StoredOptimisticSendOperation =>\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof candidate.clientEventId === \"string\" &&\n typeof candidate.text === \"string\" &&\n typeof candidate.occurredAt === \"string\" &&\n (candidate.state === \"sending\" || candidate.state === \"failed\") &&\n typeof candidate.input === \"object\" &&\n candidate.input !== null &&\n typeof candidate.input.text === \"string\" &&\n typeof candidate.hasMcpCredentialUpdates === \"boolean\",\n ) as StoredOptimisticSendOperation[])\n : [];\n } catch {\n stored = [];\n }\n }\n return stored.map(({ hasMcpCredentialUpdates, ...operation }) => ({\n ...operation,\n newerShadow: operation.newerShadow ?? { text: \"\", resources: [], annotations: [] },\n state:\n operation.state === \"sending\" || operation.state === \"queued\" ? \"sending\" : operation.state,\n outcomeUnknown:\n operation.state === \"sending\" || operation.state === \"queued\"\n ? true\n : operation.outcomeUnknown,\n error:\n operation.state === \"sending\"\n ? \"Delivery was interrupted; retry to reconcile this message.\"\n : operation.error,\n input: operation.input,\n canRetry: !hasMcpCredentialUpdates,\n }));\n}\n\nfunction rememberOptimisticSendOperations(\n key: string | null,\n operations: OptimisticSendOperation[],\n): void {\n if (!key) return;\n const stored = operations\n .filter((operation) => operation.state !== \"queued\")\n .map((operation) => {\n const { canRetry: _canRetry, input, ...rest } = operation;\n const { mcpCredentialUpdates: _credentials, ...safeInput } = input;\n return {\n ...rest,\n input: safeInput,\n hasMcpCredentialUpdates: input.mcpCredentialUpdates !== undefined,\n } satisfies StoredOptimisticSendOperation;\n });\n optimisticSendOperations.set(key, stored);\n try {\n pendingComposerStorage()?.setItem(optimisticSendStorageKey(key), JSON.stringify(stored));\n } catch {\n // Best effort; the in-memory queue still owns this mount.\n }\n}\n\nfunction resourceList(value: unknown): value is ResourceRef[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const resource = candidate as Record<string, unknown>;\n return resource.kind === \"file\"\n ? typeof resource.fileId === \"string\"\n : resource.kind === \"repository\" &&\n typeof resource.uri === \"string\" &&\n typeof resource.ref === \"string\";\n })\n );\n}\n\nfunction timelineAnnotationList(value: unknown): value is DraftTimelineAnnotation[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const annotation = candidate as Record<string, unknown>;\n const source = annotation.source;\n if (typeof source !== \"object\" || source === null) return false;\n const sourceRecord = source as Record<string, unknown>;\n return (\n typeof annotation.id === \"string\" &&\n typeof annotation.quote === \"string\" &&\n typeof annotation.note === \"string\" &&\n typeof sourceRecord.eventId === \"string\" &&\n typeof sourceRecord.eventType === \"string\" &&\n typeof sourceRecord.sequence === \"number\" &&\n (typeof sourceRecord.turnId === \"string\" || sourceRecord.turnId === null) &&\n typeof sourceRecord.startOffset === \"number\" &&\n typeof sourceRecord.endOffset === \"number\" &&\n typeof sourceRecord.contextBefore === \"string\" &&\n typeof sourceRecord.contextAfter === \"string\"\n );\n })\n );\n}\n\nfunction cloneAnnotations(\n annotations: readonly DraftTimelineAnnotation[],\n): DraftTimelineAnnotation[] {\n return annotations.map((annotation) => ({\n ...annotation,\n source: { ...annotation.source },\n }));\n}\n\nfunction readStoredPendingComposerOperation(\n key: string | null,\n): StoredPendingComposerOperation | null {\n const storage = key ? pendingComposerStorage() : null;\n if (!storage || !key) return null;\n try {\n const parsed: unknown = JSON.parse(storage.getItem(pendingComposerStorageKey(key)) ?? \"null\");\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const record = parsed as Record<string, unknown>;\n const input = record.input;\n const shadow = record.newerShadow;\n if (\n typeof input !== \"object\" ||\n input === null ||\n typeof shadow !== \"object\" ||\n shadow === null\n ) {\n return null;\n }\n const inputRecord = input as Record<string, unknown>;\n const shadowRecord = shadow as Record<string, unknown>;\n if (\n (record.delivery !== \"send\" && record.delivery !== \"steer\") ||\n typeof record.draftAtSend !== \"string\" ||\n !resourceList(record.resourcesAtSend) ||\n (record.annotationsAtSend !== undefined &&\n !timelineAnnotationList(record.annotationsAtSend)) ||\n typeof shadowRecord.text !== \"string\" ||\n !resourceList(shadowRecord.resources) ||\n (shadowRecord.annotations !== undefined &&\n !timelineAnnotationList(shadowRecord.annotations)) ||\n typeof record.clearDraftOnAccept !== \"boolean\" ||\n typeof record.hasMcpCredentialUpdates !== \"boolean\" ||\n typeof inputRecord.text !== \"string\" ||\n typeof inputRecord.clientEventId !== \"string\" ||\n \"mcpCredentialUpdates\" in inputRecord ||\n (\"resources\" in inputRecord && !resourceList(inputRecord.resources)) ||\n (\"annotations\" in inputRecord && !timelineAnnotationList(inputRecord.annotations))\n ) {\n return null;\n }\n return {\n ...(record as StoredPendingComposerOperation),\n annotationsAtSend: timelineAnnotationList(record.annotationsAtSend)\n ? record.annotationsAtSend\n : [],\n newerShadow: {\n ...(shadow as ComposerDraftShadow),\n annotations: timelineAnnotationList(shadowRecord.annotations)\n ? shadowRecord.annotations\n : [],\n },\n };\n } catch {\n return null;\n }\n}\n\nfunction writePendingComposerOperation(\n key: string,\n operation: StoredPendingComposerOperation,\n): void {\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.setItem(pendingComposerStorageKey(key), JSON.stringify(operation));\n } catch {\n // Storage is best effort; the in-memory record still protects remounts.\n }\n}\n\nfunction restorePendingComposerOperation(key: string | null): PendingComposerOperation | null {\n const stored =\n (key && pendingComposerOperations.get(key)) ?? readStoredPendingComposerOperation(key);\n if (!stored) return null;\n return {\n ...stored,\n input: stored.input,\n newerShadow: stored.newerShadow ?? {\n text: stored.draftAtSend,\n resources: stored.resourcesAtSend,\n annotations: stored.annotationsAtSend,\n },\n canRetry: !stored.hasMcpCredentialUpdates,\n };\n}\n\nfunction rememberPendingComposerOperation(\n key: string | null,\n operation: PendingComposerOperation,\n): void {\n if (!key) return;\n const { canRetry: _retry, ...safeOperation } = operation;\n const { input: originalInput, ...withoutInput } = safeOperation;\n const { mcpCredentialUpdates: _storedMcp, ...safeInput } = originalInput;\n const stored = {\n ...withoutInput,\n input: safeInput,\n hasMcpCredentialUpdates: operation.input.mcpCredentialUpdates !== undefined,\n newerShadow: {\n text: operation.newerShadow.text,\n resources: [...operation.newerShadow.resources],\n annotations: cloneAnnotations(operation.newerShadow.annotations),\n },\n } satisfies StoredPendingComposerOperation;\n pendingComposerOperations.set(key, stored);\n writePendingComposerOperation(key, stored);\n}\n\nfunction forgetPendingComposerOperation(key: string | null): void {\n if (!key) return;\n pendingComposerOperations.delete(key);\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.removeItem(pendingComposerStorageKey(key));\n } catch {\n // Ignore a blocked storage implementation; delivery has already settled.\n }\n}\n\nfunction updatePendingComposerShadow(\n key: string | null,\n operation: PendingComposerOperation | null,\n shadow: ComposerDraftShadow,\n): PendingComposerOperation | null {\n if (!key || !operation) return operation;\n const next = {\n ...operation,\n newerShadow: {\n ...shadow,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n },\n };\n rememberPendingComposerOperation(key, next);\n return next;\n}\n\nexport type ComposerState = {\n value: string;\n setValue: (value: string) => void;\n annotations?: DraftTimelineAnnotation[] | undefined;\n addAnnotation?: ((annotation: DraftTimelineAnnotation) => void) | undefined;\n updateAnnotation?: ((id: string, note: string) => void) | undefined;\n removeAnnotation?: ((id: string) => void) | undefined;\n /** Newly captured annotation the review surface should focus. */\n annotationReviewTargetId?: string | null | undefined;\n clearAnnotationReviewTarget?: (() => void) | undefined;\n /** Read the current draft synchronously before a destructive replacement. */\n hasDraftContent: () => boolean;\n /** Append the draft behind prompts already visible in the queue. */\n send: (text?: string) => Promise<boolean>;\n /** Locally acknowledged ordinary sends awaiting durable timeline reconciliation. */\n optimisticMessages?: ComposerOptimisticMessage[] | undefined;\n retryOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n removeOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n /** Supersede current direction with the draft. */\n steer: (text?: string) => Promise<boolean>;\n /** Optimistic-to-durable projection for a Steer that has not started yet. */\n steering?: ComposerSteeringState | null | undefined;\n /** Immediate mutation-receipt projection while physical cancellation settles. */\n stoppingAttempt?: \"current\" | \"previous\" | null | undefined;\n sending: boolean;\n canSend: boolean;\n /** Pause the session without deleting its prompt queue. */\n pause: (reason?: string) => Promise<void>;\n pausing: boolean;\n resume: (reason?: string) => Promise<void>;\n resumeScope: (option: EffectiveControlResumeOption) => Promise<void>;\n resuming: boolean;\n draft: ComposerDraft | null;\n draftRevision: number;\n draftLoading: boolean;\n draftSaving: boolean;\n draftConflict: Error | null;\n /** Whether this controller owns a durable server-side draft. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n /** Apply an atomic queue Edit checkout without a second read. */\n applyDraft: (draft: ComposerDraft) => void;\n reloadDraft: () => Promise<void>;\n resolveDraftConflict: (choice: \"keep_mine\" | \"use_remote\") => Promise<void>;\n restoredResources: ResourceRef[];\n removeRestoredResource: (index: number) => void;\n error: Error | null;\n clearError: () => void;\n};\n\nexport type ComposerSteeringState = {\n phase: \"submitting\" | \"accepted\";\n text: string;\n clientEventId: string | null;\n triggerEventId: string | null;\n turnId: string | null;\n /** True only when the accepted Steer durably interrupted a live attempt. */\n stoppingPreviousAttempt?: boolean | undefined;\n};\n\ntype ComposerControlStoppingState = {\n controlVersion: number;\n controlEtag: string;\n};\n\nconst STEERING_SETTLEMENT_EVENT_TYPES = new Set([\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n]);\n\nfunction isSteeringSettlementEvent(event: SessionEvent): boolean {\n return STEERING_SETTLEMENT_EVENT_TYPES.has(event.type);\n}\n\nfunction steeringAcceptedEvent(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): SessionEvent | undefined {\n return events.find(\n (event) =>\n event.type === \"user.message\" &&\n steering.clientEventId !== null &&\n event.clientEventId === steering.clientEventId,\n );\n}\n\nfunction steeringSettledByEvents(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): boolean {\n const acceptedEventId =\n steering.triggerEventId ?? steeringAcceptedEvent(steering, events)?.id ?? null;\n return events.some((event) => {\n if (steering.turnId && event.turnId === steering.turnId && isSteeringSettlementEvent(event)) {\n return true;\n }\n if (event.type !== \"turn.started\" || !acceptedEventId) return false;\n const payload = event.payload;\n return (\n typeof payload === \"object\" &&\n payload !== null &&\n \"triggerEventId\" in payload &&\n payload.triggerEventId === acceptedEventId\n );\n });\n}\n\n/**\n * Draft + send + Pause/Resume state for the chat composer — the only\n * human-to-agent input surface. The draft survives a failed send (nothing is\n * more hostile than losing a typed message); each send carries a generated\n * `clientEventId` so retries stay idempotent server-side.\n */\nexport function useComposer(\n sessionId: string | null | undefined,\n options: UseComposerOptions = {},\n): ComposerState {\n const { client, workspaceId, registerSessionReconciler } = useEmbeddedSession(options);\n const durableDrafts = options.draftPersistence !== \"disabled\";\n const targetKey = `${workspaceId}\\u0000${sessionId ?? \"\"}\\u0000${durableDrafts ? \"durable\" : \"disabled\"}`;\n const pendingOperationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const initialPendingOperation = restorePendingComposerOperation(pendingOperationKey);\n const initialOptimisticSends = restoreOptimisticSendOperations(pendingOperationKey);\n const initialShadow =\n initialPendingOperation?.newerShadow ?? initialOptimisticSends.at(-1)?.newerShadow;\n const [value, setValue] = useState(() => initialShadow?.text ?? \"\");\n const [annotations, setAnnotations] = useState<DraftTimelineAnnotation[]>(\n () => initialShadow?.annotations ?? [],\n );\n const [annotationReviewTargetId, setAnnotationReviewTargetId] = useState<string | null>(null);\n // Keep rendered state behind the committed target identity for one frame:\n // a parent may switch sessionId without remounting this public hook.\n const [stateTargetKey, setStateTargetKey] = useState(targetKey);\n const [sending, setSending] = useState(false);\n const [optimisticSends, setOptimisticSends] =\n useState<OptimisticSendOperation[]>(initialOptimisticSends);\n const [steering, setSteering] = useState<ComposerSteeringState | null>(() =>\n initialPendingOperation?.delivery === \"steer\"\n ? {\n phase: \"submitting\",\n text: initialPendingOperation.input.text,\n clientEventId: initialPendingOperation.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n }\n : null,\n );\n const [pausing, setPausing] = useState(false);\n const [controlStopping, setControlStopping] = useState<ComposerControlStoppingState | null>(null);\n const [resuming, setResuming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [draft, setDraft] = useState<ComposerDraft | null>(null);\n const [draftLoading, setDraftLoading] = useState(Boolean(sessionId) && durableDrafts);\n const [draftSaving, setDraftSaving] = useState(false);\n const [draftConflict, setDraftConflict] = useState<Error | null>(null);\n const [restoredResources, setRestoredResources] = useState<ResourceRef[]>(\n () => initialShadow?.resources ?? [],\n );\n const pendingOperationRef = useRef<PendingComposerOperation | null>(initialPendingOperation);\n const optimisticSendsRef = useRef<OptimisticSendOperation[]>(initialOptimisticSends);\n const optimisticProcessorBusyRef = useRef(false);\n const optimisticCallbackIdsRef = useRef(new Set<string>());\n const steeringSettlementEventsRef = useRef<SessionEvent[]>([]);\n const steeringRef = useRef(steering);\n const pendingClientEventId = useRef<string | null>(\n initialPendingOperation?.input.clientEventId ?? null,\n );\n const valueRef = useRef(initialShadow?.text ?? \"\");\n const annotationsRef = useRef<DraftTimelineAnnotation[]>(initialShadow?.annotations ?? []);\n const draftRef = useRef<ComposerDraft | null>(null);\n const restoredResourcesRef = useRef<ResourceRef[]>(initialShadow?.resources ?? []);\n const localEditRevision = useRef(initialShadow ? 1 : 0);\n const targetGeneration = useRef(0);\n const draftReadGeneration = useRef(0);\n const lastSavedSignature = useRef<string | null>(null);\n const saveChain = useRef<Promise<void>>(Promise.resolve());\n const onSent = options.onSent;\n const onSubmitted = options.onSubmitted;\n const onDraftApplied = options.onDraftApplied;\n // Read through a ref so live session/policy projections can replace their\n // apply callback without invalidating the draft loader and re-running its\n // initial-load effect. Publish only committed callbacks: a suspended target\n // render must not retarget an in-flight read owned by the committed session.\n const onDraftAppliedRef = useRef(onDraftApplied);\n useLayoutEffect(() => {\n onDraftAppliedRef.current = onDraftApplied;\n }, [onDraftApplied]);\n useLayoutEffect(() => {\n steeringRef.current = steering;\n }, [steering]);\n // Read through a ref so a new extras closure (created every render by\n // callers passing inline functions) does not invalidate `send`.\n const sendExtrasRef = useRef(options.sendExtras);\n sendExtrasRef.current = options.sendExtras;\n const sendBlockedRef = useRef(options.sendBlocked);\n sendBlockedRef.current = options.sendBlocked;\n const liveExtrasVersion = JSON.stringify(resolveSendExtras(options.sendExtras));\n\n // A composer is bound to one session: switching targets must not leak the\n // previous session's draft, error, or retry idempotency key.\n const targetKeyRef = useRef(targetKey);\n useLayoutEffect(() => {\n if (targetKeyRef.current === targetKey) return;\n targetKeyRef.current = targetKey;\n targetGeneration.current += 1;\n draftReadGeneration.current += 1;\n pendingOperationRef.current = restorePendingComposerOperation(pendingOperationKey);\n const restoredOptimisticSends = restoreOptimisticSendOperations(pendingOperationKey);\n optimisticSendsRef.current = restoredOptimisticSends;\n optimisticProcessorBusyRef.current = false;\n optimisticCallbackIdsRef.current = new Set();\n steeringSettlementEventsRef.current = [];\n pendingClientEventId.current = pendingOperationRef.current?.input.clientEventId ?? null;\n const shadow =\n pendingOperationRef.current?.newerShadow ?? restoredOptimisticSends.at(-1)?.newerShadow;\n localEditRevision.current = shadow ? 1 : 0;\n valueRef.current = shadow?.text ?? \"\";\n annotationsRef.current = shadow?.annotations ?? [];\n draftRef.current = null;\n restoredResourcesRef.current = shadow?.resources ?? [];\n lastSavedSignature.current = null;\n // Old saves may still be awaiting the network. Their generation fence\n // prevents settlement, and a fresh chain avoids blocking this target.\n saveChain.current = Promise.resolve();\n setStateTargetKey(targetKey);\n setValue(shadow?.text ?? \"\");\n setAnnotations(shadow?.annotations ?? []);\n setAnnotationReviewTargetId(null);\n setSending(false);\n setOptimisticSends(restoredOptimisticSends);\n setSteering(\n pendingOperationRef.current?.delivery === \"steer\"\n ? {\n phase: \"submitting\",\n text: pendingOperationRef.current.input.text,\n clientEventId: pendingOperationRef.current.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n }\n : null,\n );\n setPausing(false);\n setControlStopping(null);\n setResuming(false);\n setError(null);\n setDraft(null);\n setDraftLoading(Boolean(sessionId) && durableDrafts);\n setDraftSaving(false);\n setDraftConflict(null);\n setRestoredResources(shadow?.resources ?? []);\n }, [durableDrafts, pendingOperationKey, sessionId, targetKey]);\n\n const setOptimisticDraftShadow = useCallback(\n (shadow: ComposerDraftShadow): void => {\n if (optimisticSendsRef.current.length === 0) return;\n const next = optimisticSendsRef.current.map((operation) => ({\n ...operation,\n newerShadow: {\n text: shadow.text,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n },\n }));\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n },\n [pendingOperationKey],\n );\n\n const applyDraft = useCallback(\n (next: ComposerDraft): void => {\n if (targetKeyRef.current !== targetKey) return;\n if (!durableDrafts) {\n localEditRevision.current += 1;\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n restoredResourcesRef.current = next.resources;\n draftRef.current = null;\n lastSavedSignature.current = null;\n setDraft(null);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n });\n setDraftConflict(null);\n return;\n }\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n draftRef.current = next;\n restoredResourcesRef.current = next.resources;\n lastSavedSignature.current = draftSignature(draftPayload(next));\n localEditRevision.current += 1;\n setDraft(next);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n });\n setDraftConflict(null);\n onDraftAppliedRef.current?.(next);\n },\n [durableDrafts, pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const loadDraft = useCallback(\n async (replaceLocal: boolean): Promise<void> => {\n if (targetKeyRef.current !== targetKey) return;\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n return;\n }\n const generation = targetGeneration.current;\n const readTicket = ++draftReadGeneration.current;\n const localAtStart = localEditRevision.current;\n const baseAtStart = draftRef.current;\n const extrasAtStart = resolveSendExtras(sendExtrasRef.current);\n const localSignatureAtStart = baseAtStart\n ? draftSignature(\n composerDraftPayload(\n baseAtStart,\n valueRef.current,\n restoredResourcesRef.current,\n annotationsRef.current,\n extrasAtStart,\n ),\n )\n : null;\n const localWasDirtyAtStart =\n localSignatureAtStart === null\n ? localAtStart !== 0\n : localSignatureAtStart !== lastSavedSignature.current;\n // Only blank the picker on first hydrate / hard reload. Reconcile and\n // event-triggered soft reloads (loadOlder SSE reconnect) must not flicker\n // draftLoading — stale-while-revalidate keeps the settled UI mounted.\n const showLoading = replaceLocal || draftRef.current === null;\n if (showLoading) {\n setDraftLoading(true);\n }\n try {\n const fetched = await client.getComposerDraft(workspaceId, sessionId);\n if (\n generation !== targetGeneration.current ||\n targetKeyRef.current !== targetKey ||\n readTicket !== draftReadGeneration.current\n ) {\n return;\n }\n const currentRevision = draftRef.current?.revision ?? -1;\n if (fetched.revision >= currentRevision) {\n draftRef.current = fetched;\n setDraft(fetched);\n setDraftConflict(null);\n const shadow =\n pendingOperationRef.current?.newerShadow ??\n optimisticSendsRef.current.at(-1)?.newerShadow;\n if (shadow) {\n // The server can only know the original operation. Never replace\n // newer local edits while that operation is still uncertain.\n valueRef.current = shadow.text;\n restoredResourcesRef.current = shadow.resources;\n annotationsRef.current = shadow.annotations;\n localEditRevision.current ||= 1;\n setValue(shadow.text);\n setRestoredResources(shadow.resources);\n setAnnotations(shadow.annotations);\n } else if (\n replaceLocal ||\n (!localWasDirtyAtStart && localAtStart === localEditRevision.current)\n ) {\n // Model/effort/latency ride in sendExtras (outside\n // localEditRevision). If\n // the picker changed during this fetch, skip onDraftApplied so a\n // stale server policy cannot undo the operator's pick.\n const extrasNow = resolveSendExtras(sendExtrasRef.current);\n const pickerChangedDuringFetch =\n extrasNow.model !== extrasAtStart.model ||\n extrasNow.reasoningEffort !== extrasAtStart.reasoningEffort ||\n extrasNow.latencyMode !== extrasAtStart.latencyMode;\n valueRef.current = fetched.text;\n restoredResourcesRef.current = fetched.resources;\n annotationsRef.current = fetched.annotations ?? [];\n lastSavedSignature.current = draftSignature(draftPayload(fetched));\n setValue(fetched.text);\n setRestoredResources(fetched.resources);\n setAnnotations(fetched.annotations ?? []);\n if (replaceLocal || !pickerChangedDuringFetch) {\n onDraftAppliedRef.current?.(fetched);\n }\n }\n }\n } catch (cause) {\n if (\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n setError(asError(cause));\n }\n } finally {\n if (\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n setDraftLoading(false);\n }\n }\n },\n [client, durableDrafts, sessionId, targetKey, workspaceId],\n );\n\n useEffect(() => {\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n return;\n }\n void loadDraft(false);\n }, [durableDrafts, loadDraft, sessionId]);\n // After long background / sleep the in-memory revision is often stale while\n // a prior autosave already advanced the server. Soft-reload on wake so the\n // next keystroke does not OCC against a dead revision.\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n const onWake = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") return;\n void loadDraft(false);\n };\n document.addEventListener(\"visibilitychange\", onWake);\n window.addEventListener(\"pageshow\", onWake);\n return () => {\n document.removeEventListener(\"visibilitychange\", onWake);\n window.removeEventListener(\"pageshow\", onWake);\n };\n }, [durableDrafts, loadDraft, sessionId]);\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n return registerSessionReconciler(sessionId, \"composer\", async () => await loadDraft(false));\n }, [durableDrafts, loadDraft, registerSessionReconciler, sessionId]);\n const reconcileSteering = useCallback(async (): Promise<void> => {\n if (!sessionId || !steeringRef.current) return;\n const ownedTargetKey = targetKey;\n let events: SessionEvent[];\n try {\n events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\n \"user.message\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n ],\n limit: 250,\n payloadMode: \"full\",\n });\n } catch {\n // Best effort: the live stream still settles steering when its event arrives.\n return;\n }\n if (targetKeyRef.current !== ownedTargetKey) return;\n setSteering((current) => {\n if (!current) return current;\n if (steeringSettledByEvents(current, events)) {\n steeringSettlementEventsRef.current = [];\n return null;\n }\n const accepted = steeringAcceptedEvent(current, events);\n if (!accepted || current.triggerEventId) return current;\n return {\n ...current,\n phase: \"accepted\",\n triggerEventId: accepted.id,\n };\n });\n }, [client, sessionId, targetKey, workspaceId]);\n useSessionEventTrigger(\n client,\n workspaceId,\n sessionId,\n (event) => isComposerDraftEvent(event) || isSteeringSettlementEvent(event),\n (event) => {\n if (isComposerDraftEvent(event)) void loadDraft(false);\n if (!isSteeringSettlementEvent(event)) return;\n steeringSettlementEventsRef.current = [\n ...steeringSettlementEventsRef.current.slice(-15),\n event,\n ];\n setSteering((current) => {\n if (!current || !steeringSettledByEvents(current, [event])) return current;\n steeringSettlementEventsRef.current = [];\n return null;\n });\n },\n {\n enabled: Boolean(sessionId) && (durableDrafts || steering !== null),\n ...(options.events !== undefined ? { events: options.events } : {}),\n },\n reconcileSteering,\n );\n\n useEffect(() => {\n if (!steering) return;\n const observed = [...(options.events ?? []), ...steeringSettlementEventsRef.current];\n if (!steeringSettledByEvents(steering, observed)) return;\n steeringSettlementEventsRef.current = [];\n setSteering(null);\n }, [options.events, steering]);\n\n useEffect(() => {\n if (!controlStopping) return;\n const effectiveControl = options.effectiveControl;\n if (!effectiveControl || effectiveControl.controlVersion < controlStopping.controlVersion) {\n return;\n }\n if (\n effectiveControl.controlVersion === controlStopping.controlVersion &&\n effectiveControl.controlEtag === controlStopping.controlEtag &&\n effectiveControl.settlement !== null\n ) {\n return;\n }\n // A newer control revision, an impossible same-version/different-etag\n // projection, or quiescence at this exact revision supersedes the local\n // mutation receipt. SessionChrome then falls back to durable queue truth.\n setControlStopping((current) => (current === controlStopping ? null : current));\n }, [controlStopping, options.effectiveControl]);\n\n const currentDraftPayload = useCallback((): SaveComposerDraftRequest | null => {\n if (!durableDrafts || targetKeyRef.current !== targetKey) return null;\n const base = draftRef.current;\n if (!base) return null;\n const extras = resolveSendExtras(sendExtrasRef.current);\n return composerDraftPayload(base, value, restoredResources, annotations, extras);\n }, [annotations, durableDrafts, restoredResources, targetKey, value]);\n\n const persistPayload = useCallback(\n async (payload: SaveComposerDraftRequest): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || !durableDrafts || targetKeyRef.current !== ownedTargetKey) {\n return false;\n }\n let success = false;\n const run = async () => {\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const current = draftRef.current;\n if (!current) return;\n const request = { ...payload, expectedRevision: current.revision };\n const signature = draftSignature(request);\n if (signature === lastSavedSignature.current) {\n success = true;\n return;\n }\n setDraftSaving(true);\n try {\n const saved = await saveComposerDraftWithStaleRetry({\n client,\n workspaceId,\n sessionId,\n request,\n onAdoptRemote: (remote) => {\n draftRef.current = remote;\n setDraft(remote);\n },\n });\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n draftRef.current = saved;\n setDraft(saved);\n lastSavedSignature.current = draftSignature({\n ...request,\n expectedRevision: saved.revision,\n });\n setDraftConflict(null);\n setError(null);\n success = true;\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n const problem = asError(cause);\n if (isDraftConflictError(problem)) setDraftConflict(problem);\n setError(problem);\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setDraftSaving(false);\n }\n }\n };\n saveChain.current = saveChain.current.then(run, run);\n await saveChain.current;\n return success;\n },\n [client, durableDrafts, sessionId, targetKey, workspaceId],\n );\n\n const replaceOptimisticSends = useCallback(\n (\n update: (current: OptimisticSendOperation[]) => OptimisticSendOperation[],\n ): OptimisticSendOperation[] => {\n const next = update(optimisticSendsRef.current);\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n return next;\n },\n [pendingOperationKey],\n );\n\n const markOptimisticAccepted = useCallback(\n (operation: OptimisticSendOperation): void => {\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(operation.input.text, operation.input);\n }\n replaceOptimisticSends((current) =>\n current.filter((candidate) => candidate.clientEventId !== operation.clientEventId),\n );\n },\n [onSent, replaceOptimisticSends],\n );\n\n useEffect(() => {\n const acceptedIds = new Set(\n (options.events ?? [])\n .filter((event) => event.type === \"user.message\" && event.clientEventId)\n .map((event) => event.clientEventId as string),\n );\n if (acceptedIds.size === 0) return;\n const accepted = optimisticSendsRef.current.filter((operation) =>\n acceptedIds.has(operation.clientEventId),\n );\n for (const operation of accepted) markOptimisticAccepted(operation);\n }, [markOptimisticAccepted, options.events]);\n\n const processOptimisticSends = useCallback((): void => {\n if (!sessionId || optimisticProcessorBusyRef.current) return;\n const currentOperations = optimisticSendsRef.current;\n const operationIndex = currentOperations.findIndex(\n (candidate) => candidate.state === \"sending\",\n );\n const operation = operationIndex < 0 ? undefined : currentOperations[operationIndex];\n if (!operation) return;\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n optimisticProcessorBusyRef.current = true;\n void (async () => {\n try {\n if (operation.outcomeUnknown) {\n const events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\"user.message\"],\n limit: 100,\n payloadMode: \"none\",\n });\n if (\n events.some(\n (event) =>\n event.type === \"user.message\" && event.clientEventId === operation.clientEventId,\n )\n ) {\n markOptimisticAccepted(operation);\n return;\n }\n if (!operation.canRetry) {\n throw new Error(\n \"OpenGeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n );\n }\n }\n let expectedDraftRevision: number | undefined;\n if (durableDrafts && operation.draftPayload) {\n if (!(await persistPayload(operation.draftPayload))) {\n throw new Error(\"The message draft could not be saved before delivery.\");\n }\n expectedDraftRevision = draftRef.current?.revision;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const wireInput = {\n ...operation.input,\n ...(expectedDraftRevision !== undefined ? { expectedDraftRevision } : {}),\n };\n await client.sendMessage(workspaceId, sessionId, wireInput);\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n if (options.events === undefined) {\n markOptimisticAccepted({ ...operation, input: wireInput });\n } else {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? { ...candidate, input: wireInput, state: \"queued\", error: undefined }\n : candidate,\n ),\n );\n }\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(wireInput.text, wireInput);\n }\n if (durableDrafts && draftRef.current) {\n const cleared = {\n ...draftRef.current,\n revision: 0,\n text: \"\",\n resources: [],\n annotations: [],\n sourceTurnId: null,\n sourceTurnVersion: null,\n updatedAt: null,\n };\n draftRef.current = cleared;\n setDraft(cleared);\n lastSavedSignature.current = draftSignature(draftPayload(cleared));\n }\n } catch (cause) {\n const problem = asError(cause);\n const outcomeUnknown = isOutcomeUnknownError(cause) || operation.outcomeUnknown === true;\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? {\n ...candidate,\n state: \"failed\",\n error: problem.message,\n outcomeUnknown,\n }\n : candidate,\n ),\n );\n }\n } finally {\n optimisticProcessorBusyRef.current = false;\n if (targetKeyRef.current === ownedTargetKey) {\n setOptimisticSends([...optimisticSendsRef.current]);\n }\n }\n })();\n }, [\n client,\n durableDrafts,\n markOptimisticAccepted,\n onSent,\n options.events,\n persistPayload,\n replaceOptimisticSends,\n sessionId,\n targetKey,\n workspaceId,\n ]);\n\n useEffect(() => {\n processOptimisticSends();\n }, [optimisticSends, processOptimisticSends]);\n\n // Private durable autosave. A newer local edit is never replaced by an older\n // response; saves serialize and each reads the latest acknowledged revision.\n useEffect(() => {\n const pending = pendingOperationRef.current;\n if (pending) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n };\n if (\n pending.newerShadow.text !== shadow.text ||\n JSON.stringify(pending.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(pending.newerShadow.annotations) !== JSON.stringify(shadow.annotations)\n ) {\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pending,\n shadow,\n );\n }\n return;\n }\n const optimistic = optimisticSendsRef.current.at(-1);\n if (optimistic) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n };\n if (\n optimistic.newerShadow.text !== shadow.text ||\n JSON.stringify(optimistic.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(optimistic.newerShadow.annotations) !== JSON.stringify(shadow.annotations)\n ) {\n setOptimisticDraftShadow(shadow);\n }\n }\n if (optimisticSendsRef.current.some((operation) => operation.state === \"sending\")) {\n return;\n }\n if (\n !durableDrafts ||\n !sessionId ||\n draftLoading ||\n sending ||\n !draftRef.current ||\n draftConflict\n )\n return;\n const payload = currentDraftPayload();\n if (!payload || draftSignature(payload) === lastSavedSignature.current) return;\n const timer = window.setTimeout(() => void persistPayload(payload), 500);\n return () => window.clearTimeout(timer);\n }, [\n currentDraftPayload,\n durableDrafts,\n draftConflict,\n draftLoading,\n liveExtrasVersion,\n pendingOperationKey,\n persistPayload,\n setOptimisticDraftShadow,\n sending,\n sessionId,\n ]);\n\n const dispatch = useCallback(\n async (delivery: \"send\" | \"steer\", explicit?: string): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n const operationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const pending = pendingOperationRef.current ?? restorePendingComposerOperation(operationKey);\n if (pending && !pendingOperationRef.current) {\n pendingOperationRef.current = pending;\n pendingClientEventId.current = pending.input.clientEventId ?? null;\n }\n const draftAtSend = value;\n const annotationsAtSend = annotations;\n const rawText = explicit ?? draftAtSend;\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n // Resolve the extras once: a file-only message (empty text + ≥1 ready\n // resource) is legitimate, so we must not bail on empty text alone.\n const extras = pending ? {} : resolveSendExtras(sendExtrasRef.current);\n const hasResources = restoredResources.length > 0 || (extras.resources?.length ?? 0) > 0;\n if (\n (!pending && (!annotationsComplete || (!hasText && !hasResources && !hasAnnotations))) ||\n !sessionId ||\n sending ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== ownedTargetKey\n ) {\n return false;\n }\n\n const clearPending = (): void => {\n pendingOperationRef.current = null;\n pendingClientEventId.current = null;\n forgetPendingComposerOperation(operationKey);\n };\n\n let keepSteering = pending?.delivery === \"steer\";\n\n const settleAccepted = (operation: PendingComposerOperation): void => {\n clearPending();\n const draftWasUnchanged = valueRef.current === operation.draftAtSend;\n const resourcesWereUnchanged =\n JSON.stringify(restoredResourcesRef.current) ===\n JSON.stringify(operation.resourcesAtSend);\n const annotationsWereUnchanged =\n JSON.stringify(annotationsRef.current) === JSON.stringify(operation.annotationsAtSend);\n const previousDraft = draftRef.current;\n if (previousDraft) {\n const cleared = {\n ...previousDraft,\n revision: 0,\n text: \"\",\n resources: [],\n annotations: [],\n sourceTurnId: null,\n sourceTurnVersion: null,\n updatedAt: null,\n };\n draftRef.current = cleared;\n setDraft(cleared);\n lastSavedSignature.current = draftSignature(draftPayload(cleared));\n }\n if (resourcesWereUnchanged) {\n restoredResourcesRef.current = [];\n setRestoredResources([]);\n }\n if (annotationsWereUnchanged) {\n annotationsRef.current = [];\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n }\n if (operation.clearDraftOnAccept && draftWasUnchanged) {\n valueRef.current = \"\";\n setValue(\"\");\n }\n onSent?.(operation.input.text, operation.input);\n };\n\n const deliver = async (operation: PendingComposerOperation) => {\n if (operation.delivery === \"steer\") {\n return await client.steerMessage(workspaceId, sessionId, operation.input);\n }\n await client.sendMessage(workspaceId, sessionId, operation.input);\n return null;\n };\n\n if (delivery === \"steer\") {\n setSteering({\n phase: \"submitting\",\n text: rawText,\n clientEventId: pending?.input.clientEventId ?? pendingClientEventId.current,\n triggerEventId: null,\n turnId: null,\n });\n }\n setSending(true);\n setError(null);\n try {\n if (pending) {\n let acceptedEvent: SessionEvent | null = null;\n try {\n const events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\"user.message\"],\n limit: 100,\n payloadMode: \"none\",\n });\n acceptedEvent =\n events.find(\n (event) =>\n event.type === \"user.message\" &&\n event.clientEventId === pending.input.clientEventId,\n ) ?? null;\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n if (acceptedEvent) {\n if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: acceptedEvent.id,\n turnId: null,\n });\n }\n settleAccepted(pending);\n return true;\n }\n if (!pending.canRetry) {\n setError(\n new Error(\n \"OpenGeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n ),\n );\n return false;\n }\n try {\n const result = await deliver(pending);\n if (pending.delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n if (pending.delivery === \"steer\") keepSteering = true;\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(pending);\n return true;\n }\n\n // Trimming is only an emptiness check. A non-blank prompt is persisted\n // and submitted byte-for-byte, while file-only sends use the same\n // placeholder for both operations so the server content fence cannot\n // reject its own client.\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT;\n const currentPayload = currentDraftPayload();\n const payload = currentPayload ? { ...currentPayload, text: sendText } : null;\n if (payload && !(await persistPayload(payload))) return false;\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n // The wire contract requires non-empty text (z.string().min(1)) and the\n // worker rejects whitespace-only text; a file-only message therefore\n // carries a minimal default so the attachments still get delivered.\n pendingClientEventId.current ??= generateClientEventId();\n const input = composeSendInput(sendText, pendingClientEventId.current, extras, {\n ...(options.effectiveControl?.controlEtag\n ? { controlEtag: options.effectiveControl.controlEtag }\n : {}),\n ...(durableDrafts && draftRef.current\n ? { expectedDraftRevision: draftRef.current.revision }\n : {}),\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n });\n const operation: PendingComposerOperation = {\n delivery,\n input,\n draftAtSend,\n resourcesAtSend: [...restoredResources],\n annotationsAtSend: cloneAnnotations(annotationsAtSend),\n newerShadow: {\n text: draftAtSend,\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n },\n clearDraftOnAccept: explicit === undefined,\n canRetry: true,\n };\n pendingOperationRef.current = operation;\n rememberPendingComposerOperation(operationKey, operation);\n if (delivery === \"steer\") {\n setSteering({\n phase: \"submitting\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n });\n }\n try {\n const result = await deliver(operation);\n if (delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n if (!isOutcomeUnknownError(cause)) {\n clearPending();\n } else if (delivery === \"steer\") {\n keepSteering = true;\n }\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(operation);\n return true;\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setSending(false);\n if (delivery === \"steer\" && !keepSteering) setSteering(null);\n }\n }\n },\n [\n client,\n currentDraftPayload,\n durableDrafts,\n onSent,\n options.effectiveControl?.controlEtag,\n persistPayload,\n restoredResources,\n annotations,\n sending,\n sessionId,\n targetKey,\n value,\n workspaceId,\n ],\n );\n\n const send = useCallback(\n async (explicit?: string): Promise<boolean> => {\n if (pendingOperationRef.current?.delivery === \"send\") {\n return await dispatch(\"send\", explicit);\n }\n const rawText = explicit ?? valueRef.current;\n const annotationsAtSend = cloneAnnotations(annotationsRef.current);\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n const extras = resolveSendExtras(sendExtrasRef.current);\n const resources = mergeResources(restoredResourcesRef.current, extras.resources ?? []);\n if (\n !sessionId ||\n sending ||\n !annotationsComplete ||\n (!hasText && !hasAnnotations && resources.length === 0) ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== targetKey\n ) {\n return false;\n }\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT;\n const clientEventId = generateClientEventId();\n const input = composeSendInput(sendText, clientEventId, extras, {\n ...(options.effectiveControl?.controlEtag\n ? { controlEtag: options.effectiveControl.controlEtag }\n : {}),\n resources,\n annotations: annotationsAtSend,\n });\n const currentPayload = currentDraftPayload();\n const operation: OptimisticSendOperation = {\n clientEventId,\n text: sendText,\n annotations: annotationsAtSend,\n resources,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n input,\n draftPayload: currentPayload ? { ...currentPayload, text: sendText } : null,\n newerShadow: {\n text: explicit === undefined ? \"\" : valueRef.current,\n resources: explicit === undefined ? [] : [...restoredResourcesRef.current],\n annotations: explicit === undefined ? [] : cloneAnnotations(annotationsRef.current),\n },\n canRetry: true,\n };\n replaceOptimisticSends((current) => [...current, operation]);\n queueMicrotask(processOptimisticSends);\n setError(null);\n onSubmitted?.(sendText, input);\n if (explicit === undefined) {\n valueRef.current = \"\";\n annotationsRef.current = [];\n restoredResourcesRef.current = [];\n localEditRevision.current += 1;\n setValue(\"\");\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n setRestoredResources([]);\n }\n return true;\n },\n [\n currentDraftPayload,\n dispatch,\n onSubmitted,\n options.effectiveControl?.controlEtag,\n processOptimisticSends,\n replaceOptimisticSends,\n sending,\n sessionId,\n targetKey,\n ],\n );\n const steer = useCallback(async (text?: string) => await dispatch(\"steer\", text), [dispatch]);\n\n const retryOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n replaceOptimisticSends((current) =>\n current.map((operation) => {\n if (operation.clientEventId !== clientEventId || operation.state !== \"failed\") {\n return operation;\n }\n if (operation.outcomeUnknown) {\n return { ...operation, state: \"sending\", error: undefined };\n }\n const nextClientEventId = generateClientEventId();\n const retryExtras = resolveSendExtras(sendExtrasRef.current);\n const retryInput = composeSendInput(operation.text, nextClientEventId, retryExtras, {\n ...(options.effectiveControl?.controlEtag\n ? { controlEtag: options.effectiveControl.controlEtag }\n : {}),\n resources: operation.resources,\n annotations: operation.annotations,\n });\n return {\n ...operation,\n clientEventId: nextClientEventId,\n input: retryInput,\n draftPayload: operation.draftPayload\n ? {\n ...operation.draftPayload,\n model: retryExtras.model ?? operation.draftPayload.model,\n reasoningEffort:\n retryExtras.reasoningEffort ?? operation.draftPayload.reasoningEffort,\n latencyMode: retryExtras.latencyMode ?? operation.draftPayload.latencyMode,\n }\n : null,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n error: undefined,\n outcomeUnknown: false,\n canRetry: true,\n };\n }),\n );\n queueMicrotask(processOptimisticSends);\n },\n [options.effectiveControl?.controlEtag, processOptimisticSends, replaceOptimisticSends],\n );\n\n const removeOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n replaceOptimisticSends((current) =>\n current.filter((operation) => operation.clientEventId !== clientEventId),\n );\n },\n [replaceOptimisticSends],\n );\n\n // A send is possible with non-empty text OR with ≥1 attached resource (a\n // file-only message). Resources ride in `sendExtras`, so we resolve them here\n // — keeping useComposer attachment-agnostic while still lighting up the send\n // affordance the moment a file is ready. Attachment hosts bind `sendBlocked`\n // to unresolved uploads so direct send()/steer() calls fail closed too.\n const hasReadyResources =\n restoredResources.length > 0 ||\n (resolveSendExtras(sendExtrasRef.current).resources?.length ?? 0) > 0;\n const hasPendingOperation = pendingOperationRef.current !== null;\n const annotationsComplete = annotations.every((annotation) => annotation.note.trim().length > 0);\n\n const pause = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || pausing || targetKeyRef.current !== ownedTargetKey) {\n return;\n }\n setPausing(true);\n setError(null);\n try {\n const result = await client.pauseSession(workspaceId, sessionId, {\n ...(reason !== undefined ? { reason } : {}),\n ...(options.effectiveControl?.controlEtag\n ? { expectedControlEtag: options.effectiveControl.controlEtag }\n : {}),\n });\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setControlStopping(\n result.interruptionCount > 0 &&\n result.effectiveControl.state === \"paused\" &&\n result.effectiveControl.settlement !== null\n ? {\n controlVersion: result.effectiveControl.controlVersion,\n controlEtag: result.effectiveControl.controlEtag,\n }\n : null,\n );\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setPausing(false);\n }\n }\n },\n [client, workspaceId, sessionId, pausing, options.effectiveControl?.controlEtag, targetKey],\n );\n\n const resume = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n await client.resumeSession(workspaceId, sessionId, {\n ...(reason !== undefined ? { reason } : {}),\n ...(options.effectiveControl?.controlEtag\n ? { expectedControlEtag: options.effectiveControl.controlEtag }\n : {}),\n });\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, workspaceId, sessionId, resuming, options.effectiveControl?.controlEtag, targetKey],\n );\n\n const resumeScope = useCallback(\n async (option: EffectiveControlResumeOption): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n if (option.scope === \"workspace\") {\n const workspaceBlocker = options.effectiveControl?.blockers.find(\n (blocker) => blocker.kind === \"workspace\",\n );\n if (!client.setWorkspaceInferenceState) {\n throw new Error(\n \"@opengeni/react: workspace-scoped resume requires setWorkspaceInferenceState.\",\n );\n }\n await client.setWorkspaceInferenceState(workspaceId, {\n action: \"resume\",\n clientEventId: generateClientEventId(),\n ...(workspaceBlocker ? { expectedRevision: workspaceBlocker.revision } : {}),\n });\n } else if (option.scope === \"session\" && option.targetId) {\n const target = await client.getQueue(workspaceId, option.targetId);\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n await client.resumeSession(workspaceId, option.targetId, {\n expectedControlEtag: target.effectiveControl.controlEtag,\n });\n } else {\n await client.resumeSession(workspaceId, sessionId, {\n ...(options.effectiveControl?.controlEtag\n ? { expectedControlEtag: options.effectiveControl.controlEtag }\n : {}),\n });\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, options.effectiveControl, resuming, sessionId, targetKey, workspaceId],\n );\n\n const updateValue = useCallback(\n (next: string) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n valueRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n },\n );\n setOptimisticDraftShadow({\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n });\n setValue(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const updateAnnotations = useCallback(\n (next: DraftTimelineAnnotation[], reviewTargetId: string | null = null) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n annotationsRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n });\n setAnnotations(next);\n setAnnotationReviewTargetId(reviewTargetId);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const addAnnotation = useCallback(\n (annotation: DraftTimelineAnnotation) => {\n if (annotationsRef.current.length >= 12) {\n setError(new Error(\"A message can include at most 12 timeline annotations.\"));\n return;\n }\n const next = [...annotationsRef.current, annotation];\n updateAnnotations(next, annotation.id);\n },\n [updateAnnotations],\n );\n\n const updateAnnotation = useCallback(\n (id: string, note: string) => {\n updateAnnotations(\n annotationsRef.current.map((annotation) =>\n annotation.id === id ? { ...annotation, note } : annotation,\n ),\n );\n },\n [updateAnnotations],\n );\n\n const removeAnnotation = useCallback(\n (id: string) => {\n updateAnnotations(annotationsRef.current.filter((annotation) => annotation.id !== id));\n },\n [updateAnnotations],\n );\n\n const clearAnnotationReviewTarget = useCallback(() => {\n setAnnotationReviewTargetId(null);\n }, []);\n\n const removeRestoredResource = useCallback(\n (index: number) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n const next = restoredResourcesRef.current.filter((_, candidate) => candidate !== index);\n restoredResourcesRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n });\n setRestoredResources(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const hasDraftContent = useCallback((): boolean => {\n const current = draftRef.current;\n const extras = resolveSendExtras(sendExtrasRef.current);\n return (\n valueRef.current.length > 0 ||\n annotationsRef.current.length > 0 ||\n restoredResourcesRef.current.length > 0 ||\n (extras.resources?.length ?? 0) > 0 ||\n (current?.sourceTurnId !== null && current?.sourceTurnId !== undefined)\n );\n }, []);\n\n const resolveDraftConflict = useCallback(\n async (choice: \"keep_mine\" | \"use_remote\"): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || !durableDrafts || targetKeyRef.current !== ownedTargetKey) return;\n const remote = await client.getComposerDraft(workspaceId, sessionId);\n if (targetKeyRef.current !== ownedTargetKey || targetGeneration.current !== ownedGeneration) {\n return;\n }\n if (choice === \"use_remote\") {\n applyDraft(remote);\n setError(null);\n return;\n }\n draftRef.current = remote;\n setDraft(remote);\n setDraftConflict(null);\n setError(null);\n const payload = currentDraftPayload();\n if (payload) await persistPayload({ ...payload, expectedRevision: remote.revision });\n },\n [\n applyDraft,\n client,\n currentDraftPayload,\n durableDrafts,\n persistPayload,\n sessionId,\n targetKey,\n workspaceId,\n ],\n );\n\n const identityMatches = stateTargetKey === targetKey;\n const visibleSteering = identityMatches ? steering : null;\n const reloadDraft = useCallback(async () => await loadDraft(true), [loadDraft]);\n const clearError = useCallback(() => {\n if (targetKeyRef.current !== targetKey) return;\n setError(null);\n setDraftConflict(null);\n }, [targetKey]);\n\n return {\n value: identityMatches ? value : \"\",\n setValue: updateValue,\n annotations: identityMatches ? annotations : [],\n addAnnotation,\n updateAnnotation,\n removeAnnotation,\n annotationReviewTargetId: identityMatches ? annotationReviewTargetId : null,\n clearAnnotationReviewTarget,\n hasDraftContent,\n send,\n optimisticMessages: identityMatches\n ? optimisticSends.map(\n ({ input: _input, draftPayload: _payload, canRetry: _retry, ...item }) => item,\n )\n : [],\n retryOptimisticMessage,\n removeOptimisticMessage,\n steer,\n steering: visibleSteering,\n stoppingAttempt: identityMatches\n ? controlStopping\n ? \"current\"\n : visibleSteering?.phase === \"accepted\" && visibleSteering.stoppingPreviousAttempt === true\n ? \"previous\"\n : null\n : null,\n sending: identityMatches ? sending : false,\n canSend:\n identityMatches &&\n Boolean(sessionId) &&\n !sending &&\n sendBlockedRef.current?.() !== true &&\n annotationsComplete &&\n (hasPendingOperation ||\n value.trim().length > 0 ||\n hasReadyResources ||\n annotations.length > 0),\n pause,\n pausing: identityMatches ? pausing : false,\n resume,\n resumeScope,\n resuming: identityMatches ? resuming : false,\n draft: identityMatches ? draft : null,\n draftRevision: identityMatches ? (draft?.revision ?? 0) : 0,\n draftLoading: identityMatches ? draftLoading : Boolean(sessionId) && durableDrafts,\n draftSaving: identityMatches ? draftSaving : false,\n draftConflict: identityMatches ? draftConflict : null,\n draftPersistence: durableDrafts ? \"durable\" : \"disabled\",\n applyDraft,\n reloadDraft,\n resolveDraftConflict,\n restoredResources: identityMatches ? restoredResources : [],\n removeRestoredResource,\n error: identityMatches ? error : null,\n clearError,\n };\n}\n\n/** Events that can atomically replace or clear this subject's durable draft. */\nexport function isComposerDraftEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return event.type === \"user.message\" || event.type === \"session.queue.changed\";\n}\n\n/**\n * Default text for a resource-only message (attachments present, no typed\n * draft). Kept non-empty so the wire contract (`text: z.string().min(1)`) and\n * the worker's non-whitespace guard accept it. The export name is retained for\n * compatibility now that repositories can ride beside files in `resources`.\n */\nexport const FILE_ONLY_MESSAGE_TEXT = \"(see attached context)\";\n\n/** Resolve possibly-deferred extras to a concrete bag (function evaluated now). */\nexport function resolveSendExtras(\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n): ComposerSendExtras {\n return (typeof extras === \"function\" ? extras() : extras) ?? {};\n}\n\n/**\n * Merge the draft text + idempotency key with caller-provided extras. The\n * text and clientEventId always win over extras. Exported for tests.\n */\nexport function composeSendInput(\n text: string,\n clientEventId: string,\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n bound: Partial<SendMessageInput> = {},\n): SendMessageInput {\n return { ...resolveSendExtras(extras), ...bound, text, clientEventId };\n}\n\n/** Submit on plain Enter; Shift+Enter inserts a newline. Exported for tests. */\nexport function shouldSubmitOnKey(event: {\n key: string;\n shiftKey: boolean;\n metaKey?: boolean;\n ctrlKey?: boolean;\n nativeEvent?: { isComposing?: boolean };\n}): boolean {\n if (event.key !== \"Enter\" || event.shiftKey) {\n return false;\n }\n return event.nativeEvent?.isComposing !== true;\n}\n\n/** Cmd/Ctrl+Enter steers; ordinary Enter appends to the queue. */\nexport function shouldSteerOnKey(event: { metaKey?: boolean; ctrlKey?: boolean }): boolean {\n return event.metaKey === true || event.ctrlKey === true;\n}\n\nfunction generateClientEventId(): string {\n return globalThis.crypto.randomUUID();\n}\n\nfunction isOutcomeUnknownError(cause: unknown): boolean {\n return (\n typeof cause === \"object\" &&\n cause !== null &&\n (cause as { outcomeUnknown?: unknown }).outcomeUnknown === true\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nfunction isDraftConflictError(error: Error): boolean {\n const apiError = error as Partial<OpenGeniApiError>;\n if (apiError.status !== 409 || apiError.outcomeUnknown === true) return false;\n // Production queue OCC returns `DRAFT_CHANGED`. Older/SDK-shaped 409s may\n // omit code or use the generic conflict labels — all are recoverable OCC.\n const code = apiError.code;\n if (\n code === undefined ||\n code === \"DRAFT_CHANGED\" ||\n code === \"conflict\" ||\n code === \"idempotency_conflict\"\n ) {\n return true;\n }\n return /draft changed/i.test(error.message);\n}\n\n/**\n * One OCC retry: adopt the server revision and rewrite the same local content.\n * Covers the common \"tab slept through a successful autosave\" case without\n * stranding the operator on a raw 409 toast.\n */\nasync function saveComposerDraftWithStaleRetry(input: {\n client: {\n getComposerDraft: (workspaceId: string, sessionId: string) => Promise<ComposerDraft>;\n saveComposerDraft: (\n workspaceId: string,\n sessionId: string,\n request: SaveComposerDraftRequest,\n ) => Promise<ComposerDraft>;\n };\n workspaceId: string;\n sessionId: string;\n request: SaveComposerDraftRequest;\n onAdoptRemote: (remote: ComposerDraft) => void;\n}): Promise<ComposerDraft> {\n try {\n return await input.client.saveComposerDraft(input.workspaceId, input.sessionId, input.request);\n } catch (cause) {\n const problem = asError(cause);\n if (!isDraftConflictError(problem)) throw problem;\n const remote = await input.client.getComposerDraft(input.workspaceId, input.sessionId);\n input.onAdoptRemote(remote);\n return await input.client.saveComposerDraft(input.workspaceId, input.sessionId, {\n ...input.request,\n expectedRevision: remote.revision,\n });\n }\n}\n\nfunction draftPayload(draft: ComposerDraft): SaveComposerDraftRequest {\n return {\n expectedRevision: draft.revision,\n text: draft.text,\n resources: draft.resources,\n annotations: draft.annotations ?? [],\n model: draft.model,\n reasoningEffort: draft.reasoningEffort,\n latencyMode: draft.latencyMode ?? \"standard\",\n };\n}\n\nfunction composerDraftPayload(\n base: ComposerDraft,\n text: string,\n restoredResources: ResourceRef[],\n annotations: DraftTimelineAnnotation[],\n extras: ComposerSendExtras,\n): SaveComposerDraftRequest {\n return {\n expectedRevision: base.revision,\n text,\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations,\n model: extras.model ?? base.model,\n reasoningEffort: extras.reasoningEffort ?? base.reasoningEffort,\n latencyMode: extras.latencyMode ?? base.latencyMode ?? \"standard\",\n };\n}\n\nfunction draftSignature(payload: SaveComposerDraftRequest): string {\n const { expectedRevision: _revision, ...content } = payload;\n return JSON.stringify(content);\n}\n\nfunction mergeResources(base: ResourceRef[], additions: ResourceRef[]): ResourceRef[] {\n const seen = new Set<string>();\n return [...base, ...additions].filter((resource) => {\n // Reconnect reconciliation can restore the canonical server form while\n // the still-mounted upload card supplies the same ready file without its\n // default mount. Treat those two wire shapes as one selected attachment;\n // preserving the first representation keeps custom mounts and ordering\n // intact while preventing the draft and command paths from seeing\n // different duplicate counts after server normalization.\n const key =\n resource.kind === \"file\"\n ? `file:${resource.fileId}\\u0000${resource.mountPath ?? `${DEFAULT_FILE_RESOURCE_MOUNT_ROOT}/${resource.fileId}`}`\n : JSON.stringify(resource);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":"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","names":["annotationsComplete"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/artifacts/artifact-surface.tsx","../src/components/artifacts/editable-artifact-ui.tsx"],"sourcesContent":["import {\n FileSpreadsheetIcon,\n FileTextIcon,\n LoaderCircleIcon,\n PresentationIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\n\nexport type ArtifactModality = \"spreadsheet\" | \"document\" | \"presentation\";\n\nexport type ArtifactSurfaceProps = {\n modality: ArtifactModality;\n title: string;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n children: ReactNode;\n footer?: ReactNode | undefined;\n busy?: boolean | undefined;\n className?: string | undefined;\n};\n\nconst MODALITY_LABEL: Record<ArtifactModality, string> = {\n spreadsheet: \"Spreadsheet\",\n document: \"Document\",\n presentation: \"Presentation\",\n};\n\nfunction ModalityIcon({ modality }: { modality: ArtifactModality }) {\n switch (modality) {\n case \"spreadsheet\":\n return <FileSpreadsheetIcon className=\"size-4\" />;\n case \"document\":\n return <FileTextIcon className=\"size-4\" />;\n case \"presentation\":\n return <PresentationIcon className=\"size-4\" />;\n }\n}\n\n/**\n * Modality-neutral artifact chrome. It deliberately owns no file, session, or\n * persistence state: hosts can use the same surface for a local draft, a\n * durable OpenGeni artifact, or a collaborative projection.\n */\nexport function ArtifactSurface({\n modality,\n title,\n subtitle,\n actions,\n children,\n footer,\n busy = false,\n className,\n}: ArtifactSurfaceProps) {\n return (\n <section\n aria-label={`${MODALITY_LABEL[modality]}: ${title}`}\n aria-busy={busy || undefined}\n data-og-artifact-modality={modality}\n className={cn(\n \"og-root flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 text-og-fg shadow-og-md\",\n className,\n )}\n >\n <header className=\"flex min-h-11 shrink-0 items-center gap-2 border-b border-og-border bg-og-surface-2 px-3\">\n <span\n aria-hidden\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-surface-3 text-og-fg-muted\"\n >\n <ModalityIcon modality={modality} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-og-base font-medium text-og-fg\">{title}</h2>\n {subtitle ? <div className=\"truncate text-og-xs text-og-fg-muted\">{subtitle}</div> : null}\n </div>\n {busy ? (\n <LoaderCircleIcon\n aria-label=\"Updating artifact\"\n className=\"size-4 shrink-0 animate-spin text-og-fg-muted\"\n />\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </header>\n\n <div className=\"min-h-0 min-w-0 flex-1\">{children}</div>\n\n {footer ? (\n <footer className=\"shrink-0 border-t border-og-border bg-og-surface-2\">{footer}</footer>\n ) : null}\n </section>\n );\n}\n","import type {\n EditableArtifactSession,\n EditableArtifactSyncView,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useEffect, useState } from \"react\";\n\nexport function useEditableArtifactView(\n session: EditableArtifactSession,\n): EditableArtifactSyncView {\n const [view, setView] = useState(() => session.getView());\n useEffect(() => {\n setView(session.getView());\n return session.subscribe(setView);\n }, [session]);\n return view;\n}\n\n/** Changes whenever the Worker-resident speculative projection may have changed. */\nexport function editableArtifactProjectionKey(view: EditableArtifactSyncView): string {\n return [\n view.state,\n view.cursor,\n view.headSequence,\n view.pendingTransactions,\n view.blockedPending.map((entry) => `${entry.clientTransactionId}:${entry.code}`).join(\",\"),\n ].join(\":\");\n}\n\nexport function editableArtifactStatusLabel(view: EditableArtifactSyncView): string {\n switch (view.state) {\n case \"idle\":\n case \"connecting\":\n return \"Connecting…\";\n case \"syncing\":\n case \"resyncing\":\n return \"Syncing…\";\n case \"reconnecting\":\n return \"Reconnecting…\";\n case \"unsupported\":\n return \"This artifact version is not supported\";\n case \"failed\":\n if (editableArtifactAccessRevoked(view)) {\n return \"You no longer have access to this artifact\";\n }\n return view.lastError?.message ?? \"Could not open this artifact\";\n case \"closed\":\n return \"Artifact session closed\";\n case \"live\":\n return view.writable ? \"Live\" : \"Live · Read only\";\n }\n}\n\n/** Revoked read authority must hide any projection retained before invalidation. */\nexport function editableArtifactAccessRevoked(view: EditableArtifactSyncView): boolean {\n if (view.state !== \"failed\" || !view.lastError) return false;\n return (view.lastError as Error & Readonly<{ code?: unknown }>).code === \"permission_changed\";\n}\n\nexport function EditableArtifactMessage({\n title,\n detail,\n retry,\n}: {\n title: string;\n detail: string;\n retry?: (() => void) | undefined;\n}) {\n return (\n <div className=\"grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">{title}</p>\n <p className=\"mt-1 max-w-lg text-og-sm text-og-fg-muted\">{detail}</p>\n {retry ? (\n <button\n type=\"button\"\n onClick={retry}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Retry\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function asEditableArtifactError(cause: unknown, fallback: string): Error {\n return cause instanceof Error ? cause : new Error(fallback);\n}\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/internal.ts"],"sourcesContent":["import type { SessionEvent } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { EmbeddedSessionEventClientLike } from \"../client\";\n\nconst HIDDEN_STREAM_GRACE_MS = 2_000;\n\n/**\n * Keep live browser work active while the page is visible, then suspend it\n * after a short hidden-tab grace period. Returning to the page re-enables the\n * caller, which must reconcile durable state before resuming live delivery.\n */\nexport function usePageLiveActivity(hiddenGraceMs = HIDDEN_STREAM_GRACE_MS): boolean {\n // Keep the server and initial browser render identical; the effect applies\n // visibility after mount and preserves the intentional hidden-tab grace.\n const [active, setActive] = useState(true);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let hiddenTimer: ReturnType<typeof setTimeout> | null = null;\n const cancelHiddenTimer = () => {\n if (hiddenTimer !== null) {\n clearTimeout(hiddenTimer);\n hiddenTimer = null;\n }\n };\n const sync = () => {\n cancelHiddenTimer();\n if (document.visibilityState !== \"hidden\") {\n setActive(true);\n return;\n }\n hiddenTimer = setTimeout(() => {\n hiddenTimer = null;\n if (document.visibilityState === \"hidden\") setActive(false);\n }, hiddenGraceMs);\n };\n document.addEventListener(\"visibilitychange\", sync);\n window.addEventListener(\"pageshow\", sync);\n sync();\n return () => {\n cancelHiddenTimer();\n document.removeEventListener(\"visibilitychange\", sync);\n window.removeEventListener(\"pageshow\", sync);\n };\n }, [hiddenGraceMs]);\n\n return active;\n}\n\nexport type AsyncListState<T> = {\n data: T | null;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n};\n\n/**\n * Shared fetch + optional polling loop for the list/read hooks. Stale\n * responses (superseded by a newer load or an unmount) are dropped.\n */\nexport function usePolledValue<T>(\n load: (signal?: AbortSignal) => Promise<T>,\n options: { pollIntervalMs?: number | undefined; enabled?: boolean | undefined } = {},\n): AsyncListState<T> {\n const enabled = options.enabled ?? true;\n const pollIntervalMs = options.pollIntervalMs;\n const pageLive = usePageLiveActivity();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<Error | null>(null);\n const generation = useRef(0);\n const activeLoadRef = useRef(load);\n useLayoutEffect(() => {\n activeLoadRef.current = load;\n }, [load]);\n const requestAbortRef = useRef<AbortController | null>(null);\n const inFlightRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n const trailingRefreshRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n const [stateIdentity, setStateIdentity] = useState<{ load: typeof load }>(() => ({ load }));\n\n // A new loader identity means a new query (different session/workspace/...):\n // drop the previous result instead of showing it as the new query's data.\n useEffect(() => {\n if (stateIdentity.load !== load) {\n setStateIdentity({ load });\n setData(null);\n setError(null);\n }\n }, [load, stateIdentity.load]);\n\n const run = useCallback((): Promise<void> => {\n // A callback retained by a completed mutation from the previous query must\n // not supersede or settle the current query's request.\n if (activeLoadRef.current !== load) return Promise.resolve();\n const existing = inFlightRef.current;\n if (existing?.load === load) return existing.promise;\n const ticket = ++generation.current;\n const requestAbort = new AbortController();\n requestAbortRef.current = requestAbort;\n let promise!: Promise<void>;\n promise = (async () => {\n try {\n const result = await load(requestAbort.signal);\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n setData(result);\n setError(null);\n setLoading(false);\n }\n } catch (cause) {\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n setLoading(false);\n }\n } finally {\n if (requestAbortRef.current === requestAbort) requestAbortRef.current = null;\n if (inFlightRef.current?.promise === promise) inFlightRef.current = null;\n }\n })();\n inFlightRef.current = { load, promise };\n return promise;\n }, [load]);\n\n const refresh = useCallback((): Promise<void> => {\n const existing = inFlightRef.current;\n if (existing?.load !== load) return run();\n const trailing = trailingRefreshRef.current;\n if (trailing?.load === load) return trailing.promise;\n let promise!: Promise<void>;\n promise = existing.promise.then(async () => {\n if (trailingRefreshRef.current?.promise === promise) {\n trailingRefreshRef.current = null;\n }\n if (activeLoadRef.current === load) await run();\n });\n trailingRefreshRef.current = { load, promise };\n return promise;\n }, [load, run]);\n\n useEffect(() => {\n if (!enabled || !pageLive) {\n setLoading(false);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n return;\n }\n setLoading(true);\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const schedule = () => {\n if (cancelled || pollIntervalMs === undefined || pollIntervalMs <= 0) return;\n timer = setTimeout(() => {\n timer = null;\n void run().finally(schedule);\n }, pollIntervalMs);\n };\n void run().finally(schedule);\n if (pollIntervalMs === undefined || pollIntervalMs <= 0) {\n return () => {\n cancelled = true;\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }\n return () => {\n cancelled = true;\n if (timer !== null) clearTimeout(timer);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }, [run, enabled, pageLive, pollIntervalMs]);\n\n const identityMatches = stateIdentity.load === load;\n return {\n data: identityMatches ? data : null,\n loading: identityMatches ? loading : enabled,\n error: identityMatches ? error : null,\n refresh,\n };\n}\n\nexport type MutationState = {\n mutating: boolean;\n mutationError: Error | null;\n clearMutationError: () => void;\n};\n\n/**\n * Shared async mutation runner for the write hooks. `run` resolves with the\n * operation's value, or `null` after capturing the error in `mutationError`\n * (callers then roll back optimistic state).\n */\nexport function useMutationRunner(identity: unknown = undefined): MutationState & {\n run: <T>(operation: () => Promise<T>) => Promise<T | null>;\n} {\n const [mutating, setMutating] = useState(false);\n const [mutationError, setMutationError] = useState<Error | null>(null);\n const [stateIdentity, setStateIdentity] = useState<unknown>(() => identity);\n const inFlight = useRef(0);\n const generation = useRef(0);\n const identityRef = useRef(identity);\n useLayoutEffect(() => {\n if (Object.is(identityRef.current, identity)) return;\n identityRef.current = identity;\n generation.current += 1;\n inFlight.current = 0;\n }, [identity]);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n useEffect(() => {\n if (!Object.is(stateIdentity, identity)) {\n setStateIdentity(() => identity);\n setMutating(false);\n setMutationError(null);\n }\n }, [identity, stateIdentity]);\n const run = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T | null> => {\n const ownedIdentity = identity;\n const ownedGeneration = generation.current;\n if (!Object.is(identityRef.current, ownedIdentity)) return null;\n inFlight.current += 1;\n if (mounted.current) {\n setMutating(true);\n setMutationError(null);\n }\n try {\n const result = await operation();\n if (\n !mounted.current ||\n generation.current !== ownedGeneration ||\n !Object.is(identityRef.current, ownedIdentity)\n ) {\n return null;\n }\n return result;\n } catch (cause) {\n if (\n mounted.current &&\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n setMutationError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n return null;\n } finally {\n if (\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n inFlight.current -= 1;\n if (mounted.current && inFlight.current === 0) {\n setMutating(false);\n }\n }\n }\n },\n [identity],\n );\n const identityMatches = Object.is(stateIdentity, identity);\n return {\n mutating: identityMatches && mutating,\n mutationError: identityMatches ? mutationError : null,\n clearMutationError: useCallback(() => {\n if (Object.is(identityRef.current, identity)) setMutationError(null);\n }, [identity]),\n run,\n };\n}\n\nexport type SessionEventFeedOptions = {\n /**\n * Share an existing event log (from `useSessionEvents`) instead of opening\n * a second stream. When omitted the hook tails the session's event stream\n * itself, starting at the current `lastSequence`.\n */\n events?: SessionEvent[] | undefined;\n enabled?: boolean | undefined;\n};\n\n/**\n * Invoke `onEvent` for every session event matching `match` — the live-update\n * primitive behind `useTurnQueue` and `useGoal`. Either watches a shared\n * `events` log or tails the stream directly (reconnect handled by the SDK).\n */\nexport function useSessionEventTrigger(\n client: EmbeddedSessionEventClientLike,\n workspaceId: string,\n sessionId: string | null | undefined,\n match: (event: SessionEvent) => boolean,\n onEvent: (event: SessionEvent) => void,\n options: SessionEventFeedOptions = {},\n reconcileBeforeLive?: (() => void | Promise<void>) | undefined,\n): void {\n const enabled = options.enabled ?? true;\n const pageLive = usePageLiveActivity();\n const liveEnabled = enabled && pageLive;\n const events = options.events;\n const sharedFeed = events !== undefined;\n const matchRef = useRef(match);\n const onEventRef = useRef(onEvent);\n const reconcileBeforeLiveRef = useRef(reconcileBeforeLive);\n useLayoutEffect(() => {\n matchRef.current = match;\n onEventRef.current = onEvent;\n reconcileBeforeLiveRef.current = reconcileBeforeLive;\n }, [match, onEvent, reconcileBeforeLive]);\n const consumedRef = useRef(0);\n const feedKeyRef = useRef<string | null>(null);\n const sharedFeedHasEventsRef = useRef(false);\n\n // Shared-log mode: scan only the unseen tail on every append.\n useEffect(() => {\n if (!sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const feedKey = `${workspaceId}\\u0000${sessionId}`;\n const firstSequence = events[0]?.sequence ?? 0;\n if (feedKeyRef.current !== feedKey) {\n feedKeyRef.current = feedKey;\n sharedFeedHasEventsRef.current = events.length > 0;\n // The caller has already loaded its authoritative initial projection.\n // Seed from the shared log's current tail so mounting a large historical\n // session cannot replay every old event as a new live trigger.\n consumedRef.current = events.at(-1)?.sequence ?? 0;\n return;\n }\n const firstNonEmptyBatch = !sharedFeedHasEventsRef.current && events.length > 0;\n if (firstNonEmptyBatch || firstSequence > consumedRef.current + 1) {\n // The usual shared feed mounts empty, then receives a historical tail.\n // A later discontinuity can likewise replace the retained browser\n // window. In either case, reconcile once from the latest relevant event\n // instead of replaying the whole retained window as live traffic.\n sharedFeedHasEventsRef.current = events.length > 0;\n consumedRef.current = events.at(-1)?.sequence ?? consumedRef.current;\n let latestMatch: SessionEvent | undefined;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event && matchRef.current(event)) {\n latestMatch = event;\n break;\n }\n }\n if (latestMatch) {\n onEventRef.current(latestMatch);\n }\n return;\n }\n sharedFeedHasEventsRef.current ||= events.length > 0;\n for (const event of events) {\n if (event.sequence <= consumedRef.current) {\n continue;\n }\n consumedRef.current = event.sequence;\n if (matchRef.current(event)) {\n onEventRef.current(event);\n }\n }\n }, [sharedFeed, liveEnabled, events, workspaceId, sessionId]);\n\n // Self-stream mode: tail from the session's current lastSequence.\n useEffect(() => {\n if (sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const controller = new AbortController();\n void (async () => {\n try {\n const session = await client.getSession(workspaceId, sessionId);\n if (controller.signal.aborted) {\n return;\n }\n const stream = client.streamEvents(workspaceId, sessionId, {\n after: session.lastSequence,\n signal: controller.signal,\n onOpen: () => {\n // Start reconciliation without delaying consumption of live SSE.\n void Promise.resolve()\n .then(() => reconcileBeforeLiveRef.current?.())\n .catch(() => undefined);\n },\n });\n for await (const event of stream) {\n if (matchRef.current(event)) {\n onEventRef.current(event);\n }\n }\n } catch {\n // Live updates are best-effort: the read hooks still expose refresh()\n // and the initial load already populated state.\n }\n })();\n return () => {\n controller.abort();\n };\n }, [sharedFeed, liveEnabled, client, workspaceId, sessionId]);\n}\n\n/** Debounce rapid event bursts into one trailing call (default 150ms). */\nexport function useDebouncedCallback(callback: () => void, delayMs = 150): () => void {\n const callbackRef = useRef(callback);\n useLayoutEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n return useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n callbackRef.current();\n }, delayMs);\n }, [delayMs]);\n}\n"],"mappings":"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","names":[]}
@@ -1,141 +0,0 @@
1
- // src/lib/format.ts
2
- import { OpenGeniApiError } from "@opengeni/sdk";
3
- function formatClockTime(iso) {
4
- const then = new Date(iso);
5
- if (Number.isNaN(then.getTime())) {
6
- return "";
7
- }
8
- return then.toLocaleString(void 0, {
9
- month: "short",
10
- day: "numeric",
11
- hour: "numeric",
12
- minute: "2-digit"
13
- });
14
- }
15
- function formatRelativeTime(iso, now = /* @__PURE__ */ new Date()) {
16
- const then = new Date(iso).getTime();
17
- if (Number.isNaN(then)) {
18
- return "";
19
- }
20
- const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1e3));
21
- if (seconds < 10) {
22
- return "now";
23
- }
24
- if (seconds < 60) {
25
- return `${seconds}s`;
26
- }
27
- const minutes = Math.floor(seconds / 60);
28
- if (minutes < 60) {
29
- return `${minutes}m`;
30
- }
31
- const hours = Math.floor(minutes / 60);
32
- if (hours < 24) {
33
- return `${hours}h`;
34
- }
35
- const days = Math.floor(hours / 24);
36
- if (days < 14) {
37
- return `${days}d`;
38
- }
39
- return new Date(iso).toLocaleDateString();
40
- }
41
- function formatBytes(bytes) {
42
- if (bytes < 1024) {
43
- return `${bytes} B`;
44
- }
45
- const units = ["KB", "MB", "GB"];
46
- let value = bytes / 1024;
47
- for (const unit of units) {
48
- if (value < 1024 || unit === "GB") {
49
- return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;
50
- }
51
- value /= 1024;
52
- }
53
- return `${bytes} B`;
54
- }
55
- function truncate(text, maxLength) {
56
- const collapsed = text.replace(/\s+/g, " ").trim();
57
- if (collapsed.length <= maxLength) {
58
- return collapsed;
59
- }
60
- return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}\u2026`;
61
- }
62
- function stringifyPayload(value) {
63
- if (value === null || value === void 0) {
64
- return "";
65
- }
66
- if (typeof value === "string") {
67
- const parsed = tryParseJson(value);
68
- if (parsed !== void 0 && typeof parsed === "object") {
69
- return stringifyPayload(parsed);
70
- }
71
- return value;
72
- }
73
- try {
74
- return JSON.stringify(value, null, 2) ?? String(value);
75
- } catch {
76
- return String(value);
77
- }
78
- }
79
- function tryParseJson(text) {
80
- const trimmed = text.trim();
81
- if (!trimmed.startsWith("{") && !trimmed.startsWith("[") && !trimmed.startsWith('"')) {
82
- return void 0;
83
- }
84
- try {
85
- return JSON.parse(trimmed);
86
- } catch {
87
- return void 0;
88
- }
89
- }
90
- var CREDIT_EXHAUSTION_MESSAGE = "Out of OpenGeni credits \u2014 this workspace's balance is empty. Add credits to continue; the conversation is preserved.";
91
- var COMPOSER_PAYMENT_REQUIRED_MESSAGE = "This turn requires OpenGeni managed credits, but the account balance is empty. Add credits or choose a connected Codex subscription model, then retry. Your draft and attachments are preserved.";
92
- function composerSubmissionErrorMessage(error) {
93
- return error instanceof OpenGeniApiError && error.status === 402 && error.code === "payment_required" ? COMPOSER_PAYMENT_REQUIRED_MESSAGE : error.message;
94
- }
95
- function isCreditExhaustion(input) {
96
- if (typeof input === "string") {
97
- return input.toLowerCase().includes("insufficient opengeni credits");
98
- }
99
- if (input.segmentLimit === "budget_exhausted") {
100
- return true;
101
- }
102
- for (const text of [input.error, input.detail]) {
103
- if (typeof text === "string" && text.toLowerCase().includes("insufficient opengeni credits")) {
104
- return true;
105
- }
106
- }
107
- return false;
108
- }
109
- function humanizeFailureReason(reason) {
110
- if (!reason) {
111
- return reason;
112
- }
113
- if (isCreditExhaustion(reason)) {
114
- return CREDIT_EXHAUSTION_MESSAGE;
115
- }
116
- const normalized = reason.toLowerCase();
117
- const authFailure = normalized.includes("incorrect api key") || normalized.includes("invalid api key") || normalized.includes("invalid_api_key") || normalized.includes("platform.openai.com/account/api-keys") || normalized.includes("401") && (normalized.includes("api key") || normalized.includes("unauthorized"));
118
- if (authFailure) {
119
- return "The model provider rejected this deployment's engine credentials. Sending messages won't help until the deployment's engine configuration is fixed.";
120
- }
121
- const quotaFailure = normalized.includes("insufficient_quota") || normalized.includes("exceeded your current quota");
122
- if (quotaFailure) {
123
- return "The model provider refused the request: this deployment's provider quota is exhausted.";
124
- }
125
- return reason;
126
- }
127
-
128
- export {
129
- formatClockTime,
130
- formatRelativeTime,
131
- formatBytes,
132
- truncate,
133
- stringifyPayload,
134
- tryParseJson,
135
- CREDIT_EXHAUSTION_MESSAGE,
136
- COMPOSER_PAYMENT_REQUIRED_MESSAGE,
137
- composerSubmissionErrorMessage,
138
- isCreditExhaustion,
139
- humanizeFailureReason
140
- };
141
- //# sourceMappingURL=chunk-LAKLF4PA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/format.ts"],"sourcesContent":["import { OpenGeniApiError } from \"@opengeni/sdk\";\n\n/** Local finished-at stamp for message footers: \"Aug 2, 3:42 PM\" / locale-equivalent. */\nexport function formatClockTime(iso: string): string {\n const then = new Date(iso);\n if (Number.isNaN(then.getTime())) {\n return \"\";\n }\n return then.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\n/** Compact relative time: \"now\", \"42s\", \"7m\", \"3h\", \"2d\", then a date. */\nexport function formatRelativeTime(iso: string, now: Date = new Date()): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) {\n return \"\";\n }\n const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1000));\n if (seconds < 10) {\n return \"now\";\n }\n if (seconds < 60) {\n return `${seconds}s`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n const days = Math.floor(hours / 24);\n if (days < 14) {\n return `${days}d`;\n }\n return new Date(iso).toLocaleDateString();\n}\n\n/** Human-readable byte size: \"512 B\", \"8.0 KB\", \"1.4 MB\", \"3 GB\". */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"] as const;\n let value = bytes / 1024;\n for (const unit of units) {\n if (value < 1024 || unit === \"GB\") {\n return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;\n }\n value /= 1024;\n }\n return `${bytes} B`;\n}\n\n/** Single-line preview of arbitrary text, for tiles and collapsed rows. */\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = text.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) {\n return collapsed;\n }\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\n/** Render an unknown payload as readable text (pretty JSON when possible). */\nexport function stringifyPayload(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== undefined && typeof parsed === \"object\") {\n return stringifyPayload(parsed);\n }\n return value;\n }\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/** JSON.parse that returns `undefined` instead of throwing. */\nexport function tryParseJson(text: string): unknown {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\") && !trimmed.startsWith('\"')) {\n return undefined;\n }\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The canonical credit-death sentence. Credit exhaustion is the one failure a\n * user can fix themselves — the copy must say what happened (empty balance),\n * what to do (add credits), and what is safe (nothing was lost). Crucially it\n * must NOT say \"send a message to revive\": a revive turn burns credits the\n * workspace no longer has.\n */\nexport const CREDIT_EXHAUSTION_MESSAGE =\n \"Out of OpenGeni credits — this workspace's balance is empty. Add credits to continue; the conversation is preserved.\";\n\n/**\n * Actionable composer copy for an edge rejection before a turn is accepted.\n * Unlike an in-flight credit exhaustion, this path has not consumed the\n * actor-private draft or any finalized attachment.\n */\nexport const COMPOSER_PAYMENT_REQUIRED_MESSAGE =\n \"This turn requires OpenGeni managed credits, but the account balance is empty. Add credits or choose a connected Codex subscription model, then retry. Your draft and attachments are preserved.\";\n\nexport function composerSubmissionErrorMessage(error: Error): string {\n return error instanceof OpenGeniApiError &&\n error.status === 402 &&\n error.code === \"payment_required\"\n ? COMPOSER_PAYMENT_REQUIRED_MESSAGE\n : error.message;\n}\n\n/**\n * Does this failure/completion payload (or raw error string) mean the\n * workspace ran out of OpenGeni credits? Matches the engine's\n * \"insufficient OpenGeni credits\" text (case-insensitive, substring — it\n * arrives both bare and wrapped in \"Activity task failed: …\") and the\n * budget-exhausted segment limit the engine stamps on a turn it ended early.\n */\nexport function isCreditExhaustion(\n input: { error?: string | null; detail?: string | null; segmentLimit?: string | null } | string,\n): boolean {\n if (typeof input === \"string\") {\n return input.toLowerCase().includes(\"insufficient opengeni credits\");\n }\n if (input.segmentLimit === \"budget_exhausted\") {\n return true;\n }\n for (const text of [input.error, input.detail]) {\n if (typeof text === \"string\" && text.toLowerCase().includes(\"insufficient opengeni credits\")) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Humanize engine/provider failure text before it reaches the timeline or a\n * failure banner. Raw provider errors leak the wrong audience's instructions —\n * \"Incorrect API key … find your API key at platform.openai.com\" tells a\n * managed-deployment USER to fix credentials only an OPERATOR controls (and is\n * flatly wrong for Azure or subscription-backed engines). Auth, quota, and\n * credit-exhaustion failures collapse to one neutral, honest sentence; every\n * other reason passes through untouched. Raw payloads stay available in the\n * debug surfaces.\n */\nexport function humanizeFailureReason(reason: string | null): string | null {\n if (!reason) {\n return reason;\n }\n if (isCreditExhaustion(reason)) {\n return CREDIT_EXHAUSTION_MESSAGE;\n }\n const normalized = reason.toLowerCase();\n const authFailure =\n normalized.includes(\"incorrect api key\") ||\n normalized.includes(\"invalid api key\") ||\n normalized.includes(\"invalid_api_key\") ||\n normalized.includes(\"platform.openai.com/account/api-keys\") ||\n (normalized.includes(\"401\") &&\n (normalized.includes(\"api key\") || normalized.includes(\"unauthorized\")));\n if (authFailure) {\n return \"The model provider rejected this deployment's engine credentials. Sending messages won't help until the deployment's engine configuration is fixed.\";\n }\n const quotaFailure =\n normalized.includes(\"insufficient_quota\") || normalized.includes(\"exceeded your current quota\");\n if (quotaFailure) {\n return \"The model provider refused the request: this deployment's provider quota is exhausted.\";\n }\n return reason;\n}\n"],"mappings":"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","names":[]}