@arbidocs/react 0.5.110 → 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 (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. package/dist/viewers/index.d.cts +0 -260
@@ -0,0 +1,63 @@
1
+ import {
2
+ useAiTask,
3
+ useWorkspaceDocs
4
+ } from "./engine.js";
5
+ import { toRedlineMarkdown, redlineStats, textToArtifact } from "./redline.js";
6
+ import {
7
+ MarkdownCode,
8
+ MarkdownLink,
9
+ MarkdownRenderer,
10
+ markdownSanitizeSchema
11
+ } from "./MarkdownRenderer.js";
12
+ import { MarkdownStreamingContext } from "./markdown-streaming-context.js";
13
+ import { splitMarkdownBlocks } from "./split-markdown-blocks.js";
14
+ import { normalizeCitationMarkup, trimOpenCitation, closeOpenEmphasis } from "./normalize-citations.js";
15
+ import { AiMarkdown } from "./AiMarkdown.js";
16
+ import { markdownBaseComponents } from "./markdown-base-components.js";
17
+ import { AiAnswer } from "./AiAnswer.js";
18
+ import { ArtifactCanvas } from "./ArtifactCanvas.js";
19
+ import { MessageArtifactCard } from "./MessageArtifactCard.js";
20
+ import { PassageCard } from "./PassageCard.js";
21
+ import { CitationRenderer } from "./CitationRenderer.js";
22
+ import {
23
+ cleanDraftMarkdown,
24
+ cleanDraftWithReport,
25
+ promoteBoldTitle,
26
+ repairParsedStructure,
27
+ repairParsedTitle,
28
+ stripAgentPreamble,
29
+ unescapeMarkdown,
30
+ unwrapCitationLinks
31
+ } from "./stored-markdown.js";
32
+ export {
33
+ AiAnswer,
34
+ AiMarkdown,
35
+ ArtifactCanvas,
36
+ CitationRenderer,
37
+ MarkdownCode,
38
+ MarkdownLink,
39
+ MarkdownRenderer,
40
+ MarkdownStreamingContext,
41
+ MessageArtifactCard,
42
+ PassageCard,
43
+ cleanDraftMarkdown,
44
+ cleanDraftWithReport,
45
+ closeOpenEmphasis,
46
+ markdownBaseComponents,
47
+ markdownSanitizeSchema,
48
+ normalizeCitationMarkup,
49
+ promoteBoldTitle,
50
+ redlineStats,
51
+ repairParsedStructure,
52
+ repairParsedTitle,
53
+ splitMarkdownBlocks,
54
+ stripAgentPreamble,
55
+ textToArtifact,
56
+ toRedlineMarkdown,
57
+ trimOpenCitation,
58
+ unescapeMarkdown,
59
+ unwrapCitationLinks,
60
+ useAiTask,
61
+ useWorkspaceDocs
62
+ };
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/index.ts"],
4
+ "sourcesContent": ["/**\n * `@arbidocs/react` AI kit \u2014 mid-level, token-neutral, domain-agnostic building\n * blocks for an AI-native app on ARBI. Compose these into pages; keep prompts,\n * domain model and branding in your app. See docs/ai-native-vertical-kit.md.\n *\n * Theming: components use shadcn semantic tokens plus an AI-accent contract the\n * consumer defines (accent tracks the shadcn --primary by default):\n * --color-ai-accent, --color-ai-accent-foreground, --color-ai-accent-soft, --color-ai-surface\n */\n\n// Engine hooks\nexport {\n useAiTask,\n useWorkspaceDocs,\n type AiTaskStatus,\n type AiRunOptions,\n type ArtifactEvent,\n} from './engine'\n\n// Redline engine\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from './redline'\n\n// UI components\nexport {\n MarkdownCode,\n MarkdownLink,\n MarkdownRenderer,\n markdownSanitizeSchema,\n type MarkdownRendererProps,\n} from './MarkdownRenderer'\nexport { MarkdownStreamingContext } from './markdown-streaming-context'\nexport { splitMarkdownBlocks } from './split-markdown-blocks'\nexport { normalizeCitationMarkup, trimOpenCitation, closeOpenEmphasis } from './normalize-citations'\nexport { AiMarkdown } from './AiMarkdown'\nexport { markdownBaseComponents } from './markdown-base-components'\nexport { AiAnswer } from './AiAnswer'\nexport { ArtifactCanvas } from './ArtifactCanvas'\nexport { MessageArtifactCard, type MessageArtifact } from './MessageArtifactCard'\nexport { PassageCard, type PassageCardProps } from './PassageCard'\nexport { CitationRenderer } from './CitationRenderer'\nexport type {\n CitationRendererProps,\n CitationState,\n ChunkActivation,\n RenderMarkdown,\n Chunk,\n ToolResponses,\n} from './CitationRenderer'\nexport {\n cleanDraftMarkdown,\n cleanDraftWithReport,\n type DraftCleanReport,\n type DraftCleanStage,\n promoteBoldTitle,\n repairParsedStructure,\n repairParsedTitle,\n stripAgentPreamble,\n unescapeMarkdown,\n unwrapCitationLinks,\n} from './stored-markdown'\n"],
5
+ "mappings": "AAWA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAGP,SAAS,mBAAmB,cAAc,sBAAsB;AAGhE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS,yBAAyB,kBAAkB,yBAAyB;AAC7E,SAAS,kBAAkB;AAC3B,SAAS,8BAA8B;AACvC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,2BAAiD;AAC1D,SAAS,mBAA0C;AACnD,SAAS,wBAAwB;AASjC;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,37 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ const markdownBaseComponents = {
3
+ h1: ({ children, ...props }) => /* @__PURE__ */ jsx("h1", { className: "text-lg font-semibold", "data-testid": "markdown-heading-1", ...props, children }),
4
+ h2: ({ children, ...props }) => /* @__PURE__ */ jsx("h2", { className: "font-semibold text-base", "data-testid": "markdown-heading-2", ...props, children }),
5
+ h3: ({ children, ...props }) => /* @__PURE__ */ jsx("h3", { className: "font-semibold text-base", "data-testid": "markdown-heading-3", ...props, children }),
6
+ h4: ({ children, ...props }) => /* @__PURE__ */ jsx("h4", { className: "font-semibold text-base", ...props, children }),
7
+ h5: ({ children, ...props }) => /* @__PURE__ */ jsx("h5", { className: "font-medium", ...props, children }),
8
+ strong: ({ children, ...props }) => /* @__PURE__ */ jsx("strong", { className: "font-semibold", ...props, children }),
9
+ blockquote: ({ children, ...props }) => /* @__PURE__ */ jsx("blockquote", { className: "border-l-2 border-primary pl-4", ...props, children }),
10
+ ol: ({ children, ...props }) => /* @__PURE__ */ jsx("ol", { className: "list-decimal space-y-2 pl-6", "data-testid": "markdown-ordered-list", ...props, children }),
11
+ ul: ({ children, ...props }) => /* @__PURE__ */ jsx("ul", { className: "list-none space-y-2 pl-6", "data-testid": "markdown-unordered-list", ...props, children }),
12
+ li: ({ children, ...props }) => /* @__PURE__ */ jsx("li", { className: "my-1.5", ...props, children }),
13
+ table: ({ children, ...props }) => /* @__PURE__ */ jsx("table", { "data-testid": "markdown-table", ...props, children }),
14
+ th: ({ children, ...props }) => /* @__PURE__ */ jsx("th", { ...props, children }),
15
+ td: ({ children, ...props }) => /* @__PURE__ */ jsx("td", { ...props, children }),
16
+ tr: ({ children, ...props }) => /* @__PURE__ */ jsx("tr", { ...props, children }),
17
+ p: ({ children, ...props }) => /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap", ...props, children }),
18
+ hr: (props) => /* @__PURE__ */ jsx("hr", { className: "border-foreground/20", ...props }),
19
+ sup: ({ children, ...props }) => /* @__PURE__ */ jsx("sup", { className: "text-xs", ...props, children }),
20
+ sub: ({ children, ...props }) => /* @__PURE__ */ jsx("sub", { className: "text-xs", ...props, children }),
21
+ div: ({ children, className, ...props }) => /* @__PURE__ */ jsx("div", { className, ...props, children }),
22
+ br: (props) => /* @__PURE__ */ jsx("br", { ...props }),
23
+ kbd: ({ children, ...props }) => /* @__PURE__ */ jsx(
24
+ "kbd",
25
+ {
26
+ className: "px-1.5 py-0.5 text-xs font-mono bg-muted border border-border rounded",
27
+ ...props,
28
+ children
29
+ }
30
+ ),
31
+ abbr: ({ children, title, ...props }) => /* @__PURE__ */ jsx("abbr", { title, className: "underline decoration-dotted cursor-help", ...props, children }),
32
+ cite: ({ children, ...props }) => /* @__PURE__ */ jsx("cite", { className: "italic", ...props, children })
33
+ };
34
+ export {
35
+ markdownBaseComponents
36
+ };
37
+ //# sourceMappingURL=markdown-base-components.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/markdown-base-components.tsx"],
4
+ "sourcesContent": ["import React from 'react'\nimport type { Components } from 'react-markdown'\n\n/**\n * Brand-neutral presentational component overrides for react-markdown, shared by\n * every markdown surface in the workspace (the monolith's `MarkdownRenderer` and\n * the AI kit's `AiMarkdown`). One house style for headings, lists, tables and the\n * inline text elements \u2014 token-based, so it themes per app.\n *\n * Deliberately excluded (kept per-consumer): `a` (external-link confirm vs\n * plain), `code`/`pre` (rich CodeBlock + Mermaid vs inline), `span` (doc-entity\n * pills), and `del`/`ins`/`mark` (general emphasis vs redline tracked-changes) \u2014\n * these differ by intent or carry heavy/coupled behaviour, so each renderer owns\n * them and spreads this base underneath.\n */\nexport const markdownBaseComponents: Partial<Components> = {\n h1: ({ children, ...props }: React.ComponentPropsWithoutRef<'h1'>) => (\n <h1 className=\"text-lg font-semibold\" data-testid=\"markdown-heading-1\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }: React.ComponentPropsWithoutRef<'h2'>) => (\n <h2 className=\"font-semibold text-base\" data-testid=\"markdown-heading-2\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }: React.ComponentPropsWithoutRef<'h3'>) => (\n <h3 className=\"font-semibold text-base\" data-testid=\"markdown-heading-3\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }: React.ComponentPropsWithoutRef<'h4'>) => (\n <h4 className=\"font-semibold text-base\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }: React.ComponentPropsWithoutRef<'h5'>) => (\n <h5 className=\"font-medium\" {...props}>\n {children}\n </h5>\n ),\n strong: ({ children, ...props }: React.ComponentPropsWithoutRef<'strong'>) => (\n <strong className=\"font-semibold\" {...props}>\n {children}\n </strong>\n ),\n blockquote: ({ children, ...props }: React.ComponentPropsWithoutRef<'blockquote'>) => (\n <blockquote className=\"border-l-2 border-primary pl-4\" {...props}>\n {children}\n </blockquote>\n ),\n ol: ({ children, ...props }: React.ComponentPropsWithoutRef<'ol'>) => (\n <ol className=\"list-decimal space-y-2 pl-6\" data-testid=\"markdown-ordered-list\" {...props}>\n {children}\n </ol>\n ),\n ul: ({ children, ...props }: React.ComponentPropsWithoutRef<'ul'>) => (\n <ul className=\"list-none space-y-2 pl-6\" data-testid=\"markdown-unordered-list\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }: React.ComponentPropsWithoutRef<'li'>) => (\n <li className=\"my-1.5\" {...props}>\n {children}\n </li>\n ),\n table: ({ children, ...props }: React.ComponentPropsWithoutRef<'table'>) => (\n <table data-testid=\"markdown-table\" {...props}>\n {children}\n </table>\n ),\n th: ({ children, ...props }: React.ComponentPropsWithoutRef<'th'>) => (\n <th {...props}>{children}</th>\n ),\n td: ({ children, ...props }: React.ComponentPropsWithoutRef<'td'>) => (\n <td {...props}>{children}</td>\n ),\n tr: ({ children, ...props }: React.ComponentPropsWithoutRef<'tr'>) => (\n <tr {...props}>{children}</tr>\n ),\n p: ({ children, ...props }: React.ComponentPropsWithoutRef<'p'>) => (\n <p className=\"whitespace-pre-wrap\" {...props}>\n {children}\n </p>\n ),\n hr: (props: React.ComponentPropsWithoutRef<'hr'>) => (\n <hr className=\"border-foreground/20\" {...props} />\n ),\n sup: ({ children, ...props }: React.ComponentPropsWithoutRef<'sup'>) => (\n <sup className=\"text-xs\" {...props}>\n {children}\n </sup>\n ),\n sub: ({ children, ...props }: React.ComponentPropsWithoutRef<'sub'>) => (\n <sub className=\"text-xs\" {...props}>\n {children}\n </sub>\n ),\n div: ({ children, className, ...props }: React.ComponentPropsWithoutRef<'div'>) => (\n <div className={className} {...props}>\n {children}\n </div>\n ),\n br: (props: React.ComponentPropsWithoutRef<'br'>) => <br {...props} />,\n kbd: ({ children, ...props }: React.ComponentPropsWithoutRef<'kbd'>) => (\n <kbd\n className=\"px-1.5 py-0.5 text-xs font-mono bg-muted border border-border rounded\"\n {...props}\n >\n {children}\n </kbd>\n ),\n abbr: ({ children, title, ...props }: React.ComponentPropsWithoutRef<'abbr'>) => (\n <abbr title={title} className=\"underline decoration-dotted cursor-help\" {...props}>\n {children}\n </abbr>\n ),\n cite: ({ children, ...props }: React.ComponentPropsWithoutRef<'cite'>) => (\n <cite className=\"italic\" {...props}>\n {children}\n </cite>\n ),\n}\n"],
5
+ "mappings": "AAiBI;AAFG,MAAM,yBAA8C;AAAA,EACzD,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,yBAAwB,eAAY,sBAAsB,GAAG,OACxE,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,2BAA0B,eAAY,sBAAsB,GAAG,OAC1E,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,2BAA0B,eAAY,sBAAsB,GAAG,OAC1E,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,2BAA2B,GAAG,OACzC,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,eAAe,GAAG,OAC7B,UACH;AAAA,EAEF,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,MAC5B,oBAAC,YAAO,WAAU,iBAAiB,GAAG,OACnC,UACH;AAAA,EAEF,YAAY,CAAC,EAAE,UAAU,GAAG,MAAM,MAChC,oBAAC,gBAAW,WAAU,kCAAkC,GAAG,OACxD,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,+BAA8B,eAAY,yBAAyB,GAAG,OACjF,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,4BAA2B,eAAY,2BAA2B,GAAG,OAChF,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAG,WAAU,UAAU,GAAG,OACxB,UACH;AAAA,EAEF,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,MAC3B,oBAAC,WAAM,eAAY,kBAAkB,GAAG,OACrC,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAI,GAAG,OAAQ,UAAS;AAAA,EAE3B,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAI,GAAG,OAAQ,UAAS;AAAA,EAE3B,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,MACxB,oBAAC,QAAI,GAAG,OAAQ,UAAS;AAAA,EAE3B,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,MACvB,oBAAC,OAAE,WAAU,uBAAuB,GAAG,OACpC,UACH;AAAA,EAEF,IAAI,CAAC,UACH,oBAAC,QAAG,WAAU,wBAAwB,GAAG,OAAO;AAAA,EAElD,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,MACzB,oBAAC,SAAI,WAAU,WAAW,GAAG,OAC1B,UACH;AAAA,EAEF,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,MACzB,oBAAC,SAAI,WAAU,WAAW,GAAG,OAC1B,UACH;AAAA,EAEF,KAAK,CAAC,EAAE,UAAU,WAAW,GAAG,MAAM,MACpC,oBAAC,SAAI,WAAuB,GAAG,OAC5B,UACH;AAAA,EAEF,IAAI,CAAC,UAAgD,oBAAC,QAAI,GAAG,OAAO;AAAA,EACpE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,MACzB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACT,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAAA,EAEF,MAAM,CAAC,EAAE,UAAU,OAAO,GAAG,MAAM,MACjC,oBAAC,UAAK,OAAc,WAAU,2CAA2C,GAAG,OACzE,UACH;AAAA,EAEF,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,MAC1B,oBAAC,UAAK,WAAU,UAAU,GAAG,OAC1B,UACH;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,6 @@
1
+ import { createContext } from "react";
2
+ const MarkdownStreamingContext = createContext(false);
3
+ export {
4
+ MarkdownStreamingContext
5
+ };
6
+ //# sourceMappingURL=markdown-streaming-context.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/markdown-streaming-context.ts"],
4
+ "sourcesContent": ["import { createContext } from 'react'\n\n/**\n * Signals to `MarkdownRenderer`'s component overrides that the surrounding\n * message is still streaming tokens. Heavy renderers can defer their work while\n * this is true to avoid burning CPU on partially complete fences and to keep the\n * UI responsive during long generations.\n *\n * Default `false` means non-streaming usages (parsed documents, static answers,\n * DM bubbles) get the full rendering with no behaviour change.\n */\nexport const MarkdownStreamingContext = createContext(false)\n"],
5
+ "mappings": "AAAA,SAAS,qBAAqB;AAWvB,MAAM,2BAA2B,cAAc,KAAK;",
6
+ "names": []
7
+ }
@@ -1,17 +1,8 @@
1
- import { createContext, useContext } from 'react';
2
-
3
- // src/host/context.ts
4
- var ArbiHostContext = createContext({});
5
- function useHostConfigRecord() {
6
- return useContext(ArbiHostContext);
7
- }
8
-
9
- // src/ai/normalize-citations.ts
10
- var SOURCE_RESIDUE = /\(\*+\s*(Sources?\s*:[^\n]*?)\s*\*+\)/g;
11
- var CITE_CLOSE = /^\]\((#cite-[\w-]+)\)/;
12
- var BLOCK_MARKER = /^(?:[-*+]|\d{1,9}[.)]|#{1,6})[ \t]+/;
13
- var LEADING_EMPHASIS = /^(?:\*\*|__|\*|_)+/;
14
- var TRAILING_EMPHASIS = /(\*\*|__|\*|_)(:?)$/;
1
+ const SOURCE_RESIDUE = /\(\*+\s*(Sources?\s*:[^\n]*?)\s*\*+\)/g;
2
+ const CITE_CLOSE = /^\]\((#cite-[\w-]+)\)/;
3
+ const BLOCK_MARKER = /^(?:[-*+]|\d{1,9}[.)]|#{1,6})[ \t]+/;
4
+ const LEADING_EMPHASIS = /^(?:\*\*|__|\*|_)+/;
5
+ const TRAILING_EMPHASIS = /(\*\*|__|\*|_)(:?)$/;
15
6
  function countToken(text, token) {
16
7
  const double = token + token;
17
8
  if (token.length === 2) return text.split(token).length - 1;
@@ -155,7 +146,7 @@ function normalizeCitationMarkup(markdown) {
155
146
  return inFence ? line : normalizeSourceResidue(normalizeLine(line));
156
147
  }).join("\n");
157
148
  }
158
- var OPEN_CITATION_TAIL = /\[[^\]\n]*(?:\](?:\((?:#(?:c(?:i(?:t(?:e(?:-[\w-]*)?)?)?)?)?)?)?)?$/;
149
+ const OPEN_CITATION_TAIL = /\[[^\]\n]*(?:\](?:\((?:#(?:c(?:i(?:t(?:e(?:-[\w-]*)?)?)?)?)?)?)?)?$/;
159
150
  function trimOpenCitation(markdown) {
160
151
  return markdown.replace(OPEN_CITATION_TAIL, "");
161
152
  }
@@ -175,7 +166,9 @@ function closeOpenEmphasis(markdown) {
175
166
  if (/\*\*\s*$/.test(line)) return head + line.replace(/\s*\*\*\s*$/, " ");
176
167
  return head + line + "**";
177
168
  }
178
-
179
- export { ArbiHostContext, closeOpenEmphasis, normalizeCitationMarkup, trimOpenCitation, useHostConfigRecord };
180
- //# sourceMappingURL=chunk-VSCU7K4V.js.map
181
- //# sourceMappingURL=chunk-VSCU7K4V.js.map
169
+ export {
170
+ closeOpenEmphasis,
171
+ normalizeCitationMarkup,
172
+ trimOpenCitation
173
+ };
174
+ //# sourceMappingURL=normalize-citations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/normalize-citations.ts"],
4
+ "sourcesContent": ["/**\n * Citation markup normaliser.\n *\n * The backend marks a cited statement as a markdown link, `[statement](#cite-N)`, and the\n * statement can include the markdown that surrounds it: a list marker, a heading marker or the\n * opener of a bold/italic span whose closer sits after the link. Inside link text those tokens\n * are not parsed as block or inline syntax, so they show literally and break lists and bold:\n *\n * [- **Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * `normalizeCitationMarkup` hoists the leading tokens out of the link text (and a trailing\n * emphasis closer after it), so the link only wraps the words:\n *\n * - **[Claimed quantum (by Claimant)](#cite-1):** **USD 47 million**\n *\n * It is conservative: emphasis that opens and closes inside the link text is valid markdown and\n * is left alone, an opener is only hoisted when its closer follows on the same line, and fenced\n * code blocks are never touched. The result is idempotent.\n *\n * It also tidies the residue the model leaves when it cites in prose as well: a literal\n * `(*Source: Award.pdf, p. 12*)` shows its asterisks, because `(*` does not open emphasis. It\n * becomes the italic note `*(Source: Award.pdf, p. 12)*`.\n */\n\nconst SOURCE_RESIDUE = /\\(\\*+\\s*(Sources?\\s*:[^\\n]*?)\\s*\\*+\\)/g\n\nconst CITE_CLOSE = /^\\]\\((#cite-[\\w-]+)\\)/\nconst BLOCK_MARKER = /^(?:[-*+]|\\d{1,9}[.)]|#{1,6})[ \\t]+/\nconst LEADING_EMPHASIS = /^(?:\\*\\*|__|\\*|_)+/\nconst TRAILING_EMPHASIS = /(\\*\\*|__|\\*|_)(:?)$/\n\n/** Occurrences of `token` in `text`; a single `*` is counted outside any `**` pair. */\nfunction countToken(text: string, token: string): number {\n const double = token + token\n if (token.length === 2) return text.split(token).length - 1\n const withoutDouble = text.split(double).join('')\n return withoutDouble.split(token).length - 1\n}\n\n/** Split a run of emphasis characters (`***`, `**`, `*`...) into its parser-level tokens. */\nfunction emphasisTokens(run: string): string[] {\n const char = run[0]\n const tokens: string[] = []\n let rest = run\n while (rest.length > 0) {\n const size = rest.length >= 2 ? 2 : 1\n tokens.push(char.repeat(size))\n rest = rest.slice(size)\n }\n return tokens\n}\n\nfunction hoistFromLink(text: string, before: string, after: string): [string, string, string] {\n let body = text\n let prefix = ''\n let suffix = ''\n\n if (before.trim() === '') {\n const marker = BLOCK_MARKER.exec(body)\n if (marker) {\n prefix += marker[0]\n body = body.slice(marker[0].length)\n }\n }\n\n // The link opened inside an emphasis span: `*Sources:[* Letter](#cite-2)`. A leading token that\n // the text before the link left open, and that is followed by a space, is the span's CLOSER (an\n // opener cannot precede a space), so it moves out in front of the link with its space.\n const closer = /^(\\*\\*|__|\\*|_)(\\s+)(?=\\S)/.exec(body)\n if (closer && countToken(before + prefix, closer[1]) % 2 === 1) {\n prefix += closer[1] + closer[2]\n body = body.slice(closer[0].length)\n }\n\n const leading = LEADING_EMPHASIS.exec(body)\n if (leading) {\n let kept = ''\n let rest = body.slice(leading[0].length)\n for (const token of emphasisTokens(leading[0]).reverse()) {\n // Balanced inside the link text: valid as written.\n if (countToken(rest, token) % 2 === 1) {\n kept = token + kept\n continue\n }\n // Unmatched here: hoist only if the line closes it after the link.\n if (countToken(after, token) % 2 === 1) prefix += token\n else kept = token + kept\n }\n body = kept + rest\n rest = ''\n }\n\n // A span opened before the link and closed inside it (`**Spence v. [Costa Rica** arbitration.]`)\n // cannot close across the link boundary: move the words up to the closer out of the link.\n for (const token of ['**', '__']) {\n const at = body.indexOf(token)\n if (at === -1 || countToken(body, token) % 2 === 0) continue\n if (countToken(before + prefix, token) % 2 === 0) continue\n const rest = body.slice(at + token.length)\n if (!/[\\p{L}\\p{N}]/u.test(rest)) continue\n prefix +=\n body.slice(0, at + token.length) + rest.slice(0, rest.length - rest.trimStart().length)\n body = rest.trimStart()\n break\n }\n\n const trailing = TRAILING_EMPHASIS.exec(body)\n if (trailing) {\n const token = trailing[1]\n const inner = body.slice(0, body.length - trailing[0].length)\n const openedBefore = countToken(before + prefix, token) % 2 === 1\n if (countToken(inner, token) % 2 === 0 && openedBefore) {\n body = inner\n suffix = trailing[0]\n }\n }\n\n // The link ends inside an emphasis span that closes after it: `*(Source](#cite-1): a.md)*`. The\n // unmatched opener and the words after it leave the link, so the span opens and closes in the\n // same text again: `[words](#cite-1) *(Source: a.md)*`.\n if (!suffix) {\n for (const token of ['**', '*']) {\n const at = lastUnmatchedOpener(body, token)\n if (at > 0 && countToken(after, token) % 2 === 1) {\n suffix = ' ' + body.slice(at)\n body = body.slice(0, at).trimEnd()\n break\n }\n }\n }\n\n return [prefix, body, suffix]\n}\n\n/** Index of the last `token` in `text` that opens emphasis (followed by a non-space) and has no closer. */\nfunction lastUnmatchedOpener(text: string, token: string): number {\n if (countToken(text, token) % 2 === 0) return -1\n const pattern = token === '**' ? /\\*\\*(?=\\S)/g : /(?<!\\*)\\*(?![*\\s])/g\n let at = -1\n for (const m of text.matchAll(pattern)) at = m.index ?? -1\n return at\n}\n\ninterface CiteLink {\n start: number\n end: number\n text: string\n href: string\n}\n\n/**\n * The `[text](#cite-N)` links of a line. The text may hold brackets of its own\n * (`[2. **[PLACEHOLDER]** names the claimant.](#cite-3)`), so a regex cannot find the opener: a\n * stack of `[` is scanned, and a `](#cite-N)` takes the nearest open one.\n */\nfunction findCiteLinks(line: string): CiteLink[] {\n const links: CiteLink[] = []\n const open: number[] = []\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '[') open.push(i)\n else if (c === ']') {\n const opener = open.pop()\n const close = CITE_CLOSE.exec(line.slice(i, i + 40))\n if (opener !== undefined && close) {\n links.push({\n start: opener,\n end: i + close[0].length,\n text: line.slice(opener + 1, i),\n href: close[1],\n })\n i += close[0].length - 1\n }\n }\n }\n return links.sort((x, y) => x.start - y.start)\n}\n\nfunction normalizeLine(line: string): string {\n if (!line.includes('](#cite-')) return line\n let out = ''\n let last = 0\n for (const link of findCiteLinks(line)) {\n // A link inside another link's text is part of that text.\n if (link.start < last) continue\n // Markdown links do not nest: a citation that wraps another citation (`[a [9](#cite-9)](#cite-10)`)\n // keeps the words and the inner mark, and the outer wrapper is dropped.\n if (link.text.includes('](#cite-')) {\n out += line.slice(last, link.start) + link.text\n last = link.end\n continue\n }\n const before = line.slice(0, link.start)\n const after = line.slice(link.end)\n const [prefix, body, suffix] = hoistFromLink(link.text, before, after)\n out += line.slice(last, link.start)\n out += `${prefix}[${body}](${link.href})${suffix}`\n last = link.end\n }\n return out + line.slice(last)\n}\n\nfunction normalizeSourceResidue(line: string): string {\n return line.includes('(*') ? line.replace(SOURCE_RESIDUE, '*($1)*') : line\n}\n\nexport function normalizeCitationMarkup(markdown: string): string {\n if (!markdown.includes('](#cite-') && !markdown.includes('(*')) return markdown\n let inFence = false\n return markdown\n .split('\\n')\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : normalizeSourceResidue(normalizeLine(line))\n })\n .join('\\n')\n}\n\n/** A trailing, still-open `[words](#cite-N` marker (or an unclosed `[words`) on the last line. */\nconst OPEN_CITATION_TAIL = /\\[[^\\]\\n]*(?:\\](?:\\((?:#(?:c(?:i(?:t(?:e(?:-[\\w-]*)?)?)?)?)?)?)?)?$/\n\n/**\n * Drops an unfinished citation marker from the end of text that is still streaming (or was\n * stopped mid-marker), so `[Change of control](#cite-` never shows as raw markup: the words appear\n * once the marker is complete. Complete markers and everything else are left alone.\n */\nexport function trimOpenCitation(markdown: string): string {\n return markdown.replace(OPEN_CITATION_TAIL, '')\n}\n\n/** `**` pairs outside inline code in a line. */\nfunction boldMarks(line: string): number {\n return (line.replace(/`[^`]*`/g, '').match(/\\*\\*/g) ?? []).length\n}\n\n/**\n * Makes the tail of text that is still streaming (or was stopped) render cleanly: a `**` opened\n * in the last line and not yet closed (`| Valuation | **[USD 6.2 million](#cite-2)`) would show as\n * literal asterisks until its closer arrives, because an unclosed emphasis is not emphasis. The\n * open bold is closed at the end of the line, or removed when it has no text yet (`| **`, or a\n * half-typed closer `**USD 6*`). Text with balanced emphasis, and every line but the last, is\n * left alone. Apply after `trimOpenCitation`.\n */\nexport function closeOpenEmphasis(markdown: string): string {\n const cut = markdown.lastIndexOf('\\n') + 1\n const head = markdown.slice(0, cut)\n const fences = head.split('\\n').filter((l) => /^\\s*(```|~~~)/.test(l)).length\n let line = markdown.slice(cut)\n if (fences % 2 === 1 || /^\\s*(```|~~~)/.test(line)) return markdown\n // A half-typed opener: the first `*` of `**` after a space or a cell border.\n line = line.replace(/(^|[\\s|])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n // A half-typed closer: `**USD 6*` -> the second asterisk has not arrived.\n line = line.replace(/([^*\\s])\\*$/, '$1')\n if (boldMarks(line) % 2 === 0) return head + line\n if (/\\*\\*\\s*$/.test(line)) return head + line.replace(/\\s*\\*\\*\\s*$/, ' ')\n return head + line + '**'\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ import { diffWords } from "diff";
2
+ function toRedlineMarkdown(original, revised) {
3
+ const parts = diffWords(original ?? "", revised ?? "");
4
+ return parts.map((p) => {
5
+ if (p.added) return `<ins>${p.value}</ins>`;
6
+ if (p.removed) return `<del>${p.value}</del>`;
7
+ return p.value;
8
+ }).join("");
9
+ }
10
+ function redlineStats(original, revised) {
11
+ let added = 0;
12
+ let removed = 0;
13
+ for (const p of diffWords(original ?? "", revised ?? "")) {
14
+ const words = p.value.trim() ? p.value.trim().split(/\s+/).length : 0;
15
+ if (p.added) added += words;
16
+ else if (p.removed) removed += words;
17
+ }
18
+ return { added, removed };
19
+ }
20
+ function textToArtifact(title, content, opts) {
21
+ return {
22
+ type: "arbi.artifact",
23
+ doc_ext_id: opts?.id ?? `local-${title.replace(/\W+/g, "-").toLowerCase()}`,
24
+ title,
25
+ mode: opts?.mode ?? "markdown",
26
+ content,
27
+ // Content-backed (markdown/text/html) artifacts carry no blob; file_type is
28
+ // required on ArtifactEvent and defaults to "" for non-image artifacts.
29
+ file_type: "",
30
+ is_complete: opts?.isComplete ?? true,
31
+ version: opts?.version ?? 1,
32
+ message_ext_id: null,
33
+ t: null
34
+ };
35
+ }
36
+ export {
37
+ redlineStats,
38
+ textToArtifact,
39
+ toRedlineMarkdown
40
+ };
41
+ //# sourceMappingURL=redline.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/redline.ts"],
4
+ "sourcesContent": ["/**\n * Client-side redlining \u2014 turn an original + revised text into track-changes\n * markdown (`<del>` strikethrough deletions, `<ins>` insertions). Rendered by\n * {@link AiMarkdown} (via rehype-raw) and the {@link ArtifactCanvas}.\n */\nimport { diffWords } from 'diff'\nimport type { ArtifactEvent } from '@arbidocs/sdk/browser'\n\n/** Produce inline `<del>/<ins>` redline markdown from two document versions. */\nexport function toRedlineMarkdown(original: string, revised: string): string {\n const parts = diffWords(original ?? '', revised ?? '')\n return parts\n .map((p) => {\n if (p.added) return `<ins>${p.value}</ins>`\n if (p.removed) return `<del>${p.value}</del>`\n return p.value\n })\n .join('')\n}\n\n/** Count added/removed words between two versions (for a redline summary). */\nexport function redlineStats(original: string, revised: string) {\n let added = 0\n let removed = 0\n for (const p of diffWords(original ?? '', revised ?? '')) {\n const words = p.value.trim() ? p.value.trim().split(/\\s+/).length : 0\n if (p.added) added += words\n else if (p.removed) removed += words\n }\n return { added, removed }\n}\n\n/** Wrap arbitrary text/markdown as a synthetic artifact for the canvas. */\nexport function textToArtifact(\n title: string,\n content: string,\n opts?: { mode?: ArtifactEvent['mode']; isComplete?: boolean; version?: number; id?: string }\n): ArtifactEvent {\n return {\n type: 'arbi.artifact',\n doc_ext_id: opts?.id ?? `local-${title.replace(/\\W+/g, '-').toLowerCase()}`,\n title,\n mode: opts?.mode ?? 'markdown',\n content,\n // Content-backed (markdown/text/html) artifacts carry no blob; file_type is\n // required on ArtifactEvent and defaults to \"\" for non-image artifacts.\n file_type: '',\n is_complete: opts?.isComplete ?? true,\n version: opts?.version ?? 1,\n message_ext_id: null,\n t: null,\n }\n}\n"],
5
+ "mappings": "AAKA,SAAS,iBAAiB;AAInB,SAAS,kBAAkB,UAAkB,SAAyB;AAC3E,QAAM,QAAQ,UAAU,YAAY,IAAI,WAAW,EAAE;AACrD,SAAO,MACJ,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,MAAO,QAAO,QAAQ,EAAE,KAAK;AACnC,QAAI,EAAE,QAAS,QAAO,QAAQ,EAAE,KAAK;AACrC,WAAO,EAAE;AAAA,EACX,CAAC,EACA,KAAK,EAAE;AACZ;AAGO,SAAS,aAAa,UAAkB,SAAiB;AAC9D,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,aAAW,KAAK,UAAU,YAAY,IAAI,WAAW,EAAE,GAAG;AACxD,UAAM,QAAQ,EAAE,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,SAAS;AACpE,QAAI,EAAE,MAAO,UAAS;AAAA,aACb,EAAE,QAAS,YAAW;AAAA,EACjC;AACA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAGO,SAAS,eACd,OACA,SACA,MACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,MAAM,MAAM,SAAS,MAAM,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,IACzE;AAAA,IACA,MAAM,MAAM,QAAQ;AAAA,IACpB;AAAA;AAAA;AAAA,IAGA,WAAW;AAAA,IACX,aAAa,MAAM,cAAc;AAAA,IACjC,SAAS,MAAM,WAAW;AAAA,IAC1B,gBAAgB;AAAA,IAChB,GAAG;AAAA,EACL;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ const LIST_ITEM_RE = /^\s*([-*+]|\d+[.)])\s/;
2
+ const BLOCKQUOTE_RE = /^\s*>/;
3
+ function splitMarkdownBlocks(content) {
4
+ if (!content) return [];
5
+ const blocks = [];
6
+ let start = 0;
7
+ let inFence = false;
8
+ let i = 0;
9
+ while (i < content.length) {
10
+ if (content.startsWith("```", i)) {
11
+ inFence = !inFence;
12
+ i += 3;
13
+ continue;
14
+ }
15
+ if (!inFence && content[i] === "\n" && content[i + 1] === "\n") {
16
+ const before = content.slice(start, i);
17
+ const lastLine = before.slice(before.lastIndexOf("\n") + 1);
18
+ const afterStart = i + 2;
19
+ const nextNewline = content.indexOf("\n", afterStart);
20
+ const nextLine = content.slice(afterStart, nextNewline === -1 ? void 0 : nextNewline);
21
+ const bothListItems = LIST_ITEM_RE.test(lastLine) && LIST_ITEM_RE.test(nextLine);
22
+ const bothBlockquotes = BLOCKQUOTE_RE.test(lastLine) && BLOCKQUOTE_RE.test(nextLine);
23
+ if (bothListItems || bothBlockquotes) {
24
+ i += 2;
25
+ continue;
26
+ }
27
+ blocks.push(content.slice(start, afterStart));
28
+ start = afterStart;
29
+ i = afterStart;
30
+ continue;
31
+ }
32
+ i++;
33
+ }
34
+ if (start < content.length) blocks.push(content.slice(start));
35
+ return blocks;
36
+ }
37
+ export {
38
+ splitMarkdownBlocks
39
+ };
40
+ //# sourceMappingURL=split-markdown-blocks.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/split-markdown-blocks.ts"],
4
+ "sourcesContent": ["/**\n * Splits a markdown string into top-level blocks at `\\n\\n` boundaries.\n *\n * Streaming AI responses arrive token-by-token; passing the full string to\n * react-markdown re-parses the entire AST on every flush. By splitting into\n * blocks and memoizing each, only the trailing (still-growing) block re-parses\n * \u2014 completed blocks stay frozen in the DOM.\n *\n * The split avoids three correctness pitfalls:\n * - never splits inside an open ``` code fence (would corrupt the language)\n * - never splits between two adjacent list items (would render as two lists)\n * - never splits between two blockquote lines (would render as two quotes)\n */\nconst LIST_ITEM_RE = /^\\s*([-*+]|\\d+[.)])\\s/\nconst BLOCKQUOTE_RE = /^\\s*>/\n\nexport function splitMarkdownBlocks(content: string): string[] {\n if (!content) return []\n const blocks: string[] = []\n let start = 0\n let inFence = false\n let i = 0\n while (i < content.length) {\n if (content.startsWith('```', i)) {\n inFence = !inFence\n i += 3\n continue\n }\n if (!inFence && content[i] === '\\n' && content[i + 1] === '\\n') {\n const before = content.slice(start, i)\n const lastLine = before.slice(before.lastIndexOf('\\n') + 1)\n const afterStart = i + 2\n const nextNewline = content.indexOf('\\n', afterStart)\n const nextLine = content.slice(afterStart, nextNewline === -1 ? undefined : nextNewline)\n const bothListItems = LIST_ITEM_RE.test(lastLine) && LIST_ITEM_RE.test(nextLine)\n const bothBlockquotes = BLOCKQUOTE_RE.test(lastLine) && BLOCKQUOTE_RE.test(nextLine)\n if (bothListItems || bothBlockquotes) {\n i += 2\n continue\n }\n blocks.push(content.slice(start, afterStart))\n start = afterStart\n i = afterStart\n continue\n }\n i++\n }\n if (start < content.length) blocks.push(content.slice(start))\n return blocks\n}\n"],
5
+ "mappings": "AAaA,MAAM,eAAe;AACrB,MAAM,gBAAgB;AAEf,SAAS,oBAAoB,SAA2B;AAC7D,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,SAAmB,CAAC;AAC1B,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,QAAQ;AACzB,QAAI,QAAQ,WAAW,OAAO,CAAC,GAAG;AAChC,gBAAU,CAAC;AACX,WAAK;AACL;AAAA,IACF;AACA,QAAI,CAAC,WAAW,QAAQ,CAAC,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,MAAM;AAC9D,YAAM,SAAS,QAAQ,MAAM,OAAO,CAAC;AACrC,YAAM,WAAW,OAAO,MAAM,OAAO,YAAY,IAAI,IAAI,CAAC;AAC1D,YAAM,aAAa,IAAI;AACvB,YAAM,cAAc,QAAQ,QAAQ,MAAM,UAAU;AACpD,YAAM,WAAW,QAAQ,MAAM,YAAY,gBAAgB,KAAK,SAAY,WAAW;AACvF,YAAM,gBAAgB,aAAa,KAAK,QAAQ,KAAK,aAAa,KAAK,QAAQ;AAC/E,YAAM,kBAAkB,cAAc,KAAK,QAAQ,KAAK,cAAc,KAAK,QAAQ;AACnF,UAAI,iBAAiB,iBAAiB;AACpC,aAAK;AACL;AAAA,MACF;AACA,aAAO,KAAK,QAAQ,MAAM,OAAO,UAAU,CAAC;AAC5C,cAAQ;AACR,UAAI;AACJ;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,OAAQ,QAAO,KAAK,QAAQ,MAAM,KAAK,CAAC;AAC5D,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -1,8 +1,5 @@
1
- import { normalizeMarkdown } from './chunk-WUTL62MC.js';
2
- import { normalizeCitationMarkup } from './chunk-VSCU7K4V.js';
3
-
4
- // src/ai/stored-markdown.ts
5
- var FENCE = /^\s*(```|~~~)/;
1
+ import { normalizeCitationMarkup } from "./normalize-citations.js";
2
+ const FENCE = /^\s*(```|~~~)/;
6
3
  function mapOutsideFences(text, fn) {
7
4
  let inFence = false;
8
5
  return text.split("\n").map((line) => {
@@ -13,9 +10,9 @@ function mapOutsideFences(text, fn) {
13
10
  return inFence ? line : fn(line);
14
11
  }).join("\n");
15
12
  }
16
- var ESCAPED_PUNCTUATION = /\\([\\`*_{}[\]()#+\-.!|>~<])/g;
17
- var ESCAPED_EMPHASIS = /\\([*_])/g;
18
- var INLINE_CODE = /(`+)(?!`)(.+?)(?<!`)\1(?!`)/g;
13
+ const ESCAPED_PUNCTUATION = /\\([\\`*_{}[\]()#+\-.!|>~<])/g;
14
+ const ESCAPED_EMPHASIS = /\\([*_])/g;
15
+ const INLINE_CODE = /(`+)(?!`)(.+?)(?<!`)\1(?!`)/g;
19
16
  function unescapeMarkdown(text) {
20
17
  if (!text.includes("\\")) return text;
21
18
  return mapOutsideFences(text, (line) => {
@@ -47,12 +44,12 @@ function repairParsedTitle(text) {
47
44
  }
48
45
  return text;
49
46
  }
50
- var DOUBLED_HEADING = /^#{1,6}\s+(#{1,6}\s+\S.*)$/;
51
- var LIST_HEADING = /^[-*+]\s+(#{1,6}\s+\S.*)$/;
52
- var LIST_IN_LIST = /^[-*+]\s+[-*+]\s+(\S.*)$/;
53
- var LIST_ORDINAL = /^[-*+]\s+(\d{1,9})([.)])\s+(\S.*)$/;
54
- var LIST_ITEM_LINE = /^\s*(?:[-*+]|\d{1,9}[.)])\s/;
55
- var TABLE_DELIMITER_CELL = /^:?-{1,}:?$/;
47
+ const DOUBLED_HEADING = /^#{1,6}\s+(#{1,6}\s+\S.*)$/;
48
+ const LIST_HEADING = /^[-*+]\s+(#{1,6}\s+\S.*)$/;
49
+ const LIST_IN_LIST = /^[-*+]\s+[-*+]\s+(\S.*)$/;
50
+ const LIST_ORDINAL = /^[-*+]\s+(\d{1,9})([.)])\s+(\S.*)$/;
51
+ const LIST_ITEM_LINE = /^\s*(?:[-*+]|\d{1,9}[.)])\s/;
52
+ const TABLE_DELIMITER_CELL = /^:?-{1,}:?$/;
56
53
  function splitRunOfOrdinals(first, delimiter, rest) {
57
54
  const items = [];
58
55
  let n = first;
@@ -121,8 +118,8 @@ function repairParsedStructure(text) {
121
118
  (line, i) => !(line === "" && LIST_ITEM_LINE.test(out[i - 1] ?? "") && LIST_ITEM_LINE.test(out[i + 1] ?? ""))
122
119
  ).join("\n");
123
120
  }
124
- var SOURCE_NOTE = /[ \t]*(?:\*+\(\s*Sources?\s*:[^)\n]*\)\*+|\(\s*\*{0,2}\s*Sources?\s*:[^)\n]*\))/gi;
125
- var CITE_TOKEN = /^\]\(#cite-[\w-]+\)/;
121
+ const SOURCE_NOTE = /[ \t]*(?:\*+\(\s*Sources?\s*:[^)\n]*\)\*+|\(\s*\*{0,2}\s*Sources?\s*:[^)\n]*\))/gi;
122
+ const CITE_TOKEN = /^\]\(#cite-[\w-]+\)/;
126
123
  function removeCitationLinks(line) {
127
124
  if (!line.includes("](#cite-")) return line;
128
125
  const drop = /* @__PURE__ */ new Set();
@@ -157,14 +154,14 @@ function unwrapCitationLinks(text) {
157
154
  return unlinked === line ? line : balanceBold(unlinked);
158
155
  });
159
156
  }
160
- var HEADING = /^#{1,6}\s+\S/;
161
- var HR_ONLY = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
162
- var BOLD_LINE = /^\*\*[^*#].*\*\*$/;
163
- var MAX_PREAMBLE_CHARS = 900;
164
- var MAX_PREAMBLE_PARAGRAPHS = 4;
165
- var MAX_TITLE_CHARS = 100;
166
- var NARRATION_OPENER = /^(?:I(?:['’](?:ll|ve|m|d))?\s|let me\b|here(?:['’]s| is| are)\b|below is\b|sure[,.! ]|certainly[,.! ]|of course[,.! ]|okay[,.! ]|based on (?:the|your|my)\b|per the (?:user|instructions?)|as requested\b|the workspace\b|no (?:relevant |workspace |matching )?documents?\b|there (?:are|is) no (?:relevant |workspace )?documents?\b|after (?:reviewing|reading|searching)\b)/i;
167
- var STRUCTURED = /^\s*(?:[-*+>|]|\d{1,9}[.)]\s|#{1,6}\s|```|~~~)|\*\*|\]\(/m;
157
+ const HEADING = /^#{1,6}\s+\S/;
158
+ const HR_ONLY = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
159
+ const BOLD_LINE = /^\*\*[^*#].*\*\*$/;
160
+ const MAX_PREAMBLE_CHARS = 900;
161
+ const MAX_PREAMBLE_PARAGRAPHS = 4;
162
+ const MAX_TITLE_CHARS = 100;
163
+ const NARRATION_OPENER = /^(?:I(?:['’](?:ll|ve|m|d))?\s|let me\b|here(?:['’]s| is| are)\b|below is\b|sure[,.! ]|certainly[,.! ]|of course[,.! ]|okay[,.! ]|based on (?:the|your|my)\b|per the (?:user|instructions?)|as requested\b|the workspace\b|no (?:relevant |workspace |matching )?documents?\b|there (?:are|is) no (?:relevant |workspace )?documents?\b|after (?:reviewing|reading|searching)\b)/i;
164
+ const STRUCTURED = /^\s*(?:[-*+>|]|\d{1,9}[.)]\s|#{1,6}\s|```|~~~)|\*\*|\]\(/m;
168
165
  function stripAgentPreamble(text) {
169
166
  const lines = text.split("\n");
170
167
  const start = lines.findIndex((l) => HEADING.test(l));
@@ -194,15 +191,15 @@ function cleanHeadings(text) {
194
191
  (line) => /^\s*#{1,6}\s/.test(line) ? line.replace(/\*\*/g, "").trim() : line
195
192
  );
196
193
  }
197
- var MIN_RATIO = 0.7;
198
- var countMatches = (text, re) => text.match(re)?.length ?? 0;
199
- var LIST_NUMBER = /^\s*\d{1,9}[.)]\s/gm;
200
- var HEADING_LINE = /^#{1,6}\s/gm;
201
- var withoutCitationMarkup = (raw) => mapOutsideFences(raw.replace(SOURCE_NOTE, ""), removeCitationLinks).trim();
202
- var tidy = (text) => text.replace(/\n{3,}/g, "\n\n").trim();
203
- var isPrefixCut = (before, after) => before.trimEnd().endsWith(after.trim());
204
- var keepsStructure = (candidate, reference) => countMatches(candidate, LIST_NUMBER) >= countMatches(reference, LIST_NUMBER) && countMatches(candidate, HEADING_LINE) >= countMatches(reference, HEADING_LINE);
205
- var DEFAULT_CLEAN_STEPS = {
194
+ const MIN_RATIO = 0.7;
195
+ const countMatches = (text, re) => text.match(re)?.length ?? 0;
196
+ const LIST_NUMBER = /^\s*\d{1,9}[.)]\s/gm;
197
+ const HEADING_LINE = /^#{1,6}\s/gm;
198
+ const withoutCitationMarkup = (raw) => mapOutsideFences(raw.replace(SOURCE_NOTE, ""), removeCitationLinks).trim();
199
+ const tidy = (text) => text.replace(/\n{3,}/g, "\n\n").trim();
200
+ const isPrefixCut = (before, after) => before.trimEnd().endsWith(after.trim());
201
+ const keepsStructure = (candidate, reference) => countMatches(candidate, LIST_NUMBER) >= countMatches(reference, LIST_NUMBER) && countMatches(candidate, HEADING_LINE) >= countMatches(reference, HEADING_LINE);
202
+ const DEFAULT_CLEAN_STEPS = {
206
203
  unwrap: unwrapCitationLinks,
207
204
  strip: stripAgentPreamble,
208
205
  promote: promoteBoldTitle
@@ -229,63 +226,14 @@ function cleanDraftWithReport(raw, steps = DEFAULT_CLEAN_STEPS) {
229
226
  function cleanDraftMarkdown(raw) {
230
227
  return cleanDraftWithReport(raw).text;
231
228
  }
232
-
233
- // src/artifacts/versions.ts
234
- var VERSION_REF = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/;
235
- function versionRef(docId, version) {
236
- return `${docId}@v${version}`;
237
- }
238
- function parseVersionRef(ref) {
239
- const match = VERSION_REF.exec(ref ?? "");
240
- if (!match) return { docId: ref ?? "", version: null };
241
- return { docId: match[1], version: Number(match[2]) };
242
- }
243
- function savedFromId(docId, entry) {
244
- if (entry.made_from) return versionRef(docId, entry.made_from);
245
- return entry.n > 1 ? versionRef(docId, entry.n - 1) : null;
246
- }
247
- function toArtifactVersions(docId, entries, currentVersion) {
248
- if (!docId) return [];
249
- const current = currentVersion ?? entries?.find((e) => e.is_current)?.n ?? null;
250
- return [...entries ?? []].sort((a, b) => a.n - b.n).map((e) => ({
251
- id: versionRef(docId, e.n),
252
- docId,
253
- name: e.file_name ?? "",
254
- createdAt: e.created_at ?? "",
255
- number: e.n,
256
- reason: e.reason ?? "upload",
257
- isCurrent: current != null ? e.n === current : !!e.is_current,
258
- savedFromId: savedFromId(docId, e),
259
- thread: e.conversation_ext_id ? { conversationId: e.conversation_ext_id, messageId: e.source_message_ext_id ?? null } : null
260
- }));
261
- }
262
- function documentVersions(doc) {
263
- if (!doc?.external_id) return [];
264
- const entries = doc.versions?.length ? doc.versions : [{ n: doc.current_version ?? 1, file_name: doc.file_name, created_at: doc.created_at }];
265
- return toArtifactVersions(doc.external_id, entries, doc.current_version ?? null);
266
- }
267
- function findVersion(versions, ref) {
268
- if (!ref) return void 0;
269
- const { docId, version } = parseVersionRef(ref);
270
- return version == null ? versions.find((v) => v.docId === docId && v.isCurrent) : versions.find((v) => v.docId === docId && v.number === version);
271
- }
272
- function versionLabel(versions, ref) {
273
- if (!ref || versions.length <= 1) return null;
274
- const version = findVersion(versions, ref);
275
- return version ? `v${version.number}` : null;
276
- }
277
- function flattenChunks(chunks, options) {
278
- const text = (chunks ?? []).map((c) => (c.content ?? "").trim()).join("\n\n");
279
- if (!options?.unescape) return text;
280
- return normalizeMarkdown(
281
- repairParsedStructure(repairParsedTitle(unescapeMarkdown(text)))
282
- ).replace(/\n$/, "");
283
- }
284
- var DOC_ID = /^doc/;
285
- function isDocumentId(id) {
286
- return !!id && DOC_ID.test(id);
287
- }
288
-
289
- export { cleanDraftMarkdown, cleanDraftWithReport, documentVersions, findVersion, flattenChunks, isDocumentId, parseVersionRef, promoteBoldTitle, repairParsedStructure, repairParsedTitle, savedFromId, stripAgentPreamble, toArtifactVersions, unescapeMarkdown, unwrapCitationLinks, versionLabel, versionRef };
290
- //# sourceMappingURL=chunk-UW2SGTI5.js.map
291
- //# sourceMappingURL=chunk-UW2SGTI5.js.map
229
+ export {
230
+ cleanDraftMarkdown,
231
+ cleanDraftWithReport,
232
+ promoteBoldTitle,
233
+ repairParsedStructure,
234
+ repairParsedTitle,
235
+ stripAgentPreamble,
236
+ unescapeMarkdown,
237
+ unwrapCitationLinks
238
+ };
239
+ //# sourceMappingURL=stored-markdown.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ai/stored-markdown.ts"],
4
+ "sourcesContent": ["/**\n * Helpers for markdown that is STORED (an agent's draft saved as an artifact, then read back from\n * the backend's parse). Pure and SDK-free; they sit next to `normalizeCitationMarkup`, which they\n * build on.\n *\n * Two directions:\n *\n * - Going in (`cleanDraftMarkdown` = `unwrapCitationLinks` + `stripAgentPreamble` +\n * `promoteBoldTitle`): a streamed draft carries citation links, `(*Source: ...*)` notes and\n * sometimes narration before the document. A stored letter should hold only the letter.\n * - Coming out (`unescapeMarkdown`): the backend's parse of a stored `.md` returns the text with\n * markdown punctuation backslash-escaped (`**Fees.**` comes back as `\\*\\*Fees\\.\\*\\*`).\n */\n\nimport { normalizeCitationMarkup } from './normalize-citations'\n\nconst FENCE = /^\\s*(```|~~~)/\n\n/** Run `fn` on every line outside a fenced code block. */\nfunction mapOutsideFences(text: string, fn: (line: string) => string): string {\n let inFence = false\n return text\n .split('\\n')\n .map((line) => {\n if (FENCE.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : fn(line)\n })\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Coming out: undo the parser's escaping\n// ---------------------------------------------------------------------------------------------\n\n/** A backslash followed by markdown punctuation: the only thing the parser's escaping produces. */\nconst ESCAPED_PUNCTUATION = /\\\\([\\\\`*_{}[\\]()#+\\-.!|>~<])/g\n/** The only escapes the parser puts inside an inline code span. */\nconst ESCAPED_EMPHASIS = /\\\\([*_])/g\nconst INLINE_CODE = /(`+)(?!`)(.+?)(?<!`)\\1(?!`)/g\n\n/**\n * Undo the backend's escaping of a markdown artifact: `\\*\\*Scope\\.\\*\\*` becomes `**Scope.**`.\n *\n * THE RULE. Apply this ONLY to text of an artifact that was stored from markdown (an agent draft\n * or an edited version, always uploaded as `.md`): for those the parser escapes every markdown\n * punctuation character, including the backslash itself, so removing one level of escaping is the\n * exact inverse (an author's literal `\\*` is stored as `\\\\\\*` and comes back as `\\*`). Do not\n * apply it to a PDF or Word parse, where a backslash is just a character.\n *\n * Details:\n * - Only a backslash followed by markdown punctuation (``\\ ` * _ { } [ ] ( ) # + - . ! | > ~ <``)\n * is removed; `\\n`, `C:\\temp` and a trailing backslash are left alone.\n * - Pairs are read left to right, so `\\\\*` is an escaped backslash followed by a bare `*`.\n * - Fenced code blocks are never touched (the parser does not escape inside them).\n * - Inline code spans: the parser DOES escape `*` and `_` there (`` `a*b` `` comes back as\n * `` `a\\*b` ``), so only `\\*` and `\\_` are undone inside a span; any other backslash in code\n * (`` `re\\.x` ``) is a literal and stays.\n */\nexport function unescapeMarkdown(text: string): string {\n if (!text.includes('\\\\')) return text\n return mapOutsideFences(text, (line) => {\n if (!line.includes('\\\\')) return line\n let out = ''\n let last = 0\n for (const span of line.matchAll(INLINE_CODE)) {\n const at = span.index ?? 0\n out +=\n line.slice(last, at).replace(ESCAPED_PUNCTUATION, '$1') +\n span[0].replace(ESCAPED_EMPHASIS, '$1')\n last = at + span[0].length\n }\n return out + line.slice(last).replace(ESCAPED_PUNCTUATION, '$1')\n })\n}\n\n/**\n * The parser also mangles the TITLE of a stored markdown document (seen on a real backend): the\n * first heading comes back doubled (`## # Title`) or alone inside a code fence\n * (a fence, `# Title`, a fence). Both are repaired, on the first non-blank line only, so a code\n * block or heading later in the text is never touched. Like `unescapeMarkdown`, apply it only to\n * artifacts stored from markdown.\n */\nexport function repairParsedTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const doubled = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/.exec(lines[first])\n if (doubled) {\n lines[first] = doubled[1]\n return lines.join('\\n')\n }\n if (/^\\s*```\\s*$/.test(lines[first]) && /^#{1,6}\\s+\\S/.test(lines[first + 1] ?? '')) {\n if (/^\\s*```\\s*$/.test(lines[first + 2] ?? '')) lines.splice(first + 2, 1)\n else return text\n lines.splice(first, 1)\n return lines.join('\\n')\n }\n return text\n}\n\nconst DOUBLED_HEADING = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_HEADING = /^[-*+]\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_IN_LIST = /^[-*+]\\s+[-*+]\\s+(\\S.*)$/\nconst LIST_ORDINAL = /^[-*+]\\s+(\\d{1,9})([.)])\\s+(\\S.*)$/\nconst LIST_ITEM_LINE = /^\\s*(?:[-*+]|\\d{1,9}[.)])\\s/\nconst TABLE_DELIMITER_CELL = /^:?-{1,}:?$/\n\n/** `1. a 2. b 3. c` (one line) split where the next ordinal follows: `['1. a', '2. b', '3. c']`. */\nfunction splitRunOfOrdinals(first: number, delimiter: string, rest: string): string[] {\n const items: string[] = []\n let n = first\n let remaining = rest\n for (;;) {\n const next = new RegExp(`^(.+?)\\\\s+${n + 1}\\\\${delimiter}\\\\s+(\\\\S.*)$`).exec(remaining)\n if (!next) break\n items.push(`${n}${delimiter} ${next[1]}`)\n n += 1\n remaining = next[2]\n }\n items.push(`${n}${delimiter} ${remaining}`)\n return items\n}\n\n/**\n * A table the parser put on ONE line (`| h | h | |---|---| | a | b |`, rows joined by a space, which\n * leaves one empty cell between rows) back as a pipe table. `null` when the line is not that shape.\n */\nfunction rebuildFlatTable(line: string): string[] | null {\n const trimmed = line.trim()\n if (!trimmed.startsWith('|') || !trimmed.endsWith('|')) return null\n const cells = trimmed\n .slice(1, -1)\n .split('|')\n .map((c) => c.trim())\n const firstRule = cells.findIndex((c) => TABLE_DELIMITER_CELL.test(c))\n if (firstRule < 2 || cells[firstRule - 1] !== '') return null\n const columns = firstRule - 1\n const rows: string[][] = []\n for (let at = 0; at < cells.length; at += columns + 1) {\n const row = cells.slice(at, at + columns)\n const gap = cells[at + columns]\n if (row.length !== columns || (gap !== undefined && gap !== '')) return null\n rows.push(row)\n }\n const [header, rule, ...body] = rows\n if (!rule.every((c) => TABLE_DELIMITER_CELL.test(c))) return null\n const fmt = (row: string[]): string => `| ${row.join(' | ')} |`\n return [fmt(header), fmt(rule.map(() => '---')), ...body.map(fmt)]\n}\n\n/**\n * Undo how the backend's parse of a stored `.md` restructures it (seen on a real backend):\n * - a heading comes back doubled (`## # Title`) or as a list item (`- # Title`);\n * - every list item gets a `- ` of its own on top of the original marker, so `* a` returns as\n * `- * a` and `1. a` as `- 1. a`, which a markdown editor loads as a list inside a list item\n * (and saves as `- - a`); a run of ordinals can come back on one line (`- 1. a 2. b`);\n * - a table comes back on one line.\n * List nesting and the bullet/ordered difference of a flat `- x` cannot be recovered, so items\n * stay flat. Items of one list are kept tight (no blank line between them). Fenced code is\n * never touched. Like `unescapeMarkdown`, apply it only to artifacts stored from markdown.\n */\nexport function repairParsedStructure(text: string): string {\n const out: string[] = []\n let inFence = false\n for (const line of text.split('\\n')) {\n if (FENCE.test(line)) {\n inFence = !inFence\n out.push(line)\n continue\n }\n if (inFence) {\n out.push(line)\n continue\n }\n const table = rebuildFlatTable(line)\n if (table) {\n out.push(...table)\n continue\n }\n const heading = DOUBLED_HEADING.exec(line) ?? LIST_HEADING.exec(line)\n if (heading) {\n out.push(heading[1])\n continue\n }\n const ordinal = LIST_ORDINAL.exec(line)\n if (ordinal) {\n out.push(...splitRunOfOrdinals(Number(ordinal[1]), ordinal[2], ordinal[3]))\n continue\n }\n const nested = LIST_IN_LIST.exec(line)\n out.push(nested ? `- ${nested[1]}` : line)\n }\n // Items parsed as separate chunks arrive one blank line apart: that is one tight list.\n return out\n .filter(\n (line, i) =>\n !(\n line === '' &&\n LIST_ITEM_LINE.test(out[i - 1] ?? '') &&\n LIST_ITEM_LINE.test(out[i + 1] ?? '')\n )\n )\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Going in: clean a streamed draft before it is stored\n// ---------------------------------------------------------------------------------------------\n\n/** `(*Source: Terms.pdf*)`, `(Sources: a, b)` and the italic form `*(Source: ...)*`. */\nconst SOURCE_NOTE =\n /[ \\t]*(?:\\*+\\(\\s*Sources?\\s*:[^)\\n]*\\)\\*+|\\(\\s*\\*{0,2}\\s*Sources?\\s*:[^)\\n]*\\))/gi\nconst CITE_TOKEN = /^\\]\\(#cite-[\\w-]+\\)/\n\n/**\n * Remove the citation links of ONE line and keep every word. A link is `[text](#cite-N)`, but the\n * model also writes brackets inside the text (`[We act for [PLACEHOLDER].](#cite-1)`) and links that\n * overlap other brackets, so a regex cannot find the opening bracket. This scans the line with a\n * stack of `[`: a `](#cite-N)` takes the nearest open `[` with it (both are removed, the text\n * between stays); a plain `]` closes the nearest `[`; a `](#cite-N)` with no open `[` loses only\n * the marker. Brackets that are not part of a link are never touched.\n */\nfunction removeCitationLinks(line: string): string {\n if (!line.includes('](#cite-')) return line\n const drop = new Set<number>()\n const open: number[] = []\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '[') open.push(i)\n else if (c === ']') {\n const token = CITE_TOKEN.exec(line.slice(i, i + 40))\n if (token) {\n const opener = open.pop()\n if (opener !== undefined) drop.add(opener)\n for (let k = i; k < i + token[0].length; k++) drop.add(k)\n i += token[0].length - 1\n } else open.pop()\n }\n }\n let out = ''\n for (let i = 0; i < line.length; i++) if (!drop.has(i)) out += line[i]\n return out\n}\n\n/** A line whose `**` do not pair up (one half was wrapped into a link) loses the stray marks. */\nfunction balanceBold(line: string): string {\n // A bold-wrapped heading (`**# Title**`) is just a heading.\n if (/^\\s*\\*\\*#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '').trim()\n if ((line.match(/\\*\\*/g)?.length ?? 0) % 2 === 0) return line\n if (/^#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '')\n return line.replace(/\\*\\*\\s*$/, '').replace(/^(\\s*(?:[-*]\\s+)?)\\*\\*(?=\\s)/, '$1')\n}\n\n/**\n * Text for storage from text that carries citations: `normalizeCitationMarkup` first (it hoists\n * list, heading and bold tokens out of the link so unwrapping cannot orphan half of a `**` pair),\n * then `[text](#cite-N)` becomes `text`, `(*Source: ...*)` notes are dropped, and a bold or\n * heading marker that lost its partner is repaired. Fenced code is left alone.\n */\nexport function unwrapCitationLinks(text: string): string {\n const withoutNotes = mapOutsideFences(text, (line) => line.replace(SOURCE_NOTE, ''))\n return mapOutsideFences(normalizeCitationMarkup(withoutNotes), (line) => {\n const unlinked = removeCitationLinks(line)\n return unlinked === line ? line : balanceBold(unlinked)\n })\n}\n\nconst HEADING = /^#{1,6}\\s+\\S/\nconst HR_ONLY = /^\\s*(?:-{3,}|\\*{3,}|_{3,})\\s*$/\n/** A whole-line bold title: `**Client Engagement Letter**`. */\nconst BOLD_LINE = /^\\*\\*[^*#].*\\*\\*$/\nconst MAX_PREAMBLE_CHARS = 900\nconst MAX_PREAMBLE_PARAGRAPHS = 4\nconst MAX_TITLE_CHARS = 100\n\n/**\n * How a paragraph of agent narration opens. An ALLOW-LIST: a paragraph that opens any other way is\n * treated as document text and never removed.\n */\nconst NARRATION_OPENER =\n /^(?:I(?:['\u2019](?:ll|ve|m|d))?\\s|let me\\b|here(?:['\u2019]s| is| are)\\b|below is\\b|sure[,.! ]|certainly[,.! ]|of course[,.! ]|okay[,.! ]|based on (?:the|your|my)\\b|per the (?:user|instructions?)|as requested\\b|the workspace\\b|no (?:relevant |workspace |matching )?documents?\\b|there (?:are|is) no (?:relevant |workspace )?documents?\\b|after (?:reviewing|reading|searching)\\b)/i\n\n/** Structure a covering note would not have: lists, tables, quotes, code, headings, bold, links. */\nconst STRUCTURED = /^\\s*(?:[-*+>|]|\\d{1,9}[.)]\\s|#{1,6}\\s|```|~~~)|\\*\\*|\\]\\(/m\n\n/**\n * Cut the agent's narration written BEFORE the document. Strictly non-destructive: if in doubt the\n * text is returned whole (a stray sentence is easy to delete, a lost clause is not recoverable).\n *\n * Text is removed only when ALL of these hold:\n * 1. a real markdown heading line (`# Title`, any level) follows it, and the cut stops exactly at\n * the FIRST such line (never at a bold line, never at a line that merely contains `**`);\n * 2. what precedes it is at most 4 paragraphs and 900 characters of plain prose (horizontal rules\n * between them are ignored): no list, table, quote, code, heading, bold or link;\n * 3. EVERY paragraph opens with an allow-listed narration opener: first person (\"I'll ...\",\n * \"I now have ...\"), \"Let me\", \"Here is/are\", \"Below is\", \"Sure\", \"Based on the ...\", \"Per the\n * instructions\", \"As requested\", \"The workspace ...\", \"No (relevant) documents ...\", \"There is\n * no document ...\", \"After reviewing ...\".\n * Anything else (a dateline, an address, a salutation, a sentence of the letter) keeps the text whole.\n */\nexport function stripAgentPreamble(text: string): string {\n const lines = text.split('\\n')\n const start = lines.findIndex((l) => HEADING.test(l))\n if (start <= 0) return text\n const before = lines\n .slice(0, start)\n .filter((l) => !HR_ONLY.test(l))\n .join('\\n')\n .trim()\n if (!before) return lines.slice(start).join('\\n')\n const paragraphs = before.split(/\\n\\s*\\n/).map((p) => p.trim())\n const narration =\n before.length <= MAX_PREAMBLE_CHARS &&\n paragraphs.length <= MAX_PREAMBLE_PARAGRAPHS &&\n !STRUCTURED.test(before) &&\n paragraphs.every((p) => NARRATION_OPENER.test(p))\n return narration ? lines.slice(start).join('\\n') : text\n}\n\n/**\n * Make the document's title a real heading: the FIRST non-blank line of the text, when it is a\n * short whole-line bold title (`**Letter**`, even with a stray inner `**`), becomes `# Letter`.\n * Nothing else is ever promoted: not a later line, not a mid-sentence fragment (the title must\n * start with a capital or digit, be at most 100 characters, hold no sentence break and not end in\n * `,` `;` or `:`), and a document that already opens with a heading is left alone.\n */\nexport function promoteBoldTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const line = lines[first].trim()\n if (!BOLD_LINE.test(line)) return text\n const title = line.replace(/\\*\\*/g, '').trim()\n if (\n title.length === 0 ||\n title.length > MAX_TITLE_CHARS ||\n !/^[\\p{Lu}\\d]/u.test(title) ||\n /[,;:]$/.test(title) ||\n /[.!?]\\s+\\S/.test(title)\n ) {\n return text\n }\n lines[first] = `# ${title}`\n return lines.join('\\n')\n}\n\n/** Tidy headings only: strip stray bold marks from heading lines (`# **Title**`). */\nfunction cleanHeadings(text: string): string {\n return mapOutsideFences(text, (line) =>\n /^\\s*#{1,6}\\s/.test(line) ? line.replace(/\\*\\*/g, '').trim() : line\n )\n}\n\n/** Which stage of the cleanup produced the text that is returned. */\nexport type DraftCleanStage = 'cleaned' | 'unwrapped' | 'raw'\n\nexport interface DraftCleanReport {\n /** What to store. */\n text: string\n /**\n * `cleaned`: the full cleanup. `unwrapped`: only the citation links were removed (the preamble or\n * title step was rejected by the guard). `raw`: the input as streamed (even link removal was\n * rejected).\n */\n stage: DraftCleanStage\n /** Length of the returned text over the length of the input without its citation markup. */\n ratio: number\n /** Which steps changed the text before the guard (for logs). */\n changedBy: ('citations' | 'preamble' | 'title')[]\n /** The guard rejected a step because it would have lost content. */\n guarded: boolean\n}\n\nconst MIN_RATIO = 0.7\nconst countMatches = (text: string, re: RegExp): number => text.match(re)?.length ?? 0\nconst LIST_NUMBER = /^\\s*\\d{1,9}[.)]\\s/gm\nconst HEADING_LINE = /^#{1,6}\\s/gm\n/** The text with only its citation markup gone: the floor no cleanup may go far under. */\nconst withoutCitationMarkup = (raw: string): string =>\n mapOutsideFences(raw.replace(SOURCE_NOTE, ''), removeCitationLinks).trim()\nconst tidy = (text: string): string => text.replace(/\\n{3,}/g, '\\n\\n').trim()\n/** `after` is `before` with a leading part removed (a prefix cut, never a cut in the middle). */\nconst isPrefixCut = (before: string, after: string): boolean =>\n before.trimEnd().endsWith(after.trim())\n/** Nothing structural was lost: headings and numbered items are all still there. */\nconst keepsStructure = (candidate: string, reference: string): boolean =>\n countMatches(candidate, LIST_NUMBER) >= countMatches(reference, LIST_NUMBER) &&\n countMatches(candidate, HEADING_LINE) >= countMatches(reference, HEADING_LINE)\n\n/** The three text steps of the cleanup; replaceable so the guard can be tested. */\nexport interface DraftCleanSteps {\n unwrap: (text: string) => string\n strip: (text: string) => string\n promote: (text: string) => string\n}\nconst DEFAULT_CLEAN_STEPS: DraftCleanSteps = {\n unwrap: unwrapCitationLinks,\n strip: stripAgentPreamble,\n promote: promoteBoldTitle,\n}\n\n/**\n * `cleanDraftMarkdown` with a safety net and a report, for storing a streamed draft. Each stage is\n * accepted only if it provably cost nothing but narration and citation markup:\n * - links removed: at least 70% of the text length remains and no heading or numbered item is lost\n * (else `raw`, the input exactly as streamed);\n * - narration removed: only a pure prefix of the text may go, and nothing structural;\n * - title and heading tidy: at least 70% of the text remains and no heading or numbered item is lost.\n * A rejected stage falls back to the previous one (`cleaned` -> `unwrapped` -> `raw`).\n */\nexport function cleanDraftWithReport(\n raw: string,\n steps: DraftCleanSteps = DEFAULT_CLEAN_STEPS\n): DraftCleanReport {\n const floor = withoutCitationMarkup(raw)\n const ratio = (t: string): number => (floor.length ? t.length / floor.length : 1)\n const unwrapped = tidy(steps.unwrap(raw))\n const stripped = tidy(steps.strip(unwrapped))\n const titled = tidy(cleanHeadings(steps.promote(stripped)))\n const changedBy: DraftCleanReport['changedBy'] = []\n if (unwrapped !== raw.trim()) changedBy.push('citations')\n if (stripped !== unwrapped) changedBy.push('preamble')\n if (titled !== stripped) changedBy.push('title')\n\n const unwrappedOk = unwrapped.length >= MIN_RATIO * floor.length && keepsStructure(unwrapped, raw)\n if (!unwrappedOk) return { text: raw, stage: 'raw', ratio: 1, changedBy, guarded: true }\n const strippedOk =\n stripped === unwrapped ||\n (isPrefixCut(unwrapped, stripped) && keepsStructure(stripped, unwrapped))\n const titledOk = titled.length >= MIN_RATIO * stripped.length && keepsStructure(titled, stripped)\n if (strippedOk && titledOk) {\n return { text: titled, stage: 'cleaned', ratio: ratio(titled), changedBy, guarded: false }\n }\n return { text: unwrapped, stage: 'unwrapped', ratio: ratio(unwrapped), changedBy, guarded: true }\n}\n\n/**\n * Everything a streamed draft needs before it is stored as the artifact's first version:\n * `unwrapCitationLinks`, `stripAgentPreamble`, `promoteBoldTitle`, clean headings, collapsed blank\n * runs, trimmed, under the guard of `cleanDraftWithReport` (use it to know which stage was kept).\n */\nexport function cleanDraftMarkdown(raw: string): string {\n return cleanDraftWithReport(raw).text\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }