@arbidocs/blocks 0.4.26 → 0.4.28
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.
- package/README.md +17 -0
- package/dist/agents/index.cjs +224 -212
- package/dist/agents/index.js +6 -6
- package/dist/agents/tasks/TaskRowMenu.d.ts +4 -1
- package/dist/agents/tasks/TaskRunsDialog.d.ts +3 -1
- package/dist/agents/tasks/taskRows.d.ts +2 -0
- package/dist/agents/workflows/WorkflowDocumentsField.d.ts +12 -0
- package/dist/agents/workflows/index.d.ts +2 -0
- package/dist/agents/workflows/workspaceScope.d.ts +18 -0
- package/dist/chat/ChatPage.d.ts +1 -1
- package/dist/chat/chat-page-types.d.ts +12 -1
- package/dist/chat/index.cjs +180 -180
- package/dist/chat/index.js +5 -5
- package/dist/{chunk-CPJBU5XQ.js → chunk-3NZR6PAG.js} +8 -120
- package/dist/chunk-3NZR6PAG.js.map +1 -0
- package/dist/chunk-4XJZ6AAY.js +407 -0
- package/dist/chunk-4XJZ6AAY.js.map +1 -0
- package/dist/{chunk-UOLMFC5K.js → chunk-6YVI74BC.js} +498 -108
- package/dist/chunk-6YVI74BC.js.map +1 -0
- package/dist/{chunk-5LUI4G5R.js → chunk-BV7FEMSI.js} +3 -3
- package/dist/{chunk-5LUI4G5R.js.map → chunk-BV7FEMSI.js.map} +1 -1
- package/dist/{chunk-ZEIOREJY.js → chunk-EHXSBH6U.js} +37 -6
- package/dist/chunk-EHXSBH6U.js.map +1 -0
- package/dist/chunk-EYPPB5CY.cjs +85 -0
- package/dist/chunk-EYPPB5CY.cjs.map +1 -0
- package/dist/{chunk-LZ4O2JPP.cjs → chunk-FRRDPYBR.cjs} +8 -123
- package/dist/chunk-FRRDPYBR.cjs.map +1 -0
- package/dist/chunk-KF4EC5XU.js +68 -0
- package/dist/chunk-KF4EC5XU.js.map +1 -0
- package/dist/{chunk-DHMAJ5LC.cjs → chunk-NSZAHL23.cjs} +158 -39
- package/dist/chunk-NSZAHL23.cjs.map +1 -0
- package/dist/{chunk-MLI6MCIE.js → chunk-QMUI2MGT.js} +155 -39
- package/dist/chunk-QMUI2MGT.js.map +1 -0
- package/dist/chunk-S5HZBXZA.cjs +430 -0
- package/dist/chunk-S5HZBXZA.cjs.map +1 -0
- package/dist/{chunk-JCVZKCXC.cjs → chunk-TLQQV7WW.cjs} +37 -6
- package/dist/chunk-TLQQV7WW.cjs.map +1 -0
- package/dist/{chunk-NNH7N62N.cjs → chunk-VMCOH3AY.cjs} +497 -105
- package/dist/chunk-VMCOH3AY.cjs.map +1 -0
- package/dist/{chunk-JLPYOPCX.js → chunk-WSJVHSGN.js} +225 -36
- package/dist/chunk-WSJVHSGN.js.map +1 -0
- package/dist/{chunk-TO4FAMQP.cjs → chunk-XKSFJYOD.cjs} +3 -3
- package/dist/{chunk-TO4FAMQP.cjs.map → chunk-XKSFJYOD.cjs.map} +1 -1
- package/dist/{chunk-J22DXUJY.cjs → chunk-ZHLMDJCO.cjs} +226 -34
- package/dist/chunk-ZHLMDJCO.cjs.map +1 -0
- package/dist/connect/docx.cjs +26 -8
- package/dist/connect/docx.cjs.map +1 -1
- package/dist/connect/docx.d.ts +1 -0
- package/dist/connect/docx.js +24 -7
- package/dist/connect/docx.js.map +1 -1
- package/dist/connect/index.cjs +281 -39
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +4 -0
- package/dist/connect/index.js +261 -23
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedAgentChatPanel.d.ts +7 -0
- package/dist/connection/ConnectedNativeDocxEditor.d.ts +2 -1
- package/dist/connection/ConnectedSkillUpload.d.ts +2 -0
- package/dist/connection/ConnectedStreamedWordArtifact.d.ts +4 -0
- package/dist/connection/ConnectedTaskAccessRequest.d.ts +4 -0
- package/dist/connection/ai.d.ts +4 -1
- package/dist/connection/useConnectedWorkNotifications.d.ts +21 -0
- package/dist/docx/DocxMentions.d.ts +9 -2
- package/dist/docx/NativeDocxEditor.d.ts +11 -3
- package/dist/docx/StreamedWordArtifact.d.ts +15 -0
- package/dist/docx/index.cjs +16 -8
- package/dist/docx/index.d.ts +3 -2
- package/dist/docx/index.js +2 -2
- package/dist/docx/streamWordDocument.d.ts +12 -0
- package/dist/facts/index.cjs +2 -2
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +5 -5
- package/dist/files/index.js +5 -5
- package/dist/home/index.cjs +1 -1
- package/dist/home/index.js +1 -1
- package/dist/index.cjs +953 -941
- package/dist/index.js +20 -20
- package/dist/settings/index.cjs +44 -234
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +8 -204
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/index.cjs +26 -26
- package/dist/shell/index.js +4 -4
- package/dist/studio/index.cjs +7 -6
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.js +5 -4
- package/dist/studio/index.js.map +1 -1
- package/dist/workspaces/index.cjs +1 -1
- package/dist/workspaces/index.js +1 -1
- package/package.json +3 -3
- package/src/docx/styles.css +13 -0
- package/dist/chunk-5TRALRWN.js +0 -42
- package/dist/chunk-5TRALRWN.js.map +0 -1
- package/dist/chunk-CPJBU5XQ.js.map +0 -1
- package/dist/chunk-CQCC7LE7.js +0 -210
- package/dist/chunk-CQCC7LE7.js.map +0 -1
- package/dist/chunk-DHMAJ5LC.cjs.map +0 -1
- package/dist/chunk-EUOGPUMJ.cjs +0 -59
- package/dist/chunk-EUOGPUMJ.cjs.map +0 -1
- package/dist/chunk-J22DXUJY.cjs.map +0 -1
- package/dist/chunk-JCVZKCXC.cjs.map +0 -1
- package/dist/chunk-JLPYOPCX.js.map +0 -1
- package/dist/chunk-LZ4O2JPP.cjs.map +0 -1
- package/dist/chunk-MLI6MCIE.js.map +0 -1
- package/dist/chunk-NNH7N62N.cjs.map +0 -1
- package/dist/chunk-RFIBUWLF.cjs +0 -232
- package/dist/chunk-RFIBUWLF.cjs.map +0 -1
- package/dist/chunk-UOLMFC5K.js.map +0 -1
- package/dist/chunk-ZEIOREJY.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docx/export.ts","../src/docx/mentions.ts","../src/docx/DocxMentions.tsx","../src/docx/NativeDocxEditor.tsx","../src/docx/fonts.ts"],"names":["document","React","jsxs","useState","useEffect","jsx","useRef"],"mappings":"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","file":"chunk-UOLMFC5K.js","sourcesContent":["import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\n\n/** Repair Word package declarations and duplicate fragment revision IDs on export. */\nexport function normalizeDocxExport(data: ArrayBuffer): ArrayBuffer {\n const files = unzipSync(new Uint8Array(data))\n const part = '[Content_Types].xml'\n const xml = new DOMParser().parseFromString(strFromU8(files[part]), 'application/xml')\n if (xml.getElementsByTagName('parsererror').length) throw new Error('Invalid DOCX content types.')\n const namespace = 'http://schemas.openxmlformats.org/package/2006/content-types'\n const types: Record<string, string> = {\n 'word/comments.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml',\n 'word/commentsExtended.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml',\n 'word/commentsIds.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml',\n 'word/commentsExtensible.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml',\n }\n let changed = false\n for (const [name, type] of Object.entries(types)) {\n if (!files[name]) continue\n let override = Array.from(xml.getElementsByTagNameNS(namespace, 'Override')).find(\n (node) => node.getAttribute('PartName') === '/' + name\n )\n if (!override) {\n override = xml.createElementNS(namespace, 'Override')\n override.setAttribute('PartName', '/' + name)\n xml.documentElement.appendChild(override)\n }\n if (override.getAttribute('ContentType') !== type) {\n override.setAttribute('ContentType', type)\n changed = true\n }\n }\n if (changed) files[part] = strToU8(new XMLSerializer().serializeToString(xml))\n const word = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n for (const name of Object.keys(files)) {\n if (!/^word\\/(document|header\\d*|footer\\d*|footnotes|endnotes|comments)\\.xml$/.test(name))\n continue\n const document = new DOMParser().parseFromString(strFromU8(files[name]), 'application/xml')\n if (document.getElementsByTagName('parsererror').length)\n throw new Error('Invalid Word document XML.')\n const elements = Array.from(document.getElementsByTagName('*'))\n const used = new Set(\n elements.map((element) => element.getAttributeNS(word, 'id')).filter(Boolean)\n )\n const seen = new Set<string>()\n let next = 1,\n repaired = false\n for (const element of elements) {\n if (\n element.namespaceURI !== word ||\n !['ins', 'del', 'moveFrom', 'moveTo'].includes(element.localName)\n )\n continue\n const id = element.getAttributeNS(word, 'id')\n if (!id) continue\n if (seen.has(id)) {\n while (used.has(String(next))) next++\n const unique = String(next++)\n const attribute = element.getAttributeNodeNS(word, 'id')!\n element.setAttributeNS(word, attribute.name, unique)\n used.add(unique)\n repaired = true\n } else seen.add(id)\n }\n if (repaired) {\n files[name] = strToU8(new XMLSerializer().serializeToString(document))\n changed = true\n }\n }\n if (!changed) return data\n return zipSync(files).slice().buffer as ArrayBuffer\n}\n","import { extractMentions, type MentionCandidate } from '../chat/mentions'\n\nexport interface DocxMention {\n id: string\n name: string\n kind: 'human' | 'agent'\n}\n\nexport function mentionCandidates(mentions: readonly DocxMention[]): MentionCandidate[] {\n return [\n { id: 'arbi', label: 'ARBI', kind: 'assistant' as const },\n ...mentions\n .filter((person) => person.name.trim())\n .map((person) => ({\n id: person.id,\n label: person.name,\n kind: person.kind === 'agent' ? ('assistant' as const) : ('user' as const),\n })),\n ]\n}\n\nexport function mentionedDocxRecipients(text: string, mentions: readonly DocxMention[]): string[] {\n return extractMentions(text, mentionCandidates(mentions)).map((person) => person.id)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { useReview } from '@docx-editor.dev/pro/react'\nimport { MentionMenu } from '../chat/MentionMenu'\nimport { filterMentionCandidates, findMentionQuery } from '../chat/mentions'\nimport { mentionCandidates, mentionedDocxRecipients, type DocxMention } from './mentions'\nexport type { DocxMention } from './mentions'\n\nexport interface DocxAgentCommentRequest {\n commentId: string\n instruction: string\n requestId: string\n recipientIds: string[]\n}\n\n/** Adds mentions to the upstream comment inputs without replacing its review layout. */\nexport function DocxMentions({\n children,\n mentions = [],\n initialCommentId,\n requestAgent,\n notify,\n}: {\n children: React.ReactNode\n mentions?: readonly DocxMention[]\n initialCommentId?: string\n requestAgent?: (request: DocxAgentCommentRequest) => Promise<void>\n notify?: (message: string, kind: 'success' | 'error') => void\n}) {\n const review = useReview()\n const activated = useRef<string | undefined>(undefined)\n useEffect(() => {\n if (!initialCommentId || activated.current === initialCommentId || !review.ready) return\n const target = review.items.find(\n (item) => item.kind === 'comment' && item.item.id === initialCommentId\n )\n if (!target) return\n review.setPaneOpen(true)\n if (review.setActive(target.key)) activated.current = initialCommentId\n }, [initialCommentId, review])\n const input = useRef<HTMLInputElement | null>(null)\n const replyTarget = useRef<{ field: HTMLInputElement; key: string } | null>(null)\n const pending = useRef<{\n ids: Set<string>\n text: string\n requestId: string\n recipientIds: string[]\n } | null>(null)\n const [suggestions, setSuggestions] = useState<{\n query: string\n from: number\n left: number\n top: number\n } | null>(null)\n const [selected, setSelected] = useState(0)\n const candidates = filterMentionCandidates(\n mentionCandidates(mentions),\n suggestions?.query || ''\n ).slice(0, 8)\n\n useEffect(() => {\n const submission = pending.current\n if (!submission || !requestAgent) return\n const created = review.items.find(\n (item) =>\n item.kind === 'comment' &&\n !submission.ids.has(item.item.id) &&\n item.text.trim() === submission.text\n )\n if (!created || created.kind !== 'comment') return\n pending.current = null\n const commentId = created.parentId || created.item.id\n void requestAgent({\n commentId,\n instruction: submission.text,\n requestId: submission.requestId,\n recipientIds: submission.recipientIds,\n }).catch((error: unknown) => {\n notify?.(\n error instanceof Error ? error.message : 'Could not start the document agent.',\n 'error'\n )\n })\n }, [review.items, requestAgent, notify])\n\n const choose = (name: string) => {\n const field = input.current\n if (!field || !suggestions) return\n const end = field.selectionStart ?? field.value.length\n const value = field.value.slice(0, suggestions.from) + '@' + name + ' ' + field.value.slice(end)\n // The native setter and input event preserve the upstream controlled input's state.\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(field, value)\n field.dispatchEvent(new Event('input', { bubbles: true }))\n field.focus()\n field.setSelectionRange(suggestions.from + name.length + 2, suggestions.from + name.length + 2)\n setSuggestions(null)\n }\n const captureSubmission = (target: EventTarget): boolean => {\n const form = (target as HTMLElement).closest('form')\n const field = form?.querySelector<HTMLInputElement>(\n '[data-testid=\"review-draft-input\"], [data-testid=\"review-reply-input\"]'\n )\n if (!field || field.readOnly || !requestAgent) return false\n const recipientIds = mentionedDocxRecipients(field.value, mentions)\n if (!recipientIds.length) return false\n pending.current = {\n ids: new Set(review.items.filter((i) => i.kind === 'comment').map((i) => i.item.id)),\n text: field.value.trim(),\n requestId: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,\n recipientIds,\n }\n // The engine may move its caret to an overlapping tracked revision while\n // an input selection changes. Bind a mentioned reply to the card where\n // composition started, rather than whichever range happens to be active.\n const pinned = replyTarget.current\n const thread = pinned\n ? review.items.find((item) => item.key === pinned.key && item.kind === 'comment')\n : undefined\n if (field.dataset.testid === 'review-reply-input' && pinned && !thread) {\n pending.current = null\n notify?.('This comment was removed. Open a current thread before replying.', 'error')\n return true\n }\n if (field.dataset.testid === 'review-reply-input' && thread) {\n if (!review.reply(thread, field.value.trim())) {\n pending.current = null\n notify?.('Could not post this reply. The comment may have been removed.', 'error')\n } else {\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(field, '')\n field.dispatchEvent(new Event('input', { bubbles: true }))\n replyTarget.current = null\n review.setActive(thread.key, { reveal: false })\n }\n return true\n }\n return false\n }\n return (\n <div\n className=\"native-docx-mentions\"\n onInputCapture={(event) => {\n const field = event.target\n if (!(field instanceof HTMLInputElement) || !field.dataset.testid?.startsWith('review-'))\n return\n if (!replyTarget.current && review.activeKey)\n replyTarget.current = { field, key: review.activeKey }\n input.current = field\n const before = field.value.slice(0, field.selectionStart ?? field.value.length)\n const match = findMentionQuery(before, before.length)\n if (!match) return setSuggestions(null)\n const rect = field.getBoundingClientRect()\n setSelected(0)\n setSuggestions({\n query: match.query,\n from: match.start,\n left: rect.left,\n top: rect.bottom,\n })\n }}\n onPointerDownCapture={(event) => {\n const target = event.target\n if (\n target instanceof HTMLElement &&\n target.closest('[data-testid=\"review-marker\"], [data-testid=\"review-reply-cancel\"]')\n )\n replyTarget.current = null\n }}\n onSubmitCapture={(event) => {\n if (captureSubmission(event.target)) {\n event.preventDefault()\n event.stopPropagation()\n }\n }}\n onKeyDownCapture={(event) => {\n if (suggestions && candidates.length) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n setSelected(\n (s) =>\n (s + (event.key === 'ArrowDown' ? 1 : candidates.length - 1)) % candidates.length\n )\n return\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault()\n event.stopPropagation()\n choose(candidates[selected]?.label || candidates[0].label)\n return\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n setSuggestions(null)\n return\n }\n }\n if (event.key === 'Enter' && captureSubmission(event.target)) {\n event.preventDefault()\n event.stopPropagation()\n }\n }}\n >\n {children}\n {suggestions && candidates.length > 0 && (\n <div\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event) => event.stopPropagation()}\n style={{\n position: 'fixed',\n left: suggestions.left,\n top: suggestions.top,\n width: 280,\n zIndex: 1000,\n }}\n >\n <MentionMenu\n open\n placement=\"below\"\n items={candidates}\n selectedIndex={selected}\n setSelectedIndex={setSelected}\n onSelect={(person) => choose(person.label)}\n labels={{ list: 'Mention workspace member' }}\n />\n </div>\n )}\n </div>\n )\n}\n","import { normalizeDocxExport } from './export'\nimport { DocxMentions, type DocxMention, type DocxAgentCommentRequest } from './DocxMentions'\nimport * as Y from 'yjs'\nimport type { DocumentHandle } from '@docx-editor.dev/core'\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { DocxEditor, useChromeTranslate, type FontConfiguration } from '@docx-editor.dev/react'\nimport { collaborationModule } from '@docx-editor.dev/pro'\nimport { DocxEditorReview, reviewModule } from '@docx-editor.dev/pro/react'\nimport {\n DOCUMENT_COLLABORATION_VERSIONS,\n type DocumentCollaborationSession,\n} from '@docx-editor.dev/pro/collaboration'\nimport {\n createHocuspocusCollaboration,\n type HocuspocusCollaborationRoom,\n} from '@docx-editor.dev/pro/collaboration/hocuspocus'\nimport type { EditorModule } from '@docx-editor.dev/core'\nimport type { Editor } from '@docx-editor.dev/core'\nimport { Download, Save, RefreshCw, WifiOff, Check, Type, Ellipsis } from 'lucide-react'\n\n/** Host integration: no application store, router, or authentication singleton is required. */\nexport interface NativeDocxAdapter {\n request: (path: string, options?: RequestInit) => Promise<Response>\n open: (documentId: string) => Promise<{\n room_id: string\n token: string\n websocket_path: string\n can_edit: boolean\n identity: { actorId: string; name: string; role: 'human' | 'agent' }\n filename: string\n }>\n save: (\n documentId: string,\n state?: string\n ) => Promise<{ document_ext_id: string; unchanged?: boolean }>\n loadFonts: () => Promise<FontConfiguration>\n baseUrl?: string\n author?: string\n subscribeTokenChanges?: (listener: () => void) => () => void\n onDirtyChange?: (dirty: boolean) => void\n onVersionSaved?: (documentId: string) => void | Promise<void>\n notify?: (message: string, kind: 'success' | 'error') => void\n mentions?: readonly DocxMention[]\n requestAgent?: (documentId: string, request: DocxAgentCommentRequest) => Promise<void>\n}\n\nexport interface NativeDocxEditorProps {\n adapter: NativeDocxAdapter\n documentId: string\n title: string\n draftContent?: string\n initialCommentId?: string\n /** Immutable history/compare snapshots must not join the live editing room. */\n snapshot?: boolean\n onSaved?: (id: string) => void\n}\ninterface Ready {\n document: DocumentHandle | Uint8Array\n modules: readonly EditorModule[]\n fonts: FontConfiguration\n room?: HocuspocusCollaborationRoom\n canEdit: boolean\n author: string\n filename: string\n}\n// Local unsaved notes survive tab switches. Persisted artifacts use server state.\nconst drafts = new Map<string, ArrayBuffer>()\nconst stateBytes = (room: HocuspocusCollaborationRoom) => Y.encodeStateAsUpdate(room.ydoc)\nconst encodeState = (room: HocuspocusCollaborationRoom) => {\n let binary = ''\n for (const byte of stateBytes(room)) binary += String.fromCharCode(byte)\n return btoa(binary)\n}\nfunction covered(room: HocuspocusCollaborationRoom, vector: string, receipt: string) {\n const decode = (value: string) => Uint8Array.from(atob(value), (c) => c.charCodeAt(0))\n const server = Y.decodeStateVector(decode(vector)),\n local = Y.decodeStateVector(Y.encodeStateVector(room.ydoc))\n for (const [client, clock] of local) if ((server.get(client) || 0) < clock) return false\n const deleted = Y.decodeUpdate(stateBytes(room)).ds.clients\n const saved = Y.decodeUpdate(decode(receipt)).ds.clients\n for (const [client, ranges] of deleted)\n for (const range of ranges) {\n if (\n !(saved.get(client) || []).some(\n (s) => s.clock <= range.clock && s.clock + s.len >= range.clock + range.len\n )\n )\n return false\n }\n return true\n}\nclass EditorBoundary extends React.Component<{ children: React.ReactNode }, { error?: Error }> {\n state: { error?: Error } = {}\n static getDerivedStateFromError(error: Error) {\n return { error }\n }\n render() {\n return this.state.error ? (\n <div role=\"alert\" className=\"native-docx-error\">\n Could not render this Word document: {this.state.error.message}\n </div>\n ) : (\n this.props.children\n )\n }\n}\nexport function DocxParticipants({ session }: { session?: DocumentCollaborationSession }) {\n const [people, setPeople] = useState<readonly { actorId: string; name: string }[]>([])\n useEffect(() => {\n if (!session) return\n setPeople(session.participants())\n return session.subscribeParticipants(setPeople)\n }, [session])\n return (\n <div className=\"native-docx-presence\" aria-label=\"People viewing this document\">\n {people.map((p) => (\n <span className=\"native-docx-avatar\" key={p.actorId} title={p.name}>\n {p.name\n .split(' ')\n .map((s) => s[0])\n .slice(0, 2)\n .join('')}\n </span>\n ))}\n </div>\n )\n}\nfunction RibbonMenu({\n label,\n icon,\n children,\n}: {\n label: string\n icon: React.ReactNode\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(false)\n const element = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!open) return\n const dismiss = (event: PointerEvent) => {\n if (!element.current?.contains(event.target as Node)) setOpen(false)\n }\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('pointerdown', dismiss)\n document.addEventListener('keydown', escape)\n return () => {\n document.removeEventListener('pointerdown', dismiss)\n document.removeEventListener('keydown', escape)\n }\n }, [open])\n return (\n <div className=\"native-docx-ribbon-menu\" ref={element}>\n <button\n type=\"button\"\n className=\"native-docx-ribbon-trigger\"\n aria-label={label}\n title={label}\n aria-expanded={open}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setOpen((value) => !value)}\n >\n {icon}\n </button>\n {open && (\n <div\n className=\"native-docx-ribbon-popover\"\n role=\"group\"\n aria-label={label}\n onMouseDown={(event) => {\n if (!(\n event.target instanceof HTMLInputElement || event.target instanceof HTMLSelectElement\n ))\n event.preventDefault()\n }}\n >\n {children}\n </div>\n )}\n </div>\n )\n}\n\nexport function DocxRibbon({ onSave }: { onSave: () => void }) {\n const [tab, setTab] = useState('Home')\n const t = useChromeTranslate()\n return (\n <div className=\"native-docx-ribbon\">\n <select aria-label=\"Ribbon tab\" value={tab} onChange={(event) => setTab(event.target.value)}>\n <option>Home</option>\n <option>Insert</option>\n <option>Review</option>\n </select>\n <DocxEditor.Toolbar t={t} preset={false} onSave={onSave}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n {tab === 'Home' && (\n <>\n <DocxEditor.Toolbar.Bold />\n <DocxEditor.Toolbar.Italic />\n <DocxEditor.Toolbar.Underline />\n <RibbonMenu label=\"Font\" icon={<Type size={16} />}>\n <DocxEditor.Toolbar.FontFamily />\n <DocxEditor.Toolbar.FontSize />\n <DocxEditor.Toolbar.FontColor />\n <DocxEditor.Toolbar.Highlight />\n </RibbonMenu>\n <RibbonMenu label=\"More formatting\" icon={<Ellipsis size={16} />}>\n <DocxEditor.Toolbar.StylePicker />\n <DocxEditor.Toolbar.Alignment />\n <DocxEditor.Toolbar.BulletList />\n <DocxEditor.Toolbar.NumberedList />\n <DocxEditor.Toolbar.LineSpacing />\n <DocxEditor.Toolbar.Indent />\n <DocxEditor.Toolbar.Outdent />\n <DocxEditor.Toolbar.Strike />\n <DocxEditor.Toolbar.ClearFormatting />\n </RibbonMenu>\n </>\n )}\n {tab === 'Insert' && (\n <>\n <DocxEditor.Toolbar.TableInsert />\n <DocxEditor.Toolbar.ImageInsert />\n <DocxEditor.Toolbar.Link />\n </>\n )}\n {tab === 'Review' && (\n <>\n <DocxEditor.Toolbar.EditingMode />\n <DocxEditor.Toolbar.Comments />\n <RibbonMenu label=\"Review options\" icon={<Ellipsis size={16} />}>\n <DocxEditor.Toolbar.Reviewers />\n </RibbonMenu>\n </>\n )}\n </DocxEditor.Toolbar>\n </div>\n )\n}\n\nconst fixedZoomMode = { type: 'fixed' } as const\n\nexport function NativeDocxEditor({\n documentId,\n title,\n draftContent,\n initialCommentId,\n snapshot = false,\n onSaved,\n adapter,\n}: NativeDocxEditorProps) {\n const [ready, setReady] = useState<Ready>(),\n [error, setError] = useState(''),\n [retry, setRetry] = useState(0)\n const [status, setStatus] = useState('Connecting…'),\n [dirty, setDirty] = useState(false),\n [saving, setSaving] = useState(false),\n [offline, setOffline] = useState(false)\n const revision = useRef(0)\n const stageRef = useRef<HTMLDivElement>(null),\n fitCleanup = useRef<(() => void) | undefined>(undefined)\n const ref = useRef<Editor | null>(null),\n dirtyRef = useRef(false),\n draftTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const isDraft = draftContent !== undefined\n useEffect(() => {\n let cancelled = false\n let room: HocuspocusCollaborationRoom | undefined\n const cleanups: (() => void)[] = []\n setReady(undefined)\n setError('')\n setStatus('Connecting…')\n setDirty(false)\n dirtyRef.current = false\n async function start() {\n const fonts = await adapter.loadFonts()\n if (isDraft || snapshot) {\n const data = isDraft\n ? drafts.get(documentId) ||\n (await (\n await adapter.request('/prepare', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ content: draftContent }),\n })\n ).arrayBuffer())\n : await (await adapter.request(`/${documentId}/content`)).arrayBuffer()\n if (!cancelled) {\n setReady({\n document: new Uint8Array(data),\n fonts,\n modules: [reviewModule()],\n canEdit: !snapshot,\n author: adapter.author || 'You',\n filename: title,\n })\n setStatus(snapshot ? 'Saved version · read only' : 'Unsaved note')\n }\n return\n }\n const session = await adapter.open(documentId)\n const ws = new URL(session.websocket_path, adapter.baseUrl || location.origin)\n ws.protocol = ws.protocol === 'https:' ? 'wss:' : 'ws:'\n let initial = true\n room = await createHocuspocusCollaboration({\n url: ws.toString(),\n roomId: session.room_id,\n identity: session.identity,\n bootstrap: { kind: 'join' },\n offlineEditing: true,\n token: async () => {\n const next = initial ? session : await adapter.open(documentId)\n initial = false\n if (!cancelled)\n setReady((previous) => (previous ? { ...previous, canEdit: next.can_edit } : previous))\n return JSON.stringify({\n capability: next.token,\n versions: DOCUMENT_COLLABORATION_VERSIONS,\n })\n },\n })\n if (cancelled) {\n room.destroy()\n return\n }\n const current = room\n cleanups.push(\n current.session.subscribeStatus((s, _reason, detail) => {\n const disconnected = s === 'disconnected'\n setOffline(disconnected)\n if (s === 'error') {\n setError(\n detail ||\n 'The collaboration session failed. Export your local document before reconnecting.'\n )\n setStatus('Connection failed')\n } else if (disconnected) setStatus('Offline · edits buffered locally')\n else if (s === 'ready') {\n setError('')\n setStatus(dirtyRef.current ? 'Saving changes…' : 'Connected')\n }\n })\n )\n const stateless = ({ payload }: { payload: string }) => {\n try {\n const message = JSON.parse(payload) as {\n type: string\n message?: string\n hash?: string\n vector?: string\n receipt?: string\n }\n if (message.type === 'persisted') {\n if (\n !cancelled &&\n message.vector &&\n message.receipt &&\n covered(current, message.vector, message.receipt)\n ) {\n dirtyRef.current = false\n setDirty(false)\n setStatus('All changes saved')\n }\n }\n if (message.type === 'pending') setStatus('Saving changes…')\n if (message.type === 'save-error') setStatus(message.message || 'Autosave failed')\n } catch {\n /* Ignore unrelated provider messages. */\n }\n }\n current.provider.on('stateless', stateless)\n cleanups.push(() => current.provider.off('stateless', stateless))\n if (adapter.subscribeTokenChanges)\n cleanups.push(\n adapter.subscribeTokenChanges(() => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n })\n )\n const refresh = setInterval(\n () => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n },\n 5 * 60 * 1000\n )\n cleanups.push(() => clearInterval(refresh))\n setReady({\n document: current.document,\n fonts,\n modules: [reviewModule(), collaborationModule({ session: current.session })],\n room: current,\n canEdit: session.can_edit,\n author: session.identity.name,\n filename: session.filename,\n })\n setStatus(session.can_edit ? 'All changes saved' : 'Read only · live')\n }\n void start().catch((e) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e))\n })\n return () => {\n cancelled = true\n cleanups.forEach((f) => f())\n clearTimeout(draftTimer.current)\n fitCleanup.current?.()\n room?.destroy()\n }\n }, [documentId, isDraft, snapshot, retry]) // draftContent seeds once, never remount on typing.\n useEffect(() => {\n adapter.onDirtyChange?.(dirty)\n const beforeUnload = (e: BeforeUnloadEvent) => {\n if (dirtyRef.current) e.preventDefault()\n }\n window.addEventListener('beforeunload', beforeUnload)\n return () => {\n window.removeEventListener('beforeunload', beforeUnload)\n adapter.onDirtyChange?.(false)\n }\n }, [dirty])\n async function exportDocument() {\n const data = await ref.current?.save()\n if (!data) return\n const url = URL.createObjectURL(\n new Blob([normalizeDocxExport(data)], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n })\n )\n const a = document.createElement('a')\n a.href = url\n a.download = title.replace(/\\.[^.]+$/, '') + '.docx'\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 5000)\n }\n useLayoutEffect(() => {\n const editor = ref.current\n return () => {\n if (isDraft && editor && dirtyRef.current)\n void editor\n .save()\n .then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n .catch(() => {})\n }\n }, [documentId, isDraft, ready])\n async function saveVersion() {\n if (!ready || saving) return\n setSaving(true)\n const atRevision = revision.current\n try {\n const result = isDraft\n ? await (async () => {\n const bytes = await ref.current?.save()\n if (!bytes) throw new Error('The editor is not ready.')\n return (\n await adapter.request(`/notes?${new URLSearchParams({ title })}`, {\n method: 'POST',\n headers: {\n 'Content-Type':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n },\n body: bytes,\n })\n ).json() as Promise<{ document_ext_id: string }>\n })()\n : await adapter.save(documentId, ready.room ? encodeState(ready.room) : undefined)\n if (revision.current === atRevision) {\n dirtyRef.current = false\n setDirty(false)\n drafts.delete(documentId)\n }\n await Promise.resolve(adapter.onVersionSaved?.(result.document_ext_id)).catch(() => {\n /* The saved document remains accessible by its ID. */\n })\n onSaved?.(result.document_ext_id)\n adapter.notify?.(isDraft ? 'Word note saved' : 'DOCX version saved', 'success')\n } catch (e) {\n adapter.notify?.(e instanceof Error ? e.message : 'Could not save this document.', 'error')\n setStatus('Save failed · your draft is retained')\n } finally {\n setSaving(false)\n }\n }\n function editorReady(editor: Editor) {\n ref.current = editor\n fitCleanup.current?.()\n const viewport = stageRef.current?.querySelector<HTMLElement>('.native-docx-viewport')\n if (!viewport) return\n const fit = () => {\n const pageWidth = editor.getPageGeometry()[0]?.box.width\n if (!pageWidth) return\n const style = getComputedStyle(viewport)\n const available =\n viewport.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight)\n const zoom = Math.max(0.1, Math.min(2.5, available / pageWidth))\n if (Math.abs(editor.getZoom() - zoom) > 0.001) editor.setZoom(zoom)\n }\n const resize = new ResizeObserver(fit)\n const chrome = new MutationObserver(fit)\n resize.observe(viewport)\n chrome.observe(viewport, { attributes: true, attributeFilter: ['style', 'data-review-pane'] })\n fit()\n fitCleanup.current = () => {\n resize.disconnect()\n chrome.disconnect()\n }\n }\n function changed() {\n if (snapshot) return\n revision.current += 1\n dirtyRef.current = true\n setDirty(true)\n setStatus(\n isDraft ? 'Unsaved note' : offline ? 'Offline · edits buffered locally' : 'Saving changes…'\n )\n if (isDraft) {\n clearTimeout(draftTimer.current)\n draftTimer.current = setTimeout(() => {\n void ref.current?.save().then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n }, 200)\n }\n }\n return (\n <section className=\"native-docx-viewer\" data-testid=\"native-docx-editor\">\n <div className=\"native-docx-actions\">\n <span className=\"native-docx-status\" role=\"status\">\n {offline ? <WifiOff size={14} /> : !dirty && ready ? <Check size={14} /> : null}\n {status}\n </span>\n <DocxParticipants session={ready?.room?.session} />\n <button onClick={() => void exportDocument()} disabled={!ready} aria-label=\"Download DOCX\">\n <Download size={14} />\n DOCX\n </button>\n {!snapshot && ready?.canEdit && (\n <button\n className=\"native-docx-save\"\n onClick={() => void saveVersion()}\n disabled={!ready || saving || offline}\n data-testid=\"native-docx-save\"\n >\n <Save size={14} />\n {saving ? 'Saving…' : isDraft ? 'Save note' : 'Save version'}\n </button>\n )}\n </div>\n {offline && (\n <div className=\"native-docx-notice\">\n Changes are buffered in this browser. Keep this tab open until the connection returns, or\n download your DOCX.\n </div>\n )}\n {error && (\n <div className=\"native-docx-notice\" data-error=\"true\" role=\"alert\">\n {error}{' '}\n <button\n disabled={dirty}\n title={dirty ? 'Download your unsaved DOCX before reopening the editor' : undefined}\n onClick={() => setRetry((x) => x + 1)}\n >\n <RefreshCw size={12} />\n Retry\n </button>\n </div>\n )}\n {!ready && !error && (\n <div className=\"native-docx-error\" role=\"status\">\n Opening Word document…\n </div>\n )}\n {ready && (\n <div className=\"native-docx-body docx-editor\">\n <EditorBoundary key={retry}>\n <DocxEditor.Root\n document={ready.document}\n modules={ready.modules}\n fonts={ready.fonts}\n mode={!ready.canEdit || snapshot ? 'view' : 'suggesting'}\n reviewDisplayMode=\"all-markup\"\n zoomMode={fixedZoomMode}\n author={ready.author}\n onReady={editorReady}\n onChange={(change) => {\n if (change.source !== 'load') changed()\n }}\n onFontError={(e) => setError(e.message)}\n >\n <DocxEditor.RevisionMarkup\n insertions={{ mark: 'underline', color: 'blue' }}\n deletions={{ mark: 'strikethrough', color: 'red' }}\n movedFrom={{ mark: 'doubleStrikethrough', color: 'green' }}\n movedTo={{ mark: 'doubleUnderline', color: 'green' }}\n trackMoves\n />\n <DocxRibbon onSave={() => void saveVersion()} />\n <div\n className=\"native-docx-stage\"\n ref={stageRef}\n onMouseDownCapture={(event) => {\n if (event.button === 2 && ref.current?.getSelectionPlacement())\n event.preventDefault()\n }}\n >\n <DocxEditor.Viewport className=\"native-docx-viewport\">\n <DocxEditor.Content />\n <DocxMentions\n initialCommentId={initialCommentId}\n mentions={adapter.mentions}\n notify={adapter.notify}\n requestAgent={\n adapter.requestAgent\n ? (request) => adapter.requestAgent!(documentId, request)\n : undefined\n }\n >\n <DocxEditorReview />\n </DocxMentions>\n <DocxEditor.HeaderFooterChrome />\n <DocxEditor.NotesChrome />\n <DocxEditor.Equation />\n <DocxEditor.HyperLink />\n <DocxEditor.ContextMenu />\n </DocxEditor.Viewport>\n <DocxEditor.PageNumber />\n </div>\n </DocxEditor.Root>\n </EditorBoundary>\n </div>\n )}\n </section>\n )\n}\n","import { createFontSource, type FontConfiguration } from '@docx-editor.dev/react'\nconst loaded = new Map<string, Promise<FontConfiguration>>()\nexport function loadDocxFonts(baseUrl = '/native-docx/fonts'): Promise<FontConfiguration> {\n let promise = loaded.get(baseUrl)\n if (!promise) {\n promise = loadFonts(baseUrl).catch((error) => {\n loaded.delete(baseUrl)\n throw error\n })\n loaded.set(baseUrl, promise)\n }\n return promise\n}\nasync function loadFonts(baseUrl: string): Promise<FontConfiguration> {\n const families = ['Liberation Serif', 'Liberation Sans', 'Liberation Mono']\n const variants = [\n { suffix: 'Regular', weight: 400, style: 'normal' },\n { suffix: 'Bold', weight: 700, style: 'normal' },\n { suffix: 'Italic', weight: 400, style: 'italic' },\n { suffix: 'BoldItalic', weight: 700, style: 'italic' },\n ] as const\n const sources = await Promise.all(\n families.flatMap((family) =>\n variants.map(async (face) => {\n const r = await fetch(\n `${baseUrl.replace(/\\/$/, '')}/${family.replace(' ', '')}-${face.suffix}.ttf`\n )\n if (!r.ok) throw new Error(`Could not load the document font ${family}.`)\n const result = createFontSource(new Uint8Array(await r.arrayBuffer()), {\n family,\n weight: face.weight,\n style: face.style,\n })\n if ('failure' in result)\n throw new Error(`Could not initialize the document font ${family}.`)\n return result.source\n })\n )\n )\n const aliases: Record<string, string> = {\n 'Times New Roman': 'Liberation Serif',\n Cambria: 'Liberation Serif',\n 'DejaVu Serif': 'Liberation Serif',\n Calibri: 'Liberation Sans',\n Aptos: 'Liberation Sans',\n Arial: 'Liberation Sans',\n Helvetica: 'Liberation Sans',\n 'Courier New': 'Liberation Mono',\n 'DejaVu Sans Mono': 'Liberation Mono',\n }\n return {\n epoch: 1,\n maxFontBytes: 12 * 1024 * 1024,\n sources,\n defaultFont: { family: 'Liberation Serif', sizeHalfPoints: 22 },\n supportedFamilies: [...families, ...Object.keys(aliases)],\n substitutions: Object.entries(aliases).flatMap(([from, to]) =>\n variants.map((face) => ({\n from: { family: from, weight: face.weight, style: face.style },\n to: { family: to, weight: face.weight, style: face.style },\n }))\n ),\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/ConnectionProvider.tsx"],"names":[],"mappings":"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","file":"chunk-ZEIOREJY.js","sourcesContent":["/**\n * The demo/live connection layer for a host app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo workspace. Host-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link ArbiConnectionConfig}.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { useArbi, type LoginProfile } from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo workspace. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend AND per signed-in user, so a returning\n * user lands back in the workspace they last chose, while the next person on a shared browser\n * never starts from someone else's workspace id. Namespaced by apiUrl so distinct deployments\n * (and the demo workspace) don't clobber each other. Cleared on logout.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst normalizeUserKey = (email: string) => email.trim().toLowerCase()\n\n/** Exported for tests. */\nexport const workspaceStorageKey = (apiUrl: string, userKey: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}:${normalizeUserKey(userKey)}`\n\n/** The pre-isolation key (apiUrl only). Never read: removed so it cannot leak across users. */\nconst legacyWorkspaceStorageKey = (apiUrl: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string, userKey: string | null): string | null {\n if (!userKey) return null\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl, userKey))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, userKey: string | null, id: string | null): void {\n if (!userKey) return\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl, userKey), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl, userKey))\n window.localStorage.removeItem(legacyWorkspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\n\n/** Shown on the sign-in screen after the session could not be recovered. */\nexport const SESSION_EXPIRED_MESSAGE = 'Your session expired. Sign in again.'\n\n/** The connection user for a profile: its full name, falling back to the email local part. */\nfunction userFromProfile(profile: LoginProfile, externalId?: string): ArbiUser {\n const fullName = [profile.givenName, profile.familyName]\n .map((part) => part?.trim())\n .filter(Boolean)\n .join(' ')\n return {\n name: fullName || profile.email.split('@')[0],\n email: profile.email,\n externalId,\n picture: profile.picture,\n }\n}\n\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>('disconnected')\n const [user, setUser] = useState<ArbiUser | null>(null)\n const [workspaceId, setWorkspaceId] = useState<string | null>(null)\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n // Who the persisted workspace belongs to; set at sign-in, cleared at logout.\n const storageUserRef = useRef<string | null>(null)\n\n // The SDK could not recover the session (token refused, workspace not re-openable): drop to\n // 'disconnected' with a plain message, so the host's gate sends the user to sign in instead of\n // every call failing with a raw backend error. The remembered workspace is kept for next login.\n useEffect(\n () =>\n arbi.onSessionExpired?.(() => {\n storageUserRef.current = null\n setUser(null)\n setWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi]\n )\n\n // A saved name, picture or email reaches every surface reading `useConnection().user`.\n useEffect(\n () =>\n arbi.user.onProfileChange?.((profile) =>\n setUser((current) => (current ? userFromProfile(profile, current.externalId) : current))\n ),\n [arbi]\n )\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n setWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n // No backend configured → run the seeded demo workspace.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n await arbi.login(email, password)\n storageUserRef.current = normalizeUserKey(email)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the workspace the user last affirmatively selected (persisted),\n // then the configured workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl, storageUserRef.current)\n const preferred = persisted ?? config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n setWorkspaceId(target.external_id)\n persistWorkspace(config.apiUrl, storageUserRef.current, target.external_id)\n }\n // The profile (name + avatar) comes with the login response. A session restored without\n // a login has none, so fall back to finding ourselves in the workspace roster; the email\n // local part is only the last resort, never the answer when a profile name exists.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n const me = arbi.user.identity()\n const profile = arbi.user.profile?.()\n if (profile) {\n resolved = userFromProfile(profile, me?.externalId)\n } else {\n try {\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n }\n setUser(resolved)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId, config.apiUrl]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n setWorkspaceId(id)\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n const id =\n workspaceId ??\n readPersistedWorkspace(config.apiUrl, storageUserRef.current) ??\n config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n return <ConnectionContext.Provider value={value}>{children}</ConnectionContext.Provider>\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n"]}
|