@opengeni/react 4.2.1-canary.39642758903001 → 4.3.1

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 (693) hide show
  1. package/dist/app/app-state.js +27 -27
  2. package/dist/app/components/Composer.js +27 -26
  3. package/dist/app/components/agent/agent-capability-picker.js +5 -5
  4. package/dist/app/components/artifacts/artifact-library.js +19 -19
  5. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  6. package/dist/app/components/artifacts/inline-chat-image.js +31 -30
  7. package/dist/app/components/artifacts/retained-file-preview.js +35 -34
  8. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  9. package/dist/app/components/artifacts/site-audience.js +5 -5
  10. package/dist/app/components/artifacts/site-conversations.js +24 -22
  11. package/dist/app/components/artifacts/site-data.js +20 -20
  12. package/dist/app/components/artifacts/site-publishing.js +39 -39
  13. package/dist/app/components/artifacts/site-settings.js +48 -48
  14. package/dist/app/components/billing-class-mark.js +5 -5
  15. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  16. package/dist/app/components/capabilities/capability-logo-source.js +13 -12
  17. package/dist/app/components/capabilities/connection-account-picker.js +2 -2
  18. package/dist/app/components/capabilities/connector-tool-permissions.js +5 -5
  19. package/dist/app/components/capabilities/native-connect-setup.js +14 -13
  20. package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
  21. package/dist/app/components/capabilities/perform-capability-action.js +3 -3
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -14
  23. package/dist/app/components/capabilities/session-capability-card.js +78 -77
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
  26. package/dist/app/components/capabilities/session-github-card.js +25 -24
  27. package/dist/app/components/capabilities/session-machine-card.js +38 -38
  28. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  29. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  30. package/dist/app/components/command-menu/chat-switcher.d.ts +12 -0
  31. package/dist/app/components/command-menu/chat-switcher.js +142 -0
  32. package/dist/app/components/command-menu/chat-switcher.js.map +1 -0
  33. package/dist/app/components/command-menu/command-menu.d.ts +15 -0
  34. package/dist/app/components/command-menu/command-menu.js +812 -0
  35. package/dist/app/components/command-menu/command-menu.js.map +1 -0
  36. package/dist/app/components/command-menu/keycaps.d.ts +21 -0
  37. package/dist/app/components/command-menu/keycaps.js +12 -0
  38. package/dist/app/components/command-menu/shortcut-sheet.d.ts +12 -0
  39. package/dist/app/components/command-menu/shortcut-sheet.js +150 -0
  40. package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -0
  41. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  42. package/dist/app/components/composer-mobile-plus-panel.js +21 -21
  43. package/dist/app/components/composer-mobile-plus.js +3 -3
  44. package/dist/app/components/credit-required-gate.js +1 -1
  45. package/dist/app/components/credit-required-prompt.js +16 -16
  46. package/dist/app/components/credits/coupon-redeem.js +2 -2
  47. package/dist/app/components/credits/credit-refusal-notice.d.ts +18 -0
  48. package/dist/app/components/credits/credit-refusal-notice.js +17 -0
  49. package/dist/app/components/cross-slot-deep-link-recovery.js +1 -1
  50. package/dist/app/components/desktop/app-shots.js +6 -6
  51. package/dist/app/components/desktop/this-computer.js +4 -4
  52. package/dist/app/components/feedback.js +5 -5
  53. package/dist/app/components/follow-up-repository-menu-body.js +7 -7
  54. package/dist/app/components/follow-up-repository-picker.js +3 -3
  55. package/dist/app/components/github-app-connect-launcher.js +1 -1
  56. package/dist/app/components/knowledge/agent-learning-settings.js +6 -6
  57. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  58. package/dist/app/components/manual-repository-editor.js +2 -2
  59. package/dist/app/components/markdown.js +10 -9
  60. package/dist/app/components/message-context-pills.js +2 -2
  61. package/dist/app/components/models/models-ui.js +10 -10
  62. package/dist/app/components/pickers.js +10 -10
  63. package/dist/app/components/rail/rail-context.d.ts +6 -0
  64. package/dist/app/components/rail/rail-context.js +3 -3
  65. package/dist/app/components/rail/rail-sections.js +61 -55
  66. package/dist/app/components/rail/session-browse-order-controls.js +2 -2
  67. package/dist/app/components/rail/session-header.js +50 -36
  68. package/dist/app/components/rail/session-list.js +59 -52
  69. package/dist/app/components/rail/session-row-hover-details.js +25 -23
  70. package/dist/app/components/rail/session-shell.js +96 -91
  71. package/dist/app/components/repository-picker.js +7 -7
  72. package/dist/app/components/secrets/session-secrets-panel.js +4 -4
  73. package/dist/app/components/session/agent-configuration-panel.js +34 -34
  74. package/dist/app/components/session/banners.js +12 -11
  75. package/dist/app/components/session/codex-account-indicator.js +12 -12
  76. package/dist/app/components/session/composer-menu-radio.js +2 -2
  77. package/dist/app/components/session/conversation-find.js +1 -1
  78. package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
  79. package/dist/app/components/session/failed-session-banner.js +12 -12
  80. package/dist/app/components/session/human-input.js +48 -47
  81. package/dist/app/components/session/inspector.js +80 -79
  82. package/dist/app/components/session/inspector.js.map +1 -1
  83. package/dist/app/components/session/message-actions.js +5 -5
  84. package/dist/app/components/session/message-resource-attachments.js +21 -20
  85. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  86. package/dist/app/components/session/model-account-indicator.js +11 -11
  87. package/dist/app/components/session/model-context-inspector.js +2 -2
  88. package/dist/app/components/session/model-recovery-notice.js +3 -3
  89. package/dist/app/components/session/new-session-settings-menu.js +13 -13
  90. package/dist/app/components/session/sandbox-switcher.js +16 -16
  91. package/dist/app/components/session/sandbox-workspace.js +68 -67
  92. package/dist/app/components/session/search-markdown-highlight.js +11 -10
  93. package/dist/app/components/session/search-results-view.js +12 -11
  94. package/dist/app/components/session/session-admin-access.js +11 -11
  95. package/dist/app/components/session/session-retention.js +4 -4
  96. package/dist/app/components/session/session-search-dialog.d.ts +5 -0
  97. package/dist/app/components/session/session-search-dialog.js +22 -12
  98. package/dist/app/components/session/session-search-dialog.js.map +1 -1
  99. package/dist/app/components/session/session-skill-reviews.js +3 -3
  100. package/dist/app/components/session/session-tenancy-control.js +25 -25
  101. package/dist/app/components/session/session-usage-limit-section.js +9 -9
  102. package/dist/app/components/session/session-wait-status.js +11 -9
  103. package/dist/app/components/session/session-wait-status.js.map +1 -1
  104. package/dist/app/components/session/subagents.js +17 -15
  105. package/dist/app/components/session/subscription-account-menu.js +2 -2
  106. package/dist/app/components/session-connectors-menu-body.js +6 -6
  107. package/dist/app/components/settings/row-select.js +1 -1
  108. package/dist/app/components/transcription-settings.js +2 -2
  109. package/dist/app/components/ui/destructive-confirm.js +8 -8
  110. package/dist/app/components/usage/usage-entry.js +6 -6
  111. package/dist/app/components/workspace-composer-plus.js +22 -21
  112. package/dist/app/embed/session-app.js +264 -258
  113. package/dist/app/lib/actions/actions-provider.d.ts +30 -0
  114. package/dist/app/lib/actions/actions-provider.js +32 -0
  115. package/dist/app/lib/actions/chat-directory.d.ts +30 -0
  116. package/dist/app/lib/actions/chat-operations.d.ts +11 -0
  117. package/dist/app/lib/actions/chat-switcher.d.ts +31 -0
  118. package/dist/app/lib/actions/chords.d.ts +40 -0
  119. package/dist/app/lib/actions/events.d.ts +6 -0
  120. package/dist/app/lib/actions/rank.d.ts +17 -0
  121. package/dist/app/lib/actions/registry.d.ts +71 -0
  122. package/dist/app/lib/codex-usage-query.js +3 -3
  123. package/dist/app/lib/composer-connectors.js +14 -13
  124. package/dist/app/lib/console-text.js +2 -2
  125. package/dist/app/lib/credit-coverage.d.ts +21 -0
  126. package/dist/app/lib/credit-coverage.js +15 -0
  127. package/dist/app/lib/deployment-free-model.js +2 -2
  128. package/dist/app/lib/events.js +19 -18
  129. package/dist/app/lib/failed-session-copy.js +5 -5
  130. package/dist/app/lib/free-credit-gap.d.ts +9 -0
  131. package/dist/app/lib/free-credit-gap.js +4 -2
  132. package/dist/app/lib/integration-connect-analytics.d.ts +1 -1
  133. package/dist/app/lib/integration-connect-analytics.js +1 -1
  134. package/dist/app/lib/integration-connect-redirect.js +1 -1
  135. package/dist/app/lib/model-access-onboarding.js +4 -4
  136. package/dist/app/lib/model-policy.js +1 -1
  137. package/dist/app/lib/models-route.d.ts +6 -2
  138. package/dist/app/lib/models-route.js +6 -3
  139. package/dist/app/lib/models-route.js.map +1 -1
  140. package/dist/app/lib/move-chat-to-machine.js +3 -3
  141. package/dist/app/lib/session-branch-cache.js +15 -13
  142. package/dist/app/lib/session-create.js +2 -2
  143. package/dist/app/lib/session-group-pagination.js +15 -13
  144. package/dist/app/lib/session-hover-facts.js +16 -14
  145. package/dist/app/lib/session-model.js +3 -3
  146. package/dist/app/lib/session-rail.js +11 -9
  147. package/dist/app/lib/session-rename.js +3 -3
  148. package/dist/app/lib/session-search-route.d.ts +1 -1
  149. package/dist/app/lib/session-search-route.js +1 -1
  150. package/dist/app/lib/session-ui-features.d.ts +11 -3
  151. package/dist/app/lib/session-ui-features.js +1 -1
  152. package/dist/app/lib/sessions-group.js +15 -13
  153. package/dist/app/lib/turn-failure-analytics.js +7 -7
  154. package/dist/app/lib/unavailable-session-model.js +2 -2
  155. package/dist/app/lib/use-duplicate-site.js +2 -2
  156. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  157. package/dist/app/lib/use-workspace-machines.js +8 -8
  158. package/dist/app/lib/use-workspace-model-catalog.js +6 -6
  159. package/dist/app/lib/use-workspace-rigs.js +4 -4
  160. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  161. package/dist/app/lib/workspace-scope-context.js +4 -4
  162. package/dist/app/routes/artifacts.js +124 -122
  163. package/dist/app/routes/artifacts.js.map +1 -1
  164. package/dist/app/routes/retained-artifact.js +69 -68
  165. package/dist/app/routes/retained-artifact.js.map +1 -1
  166. package/dist/app/routes/session-unavailable.js +3 -3
  167. package/dist/app/routes/session.js +168 -166
  168. package/dist/app/routes/sessions-index-hydration.js +3 -3
  169. package/dist/app/routes/sessions-index.js +122 -116
  170. package/dist/artifacts-document.js +4 -4
  171. package/dist/artifacts-presentation.js +4 -4
  172. package/dist/artifacts-spreadsheet.js +4 -4
  173. package/dist/artifacts.js +39 -39
  174. package/dist/{browser-viewer-ZRFZX3VN.js → browser-viewer-HPUMK7UP.js} +7 -7
  175. package/dist/{chat-interactive-block-HUMYWVCK.js → chat-interactive-block-22PPECCT.js} +6 -6
  176. package/dist/{chunk-GVIQ7H62.js → chunk-2LUBBDZV.js} +5 -5
  177. package/dist/{chunk-SWWYYGQO.js → chunk-325C2TCI.js} +5 -2
  178. package/dist/chunk-325C2TCI.js.map +1 -0
  179. package/dist/{chunk-XMMVIY7B.js → chunk-3CCJWHQY.js} +2 -2
  180. package/dist/{chunk-XS2FZ6DX.js → chunk-3F5ZPIWI.js} +2 -2
  181. package/dist/{chunk-72US6QNB.js → chunk-3J2YZRY5.js} +2 -2
  182. package/dist/{chunk-D4YQF4E3.js → chunk-3SMJ2BIQ.js} +2 -2
  183. package/dist/{chunk-TBJINQXA.js → chunk-3WCYK36X.js} +17 -17
  184. package/dist/{chunk-WPCF34V6.js → chunk-3WG3CRL7.js} +14 -14
  185. package/dist/{chunk-JI5BYQKO.js → chunk-3X46PNBX.js} +14 -14
  186. package/dist/{chunk-UO36FC3S.js → chunk-46I7MMAL.js} +6 -2
  187. package/dist/chunk-46I7MMAL.js.map +1 -0
  188. package/dist/{chunk-PBK44WJC.js → chunk-4GJ37O6G.js} +2 -2
  189. package/dist/chunk-4IWBQUQU.js +152 -0
  190. package/dist/chunk-4IWBQUQU.js.map +1 -0
  191. package/dist/{chunk-LEXPBQ56.js → chunk-4SKJX3C4.js} +6 -6
  192. package/dist/{chunk-ZA6YD2LW.js → chunk-57SYK776.js} +2 -2
  193. package/dist/{chunk-22LBKJDE.js → chunk-5DIAN5GQ.js} +12 -12
  194. package/dist/{chunk-LJ3TDK2L.js → chunk-5FA455GR.js} +4 -4
  195. package/dist/{chunk-N2BEUKXT.js → chunk-5FBZDEHE.js} +228 -228
  196. package/dist/chunk-5FBZDEHE.js.map +1 -0
  197. package/dist/{chunk-YPR5INHV.js → chunk-5X3E2Z3D.js} +4 -4
  198. package/dist/{chunk-OXNWZTEU.js → chunk-5ZJCL6X4.js} +5 -5
  199. package/dist/{chunk-62OAZ4LO.js → chunk-6C5GQQMC.js} +12 -12
  200. package/dist/{chunk-VGITH57T.js → chunk-6ERTXDZM.js} +4 -4
  201. package/dist/{chunk-ZQ7XQZCF.js → chunk-6FX73Y4I.js} +8 -8
  202. package/dist/{chunk-QZO2KK2F.js → chunk-6P44NG6Y.js} +2 -2
  203. package/dist/{chunk-N2DDJLTM.js → chunk-6T7Y33JA.js} +3 -3
  204. package/dist/{chunk-RBAGC2MJ.js → chunk-75VE5QUS.js} +22 -22
  205. package/dist/{chunk-MRXOGI3O.js → chunk-77CUDSHG.js} +9 -9
  206. package/dist/{chunk-F2GXK2Z6.js → chunk-7G446JFO.js} +431 -348
  207. package/dist/chunk-7G446JFO.js.map +1 -0
  208. package/dist/{chunk-GZ65XQR5.js → chunk-7T7FHSGS.js} +3 -3
  209. package/dist/{chunk-YGAH34CD.js → chunk-A3S26JSP.js} +8 -8
  210. package/dist/{chunk-GYPAO6RS.js → chunk-A664GSDM.js} +8 -8
  211. package/dist/{chunk-JSZSNMDR.js → chunk-ASUYLXKO.js} +2 -2
  212. package/dist/{chunk-RTK7SUPL.js → chunk-AUUJLVA3.js} +7 -7
  213. package/dist/{chunk-OOTBYSCA.js → chunk-BBWKPNJB.js} +5 -5
  214. package/dist/{chunk-BGZIMIUU.js → chunk-BCUYWOQU.js} +2 -2
  215. package/dist/{chunk-EKN4N4LS.js → chunk-BDFMNJZJ.js} +2 -2
  216. package/dist/{chunk-YZKGOWCC.js → chunk-BIDXQAGO.js} +2 -2
  217. package/dist/{chunk-Q2UUANHF.js → chunk-BIKAJ4DY.js} +5 -5
  218. package/dist/{chunk-5IQBF2X3.js → chunk-BJPJ2OUX.js} +3 -3
  219. package/dist/{chunk-EY2EMHZW.js → chunk-BPM2OTYK.js} +8 -8
  220. package/dist/{chunk-MT4TBRQB.js → chunk-BSWS2RUZ.js} +2 -2
  221. package/dist/{chunk-T7YD3VGK.js → chunk-C52MNKXU.js} +12 -12
  222. package/dist/{chunk-THNW33K7.js → chunk-CEUDV4OA.js} +18 -18
  223. package/dist/{chunk-GRLPRM56.js → chunk-CFEFYPNR.js} +8 -2
  224. package/dist/chunk-CFEFYPNR.js.map +1 -0
  225. package/dist/{chunk-LHGIS6SZ.js → chunk-CVK74BH7.js} +2 -2
  226. package/dist/{chunk-DFO2UCYG.js → chunk-CW5I65ZX.js} +11 -11
  227. package/dist/chunk-DKNTQDVL.js +86 -0
  228. package/dist/chunk-DKNTQDVL.js.map +1 -0
  229. package/dist/{chunk-SKRLKQEG.js → chunk-DOSC2HRQ.js} +79 -79
  230. package/dist/{chunk-KVB6XDLP.js → chunk-DPJ2CWVN.js} +2 -2
  231. package/dist/{chunk-4J6V4DH7.js → chunk-DXMRO2MU.js} +3 -3
  232. package/dist/{chunk-42I4O4WQ.js → chunk-EE55IDDR.js} +26 -26
  233. package/dist/{chunk-2RA6XABP.js → chunk-EEERTLFF.js} +12 -12
  234. package/dist/{chunk-PTOTKUKO.js → chunk-EEO744XR.js} +8 -8
  235. package/dist/{chunk-LD3HVI2J.js → chunk-EMFGBAQL.js} +6 -6
  236. package/dist/{chunk-FQGUK4ST.js → chunk-ENPJKVMN.js} +38 -38
  237. package/dist/{chunk-HDHK3SXK.js → chunk-EU6RLHMP.js} +4 -4
  238. package/dist/{chunk-G7VLL3PG.js → chunk-F2YABPRJ.js} +13 -4
  239. package/dist/chunk-F2YABPRJ.js.map +1 -0
  240. package/dist/{chunk-MRUWRQBX.js → chunk-FET6XHGS.js} +2 -2
  241. package/dist/{chunk-M6KUY3YH.js → chunk-FIICQA55.js} +2 -2
  242. package/dist/{chunk-NLWLCYCT.js → chunk-FTZXCPE3.js} +19 -19
  243. package/dist/{chunk-FN2KA3MJ.js → chunk-FUS76DO4.js} +3 -3
  244. package/dist/{chunk-AM4IIPWI.js → chunk-G7N5NPRJ.js} +2 -2
  245. package/dist/{chunk-CCQ7YKOD.js → chunk-GBYZ6653.js} +2 -2
  246. package/dist/{chunk-SOOWLNC5.js → chunk-GJUPLSC5.js} +330 -109
  247. package/dist/chunk-GJUPLSC5.js.map +1 -0
  248. package/dist/{chunk-YKKVIJVX.js → chunk-GQDSC6QZ.js} +5 -5
  249. package/dist/chunk-GQGNRL2L.js +53 -0
  250. package/dist/chunk-GQGNRL2L.js.map +1 -0
  251. package/dist/{chunk-5X6JP75Q.js → chunk-GRSODLVO.js} +4 -4
  252. package/dist/{chunk-73YP3R5X.js → chunk-GSESCQFY.js} +4 -4
  253. package/dist/{chunk-KWB5U3ZT.js → chunk-GWRW4N3T.js} +199 -137
  254. package/dist/chunk-GWRW4N3T.js.map +1 -0
  255. package/dist/{chunk-RTR7RNG4.js → chunk-GYRU4PNM.js} +9 -7
  256. package/dist/{chunk-RTR7RNG4.js.map → chunk-GYRU4PNM.js.map} +1 -1
  257. package/dist/{chunk-MZLEBFUZ.js → chunk-GZD6VBIK.js} +3 -3
  258. package/dist/{chunk-IZR2QRFF.js → chunk-H3HH5AHS.js} +4 -4
  259. package/dist/{chunk-DN3TKURW.js → chunk-H3LIIAGE.js} +4 -54
  260. package/dist/chunk-H3LIIAGE.js.map +1 -0
  261. package/dist/{chunk-NPLEQMNM.js → chunk-H5GWAG4I.js} +7 -5
  262. package/dist/{chunk-NPLEQMNM.js.map → chunk-H5GWAG4I.js.map} +1 -1
  263. package/dist/{chunk-OJPUVUB6.js → chunk-HAOZCLLA.js} +3 -3
  264. package/dist/{chunk-ZBHDGAYL.js → chunk-HEFE4OZJ.js} +2 -2
  265. package/dist/{chunk-WTG34JVA.js → chunk-HI75UTI6.js} +2 -2
  266. package/dist/{chunk-OMBIG3NC.js → chunk-HM633ROV.js} +14 -14
  267. package/dist/{chunk-WDFZWSKD.js → chunk-HRIP4M6H.js} +3 -3
  268. package/dist/{chunk-A2BCW6CQ.js → chunk-HU2DRFFI.js} +3 -3
  269. package/dist/{chunk-PO35PBAB.js → chunk-HVH7FFJH.js} +2 -2
  270. package/dist/{chunk-EG7KNUF7.js → chunk-HYTXTKST.js} +18 -18
  271. package/dist/{chunk-TFHG75A4.js → chunk-I4XMDFUJ.js} +7 -7
  272. package/dist/{chunk-IZHVZZQA.js → chunk-ICAUYWSL.js} +9 -9
  273. package/dist/{chunk-ZSERYHHT.js → chunk-IDMXEPHL.js} +150 -150
  274. package/dist/chunk-IDMXEPHL.js.map +1 -0
  275. package/dist/{chunk-DCLPWYP3.js → chunk-IEVPJ3G6.js} +2 -2
  276. package/dist/{chunk-EVWZHDSF.js → chunk-IKH3VTA4.js} +2 -2
  277. package/dist/{chunk-L5UCO2UV.js → chunk-ILBSBZGC.js} +13 -4
  278. package/dist/chunk-ILBSBZGC.js.map +1 -0
  279. package/dist/{chunk-IO6K6UYJ.js → chunk-IQ64BNAG.js} +4 -2
  280. package/dist/chunk-IQ64BNAG.js.map +1 -0
  281. package/dist/{chunk-TYHLEFD2.js → chunk-IZJNMRIR.js} +9 -9
  282. package/dist/{chunk-D2SR3TEB.js → chunk-J243WGUA.js} +2 -2
  283. package/dist/{chunk-QGSGIYE3.js → chunk-J2C6LB6W.js} +4 -4
  284. package/dist/{chunk-MT6TRTXF.js → chunk-J5MEDX7C.js} +9 -9
  285. package/dist/{chunk-6QHUKBJP.js → chunk-J7SKOO44.js} +2 -2
  286. package/dist/{chunk-W2QK7PYS.js → chunk-JAAST75A.js} +11 -11
  287. package/dist/{chunk-NQCMS4AJ.js → chunk-JQCGPTZ6.js} +9 -9
  288. package/dist/chunk-JRJUSKDY.js +832 -0
  289. package/dist/chunk-JRJUSKDY.js.map +1 -0
  290. package/dist/{chunk-CMUXJHGH.js → chunk-JRSCWQMC.js} +9 -9
  291. package/dist/{chunk-Q4OHNGGB.js → chunk-JRXHSVD5.js} +4 -4
  292. package/dist/{chunk-SD2K5ZN5.js → chunk-JXYLDT6X.js} +4 -4
  293. package/dist/{chunk-S3M5WCZW.js → chunk-KA4LV7G6.js} +35 -50
  294. package/dist/chunk-KA4LV7G6.js.map +1 -0
  295. package/dist/{chunk-IXX6ZOL2.js → chunk-KGTMHEAP.js} +7 -7
  296. package/dist/{chunk-22OBGVEJ.js → chunk-KOXVGPW4.js} +3 -3
  297. package/dist/{chunk-NOZ5CGZE.js → chunk-L5GPPMUB.js} +2 -2
  298. package/dist/{chunk-KIHYJM5F.js → chunk-LXJT4WAW.js} +58 -58
  299. package/dist/{chunk-KIHYJM5F.js.map → chunk-LXJT4WAW.js.map} +1 -1
  300. package/dist/{chunk-4FOOHMTU.js → chunk-LY6727IF.js} +1 -1
  301. package/dist/{chunk-PT7MTXRE.js → chunk-MAOCN7J6.js} +2 -2
  302. package/dist/{chunk-4K2JSJNX.js → chunk-MB5LZVDO.js} +2 -2
  303. package/dist/chunk-MF464AKA.js +139 -0
  304. package/dist/chunk-MF464AKA.js.map +1 -0
  305. package/dist/{chunk-UYSZKDQY.js → chunk-MK54JLE4.js} +1 -1
  306. package/dist/chunk-MK54JLE4.js.map +1 -0
  307. package/dist/{chunk-5LES64PP.js → chunk-MKOQAVOE.js} +21 -21
  308. package/dist/{chunk-BMV2SNYX.js → chunk-MUPWNSEJ.js} +18 -18
  309. package/dist/{chunk-Y5TRG22C.js → chunk-NRXIECWC.js} +2 -2
  310. package/dist/{chunk-GOE7G5JX.js → chunk-NWSAF6P5.js} +2 -2
  311. package/dist/chunk-OB3YGXHQ.js +158 -0
  312. package/dist/chunk-OB3YGXHQ.js.map +1 -0
  313. package/dist/{chunk-DUM363VS.js → chunk-OFZQJNF6.js} +5 -5
  314. package/dist/{chunk-CKN5QPEL.js → chunk-OMF7POEY.js} +2 -2
  315. package/dist/{chunk-MVXKO2BD.js → chunk-OXD6ET34.js} +1 -1
  316. package/dist/{chunk-47JUEVME.js → chunk-PALX6HWV.js} +21 -21
  317. package/dist/{chunk-B6OGSG7I.js → chunk-PE3BLBDT.js} +3 -3
  318. package/dist/{chunk-RVISSNVE.js → chunk-PMZKJOG6.js} +15 -15
  319. package/dist/{chunk-CESAMXWX.js → chunk-PQUTMG3S.js} +2 -2
  320. package/dist/{chunk-7VFCOKPG.js → chunk-PWBGODZU.js} +3 -3
  321. package/dist/{chunk-MOPAXD2H.js → chunk-QCADUTYX.js} +2 -2
  322. package/dist/{chunk-CT5FBO7E.js → chunk-RPOUJI25.js} +1 -1
  323. package/dist/{chunk-VE3FKXJ7.js → chunk-RUSXEE7X.js} +35 -32
  324. package/dist/chunk-RUSXEE7X.js.map +1 -0
  325. package/dist/{chunk-WKHYOS72.js → chunk-RW4GFE56.js} +3 -3
  326. package/dist/{chunk-FH4GO7HO.js → chunk-RYLVVDR7.js} +1 -1
  327. package/dist/{chunk-QZRDCFHI.js → chunk-S66SBBFQ.js} +5 -5
  328. package/dist/{chunk-CQJFIPAH.js → chunk-S7TNV2I7.js} +14 -14
  329. package/dist/{chunk-ZBQSIGGR.js → chunk-SC773IMJ.js} +13 -13
  330. package/dist/{chunk-RZV7SXED.js → chunk-SF3M27AN.js} +37 -12
  331. package/dist/chunk-SF3M27AN.js.map +1 -0
  332. package/dist/{chunk-FBJ2HK7A.js → chunk-SGPJ3YS2.js} +20 -20
  333. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  334. package/dist/chunk-SWCLN6JE.js +40 -0
  335. package/dist/chunk-SWCLN6JE.js.map +1 -0
  336. package/dist/{chunk-OS3EQOIS.js → chunk-T4F5TW2X.js} +29 -24
  337. package/dist/chunk-T4F5TW2X.js.map +1 -0
  338. package/dist/{chunk-RKZWCTXV.js → chunk-TAEKDMEF.js} +2 -2
  339. package/dist/{chunk-6AVCAUGL.js → chunk-TASEV25T.js} +3 -3
  340. package/dist/{chunk-3XOISKZC.js → chunk-TLGDPMUX.js} +6 -6
  341. package/dist/{chunk-MOF3XSUM.js → chunk-TREHTIBD.js} +3 -2
  342. package/dist/chunk-TREHTIBD.js.map +1 -0
  343. package/dist/{chunk-HUQHJSPV.js → chunk-TTPXGD5S.js} +68 -33
  344. package/dist/chunk-TTPXGD5S.js.map +1 -0
  345. package/dist/{chunk-NFCYIZHX.js → chunk-TXIIBNCA.js} +7 -3
  346. package/dist/{chunk-NFCYIZHX.js.map → chunk-TXIIBNCA.js.map} +1 -1
  347. package/dist/{chunk-5IUW34PG.js → chunk-TY3QYPJ6.js} +7 -7
  348. package/dist/{chunk-VQFR4EU4.js → chunk-U3JK5VJV.js} +2 -2
  349. package/dist/{chunk-2AWMJO54.js → chunk-U42P3RMZ.js} +5 -5
  350. package/dist/{chunk-2RIUMV7S.js → chunk-UBIJBLUK.js} +234 -234
  351. package/dist/chunk-UBIJBLUK.js.map +1 -0
  352. package/dist/{chunk-GUU75DES.js → chunk-UEJTOPLW.js} +8 -8
  353. package/dist/{chunk-QWCTYLMD.js → chunk-URDONAEJ.js} +240 -204
  354. package/dist/chunk-URDONAEJ.js.map +1 -0
  355. package/dist/{chunk-OZOEWLGR.js → chunk-UT6JAORE.js} +4 -4
  356. package/dist/{chunk-5TELOQA6.js → chunk-UTHPUINA.js} +3 -3
  357. package/dist/{chunk-SOV7DTTU.js → chunk-V6HZ2HJZ.js} +67 -67
  358. package/dist/{chunk-SOV7DTTU.js.map → chunk-V6HZ2HJZ.js.map} +1 -1
  359. package/dist/{chunk-26RQ6JBR.js → chunk-VBVCNH6D.js} +5 -5
  360. package/dist/{chunk-P646DND6.js → chunk-VCMQPCME.js} +2 -2
  361. package/dist/{chunk-LV7FMIMM.js → chunk-VGUHAHHV.js} +2 -2
  362. package/dist/{chunk-GYVXARCY.js → chunk-VIBPFVU4.js} +41 -41
  363. package/dist/{chunk-KHPOKZ6Z.js → chunk-VMAC66JX.js} +6 -6
  364. package/dist/{chunk-SHKRS6I5.js → chunk-VRPNETPK.js} +3 -3
  365. package/dist/{chunk-6U4J6RVS.js → chunk-WCHW4XN7.js} +14 -14
  366. package/dist/{chunk-CJH6QUQJ.js → chunk-WD3UXNJV.js} +3 -3
  367. package/dist/{chunk-H5EVWF6L.js → chunk-WR67FJMX.js} +4 -4
  368. package/dist/{chunk-XLIJ36RG.js → chunk-WRMQ7EX4.js} +5 -5
  369. package/dist/{chunk-VVFWOBAM.js → chunk-WTJUKYB2.js} +15 -16
  370. package/dist/chunk-WTJUKYB2.js.map +1 -0
  371. package/dist/{chunk-7KLCFJ5G.js → chunk-X4PPGXQG.js} +2 -2
  372. package/dist/{chunk-ZE2JTVCQ.js → chunk-X5BMQXFD.js} +11 -11
  373. package/dist/{chunk-OYJY4Y4A.js → chunk-XFNLU7EW.js} +14 -7
  374. package/dist/chunk-XFNLU7EW.js.map +1 -0
  375. package/dist/{chunk-UECU6LZI.js → chunk-XXRBOSWV.js} +3 -3
  376. package/dist/{chunk-SPKAIDWX.js → chunk-XZEFCPBL.js} +2 -2
  377. package/dist/{chunk-EZ5NYRHK.js → chunk-YL6N7QLA.js} +5 -5
  378. package/dist/{chunk-Q2ZJOECN.js → chunk-YMVTIV5L.js} +19 -19
  379. package/dist/chunk-YMVTIV5L.js.map +1 -0
  380. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  381. package/dist/{chunk-AR62NQXE.js → chunk-Z2S5VQG7.js} +2 -2
  382. package/dist/{chunk-2MXUB3ZO.js → chunk-Z5OGTWMZ.js} +15 -2
  383. package/dist/chunk-Z5OGTWMZ.js.map +1 -0
  384. package/dist/{chunk-7UQJEADK.js → chunk-ZL2O4BYP.js} +2 -2
  385. package/dist/{chunk-FOOITLHR.js → chunk-ZZHBT5WQ.js} +2 -2
  386. package/dist/{chunk-X6VJQJYY.js → chunk-ZZWHKC6A.js} +3 -3
  387. package/dist/components/timeline-annotation-shared.d.ts +1 -9
  388. package/dist/composer-messages.js +2 -2
  389. package/dist/composer.js +15 -15
  390. package/dist/{computer-viewer-D4NHQB5D.js → computer-viewer-S6TE6TN7.js} +8 -8
  391. package/dist/connect.js +12 -11
  392. package/dist/desktop.js +2 -2
  393. package/dist/editor.js +2 -2
  394. package/dist/{embedded-new-voice-X4ZW6SY4.js → embedded-new-voice-ZDZPGX25.js} +8 -8
  395. package/dist/{embedded-voice-4OD6Z3HU.js → embedded-voice-FKCUXSJO.js} +8 -8
  396. package/dist/{fleet-decision-row-5UCJXTDP.js → fleet-decision-row-VCGWYJAV.js} +2 -2
  397. package/dist/hooks/page-wake.d.ts +21 -0
  398. package/dist/hooks/use-session-events.d.ts +1 -0
  399. package/dist/index.js +206 -205
  400. package/dist/interaction.js +9 -9
  401. package/dist/{latest-question-VGVNUGAU.js → latest-question-SINEV4U6.js} +3 -3
  402. package/dist/lib/format.d.ts +3 -2
  403. package/dist/machines.js +6 -6
  404. package/dist/messages/en.d.ts +12 -3
  405. package/dist/messages.js +1 -1
  406. package/dist/model-picker-model.js +2 -2
  407. package/dist/{model-policy-picker-menu-XOPYY6YA.js → model-policy-picker-menu-66JPM3G5.js} +6 -6
  408. package/dist/model-policy-picker-menu-66JPM3G5.js.map +1 -0
  409. package/dist/model-policy.js +1 -1
  410. package/dist/native-previews.js +3 -3
  411. package/dist/{platform-activity-row-56XOVTRA.js → platform-activity-row-LU5WABI2.js} +2 -2
  412. package/dist/{queue-surface-implementation-OZDOBJ6W.js → queue-surface-implementation-Y4OUVS7N.js} +8 -7
  413. package/dist/{queue-surface-implementation-OZDOBJ6W.js.map → queue-surface-implementation-Y4OUVS7N.js.map} +1 -1
  414. package/dist/realtime.js +7 -7
  415. package/dist/{sandbox-files-LJCR437H.js → sandbox-files-NBIVKVCZ.js} +11 -11
  416. package/dist/sandbox-files-NBIVKVCZ.js.map +1 -0
  417. package/dist/session-app.js +266 -260
  418. package/dist/session-list-model.js +3 -3
  419. package/dist/{session-realtime-UISLBZ4A.js → session-realtime-3PALSNMJ.js} +3 -3
  420. package/dist/session-realtime-3PALSNMJ.js.map +1 -0
  421. package/dist/session-realtime.js +2 -2
  422. package/dist/session-ui.js +62 -61
  423. package/dist/session.d.ts +1 -1
  424. package/dist/session.js +17 -17
  425. package/dist/sites.js +2 -2
  426. package/dist/terminal.js +2 -2
  427. package/dist/this-computer.js +3 -3
  428. package/dist/timeline/annotation-model.d.ts +48 -0
  429. package/dist/{timeline-annotation-markers-ACT7XRMW.js → timeline-annotation-markers-6526H2NM.js} +11 -9
  430. package/dist/{timeline-annotation-markers-ACT7XRMW.js.map → timeline-annotation-markers-6526H2NM.js.map} +1 -1
  431. package/dist/{timeline-annotation-selection-2IA7T5VR.js → timeline-annotation-selection-KV5SM6TA.js} +16 -62
  432. package/dist/timeline-annotation-selection-KV5SM6TA.js.map +1 -0
  433. package/dist/{timeline-annotations-dialog-W5B2HMYY.js → timeline-annotations-dialog-7CDHWC7Y.js} +12 -10
  434. package/dist/{timeline-annotations-dialog-W5B2HMYY.js.map → timeline-annotations-dialog-7CDHWC7Y.js.map} +1 -1
  435. package/dist/timeline-model.d.ts +3 -0
  436. package/dist/timeline-model.js +40 -14
  437. package/dist/ui/access-list.js +24 -24
  438. package/dist/ui/choice-cards.js +2 -2
  439. package/dist/ui/composer-menu-action.js +2 -2
  440. package/dist/ui/context-menu.d.ts +3 -1
  441. package/dist/ui/context-menu.js +3 -1
  442. package/dist/ui/detail-page.js +3 -3
  443. package/dist/ui/detail-sheet.js +3 -3
  444. package/dist/ui/diff-view.js +3 -3
  445. package/dist/ui/disclosure.js +5 -5
  446. package/dist/ui/dropdown-menu.js +1 -1
  447. package/dist/ui/flush-form-page.js +5 -5
  448. package/dist/ui/form-dialog.js +4 -4
  449. package/dist/ui/list-row.js +5 -5
  450. package/dist/ui/load-failure.js +3 -3
  451. package/dist/ui/page-actions.js +3 -3
  452. package/dist/ui/revision-history.js +11 -11
  453. package/dist/ui/role-select.js +8 -8
  454. package/dist/ui/segmented-control.js +1 -1
  455. package/dist/ui/settings-nav.js +3 -3
  456. package/dist/ui/toolbar.js +3 -3
  457. package/dist/usage.js +2 -2
  458. package/dist/workbench.js +11 -11
  459. package/package.json +4 -4
  460. package/src/app/app-state.tsx +2 -1
  461. package/src/app/components/command-menu/chat-switcher.tsx +135 -0
  462. package/src/app/components/command-menu/command-menu.tsx +840 -0
  463. package/src/app/components/command-menu/keycaps.tsx +56 -0
  464. package/src/app/components/command-menu/shortcut-sheet.tsx +155 -0
  465. package/src/app/components/credits/credit-refusal-notice.test.tsx +132 -0
  466. package/src/app/components/credits/credit-refusal-notice.tsx +92 -0
  467. package/src/app/components/rail/rail-context.tsx +28 -5
  468. package/src/app/components/rail/rail-sections.tsx +3 -5
  469. package/src/app/components/rail/session-header-mute.test.tsx +23 -1
  470. package/src/app/components/rail/session-header.test.tsx +21 -2
  471. package/src/app/components/rail/session-header.tsx +31 -1
  472. package/src/app/components/rail/session-list.tsx +89 -16
  473. package/src/app/components/rail/session-shell.tsx +0 -14
  474. package/src/app/components/session/session-search-dialog.tsx +12 -1
  475. package/src/app/embed/session-app.tsx +6 -3
  476. package/src/app/lib/actions/actions-provider.tsx +486 -0
  477. package/src/app/lib/actions/actions.test.ts +249 -0
  478. package/src/app/lib/actions/chat-directory.ts +231 -0
  479. package/src/app/lib/actions/chat-operations.ts +145 -0
  480. package/src/app/lib/actions/chat-switcher.ts +62 -0
  481. package/src/app/lib/actions/chords.ts +185 -0
  482. package/src/app/lib/actions/events.ts +10 -0
  483. package/src/app/lib/actions/rank.ts +119 -0
  484. package/src/app/lib/actions/registry.ts +333 -0
  485. package/src/app/lib/credit-coverage.test.ts +83 -0
  486. package/src/app/lib/credit-coverage.tsx +48 -0
  487. package/src/app/lib/free-credit-gap.test.ts +32 -1
  488. package/src/app/lib/free-credit-gap.tsx +32 -2
  489. package/src/app/lib/integration-connect-analytics.test.ts +1 -0
  490. package/src/app/lib/integration-connect-analytics.tsx +4 -0
  491. package/src/app/lib/models-route.test.ts +18 -0
  492. package/src/app/lib/models-route.tsx +26 -4
  493. package/src/app/lib/session-search-route.tsx +6 -1
  494. package/src/app/lib/session-ui-features.tsx +28 -9
  495. package/src/app/routes/session.tsx +74 -16
  496. package/src/app/routes/sessions-index.tsx +83 -4
  497. package/src/components/timeline-annotation-selection.tsx +9 -64
  498. package/src/components/timeline-annotation-shared.ts +9 -57
  499. package/src/hooks/page-wake.ts +80 -0
  500. package/src/hooks/use-session-events.ts +309 -81
  501. package/src/lib/format.ts +3 -2
  502. package/src/messages/en.ts +13 -3
  503. package/src/model-picker-model.ts +3 -0
  504. package/src/model-policy.ts +9 -1
  505. package/src/session.ts +1 -0
  506. package/src/timeline/annotation-model.ts +217 -0
  507. package/src/timeline/projection.ts +27 -21
  508. package/src/timeline-model.ts +14 -0
  509. package/src/ui/context-menu.tsx +16 -0
  510. package/src/ui/dropdown-menu.tsx +4 -1
  511. package/src/ui/segmented-control.tsx +3 -0
  512. package/styles/compiled.css +92 -0
  513. package/dist/app/lib/keyboard-shortcuts.d.ts +0 -51
  514. package/dist/app/lib/keyboard-shortcuts.js +0 -16
  515. package/dist/chunk-2MXUB3ZO.js.map +0 -1
  516. package/dist/chunk-2RIUMV7S.js.map +0 -1
  517. package/dist/chunk-53IXIUYP.js +0 -39
  518. package/dist/chunk-53IXIUYP.js.map +0 -1
  519. package/dist/chunk-DN3TKURW.js.map +0 -1
  520. package/dist/chunk-F2GXK2Z6.js.map +0 -1
  521. package/dist/chunk-G7VLL3PG.js.map +0 -1
  522. package/dist/chunk-GRLPRM56.js.map +0 -1
  523. package/dist/chunk-HUQHJSPV.js.map +0 -1
  524. package/dist/chunk-IO6K6UYJ.js.map +0 -1
  525. package/dist/chunk-KWB5U3ZT.js.map +0 -1
  526. package/dist/chunk-L5UCO2UV.js.map +0 -1
  527. package/dist/chunk-MOF3XSUM.js.map +0 -1
  528. package/dist/chunk-N2BEUKXT.js.map +0 -1
  529. package/dist/chunk-OS3EQOIS.js.map +0 -1
  530. package/dist/chunk-OYJY4Y4A.js.map +0 -1
  531. package/dist/chunk-Q2ZJOECN.js.map +0 -1
  532. package/dist/chunk-QWCTYLMD.js.map +0 -1
  533. package/dist/chunk-RZV7SXED.js.map +0 -1
  534. package/dist/chunk-S3M5WCZW.js.map +0 -1
  535. package/dist/chunk-SOOWLNC5.js.map +0 -1
  536. package/dist/chunk-SWWYYGQO.js.map +0 -1
  537. package/dist/chunk-UO36FC3S.js.map +0 -1
  538. package/dist/chunk-UYSZKDQY.js.map +0 -1
  539. package/dist/chunk-VE3FKXJ7.js.map +0 -1
  540. package/dist/chunk-VVFWOBAM.js.map +0 -1
  541. package/dist/chunk-ZSERYHHT.js.map +0 -1
  542. package/dist/timeline-annotation-selection-2IA7T5VR.js.map +0 -1
  543. package/src/app/lib/keyboard-shortcuts.test.ts +0 -47
  544. package/src/app/lib/keyboard-shortcuts.tsx +0 -58
  545. /package/dist/app/{lib/keyboard-shortcuts.js.map → components/command-menu/keycaps.js.map} +0 -0
  546. /package/dist/{browser-viewer-ZRFZX3VN.js.map → app/components/credits/credit-refusal-notice.js.map} +0 -0
  547. /package/dist/{chat-interactive-block-HUMYWVCK.js.map → app/lib/actions/actions-provider.js.map} +0 -0
  548. /package/dist/{computer-viewer-D4NHQB5D.js.map → app/lib/credit-coverage.js.map} +0 -0
  549. /package/dist/{embedded-new-voice-X4ZW6SY4.js.map → browser-viewer-HPUMK7UP.js.map} +0 -0
  550. /package/dist/{embedded-voice-4OD6Z3HU.js.map → chat-interactive-block-22PPECCT.js.map} +0 -0
  551. /package/dist/{chunk-GVIQ7H62.js.map → chunk-2LUBBDZV.js.map} +0 -0
  552. /package/dist/{chunk-XMMVIY7B.js.map → chunk-3CCJWHQY.js.map} +0 -0
  553. /package/dist/{chunk-XS2FZ6DX.js.map → chunk-3F5ZPIWI.js.map} +0 -0
  554. /package/dist/{chunk-72US6QNB.js.map → chunk-3J2YZRY5.js.map} +0 -0
  555. /package/dist/{chunk-D4YQF4E3.js.map → chunk-3SMJ2BIQ.js.map} +0 -0
  556. /package/dist/{chunk-TBJINQXA.js.map → chunk-3WCYK36X.js.map} +0 -0
  557. /package/dist/{chunk-WPCF34V6.js.map → chunk-3WG3CRL7.js.map} +0 -0
  558. /package/dist/{chunk-JI5BYQKO.js.map → chunk-3X46PNBX.js.map} +0 -0
  559. /package/dist/{chunk-PBK44WJC.js.map → chunk-4GJ37O6G.js.map} +0 -0
  560. /package/dist/{chunk-LEXPBQ56.js.map → chunk-4SKJX3C4.js.map} +0 -0
  561. /package/dist/{chunk-ZA6YD2LW.js.map → chunk-57SYK776.js.map} +0 -0
  562. /package/dist/{chunk-22LBKJDE.js.map → chunk-5DIAN5GQ.js.map} +0 -0
  563. /package/dist/{chunk-LJ3TDK2L.js.map → chunk-5FA455GR.js.map} +0 -0
  564. /package/dist/{chunk-YPR5INHV.js.map → chunk-5X3E2Z3D.js.map} +0 -0
  565. /package/dist/{chunk-OXNWZTEU.js.map → chunk-5ZJCL6X4.js.map} +0 -0
  566. /package/dist/{chunk-62OAZ4LO.js.map → chunk-6C5GQQMC.js.map} +0 -0
  567. /package/dist/{chunk-VGITH57T.js.map → chunk-6ERTXDZM.js.map} +0 -0
  568. /package/dist/{chunk-ZQ7XQZCF.js.map → chunk-6FX73Y4I.js.map} +0 -0
  569. /package/dist/{chunk-QZO2KK2F.js.map → chunk-6P44NG6Y.js.map} +0 -0
  570. /package/dist/{chunk-N2DDJLTM.js.map → chunk-6T7Y33JA.js.map} +0 -0
  571. /package/dist/{chunk-RBAGC2MJ.js.map → chunk-75VE5QUS.js.map} +0 -0
  572. /package/dist/{chunk-MRXOGI3O.js.map → chunk-77CUDSHG.js.map} +0 -0
  573. /package/dist/{chunk-GZ65XQR5.js.map → chunk-7T7FHSGS.js.map} +0 -0
  574. /package/dist/{chunk-YGAH34CD.js.map → chunk-A3S26JSP.js.map} +0 -0
  575. /package/dist/{chunk-GYPAO6RS.js.map → chunk-A664GSDM.js.map} +0 -0
  576. /package/dist/{chunk-JSZSNMDR.js.map → chunk-ASUYLXKO.js.map} +0 -0
  577. /package/dist/{chunk-RTK7SUPL.js.map → chunk-AUUJLVA3.js.map} +0 -0
  578. /package/dist/{chunk-OOTBYSCA.js.map → chunk-BBWKPNJB.js.map} +0 -0
  579. /package/dist/{chunk-BGZIMIUU.js.map → chunk-BCUYWOQU.js.map} +0 -0
  580. /package/dist/{chunk-EKN4N4LS.js.map → chunk-BDFMNJZJ.js.map} +0 -0
  581. /package/dist/{chunk-YZKGOWCC.js.map → chunk-BIDXQAGO.js.map} +0 -0
  582. /package/dist/{chunk-Q2UUANHF.js.map → chunk-BIKAJ4DY.js.map} +0 -0
  583. /package/dist/{chunk-5IQBF2X3.js.map → chunk-BJPJ2OUX.js.map} +0 -0
  584. /package/dist/{chunk-EY2EMHZW.js.map → chunk-BPM2OTYK.js.map} +0 -0
  585. /package/dist/{chunk-MT4TBRQB.js.map → chunk-BSWS2RUZ.js.map} +0 -0
  586. /package/dist/{chunk-T7YD3VGK.js.map → chunk-C52MNKXU.js.map} +0 -0
  587. /package/dist/{chunk-THNW33K7.js.map → chunk-CEUDV4OA.js.map} +0 -0
  588. /package/dist/{chunk-LHGIS6SZ.js.map → chunk-CVK74BH7.js.map} +0 -0
  589. /package/dist/{chunk-DFO2UCYG.js.map → chunk-CW5I65ZX.js.map} +0 -0
  590. /package/dist/{chunk-SKRLKQEG.js.map → chunk-DOSC2HRQ.js.map} +0 -0
  591. /package/dist/{chunk-KVB6XDLP.js.map → chunk-DPJ2CWVN.js.map} +0 -0
  592. /package/dist/{chunk-4J6V4DH7.js.map → chunk-DXMRO2MU.js.map} +0 -0
  593. /package/dist/{chunk-42I4O4WQ.js.map → chunk-EE55IDDR.js.map} +0 -0
  594. /package/dist/{chunk-2RA6XABP.js.map → chunk-EEERTLFF.js.map} +0 -0
  595. /package/dist/{chunk-PTOTKUKO.js.map → chunk-EEO744XR.js.map} +0 -0
  596. /package/dist/{chunk-LD3HVI2J.js.map → chunk-EMFGBAQL.js.map} +0 -0
  597. /package/dist/{chunk-FQGUK4ST.js.map → chunk-ENPJKVMN.js.map} +0 -0
  598. /package/dist/{chunk-HDHK3SXK.js.map → chunk-EU6RLHMP.js.map} +0 -0
  599. /package/dist/{chunk-MRUWRQBX.js.map → chunk-FET6XHGS.js.map} +0 -0
  600. /package/dist/{chunk-M6KUY3YH.js.map → chunk-FIICQA55.js.map} +0 -0
  601. /package/dist/{chunk-NLWLCYCT.js.map → chunk-FTZXCPE3.js.map} +0 -0
  602. /package/dist/{chunk-FN2KA3MJ.js.map → chunk-FUS76DO4.js.map} +0 -0
  603. /package/dist/{chunk-AM4IIPWI.js.map → chunk-G7N5NPRJ.js.map} +0 -0
  604. /package/dist/{chunk-CCQ7YKOD.js.map → chunk-GBYZ6653.js.map} +0 -0
  605. /package/dist/{chunk-YKKVIJVX.js.map → chunk-GQDSC6QZ.js.map} +0 -0
  606. /package/dist/{chunk-5X6JP75Q.js.map → chunk-GRSODLVO.js.map} +0 -0
  607. /package/dist/{chunk-73YP3R5X.js.map → chunk-GSESCQFY.js.map} +0 -0
  608. /package/dist/{chunk-MZLEBFUZ.js.map → chunk-GZD6VBIK.js.map} +0 -0
  609. /package/dist/{chunk-IZR2QRFF.js.map → chunk-H3HH5AHS.js.map} +0 -0
  610. /package/dist/{chunk-OJPUVUB6.js.map → chunk-HAOZCLLA.js.map} +0 -0
  611. /package/dist/{chunk-ZBHDGAYL.js.map → chunk-HEFE4OZJ.js.map} +0 -0
  612. /package/dist/{chunk-WTG34JVA.js.map → chunk-HI75UTI6.js.map} +0 -0
  613. /package/dist/{chunk-OMBIG3NC.js.map → chunk-HM633ROV.js.map} +0 -0
  614. /package/dist/{chunk-WDFZWSKD.js.map → chunk-HRIP4M6H.js.map} +0 -0
  615. /package/dist/{chunk-A2BCW6CQ.js.map → chunk-HU2DRFFI.js.map} +0 -0
  616. /package/dist/{chunk-PO35PBAB.js.map → chunk-HVH7FFJH.js.map} +0 -0
  617. /package/dist/{chunk-EG7KNUF7.js.map → chunk-HYTXTKST.js.map} +0 -0
  618. /package/dist/{chunk-TFHG75A4.js.map → chunk-I4XMDFUJ.js.map} +0 -0
  619. /package/dist/{chunk-IZHVZZQA.js.map → chunk-ICAUYWSL.js.map} +0 -0
  620. /package/dist/{chunk-DCLPWYP3.js.map → chunk-IEVPJ3G6.js.map} +0 -0
  621. /package/dist/{chunk-EVWZHDSF.js.map → chunk-IKH3VTA4.js.map} +0 -0
  622. /package/dist/{chunk-TYHLEFD2.js.map → chunk-IZJNMRIR.js.map} +0 -0
  623. /package/dist/{chunk-D2SR3TEB.js.map → chunk-J243WGUA.js.map} +0 -0
  624. /package/dist/{chunk-QGSGIYE3.js.map → chunk-J2C6LB6W.js.map} +0 -0
  625. /package/dist/{chunk-MT6TRTXF.js.map → chunk-J5MEDX7C.js.map} +0 -0
  626. /package/dist/{chunk-6QHUKBJP.js.map → chunk-J7SKOO44.js.map} +0 -0
  627. /package/dist/{chunk-W2QK7PYS.js.map → chunk-JAAST75A.js.map} +0 -0
  628. /package/dist/{chunk-NQCMS4AJ.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  629. /package/dist/{chunk-CMUXJHGH.js.map → chunk-JRSCWQMC.js.map} +0 -0
  630. /package/dist/{chunk-Q4OHNGGB.js.map → chunk-JRXHSVD5.js.map} +0 -0
  631. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-JXYLDT6X.js.map} +0 -0
  632. /package/dist/{chunk-IXX6ZOL2.js.map → chunk-KGTMHEAP.js.map} +0 -0
  633. /package/dist/{chunk-22OBGVEJ.js.map → chunk-KOXVGPW4.js.map} +0 -0
  634. /package/dist/{chunk-NOZ5CGZE.js.map → chunk-L5GPPMUB.js.map} +0 -0
  635. /package/dist/{chunk-4FOOHMTU.js.map → chunk-LY6727IF.js.map} +0 -0
  636. /package/dist/{chunk-PT7MTXRE.js.map → chunk-MAOCN7J6.js.map} +0 -0
  637. /package/dist/{chunk-4K2JSJNX.js.map → chunk-MB5LZVDO.js.map} +0 -0
  638. /package/dist/{chunk-5LES64PP.js.map → chunk-MKOQAVOE.js.map} +0 -0
  639. /package/dist/{chunk-BMV2SNYX.js.map → chunk-MUPWNSEJ.js.map} +0 -0
  640. /package/dist/{chunk-Y5TRG22C.js.map → chunk-NRXIECWC.js.map} +0 -0
  641. /package/dist/{chunk-GOE7G5JX.js.map → chunk-NWSAF6P5.js.map} +0 -0
  642. /package/dist/{chunk-DUM363VS.js.map → chunk-OFZQJNF6.js.map} +0 -0
  643. /package/dist/{chunk-CKN5QPEL.js.map → chunk-OMF7POEY.js.map} +0 -0
  644. /package/dist/{chunk-MVXKO2BD.js.map → chunk-OXD6ET34.js.map} +0 -0
  645. /package/dist/{chunk-47JUEVME.js.map → chunk-PALX6HWV.js.map} +0 -0
  646. /package/dist/{chunk-B6OGSG7I.js.map → chunk-PE3BLBDT.js.map} +0 -0
  647. /package/dist/{chunk-RVISSNVE.js.map → chunk-PMZKJOG6.js.map} +0 -0
  648. /package/dist/{chunk-CESAMXWX.js.map → chunk-PQUTMG3S.js.map} +0 -0
  649. /package/dist/{chunk-7VFCOKPG.js.map → chunk-PWBGODZU.js.map} +0 -0
  650. /package/dist/{chunk-MOPAXD2H.js.map → chunk-QCADUTYX.js.map} +0 -0
  651. /package/dist/{chunk-CT5FBO7E.js.map → chunk-RPOUJI25.js.map} +0 -0
  652. /package/dist/{chunk-WKHYOS72.js.map → chunk-RW4GFE56.js.map} +0 -0
  653. /package/dist/{chunk-FH4GO7HO.js.map → chunk-RYLVVDR7.js.map} +0 -0
  654. /package/dist/{chunk-QZRDCFHI.js.map → chunk-S66SBBFQ.js.map} +0 -0
  655. /package/dist/{chunk-CQJFIPAH.js.map → chunk-S7TNV2I7.js.map} +0 -0
  656. /package/dist/{chunk-ZBQSIGGR.js.map → chunk-SC773IMJ.js.map} +0 -0
  657. /package/dist/{chunk-FBJ2HK7A.js.map → chunk-SGPJ3YS2.js.map} +0 -0
  658. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  659. /package/dist/{chunk-RKZWCTXV.js.map → chunk-TAEKDMEF.js.map} +0 -0
  660. /package/dist/{chunk-6AVCAUGL.js.map → chunk-TASEV25T.js.map} +0 -0
  661. /package/dist/{chunk-3XOISKZC.js.map → chunk-TLGDPMUX.js.map} +0 -0
  662. /package/dist/{chunk-5IUW34PG.js.map → chunk-TY3QYPJ6.js.map} +0 -0
  663. /package/dist/{chunk-VQFR4EU4.js.map → chunk-U3JK5VJV.js.map} +0 -0
  664. /package/dist/{chunk-2AWMJO54.js.map → chunk-U42P3RMZ.js.map} +0 -0
  665. /package/dist/{chunk-GUU75DES.js.map → chunk-UEJTOPLW.js.map} +0 -0
  666. /package/dist/{chunk-OZOEWLGR.js.map → chunk-UT6JAORE.js.map} +0 -0
  667. /package/dist/{chunk-5TELOQA6.js.map → chunk-UTHPUINA.js.map} +0 -0
  668. /package/dist/{chunk-26RQ6JBR.js.map → chunk-VBVCNH6D.js.map} +0 -0
  669. /package/dist/{chunk-P646DND6.js.map → chunk-VCMQPCME.js.map} +0 -0
  670. /package/dist/{chunk-LV7FMIMM.js.map → chunk-VGUHAHHV.js.map} +0 -0
  671. /package/dist/{chunk-GYVXARCY.js.map → chunk-VIBPFVU4.js.map} +0 -0
  672. /package/dist/{chunk-KHPOKZ6Z.js.map → chunk-VMAC66JX.js.map} +0 -0
  673. /package/dist/{chunk-SHKRS6I5.js.map → chunk-VRPNETPK.js.map} +0 -0
  674. /package/dist/{chunk-6U4J6RVS.js.map → chunk-WCHW4XN7.js.map} +0 -0
  675. /package/dist/{chunk-CJH6QUQJ.js.map → chunk-WD3UXNJV.js.map} +0 -0
  676. /package/dist/{chunk-H5EVWF6L.js.map → chunk-WR67FJMX.js.map} +0 -0
  677. /package/dist/{chunk-XLIJ36RG.js.map → chunk-WRMQ7EX4.js.map} +0 -0
  678. /package/dist/{chunk-7KLCFJ5G.js.map → chunk-X4PPGXQG.js.map} +0 -0
  679. /package/dist/{chunk-ZE2JTVCQ.js.map → chunk-X5BMQXFD.js.map} +0 -0
  680. /package/dist/{chunk-UECU6LZI.js.map → chunk-XXRBOSWV.js.map} +0 -0
  681. /package/dist/{chunk-SPKAIDWX.js.map → chunk-XZEFCPBL.js.map} +0 -0
  682. /package/dist/{chunk-EZ5NYRHK.js.map → chunk-YL6N7QLA.js.map} +0 -0
  683. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  684. /package/dist/{chunk-AR62NQXE.js.map → chunk-Z2S5VQG7.js.map} +0 -0
  685. /package/dist/{chunk-7UQJEADK.js.map → chunk-ZL2O4BYP.js.map} +0 -0
  686. /package/dist/{chunk-FOOITLHR.js.map → chunk-ZZHBT5WQ.js.map} +0 -0
  687. /package/dist/{chunk-X6VJQJYY.js.map → chunk-ZZWHKC6A.js.map} +0 -0
  688. /package/dist/{model-policy-picker-menu-XOPYY6YA.js.map → computer-viewer-S6TE6TN7.js.map} +0 -0
  689. /package/dist/{sandbox-files-LJCR437H.js.map → embedded-new-voice-ZDZPGX25.js.map} +0 -0
  690. /package/dist/{session-realtime-UISLBZ4A.js.map → embedded-voice-FKCUXSJO.js.map} +0 -0
  691. /package/dist/{fleet-decision-row-5UCJXTDP.js.map → fleet-decision-row-VCGWYJAV.js.map} +0 -0
  692. /package/dist/{latest-question-VGVNUGAU.js.map → latest-question-SINEV4U6.js.map} +0 -0
  693. /package/dist/{platform-activity-row-56XOVTRA.js.map → platform-activity-row-LU5WABI2.js.map} +0 -0
@@ -60,4 +60,4 @@ export {
60
60
  parseNotificationText,
61
61
  notificationPlainText
62
62
  };
63
- //# sourceMappingURL=chunk-4FOOHMTU.js.map
63
+ //# sourceMappingURL=chunk-LY6727IF.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  createOpenGeniText
4
- } from "./chunk-G7VLL3PG.js";
4
+ } from "./chunk-F2YABPRJ.js";
5
5
 
6
6
  // src/app/lib/console-text.tsx
7
7
  var t = createOpenGeniText();
@@ -9,4 +9,4 @@ var t = createOpenGeniText();
9
9
  export {
10
10
  t
11
11
  };
12
- //# sourceMappingURL=chunk-PT7MTXRE.js.map
12
+ //# sourceMappingURL=chunk-MAOCN7J6.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-IOYHDEP3.js";
5
5
  import {
6
6
  useOpenGeniText
7
- } from "./chunk-G7VLL3PG.js";
7
+ } from "./chunk-F2YABPRJ.js";
8
8
 
9
9
  // src/components/artifacts/published-html-artifact-frame.tsx
10
10
  import {
@@ -381,4 +381,4 @@ export {
381
381
  SiteList,
382
382
  SiteDetail
383
383
  };
384
- //# sourceMappingURL=chunk-4K2JSJNX.js.map
384
+ //# sourceMappingURL=chunk-MB5LZVDO.js.map
@@ -0,0 +1,139 @@
1
+ "use client";
2
+
3
+ // src/app/lib/actions/chords.ts
4
+ function currentPlatform() {
5
+ if (typeof navigator === "undefined") return "other";
6
+ const uaData = navigator.userAgentData;
7
+ const platform = uaData?.platform ?? navigator.platform ?? "";
8
+ return /Mac|iPhone|iPad|iPod/i.test(platform) ? "mac" : "other";
9
+ }
10
+ function applicableChords(chords, surface, platform) {
11
+ return (chords ?? []).filter(
12
+ (chord) => (!chord.only || chord.only === surface) && (!chord.platform || chord.platform === platform)
13
+ );
14
+ }
15
+ function matchesChord(event, chord, platform) {
16
+ if (event.repeat || event.isComposing) return false;
17
+ if (event.code === chord.code) {
18
+ if (Boolean(chord.shift) !== event.shiftKey) return false;
19
+ } else {
20
+ const character = PUNCTUATION[chord.code];
21
+ if (!character || chord.shift || event.key !== character) return false;
22
+ }
23
+ if (Boolean(chord.alt) !== event.altKey) return false;
24
+ if (platform === "mac") {
25
+ if (Boolean(chord.mod) !== event.metaKey) return false;
26
+ if (Boolean(chord.control) !== event.ctrlKey) return false;
27
+ } else {
28
+ if (Boolean(chord.mod) !== event.ctrlKey) return false;
29
+ if (event.metaKey) return false;
30
+ }
31
+ return true;
32
+ }
33
+ var PUNCTUATION = {
34
+ Comma: ",",
35
+ Period: ".",
36
+ Slash: "/",
37
+ Backslash: "\\",
38
+ BracketLeft: "[",
39
+ BracketRight: "]",
40
+ Semicolon: ";",
41
+ Quote: "'",
42
+ Minus: "-",
43
+ Equal: "=",
44
+ Backquote: "`"
45
+ };
46
+ var KEY_NAMES = {
47
+ Comma: { mac: ",", other: ",", accelerator: "," },
48
+ Period: { mac: ".", other: ".", accelerator: "." },
49
+ Slash: { mac: "/", other: "/", accelerator: "/" },
50
+ Backslash: { mac: "\\", other: "\\", accelerator: "\\" },
51
+ BracketLeft: { mac: "[", other: "[", accelerator: "[" },
52
+ BracketRight: { mac: "]", other: "]", accelerator: "]" },
53
+ Semicolon: { mac: ";", other: ";", accelerator: ";" },
54
+ Quote: { mac: "'", other: "'", accelerator: "'" },
55
+ Minus: { mac: "-", other: "-", accelerator: "-" },
56
+ Equal: { mac: "=", other: "=", accelerator: "=" },
57
+ Backquote: { mac: "`", other: "`", accelerator: "`" },
58
+ ArrowUp: { mac: "\u2191", other: "\u2191", accelerator: "Up" },
59
+ ArrowDown: { mac: "\u2193", other: "\u2193", accelerator: "Down" },
60
+ ArrowLeft: { mac: "\u2190", other: "\u2190", accelerator: "Left" },
61
+ ArrowRight: { mac: "\u2192", other: "\u2192", accelerator: "Right" },
62
+ Enter: { mac: "\u21A9", other: "Enter", accelerator: "Return" },
63
+ Escape: { mac: "Esc", other: "Esc", accelerator: "Escape" },
64
+ Tab: { mac: "\u21E5", other: "Tab", accelerator: "Tab" },
65
+ Space: { mac: "Space", other: "Space", accelerator: "Space" },
66
+ Backspace: { mac: "\u232B", other: "Backspace", accelerator: "Backspace" }
67
+ };
68
+ function keyName(code, platform) {
69
+ const known = KEY_NAMES[code];
70
+ if (known) return known[platform];
71
+ if (/^Key[A-Z]$/.test(code)) return code.slice(3);
72
+ if (/^Digit[0-9]$/.test(code)) return code.slice(5);
73
+ if (/^F[0-9]{1,2}$/.test(code)) return code;
74
+ return code;
75
+ }
76
+ function chordKeys(chord, platform) {
77
+ if (platform === "mac") {
78
+ return [
79
+ ...chord.control ? ["\u2303"] : [],
80
+ ...chord.alt ? ["\u2325"] : [],
81
+ ...chord.shift ? ["\u21E7"] : [],
82
+ ...chord.mod ? ["\u2318"] : [],
83
+ keyName(chord.code, "mac")
84
+ ];
85
+ }
86
+ return [
87
+ ...chord.mod ? ["Ctrl"] : [],
88
+ ...chord.alt ? ["Alt"] : [],
89
+ ...chord.shift ? ["Shift"] : [],
90
+ keyName(chord.code, "other")
91
+ ];
92
+ }
93
+ function chordLabel(chord, platform) {
94
+ const keys = chordKeys(chord, platform);
95
+ return platform === "mac" ? keys.join("") : keys.join("+");
96
+ }
97
+ function chordAriaKeys(chord, platform) {
98
+ const key = keyName(chord.code, "accelerator");
99
+ const named = key === "Up" || key === "Down" || key === "Left" || key === "Right" ? `Arrow${key}` : key;
100
+ return [
101
+ ...chord.control && platform === "mac" ? ["Control"] : [],
102
+ ...chord.mod ? [platform === "mac" ? "Meta" : "Control"] : [],
103
+ ...chord.alt ? ["Alt"] : [],
104
+ ...chord.shift ? ["Shift"] : [],
105
+ named
106
+ ].join("+");
107
+ }
108
+ function chordAccelerator(chord) {
109
+ return [
110
+ ...chord.control ? ["Ctrl"] : [],
111
+ ...chord.mod ? ["CmdOrCtrl"] : [],
112
+ ...chord.alt ? ["Alt"] : [],
113
+ ...chord.shift ? ["Shift"] : [],
114
+ keyName(chord.code, "accelerator")
115
+ ].join("+");
116
+ }
117
+ function isTextEntry(target) {
118
+ if (!(target instanceof HTMLElement)) return false;
119
+ if (target.isContentEditable) return true;
120
+ if (target instanceof HTMLTextAreaElement) return !target.readOnly;
121
+ if (target instanceof HTMLInputElement) {
122
+ return !["button", "checkbox", "radio", "range", "color", "file", "submit", "reset"].includes(
123
+ target.type
124
+ );
125
+ }
126
+ return false;
127
+ }
128
+
129
+ export {
130
+ currentPlatform,
131
+ applicableChords,
132
+ matchesChord,
133
+ chordKeys,
134
+ chordLabel,
135
+ chordAriaKeys,
136
+ chordAccelerator,
137
+ isTextEntry
138
+ };
139
+ //# sourceMappingURL=chunk-MF464AKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/actions/chords.ts"],"sourcesContent":["/**\n * Keyboard chords: matching, platform notation and desktop accelerators.\n *\n * A chord always has ⌘ (Mac) or Ctrl (Windows and Linux) unless it is a\n * navigation chord with ⌥/Alt, so it never fights with typing. Chords match on\n * `KeyboardEvent.code`, which names the physical key, so they work on every\n * keyboard layout. Punctuation also matches the character typed, because many\n * layouts put it elsewhere: \"/\" is ⇧7 on Nordic and German keyboards.\n */\n\nexport type ChordPlatform = \"mac\" | \"other\";\nexport type ActionSurface = \"web\" | \"desktop\";\n\nexport type Chord = {\n /** `KeyboardEvent.code`, e.g. `\"KeyO\"`, `\"Comma\"`, `\"ArrowDown\"`, `\"Digit1\"`. */\n code: string;\n /** ⌘ on Mac, Ctrl elsewhere. */\n mod?: boolean;\n shift?: boolean;\n /** ⌥ on Mac, Alt elsewhere. */\n alt?: boolean;\n /** The Control key itself on Mac (⌃). Ignored elsewhere, where `mod` is Ctrl. */\n control?: boolean;\n /** Only on this surface (browsers reserve some keys). */\n only?: ActionSurface;\n /** Only on this platform. */\n platform?: ChordPlatform;\n};\n\nexport function currentPlatform(): ChordPlatform {\n if (typeof navigator === \"undefined\") return \"other\";\n const uaData = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n const platform = uaData?.platform ?? navigator.platform ?? \"\";\n return /Mac|iPhone|iPad|iPod/i.test(platform) ? \"mac\" : \"other\";\n}\n\n/** The chords that apply on this surface and platform, in priority order. */\nexport function applicableChords(\n chords: readonly Chord[] | undefined,\n surface: ActionSurface,\n platform: ChordPlatform,\n): Chord[] {\n return (chords ?? []).filter(\n (chord) =>\n (!chord.only || chord.only === surface) && (!chord.platform || chord.platform === platform),\n );\n}\n\nexport function matchesChord(\n event: Pick<\n KeyboardEvent,\n \"code\" | \"key\" | \"metaKey\" | \"ctrlKey\" | \"shiftKey\" | \"altKey\" | \"repeat\" | \"isComposing\"\n >,\n chord: Chord,\n platform: ChordPlatform,\n): boolean {\n if (event.repeat || event.isComposing) return false;\n if (event.code === chord.code) {\n if (Boolean(chord.shift) !== event.shiftKey) return false;\n } else {\n // The character on another key: whatever Shift it took to type it is part\n // of typing the character, so only a chord without Shift can match this way.\n const character = PUNCTUATION[chord.code];\n if (!character || chord.shift || event.key !== character) return false;\n }\n if (Boolean(chord.alt) !== event.altKey) return false;\n if (platform === \"mac\") {\n if (Boolean(chord.mod) !== event.metaKey) return false;\n if (Boolean(chord.control) !== event.ctrlKey) return false;\n } else {\n if (Boolean(chord.mod) !== event.ctrlKey) return false;\n if (event.metaKey) return false;\n }\n return true;\n}\n\nconst PUNCTUATION: Record<string, string> = {\n Comma: \",\",\n Period: \".\",\n Slash: \"/\",\n Backslash: \"\\\\\",\n BracketLeft: \"[\",\n BracketRight: \"]\",\n Semicolon: \";\",\n Quote: \"'\",\n Minus: \"-\",\n Equal: \"=\",\n Backquote: \"`\",\n};\n\nconst KEY_NAMES: Record<string, { mac: string; other: string; accelerator: string }> = {\n Comma: { mac: \",\", other: \",\", accelerator: \",\" },\n Period: { mac: \".\", other: \".\", accelerator: \".\" },\n Slash: { mac: \"/\", other: \"/\", accelerator: \"/\" },\n Backslash: { mac: \"\\\\\", other: \"\\\\\", accelerator: \"\\\\\" },\n BracketLeft: { mac: \"[\", other: \"[\", accelerator: \"[\" },\n BracketRight: { mac: \"]\", other: \"]\", accelerator: \"]\" },\n Semicolon: { mac: \";\", other: \";\", accelerator: \";\" },\n Quote: { mac: \"'\", other: \"'\", accelerator: \"'\" },\n Minus: { mac: \"-\", other: \"-\", accelerator: \"-\" },\n Equal: { mac: \"=\", other: \"=\", accelerator: \"=\" },\n Backquote: { mac: \"`\", other: \"`\", accelerator: \"`\" },\n ArrowUp: { mac: \"↑\", other: \"↑\", accelerator: \"Up\" },\n ArrowDown: { mac: \"↓\", other: \"↓\", accelerator: \"Down\" },\n ArrowLeft: { mac: \"←\", other: \"←\", accelerator: \"Left\" },\n ArrowRight: { mac: \"→\", other: \"→\", accelerator: \"Right\" },\n Enter: { mac: \"↩\", other: \"Enter\", accelerator: \"Return\" },\n Escape: { mac: \"Esc\", other: \"Esc\", accelerator: \"Escape\" },\n Tab: { mac: \"⇥\", other: \"Tab\", accelerator: \"Tab\" },\n Space: { mac: \"Space\", other: \"Space\", accelerator: \"Space\" },\n Backspace: { mac: \"⌫\", other: \"Backspace\", accelerator: \"Backspace\" },\n};\n\nfunction keyName(code: string, platform: ChordPlatform | \"accelerator\"): string {\n const known = KEY_NAMES[code];\n if (known) return known[platform];\n if (/^Key[A-Z]$/.test(code)) return code.slice(3);\n if (/^Digit[0-9]$/.test(code)) return code.slice(5);\n if (/^F[0-9]{1,2}$/.test(code)) return code;\n return code;\n}\n\n/** The chord as keycaps, in the platform's own notation: `[\"⌘\", \"⇧\", \"O\"]` or `[\"Ctrl\", \"Shift\", \"O\"]`. */\nexport function chordKeys(chord: Chord, platform: ChordPlatform): string[] {\n if (platform === \"mac\") {\n // Apple's order: Control, Option, Shift, Command.\n return [\n ...(chord.control ? [\"⌃\"] : []),\n ...(chord.alt ? [\"⌥\"] : []),\n ...(chord.shift ? [\"⇧\"] : []),\n ...(chord.mod ? [\"⌘\"] : []),\n keyName(chord.code, \"mac\"),\n ];\n }\n return [\n ...(chord.mod ? [\"Ctrl\"] : []),\n ...(chord.alt ? [\"Alt\"] : []),\n ...(chord.shift ? [\"Shift\"] : []),\n keyName(chord.code, \"other\"),\n ];\n}\n\n/** One string for tooltips and `title`s: `⌘⇧O` on Mac, `Ctrl+Shift+O` elsewhere. */\nexport function chordLabel(chord: Chord, platform: ChordPlatform): string {\n const keys = chordKeys(chord, platform);\n return platform === \"mac\" ? keys.join(\"\") : keys.join(\"+\");\n}\n\n/** The `aria-keyshortcuts` value for a chord. */\nexport function chordAriaKeys(chord: Chord, platform: ChordPlatform): string {\n const key = keyName(chord.code, \"accelerator\");\n const named =\n key === \"Up\" || key === \"Down\" || key === \"Left\" || key === \"Right\" ? `Arrow${key}` : key;\n return [\n ...(chord.control && platform === \"mac\" ? [\"Control\"] : []),\n ...(chord.mod ? [platform === \"mac\" ? \"Meta\" : \"Control\"] : []),\n ...(chord.alt ? [\"Alt\"] : []),\n ...(chord.shift ? [\"Shift\"] : []),\n named,\n ].join(\"+\");\n}\n\n/** An Electron accelerator for the desktop menu bar. */\nexport function chordAccelerator(chord: Chord): string {\n return [\n ...(chord.control ? [\"Ctrl\"] : []),\n ...(chord.mod ? [\"CmdOrCtrl\"] : []),\n ...(chord.alt ? [\"Alt\"] : []),\n ...(chord.shift ? [\"Shift\"] : []),\n keyName(chord.code, \"accelerator\"),\n ].join(\"+\");\n}\n\n/** True when typing into this element would insert text (so bare keys belong to it). */\nexport function isTextEntry(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target instanceof HTMLTextAreaElement) return !target.readOnly;\n if (target instanceof HTMLInputElement) {\n return ![\"button\", \"checkbox\", \"radio\", \"range\", \"color\", \"file\", \"submit\", \"reset\"].includes(\n target.type,\n );\n }\n return false;\n}\n"],"mappings":"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","names":[]}
@@ -279,4 +279,4 @@ export {
279
279
  humanizeFailureReason,
280
280
  presentFailure
281
281
  };
282
- //# sourceMappingURL=chunk-UYSZKDQY.js.map
282
+ //# sourceMappingURL=chunk-MK54JLE4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/format.ts"],"sourcesContent":["import { formatErrorMessage, OpenGeniApiError } from \"@opengeni/sdk\";\nimport { parseProviderRecovery, providerRecoveryExhaustedText } from \"./provider-recovery\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\nconst clockTimeFormatters = new Map<string, Intl.DateTimeFormat>();\nfunction clockTimeFormatter(locale: string | undefined): Intl.DateTimeFormat {\n const key = locale ?? \"\";\n let formatter = clockTimeFormatters.get(key);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n clockTimeFormatters.set(key, formatter);\n }\n return formatter;\n}\n\n/** Local finished-at stamp for message footers: \"Aug 2, 3:42 PM\" / locale-equivalent. */\nexport function formatClockTime(t: OpenGeniText, iso: string): string {\n const then = new Date(iso);\n if (Number.isNaN(then.getTime())) {\n return \"\";\n }\n return clockTimeFormatter(t.locale).format(then);\n}\n\n/** Compact relative time: \"now\", \"42s\", \"7m\", \"3h\", \"2d\", then a date. */\nexport function formatRelativeTime(t: OpenGeniText, 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 t(\"lib.format.now\");\n }\n if (seconds < 60) {\n return t(\"lib.format.seconds\", { count: seconds });\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return t(\"lib.format.minutes\", { count: minutes });\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return t(\"lib.format.hours\", { count: hours });\n }\n const days = Math.floor(hours / 24);\n if (days < 14) {\n return t(\"lib.format.days\", { count: days });\n }\n return new Date(iso).toLocaleDateString(t.locale);\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 (the remaining\n * credit does not cover this model, though it may cover others), what to do\n * (choose a covered model or 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 = (t: OpenGeniText) =>\n t(\"lib.format.outOfCreditsThisWorkspace\");\n\n/** A usage ceiling refused the send; the default allowance wording, plus what is safe. */\nexport const COMPOSER_MEMBER_ALLOWANCE_MESSAGE = (t: OpenGeniText) =>\n t(\"lib.format.usageLimitReachedAWorkspace\");\nexport const COMPOSER_WORKSPACE_ALLOWANCE_MESSAGE = (t: OpenGeniText) =>\n t(\"lib.format.workspaceUsageLimitReachedAn\");\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 = (t: OpenGeniText) =>\n t(\"lib.format.yourOrganizationDoesnTHave\");\n\n/** Trusted, composer-owned guidance; unlike remote diagnostic prose, this is UI copy. */\nexport class ComposerStateError extends Error {}\n\n/** A restored request has omitted credentials and must be reconciled, not replayed. */\nexport class ComposerReconciliationRequiredError extends ComposerStateError {\n constructor() {\n super(\n \"Opengeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n );\n }\n}\n\nexport class ComposerWorkspaceControlUnavailableError extends Error {\n constructor() {\n super(\"@opengeni/react: workspace-scoped resume requires setWorkspaceInferenceState.\");\n }\n}\n\n/**\n * The send named a model that is no longer in the live catalog (retired or\n * removed). Retrying the same send cannot succeed; the person must choose\n * another model, and the typed message stays recoverable via Edit message.\n */\nexport const COMPOSER_MODEL_UNAVAILABLE_MESSAGE =\n \"This chat's model is no longer available. Choose another model to continue. Your message is saved.\";\n\n/** `details.code` the API sets on a 422 for a model missing from the live catalog. */\nexport const MODEL_UNAVAILABLE_DETAIL_CODE = \"model_unavailable\";\n\n/**\n * A fresh Send or Steer refused because the task's own usage limit is reached.\n * The draft is kept and an unchanged retry is never offered. The one current\n * recovery action (raise or remove the limit, resume a goal) belongs to the\n * composer's `SessionUsageLimitNotice`, so this line only says what happened.\n */\nexport const COMPOSER_SESSION_USAGE_LIMIT_MESSAGE =\n \"This task's usage limit is reached. Your message is saved.\";\n\n/** The earlier wording, still recognized in refusals restored from storage. */\nconst LEGACY_COMPOSER_SESSION_USAGE_LIMIT_MESSAGE =\n \"This task's usage limit is reached. Raise or remove the limit to continue. Your message is saved.\";\n\n/**\n * Is this send refusal the task's usage limit? Reads the typed SDK error code\n * (`OpenGeniSessionUsageLimitReachedError`), and also the composer's own\n * sentence so a refusal restored from storage after a reload is recognized.\n */\nexport function isSessionUsageLimitSubmissionError(error: Error): boolean {\n return (\n (error instanceof OpenGeniApiError && error.code === \"session_usage_limit_reached\") ||\n error.message === COMPOSER_SESSION_USAGE_LIMIT_MESSAGE ||\n error.message === LEGACY_COMPOSER_SESSION_USAGE_LIMIT_MESSAGE\n );\n}\n\n/**\n * Is this send refusal \"the model is no longer available\"? Reads the typed\n * `details.code`, and also the historical message so a refusal persisted\n * before a reload (only its text survives) or from an older API is recognized.\n */\nexport function isModelUnavailableSubmissionError(error: Error): boolean {\n if (error instanceof OpenGeniApiError && error.details?.code === MODEL_UNAVAILABLE_DETAIL_CODE) {\n return true;\n }\n return (\n error.message === COMPOSER_MODEL_UNAVAILABLE_MESSAGE ||\n /^(?:Opengeni|OpenGeni) API 422: model is not available: /.test(error.message)\n );\n}\n\n/**\n * What a published Site's assistant tells a viewer it refused, by the\n * refusal's `details.code`. The draft is kept in every case.\n */\nexport const COMPOSER_SITE_REFUSAL_MESSAGES = (t: OpenGeniText): Readonly<Record<string, string>> =>\n Object.freeze({\n not_available_for_viewer: t(\"lib.format.thisSiteSAssistantCan\"),\n site_budget_exhausted: t(\"lib.format.thisSiteSAssistantHas\"),\n site_budget_busy: t(\"lib.format.thisSiteSAssistantIs\"),\n site_platform_brake_engaged: t(\"lib.format.thisSiteSAssistantIs2\"),\n });\n\nconst SITE_REFUSAL_CODES: ReadonlySet<string> = new Set([\n \"not_available_for_viewer\",\n \"site_budget_exhausted\",\n \"site_budget_busy\",\n \"site_platform_brake_engaged\",\n]);\n\n/** The Site refusal code of a send refusal, if it is one. */\nexport function siteRefusalCode(error: Error): string | null {\n if (!(error instanceof OpenGeniApiError)) return null;\n const code = error.details?.code;\n return typeof code === \"string\" && SITE_REFUSAL_CODES.has(code) ? code : null;\n}\n\nexport function composerSubmissionErrorMessage(t: OpenGeniText, error: Error): string {\n if (error instanceof ComposerReconciliationRequiredError) {\n return t(\"lib.format.reconcileBeforeRetry\");\n }\n if (error instanceof ComposerWorkspaceControlUnavailableError) {\n return t(\"lib.format.thisClientCannotResumeThe\");\n }\n if (error instanceof ComposerStateError) return error.message;\n if (error instanceof OpenGeniApiError && error.outcomeUnknown) return formatErrorMessage(error);\n if (isModelUnavailableSubmissionError(error)) return t(\"lib.format.modelUnavailable\");\n if (isSessionUsageLimitSubmissionError(error)) return t(\"lib.format.sessionUsageLimitReached\");\n const siteRefusal = siteRefusalCode(error);\n if (siteRefusal) return COMPOSER_SITE_REFUSAL_MESSAGES(t)[siteRefusal]!;\n if (error instanceof OpenGeniApiError && error.code === \"allowance_exhausted\") {\n // OpenGeniAllowanceExhaustedError carries the scope; read it structurally\n // so this startup-path helper adds no SDK or wording imports.\n const message =\n (error as { scope?: unknown }).scope === \"workspace\"\n ? COMPOSER_WORKSPACE_ALLOWANCE_MESSAGE(t)\n : COMPOSER_MEMBER_ALLOWANCE_MESSAGE(t);\n return composerErrorReference(t, error, message);\n }\n return isComposerCreditRefusal(error)\n ? composerErrorReference(t, error, COMPOSER_PAYMENT_REQUIRED_MESSAGE(t))\n : formatErrorMessage(error);\n}\n\nfunction composerErrorReference(t: OpenGeniText, error: Error, message: string): string {\n return error instanceof OpenGeniApiError && error.correlationId\n ? t(\"lib.format.messageReferenceCorrelationid\", { message, correlationId: error.correlationId })\n : message;\n}\n\n/** These definitive refusals need a payment, allowance or model change, not an unchanged retry. */\nexport function composerSubmissionCanRetry(error: Error): boolean {\n return !(\n isComposerCreditRefusal(error) ||\n isModelUnavailableSubmissionError(error) ||\n isSessionUsageLimitSubmissionError(error) ||\n (error instanceof OpenGeniApiError && error.code === \"allowance_exhausted\") ||\n // Only a busy Site assistant is worth an unchanged retry.\n (siteRefusalCode(error) !== null && siteRefusalCode(error) !== \"site_budget_busy\")\n );\n}\n\nfunction isComposerCreditRefusal(error: Error): boolean {\n // A 402 for the task's own usage limit is not a credit or payment problem.\n if (isSessionUsageLimitSubmissionError(error)) return false;\n return (\n (error instanceof OpenGeniApiError &&\n error.status === 402 &&\n (error.code === \"payment_required\" || error.code === \"insufficient_credits\")) ||\n isCreditExhaustion(error.message)\n );\n}\n\n/**\n * Does this failure/completion payload (or raw error string) mean the\n * workspace ran out of credits? Matches the engine's \"insufficient workspace\n * credits\" text, and the older \"insufficient Opengeni credits\" wording in\n * existing history (case-insensitive, substring — it arrives both bare and\n * wrapped in \"Activity task failed: …\") and the\n * budget-exhausted segment limit the engine stamps on a turn it ended early.\n */\nconst CREDIT_EXHAUSTION_TEXT = /insufficient (?:workspace|opengeni) credits/i;\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 CREDIT_EXHAUSTION_TEXT.test(input);\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\" && CREDIT_EXHAUSTION_TEXT.test(text)) {\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(t: OpenGeniText, reason: string | null): string | null {\n if (!reason) {\n return reason;\n }\n if (isCreditExhaustion(reason)) {\n return CREDIT_EXHAUSTION_MESSAGE(t);\n }\n // A turn refused because the chat's model was retired or removed.\n if (\n /^Turn execution policy model is (?:retired from new selection|not present in the configured catalog|no longer configured)$/.test(\n reason.trim(),\n )\n ) {\n return t(\"lib.format.modelUnavailable\");\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 t(\"lib.format.theModelProviderRejectedThis\");\n }\n const quotaFailure =\n normalized.includes(\"insufficient_quota\") || normalized.includes(\"exceeded your current quota\");\n if (quotaFailure) {\n return t(\"lib.format.theModelProviderRefusedThe\");\n }\n return reason;\n}\n\n/** Project failure diagnostics without changing the stored event, including legacy retry wrappers. */\nexport function presentFailure(\n t: OpenGeniText,\n payload: Record<string, unknown>,\n): {\n reason: string | null;\n safetyRefusal: boolean;\n} {\n const databaseFailure =\n payload.code === \"db_deadlock\" ||\n payload.code === \"db_serialization_failure\" ||\n payload.code === \"db_failure\" ||\n (typeof payload.sqlState === \"string\" &&\n /^[0-9A-Z]{5}$/.test(payload.sqlState) &&\n payload.database !== null &&\n typeof payload.database === \"object\" &&\n !Array.isArray(payload.database));\n if (databaseFailure) {\n return { reason: t(\"lib.format.theServiceEncounteredADatabase\"), safetyRefusal: false };\n }\n // Failures the server identifies by code read in the host's language; the\n // stored (and model-facing) English text stays on the event.\n const coded = typeof payload.code === \"string\" ? CODED_FAILURE_TEXT[payload.code] : undefined;\n if (coded) return { reason: coded(t), safetyRefusal: false };\n const text = (key: string): string | null => {\n const value = payload[key];\n return typeof value === \"string\" && value.trim() ? value : null;\n };\n const message = text(\"error\") ?? text(\"message\");\n const detail = text(\"lastRetryableError\") ?? text(\"detail\");\n const safetyRefusal =\n payload.code === \"provider_safety_refusal\" ||\n [message, detail].some(\n (value) =>\n value !== null && /\\bthis request was blocked by our safety systems\\b/i.test(value),\n );\n if (safetyRefusal) {\n return {\n reason:\n detail || message\n ? t(\"lib.format.providerBlockedRequestDetail\", { detail: detail ?? message })\n : t(\"lib.format.providerBlockedRequest\"),\n safetyRefusal: true,\n };\n }\n // Spent automatic retries: name the model and the remedy instead of the\n // recorded wrapper plus raw provider text (still in the stored event).\n const recovery = parseProviderRecovery(payload);\n if (recovery && payload.recoveryExhausted === true) {\n return { reason: providerRecoveryExhaustedText(t, recovery), safetyRefusal: false };\n }\n return {\n reason:\n detail && detail !== message\n ? [humanizeFailureReason(t, message), humanizeFailureReason(t, detail)]\n .filter(Boolean)\n .join(\" \")\n : humanizeFailureReason(t, message),\n safetyRefusal: false,\n };\n}\n\nconst capacityRecoveryExhausted = (t: OpenGeniText) => t(\"lib.format.capacityRecoveryExhausted\");\n\n/** Server failure codes whose recorded text is operator English, not end-user copy. */\nconst CODED_FAILURE_TEXT: Readonly<Record<string, ((t: OpenGeniText) => string) | undefined>> = {\n codex_capacity_recovery_exhausted: capacityRecoveryExhausted,\n xai_capacity_recovery_exhausted: capacityRecoveryExhausted,\n claude_capacity_recovery_exhausted: capacityRecoveryExhausted,\n};\n"],"mappings":"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","names":[]}
@@ -1,34 +1,28 @@
1
1
  "use client";
2
2
  import {
3
3
  DestructiveConfirm
4
- } from "./chunk-GYPAO6RS.js";
4
+ } from "./chunk-A664GSDM.js";
5
5
  import {
6
- UsageMeter
7
- } from "./chunk-JB4X3TQI.js";
6
+ DetailMeta
7
+ } from "./chunk-NIITHJEE.js";
8
8
  import {
9
9
  MoreMenu,
10
10
  RowButton
11
- } from "./chunk-GVIQ7H62.js";
11
+ } from "./chunk-2LUBBDZV.js";
12
12
  import {
13
13
  ListRow,
14
14
  ListRowSkeleton,
15
15
  RowList
16
- } from "./chunk-NQCMS4AJ.js";
17
- import {
18
- DetailMeta
19
- } from "./chunk-NIITHJEE.js";
16
+ } from "./chunk-JQCGPTZ6.js";
20
17
  import {
21
18
  BackLink
22
- } from "./chunk-LEXPBQ56.js";
19
+ } from "./chunk-4SKJX3C4.js";
20
+ import {
21
+ UsageMeter
22
+ } from "./chunk-JB4X3TQI.js";
23
23
  import {
24
24
  formatBytes
25
25
  } from "./chunk-5TLEWXAB.js";
26
- import {
27
- EmptyState
28
- } from "./chunk-5CIUQX6D.js";
29
- import {
30
- LogoTile
31
- } from "./chunk-FQQEZUSN.js";
32
26
  import {
33
27
  Switch
34
28
  } from "./chunk-IZMUUUYD.js";
@@ -37,8 +31,14 @@ import {
37
31
  SettingRowGroup
38
32
  } from "./chunk-XSOPQZGH.js";
39
33
  import {
40
- Notice
41
- } from "./chunk-WLEDGIVS.js";
34
+ DropdownMenuItem
35
+ } from "./chunk-TREHTIBD.js";
36
+ import {
37
+ EmptyState
38
+ } from "./chunk-5CIUQX6D.js";
39
+ import {
40
+ LogoTile
41
+ } from "./chunk-FQQEZUSN.js";
42
42
  import {
43
43
  toast
44
44
  } from "./chunk-YG6NARQY.js";
@@ -48,12 +48,12 @@ import {
48
48
  import {
49
49
  RelativeTime
50
50
  } from "./chunk-XG57V2BN.js";
51
+ import {
52
+ Notice
53
+ } from "./chunk-WLEDGIVS.js";
51
54
  import {
52
55
  Button
53
56
  } from "./chunk-HMU5IELG.js";
54
- import {
55
- DropdownMenuItem
56
- } from "./chunk-MOF3XSUM.js";
57
57
 
58
58
  // src/app/components/artifacts/site-data.tsx
59
59
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -518,4 +518,4 @@ export {
518
518
  SiteDataPanel,
519
519
  siteSqlSummary
520
520
  };
521
- //# sourceMappingURL=chunk-5LES64PP.js.map
521
+ //# sourceMappingURL=chunk-MKOQAVOE.js.map
@@ -1,47 +1,47 @@
1
1
  "use client";
2
- import {
3
- ListRow,
4
- ListRowSkeleton,
5
- RowList
6
- } from "./chunk-NQCMS4AJ.js";
7
2
  import {
8
3
  Toolbar,
9
4
  ToolbarGroup,
10
5
  ToolbarSearch
11
- } from "./chunk-OOTBYSCA.js";
6
+ } from "./chunk-BBWKPNJB.js";
7
+ import {
8
+ ListRow,
9
+ ListRowSkeleton,
10
+ RowList
11
+ } from "./chunk-JQCGPTZ6.js";
12
12
  import {
13
13
  sessionStateLabel
14
- } from "./chunk-M6KUY3YH.js";
14
+ } from "./chunk-FIICQA55.js";
15
+ import {
16
+ SegmentedControl
17
+ } from "./chunk-325C2TCI.js";
15
18
  import {
16
19
  EmptyState
17
20
  } from "./chunk-5CIUQX6D.js";
18
- import {
19
- SegmentedControl
20
- } from "./chunk-SWWYYGQO.js";
21
21
  import {
22
22
  LogoTile
23
23
  } from "./chunk-FQQEZUSN.js";
24
- import {
25
- Notice
26
- } from "./chunk-WLEDGIVS.js";
27
24
  import {
28
25
  toast
29
26
  } from "./chunk-YG6NARQY.js";
30
27
  import {
31
28
  useNavigate
32
29
  } from "./chunk-MYNUBDU7.js";
33
- import {
34
- userErrorText
35
- } from "./chunk-L4OF77LE.js";
36
30
  import {
37
31
  useAppContext
38
32
  } from "./chunk-W6KAUGXO.js";
33
+ import {
34
+ Notice
35
+ } from "./chunk-WLEDGIVS.js";
39
36
  import {
40
37
  Button
41
38
  } from "./chunk-HMU5IELG.js";
39
+ import {
40
+ userErrorText
41
+ } from "./chunk-L4OF77LE.js";
42
42
  import {
43
43
  sessionDisplayTitle
44
- } from "./chunk-QGSGIYE3.js";
44
+ } from "./chunk-J2C6LB6W.js";
45
45
 
46
46
  // src/app/components/artifacts/site-conversations.tsx
47
47
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -248,4 +248,4 @@ export {
248
248
  SiteConversations,
249
249
  SiteConversationsPanel
250
250
  };
251
- //# sourceMappingURL=chunk-BMV2SNYX.js.map
251
+ //# sourceMappingURL=chunk-MUPWNSEJ.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-TXS65BB2.js";
11
11
  import {
12
12
  useOpenGeniText
13
- } from "./chunk-G7VLL3PG.js";
13
+ } from "./chunk-F2YABPRJ.js";
14
14
 
15
15
  // src/timeline/screenshot-lightbox.tsx
16
16
  import { ChevronLeftIcon, ChevronRightIcon, DownloadIcon, XIcon } from "lucide-react";
@@ -468,4 +468,4 @@ export {
468
468
  TooltipTrigger,
469
469
  TooltipContent
470
470
  };
471
- //# sourceMappingURL=chunk-Y5TRG22C.js.map
471
+ //# sourceMappingURL=chunk-NRXIECWC.js.map
@@ -3,7 +3,7 @@ import {
3
3
  beginIntegrationConnect,
4
4
  integrationClassFromDomain,
5
5
  integrationConnectErrorOutcome
6
- } from "./chunk-UO36FC3S.js";
6
+ } from "./chunk-46I7MMAL.js";
7
7
  import {
8
8
  startMcpOAuthWithTimeout
9
9
  } from "./chunk-HUKUDAIP.js";
@@ -355,4 +355,4 @@ function installedSkillVersion(item) {
355
355
  export {
356
356
  performCapabilityAction
357
357
  };
358
- //# sourceMappingURL=chunk-GOE7G5JX.js.map
358
+ //# sourceMappingURL=chunk-NWSAF6P5.js.map
@@ -0,0 +1,158 @@
1
+ "use client";
2
+
3
+ // src/timeline/annotation-model.ts
4
+ var ANNOTATION_SOURCE_CONTEXT_BYTES = 160;
5
+ var ANNOTATION_MAX_QUOTE_BYTES = 16 * 1024;
6
+ var ANNOTATION_MAX_NOTE_LENGTH = 2048;
7
+ function annotationHasNote(note) {
8
+ return note.trim().length > 0;
9
+ }
10
+ function annotationDisplayOrdinal(annotation, index) {
11
+ return typeof annotation.ordinal === "number" ? annotation.ordinal : index + 1;
12
+ }
13
+ function truncateAnnotationQuote(quote, maxChars = 160) {
14
+ const normalized = quote.replace(/\s+/g, " ").trim();
15
+ if (normalized.length <= maxChars) return normalized;
16
+ return `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}\u2026`;
17
+ }
18
+ function occurrenceOffsets(text, quote) {
19
+ if (!quote) return [];
20
+ const offsets = [];
21
+ let cursor = 0;
22
+ while (cursor <= text.length - quote.length) {
23
+ const offset = text.indexOf(quote, cursor);
24
+ if (offset < 0) break;
25
+ offsets.push(offset);
26
+ cursor = offset + 1;
27
+ }
28
+ return offsets;
29
+ }
30
+ function uniqueNonEmpty(values) {
31
+ const seen = /* @__PURE__ */ new Set();
32
+ const out = [];
33
+ for (const value of values) {
34
+ if (!value || seen.has(value)) continue;
35
+ seen.add(value);
36
+ out.push(value);
37
+ }
38
+ return out;
39
+ }
40
+ function matchingQuoteInSource(sourceText, quote) {
41
+ for (const candidate of uniqueNonEmpty([quote, quote.trim()])) {
42
+ if (sourceText.includes(candidate)) return candidate;
43
+ }
44
+ const trimmed = quote.trim();
45
+ for (let length = trimmed.length; length >= 8; length--) {
46
+ const slice = trimmed.slice(0, length);
47
+ if (sourceText.includes(slice)) return slice;
48
+ }
49
+ for (let start = 1; start <= trimmed.length - 8; start++) {
50
+ const slice = trimmed.slice(start);
51
+ if (sourceText.includes(slice)) return slice;
52
+ }
53
+ return null;
54
+ }
55
+ var encoder = new TextEncoder();
56
+ function utf8ByteLength(value) {
57
+ return encoder.encode(value).byteLength;
58
+ }
59
+ function utf8Prefix(value, maxBytes) {
60
+ let output = "";
61
+ let bytes = 0;
62
+ for (const character of value) {
63
+ const next = encoder.encode(character).byteLength;
64
+ if (bytes + next > maxBytes) break;
65
+ output += character;
66
+ bytes += next;
67
+ }
68
+ return output;
69
+ }
70
+ function utf8Suffix(value, maxBytes) {
71
+ let output = "";
72
+ let bytes = 0;
73
+ for (const character of [...value].reverse()) {
74
+ const next = encoder.encode(character).byteLength;
75
+ if (bytes + next > maxBytes) break;
76
+ output = character + output;
77
+ bytes += next;
78
+ }
79
+ return output;
80
+ }
81
+ function commonSuffixLength(a, b) {
82
+ let count = 0;
83
+ while (count < a.length && count < b.length && a[a.length - 1 - count] === b[b.length - 1 - count])
84
+ count++;
85
+ return count;
86
+ }
87
+ function commonPrefixLength(a, b) {
88
+ let count = 0;
89
+ while (count < a.length && count < b.length && a[count] === b[count]) count++;
90
+ return count;
91
+ }
92
+ function bestQuoteOccurrence(sourceText, quote, offsets, textBefore, textAfter) {
93
+ if (offsets.length <= 1) return 0;
94
+ const before = textBefore.slice(-ANNOTATION_SOURCE_CONTEXT_BYTES);
95
+ const after = textAfter.slice(0, ANNOTATION_SOURCE_CONTEXT_BYTES);
96
+ let best = 0;
97
+ let bestScore = -1;
98
+ offsets.forEach((offset, index) => {
99
+ const score = commonSuffixLength(before, sourceText.slice(Math.max(0, offset - before.length), offset)) + commonPrefixLength(after, sourceText.slice(offset + quote.length));
100
+ if (score > bestScore) {
101
+ best = index;
102
+ bestScore = score;
103
+ }
104
+ });
105
+ return best;
106
+ }
107
+ function annotationId() {
108
+ if (typeof globalThis.crypto?.randomUUID === "function") {
109
+ return globalThis.crypto.randomUUID();
110
+ }
111
+ return `annotation-${Date.now()}-${Math.random().toString(16).slice(2)}`;
112
+ }
113
+ function annotationFromSelection(source, selection, id = annotationId()) {
114
+ const quote = matchingQuoteInSource(source.text, selection.text) ?? selection.text;
115
+ if (quote.trim().length === 0 || utf8ByteLength(quote) > ANNOTATION_MAX_QUOTE_BYTES) return null;
116
+ const offsets = occurrenceOffsets(source.text, quote);
117
+ if (offsets.length === 0) return null;
118
+ const occurrence = selection.occurrence ?? bestQuoteOccurrence(
119
+ source.text,
120
+ quote,
121
+ offsets,
122
+ selection.textBefore ?? "",
123
+ selection.textAfter ?? ""
124
+ );
125
+ const startOffset = offsets[Math.min(Math.max(0, occurrence), offsets.length - 1)];
126
+ const endOffset = startOffset + quote.length;
127
+ return {
128
+ id,
129
+ quote,
130
+ note: "",
131
+ source: {
132
+ kind: source.kind,
133
+ eventId: source.eventId,
134
+ eventType: source.eventType,
135
+ sequence: source.sequence,
136
+ turnId: source.turnId,
137
+ startOffset,
138
+ endOffset,
139
+ contextBefore: utf8Suffix(source.text.slice(0, startOffset), ANNOTATION_SOURCE_CONTEXT_BYTES),
140
+ contextAfter: utf8Prefix(source.text.slice(endOffset), ANNOTATION_SOURCE_CONTEXT_BYTES),
141
+ ...source.label ? { label: source.label } : {}
142
+ }
143
+ };
144
+ }
145
+
146
+ export {
147
+ ANNOTATION_SOURCE_CONTEXT_BYTES,
148
+ ANNOTATION_MAX_QUOTE_BYTES,
149
+ ANNOTATION_MAX_NOTE_LENGTH,
150
+ annotationHasNote,
151
+ annotationDisplayOrdinal,
152
+ truncateAnnotationQuote,
153
+ occurrenceOffsets,
154
+ matchingQuoteInSource,
155
+ bestQuoteOccurrence,
156
+ annotationFromSelection
157
+ };
158
+ //# sourceMappingURL=chunk-OB3YGXHQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/annotation-model.ts"],"sourcesContent":["import type { DraftTimelineAnnotation } from \"@opengeni/sdk\";\nimport type { TimelineAnnotationSourceDescriptor } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Timeline annotations without the DOM: how a selected quote becomes a draft\n annotation (source offsets and context), shared by the web selection\n popover and native renderers that report a selection as plain text.\n -------------------------------------------------------------------------- */\n\n/** Bytes of source text kept on each side of a quote. */\nexport const ANNOTATION_SOURCE_CONTEXT_BYTES = 160;\n/** Longest quote an annotation may carry. */\nexport const ANNOTATION_MAX_QUOTE_BYTES = 16 * 1024;\n/** Longest note an annotation may carry (characters). */\nexport const ANNOTATION_MAX_NOTE_LENGTH = 2048;\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 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 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\n/**\n * The part of a rendered selection that appears verbatim in the source text.\n * Rendered text drops markdown syntax, so a selection across formatting falls\n * back to its longest matching prefix, then suffix (at least 8 characters).\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\nconst encoder = new TextEncoder();\n\nexport function utf8ByteLength(value: string): number {\n return encoder.encode(value).byteLength;\n}\n\nexport function utf8Prefix(value: string, maxBytes: number): string {\n let output = \"\";\n let bytes = 0;\n for (const character of value) {\n const next = encoder.encode(character).byteLength;\n if (bytes + next > maxBytes) break;\n output += character;\n bytes += next;\n }\n return output;\n}\n\nexport function utf8Suffix(value: string, maxBytes: number): string {\n let output = \"\";\n let bytes = 0;\n for (const character of [...value].reverse()) {\n const next = encoder.encode(character).byteLength;\n if (bytes + next > maxBytes) break;\n output = character + output;\n bytes += next;\n }\n return output;\n}\n\nfunction commonSuffixLength(a: string, b: string): number {\n let count = 0;\n while (\n count < a.length &&\n count < b.length &&\n a[a.length - 1 - count] === b[b.length - 1 - count]\n )\n count++;\n return count;\n}\n\nfunction commonPrefixLength(a: string, b: string): number {\n let count = 0;\n while (count < a.length && count < b.length && a[count] === b[count]) count++;\n return count;\n}\n\n/**\n * Which occurrence of `quote` in `sourceText` a selection meant, judged by the\n * rendered text around the selection. Markdown syntax breaks exact matches,\n * so the occurrence whose neighbouring characters agree longest wins.\n */\nexport function bestQuoteOccurrence(\n sourceText: string,\n quote: string,\n offsets: readonly number[],\n textBefore: string,\n textAfter: string,\n): number {\n if (offsets.length <= 1) return 0;\n const before = textBefore.slice(-ANNOTATION_SOURCE_CONTEXT_BYTES);\n const after = textAfter.slice(0, ANNOTATION_SOURCE_CONTEXT_BYTES);\n let best = 0;\n let bestScore = -1;\n offsets.forEach((offset, index) => {\n const score =\n commonSuffixLength(before, sourceText.slice(Math.max(0, offset - before.length), offset)) +\n commonPrefixLength(after, sourceText.slice(offset + quote.length));\n if (score > bestScore) {\n best = index;\n bestScore = score;\n }\n });\n return best;\n}\n\nfunction annotationId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `annotation-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nexport type AnnotationSelection = {\n /** The selected text as rendered. */\n text: string;\n /**\n * Which occurrence of the quote in the source was selected, when the\n * renderer can count it; otherwise the surrounding rendered text decides.\n */\n occurrence?: number | undefined;\n /** Rendered text just before the selection (used when `occurrence` is unknown). */\n textBefore?: string | undefined;\n /** Rendered text just after the selection. */\n textAfter?: string | undefined;\n};\n\n/**\n * A draft annotation for a selection inside `source`, or null when nothing\n * selected is in the source text or the quote is empty or too long.\n */\nexport function annotationFromSelection(\n source: TimelineAnnotationSourceDescriptor,\n selection: AnnotationSelection,\n id: string = annotationId(),\n): DraftTimelineAnnotation | null {\n const quote = matchingQuoteInSource(source.text, selection.text) ?? selection.text;\n if (quote.trim().length === 0 || utf8ByteLength(quote) > ANNOTATION_MAX_QUOTE_BYTES) return null;\n const offsets = occurrenceOffsets(source.text, quote);\n if (offsets.length === 0) return null;\n const occurrence =\n selection.occurrence ??\n bestQuoteOccurrence(\n source.text,\n quote,\n offsets,\n selection.textBefore ?? \"\",\n selection.textAfter ?? \"\",\n );\n const startOffset = offsets[Math.min(Math.max(0, occurrence), offsets.length - 1)]!;\n const endOffset = startOffset + quote.length;\n return {\n id,\n quote,\n note: \"\",\n source: {\n kind: source.kind,\n eventId: source.eventId,\n eventType: source.eventType,\n sequence: source.sequence,\n turnId: source.turnId,\n startOffset,\n endOffset,\n contextBefore: utf8Suffix(source.text.slice(0, startOffset), ANNOTATION_SOURCE_CONTEXT_BYTES),\n contextAfter: utf8Prefix(source.text.slice(endOffset), ANNOTATION_SOURCE_CONTEXT_BYTES),\n ...(source.label ? { label: source.label } : {}),\n },\n };\n}\n"],"mappings":";;;AAUO,IAAM,kCAAkC;AAExC,IAAM,6BAA6B,KAAK;AAExC,IAAM,6BAA6B;AAEnC,SAAS,kBAAkB,MAAuB;AACvD,SAAO,KAAK,KAAK,EAAE,SAAS;AAC9B;AAEO,SAAS,yBACd,YACA,OACQ;AACR,SAAO,OAAO,WAAW,YAAY,WAAW,WAAW,UAAU,QAAQ;AAC/E;AAEO,SAAS,wBAAwB,OAAe,WAAW,KAAa;AAC7E,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,MAAI,WAAW,UAAU,SAAU,QAAO;AAC1C,SAAO,GAAG,WAAW,MAAM,GAAG,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC;AACpE;AAEO,SAAS,kBAAkB,MAAc,OAAyB;AACvE,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,SAAO,UAAU,KAAK,SAAS,MAAM,QAAQ;AAC3C,UAAM,SAAS,KAAK,QAAQ,OAAO,MAAM;AACzC,QAAI,SAAS,EAAG;AAChB,YAAQ,KAAK,MAAM;AACnB,aAAS,SAAS;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAA4B;AAClD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,KAAK,IAAI,KAAK,EAAG;AAC/B,SAAK,IAAI,KAAK;AACd,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAOO,SAAS,sBAAsB,YAAoB,OAA8B;AACtF,aAAW,aAAa,eAAe,CAAC,OAAO,MAAM,KAAK,CAAC,CAAC,GAAG;AAC7D,QAAI,WAAW,SAAS,SAAS,EAAG,QAAO;AAAA,EAC7C;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,WAAS,SAAS,QAAQ,QAAQ,UAAU,GAAG,UAAU;AACvD,UAAM,QAAQ,QAAQ,MAAM,GAAG,MAAM;AACrC,QAAI,WAAW,SAAS,KAAK,EAAG,QAAO;AAAA,EACzC;AACA,WAAS,QAAQ,GAAG,SAAS,QAAQ,SAAS,GAAG,SAAS;AACxD,UAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,QAAI,WAAW,SAAS,KAAK,EAAG,QAAO;AAAA,EACzC;AACA,SAAO;AACT;AAEA,IAAM,UAAU,IAAI,YAAY;AAEzB,SAAS,eAAe,OAAuB;AACpD,SAAO,QAAQ,OAAO,KAAK,EAAE;AAC/B;AAEO,SAAS,WAAW,OAAe,UAA0B;AAClE,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,aAAW,aAAa,OAAO;AAC7B,UAAM,OAAO,QAAQ,OAAO,SAAS,EAAE;AACvC,QAAI,QAAQ,OAAO,SAAU;AAC7B,cAAU;AACV,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAAe,UAA0B;AAClE,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,aAAW,aAAa,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG;AAC5C,UAAM,OAAO,QAAQ,OAAO,SAAS,EAAE;AACvC,QAAI,QAAQ,OAAO,SAAU;AAC7B,aAAS,YAAY;AACrB,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,GAAW,GAAmB;AACxD,MAAI,QAAQ;AACZ,SACE,QAAQ,EAAE,UACV,QAAQ,EAAE,UACV,EAAE,EAAE,SAAS,IAAI,KAAK,MAAM,EAAE,EAAE,SAAS,IAAI,KAAK;AAElD;AACF,SAAO;AACT;AAEA,SAAS,mBAAmB,GAAW,GAAmB;AACxD,MAAI,QAAQ;AACZ,SAAO,QAAQ,EAAE,UAAU,QAAQ,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,EAAG;AACtE,SAAO;AACT;AAOO,SAAS,oBACd,YACA,OACA,SACA,YACA,WACQ;AACR,MAAI,QAAQ,UAAU,EAAG,QAAO;AAChC,QAAM,SAAS,WAAW,MAAM,CAAC,+BAA+B;AAChE,QAAM,QAAQ,UAAU,MAAM,GAAG,+BAA+B;AAChE,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,QACJ,mBAAmB,QAAQ,WAAW,MAAM,KAAK,IAAI,GAAG,SAAS,OAAO,MAAM,GAAG,MAAM,CAAC,IACxF,mBAAmB,OAAO,WAAW,MAAM,SAAS,MAAM,MAAM,CAAC;AACnE,QAAI,QAAQ,WAAW;AACrB,aAAO;AACP,kBAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,MAAI,OAAO,WAAW,QAAQ,eAAe,YAAY;AACvD,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC;AACA,SAAO,cAAc,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACxE;AAoBO,SAAS,wBACd,QACA,WACA,KAAa,aAAa,GACM;AAChC,QAAM,QAAQ,sBAAsB,OAAO,MAAM,UAAU,IAAI,KAAK,UAAU;AAC9E,MAAI,MAAM,KAAK,EAAE,WAAW,KAAK,eAAe,KAAK,IAAI,2BAA4B,QAAO;AAC5F,QAAM,UAAU,kBAAkB,OAAO,MAAM,KAAK;AACpD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,aACJ,UAAU,cACV;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,UAAU,cAAc;AAAA,IACxB,UAAU,aAAa;AAAA,EACzB;AACF,QAAM,cAAc,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,QAAQ,SAAS,CAAC,CAAC;AACjF,QAAM,YAAY,cAAc,MAAM;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA,eAAe,WAAW,OAAO,KAAK,MAAM,GAAG,WAAW,GAAG,+BAA+B;AAAA,MAC5F,cAAc,WAAW,OAAO,KAAK,MAAM,SAAS,GAAG,+BAA+B;AAAA,MACtF,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAChD;AAAA,EACF;AACF;","names":[]}