@arbidocs/react 0.5.111 → 0.5.112

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 (983) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,91 @@
1
+ import { useMemo } from "react";
2
+ import { useFeature } from "../../host/features.js";
3
+ import { useArbiSessionState } from "../../session/index.js";
4
+ import { useWorkflows } from "../../workforce.js";
5
+ import { useNames } from "../members.js";
6
+ import { defineRowsSource, staticFields } from "../rows-source.js";
7
+ const DEFAULT_WORKFLOWS_SOURCE_LABELS = {
8
+ source: "Workflows",
9
+ description: "Your workflows: what starts them, how their last run ended, and when they run next.",
10
+ name: "Workflow",
11
+ trigger: "Starts",
12
+ triggers: {
13
+ manual: "By hand",
14
+ after: "After a task",
15
+ event: "On an event",
16
+ schedule: "On a schedule",
17
+ once: "Once"
18
+ },
19
+ active: "On",
20
+ lastRun: "Last run",
21
+ lastResult: "Last result",
22
+ results: {
23
+ completed: "Success",
24
+ success: "Success",
25
+ failed: "Failed",
26
+ running: "In progress",
27
+ awaiting_authorization: "Awaiting access"
28
+ },
29
+ nextRun: "Next run",
30
+ owner: "Owner",
31
+ shared: "Shared",
32
+ created: "Created"
33
+ };
34
+ function triggerOf(w) {
35
+ if (w.on_demand) return "manual";
36
+ if (w.after_conversation_ext_id) return "after";
37
+ if (w.event_kind) return "event";
38
+ if (w.rrule) return "schedule";
39
+ if (w.run_at) return "once";
40
+ return "manual";
41
+ }
42
+ function createWorkflowsSource(labels) {
43
+ const l = { ...DEFAULT_WORKFLOWS_SOURCE_LABELS, ...labels };
44
+ const fields = [
45
+ { id: "name", label: l.name, type: "string" },
46
+ { id: "trigger", label: l.trigger, type: "string", options: Object.values(l.triggers) },
47
+ { id: "active", label: l.active, type: "boolean" },
48
+ { id: "lastRun", label: l.lastRun, type: "date" },
49
+ { id: "lastResult", label: l.lastResult, type: "string" },
50
+ { id: "nextRun", label: l.nextRun, type: "date" },
51
+ { id: "owner", label: l.owner, type: "string" },
52
+ { id: "shared", label: l.shared, type: "boolean" },
53
+ { id: "created", label: l.created, type: "date" }
54
+ ];
55
+ return defineRowsSource({
56
+ id: "workflows",
57
+ scope: "workspace",
58
+ label: l.source,
59
+ description: l.description,
60
+ useFields: staticFields(fields),
61
+ useRows(_params, enabled) {
62
+ const on = useFeature("workflows");
63
+ const workspaceId = useArbiSessionState((s) => s.workspaceId);
64
+ const query = useWorkflows({ enabled: enabled && on });
65
+ const nameOf = useNames(enabled);
66
+ const rows = useMemo(
67
+ () => query.data?.filter((w) => !!workspaceId && w.workspace_ext_id === workspaceId).map((w) => {
68
+ const result = w.last_run_status;
69
+ return {
70
+ name: w.name,
71
+ trigger: l.triggers[triggerOf(w)],
72
+ active: w.active,
73
+ lastRun: w.last_fired_at ?? null,
74
+ lastResult: result ? l.results[result] ?? result.replaceAll("_", " ") : null,
75
+ nextRun: w.next_fire_at ?? null,
76
+ owner: nameOf(w.owner_ext_id),
77
+ shared: w.shared,
78
+ created: w.created_at
79
+ };
80
+ }),
81
+ [query.data, nameOf, workspaceId]
82
+ );
83
+ return { rows, isLoading: query.isLoading, error: query.error };
84
+ }
85
+ });
86
+ }
87
+ export {
88
+ DEFAULT_WORKFLOWS_SOURCE_LABELS,
89
+ createWorkflowsSource
90
+ };
91
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/datasets/sources/workflows.ts"],
4
+ "sourcesContent": ["/**\n * The open workspace's workflows as a dataset: a row per workflow with what starts it, whether it\n * is on, how its last run ended and when it runs next. Reads the shared workflow list\n * (`useWorkflows`), keeping the workflows of the open workspace, so the figures match its\n * activity (a workflow's runs over time are the activity source's `workflow` entries). Nothing is\n * read while the host's `workflows` feature is off.\n */\nimport { useMemo } from 'react'\nimport type { WorkflowResponse } from '@arbidocs/sdk/browser'\nimport { useFeature } from '../../host/features'\nimport { useArbiSessionState } from '../../session'\nimport { useWorkflows } from '../../workforce'\nimport { useNames } from '../members'\nimport { defineRowsSource, staticFields } from '../rows-source'\nimport type { DataSource, DatasetField, DatasetRow } from '../types'\n\ntype Trigger = 'manual' | 'after' | 'event' | 'schedule' | 'once'\n\nexport interface WorkflowsSourceLabels {\n source: string\n description: string\n name: string\n trigger: string\n triggers: Record<Trigger, string>\n active: string\n lastRun: string\n lastResult: string\n /** A last run status by the server's name; one not listed is shown as it comes. */\n results: Readonly<Record<string, string>>\n nextRun: string\n owner: string\n shared: string\n created: string\n}\n\nexport const DEFAULT_WORKFLOWS_SOURCE_LABELS: WorkflowsSourceLabels = {\n source: 'Workflows',\n description:\n 'Your workflows: what starts them, how their last run ended, and when they run next.',\n name: 'Workflow',\n trigger: 'Starts',\n triggers: {\n manual: 'By hand',\n after: 'After a task',\n event: 'On an event',\n schedule: 'On a schedule',\n once: 'Once',\n },\n active: 'On',\n lastRun: 'Last run',\n lastResult: 'Last result',\n results: {\n completed: 'Success',\n success: 'Success',\n failed: 'Failed',\n running: 'In progress',\n awaiting_authorization: 'Awaiting access',\n },\n nextRun: 'Next run',\n owner: 'Owner',\n shared: 'Shared',\n created: 'Created',\n}\n\nfunction triggerOf(w: WorkflowResponse): Trigger {\n if (w.on_demand) return 'manual'\n if (w.after_conversation_ext_id) return 'after'\n if (w.event_kind) return 'event'\n if (w.rrule) return 'schedule'\n if (w.run_at) return 'once'\n return 'manual'\n}\n\nexport function createWorkflowsSource(labels?: Partial<WorkflowsSourceLabels>): DataSource {\n const l = { ...DEFAULT_WORKFLOWS_SOURCE_LABELS, ...labels }\n const fields: DatasetField[] = [\n { id: 'name', label: l.name, type: 'string' },\n { id: 'trigger', label: l.trigger, type: 'string', options: Object.values(l.triggers) },\n { id: 'active', label: l.active, type: 'boolean' },\n { id: 'lastRun', label: l.lastRun, type: 'date' },\n { id: 'lastResult', label: l.lastResult, type: 'string' },\n { id: 'nextRun', label: l.nextRun, type: 'date' },\n { id: 'owner', label: l.owner, type: 'string' },\n { id: 'shared', label: l.shared, type: 'boolean' },\n { id: 'created', label: l.created, type: 'date' },\n ]\n return defineRowsSource({\n id: 'workflows',\n scope: 'workspace',\n label: l.source,\n description: l.description,\n useFields: staticFields(fields),\n useRows(_params, enabled) {\n const on = useFeature('workflows')\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const query = useWorkflows({ enabled: enabled && on })\n const nameOf = useNames(enabled)\n const rows = useMemo(\n () =>\n query.data\n ?.filter((w) => !!workspaceId && w.workspace_ext_id === workspaceId)\n .map((w): DatasetRow => {\n const result = w.last_run_status\n return {\n name: w.name,\n trigger: l.triggers[triggerOf(w)],\n active: w.active,\n lastRun: w.last_fired_at ?? null,\n lastResult: result ? (l.results[result] ?? result.replaceAll('_', ' ')) : null,\n nextRun: w.next_fire_at ?? null,\n owner: nameOf(w.owner_ext_id),\n shared: w.shared,\n created: w.created_at,\n }\n }),\n [query.data, nameOf, workspaceId]\n )\n return { rows, isLoading: query.isLoading, error: query.error }\n },\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,67 @@
1
+ import { useMemo } from "react";
2
+ import { useProjects, useWorkspaces } from "../../hooks.js";
3
+ import { defineRowsSource, staticFields } from "../rows-source.js";
4
+ const DEFAULT_WORKSPACES_SOURCE_LABELS = {
5
+ source: "Workspaces",
6
+ description: "Your workspaces: their project, documents, threads, members and storage.",
7
+ name: "Workspace",
8
+ project: "Project",
9
+ documents: "Documents",
10
+ threads: "Threads",
11
+ members: "Members",
12
+ storage: "Storage (MB)",
13
+ created: "Created",
14
+ updated: "Updated",
15
+ shared: "Public"
16
+ };
17
+ function createWorkspacesSource(labels) {
18
+ const l = { ...DEFAULT_WORKSPACES_SOURCE_LABELS, ...labels };
19
+ const fields = [
20
+ { id: "name", label: l.name, type: "string" },
21
+ { id: "project", label: l.project, type: "string" },
22
+ { id: "documents", label: l.documents, type: "number" },
23
+ { id: "threads", label: l.threads, type: "number" },
24
+ { id: "members", label: l.members, type: "number" },
25
+ { id: "storage", label: l.storage, type: "number", unit: "MB" },
26
+ { id: "created", label: l.created, type: "date" },
27
+ { id: "updated", label: l.updated, type: "date" },
28
+ { id: "shared", label: l.shared, type: "boolean" }
29
+ ];
30
+ return defineRowsSource({
31
+ id: "workspaces",
32
+ label: l.source,
33
+ description: l.description,
34
+ useFields: staticFields(fields),
35
+ useRows(_params, enabled) {
36
+ const workspaces = useWorkspaces({ enabled });
37
+ const projects = useProjects({ enabled });
38
+ const rows = useMemo(() => {
39
+ const list = workspaces.data;
40
+ if (!list) return void 0;
41
+ const projectNames = new Map(
42
+ (projects.data ?? []).map((p) => [
43
+ p.external_id,
44
+ p.name
45
+ ])
46
+ );
47
+ return list.map((w) => ({
48
+ name: w.name,
49
+ project: w.project_ext_id ? projectNames.get(w.project_ext_id) ?? null : null,
50
+ documents: (w.shared_document_count ?? 0) + (w.private_document_count ?? 0),
51
+ threads: (w.shared_conversation_count ?? 0) + (w.private_conversation_count ?? 0),
52
+ members: w.users?.length ?? 0,
53
+ storage: Math.round((w.user_files_mb ?? 0) * 10) / 10,
54
+ created: w.created_at ?? null,
55
+ updated: w.updated_at ?? null,
56
+ shared: w.is_public ?? null
57
+ }));
58
+ }, [workspaces.data, projects.data]);
59
+ return { rows, isLoading: workspaces.isLoading, error: workspaces.error };
60
+ }
61
+ });
62
+ }
63
+ export {
64
+ DEFAULT_WORKSPACES_SOURCE_LABELS,
65
+ createWorkspacesSource
66
+ };
67
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/datasets/sources/workspaces.ts"],
4
+ "sourcesContent": ["/**\n * The workspaces the user can see as a dataset: a row per workspace with its project, how many\n * documents, threads and members it has, and its stored files. Documents or storage by workspace or\n * by project are a group-by and a sum away. Reads the shared lists (`useWorkspaces`, `useProjects`).\n */\nimport { useMemo } from 'react'\nimport { useProjects, useWorkspaces } from '../../hooks'\nimport { defineRowsSource, staticFields } from '../rows-source'\nimport type { DataSource, DatasetField, DatasetRow } from '../types'\n\nexport interface WorkspacesSourceLabels {\n source: string\n description: string\n name: string\n project: string\n documents: string\n threads: string\n members: string\n storage: string\n created: string\n updated: string\n shared: string\n}\n\nexport const DEFAULT_WORKSPACES_SOURCE_LABELS: WorkspacesSourceLabels = {\n source: 'Workspaces',\n description: 'Your workspaces: their project, documents, threads, members and storage.',\n name: 'Workspace',\n project: 'Project',\n documents: 'Documents',\n threads: 'Threads',\n members: 'Members',\n storage: 'Storage (MB)',\n created: 'Created',\n updated: 'Updated',\n shared: 'Public',\n}\n\ninterface WorkspaceLike {\n external_id: string\n name: string\n project_ext_id?: string | null\n shared_document_count?: number | null\n private_document_count?: number | null\n shared_conversation_count?: number | null\n private_conversation_count?: number | null\n users?: unknown[] | null\n user_files_mb?: number | null\n created_at?: string | null\n updated_at?: string | null\n is_public?: boolean | null\n}\n\nexport function createWorkspacesSource(labels?: Partial<WorkspacesSourceLabels>): DataSource {\n const l = { ...DEFAULT_WORKSPACES_SOURCE_LABELS, ...labels }\n const fields: DatasetField[] = [\n { id: 'name', label: l.name, type: 'string' },\n { id: 'project', label: l.project, type: 'string' },\n { id: 'documents', label: l.documents, type: 'number' },\n { id: 'threads', label: l.threads, type: 'number' },\n { id: 'members', label: l.members, type: 'number' },\n { id: 'storage', label: l.storage, type: 'number', unit: 'MB' },\n { id: 'created', label: l.created, type: 'date' },\n { id: 'updated', label: l.updated, type: 'date' },\n { id: 'shared', label: l.shared, type: 'boolean' },\n ]\n return defineRowsSource({\n id: 'workspaces',\n label: l.source,\n description: l.description,\n useFields: staticFields(fields),\n useRows(_params, enabled) {\n const workspaces = useWorkspaces({ enabled })\n const projects = useProjects({ enabled })\n const rows = useMemo(() => {\n const list = workspaces.data as WorkspaceLike[] | undefined\n if (!list) return undefined\n const projectNames = new Map(\n ((projects.data ?? []) as Array<{ external_id: string; name: string }>).map((p) => [\n p.external_id,\n p.name,\n ])\n )\n return list.map((w): DatasetRow => ({\n name: w.name,\n project: w.project_ext_id ? (projectNames.get(w.project_ext_id) ?? null) : null,\n documents: (w.shared_document_count ?? 0) + (w.private_document_count ?? 0),\n threads: (w.shared_conversation_count ?? 0) + (w.private_conversation_count ?? 0),\n members: w.users?.length ?? 0,\n storage: Math.round((w.user_files_mb ?? 0) * 10) / 10,\n created: w.created_at ?? null,\n updated: w.updated_at ?? null,\n shared: w.is_public ?? null,\n }))\n }, [workspaces.data, projects.data])\n return { rows, isLoading: workspaces.isLoading, error: workspaces.error }\n },\n })\n}\n"],
5
+ "mappings": "AAKA,SAAS,eAAe;AACxB,SAAS,aAAa,qBAAqB;AAC3C,SAAS,kBAAkB,oBAAoB;AAiBxC,MAAM,mCAA2D;AAAA,EACtE,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAiBO,SAAS,uBAAuB,QAAsD;AAC3F,QAAM,IAAI,EAAE,GAAG,kCAAkC,GAAG,OAAO;AAC3D,QAAM,SAAyB;AAAA,IAC7B,EAAE,IAAI,QAAQ,OAAO,EAAE,MAAM,MAAM,SAAS;AAAA,IAC5C,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,SAAS;AAAA,IAClD,EAAE,IAAI,aAAa,OAAO,EAAE,WAAW,MAAM,SAAS;AAAA,IACtD,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,SAAS;AAAA,IAClD,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,SAAS;AAAA,IAClD,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,UAAU,MAAM,KAAK;AAAA,IAC9D,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,OAAO;AAAA,IAChD,EAAE,IAAI,WAAW,OAAO,EAAE,SAAS,MAAM,OAAO;AAAA,IAChD,EAAE,IAAI,UAAU,OAAO,EAAE,QAAQ,MAAM,UAAU;AAAA,EACnD;AACA,SAAO,iBAAiB;AAAA,IACtB,IAAI;AAAA,IACJ,OAAO,EAAE;AAAA,IACT,aAAa,EAAE;AAAA,IACf,WAAW,aAAa,MAAM;AAAA,IAC9B,QAAQ,SAAS,SAAS;AACxB,YAAM,aAAa,cAAc,EAAE,QAAQ,CAAC;AAC5C,YAAM,WAAW,YAAY,EAAE,QAAQ,CAAC;AACxC,YAAM,OAAO,QAAQ,MAAM;AACzB,cAAM,OAAO,WAAW;AACxB,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,eAAe,IAAI;AAAA,WACrB,SAAS,QAAQ,CAAC,GAAoD,IAAI,CAAC,MAAM;AAAA,YACjF,EAAE;AAAA,YACF,EAAE;AAAA,UACJ,CAAC;AAAA,QACH;AACA,eAAO,KAAK,IAAI,CAAC,OAAmB;AAAA,UAClC,MAAM,EAAE;AAAA,UACR,SAAS,EAAE,iBAAkB,aAAa,IAAI,EAAE,cAAc,KAAK,OAAQ;AAAA,UAC3E,YAAY,EAAE,yBAAyB,MAAM,EAAE,0BAA0B;AAAA,UACzE,UAAU,EAAE,6BAA6B,MAAM,EAAE,8BAA8B;AAAA,UAC/E,SAAS,EAAE,OAAO,UAAU;AAAA,UAC5B,SAAS,KAAK,OAAO,EAAE,iBAAiB,KAAK,EAAE,IAAI;AAAA,UACnD,SAAS,EAAE,cAAc;AAAA,UACzB,SAAS,EAAE,cAAc;AAAA,UACzB,QAAQ,EAAE,aAAa;AAAA,QACzB,EAAE;AAAA,MACJ,GAAG,CAAC,WAAW,MAAM,SAAS,IAAI,CAAC;AACnC,aAAO,EAAE,MAAM,WAAW,WAAW,WAAW,OAAO,WAAW,MAAM;AAAA,IAC1E;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,194 @@
1
+ import { useMemo } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { useArbiHost } from "../host/config.js";
4
+ import { useArbi } from "../useArbi.js";
5
+ import { arbiQueryKeys } from "../query-keys.js";
6
+ const ANALYTICS_CHART_VIEW = "analytics.chartDatabase";
7
+ const MAX_DASHBOARD_SPEC_CHARS = 1e4;
8
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
9
+ function isPanel(v) {
10
+ return isObject(v) && typeof v.id === "string" && typeof v.title === "string" && isObject(v.source) && typeof v.source.id === "string" && isObject(v.chart) && typeof v.chart.type === "string";
11
+ }
12
+ function parseDashboardSpec(value) {
13
+ let parsed = value;
14
+ if (typeof value === "string") {
15
+ try {
16
+ parsed = JSON.parse(value);
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+ if (!isObject(parsed) || parsed.version !== 1 || typeof parsed.title !== "string") return null;
22
+ const panels = Array.isArray(parsed.panels) ? parsed.panels.filter(isPanel) : [];
23
+ return {
24
+ version: 1,
25
+ title: parsed.title,
26
+ ...typeof parsed.description === "string" ? { description: parsed.description } : {},
27
+ panels
28
+ };
29
+ }
30
+ function serializeDashboardSpec(spec, max = MAX_DASHBOARD_SPEC_CHARS) {
31
+ const json = JSON.stringify(spec);
32
+ if (json.length > max) {
33
+ throw new Error(
34
+ `This dashboard is too large to save (${json.length.toLocaleString("en-GB")} characters, at most ${max.toLocaleString("en-GB")}). Remove a panel or split it into two dashboards.`
35
+ );
36
+ }
37
+ return json;
38
+ }
39
+ function useUserDashboardStore() {
40
+ const arbi = useArbi();
41
+ const scope = arbi.isLoggedIn ? arbi.user.identity()?.externalId ?? null : null;
42
+ return useMemo(
43
+ () => ({
44
+ scope: scope && `user:${scope}`,
45
+ list: async () => (await arbi.dashboards.list()).map(({ id, json, updatedAt }) => {
46
+ const spec = json === null ? null : parseDashboardSpec(json);
47
+ return spec ? { id, spec, updatedAt } : {
48
+ id,
49
+ spec: { version: 1, title: "", panels: [] },
50
+ updatedAt,
51
+ unreadable: true
52
+ };
53
+ }),
54
+ async save({ id, spec }) {
55
+ const saved = await arbi.dashboards.save({ id, json: serializeDashboardSpec(spec) });
56
+ return { id: saved.id, spec, updatedAt: saved.updatedAt };
57
+ },
58
+ remove: (id) => arbi.dashboards.remove(id)
59
+ }),
60
+ [arbi, scope]
61
+ );
62
+ }
63
+ function createMemoryDashboardStore(initial = [], scope = "memory") {
64
+ let items = [...initial];
65
+ let next = items.length + 1;
66
+ return {
67
+ scope,
68
+ list: async () => items.map((d) => ({ ...d })),
69
+ save: async ({ id, spec }) => {
70
+ const saved = { id: id ?? `dash-${next++}`, spec, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
71
+ items = id ? items.map((d) => d.id === id ? saved : d) : [...items, saved];
72
+ return saved;
73
+ },
74
+ remove: async (id) => {
75
+ items = items.filter((d) => d.id !== id);
76
+ }
77
+ };
78
+ }
79
+ const NAME_COLUMN = "Name";
80
+ const SPEC_COLUMN = "Spec";
81
+ function useDatabaseDashboardStore(options = {}) {
82
+ const arbi = useArbi();
83
+ const queryClient = useQueryClient();
84
+ const name = options.name ?? "Dashboards";
85
+ const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
86
+ return useMemo(() => {
87
+ async function find() {
88
+ const all = await arbi.databases.list();
89
+ return all.find(
90
+ (d) => d.editable && d.workspace_id === workspaceId && d.name === name && (d.columns ?? []).some((c) => c.name === SPEC_COLUMN)
91
+ );
92
+ }
93
+ function inWorkspace(read) {
94
+ return workspaceId ? arbi.readInWorkspace(workspaceId, read) : read();
95
+ }
96
+ async function ensure() {
97
+ return inWorkspace(ensureHere);
98
+ }
99
+ async function ensureHere() {
100
+ const found = await find();
101
+ if (found) return found;
102
+ const created = await arbi.databases.create({
103
+ name,
104
+ description: "Saved dashboards (written by the Dashboards page).",
105
+ columns: [
106
+ { name: NAME_COLUMN, type: "text" },
107
+ { name: SPEC_COLUMN, type: "text" }
108
+ ]
109
+ });
110
+ void queryClient.invalidateQueries({
111
+ queryKey: arbiQueryKeys.databaseList(workspaceId ?? void 0)
112
+ });
113
+ return created;
114
+ }
115
+ return {
116
+ scope: workspaceId,
117
+ list: () => inWorkspace(async () => {
118
+ const database = await find();
119
+ if (!database) return [];
120
+ const spec = database.columns?.find((c) => c.name === SPEC_COLUMN)?.id ?? SPEC_COLUMN;
121
+ const page = await arbi.databases.rows(database.id, { limit: 1e3 });
122
+ return page.rows.flatMap((row) => {
123
+ const parsed = parseDashboardSpec(row.values[spec]);
124
+ return parsed ? [{ id: row.id, spec: parsed, updatedAt: row.updated_at }] : [];
125
+ });
126
+ }),
127
+ async save({ id, spec }) {
128
+ const values = { [NAME_COLUMN]: spec.title, [SPEC_COLUMN]: serializeDashboardSpec(spec) };
129
+ const database = await ensure();
130
+ const row = id ? await arbi.databases.updateRow(database.id, id, values) : (await arbi.databases.addRows(database.id, [{ values }]))[0];
131
+ void queryClient.invalidateQueries({
132
+ queryKey: arbiQueryKeys.databaseRows(workspaceId ?? "", database.id)
133
+ });
134
+ return { id: row.id, spec, updatedAt: row.updated_at };
135
+ },
136
+ async remove(id) {
137
+ const database = await find();
138
+ if (!database) return;
139
+ await arbi.databases.deleteRows(database.id, [id]);
140
+ void queryClient.invalidateQueries({
141
+ queryKey: arbiQueryKeys.databaseRows(workspaceId ?? "", database.id)
142
+ });
143
+ }
144
+ };
145
+ }, [arbi, queryClient, name, workspaceId]);
146
+ }
147
+ function useDashboardStore() {
148
+ const { dashboards } = useArbiHost();
149
+ return (dashboards?.useStore ?? useUserDashboardStore)();
150
+ }
151
+ function useSavedDashboards(store) {
152
+ return useQuery({
153
+ queryKey: arbiQueryKeys.dashboards(store.scope ?? ""),
154
+ queryFn: () => store.list(),
155
+ enabled: store.scope !== null
156
+ });
157
+ }
158
+ function useSaveDashboard(store) {
159
+ const queryClient = useQueryClient();
160
+ const key = arbiQueryKeys.dashboards(store.scope ?? "");
161
+ return useMutation({
162
+ mutationFn: (dashboard) => store.save(dashboard),
163
+ onSuccess: (saved) => {
164
+ queryClient.setQueryData(
165
+ key,
166
+ (old = []) => old.some((d) => d.id === saved.id) ? old.map((d) => d.id === saved.id ? saved : d) : [...old, saved]
167
+ );
168
+ }
169
+ });
170
+ }
171
+ function useDeleteDashboard(store) {
172
+ const queryClient = useQueryClient();
173
+ const key = arbiQueryKeys.dashboards(store.scope ?? "");
174
+ return useMutation({
175
+ mutationFn: (id) => store.remove(id),
176
+ onSuccess: (_void, id) => {
177
+ queryClient.setQueryData(key, (old = []) => old.filter((d) => d.id !== id));
178
+ }
179
+ });
180
+ }
181
+ export {
182
+ ANALYTICS_CHART_VIEW,
183
+ MAX_DASHBOARD_SPEC_CHARS,
184
+ createMemoryDashboardStore,
185
+ parseDashboardSpec,
186
+ serializeDashboardSpec,
187
+ useDashboardStore,
188
+ useDatabaseDashboardStore,
189
+ useDeleteDashboard,
190
+ useSaveDashboard,
191
+ useSavedDashboards,
192
+ useUserDashboardStore
193
+ };
194
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/datasets/store.ts"],
4
+ "sourcesContent": ["/**\n * Saved dashboards: where `DashboardSpec`s are kept, and the hooks that read and write them.\n *\n * Default store: the person's own (`useUserDashboardStore`, `/v1/user/dashboards`), each spec sealed\n * in the browser to their own key, so Analytics is theirs across workspaces. A host keeps them\n * elsewhere with `<ArbiHost config={{ dashboards: { useStore } }}>`, e.g. in a database of the open\n * workspace, shared with its members (`useDatabaseDashboardStore`).\n */\nimport { useMemo } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbiHost } from '../host/config'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../query-keys'\nimport type { DashboardSpec, PanelSpec } from './types'\n\n/**\n * The transient view through which a host asks Analytics to chart a database (\"Chart this\"): set it to\n * `{ id, name, workspaceId }` and open the page, which makes a dashboard on that database and clears it.\n */\nexport const ANALYTICS_CHART_VIEW = 'analytics.chartDatabase'\n\n/** A database Analytics is asked to chart. */\nexport interface AnalyticsChartRequest {\n id: string\n name: string\n /** The database's workspace, so the new panels read it from anywhere. */\n workspaceId?: string\n}\n\n/** A dashboard as stored. */\nexport interface SavedDashboard {\n id: string\n spec: DashboardSpec\n updatedAt?: string\n /** It could not be opened (sealed under another key, or not a dashboard): it can only be deleted. */\n unreadable?: boolean\n}\n\n/** Where dashboards are kept. */\nexport interface DashboardStore {\n /** What the saved list is cached under (the workspace it belongs to). `null`: not available. */\n scope: string | null\n list: () => Promise<SavedDashboard[]>\n /** Create (no `id`) or replace a dashboard; resolves with it as stored. */\n save: (dashboard: { id?: string; spec: DashboardSpec }) => Promise<SavedDashboard>\n remove: (id: string) => Promise<void>\n}\n\n/** The longest spec a database text cell holds (the server's limit). */\nexport const MAX_DASHBOARD_SPEC_CHARS = 10_000\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\nfunction isPanel(v: unknown): v is PanelSpec {\n return (\n isObject(v) &&\n typeof v.id === 'string' &&\n typeof v.title === 'string' &&\n isObject(v.source) &&\n typeof v.source.id === 'string' &&\n isObject(v.chart) &&\n typeof v.chart.type === 'string'\n )\n}\n\n/** A stored spec, checked: `null` when it is not a dashboard (malformed panels are dropped). */\nexport function parseDashboardSpec(value: unknown): DashboardSpec | null {\n let parsed = value\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value)\n } catch {\n return null\n }\n }\n if (!isObject(parsed) || parsed.version !== 1 || typeof parsed.title !== 'string') return null\n const panels = Array.isArray(parsed.panels) ? parsed.panels.filter(isPanel) : []\n return {\n version: 1,\n title: parsed.title,\n ...(typeof parsed.description === 'string' ? { description: parsed.description } : {}),\n panels,\n }\n}\n\n/** A spec as JSON for storage; throws when it is longer than the store holds. */\nexport function serializeDashboardSpec(spec: DashboardSpec, max = MAX_DASHBOARD_SPEC_CHARS) {\n const json = JSON.stringify(spec)\n if (json.length > max) {\n throw new Error(\n `This dashboard is too large to save (${json.length.toLocaleString('en-GB')} characters, at most ${max.toLocaleString('en-GB')}). Remove a panel or split it into two dashboards.`\n )\n }\n return json\n}\n\n/** The person's own dashboards (`arbi.dashboards`: sealed to their key); unavailable signed out. */\nexport function useUserDashboardStore(): DashboardStore {\n const arbi = useArbi()\n const scope = arbi.isLoggedIn ? (arbi.user.identity()?.externalId ?? null) : null\n return useMemo(\n () => ({\n scope: scope && `user:${scope}`,\n list: async () =>\n (await arbi.dashboards.list()).map(({ id, json, updatedAt }) => {\n const spec = json === null ? null : parseDashboardSpec(json)\n return spec\n ? { id, spec, updatedAt }\n : {\n id,\n spec: { version: 1 as const, title: '', panels: [] },\n updatedAt,\n unreadable: true,\n }\n }),\n async save({ id, spec }) {\n const saved = await arbi.dashboards.save({ id, json: serializeDashboardSpec(spec) })\n return { id: saved.id, spec, updatedAt: saved.updatedAt }\n },\n remove: (id) => arbi.dashboards.remove(id),\n }),\n [arbi, scope]\n )\n}\n\n/** A store kept in memory (a demo, a test, a page without a workspace). */\nexport function createMemoryDashboardStore(\n initial: readonly SavedDashboard[] = [],\n scope = 'memory'\n): DashboardStore {\n let items = [...initial]\n let next = items.length + 1\n return {\n scope,\n list: async () => items.map((d) => ({ ...d })),\n save: async ({ id, spec }) => {\n const saved = { id: id ?? `dash-${next++}`, spec, updatedAt: new Date().toISOString() }\n items = id ? items.map((d) => (d.id === id ? saved : d)) : [...items, saved]\n return saved\n },\n remove: async (id) => {\n items = items.filter((d) => d.id !== id)\n },\n }\n}\n\nexport interface DatabaseDashboardStoreOptions {\n /** The database's name. Default \"Dashboards\". */\n name?: string\n}\n\nconst NAME_COLUMN = 'Name'\nconst SPEC_COLUMN = 'Spec'\n\n/** Dashboards kept as rows of a database of the open workspace (made on the first save). */\nexport function useDatabaseDashboardStore(\n options: DatabaseDashboardStoreOptions = {}\n): DashboardStore {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const name = options.name ?? 'Dashboards'\n const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : null\n return useMemo(() => {\n /** The workspace's own dashboards database, if there is one. */\n async function find() {\n const all = await arbi.databases.list()\n return all.find(\n (d) =>\n d.editable &&\n d.workspace_id === workspaceId &&\n d.name === name &&\n (d.columns ?? []).some((c) => c.name === SPEC_COLUMN)\n )\n }\n /**\n * Run `read` only while this store's workspace is the one open on the server (databases are\n * listed and created there): a switch meanwhile drops it, so nothing is cached, or created,\n * as another workspace's.\n */\n function inWorkspace<T>(read: () => Promise<T>): Promise<T> {\n return workspaceId ? arbi.readInWorkspace(workspaceId, read) : read()\n }\n async function ensure() {\n return inWorkspace(ensureHere)\n }\n async function ensureHere() {\n const found = await find()\n if (found) return found\n const created = await arbi.databases.create({\n name,\n description: 'Saved dashboards (written by the Dashboards page).',\n columns: [\n { name: NAME_COLUMN, type: 'text' },\n { name: SPEC_COLUMN, type: 'text' },\n ],\n })\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseList(workspaceId ?? undefined),\n })\n return created\n }\n return {\n scope: workspaceId,\n list: () =>\n inWorkspace(async () => {\n const database = await find()\n if (!database) return []\n const spec = database.columns?.find((c) => c.name === SPEC_COLUMN)?.id ?? SPEC_COLUMN\n const page = await arbi.databases.rows(database.id, { limit: 1000 })\n return page.rows.flatMap((row) => {\n const parsed = parseDashboardSpec(row.values[spec])\n return parsed ? [{ id: row.id, spec: parsed, updatedAt: row.updated_at }] : []\n })\n }),\n async save({ id, spec }) {\n const values = { [NAME_COLUMN]: spec.title, [SPEC_COLUMN]: serializeDashboardSpec(spec) }\n const database = await ensure()\n const row = id\n ? await arbi.databases.updateRow(database.id, id, values)\n : (await arbi.databases.addRows(database.id, [{ values }]))[0]\n // The database's own rows changed (it shows in Databases like any other).\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseRows(workspaceId ?? '', database.id),\n })\n return { id: row.id, spec, updatedAt: row.updated_at }\n },\n async remove(id) {\n const database = await find()\n if (!database) return\n await arbi.databases.deleteRows(database.id, [id])\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseRows(workspaceId ?? '', database.id),\n })\n },\n }\n }, [arbi, queryClient, name, workspaceId])\n}\n\n/** The store dashboards are kept in here: the host's (`dashboards.useStore`) or a database. */\nexport function useDashboardStore(): DashboardStore {\n const { dashboards } = useArbiHost()\n // The host's configuration is one object for its life: the same hook runs every render.\n return (dashboards?.useStore ?? useUserDashboardStore)()\n}\n\n/** The saved dashboards, oldest first. */\nexport function useSavedDashboards(store: DashboardStore) {\n return useQuery({\n queryKey: arbiQueryKeys.dashboards(store.scope ?? ''),\n queryFn: () => store.list(),\n enabled: store.scope !== null,\n })\n}\n\n/** Save a dashboard (create without `id`); the saved list takes it straight away. */\nexport function useSaveDashboard(store: DashboardStore) {\n const queryClient = useQueryClient()\n const key = arbiQueryKeys.dashboards(store.scope ?? '')\n return useMutation({\n mutationFn: (dashboard: { id?: string; spec: DashboardSpec }) => store.save(dashboard),\n onSuccess: (saved) => {\n queryClient.setQueryData<SavedDashboard[]>(key, (old = []) =>\n old.some((d) => d.id === saved.id)\n ? old.map((d) => (d.id === saved.id ? saved : d))\n : [...old, saved]\n )\n },\n })\n}\n\nexport function useDeleteDashboard(store: DashboardStore) {\n const queryClient = useQueryClient()\n const key = arbiQueryKeys.dashboards(store.scope ?? '')\n return useMutation({\n mutationFn: (id: string) => store.remove(id),\n onSuccess: (_void, id) => {\n queryClient.setQueryData<SavedDashboard[]>(key, (old = []) => old.filter((d) => d.id !== id))\n },\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ const AGGREGATE_FIELDS = {
2
+ /** The group's label ("Open", "2026-06"). */
3
+ group: "group",
4
+ /** The group's key as grouped (a date bucket, an id), for ordering and links. */
5
+ key: "key",
6
+ /** The series' label (only with `splitBy`). */
7
+ series: "series",
8
+ /** The measured value; `null` when the group has no value to measure. */
9
+ value: "value"
10
+ };
11
+ export {
12
+ AGGREGATE_FIELDS
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/datasets/types.ts"],
4
+ "sourcesContent": ["/**\n * Datasets: the one shape every chart and dashboard reads, whatever the data comes from.\n *\n * Three layers, each knowing only the one below it:\n * 1. A `DataSource` adapter (AI usage, documents, threads, projects, a database, later an external\n * feed) exposes its data as a normalized `Dataset`: typed fields and plain rows. Filtering,\n * grouping and aggregation happen here (`aggregateDataset`, or on the server where the backend\n * can, as a database does), never in a chart.\n * 2. A `ChartSpec` (inside a `PanelSpec`, inside a `DashboardSpec`) says what to show in terms of\n * field ids only: the chart type, x / series / y fields, the aggregate, sort and limit. It is\n * plain JSON, saved in dashboards and studio pages.\n * 3. A renderer (`@arbidocs/blocks/dashboards`) maps a spec plus the aggregated dataset onto the\n * drawing component. No renderer type appears here, so the renderer stays swappable.\n */\n\n/** A field's value type. Dates are ISO strings (`2026-06-12` or a full timestamp). */\nexport type DatasetFieldType = 'string' | 'number' | 'date' | 'boolean'\n\n/** One column of a dataset. */\nexport interface DatasetField {\n /** Stable id: what specs and rows use. */\n id: string\n /** What people read (a column name, \"Status\"). */\n label: string\n type: DatasetFieldType\n /**\n * The unit of a number field, which picks its formatting: `gbp` (\u00A3), `bytes`, `tokens`, or any\n * suffix (`\"MB\"`, `\"%\"`).\n */\n unit?: string\n /** The values a string field takes, when known (a select column's options), for a filter picker. */\n options?: readonly string[]\n /** A string field whose cell holds several values (tags, linked rows): a row counts in each. */\n multiple?: boolean\n}\n\n/** A cell: a scalar, `null` when empty, or a list for a `multiple` field. */\nexport type DatasetValue = string | number | boolean | null | readonly string[]\n\n/** One row, keyed by field id. */\nexport type DatasetRow = Readonly<Record<string, DatasetValue | undefined>>\n\n/** A normalized dataset: typed fields and the rows. */\nexport interface Dataset {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n /** Rows matched before grouping (after filters). */\n totalRows?: number\n /** More groups existed than the query's `limit`. */\n truncated?: boolean\n}\n\n/** How a date field is grouped. Keys: `2026-06-12`, `2026-W24`, `2026-06`, `2026-Q2`, `2026`. */\nexport type TimeBucket = 'day' | 'week' | 'month' | 'quarter' | 'year'\n\nexport type AggregateOp = 'count' | 'sum' | 'avg' | 'min' | 'max'\n\nexport type FilterOp =\n 'eq' | 'neq' | 'contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'empty' | 'not_empty'\n\n/** Keep rows whose `field` satisfies `op value` (compared in the field's type). */\nexport interface DatasetFilter {\n field: string\n op: FilterOp\n value?: string | number | boolean | null\n}\n\n/** How the groups are ordered: by label (dates: chronological), or by value. */\nexport type DatasetSort = 'label' | 'value-desc' | 'value-asc'\n\n/** How records are ordered: by a field (empty cells last). */\nexport interface DatasetOrder {\n field: string\n /** Default `asc`. */\n direction?: 'asc' | 'desc'\n}\n\n/**\n * What to read of a source. Grouped (the default): the (filtered) rows grouped and each group\n * measured, a dataset in long form with the fields {@link AGGREGATE_FIELDS}, one row per group (and\n * series). With `records`: the matching rows themselves, ordered by `orderBy` and cut at `limit`.\n */\nexport interface DatasetQuery {\n /** List the matching records instead of grouping them (`groupBy`, `splitBy`, `measure` unused). */\n records?: boolean\n /** The order of the records. */\n orderBy?: DatasetOrder\n filters?: readonly DatasetFilter[]\n /** The field whose values (or date buckets) are the groups. Absent: one group, \"All\". */\n groupBy?: string\n /** The bucket of a date `groupBy` / `splitBy`. Default `month`. */\n bucket?: TimeBucket\n /** A second field: one series per value (a stacked or multi-line chart). */\n splitBy?: string\n /** Default: count rows. `count` with a `field` counts the rows where it is not empty. */\n measure?: { op: AggregateOp; field?: string }\n /** Default: dates chronological, others by value, largest first. */\n sort?: DatasetSort\n /** Most groups kept (by value), or records listed. Default 50 groups; every record. */\n limit?: number\n}\n\n/** The field ids of an aggregated dataset. */\nexport const AGGREGATE_FIELDS = {\n /** The group's label (\"Open\", \"2026-06\"). */\n group: 'group',\n /** The group's key as grouped (a date bucket, an id), for ordering and links. */\n key: 'key',\n /** The series' label (only with `splitBy`). */\n series: 'series',\n /** The measured value; `null` when the group has no value to measure. */\n value: 'value',\n} as const\n\n/** A dataset (or a source's fields) as a hook reads it. */\nexport interface DatasetState {\n dataset: Dataset | undefined\n isLoading: boolean\n error: unknown\n}\n\nexport interface DataSourceFieldsState {\n fields: readonly DatasetField[]\n isLoading: boolean\n error: unknown\n}\n\n/** A source's parameters as saved in a panel (a database id, a period). */\nexport type DataSourceParams = Readonly<\n Record<string, string | number | boolean | null | undefined>\n>\n\n/** A choice for a parameter (an option of a select). */\nexport interface DataSourceOption {\n value: string\n label: string\n /** Other parameters set with this choice (a database's workspace, so a panel reads it anywhere). */\n params?: DataSourceParams\n}\n\n/** A parameter the panel editor asks for, before the source's fields are known. */\nexport interface DataSourceParam {\n id: string\n label: string\n /** Absent: the parameter may be left empty. */\n required?: boolean\n /** Shown when nothing is chosen (\"All columns\"). */\n placeholder?: string\n /** The choices, read live (databases of the open workspace; a database's saved views). */\n useOptions: (params: DataSourceParams) => {\n options: readonly DataSourceOption[]\n isLoading: boolean\n }\n}\n\n/**\n * A data source adapter: where a dataset comes from.\n *\n * `useFields` and `useDataset` are hooks. A caller renders them from a component keyed by the\n * source id, so switching source mounts afresh (the hooks differ between sources).\n *\n * Extension point: an external source (an HTTP/JSON API, a CSV feed, a warehouse) is one more\n * adapter. It reads its rows however it likes (its own `useQuery`) and returns them as a `Dataset`;\n * `defineRowsSource` aggregates them for it. A host lists it in `<ArbiHost config={{ dashboards:\n * { sources } }}>` and every editor, panel and studio block offers it. Fetching third-party URLs\n * from the browser is the host's decision (CORS, credentials, what a shared dashboard may reach),\n * so none is built in; data to chart today is imported into a database (CSV / spreadsheet import).\n */\nexport interface DataSource {\n id: string\n label: string\n description?: string\n /** `workspace`: it reads the open workspace's data (documents, threads\u2026), so it shows nothing until\n * one is open; a function decides from the panel's parameters (a database panel that does not name\n * its workspace). Absent: it is the person's own or names what it reads (AI usage). */\n scope?: 'workspace' | ((params: DataSourceParams) => 'workspace' | undefined)\n params?: readonly DataSourceParam[]\n /** The fields a panel can use, given the parameters. */\n useFields: (params: DataSourceParams) => DataSourceFieldsState\n /**\n * The dataset: grouped and measured (long form with {@link AGGREGATE_FIELDS}), or the records\n * (`query.records`), filtered either way.\n */\n useDataset: (\n params: DataSourceParams,\n query: DatasetQuery,\n options?: { enabled?: boolean }\n ) => DatasetState\n}\n\n// \u2500\u2500 Specs: what a panel shows (plain JSON) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** How a panel draws its data. `metric` is one number; `table` a table of rows or groups. */\nexport type ChartType = 'metric' | 'bar' | 'line' | 'area' | 'pie' | 'donut' | 'table'\n\n/** What to show, in terms of the dataset's field ids. Serialisable. */\nexport interface ChartSpec {\n type: ChartType\n /** The category or date field along the x axis (pie slices; table groups). */\n x?: string\n /** The bucket of a date `x`. Default `month`. */\n bucket?: TimeBucket\n /** A field whose values become the series (stacked bars or areas, several lines). */\n series?: string\n /** The number field the aggregate reads (absent: rows are counted). */\n y?: string\n /** Default `count`. */\n aggregate?: AggregateOp\n sort?: DatasetSort\n limit?: number\n /** Stack the series (bar, area). */\n stacked?: boolean\n filters?: readonly DatasetFilter[]\n /** A table of records (no aggregate): the fields shown, in order. Absent: every field. */\n columns?: readonly string[]\n /** A table of records: their order. */\n orderBy?: DatasetOrder\n}\n\n/** The source a panel reads, by registry id, with its parameters. */\nexport interface DataSourceRef {\n id: string\n params?: DataSourceParams\n}\n\n/** One panel of a dashboard. */\nexport interface PanelSpec {\n id: string\n title: string\n description?: string\n source: DataSourceRef\n chart: ChartSpec\n /** Columns of the 12-column grid it spans on a wide screen (it is full width on a phone). */\n width?: number\n}\n\n/** A dashboard: a titled grid of panels. Plain JSON (`version` for later migrations). */\nexport interface DashboardSpec {\n version: 1\n title: string\n description?: string\n panels: readonly PanelSpec[]\n}\n"],
5
+ "mappings": "AAuGO,MAAM,mBAAmB;AAAA;AAAA,EAE9B,OAAO;AAAA;AAAA,EAEP,KAAK;AAAA;AAAA,EAEL,QAAQ;AAAA;AAAA,EAER,OAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,148 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Check, CheckCheck } from "lucide-react";
3
+ import { Badge } from "../ui/badge.js";
4
+ import { cn } from "../lib/utils.js";
5
+ import { formatRelativeTime, userDisplayName, isAgentUser } from "./utils.js";
6
+ import { DmAvatar } from "./DmAvatar.js";
7
+ import { AgentBadge } from "../entities/AgentMarkers.js";
8
+ function ConversationList({
9
+ conversations,
10
+ selectedPeerId,
11
+ onSelect,
12
+ classNames,
13
+ emptyState,
14
+ header,
15
+ className
16
+ }) {
17
+ return /* @__PURE__ */ jsxs(
18
+ "aside",
19
+ {
20
+ className: cn(
21
+ "flex min-h-0 flex-col border-b border-border md:w-80 md:shrink-0 md:border-b-0 md:border-r",
22
+ className
23
+ ),
24
+ "data-testid": "arbi-dm-list",
25
+ children: [
26
+ header === void 0 ? /* @__PURE__ */ jsxs("div", { className: "border-b border-border px-4 py-3", children: [
27
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-foreground", children: "Conversations" }),
28
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
29
+ conversations.length,
30
+ " ",
31
+ conversations.length === 1 ? "colleague" : "colleagues"
32
+ ] })
33
+ ] }) : header,
34
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: conversations.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-xs text-muted-foreground", children: emptyState ?? "No conversations yet." }) : /* @__PURE__ */ jsx("ul", { className: "w-full", children: conversations.map((c, i) => {
35
+ const { peer, lastMessage, unreadCount } = c;
36
+ const rowId = c.id ?? peer.external_id;
37
+ const newSection = c.sectionLabel && c.sectionLabel !== conversations[i - 1]?.sectionLabel;
38
+ const active = rowId === selectedPeerId;
39
+ const preview = lastMessage?.body ?? "No messages yet \u2014 say hello";
40
+ const unread = unreadCount > 0;
41
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
42
+ c.leading ?? /* @__PURE__ */ jsx(DmAvatar, { user: peer }),
43
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
45
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
46
+ /* @__PURE__ */ jsx(
47
+ "span",
48
+ {
49
+ className: cn(
50
+ "truncate text-sm text-foreground",
51
+ unread ? "font-bold" : "font-semibold"
52
+ ),
53
+ children: c.title ?? userDisplayName(peer)
54
+ }
55
+ ),
56
+ c.badge ?? (isAgentUser(peer) ? /* @__PURE__ */ jsx(AgentBadge, {}) : null)
57
+ ] }),
58
+ c.statusLabel ? /* @__PURE__ */ jsx(
59
+ Badge,
60
+ {
61
+ variant: "outline",
62
+ className: "shrink-0 rounded-full px-2 py-0 text-xs font-medium text-muted-foreground",
63
+ children: c.statusLabel
64
+ }
65
+ ) : unreadCount > 0 ? (
66
+ // Quiet by default: a filled brand pill with a shadow
67
+ // shouted louder than the message it was counting.
68
+ // Enough to catch the eye scanning the list, no more.
69
+ /* @__PURE__ */ jsx(
70
+ Badge,
71
+ {
72
+ variant: "accent",
73
+ className: cn(
74
+ "min-w-[1.125rem] justify-center rounded-full px-1 py-0 text-xs font-medium leading-[1.125rem] shadow-none",
75
+ classNames?.unreadBadge
76
+ ),
77
+ children: unreadCount
78
+ }
79
+ )
80
+ ) : null
81
+ ] }),
82
+ /* @__PURE__ */ jsxs("div", { className: "mt-1 flex items-center gap-1.5", children: [
83
+ lastMessage?.isMine ? lastMessage.read ? /* @__PURE__ */ jsx(
84
+ CheckCheck,
85
+ {
86
+ className: "size-3.5 shrink-0 text-ai-accent",
87
+ "aria-label": "Read"
88
+ }
89
+ ) : /* @__PURE__ */ jsx(
90
+ Check,
91
+ {
92
+ className: "size-3.5 shrink-0 text-muted-foreground",
93
+ "aria-label": "Sent"
94
+ }
95
+ ) : null,
96
+ /* @__PURE__ */ jsx(
97
+ "p",
98
+ {
99
+ className: cn(
100
+ "min-w-0 flex-1 truncate text-xs",
101
+ unread ? "font-medium text-foreground" : "text-muted-foreground"
102
+ ),
103
+ children: c.subtitle ?? preview
104
+ }
105
+ ),
106
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: lastMessage ? formatRelativeTime(lastMessage.createdAt) : "" })
107
+ ] })
108
+ ] })
109
+ ] });
110
+ const rowClass = cn(
111
+ // Each row is its own opaque surface. Left transparent it takes
112
+ // the panel's colour, and the chips stop reading as cards at all
113
+ // — which is the whole point of them.
114
+ "flex w-full items-start gap-3 border-b border-border/60 bg-card px-4 py-3 text-left transition-colors",
115
+ c.disabled ? "cursor-default" : active ? "bg-ai-accent-soft" : "hover:bg-accent/40"
116
+ );
117
+ return /* @__PURE__ */ jsxs("li", { children: [
118
+ newSection && /* @__PURE__ */ jsx(
119
+ "p",
120
+ {
121
+ className: "bg-muted/40 px-4 py-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground",
122
+ "data-testid": "arbi-dm-section",
123
+ children: c.sectionLabel
124
+ }
125
+ ),
126
+ c.disabled ? /* @__PURE__ */ jsxs("div", { "data-testid": `arbi-dm-conversation-${rowId}`, className: rowClass, children: [
127
+ body,
128
+ c.trailing
129
+ ] }) : /* @__PURE__ */ jsx(
130
+ "button",
131
+ {
132
+ type: "button",
133
+ onClick: () => onSelect(rowId),
134
+ "data-testid": `arbi-dm-conversation-${rowId}`,
135
+ className: rowClass,
136
+ children: body
137
+ }
138
+ )
139
+ ] }, rowId);
140
+ }) }) })
141
+ ]
142
+ }
143
+ );
144
+ }
145
+ export {
146
+ ConversationList
147
+ };
148
+ //# sourceMappingURL=ConversationList.js.map