@opengeni/react 0.57.0 → 1.0.2-canary.37191796234001

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 (629) hide show
  1. package/README.md +654 -22
  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-GTR5XQ7X.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-5UQPNLIO.js → chunk-23J2ZNXT.js} +4117 -3896
  18. package/dist/chunk-23J2ZNXT.js.map +1 -0
  19. package/dist/chunk-447JLCBU.js +209 -0
  20. package/dist/chunk-447JLCBU.js.map +1 -0
  21. package/dist/chunk-4RVYOY4O.js +379 -0
  22. package/dist/chunk-4RVYOY4O.js.map +1 -0
  23. package/dist/chunk-5CVXZA3Y.js +292 -0
  24. package/dist/chunk-5CVXZA3Y.js.map +1 -0
  25. package/dist/chunk-5J4FOW6Q.js +108 -0
  26. package/dist/chunk-5J4FOW6Q.js.map +1 -0
  27. package/dist/chunk-A2PI6UMY.js +41 -0
  28. package/dist/chunk-A2PI6UMY.js.map +1 -0
  29. package/dist/{chunk-7WCLAEFV.js → chunk-A4UJB2MM.js} +37 -27
  30. package/dist/chunk-A4UJB2MM.js.map +1 -0
  31. package/dist/chunk-B3V6TG77.js +41 -0
  32. package/dist/chunk-B3V6TG77.js.map +1 -0
  33. package/dist/chunk-BRM6FVZA.js +302 -0
  34. package/dist/chunk-BRM6FVZA.js.map +1 -0
  35. package/dist/chunk-C5X5AJXK.js +182 -0
  36. package/dist/chunk-C5X5AJXK.js.map +1 -0
  37. package/dist/chunk-CR7U7HAR.js +453 -0
  38. package/dist/chunk-CR7U7HAR.js.map +1 -0
  39. package/dist/{chunk-R3AZOAB5.js → chunk-DYWBUX5Q.js} +29 -123
  40. package/dist/chunk-DYWBUX5Q.js.map +1 -0
  41. package/dist/chunk-E3G7SAYZ.js +3124 -0
  42. package/dist/chunk-E3G7SAYZ.js.map +1 -0
  43. package/dist/chunk-ELCE5SXV.js +359 -0
  44. package/dist/chunk-ELCE5SXV.js.map +1 -0
  45. package/dist/chunk-ERGYJIBB.js +21 -0
  46. package/dist/chunk-ERGYJIBB.js.map +1 -0
  47. package/dist/chunk-FFA2OVOV.js +319 -0
  48. package/dist/chunk-FFA2OVOV.js.map +1 -0
  49. package/dist/chunk-FZCP527Y.js +116 -0
  50. package/dist/chunk-FZCP527Y.js.map +1 -0
  51. package/dist/chunk-GIMRELBW.js +14 -0
  52. package/dist/chunk-GIMRELBW.js.map +1 -0
  53. package/dist/{chunk-6KLX2RH5.js → chunk-H2NJQORO.js} +1069 -79
  54. package/dist/chunk-H2NJQORO.js.map +1 -0
  55. package/dist/chunk-I7IWRQLN.js +1608 -0
  56. package/dist/chunk-I7IWRQLN.js.map +1 -0
  57. package/dist/{chunk-HA46CYQK.js → chunk-IQUCRAT7.js} +792 -537
  58. package/dist/chunk-IQUCRAT7.js.map +1 -0
  59. package/dist/chunk-IWIDV7SB.js +1 -0
  60. package/dist/chunk-IWIDV7SB.js.map +1 -0
  61. package/dist/chunk-J2QWVSQY.js +312 -0
  62. package/dist/chunk-J2QWVSQY.js.map +1 -0
  63. package/dist/chunk-JFNEV4LU.js +2733 -0
  64. package/dist/chunk-JFNEV4LU.js.map +1 -0
  65. package/dist/chunk-JT4JW7BC.js +54 -0
  66. package/dist/chunk-JT4JW7BC.js.map +1 -0
  67. package/dist/chunk-K3HQAKQX.js +24 -0
  68. package/dist/chunk-K3HQAKQX.js.map +1 -0
  69. package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
  70. package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
  71. package/dist/chunk-NZUI76EM.js +371 -0
  72. package/dist/chunk-NZUI76EM.js.map +1 -0
  73. package/dist/{chunk-PEI6RANI.js → chunk-PNY3JKBJ.js} +309 -74
  74. package/dist/chunk-PNY3JKBJ.js.map +1 -0
  75. package/dist/{chunk-IGC6A2ZI.js → chunk-Q5QBEZIQ.js} +777 -246
  76. package/dist/chunk-Q5QBEZIQ.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-SCOTPE2I.js +589 -0
  80. package/dist/chunk-SCOTPE2I.js.map +1 -0
  81. package/dist/{chunk-B6WPZSTT.js → chunk-SJZDKVW2.js} +1331 -1163
  82. package/dist/chunk-SJZDKVW2.js.map +1 -0
  83. package/dist/chunk-TMJRG4YC.js +12803 -0
  84. package/dist/chunk-TMJRG4YC.js.map +1 -0
  85. package/dist/chunk-TMYGL6X5.js +742 -0
  86. package/dist/chunk-TMYGL6X5.js.map +1 -0
  87. package/dist/chunk-UGLEYEMP.js +33 -0
  88. package/dist/chunk-UGLEYEMP.js.map +1 -0
  89. package/dist/chunk-UK4TINKT.js +27 -0
  90. package/dist/chunk-UK4TINKT.js.map +1 -0
  91. package/dist/chunk-UTRTG6LH.js +220 -0
  92. package/dist/chunk-UTRTG6LH.js.map +1 -0
  93. package/dist/chunk-WEHMPOXK.js +39 -0
  94. package/dist/chunk-WEHMPOXK.js.map +1 -0
  95. package/dist/chunk-WRHIZYZF.js +988 -0
  96. package/dist/chunk-WRHIZYZF.js.map +1 -0
  97. package/dist/{chunk-HUIKIDM5.js → chunk-WUISZ3WU.js} +223 -115
  98. package/dist/chunk-WUISZ3WU.js.map +1 -0
  99. package/dist/chunk-XCHWDJ22.js +107 -0
  100. package/dist/chunk-XCHWDJ22.js.map +1 -0
  101. package/dist/chunk-XOAMRDDK.js +481 -0
  102. package/dist/chunk-XOAMRDDK.js.map +1 -0
  103. package/dist/chunk-XUW2UWQM.js +299 -0
  104. package/dist/chunk-XUW2UWQM.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-KZ73RL76.js → chunk-YQEAA6LT.js} +7 -3
  110. package/dist/chunk-YQEAA6LT.js.map +1 -0
  111. package/dist/chunk-YV4L3ILF.js +9 -0
  112. package/dist/chunk-YV4L3ILF.js.map +1 -0
  113. package/dist/{chunk-LLOLUHVG.js → chunk-YWFG7ZX7.js} +1358 -2746
  114. package/dist/chunk-YWFG7ZX7.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 +55 -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 +86 -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/timeline-anchor.d.ts +24 -0
  185. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  186. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  187. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  188. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  189. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  190. package/dist/components/timeline-annotations-dialog.d.ts +3 -2
  191. package/dist/components/timeline-annotations.d.ts +13 -3
  192. package/dist/components/timeline-reading-progress.d.ts +11 -0
  193. package/dist/components/timeline-search.d.ts +34 -0
  194. package/dist/components/timeline-settlement.d.ts +16 -0
  195. package/dist/components/tip-follow.d.ts +16 -0
  196. package/dist/components/usage-limit-notice.d.ts +49 -0
  197. package/dist/components/usage-member-list.d.ts +91 -0
  198. package/dist/components/usage-meter.d.ts +73 -0
  199. package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
  200. package/dist/components/user-message-body.d.ts +10 -1
  201. package/dist/components/workspace-dock.d.ts +6 -2
  202. package/dist/composer.d.ts +5 -4
  203. package/dist/composer.js +15 -9
  204. package/dist/computer-viewer-ENHVAZ2Q.js +19 -0
  205. package/dist/computer-viewer-ENHVAZ2Q.js.map +1 -0
  206. package/dist/connect-account-identity.d.ts +8 -0
  207. package/dist/connect-accounts.d.ts +15 -0
  208. package/dist/connect-chooser.d.ts +18 -0
  209. package/dist/connect-panel.d.ts +18 -0
  210. package/dist/connect-setup.d.ts +16 -0
  211. package/dist/connect.d.ts +21 -0
  212. package/dist/connect.js +2129 -0
  213. package/dist/connect.js.map +1 -0
  214. package/dist/connection-catalog.d.ts +38 -0
  215. package/dist/connection-discovery.d.ts +12 -0
  216. package/dist/connection-installed.d.ts +17 -0
  217. package/dist/connection-logo.d.ts +9 -0
  218. package/dist/connection-service-logo.d.ts +8 -0
  219. package/dist/connection-service-presentation.d.ts +13 -0
  220. package/dist/connection-skeleton.d.ts +5 -0
  221. package/dist/connection-type-picker.d.ts +6 -0
  222. package/dist/conversation-timeline.d.ts +5 -0
  223. package/dist/desktop.d.ts +7 -0
  224. package/dist/desktop.js +26 -0
  225. package/dist/desktop.js.map +1 -0
  226. package/dist/device-authorization.d.ts +23 -0
  227. package/dist/diffs.d.ts +8 -0
  228. package/dist/diffs.js +14 -0
  229. package/dist/diffs.js.map +1 -0
  230. package/dist/discovery-cache.d.ts +5 -0
  231. package/dist/editor.d.ts +7 -0
  232. package/dist/editor.js +21 -0
  233. package/dist/editor.js.map +1 -0
  234. package/dist/embedded-session-client.d.ts +23 -0
  235. package/dist/file-node-visibility.d.ts +15 -0
  236. package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-YZ3ZKWMM.js} +2 -1
  237. package/dist/fleet-decision-row-YZ3ZKWMM.js.map +1 -0
  238. package/dist/hooks/channel-cache.d.ts +23 -0
  239. package/dist/hooks/latest-question.d.ts +25 -0
  240. package/dist/hooks/shared-machines-list.d.ts +14 -0
  241. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  242. package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
  243. package/dist/hooks/use-browser-session.d.ts +12 -1
  244. package/dist/hooks/use-channels.d.ts +1 -0
  245. package/dist/hooks/use-codex-accounts.d.ts +25 -7
  246. package/dist/hooks/use-composer.d.ts +45 -9
  247. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  248. package/dist/hooks/use-computer-input-posture.d.ts +13 -0
  249. package/dist/hooks/use-computer-session.d.ts +2 -0
  250. package/dist/hooks/use-connect.d.ts +22 -0
  251. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  252. package/dist/hooks/use-file-attachments.d.ts +21 -2
  253. package/dist/hooks/use-machine-chip.d.ts +3 -3
  254. package/dist/hooks/use-machines.d.ts +19 -1
  255. package/dist/hooks/use-sandbox-files.d.ts +5 -1
  256. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  257. package/dist/hooks/use-session-events.d.ts +30 -8
  258. package/dist/hooks/use-session-lineage.d.ts +4 -0
  259. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  260. package/dist/hooks/use-session.d.ts +6 -0
  261. package/dist/hooks/use-turn-queue.d.ts +12 -0
  262. package/dist/hooks/use-usage.d.ts +40 -0
  263. package/dist/hooks/use-workspace-edit.d.ts +4 -0
  264. package/dist/hooks/use-workspace-sessions.d.ts +27 -5
  265. package/dist/human-input.d.ts +3 -1
  266. package/dist/identity-link-accounts.d.ts +11 -0
  267. package/dist/identity-link-consent.d.ts +18 -0
  268. package/dist/index.d.ts +60 -17
  269. package/dist/index.js +2237 -6200
  270. package/dist/index.js.map +1 -1
  271. package/dist/interaction.d.ts +1 -1
  272. package/dist/interaction.js +35 -184
  273. package/dist/interaction.js.map +1 -1
  274. package/dist/latest-question-755OW5DS.js +117 -0
  275. package/dist/latest-question-755OW5DS.js.map +1 -0
  276. package/dist/lib/error-message.d.ts +7 -0
  277. package/dist/lib/format.d.ts +36 -2
  278. package/dist/lib/host-theme.d.ts +70 -0
  279. package/dist/lib/interaction-errors.d.ts +6 -0
  280. package/dist/lib/menu-styles.d.ts +22 -0
  281. package/dist/lib/pierre-diffs-loader.d.ts +20 -0
  282. package/dist/lib/workbench-peers.d.ts +36 -0
  283. package/dist/lib/xterm-theme.d.ts +7 -5
  284. package/dist/machines.d.ts +4 -2
  285. package/dist/machines.js +14 -4
  286. package/dist/markdown-table-layout-QXSLK4BY.js +106 -0
  287. package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
  288. package/dist/mcp-connection-status.d.ts +14 -0
  289. package/dist/model-policy-picker-menu-PWRI7R2X.js +14 -0
  290. package/dist/model-policy-picker-menu-PWRI7R2X.js.map +1 -0
  291. package/dist/model-policy.d.ts +19 -3
  292. package/dist/model-policy.js +9 -1
  293. package/dist/older-history.d.ts +30 -0
  294. package/dist/platform-activity-row-627BFZ46.js +182 -0
  295. package/dist/platform-activity-row-627BFZ46.js.map +1 -0
  296. package/dist/plugin-details.d.ts +14 -0
  297. package/dist/plugin-discovery.d.ts +25 -0
  298. package/dist/provider.d.ts +13 -1
  299. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-ZHFI5JBP.js} +131 -44
  300. package/dist/queue-surface-implementation-ZHFI5JBP.js.map +1 -0
  301. package/dist/realtime/realtime-control.d.ts +10 -3
  302. package/dist/realtime.js +229 -83
  303. package/dist/realtime.js.map +1 -1
  304. package/dist/sandbox-files-BBC47SLD.js +20 -0
  305. package/dist/sandbox-files-BBC47SLD.js.map +1 -0
  306. package/dist/session-auth-recommendation.d.ts +5 -0
  307. package/dist/session-capability-policy.d.ts +12 -0
  308. package/dist/session-ui.d.ts +30 -2
  309. package/dist/session-ui.js +85 -7
  310. package/dist/session-ui.js.map +1 -1
  311. package/dist/session.d.ts +8 -2
  312. package/dist/session.js +30 -19
  313. package/dist/sites-ui.d.ts +34 -0
  314. package/dist/sites.d.ts +3 -0
  315. package/dist/sites.js +11 -0
  316. package/dist/sites.js.map +1 -0
  317. package/dist/skill-discovery.d.ts +47 -0
  318. package/dist/terminal.d.ts +8 -0
  319. package/dist/terminal.js +31 -0
  320. package/dist/terminal.js.map +1 -0
  321. package/dist/timeline/activity-rail.d.ts +11 -2
  322. package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
  323. package/dist/timeline/compaction-copy.d.ts +10 -0
  324. package/dist/timeline/entrance.d.ts +13 -1
  325. package/dist/timeline/genie-loading.d.ts +34 -0
  326. package/dist/timeline/index.d.ts +6 -2
  327. package/dist/timeline/knowledge-receipt.d.ts +17 -0
  328. package/dist/timeline/platform-activity-row.d.ts +14 -0
  329. package/dist/timeline/presented-image.d.ts +6 -0
  330. package/dist/timeline/projection.d.ts +31 -2
  331. package/dist/timeline/registry.d.ts +2 -0
  332. package/dist/timeline/retained-image.d.ts +18 -0
  333. package/dist/timeline/rolling-activity.d.ts +11 -0
  334. package/dist/timeline/screenshot-lightbox.d.ts +16 -1
  335. package/dist/timeline/shared.d.ts +8 -3
  336. package/dist/timeline/startup-preference.d.ts +3 -0
  337. package/dist/timeline/startup-timings.d.ts +4 -0
  338. package/dist/timeline/tool-display-name.d.ts +2 -1
  339. package/dist/timeline/turn-summary.d.ts +32 -3
  340. package/dist/timeline/types.d.ts +141 -7
  341. package/dist/timeline-annotation-markers-GNDHTGBD.js +165 -0
  342. package/dist/timeline-annotation-markers-GNDHTGBD.js.map +1 -0
  343. package/dist/timeline-annotation-selection-DMLMM2TX.js +241 -0
  344. package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
  345. package/dist/timeline-annotations-dialog-ELRDBHTS.js +273 -0
  346. package/dist/timeline-annotations-dialog-ELRDBHTS.js.map +1 -0
  347. package/dist/types/machines.d.ts +2 -2
  348. package/dist/usage/allowance-copy.d.ts +25 -0
  349. package/dist/usage/summary.d.ts +35 -0
  350. package/dist/usage.d.ts +13 -0
  351. package/dist/usage.js +1074 -0
  352. package/dist/usage.js.map +1 -0
  353. package/package.json +44 -4
  354. package/src/accounts.tsx +1072 -0
  355. package/src/approvals.ts +8 -1
  356. package/src/artifacts.ts +42 -0
  357. package/src/assets/README.md +8 -0
  358. package/src/assets/gmail.ico +0 -0
  359. package/src/assets/outlook.ico +0 -0
  360. package/src/capability-catalog-row.tsx +94 -0
  361. package/src/capability-logo-fallback.ts +22 -0
  362. package/src/client.ts +22 -13
  363. package/src/commands/registry.ts +18 -15
  364. package/src/commands/types.ts +2 -0
  365. package/src/components/anthropic-mark.tsx +10 -0
  366. package/src/components/approval-surface.tsx +171 -37
  367. package/src/components/artifacts/artifact-chrome.tsx +413 -0
  368. package/src/components/artifacts/artifact-sandbox.tsx +185 -0
  369. package/src/components/artifacts/artifact-surface.tsx +39 -19
  370. package/src/components/artifacts/chat-interactive-block.tsx +260 -0
  371. package/src/components/artifacts/deferred-chat-media.tsx +67 -0
  372. package/src/components/artifacts/document-editor.tsx +141 -16
  373. package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
  374. package/src/components/artifacts/editable-artifact-view.tsx +187 -0
  375. package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
  376. package/src/components/artifacts/editable-document.tsx +37 -36
  377. package/src/components/artifacts/editable-presentation.tsx +36 -18
  378. package/src/components/artifacts/editable-spreadsheet.tsx +5 -2
  379. package/src/components/artifacts/index.ts +44 -0
  380. package/src/components/artifacts/inline-html-document.ts +24 -0
  381. package/src/components/artifacts/latest-task-runner.ts +49 -0
  382. package/src/components/artifacts/presentation-editor.tsx +323 -67
  383. package/src/components/artifacts/published-html-artifact-frame.tsx +338 -5
  384. package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
  385. package/src/components/artifacts/site-view.tsx +116 -0
  386. package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
  387. package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
  388. package/src/components/artifacts/spreadsheet-grid.tsx +12 -13
  389. package/src/components/artifacts/visualization-assets/base.css +1015 -0
  390. package/src/components/artifacts/visualization-assets/helpers.html +349 -0
  391. package/src/components/artifacts/visualization-assets.gen.ts +3 -0
  392. package/src/components/browser-select-control.tsx +312 -0
  393. package/src/components/browser-viewer.tsx +1054 -314
  394. package/src/components/chat-composer.tsx +131 -85
  395. package/src/components/child-session-link.tsx +27 -0
  396. package/src/components/claude-mark.tsx +10 -0
  397. package/src/components/code-editor.tsx +13 -16
  398. package/src/components/composer-transcription-control.tsx +7 -5
  399. package/src/components/composer.tsx +376 -49
  400. package/src/components/computer-viewer.tsx +1041 -329
  401. package/src/components/copy-button.tsx +13 -5
  402. package/src/components/desktop-viewer.tsx +1 -1
  403. package/src/components/enrollment-consent.tsx +65 -7
  404. package/src/components/enrollment-device-flow.tsx +1 -1
  405. package/src/components/file-browser.tsx +158 -34
  406. package/src/components/fleet-tile.tsx +8 -16
  407. package/src/components/generated-video-player.tsx +4 -2
  408. package/src/components/grok-mark.tsx +33 -0
  409. package/src/components/human-input-form.tsx +455 -114
  410. package/src/components/human-input-surface.tsx +18 -7
  411. package/src/components/interaction-intervention-banner.tsx +2 -2
  412. package/src/components/machine-card.tsx +119 -4
  413. package/src/components/machine-dock-bar.tsx +1 -1
  414. package/src/components/machine-input-display.ts +23 -2
  415. package/src/components/machines/machine-detail.tsx +52 -2
  416. package/src/components/machines/machine-operation-policy.tsx +179 -0
  417. package/src/components/machines-dashboard.tsx +8 -17
  418. package/src/components/markdown-table-layout.ts +132 -0
  419. package/src/components/markdown.tsx +473 -44
  420. package/src/components/message-timeline.tsx +2498 -663
  421. package/src/components/model-mark.tsx +90 -0
  422. package/src/components/model-picker.tsx +15 -4
  423. package/src/components/model-policy-picker-menu.tsx +424 -0
  424. package/src/components/model-policy-picker.tsx +337 -381
  425. package/src/components/open-geni-chat.tsx +319 -0
  426. package/src/components/open-geni-links.tsx +179 -0
  427. package/src/components/openrouter-mark.tsx +13 -0
  428. package/src/components/pierre-diff.tsx +41 -16
  429. package/src/components/pierre-file.tsx +36 -11
  430. package/src/components/preview-loading.tsx +154 -0
  431. package/src/components/queue-item-content.ts +14 -0
  432. package/src/components/queue-surface-implementation.tsx +132 -42
  433. package/src/components/queue-surface-state.tsx +3 -1
  434. package/src/components/sandbox-files.tsx +267 -35
  435. package/src/components/sandbox-terminal.tsx +48 -11
  436. package/src/components/sandbox-workspace.tsx +337 -135
  437. package/src/components/session-capability-frame.tsx +192 -0
  438. package/src/components/session-chrome.tsx +1027 -328
  439. package/src/components/session-commands-panel.tsx +126 -0
  440. package/src/components/session-commands.tsx +18 -0
  441. package/src/components/session-connection-request.tsx +97 -0
  442. package/src/components/session-conversation.tsx +512 -0
  443. package/src/components/session-list.tsx +250 -0
  444. package/src/components/session-mcp-capability-card.tsx +680 -0
  445. package/src/components/session-status.tsx +1 -1
  446. package/src/components/timeline-anchor.tsx +119 -0
  447. package/src/components/timeline-annotation-chrome.tsx +196 -0
  448. package/src/components/timeline-annotation-layout.ts +268 -0
  449. package/src/components/timeline-annotation-markers.tsx +185 -0
  450. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  451. package/src/components/timeline-annotation-selection.tsx +106 -54
  452. package/src/components/timeline-annotation-shared.ts +245 -0
  453. package/src/components/timeline-annotations-dialog.tsx +185 -128
  454. package/src/components/timeline-annotations.tsx +189 -45
  455. package/src/components/timeline-reading-progress.ts +80 -0
  456. package/src/components/timeline-search.tsx +168 -0
  457. package/src/components/timeline-settlement.ts +60 -0
  458. package/src/components/tip-follow.ts +70 -7
  459. package/src/components/tooltip.tsx +38 -5
  460. package/src/components/usage-limit-notice.tsx +179 -0
  461. package/src/components/usage-member-list.tsx +792 -0
  462. package/src/components/usage-meter.tsx +382 -0
  463. package/src/components/use-viewer-menu-dismiss.ts +33 -0
  464. package/src/components/user-message-body.tsx +194 -49
  465. package/src/components/workspace-dock.tsx +141 -175
  466. package/src/composer.ts +6 -1
  467. package/src/connect-account-identity.tsx +34 -0
  468. package/src/connect-accounts.tsx +233 -0
  469. package/src/connect-chooser.tsx +336 -0
  470. package/src/connect-panel.tsx +99 -0
  471. package/src/connect-setup.tsx +307 -0
  472. package/src/connect.ts +60 -0
  473. package/src/connection-assets.d.ts +4 -0
  474. package/src/connection-catalog.tsx +162 -0
  475. package/src/connection-discovery.tsx +235 -0
  476. package/src/connection-installed.tsx +51 -0
  477. package/src/connection-logo.tsx +37 -0
  478. package/src/connection-service-logo.tsx +55 -0
  479. package/src/connection-service-presentation.ts +46 -0
  480. package/src/connection-skeleton.tsx +16 -0
  481. package/src/connection-type-picker.tsx +36 -0
  482. package/src/conversation-timeline.ts +92 -0
  483. package/src/desktop.ts +24 -0
  484. package/src/device-authorization.tsx +98 -0
  485. package/src/diffs.ts +16 -0
  486. package/src/discovery-cache.ts +42 -0
  487. package/src/editor.ts +13 -0
  488. package/src/embedded-session-client.ts +104 -0
  489. package/src/file-node-visibility.ts +66 -0
  490. package/src/hooks/channel-cache.ts +104 -0
  491. package/src/hooks/internal.ts +3 -2
  492. package/src/hooks/latest-question.ts +164 -0
  493. package/src/hooks/shared-machines-list.ts +239 -0
  494. package/src/hooks/use-attached-browsers.ts +5 -1
  495. package/src/hooks/use-available-models.ts +20 -14
  496. package/src/hooks/use-browser-frame-stream.ts +25 -3
  497. package/src/hooks/use-browser-session.ts +271 -71
  498. package/src/hooks/use-browser-sessions.ts +7 -1
  499. package/src/hooks/use-channels.ts +32 -10
  500. package/src/hooks/use-codex-accounts.ts +78 -21
  501. package/src/hooks/use-composer.ts +1034 -320
  502. package/src/hooks/use-computer-frame-stream.ts +39 -16
  503. package/src/hooks/use-computer-input-posture.ts +94 -0
  504. package/src/hooks/use-computer-session.ts +110 -32
  505. package/src/hooks/use-computer-sessions.ts +8 -1
  506. package/src/hooks/use-connect.ts +23 -0
  507. package/src/hooks/use-desktop-stream.ts +19 -28
  508. package/src/hooks/use-file-attachments.ts +118 -10
  509. package/src/hooks/use-goal.ts +36 -9
  510. package/src/hooks/use-human-input.ts +31 -4
  511. package/src/hooks/use-last-started-turn-policy.ts +15 -13
  512. package/src/hooks/use-machine-chip.ts +23 -6
  513. package/src/hooks/use-machines.ts +104 -6
  514. package/src/hooks/use-sandbox-files.ts +253 -150
  515. package/src/hooks/use-sandbox-git.ts +58 -29
  516. package/src/hooks/use-session-background-commands.ts +67 -0
  517. package/src/hooks/use-session-capabilities.ts +21 -2
  518. package/src/hooks/use-session-events.ts +759 -433
  519. package/src/hooks/use-session-lineage.ts +28 -6
  520. package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
  521. package/src/hooks/use-session.ts +75 -16
  522. package/src/hooks/use-slash-commands.ts +6 -11
  523. package/src/hooks/use-turn-queue.ts +113 -13
  524. package/src/hooks/use-usage.ts +100 -0
  525. package/src/hooks/use-voice-input.ts +12 -1
  526. package/src/hooks/use-workspace-capture.ts +3 -2
  527. package/src/hooks/use-workspace-edit.ts +23 -5
  528. package/src/hooks/use-workspace-sessions.ts +99 -11
  529. package/src/human-input.ts +12 -1
  530. package/src/identity-link-accounts.tsx +148 -0
  531. package/src/identity-link-consent.tsx +192 -0
  532. package/src/index.ts +157 -12
  533. package/src/interaction.ts +1 -0
  534. package/src/lib/error-message.ts +37 -0
  535. package/src/lib/format.ts +150 -14
  536. package/src/lib/host-theme.ts +511 -0
  537. package/src/lib/interaction-errors.ts +33 -0
  538. package/src/lib/menu-styles.ts +44 -0
  539. package/src/lib/pierre-diffs-loader.ts +53 -0
  540. package/src/lib/workbench-peers.ts +62 -0
  541. package/src/lib/xterm-theme.ts +23 -21
  542. package/src/machines.ts +9 -1
  543. package/src/mcp-connection-status.ts +35 -0
  544. package/src/model-policy.ts +223 -69
  545. package/src/older-history.ts +87 -0
  546. package/src/plugin-details.tsx +185 -0
  547. package/src/plugin-discovery.tsx +196 -0
  548. package/src/provider.tsx +55 -14
  549. package/src/realtime/dropdown-menu.tsx +19 -12
  550. package/src/realtime/realtime-control.tsx +274 -60
  551. package/src/session-auth-recommendation.ts +48 -0
  552. package/src/session-capability-policy.ts +83 -0
  553. package/src/session-context.ts +1 -0
  554. package/src/session-ui.ts +66 -2
  555. package/src/session.ts +18 -1
  556. package/src/sites-ui.tsx +402 -0
  557. package/src/sites.ts +3 -0
  558. package/src/skill-discovery.tsx +208 -0
  559. package/src/terminal.ts +26 -0
  560. package/src/timeline/activity-rail.tsx +171 -80
  561. package/src/timeline/allowance-exhausted-row.tsx +86 -0
  562. package/src/timeline/compaction-copy.ts +42 -0
  563. package/src/timeline/entrance.tsx +28 -3
  564. package/src/timeline/fleet-decision-projection.ts +2 -1
  565. package/src/timeline/fleet-decision-row.tsx +1 -0
  566. package/src/timeline/genie-loading.tsx +136 -0
  567. package/src/timeline/index.ts +11 -0
  568. package/src/timeline/knowledge-receipt.tsx +100 -0
  569. package/src/timeline/parsers.ts +2 -2
  570. package/src/timeline/platform-activity-row.tsx +216 -0
  571. package/src/timeline/presented-image.ts +49 -0
  572. package/src/timeline/projection.ts +1600 -84
  573. package/src/timeline/registry.ts +15 -3
  574. package/src/timeline/retained-image.ts +97 -0
  575. package/src/timeline/rolling-activity.tsx +92 -0
  576. package/src/timeline/screenshot-lightbox.tsx +115 -17
  577. package/src/timeline/shared.tsx +47 -15
  578. package/src/timeline/startup-preference.ts +33 -0
  579. package/src/timeline/startup-timings.tsx +145 -0
  580. package/src/timeline/tool-display-name.ts +8 -6
  581. package/src/timeline/tool-renderers.tsx +497 -128
  582. package/src/timeline/turn-summary.tsx +208 -44
  583. package/src/timeline/types.ts +186 -7
  584. package/src/types/machines.ts +10 -0
  585. package/src/usage/allowance-copy.ts +64 -0
  586. package/src/usage/summary.ts +93 -0
  587. package/src/usage.ts +50 -0
  588. package/styles/compiled.css +2098 -757
  589. package/styles/connect.css +284 -0
  590. package/styles/connect.d.ts +1 -0
  591. package/styles/effective-tokens.css +1 -0
  592. package/styles/index.css +201 -9
  593. package/styles/responsive.css +27 -1
  594. package/styles/session-capability.css +44 -0
  595. package/styles/tokens.css +135 -65
  596. package/dist/chunk-5UQPNLIO.js.map +0 -1
  597. package/dist/chunk-6KLX2RH5.js.map +0 -1
  598. package/dist/chunk-7WCLAEFV.js.map +0 -1
  599. package/dist/chunk-B6WPZSTT.js.map +0 -1
  600. package/dist/chunk-FK6VG4LL.js +0 -90
  601. package/dist/chunk-FK6VG4LL.js.map +0 -1
  602. package/dist/chunk-HA46CYQK.js.map +0 -1
  603. package/dist/chunk-HUIKIDM5.js.map +0 -1
  604. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  605. package/dist/chunk-KCGXPP5V.js.map +0 -1
  606. package/dist/chunk-KZ73RL76.js.map +0 -1
  607. package/dist/chunk-LAKLF4PA.js +0 -141
  608. package/dist/chunk-LAKLF4PA.js.map +0 -1
  609. package/dist/chunk-LLOLUHVG.js.map +0 -1
  610. package/dist/chunk-MKPIAGVL.js +0 -465
  611. package/dist/chunk-MKPIAGVL.js.map +0 -1
  612. package/dist/chunk-PEI6RANI.js.map +0 -1
  613. package/dist/chunk-R3AZOAB5.js.map +0 -1
  614. package/dist/chunk-WSK7G5LE.js +0 -170
  615. package/dist/chunk-WSK7G5LE.js.map +0 -1
  616. package/dist/chunk-XBZWOM2K.js +0 -218
  617. package/dist/chunk-XBZWOM2K.js.map +0 -1
  618. package/dist/chunk-Y7OEDUJ5.js +0 -8810
  619. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  620. package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
  621. package/dist/hooks/use-packs.d.ts +0 -32
  622. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  623. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  624. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  625. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  626. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  627. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  628. package/src/hooks/use-packs.ts +0 -157
  629. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GTR5XQ7X.js.map} +0 -0
@@ -0,0 +1,209 @@
1
+ // src/components/timeline-annotation-shared.ts
2
+ var ANNOTATION_CHROME_SELECTOR = "[data-og-annotation-chrome], [data-og-annotation-badge], [data-og-annotation-popover]";
3
+ function annotationHasNote(note) {
4
+ return note.trim().length > 0;
5
+ }
6
+ function annotationDisplayOrdinal(annotation, index) {
7
+ return typeof annotation.ordinal === "number" ? annotation.ordinal : index + 1;
8
+ }
9
+ function sourceKindLabel(kind) {
10
+ switch (kind) {
11
+ case "user_message":
12
+ return "Your message";
13
+ case "assistant_message":
14
+ return "Assistant";
15
+ case "tool_output":
16
+ return "Tool output";
17
+ }
18
+ }
19
+ function annotationSourceLabel(source) {
20
+ return source.label?.trim() || sourceKindLabel(source.kind);
21
+ }
22
+ function truncateAnnotationQuote(quote, maxChars = 160) {
23
+ const normalized = quote.replace(/\s+/g, " ").trim();
24
+ if (normalized.length <= maxChars) return normalized;
25
+ return `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}\u2026`;
26
+ }
27
+ function cssEscapeAttribute(value) {
28
+ if (typeof CSS !== "undefined" && typeof CSS.escape === "function") return CSS.escape(value);
29
+ return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
30
+ }
31
+ function isAnnotationChromeNode(node) {
32
+ const element = node instanceof Element ? node : node?.parentElement;
33
+ return Boolean(element?.closest(ANNOTATION_CHROME_SELECTOR));
34
+ }
35
+ function occurrenceOffsets(text, quote) {
36
+ if (!quote) return [];
37
+ const offsets = [];
38
+ let cursor = 0;
39
+ while (cursor <= text.length - quote.length) {
40
+ const offset = text.indexOf(quote, cursor);
41
+ if (offset < 0) break;
42
+ offsets.push(offset);
43
+ cursor = offset + 1;
44
+ }
45
+ return offsets;
46
+ }
47
+ function uniqueNonEmpty(values) {
48
+ const seen = /* @__PURE__ */ new Set();
49
+ const out = [];
50
+ for (const value of values) {
51
+ if (!value || seen.has(value)) continue;
52
+ seen.add(value);
53
+ out.push(value);
54
+ }
55
+ return out;
56
+ }
57
+ function matchingQuoteInSource(sourceText, quote) {
58
+ for (const candidate of uniqueNonEmpty([quote, quote.trim()])) {
59
+ if (sourceText.includes(candidate)) return candidate;
60
+ }
61
+ const trimmed = quote.trim();
62
+ for (let length = trimmed.length; length >= 8; length--) {
63
+ const slice = trimmed.slice(0, length);
64
+ if (sourceText.includes(slice)) return slice;
65
+ }
66
+ for (let start = 1; start <= trimmed.length - 8; start++) {
67
+ const slice = trimmed.slice(start);
68
+ if (sourceText.includes(slice)) return slice;
69
+ }
70
+ return null;
71
+ }
72
+ function annotatableText(root) {
73
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
74
+ acceptNode(node) {
75
+ if (!(node instanceof Text) || node.data.length === 0) return NodeFilter.FILTER_REJECT;
76
+ if (isAnnotationChromeNode(node)) return NodeFilter.FILTER_REJECT;
77
+ return NodeFilter.FILTER_ACCEPT;
78
+ }
79
+ });
80
+ const spans = [];
81
+ let text = "";
82
+ let current;
83
+ while (current = walker.nextNode()) {
84
+ if (!(current instanceof Text)) continue;
85
+ spans.push({ node: current, start: text.length, length: current.data.length });
86
+ text += current.data;
87
+ }
88
+ return { text, spans };
89
+ }
90
+ function pointAt(spans, offset, stickEnd) {
91
+ if (spans.length === 0) return null;
92
+ for (let index = 0; index < spans.length; index++) {
93
+ const span = spans[index];
94
+ const local = offset - span.start;
95
+ if (local < 0) continue;
96
+ if (local < span.length || local === span.length && (stickEnd || index === spans.length - 1)) {
97
+ return { node: span.node, offset: local };
98
+ }
99
+ }
100
+ const last = spans[spans.length - 1];
101
+ return { node: last.node, offset: last.length };
102
+ }
103
+ function rangeFromOffsets(spans, startOffset, endOffset) {
104
+ const start = pointAt(spans, startOffset, false);
105
+ const end = pointAt(spans, endOffset, true);
106
+ if (!start || !end) return null;
107
+ const range = document.createRange();
108
+ range.setStart(start.node, start.offset);
109
+ range.setEnd(end.node, end.offset);
110
+ return range.collapsed ? null : range;
111
+ }
112
+ function buildQuoteRange(sourceEl, quote, occurrenceIndex = 0) {
113
+ if (!quote) return null;
114
+ const { text, spans } = annotatableText(sourceEl);
115
+ const offsets = occurrenceOffsets(text, quote);
116
+ if (offsets.length === 0) return null;
117
+ const start = offsets[Math.min(Math.max(0, occurrenceIndex), offsets.length - 1)];
118
+ return rangeFromOffsets(spans, start, start + quote.length);
119
+ }
120
+ function quoteOccurrenceIndex(sourceEl, range, quote) {
121
+ try {
122
+ const prefix = range.cloneRange();
123
+ prefix.selectNodeContents(sourceEl);
124
+ prefix.setEnd(range.startContainer, range.startOffset);
125
+ return occurrenceOffsets(prefix.toString(), quote).length;
126
+ } catch {
127
+ return 0;
128
+ }
129
+ }
130
+ function clipRangeToSource(range, sourceEl) {
131
+ const startOk = sourceEl.contains(range.startContainer) && !isAnnotationChromeNode(range.startContainer);
132
+ const endOk = sourceEl.contains(range.endContainer) && !isAnnotationChromeNode(range.endContainer);
133
+ if (!startOk && !endOk) return null;
134
+ const { spans } = annotatableText(sourceEl);
135
+ if (spans.length === 0) return null;
136
+ const next = range.cloneRange();
137
+ const first = spans[0];
138
+ const last = spans[spans.length - 1];
139
+ if (!startOk) next.setStart(first.node, 0);
140
+ if (!endOk) next.setEnd(last.node, last.node.data.length);
141
+ return next.collapsed ? null : next;
142
+ }
143
+ function visibleClientRect(range) {
144
+ try {
145
+ const bounding = range.getBoundingClientRect();
146
+ if (bounding.width > 0 || bounding.height > 0) return bounding;
147
+ } catch {
148
+ }
149
+ try {
150
+ const rects = range.getClientRects();
151
+ for (let index = 0; index < rects.length; index++) {
152
+ const rect = rects.item(index);
153
+ if (rect && (rect.width > 0 || rect.height > 0)) return rect;
154
+ }
155
+ } catch {
156
+ }
157
+ return null;
158
+ }
159
+ function resolveAnnotationRevealRoot(from) {
160
+ const conversation = from?.closest("[data-og-conversation]");
161
+ if (conversation instanceof HTMLElement) {
162
+ const nested = conversation.querySelector("[data-og-timeline-scroller]");
163
+ return nested instanceof HTMLElement ? nested : conversation;
164
+ }
165
+ const scroller = from?.closest("[data-og-timeline-scroller]");
166
+ return scroller instanceof HTMLElement ? scroller : null;
167
+ }
168
+ function revealLoadedAnnotationSource(source, root) {
169
+ if (typeof document === "undefined") return false;
170
+ if (root === null) return false;
171
+ const element = (root ?? document).querySelector(
172
+ `[data-og-annotation-source-key="${cssEscapeAttribute(source.eventId)}"]`
173
+ );
174
+ if (!(element instanceof HTMLElement)) return false;
175
+ element.scrollIntoView({ block: "center", behavior: "smooth" });
176
+ element.animate?.(
177
+ [
178
+ {
179
+ boxShadow: "inset 0 0 0 2px color-mix(in oklch, var(--og-color-accent) 70%, transparent)",
180
+ backgroundColor: "color-mix(in oklch, var(--og-color-accent) 14%, transparent)"
181
+ },
182
+ {
183
+ boxShadow: "inset 0 0 0 2px transparent",
184
+ backgroundColor: "transparent"
185
+ }
186
+ ],
187
+ { duration: 1400, easing: "ease-out" }
188
+ );
189
+ return true;
190
+ }
191
+
192
+ export {
193
+ annotationHasNote,
194
+ annotationDisplayOrdinal,
195
+ annotationSourceLabel,
196
+ truncateAnnotationQuote,
197
+ cssEscapeAttribute,
198
+ occurrenceOffsets,
199
+ matchingQuoteInSource,
200
+ annotatableText,
201
+ rangeFromOffsets,
202
+ buildQuoteRange,
203
+ quoteOccurrenceIndex,
204
+ clipRangeToSource,
205
+ visibleClientRect,
206
+ resolveAnnotationRevealRoot,
207
+ revealLoadedAnnotationSource
208
+ };
209
+ //# sourceMappingURL=chunk-447JLCBU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/timeline-annotation-shared.ts"],"sourcesContent":["import type { TimelineAnnotationSource } from \"@opengeni/sdk\";\n\nexport const ANNOTATION_CHROME_SELECTOR =\n \"[data-og-annotation-chrome], [data-og-annotation-badge], [data-og-annotation-popover]\";\n\nexport function annotationHasNote(note: string): boolean {\n return note.trim().length > 0;\n}\n\nexport function annotationDisplayOrdinal(\n annotation: { readonly id?: string; readonly ordinal?: number | undefined },\n index: number,\n): number {\n return typeof annotation.ordinal === \"number\" ? annotation.ordinal : index + 1;\n}\n\nexport function sourceKindLabel(kind: TimelineAnnotationSource[\"kind\"]): string {\n switch (kind) {\n case \"user_message\":\n return \"Your message\";\n case \"assistant_message\":\n return \"Assistant\";\n case \"tool_output\":\n return \"Tool output\";\n }\n}\n\nexport function annotationSourceLabel(source: TimelineAnnotationSource): string {\n return source.label?.trim() || sourceKindLabel(source.kind);\n}\n\nexport function truncateAnnotationQuote(quote: string, maxChars = 160): string {\n const normalized = quote.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxChars) return normalized;\n return `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;\n}\n\nexport function cssEscapeAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") return CSS.escape(value);\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function isAnnotationChromeNode(node: Node | null): boolean {\n const element = node instanceof Element ? node : node?.parentElement;\n return Boolean(element?.closest(ANNOTATION_CHROME_SELECTOR));\n}\n\nexport function occurrenceOffsets(text: string, quote: string): number[] {\n if (!quote) return [];\n const offsets: number[] = [];\n let cursor = 0;\n while (cursor <= text.length - quote.length) {\n const offset = text.indexOf(quote, cursor);\n if (offset < 0) break;\n offsets.push(offset);\n cursor = offset + 1;\n }\n return offsets;\n}\n\nfunction uniqueNonEmpty(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n if (!value || seen.has(value)) continue;\n seen.add(value);\n out.push(value);\n }\n return out;\n}\n\nexport function matchingQuoteInSource(sourceText: string, quote: string): string | null {\n for (const candidate of uniqueNonEmpty([quote, quote.trim()])) {\n if (sourceText.includes(candidate)) return candidate;\n }\n const trimmed = quote.trim();\n for (let length = trimmed.length; length >= 8; length--) {\n const slice = trimmed.slice(0, length);\n if (sourceText.includes(slice)) return slice;\n }\n for (let start = 1; start <= trimmed.length - 8; start++) {\n const slice = trimmed.slice(start);\n if (sourceText.includes(slice)) return slice;\n }\n return null;\n}\n\ntype AnnotatableSpan = {\n node: Text;\n start: number;\n length: number;\n};\n\nexport function annotatableText(root: HTMLElement): { text: string; spans: AnnotatableSpan[] } {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n if (!(node instanceof Text) || node.data.length === 0) return NodeFilter.FILTER_REJECT;\n if (isAnnotationChromeNode(node)) return NodeFilter.FILTER_REJECT;\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n const spans: AnnotatableSpan[] = [];\n let text = \"\";\n let current: Node | null;\n while ((current = walker.nextNode())) {\n if (!(current instanceof Text)) continue;\n spans.push({ node: current, start: text.length, length: current.data.length });\n text += current.data;\n }\n return { text, spans };\n}\n\nfunction pointAt(\n spans: AnnotatableSpan[],\n offset: number,\n stickEnd: boolean,\n): { node: Text; offset: number } | null {\n if (spans.length === 0) return null;\n for (let index = 0; index < spans.length; index++) {\n const span = spans[index]!;\n const local = offset - span.start;\n if (local < 0) continue;\n if (\n local < span.length ||\n (local === span.length && (stickEnd || index === spans.length - 1))\n ) {\n return { node: span.node, offset: local };\n }\n }\n const last = spans[spans.length - 1]!;\n return { node: last.node, offset: last.length };\n}\n\nexport function rangeFromOffsets(\n spans: AnnotatableSpan[],\n startOffset: number,\n endOffset: number,\n): Range | null {\n const start = pointAt(spans, startOffset, false);\n const end = pointAt(spans, endOffset, true);\n if (!start || !end) return null;\n const range = document.createRange();\n range.setStart(start.node, start.offset);\n range.setEnd(end.node, end.offset);\n return range.collapsed ? null : range;\n}\n\nexport function buildQuoteRange(\n sourceEl: HTMLElement,\n quote: string,\n occurrenceIndex = 0,\n): Range | null {\n if (!quote) return null;\n const { text, spans } = annotatableText(sourceEl);\n const offsets = occurrenceOffsets(text, quote);\n if (offsets.length === 0) return null;\n const start = offsets[Math.min(Math.max(0, occurrenceIndex), offsets.length - 1)]!;\n return rangeFromOffsets(spans, start, start + quote.length);\n}\n\nexport function quoteOccurrenceIndex(sourceEl: HTMLElement, range: Range, quote: string): number {\n try {\n const prefix = range.cloneRange();\n prefix.selectNodeContents(sourceEl);\n prefix.setEnd(range.startContainer, range.startOffset);\n return occurrenceOffsets(prefix.toString(), quote).length;\n } catch {\n return 0;\n }\n}\n\nexport function clipRangeToSource(range: Range, sourceEl: HTMLElement): Range | null {\n const startOk =\n sourceEl.contains(range.startContainer) && !isAnnotationChromeNode(range.startContainer);\n const endOk =\n sourceEl.contains(range.endContainer) && !isAnnotationChromeNode(range.endContainer);\n if (!startOk && !endOk) return null;\n const { spans } = annotatableText(sourceEl);\n if (spans.length === 0) return null;\n const next = range.cloneRange();\n const first = spans[0]!;\n const last = spans[spans.length - 1]!;\n if (!startOk) next.setStart(first.node, 0);\n if (!endOk) next.setEnd(last.node, last.node.data.length);\n return next.collapsed ? null : next;\n}\n\nexport function visibleClientRect(range: Range): DOMRect | null {\n try {\n const bounding = range.getBoundingClientRect();\n if (bounding.width > 0 || bounding.height > 0) return bounding;\n } catch {\n // jsdom ranges may omit layout geometry.\n }\n try {\n const rects = range.getClientRects();\n for (let index = 0; index < rects.length; index++) {\n const rect = rects.item(index);\n if (rect && (rect.width > 0 || rect.height > 0)) return rect;\n }\n } catch {\n // jsdom ranges may omit client rects.\n }\n return null;\n}\n\nexport function resolveAnnotationRevealRoot(from: Element | null | undefined): HTMLElement | null {\n const conversation = from?.closest(\"[data-og-conversation]\");\n if (conversation instanceof HTMLElement) {\n const nested = conversation.querySelector(\"[data-og-timeline-scroller]\");\n return nested instanceof HTMLElement ? nested : conversation;\n }\n const scroller = from?.closest(\"[data-og-timeline-scroller]\");\n return scroller instanceof HTMLElement ? scroller : null;\n}\n\nexport function revealLoadedAnnotationSource(\n source: TimelineAnnotationSource,\n root?: ParentNode | null,\n): boolean {\n if (typeof document === \"undefined\") return false;\n // An explicit null root means the caller already scoped the search and found\n // no owning timeline. Do not fall back to `document`, or a second mounted\n // timeline with the same event id would steal the reveal.\n if (root === null) return false;\n const element = (root ?? document).querySelector(\n `[data-og-annotation-source-key=\"${cssEscapeAttribute(source.eventId)}\"]`,\n );\n if (!(element instanceof HTMLElement)) return false;\n element.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n element.animate?.(\n [\n {\n boxShadow: \"inset 0 0 0 2px color-mix(in oklch, var(--og-color-accent) 70%, transparent)\",\n backgroundColor: \"color-mix(in oklch, var(--og-color-accent) 14%, transparent)\",\n },\n {\n boxShadow: \"inset 0 0 0 2px transparent\",\n backgroundColor: \"transparent\",\n },\n ],\n { duration: 1400, easing: \"ease-out\" },\n );\n return true;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,379 @@
1
+ import {
2
+ codeEditorPeers
3
+ } from "./chunk-JT4JW7BC.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-22KP6LR5.js";
7
+
8
+ // src/components/code-editor.tsx
9
+ import { Loader2Icon, SaveIcon } from "lucide-react";
10
+ import {
11
+ useCallback,
12
+ useEffect,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ useSyncExternalStore
17
+ } from "react";
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ function languageForPath(path) {
20
+ const name = path.split("/").pop() ?? path;
21
+ const ext = name.includes(".") ? (name.split(".").pop() ?? "").toLowerCase() : "";
22
+ switch (ext) {
23
+ case "js":
24
+ case "jsx":
25
+ case "ts":
26
+ case "tsx":
27
+ case "mjs":
28
+ case "cjs":
29
+ return "javascript";
30
+ case "json":
31
+ case "jsonc":
32
+ return "json";
33
+ case "py":
34
+ case "pyi":
35
+ return "python";
36
+ case "md":
37
+ case "markdown":
38
+ case "mdx":
39
+ return "markdown";
40
+ case "css":
41
+ case "scss":
42
+ case "less":
43
+ return "css";
44
+ case "html":
45
+ case "htm":
46
+ case "xml":
47
+ case "svg":
48
+ case "vue":
49
+ return "html";
50
+ default:
51
+ return null;
52
+ }
53
+ }
54
+ function reconcileEditorBuffer(current, incoming) {
55
+ if (current.path === incoming.path && current.value !== current.baseline) {
56
+ return current;
57
+ }
58
+ if (current.path === incoming.path && current.value === incoming.contents && current.baseline === incoming.contents) {
59
+ return current;
60
+ }
61
+ return {
62
+ path: incoming.path,
63
+ value: incoming.contents,
64
+ baseline: incoming.contents
65
+ };
66
+ }
67
+ function CodeEditor({
68
+ path,
69
+ initialContents,
70
+ onSave,
71
+ onOverwrite,
72
+ onReload,
73
+ onEditIntent,
74
+ readOnly = false,
75
+ themeType = "dark",
76
+ loading,
77
+ fallback,
78
+ className
79
+ }) {
80
+ const [failed, setFailed] = useState(false);
81
+ const [bundle, setBundle] = useState(null);
82
+ const peerRevision = useSyncExternalStore(
83
+ codeEditorPeers.subscribe,
84
+ codeEditorPeers.revision,
85
+ codeEditorPeers.revision
86
+ );
87
+ const [buffer, setBuffer] = useState(() => ({
88
+ path,
89
+ value: initialContents,
90
+ baseline: initialContents
91
+ }));
92
+ const { value, baseline } = buffer;
93
+ const [saving, setSaving] = useState(false);
94
+ const [saveError, setSaveError] = useState(null);
95
+ const [savedTick, setSavedTick] = useState(false);
96
+ const saveInFlightRef = useRef(false);
97
+ const dirty = value !== baseline;
98
+ const saveConflict = saveError !== null && saveError.code === "file_write_conflict";
99
+ const editIntentFiredRef = useRef(false);
100
+ useEffect(() => {
101
+ setBuffer((current) => reconcileEditorBuffer(current, { path, contents: initialContents }));
102
+ }, [path, initialContents]);
103
+ useEffect(() => {
104
+ editIntentFiredRef.current = false;
105
+ setSaveError(null);
106
+ setSavedTick(false);
107
+ }, [path]);
108
+ const noteEdit = useCallback(
109
+ (next) => {
110
+ setBuffer((current) => ({ ...current, value: next }));
111
+ setSavedTick(false);
112
+ if (!editIntentFiredRef.current && next !== baseline) {
113
+ editIntentFiredRef.current = true;
114
+ onEditIntent?.();
115
+ }
116
+ },
117
+ [baseline, onEditIntent]
118
+ );
119
+ const langKey = useMemo(() => languageForPath(path), [path]);
120
+ useEffect(() => {
121
+ let cancelled = false;
122
+ void (async () => {
123
+ try {
124
+ const peers = await codeEditorPeers.load();
125
+ const cmMod = peers.module;
126
+ let languageExtension = null;
127
+ if (langKey) {
128
+ try {
129
+ languageExtension = await peers.languages?.[langKey]?.() ?? null;
130
+ } catch {
131
+ languageExtension = null;
132
+ }
133
+ }
134
+ if (cancelled) return;
135
+ const saveKeymapExtension = (run) => cmMod.Prec.highest(
136
+ cmMod.keymap.of([
137
+ {
138
+ key: "Mod-s",
139
+ preventDefault: true,
140
+ run: () => {
141
+ run();
142
+ return true;
143
+ }
144
+ }
145
+ ])
146
+ );
147
+ setBundle({
148
+ Editor: cmMod.default,
149
+ saveKeymapExtension,
150
+ languageExtension
151
+ });
152
+ setFailed(false);
153
+ } catch {
154
+ if (!cancelled) setFailed(true);
155
+ }
156
+ })();
157
+ return () => {
158
+ cancelled = true;
159
+ };
160
+ }, [langKey, peerRevision]);
161
+ const saveRef = useRef(() => {
162
+ });
163
+ const save = useCallback(async () => {
164
+ if (readOnly || saveInFlightRef.current) return;
165
+ const snapshot = value;
166
+ if (snapshot === baseline) return;
167
+ saveInFlightRef.current = true;
168
+ setSaving(true);
169
+ setSaveError(null);
170
+ setSavedTick(false);
171
+ try {
172
+ await onSave(snapshot, baseline);
173
+ setBuffer(
174
+ (current) => current.path === path ? { ...current, baseline: snapshot } : current
175
+ );
176
+ setSavedTick(true);
177
+ } catch (cause) {
178
+ setSaveError(cause instanceof Error ? cause : new Error(String(cause)));
179
+ } finally {
180
+ saveInFlightRef.current = false;
181
+ setSaving(false);
182
+ }
183
+ }, [readOnly, value, baseline, onSave, path]);
184
+ const overwrite = useCallback(async () => {
185
+ if (readOnly || !onOverwrite || saveInFlightRef.current) return;
186
+ const snapshot = value;
187
+ if (snapshot === baseline) return;
188
+ saveInFlightRef.current = true;
189
+ setSaving(true);
190
+ setSaveError(null);
191
+ setSavedTick(false);
192
+ try {
193
+ await onOverwrite(snapshot);
194
+ setBuffer(
195
+ (current) => current.path === path ? { ...current, baseline: snapshot } : current
196
+ );
197
+ setSavedTick(true);
198
+ } catch (cause) {
199
+ setSaveError(cause instanceof Error ? cause : new Error(String(cause)));
200
+ } finally {
201
+ saveInFlightRef.current = false;
202
+ setSaving(false);
203
+ }
204
+ }, [readOnly, onOverwrite, value, baseline, path]);
205
+ saveRef.current = () => {
206
+ void save();
207
+ };
208
+ useEffect(() => {
209
+ if (!savedTick) return;
210
+ const t = setTimeout(() => setSavedTick(false), 1800);
211
+ return () => clearTimeout(t);
212
+ }, [savedTick]);
213
+ const fileName = path.split("/").filter(Boolean).pop() ?? path;
214
+ const cmExtensions = useMemo(() => {
215
+ if (!bundle) return [];
216
+ const exts = [bundle.saveKeymapExtension(() => saveRef.current())];
217
+ if (bundle.languageExtension) exts.push(bundle.languageExtension);
218
+ return exts;
219
+ }, [bundle]);
220
+ const Editor = bundle?.Editor;
221
+ const reload = useCallback(() => {
222
+ setBuffer({ path, value: initialContents, baseline: initialContents });
223
+ editIntentFiredRef.current = false;
224
+ setSaveError(null);
225
+ setSavedTick(false);
226
+ onReload?.();
227
+ }, [initialContents, onReload, path]);
228
+ return /* @__PURE__ */ jsxs(
229
+ "div",
230
+ {
231
+ className: cn("flex h-full min-h-0 flex-col", className),
232
+ "data-opengeni-code-editor": true,
233
+ "data-opengeni-editor-dirty": dirty ? "true" : "false",
234
+ style: editorVars,
235
+ children: [
236
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-9 shrink-0 items-center gap-2 border-b border-og-border bg-og-surface-1 px-2 py-1", children: [
237
+ /* @__PURE__ */ jsx(
238
+ "span",
239
+ {
240
+ className: cn(
241
+ "size-1.5 shrink-0 rounded-full transition-colors",
242
+ readOnly ? "bg-transparent" : dirty ? "bg-og-status-running" : "bg-og-status-idle"
243
+ ),
244
+ title: readOnly ? "read-only" : dirty ? "unsaved changes" : "saved"
245
+ }
246
+ ),
247
+ /* @__PURE__ */ jsxs("span", { className: "truncate font-og-mono text-og-xs text-og-fg-muted", children: [
248
+ fileName,
249
+ dirty && !readOnly ? " \u2022" : ""
250
+ ] }),
251
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [
252
+ saveError && !saveConflict && /* @__PURE__ */ jsx(
253
+ "span",
254
+ {
255
+ className: "max-w-[220px] truncate text-og-xs text-og-status-failed",
256
+ title: saveError.message,
257
+ children: saveError.message
258
+ }
259
+ ),
260
+ !saveError && savedTick && !dirty && /* @__PURE__ */ jsx("span", { className: "text-og-xs text-og-status-idle", children: "Saved" }),
261
+ readOnly ? /* @__PURE__ */ jsx("span", { className: "text-og-xs uppercase tracking-wide text-og-fg-subtle", children: "Read-only" }) : !saveConflict ? /* @__PURE__ */ jsxs(
262
+ "button",
263
+ {
264
+ type: "button",
265
+ onClick: () => void save(),
266
+ disabled: saving || !dirty,
267
+ className: cn(
268
+ "flex items-center gap-1 rounded-og-sm border border-og-border px-1.5 py-0.5 text-og-xs pointer-coarse:min-h-11",
269
+ saving || !dirty ? "cursor-default text-og-fg-subtle opacity-60" : "text-og-fg hover:bg-og-accent-soft"
270
+ ),
271
+ title: "Save (\u2318/Ctrl+S)",
272
+ children: [
273
+ saving ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 animate-spin" }) : /* @__PURE__ */ jsx(SaveIcon, { className: "size-3" }),
274
+ "Save"
275
+ ]
276
+ }
277
+ ) : null
278
+ ] })
279
+ ] }),
280
+ saveConflict ? /* @__PURE__ */ jsxs(
281
+ "div",
282
+ {
283
+ className: "flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-b border-og-status-failed/25 bg-og-status-failed/8 px-2 py-2",
284
+ role: "alert",
285
+ children: [
286
+ /* @__PURE__ */ jsxs("div", { className: "min-w-[12rem] flex-1 text-og-xs text-og-fg-muted", children: [
287
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-og-status-failed", children: "File changed on machine." }),
288
+ " ",
289
+ "Reloading discards your edits; overwriting replaces the live version."
290
+ ] }),
291
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
292
+ onReload ? /* @__PURE__ */ jsx(
293
+ "button",
294
+ {
295
+ type: "button",
296
+ onClick: () => {
297
+ reload();
298
+ },
299
+ className: "min-h-8 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-og-xs font-medium text-og-fg hover:bg-og-surface-2 pointer-coarse:min-h-11",
300
+ children: "Reload live"
301
+ }
302
+ ) : null,
303
+ onOverwrite ? /* @__PURE__ */ jsx(
304
+ "button",
305
+ {
306
+ type: "button",
307
+ onClick: () => void overwrite(),
308
+ disabled: saving,
309
+ className: "min-h-8 rounded-og-sm border border-og-status-failed/40 px-2 text-og-xs font-medium text-og-status-failed hover:bg-og-status-failed/10 disabled:opacity-50 pointer-coarse:min-h-11",
310
+ children: "Overwrite"
311
+ }
312
+ ) : null
313
+ ] })
314
+ ]
315
+ }
316
+ ) : null,
317
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: failed ? fallback ?? /* @__PURE__ */ jsx(
318
+ PlainTextarea,
319
+ {
320
+ value,
321
+ readOnly,
322
+ onChange: noteEdit,
323
+ onSave: () => void save()
324
+ }
325
+ ) : Editor ? /* @__PURE__ */ jsx(
326
+ Editor,
327
+ {
328
+ value,
329
+ theme: themeType === "light" ? "light" : "dark",
330
+ editable: !readOnly,
331
+ readOnly,
332
+ basicSetup: true,
333
+ extensions: cmExtensions,
334
+ height: "100%",
335
+ className: "og-cm-editor min-h-full text-og-sm",
336
+ onChange: readOnly ? void 0 : noteEdit
337
+ }
338
+ ) : loading ?? /* @__PURE__ */ jsx(EditorSkeleton, {}) })
339
+ ]
340
+ }
341
+ );
342
+ }
343
+ var editorVars = {
344
+ "--og-cm-bg": "var(--og-color-bg)",
345
+ fontFamily: "var(--og-font-mono)"
346
+ };
347
+ function PlainTextarea({
348
+ value,
349
+ readOnly,
350
+ onChange,
351
+ onSave
352
+ }) {
353
+ return /* @__PURE__ */ jsx(
354
+ "textarea",
355
+ {
356
+ value,
357
+ readOnly,
358
+ spellCheck: false,
359
+ onChange: (e) => onChange(e.target.value),
360
+ onKeyDown: (event) => {
361
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "s") {
362
+ event.preventDefault();
363
+ onSave();
364
+ }
365
+ },
366
+ "aria-label": "Plain text file editor",
367
+ className: "h-full w-full resize-none bg-transparent p-2 font-og-mono text-og-sm text-og-fg outline-hidden"
368
+ }
369
+ );
370
+ }
371
+ function EditorSkeleton() {
372
+ return /* @__PURE__ */ jsx("div", { className: "p-3 text-og-sm text-og-fg-subtle", children: "Loading editor\u2026" });
373
+ }
374
+
375
+ export {
376
+ languageForPath,
377
+ CodeEditor
378
+ };
379
+ //# sourceMappingURL=chunk-4RVYOY4O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/code-editor.tsx"],"sourcesContent":["import { Loader2Icon, SaveIcon } from \"lucide-react\";\nimport {\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { codeEditorPeers, type CodeEditorLanguage } from \"../lib/workbench-peers\";\n\n// --- Lazy CodeMirror surface ----------------------------------------------\n//\n// CodeMirror 6 (via @uiw/react-codemirror) plus the per-language grammars are a\n// heavy bundle (lezer parsers, the view layer). We keep them OFF the critical\n// path and out of any SSR bundle by lazy-importing only when a file is actually\n// EDITED. The read-only viewer stays Pierre's Shiki `File`; this is the\n// editable complement, mounted on demand.\n\n/** The subset of `@uiw/react-codemirror`'s props we drive. */\ntype ReactCodeMirrorComponent = ComponentType<{\n value?: string;\n height?: string;\n theme?: \"light\" | \"dark\" | \"none\" | unknown;\n editable?: boolean;\n readOnly?: boolean;\n basicSetup?: boolean | Record<string, boolean>;\n extensions?: unknown[];\n onChange?: ((value: string) => void) | undefined;\n className?: string;\n style?: CSSProperties;\n}>;\n\n// Resolved lazily on first edit: the editor component + the keymap/Prec helpers\n// (both re-exported from @uiw/react-codemirror, which re-exports @codemirror/view\n// and @codemirror/state) + the chosen language extension.\ntype EditorBundle = {\n Editor: ReactCodeMirrorComponent;\n saveKeymapExtension: (onSave: () => void) => unknown;\n languageExtension: unknown | null;\n};\n\n/** Map a filename to a grammar key (or null for plain text — still fully editable). */\nexport function languageForPath(path: string): string | null {\n const name = path.split(\"/\").pop() ?? path;\n const ext = name.includes(\".\") ? (name.split(\".\").pop() ?? \"\").toLowerCase() : \"\";\n switch (ext) {\n case \"js\":\n case \"jsx\":\n case \"ts\":\n case \"tsx\":\n case \"mjs\":\n case \"cjs\":\n return \"javascript\";\n case \"json\":\n case \"jsonc\":\n return \"json\";\n case \"py\":\n case \"pyi\":\n return \"python\";\n case \"md\":\n case \"markdown\":\n case \"mdx\":\n return \"markdown\";\n case \"css\":\n case \"scss\":\n case \"less\":\n return \"css\";\n case \"html\":\n case \"htm\":\n case \"xml\":\n case \"svg\":\n case \"vue\":\n return \"html\";\n default:\n return null;\n }\n}\n\nexport type CodeEditorProps = {\n /** Workspace-relative path — drives language inference (and the save target upstream). */\n path: string;\n /** The decoded text contents to seed the editor with. */\n initialContents: string;\n /**\n * Persist the current buffer against the exact contents it was edited from.\n * The second argument is the immutable compare-and-swap baseline; hosts must\n * not replace it with a newer remote snapshot or concurrent writes can be\n * silently overwritten.\n */\n onSave: (contents: string, expectedContents: string) => Promise<unknown>;\n /** Explicitly overwrite after a visible expected-content conflict. */\n onOverwrite?: ((contents: string) => Promise<unknown>) | undefined;\n /** Re-read the selected file after a visible save conflict. */\n onReload?: (() => void) | undefined;\n /** Fired once when the buffer FIRST diverges from its baseline (the first real\n * keystroke) — the wake-on-edit intent. The host warms the box on this so the\n * eventual save lands fast; merely opening the file for reading never fires it. */\n onEditIntent?: (() => void) | undefined;\n /** Read-only mode (e.g. a truncated/too-large file shown for reference only). */\n readOnly?: boolean | undefined;\n themeType?: \"dark\" | \"light\" | undefined;\n /** Rendered while the (lazy) CodeMirror bundle loads. */\n loading?: ReactNode | undefined;\n /** Rendered if `@uiw/react-codemirror` is not installed / fails to import. */\n fallback?: ReactNode | undefined;\n className?: string | undefined;\n};\n\nexport type EditorBufferState = {\n path: string;\n value: string;\n baseline: string;\n};\n\n/**\n * Reconcile a remote file snapshot without destroying unsaved local work.\n *\n * A different path is a new document and always resets. For the same path, a\n * clean editor follows the remote snapshot while a dirty editor retains both\n * its local value and the original CAS baseline. The eventual save will then\n * either succeed against that baseline or surface a typed conflict.\n */\nexport function reconcileEditorBuffer(\n current: EditorBufferState,\n incoming: { path: string; contents: string },\n): EditorBufferState {\n if (current.path === incoming.path && current.value !== current.baseline) {\n return current;\n }\n if (\n current.path === incoming.path &&\n current.value === incoming.contents &&\n current.baseline === incoming.contents\n ) {\n return current;\n }\n return {\n path: incoming.path,\n value: incoming.contents,\n baseline: incoming.contents,\n };\n}\n\n/**\n * The EDITABLE single-file pane: CodeMirror 6 with a per-language grammar chosen\n * from the filename, og-* themed, with dirty tracking and a save path wired to\n * `Cmd/Ctrl+S` *and* an explicit Save button. The viewer (Pierre `File`) stays\n * the read-only complement — this is only mounted when the user opts to edit.\n *\n * Save semantics: the buffer is \"dirty\" the moment it diverges from the last\n * saved baseline; a successful `onSave` clears dirty and re-baselines. A failed\n * save keeps the buffer dirty (nothing is lost) and surfaces the error inline.\n * `readOnly` suppresses every mutation path so a truncated/binary file can never\n * be saved back (which would corrupt it by writing the truncated prefix).\n */\nexport function CodeEditor({\n path,\n initialContents,\n onSave,\n onOverwrite,\n onReload,\n onEditIntent,\n readOnly = false,\n themeType = \"dark\",\n loading,\n fallback,\n className,\n}: CodeEditorProps) {\n const [failed, setFailed] = useState(false);\n const [bundle, setBundle] = useState<EditorBundle | null>(null);\n const peerRevision = useSyncExternalStore(\n codeEditorPeers.subscribe,\n codeEditorPeers.revision,\n codeEditorPeers.revision,\n );\n\n // The live buffer and its compare-and-swap baseline are one state value so a\n // remote refresh cannot update one without the other.\n const [buffer, setBuffer] = useState<EditorBufferState>(() => ({\n path,\n value: initialContents,\n baseline: initialContents,\n }));\n const { value, baseline } = buffer;\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState<Error | null>(null);\n const [savedTick, setSavedTick] = useState(false);\n const saveInFlightRef = useRef(false);\n\n const dirty = value !== baseline;\n const saveConflict =\n saveError !== null && (saveError as Error & { code?: unknown }).code === \"file_write_conflict\";\n\n // Follow path changes and clean same-file refreshes. Dirty same-file buffers\n // intentionally ignore remote snapshots: the original baseline must survive\n // until guarded save, explicit reload, or navigation.\n const editIntentFiredRef = useRef(false);\n useEffect(() => {\n setBuffer((current) => reconcileEditorBuffer(current, { path, contents: initialContents }));\n }, [path, initialContents]);\n\n // A new document is a new edit-intent/error lifecycle. The normal\n // SandboxFiles host also keys the component by path; this keeps standalone\n // consumers correct without relying on that implementation detail.\n useEffect(() => {\n editIntentFiredRef.current = false;\n setSaveError(null);\n setSavedTick(false);\n }, [path]);\n\n // Record a buffer change: the FIRST divergence from the baseline is the edit\n // intent that warms the box (idempotent — latched per opened file).\n const noteEdit = useCallback(\n (next: string) => {\n setBuffer((current) => ({ ...current, value: next }));\n setSavedTick(false);\n if (!editIntentFiredRef.current && next !== baseline) {\n editIntentFiredRef.current = true;\n onEditIntent?.();\n }\n },\n [baseline, onEditIntent],\n );\n\n // Resolve the lazy bundle (editor + keymap/Prec helpers + language grammar)\n // once, re-resolving the grammar when the file's language class changes.\n const langKey = useMemo(() => languageForPath(path) as CodeEditorLanguage | null, [path]);\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n try {\n const peers = await codeEditorPeers.load();\n const cmMod = peers.module as {\n default: ReactCodeMirrorComponent;\n keymap: { of: (binds: unknown[]) => unknown };\n Prec: { highest: (ext: unknown) => unknown };\n };\n // Language peers are optional. A missing grammar must degrade to a plain\n // CodeMirror document, not throw the entire editor down to textarea.\n let languageExtension: unknown | null = null;\n if (langKey) {\n try {\n languageExtension = (await peers.languages?.[langKey]?.()) ?? null;\n } catch {\n languageExtension = null;\n }\n }\n if (cancelled) return;\n // A high-precedence Cmd/Ctrl-S keymap that calls back into the latest\n // save handler (kept fresh via a ref) and swallows the browser's\n // \"save page\" default.\n const saveKeymapExtension = (run: () => void) =>\n cmMod.Prec.highest(\n cmMod.keymap.of([\n {\n key: \"Mod-s\",\n preventDefault: true,\n run: () => {\n run();\n return true;\n },\n },\n ]),\n );\n setBundle({\n Editor: cmMod.default,\n saveKeymapExtension,\n languageExtension,\n });\n setFailed(false);\n } catch {\n if (!cancelled) setFailed(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [langKey, peerRevision]);\n\n // Keep the freshest save closure reachable from the (stable) keymap binding.\n const saveRef = useRef<() => void>(() => {});\n\n const save = useCallback(async () => {\n if (readOnly || saveInFlightRef.current) return;\n // Snapshot the buffer at call time so an in-flight edit can't race the write.\n const snapshot = value;\n if (snapshot === baseline) return; // nothing to persist\n saveInFlightRef.current = true;\n setSaving(true);\n setSaveError(null);\n setSavedTick(false);\n try {\n await onSave(snapshot, baseline);\n setBuffer((current) =>\n current.path === path ? { ...current, baseline: snapshot } : current,\n );\n setSavedTick(true);\n } catch (cause) {\n setSaveError(cause instanceof Error ? cause : new Error(String(cause)));\n } finally {\n saveInFlightRef.current = false;\n setSaving(false);\n }\n }, [readOnly, value, baseline, onSave, path]);\n\n const overwrite = useCallback(async () => {\n if (readOnly || !onOverwrite || saveInFlightRef.current) return;\n const snapshot = value;\n if (snapshot === baseline) return;\n saveInFlightRef.current = true;\n setSaving(true);\n setSaveError(null);\n setSavedTick(false);\n try {\n await onOverwrite(snapshot);\n setBuffer((current) =>\n current.path === path ? { ...current, baseline: snapshot } : current,\n );\n setSavedTick(true);\n } catch (cause) {\n setSaveError(cause instanceof Error ? cause : new Error(String(cause)));\n } finally {\n saveInFlightRef.current = false;\n setSaving(false);\n }\n }, [readOnly, onOverwrite, value, baseline, path]);\n\n saveRef.current = () => {\n void save();\n };\n\n // A brief \"Saved\" affordance after a successful write, cleared on the next edit.\n useEffect(() => {\n if (!savedTick) return;\n const t = setTimeout(() => setSavedTick(false), 1800);\n return () => clearTimeout(t);\n }, [savedTick]);\n\n const fileName = path.split(\"/\").filter(Boolean).pop() ?? path;\n\n const cmExtensions = useMemo(() => {\n if (!bundle) return [] as unknown[];\n const exts: unknown[] = [bundle.saveKeymapExtension(() => saveRef.current())];\n if (bundle.languageExtension) exts.push(bundle.languageExtension);\n return exts;\n }, [bundle]);\n\n const Editor = bundle?.Editor;\n\n const reload = useCallback(() => {\n setBuffer({ path, value: initialContents, baseline: initialContents });\n editIntentFiredRef.current = false;\n setSaveError(null);\n setSavedTick(false);\n onReload?.();\n }, [initialContents, onReload, path]);\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 flex-col\", className)}\n data-opengeni-code-editor\n data-opengeni-editor-dirty={dirty ? \"true\" : \"false\"}\n style={editorVars}\n >\n {/* Save bar: dirty indicator + status + the explicit Save button. */}\n <div className=\"flex min-h-9 shrink-0 items-center gap-2 border-b border-og-border bg-og-surface-1 px-2 py-1\">\n <span\n className={cn(\n \"size-1.5 shrink-0 rounded-full transition-colors\",\n readOnly ? \"bg-transparent\" : dirty ? \"bg-og-status-running\" : \"bg-og-status-idle\",\n )}\n title={readOnly ? \"read-only\" : dirty ? \"unsaved changes\" : \"saved\"}\n />\n <span className=\"truncate font-og-mono text-og-xs text-og-fg-muted\">\n {fileName}\n {dirty && !readOnly ? \" •\" : \"\"}\n </span>\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {saveError && !saveConflict && (\n <span\n className=\"max-w-[220px] truncate text-og-xs text-og-status-failed\"\n title={saveError.message}\n >\n {saveError.message}\n </span>\n )}\n {!saveError && savedTick && !dirty && (\n <span className=\"text-og-xs text-og-status-idle\">Saved</span>\n )}\n {readOnly ? (\n <span className=\"text-og-xs uppercase tracking-wide text-og-fg-subtle\">Read-only</span>\n ) : !saveConflict ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving || !dirty}\n className={cn(\n \"flex items-center gap-1 rounded-og-sm border border-og-border px-1.5 py-0.5 text-og-xs pointer-coarse:min-h-11\",\n saving || !dirty\n ? \"cursor-default text-og-fg-subtle opacity-60\"\n : \"text-og-fg hover:bg-og-accent-soft\",\n )}\n title=\"Save (⌘/Ctrl+S)\"\n >\n {saving ? (\n <Loader2Icon className=\"size-3 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3\" />\n )}\n Save\n </button>\n ) : null}\n </div>\n </div>\n\n {saveConflict ? (\n <div\n className=\"flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-b border-og-status-failed/25 bg-og-status-failed/8 px-2 py-2\"\n role=\"alert\"\n >\n <div className=\"min-w-[12rem] flex-1 text-og-xs text-og-fg-muted\">\n <span className=\"font-medium text-og-status-failed\">File changed on machine.</span>{\" \"}\n Reloading discards your edits; overwriting replaces the live version.\n </div>\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {onReload ? (\n <button\n type=\"button\"\n onClick={() => {\n reload();\n }}\n className=\"min-h-8 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-og-xs font-medium text-og-fg hover:bg-og-surface-2 pointer-coarse:min-h-11\"\n >\n Reload live\n </button>\n ) : null}\n {onOverwrite ? (\n <button\n type=\"button\"\n onClick={() => void overwrite()}\n disabled={saving}\n className=\"min-h-8 rounded-og-sm border border-og-status-failed/40 px-2 text-og-xs font-medium text-og-status-failed hover:bg-og-status-failed/10 disabled:opacity-50 pointer-coarse:min-h-11\"\n >\n Overwrite\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {/* The editor surface. */}\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {failed ? (\n (fallback ?? (\n <PlainTextarea\n value={value}\n readOnly={readOnly}\n onChange={noteEdit}\n onSave={() => void save()}\n />\n ))\n ) : Editor ? (\n <Editor\n value={value}\n theme={themeType === \"light\" ? \"light\" : \"dark\"}\n editable={!readOnly}\n readOnly={readOnly}\n basicSetup={true}\n extensions={cmExtensions}\n height=\"100%\"\n className=\"og-cm-editor min-h-full text-og-sm\"\n onChange={readOnly ? undefined : noteEdit}\n />\n ) : (\n (loading ?? <EditorSkeleton />)\n )}\n </div>\n </div>\n );\n}\n\n/** og-* themed CSS-var overrides handed to CodeMirror's container. */\nconst editorVars = {\n \"--og-cm-bg\": \"var(--og-color-bg)\",\n fontFamily: \"var(--og-font-mono)\",\n} as CSSProperties;\n\nfunction PlainTextarea({\n value,\n readOnly,\n onChange,\n onSave,\n}: {\n value: string;\n readOnly: boolean;\n onChange: (value: string) => void;\n onSave: () => void;\n}) {\n return (\n <textarea\n value={value}\n readOnly={readOnly}\n spellCheck={false}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n onSave();\n }\n }}\n aria-label=\"Plain text file editor\"\n className=\"h-full w-full resize-none bg-transparent p-2 font-og-mono text-og-sm text-og-fg outline-hidden\"\n />\n );\n}\n\nfunction EditorSkeleton() {\n return <div className=\"p-3 text-og-sm text-og-fg-subtle\">Loading editor…</div>;\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa,gBAAgB;AACtC;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwWC,cAOA,YAPA;AApUD,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACtC,QAAM,MAAM,KAAK,SAAS,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,IAAI,YAAY,IAAI;AAC/E,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AA8CO,SAAS,sBACd,SACA,UACmB;AACnB,MAAI,QAAQ,SAAS,SAAS,QAAQ,QAAQ,UAAU,QAAQ,UAAU;AACxE,WAAO;AAAA,EACT;AACA,MACE,QAAQ,SAAS,SAAS,QAC1B,QAAQ,UAAU,SAAS,YAC3B,QAAQ,aAAa,SAAS,UAC9B;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,OAAO,SAAS;AAAA,IAChB,UAAU,SAAS;AAAA,EACrB;AACF;AAcO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA8B,IAAI;AAC9D,QAAM,eAAe;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAIA,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA4B,OAAO;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,EAAE;AACF,QAAM,EAAE,OAAO,SAAS,IAAI;AAC5B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAuB,IAAI;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,kBAAkB,OAAO,KAAK;AAEpC,QAAM,QAAQ,UAAU;AACxB,QAAM,eACJ,cAAc,QAAS,UAAyC,SAAS;AAK3E,QAAM,qBAAqB,OAAO,KAAK;AACvC,YAAU,MAAM;AACd,cAAU,CAAC,YAAY,sBAAsB,SAAS,EAAE,MAAM,UAAU,gBAAgB,CAAC,CAAC;AAAA,EAC5F,GAAG,CAAC,MAAM,eAAe,CAAC;AAK1B,YAAU,MAAM;AACd,uBAAmB,UAAU;AAC7B,iBAAa,IAAI;AACjB,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,IAAI,CAAC;AAIT,QAAM,WAAW;AAAA,IACf,CAAC,SAAiB;AAChB,gBAAU,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,KAAK,EAAE;AACpD,mBAAa,KAAK;AAClB,UAAI,CAAC,mBAAmB,WAAW,SAAS,UAAU;AACpD,2BAAmB,UAAU;AAC7B,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAIA,QAAM,UAAU,QAAQ,MAAM,gBAAgB,IAAI,GAAgC,CAAC,IAAI,CAAC;AACxF,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,QAAQ,MAAM,gBAAgB,KAAK;AACzC,cAAM,QAAQ,MAAM;AAOpB,YAAI,oBAAoC;AACxC,YAAI,SAAS;AACX,cAAI;AACF,gCAAqB,MAAM,MAAM,YAAY,OAAO,IAAI,KAAM;AAAA,UAChE,QAAQ;AACN,gCAAoB;AAAA,UACtB;AAAA,QACF;AACA,YAAI,UAAW;AAIf,cAAM,sBAAsB,CAAC,QAC3B,MAAM,KAAK;AAAA,UACT,MAAM,OAAO,GAAG;AAAA,YACd;AAAA,cACE,KAAK;AAAA,cACL,gBAAgB;AAAA,cAChB,KAAK,MAAM;AACT,oBAAI;AACJ,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACF,kBAAU;AAAA,UACR,QAAQ,MAAM;AAAA,UACd;AAAA,UACA;AAAA,QACF,CAAC;AACD,kBAAU,KAAK;AAAA,MACjB,QAAQ;AACN,YAAI,CAAC,UAAW,WAAU,IAAI;AAAA,MAChC;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,CAAC;AAG1B,QAAM,UAAU,OAAmB,MAAM;AAAA,EAAC,CAAC;AAE3C,QAAM,OAAO,YAAY,YAAY;AACnC,QAAI,YAAY,gBAAgB,QAAS;AAEzC,UAAM,WAAW;AACjB,QAAI,aAAa,SAAU;AAC3B,oBAAgB,UAAU;AAC1B,cAAU,IAAI;AACd,iBAAa,IAAI;AACjB,iBAAa,KAAK;AAClB,QAAI;AACF,YAAM,OAAO,UAAU,QAAQ;AAC/B;AAAA,QAAU,CAAC,YACT,QAAQ,SAAS,OAAO,EAAE,GAAG,SAAS,UAAU,SAAS,IAAI;AAAA,MAC/D;AACA,mBAAa,IAAI;AAAA,IACnB,SAAS,OAAO;AACd,mBAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,UAAE;AACA,sBAAgB,UAAU;AAC1B,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,UAAU,OAAO,UAAU,QAAQ,IAAI,CAAC;AAE5C,QAAM,YAAY,YAAY,YAAY;AACxC,QAAI,YAAY,CAAC,eAAe,gBAAgB,QAAS;AACzD,UAAM,WAAW;AACjB,QAAI,aAAa,SAAU;AAC3B,oBAAgB,UAAU;AAC1B,cAAU,IAAI;AACd,iBAAa,IAAI;AACjB,iBAAa,KAAK;AAClB,QAAI;AACF,YAAM,YAAY,QAAQ;AAC1B;AAAA,QAAU,CAAC,YACT,QAAQ,SAAS,OAAO,EAAE,GAAG,SAAS,UAAU,SAAS,IAAI;AAAA,MAC/D;AACA,mBAAa,IAAI;AAAA,IACnB,SAAS,OAAO;AACd,mBAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,UAAE;AACA,sBAAgB,UAAU;AAC1B,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,OAAO,UAAU,IAAI,CAAC;AAEjD,UAAQ,UAAU,MAAM;AACtB,SAAK,KAAK;AAAA,EACZ;AAGA,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,IAAI,WAAW,MAAM,aAAa,KAAK,GAAG,IAAI;AACpD,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK;AAE1D,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,OAAkB,CAAC,OAAO,oBAAoB,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAC5E,QAAI,OAAO,kBAAmB,MAAK,KAAK,OAAO,iBAAiB;AAChE,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,SAAS,QAAQ;AAEvB,QAAM,SAAS,YAAY,MAAM;AAC/B,cAAU,EAAE,MAAM,OAAO,iBAAiB,UAAU,gBAAgB,CAAC;AACrE,uBAAmB,UAAU;AAC7B,iBAAa,IAAI;AACjB,iBAAa,KAAK;AAClB,eAAW;AAAA,EACb,GAAG,CAAC,iBAAiB,UAAU,IAAI,CAAC;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gCAAgC,SAAS;AAAA,MACvD,6BAAyB;AAAA,MACzB,8BAA4B,QAAQ,SAAS;AAAA,MAC7C,OAAO;AAAA,MAGP;AAAA,6BAAC,SAAI,WAAU,gGACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,WAAW,mBAAmB,QAAQ,yBAAyB;AAAA,cACjE;AAAA,cACA,OAAO,WAAW,cAAc,QAAQ,oBAAoB;AAAA;AAAA,UAC9D;AAAA,UACA,qBAAC,UAAK,WAAU,qDACb;AAAA;AAAA,YACA,SAAS,CAAC,WAAW,YAAO;AAAA,aAC/B;AAAA,UACA,qBAAC,SAAI,WAAU,4CACZ;AAAA,yBAAa,CAAC,gBACb;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,UAAU;AAAA,gBAEhB,oBAAU;AAAA;AAAA,YACb;AAAA,YAED,CAAC,aAAa,aAAa,CAAC,SAC3B,oBAAC,UAAK,WAAU,kCAAiC,mBAAK;AAAA,YAEvD,WACC,oBAAC,UAAK,WAAU,wDAAuD,uBAAS,IAC9E,CAAC,eACH;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,KAAK,KAAK;AAAA,gBACzB,UAAU,UAAU,CAAC;AAAA,gBACrB,WAAW;AAAA,kBACT;AAAA,kBACA,UAAU,CAAC,QACP,gDACA;AAAA,gBACN;AAAA,gBACA,OAAM;AAAA,gBAEL;AAAA,2BACC,oBAAC,eAAY,WAAU,uBAAsB,IAE7C,oBAAC,YAAS,WAAU,UAAS;AAAA,kBAC7B;AAAA;AAAA;AAAA,YAEJ,IACE;AAAA,aACN;AAAA,WACF;AAAA,QAEC,eACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YAEL;AAAA,mCAAC,SAAI,WAAU,oDACb;AAAA,oCAAC,UAAK,WAAU,qCAAoC,sCAAwB;AAAA,gBAAQ;AAAA,gBAAI;AAAA,iBAE1F;AAAA,cACA,qBAAC,SAAI,WAAU,8CACZ;AAAA,2BACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,6BAAO;AAAA,oBACT;AAAA,oBACA,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED,IACE;AAAA,gBACH,cACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,KAAK,UAAU;AAAA,oBAC9B,UAAU;AAAA,oBACV,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED,IACE;AAAA,iBACN;AAAA;AAAA;AAAA,QACF,IACE;AAAA,QAGJ,oBAAC,SAAI,WAAU,gCACZ,mBACE,YACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,QAAQ,MAAM,KAAK,KAAK;AAAA;AAAA,QAC1B,IAEA,SACF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO,cAAc,UAAU,UAAU;AAAA,YACzC,UAAU,CAAC;AAAA,YACX;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,QAAO;AAAA,YACP,WAAU;AAAA,YACV,UAAU,WAAW,SAAY;AAAA;AAAA,QACnC,IAEC,WAAW,oBAAC,kBAAe,GAEhC;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,IAAM,aAAa;AAAA,EACjB,cAAc;AAAA,EACd,YAAY;AACd;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC,WAAW,CAAC,UAAU;AACpB,aAAK,MAAM,WAAW,MAAM,YAAY,MAAM,IAAI,YAAY,MAAM,KAAK;AACvE,gBAAM,eAAe;AACrB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,cAAW;AAAA,MACX,WAAU;AAAA;AAAA,EACZ;AAEJ;AAEA,SAAS,iBAAiB;AACxB,SAAO,oBAAC,SAAI,WAAU,oCAAmC,kCAAe;AAC1E;","names":[]}