@arbidocs/blocks 0.5.66 → 0.5.68

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 (127) hide show
  1. package/README.md +14 -3
  2. package/dist/ConnectedCallDock-FFIDDYGH.cjs +1 -1
  3. package/dist/ConnectedCallDock-VMEBH4LG.js +1 -1
  4. package/dist/ConnectedCallRoom-2FNSX2VG.js +1 -1
  5. package/dist/ConnectedCallRoom-HYRLJUIV.cjs +1 -1
  6. package/dist/{ConnectedDocumentViewer-XFQDHVWM.js → ConnectedDocumentViewer-MEKSE7KG.js} +14 -14
  7. package/dist/{ConnectedDocumentViewer-XFQDHVWM.js.map → ConnectedDocumentViewer-MEKSE7KG.js.map} +1 -1
  8. package/dist/{ConnectedDocumentViewer-S6YKCCRN.cjs → ConnectedDocumentViewer-VVYEBNAK.cjs} +15 -15
  9. package/dist/{ConnectedDocumentViewer-S6YKCCRN.cjs.map → ConnectedDocumentViewer-VVYEBNAK.cjs.map} +1 -1
  10. package/dist/{ConnectedNativeDocxComparison-L3R3ROPZ.cjs → ConnectedNativeDocxComparison-MIXCSPQP.cjs} +8 -8
  11. package/dist/{ConnectedNativeDocxComparison-L3R3ROPZ.cjs.map → ConnectedNativeDocxComparison-MIXCSPQP.cjs.map} +1 -1
  12. package/dist/{ConnectedNativeDocxComparison-PSAP3Q7D.js → ConnectedNativeDocxComparison-ZXWLLKCZ.js} +7 -7
  13. package/dist/{ConnectedNativeDocxComparison-PSAP3Q7D.js.map → ConnectedNativeDocxComparison-ZXWLLKCZ.js.map} +1 -1
  14. package/dist/{ConnectedNativeDocxEditor-VDBC4XRT.cjs → ConnectedNativeDocxEditor-HDI7OBDA.cjs} +8 -8
  15. package/dist/{ConnectedNativeDocxEditor-VDBC4XRT.cjs.map → ConnectedNativeDocxEditor-HDI7OBDA.cjs.map} +1 -1
  16. package/dist/{ConnectedNativeDocxEditor-PI6QTPXZ.js → ConnectedNativeDocxEditor-IBQ7M3MU.js} +6 -6
  17. package/dist/{ConnectedNativeDocxEditor-PI6QTPXZ.js.map → ConnectedNativeDocxEditor-IBQ7M3MU.js.map} +1 -1
  18. package/dist/{ConnectedStreamedWordArtifact-V4MTKVNE.js → ConnectedStreamedWordArtifact-S64KJPEJ.js} +7 -7
  19. package/dist/ConnectedStreamedWordArtifact-S64KJPEJ.js.map +1 -0
  20. package/dist/{ConnectedStreamedWordArtifact-YSW6D7AG.cjs → ConnectedStreamedWordArtifact-V7WFW5EP.cjs} +8 -8
  21. package/dist/ConnectedStreamedWordArtifact-V7WFW5EP.cjs.map +1 -0
  22. package/dist/{DocumentReviewCard-TQQADJ36.js → DocumentReviewCard-5U3TGJZA.js} +6 -6
  23. package/dist/{DocumentReviewCard-TQQADJ36.js.map → DocumentReviewCard-5U3TGJZA.js.map} +1 -1
  24. package/dist/{DocumentReviewCard-BQ6ZD5MD.cjs → DocumentReviewCard-VFNMJSK7.cjs} +6 -6
  25. package/dist/{DocumentReviewCard-BQ6ZD5MD.cjs.map → DocumentReviewCard-VFNMJSK7.cjs.map} +1 -1
  26. package/dist/{WorkspaceTableView-GKMVTECZ.cjs → WorkspaceTableView-DHMCJRC6.cjs} +6 -6
  27. package/dist/{WorkspaceTableView-GKMVTECZ.cjs.map → WorkspaceTableView-DHMCJRC6.cjs.map} +1 -1
  28. package/dist/{WorkspaceTableView-YFLVFRJL.js → WorkspaceTableView-EH5CEB44.js} +4 -4
  29. package/dist/{WorkspaceTableView-YFLVFRJL.js.map → WorkspaceTableView-EH5CEB44.js.map} +1 -1
  30. package/dist/agents/index.cjs +283 -283
  31. package/dist/agents/index.js +5 -5
  32. package/dist/chat/index.cjs +1 -1
  33. package/dist/chat/index.js +1 -1
  34. package/dist/{chunk-TJ7QEGVP.cjs → chunk-35FBVTT6.cjs} +18 -18
  35. package/dist/{chunk-TJ7QEGVP.cjs.map → chunk-35FBVTT6.cjs.map} +1 -1
  36. package/dist/{chunk-3SHZPTR2.cjs → chunk-3DQZ7JWL.cjs} +18 -18
  37. package/dist/{chunk-3SHZPTR2.cjs.map → chunk-3DQZ7JWL.cjs.map} +1 -1
  38. package/dist/{chunk-EM4KOKE6.js → chunk-5TFZFB5U.js} +3 -3
  39. package/dist/{chunk-EM4KOKE6.js.map → chunk-5TFZFB5U.js.map} +1 -1
  40. package/dist/{chunk-PBIFISDD.js → chunk-7P24MJQN.js} +3 -3
  41. package/dist/{chunk-PBIFISDD.js.map → chunk-7P24MJQN.js.map} +1 -1
  42. package/dist/{chunk-TCCJ5I6G.js → chunk-B6QTKCDK.js} +5 -5
  43. package/dist/{chunk-TCCJ5I6G.js.map → chunk-B6QTKCDK.js.map} +1 -1
  44. package/dist/{chunk-EG3BB32W.cjs → chunk-CCSF7RI4.cjs} +3 -3
  45. package/dist/{chunk-EG3BB32W.cjs.map → chunk-CCSF7RI4.cjs.map} +1 -1
  46. package/dist/{chunk-QK546T4C.cjs → chunk-CKNUL4LM.cjs} +3 -3
  47. package/dist/{chunk-QK546T4C.cjs.map → chunk-CKNUL4LM.cjs.map} +1 -1
  48. package/dist/{chunk-WBLCPCWR.cjs → chunk-CUSOXCBV.cjs} +7 -7
  49. package/dist/{chunk-WBLCPCWR.cjs.map → chunk-CUSOXCBV.cjs.map} +1 -1
  50. package/dist/{chunk-DJE2E7YH.cjs → chunk-EPBFVO4F.cjs} +278 -68
  51. package/dist/chunk-EPBFVO4F.cjs.map +1 -0
  52. package/dist/{chunk-K26RLK2Y.cjs → chunk-IH2WZUTL.cjs} +4 -4
  53. package/dist/{chunk-K26RLK2Y.cjs.map → chunk-IH2WZUTL.cjs.map} +1 -1
  54. package/dist/{chunk-NDKZ6OR3.cjs → chunk-LEW4GUFW.cjs} +3 -3
  55. package/dist/{chunk-NDKZ6OR3.cjs.map → chunk-LEW4GUFW.cjs.map} +1 -1
  56. package/dist/{chunk-VWM3J6ES.js → chunk-LKVOHL6C.js} +3 -3
  57. package/dist/{chunk-VWM3J6ES.js.map → chunk-LKVOHL6C.js.map} +1 -1
  58. package/dist/{chunk-CEKOZAGO.js → chunk-LTPOV3W4.js} +4 -4
  59. package/dist/{chunk-CEKOZAGO.js.map → chunk-LTPOV3W4.js.map} +1 -1
  60. package/dist/{chunk-DRUNPUDT.cjs → chunk-MM22MFON.cjs} +12 -12
  61. package/dist/{chunk-DRUNPUDT.cjs.map → chunk-MM22MFON.cjs.map} +1 -1
  62. package/dist/{chunk-BELZ2WD2.js → chunk-N54OMO6J.js} +281 -71
  63. package/dist/chunk-N54OMO6J.js.map +1 -0
  64. package/dist/{chunk-RB54N5I7.cjs → chunk-NBX7WWB6.cjs} +5 -5
  65. package/dist/{chunk-RB54N5I7.cjs.map → chunk-NBX7WWB6.cjs.map} +1 -1
  66. package/dist/{chunk-B3CRSCLK.cjs → chunk-NMQVII6H.cjs} +4 -4
  67. package/dist/{chunk-B3CRSCLK.cjs.map → chunk-NMQVII6H.cjs.map} +1 -1
  68. package/dist/{chunk-U52KPOXT.js → chunk-NOBSRGFX.js} +3 -3
  69. package/dist/{chunk-U52KPOXT.js.map → chunk-NOBSRGFX.js.map} +1 -1
  70. package/dist/{chunk-2LUA7UDE.js → chunk-P2ZQKJXS.js} +7 -7
  71. package/dist/{chunk-2LUA7UDE.js.map → chunk-P2ZQKJXS.js.map} +1 -1
  72. package/dist/{chunk-KNOSLLTC.js → chunk-PKDPQS6Z.js} +3 -3
  73. package/dist/{chunk-KNOSLLTC.js.map → chunk-PKDPQS6Z.js.map} +1 -1
  74. package/dist/{chunk-J6FRFIVL.js → chunk-RAGITH2N.js} +3 -3
  75. package/dist/{chunk-J6FRFIVL.js.map → chunk-RAGITH2N.js.map} +1 -1
  76. package/dist/{chunk-PMWZTVIY.js → chunk-RSVHFZJR.js} +12 -6
  77. package/dist/chunk-RSVHFZJR.js.map +1 -0
  78. package/dist/{chunk-IRXPUQFP.js → chunk-SC3GOSJG.js} +3 -3
  79. package/dist/{chunk-IRXPUQFP.js.map → chunk-SC3GOSJG.js.map} +1 -1
  80. package/dist/{chunk-SBAM3UZX.js → chunk-SNU3AOCW.js} +3 -3
  81. package/dist/{chunk-SBAM3UZX.js.map → chunk-SNU3AOCW.js.map} +1 -1
  82. package/dist/{chunk-BP5KBZLX.cjs → chunk-XXI3EIEO.cjs} +53 -47
  83. package/dist/chunk-XXI3EIEO.cjs.map +1 -0
  84. package/dist/{chunk-D27BBGUF.cjs → chunk-ZSP6QSMG.cjs} +4 -4
  85. package/dist/{chunk-D27BBGUF.cjs.map → chunk-ZSP6QSMG.cjs.map} +1 -1
  86. package/dist/connect/docx.cjs +12 -12
  87. package/dist/connect/docx.js +8 -8
  88. package/dist/connect/index.cjs +1365 -1072
  89. package/dist/connect/index.cjs.map +1 -1
  90. package/dist/connect/index.js +915 -630
  91. package/dist/connect/index.js.map +1 -1
  92. package/dist/connect/viewer.cjs +13 -13
  93. package/dist/connect/viewer.js +12 -12
  94. package/dist/connection/billing/index.d.ts +1 -0
  95. package/dist/connection/billing/payment-required.d.ts +45 -0
  96. package/dist/connection/conversation/ConnectedMessageArea.d.ts +2 -0
  97. package/dist/connection/conversation/ConnectedMessageList.d.ts +4 -1
  98. package/dist/connection/embedded/EmbeddedChatPanel.d.ts +3 -1
  99. package/dist/connection/settings-page/ConnectedModelConnectionsSettings.d.ts +1 -0
  100. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +3 -0
  101. package/dist/connection/settings-page/index.d.ts +2 -1
  102. package/dist/connection/workflows/useWorkflowsPageState.d.ts +1 -1
  103. package/dist/document-tools/index.cjs +17 -17
  104. package/dist/document-tools/index.js +2 -2
  105. package/dist/embed/index.cjs +18 -10
  106. package/dist/embed/index.d.ts +2 -0
  107. package/dist/embed/index.js +7 -7
  108. package/dist/files/index.cjs +1 -1
  109. package/dist/files/index.js +1 -1
  110. package/dist/index.cjs +393 -393
  111. package/dist/index.js +13 -13
  112. package/dist/site/index.cjs +17 -17
  113. package/dist/site/index.js +1 -1
  114. package/dist/studio/index.cjs +4 -4
  115. package/dist/studio/index.js +2 -2
  116. package/dist/workflow-canvas/index.cjs +27 -27
  117. package/dist/workflow-canvas/index.cjs.map +1 -1
  118. package/dist/workflow-canvas/index.js +12 -12
  119. package/dist/workflow-canvas/index.js.map +1 -1
  120. package/node_modules/@arbidocs/coedit/package.json +1 -1
  121. package/package.json +5 -5
  122. package/dist/ConnectedStreamedWordArtifact-V4MTKVNE.js.map +0 -1
  123. package/dist/ConnectedStreamedWordArtifact-YSW6D7AG.cjs.map +0 -1
  124. package/dist/chunk-BELZ2WD2.js.map +0 -1
  125. package/dist/chunk-BP5KBZLX.cjs.map +0 -1
  126. package/dist/chunk-DJE2E7YH.cjs.map +0 -1
  127. package/dist/chunk-PMWZTVIY.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { useConnectedThreadActivity, useSelectWorkspace } from './chunk-CRHY7DBO.js';
3
3
  import { DocumentUser } from './chunk-UO7KDCM2.js';
4
- import { MessageJsonTree } from './chunk-ZZTH27G7.js';
5
4
  import { buildFactCitations, citedVersionRef, chronologyFactBodies } from './chunk-KGUSKGZE.js';
5
+ import { MessageJsonTree } from './chunk-ZZTH27G7.js';
6
6
  import { ConnectedMarkdown, InternalDocLink, ExternalLink } from './chunk-HGFU47TY.js';
7
7
  import { ModalBreadcrumbHeader, ModalCrumbs } from './chunk-RC6VTY2H.js';
8
8
  import { EntityTooltip, EntityTooltipHeader, EntityTooltipSection, EntityTooltipHint } from './chunk-3UIJLUXN.js';
@@ -22,9 +22,9 @@ import { useListKeyNav, MentionMenu } from './chunk-GAGYAHYO.js';
22
22
  import { buildDeepLinkPath } from './chunk-7Q5INDUS.js';
23
23
  import { useBlocksEnvironment } from './chunk-TJQSL4XV.js';
24
24
  import React7, { memo, useMemo, createContext, forwardRef, useCallback, useRef, useLayoutEffect, useEffect, useState, useContext } from 'react';
25
- import { Users, MessageCircleMore, ArrowUpRight, Send, Settings, Edit3, Copy, Link, Share2, Trash2, Check, Milestone, Clock, RotateCcw, FileText, Loader2, Network, ChevronRight, Download, Square, LogIn } from 'lucide-react';
26
- import { useWorkspaces, ArbiBotHeadIcon, useArbiWsStatus, useArbiWsStore, useUserSettings, useMessageTimer, useDocuments, useAvailableModels, formatGbp, useArbiSessionStore, CitationRenderer, useArbiSessionState, selectDraft, useWorkspaceUsers, useArbiSession, buildMentionCandidates, useConversations, ASSISTANT_MENTION_LABEL, useConversationItems, useDeleteMessage, transcriptSegmentOf, useConfig, useThinkingContent, useCreateFact, useCreateFacts, workflowStepOf, stripSpeakerPrefix, MessageArtifactCard, useConversationData, useBranchNavigation, useArbiHost, useSkills, useBuiltinCommands, useConversationActivity, useMessageDetails, getWorkspaceKind, resolveConfigModel, useConversationTurn, downloadRecoveryFile, useArbi, ArbiWebSocketProvider } from '@arbidocs/react';
27
- import { isAgent, UserEntity, getUserInitials, getUserDisplayName, getUserAvatarColor, agentAvatarColors, Avatar, AvatarImage, AvatarFallback, cn, ShieldIcon, getWorkspaceColor, getDocumentTitle, Button, isImageDocument, formatFriendlyDate, Tooltip, TooltipTrigger, TooltipContent, Dialog, DialogContent, ProviderIcon, getEntityLabel, EntityIcon, ScrollArea, Checkbox, Input } from '@arbidocs/react/ui';
25
+ import { Users, MessageCircleMore, ArrowUpRight, Send, Settings, Edit3, Copy, Link, Share2, Trash2, Check, Milestone, Clock, RotateCcw, FileText, Loader2, Network, ChevronRight, Download, Plus, MessageSquare, ArrowDown, Square, ChevronDown, Upload, LogIn } from 'lucide-react';
26
+ import { useWorkspaces, ArbiBotHeadIcon, useArbiWsStatus, useArbiWsStore, useUserSettings, useMessageTimer, useDocuments, useAvailableModels, formatGbp, useArbiSessionStore, CitationRenderer, useArbiSessionState, selectDraft, useWorkspaceUsers, useArbiSession, buildMentionCandidates, useConversations, ASSISTANT_MENTION_LABEL, useConversationItems, useDeleteMessage, transcriptSegmentOf, useConfig, useThinkingContent, useCreateFact, useCreateFacts, workflowStepOf, stripSpeakerPrefix, MessageArtifactCard, useConversationData, useBranchNavigation, useArbiHost, useSkills, useBuiltinCommands, useConversationActivity, useMessageDetails, getWorkspaceKind, resolveConfigModel, useConversationTurn, useUploadDocuments, useWorkspaceRole, downloadRecoveryFile, useArbi, ArbiWebSocketProvider } from '@arbidocs/react';
27
+ import { isAgent, UserEntity, getUserInitials, getUserDisplayName, getUserAvatarColor, agentAvatarColors, Avatar, AvatarImage, AvatarFallback, cn, ShieldIcon, getWorkspaceColor, getDocumentTitle, Button, isImageDocument, formatFriendlyDate, Tooltip, TooltipTrigger, TooltipContent, Dialog, DialogContent, ProviderIcon, getEntityLabel, EntityIcon, Checkbox, Input } from '@arbidocs/react/ui';
28
28
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
29
29
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
30
30
  import { mergeAgentSteps, extractSubagentLanes, getCurrentStep, computeRunStats, formatTokens, isNearAiUsageBudget, getSubagentBranchRecord, buildCitationChunkData, topLevelAgentSteps, findMainSiblingLeaf, sliceToSubagentThread, getAgentStepLabel, subagentJobLabel, getStepDisplay, getStepTool, findLeafForTaskMessage, Arbi } from '@arbidocs/sdk/browser';
@@ -2198,7 +2198,7 @@ function resolveScrollContainer(current) {
2198
2198
  function stripThinking(content) {
2199
2199
  return content.replace(/<think>[\s\S]*?(<\/think>|$)/g, "");
2200
2200
  }
2201
- function ConnectedMessageList({ messages }) {
2201
+ function ConnectedMessageList({ messages, scrollElementRef }) {
2202
2202
  const session = useArbiSessionStore();
2203
2203
  const [previewOpen, setPreviewOpen] = useState(false);
2204
2204
  const participantTints = useMemo(
@@ -2229,14 +2229,14 @@ function ConnectedMessageList({ messages }) {
2229
2229
  text: lastMessage?.role === "assistant" ? stripThinking(lastMessage.content ?? "") : "",
2230
2230
  resetKey: currentConversationId
2231
2231
  });
2232
- const scrollElementRef = useRef(null);
2232
+ const scrollContainerRef = useRef(null);
2233
2233
  const getScrollContainer = useCallback(() => {
2234
- scrollElementRef.current = resolveScrollContainer(scrollElementRef.current);
2235
- return scrollElementRef.current;
2236
- }, []);
2234
+ scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(scrollContainerRef.current);
2235
+ return scrollContainerRef.current;
2236
+ }, [scrollElementRef]);
2237
2237
  useEffect(() => {
2238
- scrollElementRef.current = resolveScrollContainer(null);
2239
- }, []);
2238
+ scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(null);
2239
+ }, [scrollElementRef]);
2240
2240
  const { items: activityItems } = useConnectedThreadActivity(currentConversationId);
2241
2241
  const transcript = [
2242
2242
  ...displayMessages.map((message, index) => ({
@@ -2388,15 +2388,21 @@ function ConnectedMessageList({ messages }) {
2388
2388
  /* @__PURE__ */ jsx(ConnectedThreadsPreview, { open: previewOpen, onOpenChange: setPreviewOpen })
2389
2389
  ] });
2390
2390
  }
2391
- var MessageAreaComponent = forwardRef(({ messages }, ref) => {
2392
- return /* @__PURE__ */ jsx("div", { ref, className: "flex w-full flex-1 flex-col pt-4", "data-testid": "message-area", children: /* @__PURE__ */ jsx("div", { className: "mt-auto w-full", "data-testid": "message-list-bottom-anchor", children: /* @__PURE__ */ jsx(ConnectedMessageList, { messages }) }) });
2393
- });
2391
+ var MessageAreaComponent = forwardRef(
2392
+ ({ messages, scrollElementRef }, ref) => {
2393
+ return /* @__PURE__ */ jsx("div", { ref, className: "flex w-full flex-1 flex-col pt-4", "data-testid": "message-area", children: /* @__PURE__ */ jsx("div", { className: "mt-auto w-full", "data-testid": "message-list-bottom-anchor", children: /* @__PURE__ */ jsx(ConnectedMessageList, { messages, scrollElementRef }) }) });
2394
+ }
2395
+ );
2394
2396
  MessageAreaComponent.displayName = "ConnectedMessageArea";
2395
2397
  var ConnectedMessageArea = memo(MessageAreaComponent, (prevProps, nextProps) => {
2396
- return prevProps.messages === nextProps.messages;
2398
+ return prevProps.messages === nextProps.messages && prevProps.scrollElementRef === nextProps.scrollElementRef;
2397
2399
  });
2398
2400
  function ConnectedCompactConversation() {
2401
+ const session = useArbiSessionStore();
2399
2402
  const containerRef = useRef(null);
2403
+ const scrollRef = useRef(null);
2404
+ const following = useRef(true);
2405
+ const [showLatest, setShowLatest] = useState(false);
2400
2406
  const inputRef = useRef(null);
2401
2407
  const { selectedWorkspaceId, parentMessageId, messageHistory } = useConversationData();
2402
2408
  const { isGenerating, handleSendMessage, handleAbortGeneration } = useConversationTurn({
@@ -2404,9 +2410,100 @@ function ConnectedCompactConversation() {
2404
2410
  parentMessageId
2405
2411
  });
2406
2412
  const currentConversationId = useArbiSessionState((state) => state.conversationId);
2413
+ useEffect(() => {
2414
+ const viewport = scrollRef.current;
2415
+ const content = containerRef.current;
2416
+ if (!viewport || !content) return;
2417
+ const follow = () => {
2418
+ if (following.current) viewport.scrollTop = viewport.scrollHeight;
2419
+ };
2420
+ follow();
2421
+ const observer = new ResizeObserver(follow);
2422
+ observer.observe(content);
2423
+ return () => observer.disconnect();
2424
+ }, [messageHistory.length > 0, currentConversationId]);
2425
+ useEffect(() => {
2426
+ following.current = true;
2427
+ setShowLatest(false);
2428
+ }, [currentConversationId]);
2407
2429
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-h-0", "data-testid": "embedded-chat", children: [
2408
- /* @__PURE__ */ jsx("div", { className: "relative flex-1 min-h-0", children: messageHistory.length > 0 ? /* @__PURE__ */ jsx(ConnectedMessageArea, { ref: containerRef, messages: messageHistory }) : /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full text-muted-foreground text-sm p-4", children: currentConversationId ? "Loading messages..." : "Start a conversation by typing below." }) }),
2409
- /* @__PURE__ */ jsx("div", { className: "sticky bottom-0 w-full bg-background border-t z-10", children: /* @__PURE__ */ jsx(ComposerContainer, { children: /* @__PURE__ */ jsx(
2430
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center justify-between border-b px-3 py-2 text-xs text-muted-foreground", children: [
2431
+ /* @__PURE__ */ jsx("span", { children: isGenerating ? "ARBI is responding\u2026" : "Conversation" }),
2432
+ /* @__PURE__ */ jsxs(
2433
+ Button,
2434
+ {
2435
+ type: "button",
2436
+ size: "sm",
2437
+ variant: "ghost",
2438
+ disabled: isGenerating,
2439
+ onClick: () => {
2440
+ session.clearConversationError(currentConversationId || "new");
2441
+ session.startNewConversation();
2442
+ },
2443
+ children: [
2444
+ /* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5 mr-1" }),
2445
+ " New chat"
2446
+ ]
2447
+ }
2448
+ )
2449
+ ] }),
2450
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col flex-1 min-h-0 overflow-hidden", children: [
2451
+ /* @__PURE__ */ jsx(
2452
+ "div",
2453
+ {
2454
+ ref: scrollRef,
2455
+ className: "flex-1 min-h-0 overflow-y-auto overscroll-contain px-3",
2456
+ tabIndex: 0,
2457
+ "aria-label": "Conversation messages",
2458
+ "data-testid": "embedded-transcript",
2459
+ onWheel: (event) => {
2460
+ if (event.deltaY < 0) following.current = false;
2461
+ },
2462
+ onTouchMove: () => {
2463
+ following.current = false;
2464
+ },
2465
+ onKeyDown: (event) => {
2466
+ if (["ArrowUp", "PageUp", "Home"].includes(event.key)) following.current = false;
2467
+ },
2468
+ onScroll: (event) => {
2469
+ const node = event.currentTarget;
2470
+ const atBottom = node.scrollHeight - node.clientHeight - node.scrollTop < 32;
2471
+ following.current = atBottom;
2472
+ setShowLatest(!atBottom);
2473
+ },
2474
+ children: messageHistory.length > 0 ? /* @__PURE__ */ jsx(
2475
+ ConnectedMessageArea,
2476
+ {
2477
+ ref: containerRef,
2478
+ messages: messageHistory,
2479
+ scrollElementRef: scrollRef
2480
+ }
2481
+ ) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 items-center justify-center h-full text-muted-foreground text-sm p-6 text-center", children: [
2482
+ /* @__PURE__ */ jsx(MessageSquare, { className: "h-8 w-8 text-primary", "aria-hidden": "true" }),
2483
+ currentConversationId ? "Loading messages..." : "Start a conversation by typing below."
2484
+ ] })
2485
+ }
2486
+ ),
2487
+ showLatest && /* @__PURE__ */ jsxs(
2488
+ Button,
2489
+ {
2490
+ className: "absolute bottom-3 left-1/2 -translate-x-1/2 rounded-full shadow-md",
2491
+ size: "sm",
2492
+ variant: "secondary",
2493
+ onClick: () => {
2494
+ following.current = true;
2495
+ const viewport = scrollRef.current;
2496
+ if (viewport) viewport.scrollTop = viewport.scrollHeight;
2497
+ setShowLatest(false);
2498
+ },
2499
+ children: [
2500
+ /* @__PURE__ */ jsx(ArrowDown, { className: "h-4 w-4 mr-1" }),
2501
+ " Latest message"
2502
+ ]
2503
+ }
2504
+ )
2505
+ ] }),
2506
+ /* @__PURE__ */ jsx("div", { className: "shrink-0 w-full bg-background border-t p-2 z-10", children: /* @__PURE__ */ jsx(ComposerContainer, { children: /* @__PURE__ */ jsx(
2410
2507
  ConversationComposer2,
2411
2508
  {
2412
2509
  handleSendMessage,
@@ -2451,12 +2548,19 @@ function ConnectedConversationDocumentPicker({
2451
2548
  onSelectionChange
2452
2549
  }) {
2453
2550
  const session = useArbiSessionStore();
2551
+ const upload = useUploadDocuments();
2552
+ const role = useWorkspaceRole();
2553
+ const canUpload = role !== null && role !== "guest";
2554
+ const inputRef = useRef(null);
2555
+ const [expanded, setExpanded] = useState(false);
2556
+ const [uploadError, setUploadError] = useState(null);
2557
+ const [uploadNotice, setUploadNotice] = useState(null);
2454
2558
  const currentConversationId = useArbiSessionState((state) => state.conversationId);
2455
2559
  const convKey = currentConversationId || "new";
2456
2560
  const inConversationDocuments = useArbiSessionState(
2457
2561
  (state) => state.conversationDocuments[convKey] || EMPTY_DOCS
2458
2562
  );
2459
- const { data: documentsData } = useDocuments();
2563
+ const { data: documentsData, isLoading, error: documentsError } = useDocuments();
2460
2564
  const documents = documentsData || [];
2461
2565
  const selectedDocIds = inConversationDocuments.map((d) => d.docId);
2462
2566
  const handleToggle = (docId) => {
@@ -2469,45 +2573,135 @@ function ConnectedConversationDocumentPicker({
2469
2573
  selected ? selectedDocIds.filter((id) => id !== docId) : [...selectedDocIds, docId]
2470
2574
  );
2471
2575
  };
2472
- return /* @__PURE__ */ jsxs("div", { className: "px-3 py-2", "data-testid": "embedded-document-selector", children: [
2473
- /* @__PURE__ */ jsxs("label", { className: "text-sm font-medium mb-1 block text-muted-foreground", children: [
2474
- /* @__PURE__ */ jsx(FileText, { className: "inline h-3 w-3 mr-1" }),
2475
- "Documents (",
2476
- selectedDocIds.length,
2477
- " selected)"
2478
- ] }),
2479
- /* @__PURE__ */ jsx(ScrollArea, { className: "h-28 border rounded-md p-2", "data-testid": "embedded-documents-list", children: documents.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground text-center py-4", children: "No documents in this workspace." }) : /* @__PURE__ */ jsx("div", { className: "space-y-1", children: documents.map((doc) => {
2480
- const docId = doc.external_id;
2481
- const docTitle = getDocumentTitle(doc, "Untitled");
2482
- return /* @__PURE__ */ jsxs(
2483
- "div",
2484
- {
2485
- className: "flex items-center space-x-2",
2486
- "data-testid": `embedded-document-${docId}`,
2487
- children: [
2488
- /* @__PURE__ */ jsx(
2489
- Checkbox,
2490
- {
2491
- id: `embedded-doc-${docId}`,
2492
- checked: selectedDocIds.includes(docId),
2493
- onCheckedChange: () => handleToggle(docId)
2494
- }
2495
- ),
2496
- /* @__PURE__ */ jsx(
2497
- "label",
2498
- {
2499
- htmlFor: `embedded-doc-${docId}`,
2500
- className: "text-sm cursor-pointer flex-1 truncate",
2501
- title: docTitle,
2502
- children: docTitle
2503
- }
2504
- )
2505
- ]
2506
- },
2507
- docId
2576
+ async function addFiles(files) {
2577
+ if (!canUpload) return;
2578
+ setUploadError(null);
2579
+ setUploadNotice(null);
2580
+ const original = session.getState();
2581
+ const workspaceId = original.workspaceId;
2582
+ const key = original.conversationId || "new";
2583
+ try {
2584
+ const result = await upload.mutateAsync({ files });
2585
+ const ids = result.doc_ext_ids ?? [];
2586
+ const current = session.getState();
2587
+ if (current.workspaceId !== workspaceId) return;
2588
+ const selected = current.conversationDocuments[key] || EMPTY_DOCS;
2589
+ const merged = [
2590
+ ...selected,
2591
+ ...ids.filter((id) => !selected.some((d) => d.docId === id)).map((docId) => ({ docId, isPinned: false }))
2592
+ ];
2593
+ session.setConversationDocuments(key, merged);
2594
+ onSelectionChange?.(merged.map((d) => d.docId));
2595
+ setExpanded(true);
2596
+ setUploadNotice(
2597
+ ids.length ? `${ids.length} file${ids.length === 1 ? "" : "s"} added to this chat.` : "No new files added. Files may already exist in this workspace."
2508
2598
  );
2509
- }) }) })
2510
- ] });
2599
+ } catch (error) {
2600
+ setUploadError(error instanceof Error ? error.message : "Could not upload files. Try again.");
2601
+ }
2602
+ }
2603
+ return /* @__PURE__ */ jsxs(
2604
+ "div",
2605
+ {
2606
+ className: "shrink-0 border-b bg-muted/30 px-3 py-2",
2607
+ "data-testid": "embedded-document-selector",
2608
+ children: [
2609
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
2610
+ /* @__PURE__ */ jsxs(
2611
+ Button,
2612
+ {
2613
+ type: "button",
2614
+ variant: "ghost",
2615
+ size: "sm",
2616
+ className: "min-w-0",
2617
+ "aria-expanded": expanded,
2618
+ "aria-controls": "embedded-documents",
2619
+ onClick: () => setExpanded(!expanded),
2620
+ children: [
2621
+ /* @__PURE__ */ jsx(FileText, { className: "h-4 w-4 mr-2" }),
2622
+ "Files",
2623
+ selectedDocIds.length > 0 ? ` (${selectedDocIds.length} selected)` : "",
2624
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4 ml-2" })
2625
+ ]
2626
+ }
2627
+ ),
2628
+ /* @__PURE__ */ jsx(
2629
+ "input",
2630
+ {
2631
+ ref: inputRef,
2632
+ type: "file",
2633
+ multiple: true,
2634
+ className: "hidden",
2635
+ "aria-label": "Upload files",
2636
+ onChange: (event) => {
2637
+ const files = Array.from(event.target.files ?? []);
2638
+ event.target.value = "";
2639
+ if (files.length) void addFiles(files);
2640
+ }
2641
+ }
2642
+ ),
2643
+ /* @__PURE__ */ jsxs(
2644
+ Button,
2645
+ {
2646
+ type: "button",
2647
+ variant: "outline",
2648
+ size: "sm",
2649
+ disabled: upload.isPending || !canUpload,
2650
+ title: !canUpload ? "You do not have permission to upload to this workspace." : void 0,
2651
+ onClick: () => inputRef.current?.click(),
2652
+ children: [
2653
+ /* @__PURE__ */ jsx(Upload, { className: "h-4 w-4 mr-2" }),
2654
+ upload.isPending ? "Uploading\u2026" : "Upload files"
2655
+ ]
2656
+ }
2657
+ )
2658
+ ] }),
2659
+ uploadError && /* @__PURE__ */ jsx("p", { role: "alert", className: "mt-2 text-sm text-destructive", children: uploadError }),
2660
+ uploadNotice && /* @__PURE__ */ jsx("p", { role: "status", className: "mt-2 text-xs text-muted-foreground", children: uploadNotice }),
2661
+ expanded && /* @__PURE__ */ jsxs("div", { id: "embedded-documents", className: "mt-2", children: [
2662
+ /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs text-muted-foreground", children: "Select files to use in this conversation. Uploads are saved in the current workspace." }),
2663
+ /* @__PURE__ */ jsx(
2664
+ "div",
2665
+ {
2666
+ className: "max-h-28 overflow-y-auto rounded-md border p-2",
2667
+ "data-testid": "embedded-documents-list",
2668
+ children: isLoading ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Loading files\u2026" }) : documentsError ? /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-destructive", children: "Could not load workspace files." }) : documents.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No files yet. Upload a file to discuss it with ARBI." }) : /* @__PURE__ */ jsx("div", { className: "space-y-2", children: documents.map((doc) => {
2669
+ const docId = doc.external_id;
2670
+ const docTitle = getDocumentTitle(doc, "Untitled");
2671
+ return /* @__PURE__ */ jsxs(
2672
+ "div",
2673
+ {
2674
+ className: "flex items-center space-x-2",
2675
+ "data-testid": `embedded-document-${docId}`,
2676
+ children: [
2677
+ /* @__PURE__ */ jsx(
2678
+ Checkbox,
2679
+ {
2680
+ id: `embedded-doc-${docId}`,
2681
+ checked: selectedDocIds.includes(docId),
2682
+ onCheckedChange: () => handleToggle(docId)
2683
+ }
2684
+ ),
2685
+ /* @__PURE__ */ jsx(
2686
+ "label",
2687
+ {
2688
+ htmlFor: `embedded-doc-${docId}`,
2689
+ className: "min-w-0 text-sm cursor-pointer flex-1 truncate",
2690
+ title: docTitle,
2691
+ children: docTitle
2692
+ }
2693
+ )
2694
+ ]
2695
+ },
2696
+ docId
2697
+ );
2698
+ }) })
2699
+ }
2700
+ )
2701
+ ] })
2702
+ ]
2703
+ }
2704
+ );
2511
2705
  }
2512
2706
  async function backUpOnSignup({
2513
2707
  email,
@@ -3184,27 +3378,33 @@ function EmbeddedChatPanel({
3184
3378
  }) {
3185
3379
  const workspaceId = useArbiSessionState((s) => s.workspaceId);
3186
3380
  if (!signedIn)
3187
- return /* @__PURE__ */ jsxs("div", { className: "p-4", "data-testid": "embedded-panel-login", children: [
3381
+ return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-0 overflow-y-auto p-4", "data-testid": "embedded-panel-login", children: [
3188
3382
  login,
3189
3383
  footer
3190
3384
  ] });
3191
3385
  return /* @__PURE__ */ jsxs(
3192
3386
  "div",
3193
3387
  {
3194
- className: "flex flex-col h-full min-h-0 bg-background text-foreground",
3388
+ className: "flex flex-col h-full min-h-0 min-w-0 overflow-hidden bg-background text-foreground",
3195
3389
  "data-testid": "embedded-panel",
3196
3390
  children: [
3197
- header,
3198
- workspaceId && /* @__PURE__ */ jsx(ConnectedConversationDocumentPicker, { onSelectionChange: onDocumentSelectionChange }),
3199
- platformHeader,
3200
- workspaceId ? /* @__PURE__ */ jsx(ConnectedCompactConversation, {}) : /* @__PURE__ */ jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "Select a workspace to start chatting." }),
3201
- platformFooter,
3202
- footer
3391
+ /* @__PURE__ */ jsx("div", { className: "shrink-0", children: header }),
3392
+ workspaceId && /* @__PURE__ */ jsx(
3393
+ ConnectedConversationDocumentPicker,
3394
+ {
3395
+ onSelectionChange: onDocumentSelectionChange
3396
+ },
3397
+ workspaceId
3398
+ ),
3399
+ platformHeader && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: platformHeader }),
3400
+ workspaceId ? /* @__PURE__ */ jsx(ConnectedCompactConversation, {}, workspaceId) : /* @__PURE__ */ jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "Select a workspace to start chatting." }),
3401
+ platformFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: platformFooter }),
3402
+ footer && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: footer })
3203
3403
  ]
3204
3404
  }
3205
3405
  );
3206
3406
  }
3207
- function EmbeddedWorkspaceHeader() {
3407
+ function EmbeddedWorkspaceHeader({ title }) {
3208
3408
  const arbi = useArbi();
3209
3409
  const signedIn = useArbiSession();
3210
3410
  const workspaceId = useArbiSessionState((s) => s.workspaceId);
@@ -3225,7 +3425,11 @@ function EmbeddedWorkspaceHeader() {
3225
3425
  setPending(false);
3226
3426
  }
3227
3427
  }
3228
- return /* @__PURE__ */ jsxs("header", { className: "p-3 border-b space-y-2", children: [
3428
+ return /* @__PURE__ */ jsxs("header", { className: "shrink-0 p-3 border-b space-y-3", children: [
3429
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 font-semibold text-primary", children: [
3430
+ /* @__PURE__ */ jsx(MessageSquare, { className: "h-5 w-5", "aria-hidden": "true" }),
3431
+ title
3432
+ ] }),
3229
3433
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
3230
3434
  /* @__PURE__ */ jsx("span", { className: "truncate text-sm", children: signedIn.user?.email }),
3231
3435
  /* @__PURE__ */ jsx(
@@ -3276,7 +3480,7 @@ function ConnectedEmbeddedChat({
3276
3480
  {
3277
3481
  ...props,
3278
3482
  signedIn: session.status === "signed-in",
3279
- header: /* @__PURE__ */ jsx(EmbeddedWorkspaceHeader, {}),
3483
+ header: /* @__PURE__ */ jsx(EmbeddedWorkspaceHeader, { title }),
3280
3484
  login: /* @__PURE__ */ jsxs(Fragment, { children: [
3281
3485
  /* @__PURE__ */ jsx("h1", { className: "font-semibold mb-4", children: title }),
3282
3486
  /* @__PURE__ */ jsx(CompactLogin, { ...login })
@@ -3284,7 +3488,7 @@ function ConnectedEmbeddedChat({
3284
3488
  }
3285
3489
  );
3286
3490
  }
3287
- function ArbiChat({ apiUrl, deploymentDomain, ...props }) {
3491
+ function ArbiChat({ apiUrl, deploymentDomain, className, ...props }) {
3288
3492
  const host = useMemo(
3289
3493
  () => defaultHost(
3290
3494
  {
@@ -3297,9 +3501,15 @@ function ArbiChat({ apiUrl, deploymentDomain, ...props }) {
3297
3501
  ),
3298
3502
  [apiUrl, deploymentDomain]
3299
3503
  );
3300
- return /* @__PURE__ */ jsx(ArbiHost, { config: host, children: /* @__PURE__ */ jsx(ConnectedEmbeddedChat, { ...props }) }, `${apiUrl}|${deploymentDomain ?? ""}`);
3504
+ return /* @__PURE__ */ jsx(ArbiHost, { config: host, children: /* @__PURE__ */ jsx(
3505
+ "div",
3506
+ {
3507
+ className: className ?? "h-[min(44rem,100dvh)] w-full min-h-0 overflow-hidden rounded-xl border bg-background shadow-sm",
3508
+ children: /* @__PURE__ */ jsx(ConnectedEmbeddedChat, { ...props })
3509
+ }
3510
+ ) }, `${apiUrl}|${deploymentDomain ?? ""}`);
3301
3511
  }
3302
3512
 
3303
3513
  export { AgentSteps, AnswerTable, ArbiChat, AskAgainContext, CompactLogin, ConnectedBranchControls, ConnectedCitationRenderer, ConnectedCompactConversation, ConnectedConversationDocumentPicker, ConnectedEmbeddedChat, ConnectedMessage, ConnectedMessageArea, ConnectedMessageList, ConnectedThreadsPreview, ConnectedUserEntity, ConversationComposer2 as ConversationComposer, EmbeddedChatPanel, MessageDetailsModal, MessageLiveSeconds, RunningSubagents, SourceChips, WorkflowStepMessage, backUpOnSignup, completeSsoSignIn, defaultHost, renderConnectedUser, resolveSsoName, ssoAccountStatus, useAuthPages, useLoginActions, useLoginForm, useOpenChunk, useOpenWorkspaceIcon, useRegisterSubmitState, useSlashItems, useSsoSignIn, useWorkspaceDocTitles };
3304
- //# sourceMappingURL=chunk-BELZ2WD2.js.map
3305
- //# sourceMappingURL=chunk-BELZ2WD2.js.map
3514
+ //# sourceMappingURL=chunk-N54OMO6J.js.map
3515
+ //# sourceMappingURL=chunk-N54OMO6J.js.map