@arbidocs/blocks 0.4.168 → 0.5.0

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 (112) hide show
  1. package/dist/{ConnectedCallDock-ESH665DH.cjs → ConnectedCallDock-BNKBAKIT.cjs} +4 -3
  2. package/dist/{ConnectedCallDock-J5JU3KKO.js.map → ConnectedCallDock-BNKBAKIT.cjs.map} +1 -1
  3. package/dist/{ConnectedCallDock-J5JU3KKO.js → ConnectedCallDock-MBAAUETC.js} +4 -3
  4. package/dist/ConnectedCallDock-MBAAUETC.js.map +1 -0
  5. package/dist/{ConnectedCallRoom-AFMVICHG.cjs → ConnectedCallRoom-QRWD2SDG.cjs} +4 -3
  6. package/dist/{ConnectedCallRoom-AFMVICHG.cjs.map → ConnectedCallRoom-QRWD2SDG.cjs.map} +1 -1
  7. package/dist/{ConnectedCallRoom-XBEO7VXT.js → ConnectedCallRoom-XJUXVNMB.js} +4 -3
  8. package/dist/{ConnectedCallRoom-XBEO7VXT.js.map → ConnectedCallRoom-XJUXVNMB.js.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-TFAA5Z6J.cjs → ConnectedNativeDocxComparison-A7PMTYD7.cjs} +7 -7
  10. package/dist/{ConnectedNativeDocxComparison-TFAA5Z6J.cjs.map → ConnectedNativeDocxComparison-A7PMTYD7.cjs.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-DJBFRFCK.js → ConnectedNativeDocxComparison-CWEW7GV3.js} +6 -6
  12. package/dist/{ConnectedNativeDocxComparison-DJBFRFCK.js.map → ConnectedNativeDocxComparison-CWEW7GV3.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-2MSUQTE2.js → ConnectedNativeDocxEditor-6EBF7U4E.js} +5 -5
  14. package/dist/{ConnectedNativeDocxEditor-2MSUQTE2.js.map → ConnectedNativeDocxEditor-6EBF7U4E.js.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-AFECVTCH.cjs → ConnectedNativeDocxEditor-IWXEOAIF.cjs} +7 -7
  16. package/dist/{ConnectedNativeDocxEditor-AFECVTCH.cjs.map → ConnectedNativeDocxEditor-IWXEOAIF.cjs.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-3OUYXRP2.js → ConnectedStreamedWordArtifact-27ISQYHI.js} +6 -6
  18. package/dist/ConnectedStreamedWordArtifact-27ISQYHI.js.map +1 -0
  19. package/dist/{ConnectedStreamedWordArtifact-IEGLOEEZ.cjs → ConnectedStreamedWordArtifact-WRGCCU5H.cjs} +7 -7
  20. package/dist/ConnectedStreamedWordArtifact-WRGCCU5H.cjs.map +1 -0
  21. package/dist/{WorkspaceTableView-GYIHAEIB.js → WorkspaceTableView-3TIMUU2J.js} +5 -5
  22. package/dist/{WorkspaceTableView-GYIHAEIB.js.map → WorkspaceTableView-3TIMUU2J.js.map} +1 -1
  23. package/dist/{WorkspaceTableView-733WL4DA.cjs → WorkspaceTableView-FROHEPCT.cjs} +7 -7
  24. package/dist/{WorkspaceTableView-733WL4DA.cjs.map → WorkspaceTableView-FROHEPCT.cjs.map} +1 -1
  25. package/dist/calls/index.cjs +35 -35
  26. package/dist/calls/index.js +6 -6
  27. package/dist/chat/index.cjs +76 -75
  28. package/dist/chat/index.js +2 -1
  29. package/dist/chat/thread-diagram.d.ts +3 -1
  30. package/dist/chunk-26EQQQBX.js +356 -0
  31. package/dist/chunk-26EQQQBX.js.map +1 -0
  32. package/dist/{chunk-CVJ2ZMA4.cjs → chunk-2BNWISLH.cjs} +4 -4
  33. package/dist/{chunk-CVJ2ZMA4.cjs.map → chunk-2BNWISLH.cjs.map} +1 -1
  34. package/dist/{chunk-U6B6LPIG.cjs → chunk-32W6STZ2.cjs} +5 -5
  35. package/dist/{chunk-U6B6LPIG.cjs.map → chunk-32W6STZ2.cjs.map} +1 -1
  36. package/dist/{chunk-SJVIBMVQ.js → chunk-34LBKTII.js} +4 -4
  37. package/dist/{chunk-SJVIBMVQ.js.map → chunk-34LBKTII.js.map} +1 -1
  38. package/dist/{chunk-E4AOCI46.cjs → chunk-3BJIS4GV.cjs} +7 -7
  39. package/dist/{chunk-E4AOCI46.cjs.map → chunk-3BJIS4GV.cjs.map} +1 -1
  40. package/dist/{chunk-ZWNUK3A2.cjs → chunk-3XA7EDPS.cjs} +7 -7
  41. package/dist/{chunk-ZWNUK3A2.cjs.map → chunk-3XA7EDPS.cjs.map} +1 -1
  42. package/dist/{chunk-O7FVBTBT.js → chunk-4MQKXHMC.js} +3 -3
  43. package/dist/{chunk-O7FVBTBT.js.map → chunk-4MQKXHMC.js.map} +1 -1
  44. package/dist/{chunk-HAYIPKKI.cjs → chunk-5DXTO7CE.cjs} +6 -6
  45. package/dist/{chunk-HAYIPKKI.cjs.map → chunk-5DXTO7CE.cjs.map} +1 -1
  46. package/dist/{chunk-7JIMJEB5.cjs → chunk-DAEDRTIN.cjs} +3 -3
  47. package/dist/{chunk-7JIMJEB5.cjs.map → chunk-DAEDRTIN.cjs.map} +1 -1
  48. package/dist/{chunk-FTLNYE2X.cjs → chunk-F66OH26L.cjs} +4 -96
  49. package/dist/chunk-F66OH26L.cjs.map +1 -0
  50. package/dist/chunk-KJXJRX33.js +94 -0
  51. package/dist/chunk-KJXJRX33.js.map +1 -0
  52. package/dist/chunk-LDRHUYRE.cjs +376 -0
  53. package/dist/chunk-LDRHUYRE.cjs.map +1 -0
  54. package/dist/{chunk-2TEST7FZ.cjs → chunk-LMXMUWPA.cjs} +8 -11
  55. package/dist/chunk-LMXMUWPA.cjs.map +1 -0
  56. package/dist/{chunk-DRIMPELS.cjs → chunk-MDFXGRLY.cjs} +15 -15
  57. package/dist/{chunk-DRIMPELS.cjs.map → chunk-MDFXGRLY.cjs.map} +1 -1
  58. package/dist/{chunk-UF2GRQQF.js → chunk-NHY4AKA4.js} +3 -3
  59. package/dist/{chunk-UF2GRQQF.js.map → chunk-NHY4AKA4.js.map} +1 -1
  60. package/dist/{chunk-U6QJB3G4.js → chunk-OD3UJ7XR.js} +3 -3
  61. package/dist/{chunk-U6QJB3G4.js.map → chunk-OD3UJ7XR.js.map} +1 -1
  62. package/dist/chunk-OK3UJMO4.cjs +98 -0
  63. package/dist/chunk-OK3UJMO4.cjs.map +1 -0
  64. package/dist/{chunk-ZBTJWS3M.cjs → chunk-RMLU363Q.cjs} +4 -4
  65. package/dist/{chunk-ZBTJWS3M.cjs.map → chunk-RMLU363Q.cjs.map} +1 -1
  66. package/dist/{chunk-GA77ONJJ.js → chunk-TXPOODAY.js} +8 -11
  67. package/dist/chunk-TXPOODAY.js.map +1 -0
  68. package/dist/{chunk-XUUKUIKH.js → chunk-ULQV2NJT.js} +5 -94
  69. package/dist/chunk-ULQV2NJT.js.map +1 -0
  70. package/dist/{chunk-ADL5A6FR.js → chunk-VMXLNBHF.js} +3 -3
  71. package/dist/{chunk-ADL5A6FR.js.map → chunk-VMXLNBHF.js.map} +1 -1
  72. package/dist/{chunk-D7MDBDN7.js → chunk-XKTYKZWV.js} +3 -3
  73. package/dist/{chunk-D7MDBDN7.js.map → chunk-XKTYKZWV.js.map} +1 -1
  74. package/dist/{chunk-ZHQBNOZQ.js → chunk-YSNQWUQQ.js} +4 -4
  75. package/dist/{chunk-ZHQBNOZQ.js.map → chunk-YSNQWUQQ.js.map} +1 -1
  76. package/dist/{chunk-CDP7S6RA.js → chunk-ZC5MJIRC.js} +3 -3
  77. package/dist/{chunk-CDP7S6RA.js.map → chunk-ZC5MJIRC.js.map} +1 -1
  78. package/dist/connect/docx.cjs +9 -9
  79. package/dist/connect/docx.js +5 -5
  80. package/dist/connect/index.cjs +1918 -2135
  81. package/dist/connect/index.cjs.map +1 -1
  82. package/dist/connect/index.js +46 -289
  83. package/dist/connect/index.js.map +1 -1
  84. package/dist/connect/viewer.cjs +30 -28
  85. package/dist/connect/viewer.cjs.map +1 -1
  86. package/dist/connect/viewer.js +14 -12
  87. package/dist/connect/viewer.js.map +1 -1
  88. package/dist/connection/ConnectionProvider.d.ts +4 -1
  89. package/dist/connection/viewer/parsed/ParsedPassage.d.ts +2 -1
  90. package/dist/index.cjs +219 -218
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.js +5 -4
  93. package/dist/index.js.map +1 -1
  94. package/dist/settings/index.cjs +155 -155
  95. package/dist/settings/index.js +2 -2
  96. package/dist/studio/index.cjs +4 -4
  97. package/dist/studio/index.js +2 -2
  98. package/dist/workflow-canvas/index.cjs +6 -6
  99. package/dist/workflow-canvas/index.js +2 -2
  100. package/node_modules/@arbidocs/coedit/package.json +1 -1
  101. package/package.json +5 -5
  102. package/dist/ConnectedCallDock-ESH665DH.cjs.map +0 -1
  103. package/dist/ConnectedStreamedWordArtifact-3OUYXRP2.js.map +0 -1
  104. package/dist/ConnectedStreamedWordArtifact-IEGLOEEZ.cjs.map +0 -1
  105. package/dist/chunk-2TEST7FZ.cjs.map +0 -1
  106. package/dist/chunk-3PEUP4CH.cjs +0 -109
  107. package/dist/chunk-3PEUP4CH.cjs.map +0 -1
  108. package/dist/chunk-FTLNYE2X.cjs.map +0 -1
  109. package/dist/chunk-GA77ONJJ.js.map +0 -1
  110. package/dist/chunk-LLEI5I5C.js +0 -102
  111. package/dist/chunk-LLEI5I5C.js.map +0 -1
  112. package/dist/chunk-XUUKUIKH.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useConnectedNativeDocxAdapter } from './chunk-SJVIBMVQ.js';
2
+ import { useConnectedNativeDocxAdapter } from './chunk-34LBKTII.js';
3
3
  import { StreamedWordArtifact } from './chunk-7WY6OAIS.js';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -12,5 +12,5 @@ function ConnectedStreamedWordArtifact({
12
12
  }
13
13
 
14
14
  export { ConnectedStreamedWordArtifact };
15
- //# sourceMappingURL=chunk-U6QJB3G4.js.map
16
- //# sourceMappingURL=chunk-U6QJB3G4.js.map
15
+ //# sourceMappingURL=chunk-OD3UJ7XR.js.map
16
+ //# sourceMappingURL=chunk-OD3UJ7XR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":[],"mappings":";;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,uBAAO,GAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-U6QJB3G4.js","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":[],"mappings":";;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,uBAAO,GAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-OD3UJ7XR.js","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
@@ -0,0 +1,98 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/chat/doc-links.ts
5
+ var DOC_ID_IN_HREF = /\b(doc-[a-zA-Z0-9]{8})\b/;
6
+ function workspaceDocIdFromHref(href, deploymentDomain) {
7
+ if (!href) return null;
8
+ const match = DOC_ID_IN_HREF.exec(href);
9
+ if (!match) return null;
10
+ if (/^[a-z][a-z0-9+.-]*:/i.test(href)) {
11
+ try {
12
+ const target = new URL(href);
13
+ const isDeployment = !!deploymentDomain && target.protocol === "https:" && target.hostname === deploymentDomain;
14
+ if (target.origin !== window.location.origin && !isDeployment) return null;
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+ return match[1];
20
+ }
21
+
22
+ // src/chat/rehype-doc-entity-pills.ts
23
+ var DOC_ID_PATTERN = /\b((?:doc|eml)-[a-zA-Z0-9]+)\b/;
24
+ var MAX_CACHE_ENTRIES = 512;
25
+ var textCache = /* @__PURE__ */ new Map();
26
+ function cacheGet(key) {
27
+ if (!textCache.has(key)) return void 0;
28
+ const value = textCache.get(key);
29
+ textCache.delete(key);
30
+ textCache.set(key, value);
31
+ return value;
32
+ }
33
+ function cacheSet(key, value) {
34
+ if (textCache.size >= MAX_CACHE_ENTRIES) {
35
+ const oldest = textCache.keys().next().value;
36
+ if (oldest !== void 0) textCache.delete(oldest);
37
+ }
38
+ textCache.set(key, value);
39
+ }
40
+ function buildReplacementNodes(text) {
41
+ if (!DOC_ID_PATTERN.test(text)) return null;
42
+ const globalPattern = /\b((?:doc|eml)-[a-zA-Z0-9]+)\b/g;
43
+ const newNodes = [];
44
+ let lastIndex = 0;
45
+ let m;
46
+ while ((m = globalPattern.exec(text)) !== null) {
47
+ if (m.index > lastIndex) {
48
+ newNodes.push({ type: "text", value: text.slice(lastIndex, m.index) });
49
+ }
50
+ newNodes.push({
51
+ type: "element",
52
+ tagName: "span",
53
+ properties: m[1].startsWith("eml-") ? { dataMailId: m[1] } : { dataDocId: m[1] },
54
+ children: []
55
+ });
56
+ lastIndex = m.index + m[0].length;
57
+ }
58
+ if (lastIndex < text.length) {
59
+ newNodes.push({ type: "text", value: text.slice(lastIndex) });
60
+ }
61
+ return newNodes;
62
+ }
63
+ function transformChildren(parent) {
64
+ const children = parent.children;
65
+ if (!children) return;
66
+ const inCode = parent.tagName === "code" || parent.tagName === "pre";
67
+ for (let index = 0; index < children.length; index++) {
68
+ const node = children[index];
69
+ if (node.type !== "text") {
70
+ transformChildren(node);
71
+ continue;
72
+ }
73
+ if (inCode) continue;
74
+ const text = node.value ?? "";
75
+ let replacement = cacheGet(text);
76
+ if (replacement === void 0) {
77
+ replacement = buildReplacementNodes(text);
78
+ cacheSet(text, replacement);
79
+ }
80
+ if (replacement === null) continue;
81
+ const cloned = replacement.map(
82
+ (n) => typeof n === "object" && n !== null ? { ...n } : n
83
+ );
84
+ children.splice(index, 1, ...cloned);
85
+ index += cloned.length - 1;
86
+ }
87
+ }
88
+ function rehypeDocEntityPills() {
89
+ return (tree) => {
90
+ transformChildren(tree);
91
+ };
92
+ }
93
+
94
+ exports.DOC_ID_IN_HREF = DOC_ID_IN_HREF;
95
+ exports.rehypeDocEntityPills = rehypeDocEntityPills;
96
+ exports.workspaceDocIdFromHref = workspaceDocIdFromHref;
97
+ //# sourceMappingURL=chunk-OK3UJMO4.cjs.map
98
+ //# sourceMappingURL=chunk-OK3UJMO4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/doc-links.ts","../src/chat/rehype-doc-entity-pills.ts"],"names":[],"mappings":"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","file":"chunk-OK3UJMO4.cjs","sourcesContent":["/**\n * Recognising workspace-document links inside rendered markdown hrefs.\n */\n\n/**\n * A workspace document id in an href — `doc-` plus EXACTLY eight alphanumerics,\n * the format every model in the backend pins (`^doc-[a-zA-Z0-9]{8}$`).\n *\n * `{8,}` would swallow an unrelated external URL that merely contains a `doc-…`\n * segment (`https://example.com/doc-download1234`) and route it to a viewer that\n * has nothing to show.\n */\nexport const DOC_ID_IN_HREF = /\\b(doc-[a-zA-Z0-9]{8})\\b/\n\n/**\n * The document id an href points at, or null if it does not address one of OURS.\n *\n * Absolute URLs qualify only for this origin or the deployment (`deploymentDomain`, the blocks\n * environment's `runtimeConfig.deploymentDomain`).\n * Development UI and API hosts can differ. Unrelated origins remain external. The\n * observed shape is the bare id (`[title](doc-35ce54e8)`), which is relative.\n */\nexport function workspaceDocIdFromHref(\n href: string | undefined,\n deploymentDomain?: string | null\n): string | null {\n if (!href) return null\n const match = DOC_ID_IN_HREF.exec(href)\n if (!match) return null\n if (/^[a-z][a-z0-9+.-]*:/i.test(href)) {\n try {\n const target = new URL(href)\n const isDeployment =\n !!deploymentDomain && target.protocol === 'https:' && target.hostname === deploymentDomain\n if (target.origin !== window.location.origin && !isDeployment) return null\n } catch {\n return null\n }\n }\n return match[1]\n}\n","// A document (doc-…) or an email of the person's own mailbox (eml-…): both render as entity pills.\nconst DOC_ID_PATTERN = /\\b((?:doc|eml)-[a-zA-Z0-9]+)\\b/\n\n/**\n * Per-text-node transform cache.\n *\n * Keyed by the raw text-node value. For the vast majority of text nodes — those\n * without any `doc-…` substring — we memoize the \"no match\" decision so a repeat\n * render of an unchanged message skips the regex entirely. When a node does\n * contain doc IDs we also cache the pre-built replacement children, so repeated\n * renders of a finished message don't re-scan or re-allocate.\n *\n * Uses a bounded LRU-ish Map — oldest entries are evicted when we exceed the\n * cap. This is a module singleton; across the app the hottest entries (tool\n * responses, common answer fragments) end up cached permanently for the session.\n */\nconst MAX_CACHE_ENTRIES = 512\nconst textCache = new Map<string, ReadonlyArray<unknown> | null>()\n\nfunction cacheGet(key: string): ReadonlyArray<unknown> | null | undefined {\n if (!textCache.has(key)) return undefined\n const value = textCache.get(key)\n // Touch to move it to the end of the insertion order (LRU).\n textCache.delete(key)\n textCache.set(key, value as ReadonlyArray<unknown> | null)\n return value\n}\n\nfunction cacheSet(key: string, value: ReadonlyArray<unknown> | null): void {\n if (textCache.size >= MAX_CACHE_ENTRIES) {\n const oldest = textCache.keys().next().value\n if (oldest !== undefined) textCache.delete(oldest)\n }\n textCache.set(key, value)\n}\n\n/**\n * Test-only helper to reset the memoization cache.\n * @internal\n */\nexport function __resetDocEntityPillCache(): void {\n textCache.clear()\n}\n\nfunction buildReplacementNodes(text: string): ReadonlyArray<unknown> | null {\n if (!DOC_ID_PATTERN.test(text)) return null\n\n const globalPattern = /\\b((?:doc|eml)-[a-zA-Z0-9]+)\\b/g\n const newNodes: unknown[] = []\n let lastIndex = 0\n let m: RegExpExecArray | null\n\n while ((m = globalPattern.exec(text)) !== null) {\n if (m.index > lastIndex) {\n newNodes.push({ type: 'text', value: text.slice(lastIndex, m.index) })\n }\n newNodes.push({\n type: 'element',\n tagName: 'span',\n properties: m[1].startsWith('eml-') ? { dataMailId: m[1] } : { dataDocId: m[1] },\n children: [],\n })\n lastIndex = m.index + m[0].length\n }\n\n if (lastIndex < text.length) {\n newNodes.push({ type: 'text', value: text.slice(lastIndex) })\n }\n\n return newNodes\n}\n\n/**\n * Rehype plugin that detects doc external IDs in text nodes and converts them to\n * <span data-doc-id=\"...\"> elements for rendering as entity pills in MarkdownRenderer.\n *\n * Skips text inside code/pre elements so IDs in code blocks are left as plain text.\n *\n * Results are memoized per text-node value — stable messages re-use the cached\n * decision instead of re-running the regex on every render.\n */\n/** A node of the HTML tree (hast), as far as the transform reads it. */\ninterface TreeNode {\n type: string\n tagName?: string\n value?: string\n children?: unknown[]\n}\n\n/** Replace the doc/mail ids in the text nodes under `parent` (code and pre are left alone). */\nfunction transformChildren(parent: TreeNode): void {\n const children = parent.children\n if (!children) return\n const inCode = parent.tagName === 'code' || parent.tagName === 'pre'\n for (let index = 0; index < children.length; index++) {\n const node = children[index] as TreeNode\n if (node.type !== 'text') {\n transformChildren(node)\n continue\n }\n if (inCode) continue\n const text = node.value ?? ''\n let replacement = cacheGet(text)\n if (replacement === undefined) {\n replacement = buildReplacementNodes(text)\n cacheSet(text, replacement)\n }\n if (replacement === null) continue\n // Clone cached nodes so each tree gets its own object identity. AST transforms by other\n // plugins may otherwise mutate shared references.\n const cloned = replacement.map((n) =>\n typeof n === 'object' && n !== null ? { ...(n as object) } : n\n )\n children.splice(index, 1, ...cloned)\n index += cloned.length - 1\n }\n}\n\nexport function rehypeDocEntityPills() {\n return (tree: TreeNode) => {\n transformChildren(tree)\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkDRIMPELS_cjs = require('./chunk-DRIMPELS.cjs');
4
+ var chunkMDFXGRLY_cjs = require('./chunk-MDFXGRLY.cjs');
5
5
  var chunkZ2CVGUWR_cjs = require('./chunk-Z2CVGUWR.cjs');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -9,10 +9,10 @@ function ConnectedStreamedWordArtifact({
9
9
  fontBaseUrl,
10
10
  ...props
11
11
  }) {
12
- const adapter = chunkDRIMPELS_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
12
+ const adapter = chunkMDFXGRLY_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
13
13
  return /* @__PURE__ */ jsxRuntime.jsx(chunkZ2CVGUWR_cjs.StreamedWordArtifact, { ...props, adapter });
14
14
  }
15
15
 
16
16
  exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
17
- //# sourceMappingURL=chunk-ZBTJWS3M.cjs.map
18
- //# sourceMappingURL=chunk-ZBTJWS3M.cjs.map
17
+ //# sourceMappingURL=chunk-RMLU363Q.cjs.map
18
+ //# sourceMappingURL=chunk-RMLU363Q.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-ZBTJWS3M.cjs","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-RMLU363Q.cjs","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
@@ -43,7 +43,7 @@ function ConnectionProvider({
43
43
  }) {
44
44
  const arbi = useArbi();
45
45
  const session = useArbiSessionStore();
46
- const { switchWorkspace, openSelectedWorkspace } = useSwitchWorkspace();
46
+ const { switchWorkspace, openSelectedWorkspace, settled } = useSwitchWorkspace();
47
47
  const isLiveConfigured = config.apiUrl.length > 0;
48
48
  const demoWorkspaceId = config.demoWorkspaceId ?? "demo-workspace";
49
49
  const [status, setStatus] = useState(
@@ -189,13 +189,10 @@ function ConnectionProvider({
189
189
  );
190
190
  const ensureWorkspaceOpen = useCallback(async () => {
191
191
  if (mode !== "live" || !arbi.isLoggedIn) return;
192
- if (session.getState().workspaceId) {
193
- await openSelectedWorkspace();
194
- return;
195
- }
196
- const fallback = readPersistedWorkspace(config.apiUrl, storageUserRef.current) ?? config.workspaceId;
197
- if (fallback) await arbi.selectWorkspace(fallback);
198
- }, [arbi, session, mode, config.apiUrl, config.workspaceId, openSelectedWorkspace]);
192
+ await settled();
193
+ if (!session.getState().workspaceId) return;
194
+ await openSelectedWorkspace();
195
+ }, [arbi, session, mode, settled, openSelectedWorkspace]);
199
196
  const value = useMemo(
200
197
  () => ({
201
198
  mode,
@@ -207,7 +204,7 @@ function ConnectionProvider({
207
204
  deploymentDomain: isLiveConfigured ? arbi.getDeploymentDomain() : void 0,
208
205
  error,
209
206
  assistantConfig: config.assistantConfig,
210
- fallbackWorkspaceId: config.workspaceId,
207
+ fallbackWorkspaceId: mode === "live" ? void 0 : config.workspaceId,
211
208
  login,
212
209
  enterDemo,
213
210
  logout,
@@ -328,5 +325,5 @@ function useConnectedWorkspace() {
328
325
  }
329
326
 
330
327
  export { ConnectionProvider, SESSION_EXPIRED_MESSAGE, isAuthenticated, useConnectedWorkspace, useConnection };
331
- //# sourceMappingURL=chunk-GA77ONJJ.js.map
332
- //# sourceMappingURL=chunk-GA77ONJJ.js.map
328
+ //# sourceMappingURL=chunk-TXPOODAY.js.map
329
+ //# sourceMappingURL=chunk-TXPOODAY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection/ConnectionProvider.tsx"],"names":["login"],"mappings":";;;;;;AA2EA,IAAM,iBAAA,GAAoB,cAAsC,IAAI,CAAA;AAQpE,IAAM,wBAAA,GAA2B,wBAAA;AACjC,IAAM,mBAAmB,CAAC,KAAA,KAAkB,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAG9D,IAAM,mBAAA,GAAsB,CAAC,MAAA,EAAgB,OAAA,KAClD,CAAA,EAAG,wBAAwB,CAAA,CAAA,EAAI,MAAA,IAAU,MAAM,CAAA,CAAA,EAAI,gBAAA,CAAiB,OAAO,CAAC,CAAA,CAAA;AAG9E,IAAM,4BAA4B,CAAC,MAAA,KACjC,GAAG,wBAAwB,CAAA,CAAA,EAAI,UAAU,MAAM,CAAA,CAAA;AAEjD,SAAS,sBAAA,CAAuB,QAAgB,OAAA,EAAuC;AACrF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,YAAA,CAAa,OAAA,CAAQ,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAA,EAAgB,OAAA,EAAwB,EAAA,EAAyB;AACzF,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,IAAI;AACF,IAAA,IAAI,EAAA,SAAW,YAAA,CAAa,OAAA,CAAQ,oBAAoB,MAAA,EAAQ,OAAO,GAAG,EAAE,CAAA;AAAA,gBAChE,YAAA,CAAa,UAAA,CAAW,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAC,CAAA;AACxE,IAAA,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,yBAAA,CAA0B,MAAM,CAAC,CAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGO,IAAM,uBAAA,GAA0B;AAGvC,SAAS,eAAA,CAAgB,SAAuB,UAAA,EAA+B;AAC7E,EAAA,MAAM,WAAW,CAAC,OAAA,CAAQ,WAAW,OAAA,CAAQ,UAAU,EACpD,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,EAAM,MAAM,CAAA,CAC1B,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,IAAY,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,IAC5C,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,UAAA;AAAA,IACA,SAAS,OAAA,CAAQ;AAAA,GACnB;AACF;AAOO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,EAAA,MAAM,EAAE,eAAA,EAAiB,qBAAA,EAAuB,OAAA,KAAY,kBAAA,EAAmB;AAC/E,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA;AAChD,EAAA,MAAM,eAAA,GAAkB,OAAO,eAAA,IAAmB,gBAAA;AAElD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA;AAAA,IAC1B,mBAAmB,YAAA,GAAe;AAAA,GACpC;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC5D,EAAA,MAAM,oBAAoB,OAAA,CAAQ,cAAA;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAmB,MAAM,CAAA;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,OAAsB,IAAI,CAAA;AAKjD,EAAA,SAAA;AAAA,IACE,MACE,IAAA,CAAK,gBAAA,GAAmB,MAAM;AAC5B,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,SAAA,CAAU,cAAc,CAAA;AACxB,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,IACH,CAAC,MAAM,iBAAiB;AAAA,GAC1B;AAGA,EAAA,SAAA;AAAA,IACE,MACE,KAAK,IAAA,CAAK,eAAA;AAAA,MAAkB,CAAC,OAAA,KAC3B,OAAA,CAAQ,CAAC,OAAA,KAAa,OAAA,GAAU,eAAA,CAAgB,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAQ;AAAA,KACzF;AAAA,IACF,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,EAAE,MAAM,MAAA,CAAO,QAAA,CAAS,MAAM,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,CAAA;AACpE,IAAA,iBAAA,CAAkB,eAAe,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,OAAO,QAAA,CAAS,KAAA,EAAO,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAMpF,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OAAO,KAAA,KAAkB;AACvB,MAAA,OAAA,CAAQ,MAAM,CAAA;AACd,MAAA,SAAA,CAAU,YAAY,CAAA;AACtB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,cAAA,CAAe,OAAA,GAAU,iBAAiB,KAAK,CAAA;AAC/C,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AAC9C,QAAA,IAAI,YAAY,MAAA,EAAQ;AAKtB,UAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,MAAA,CAAO,MAAA,EAAQ,eAAe,OAAO,CAAA;AAC9E,UAAA,MAAM,SAAA,GAAY,aAAa,MAAA,CAAO,WAAA;AACtC,UAAA,MAAM,MAAA,GAAA,CACH,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,SAAS,CAAA,GAAI,KAAA,CAAA,KACnE,UAAA,CAAW,CAAC,CAAA;AACd,UAAA,iBAAA,CAAkB,OAAO,WAAW,CAAA;AACpC,UAAA,IAAI,CAAE,MAAM,qBAAA,EAAsB;AAChC,YAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACxE,UAAA,gBAAA,CAAiB,MAAA,CAAO,MAAA,EAAQ,cAAA,CAAe,OAAA,EAAS,OAAO,WAAW,CAAA;AAAA,QAC5E;AAIA,QAAA,IAAI,QAAA,GAAqB,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,EAAM;AAC5D,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS;AAC9B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,OAAA,IAAU;AACpC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,QAAA,GAAW,eAAA,CAAgB,OAAA,EAAS,EAAA,EAAI,UAAU,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,EAAU;AAChD,YAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,WAAA,KAAgB,EAAA,EAAI,UAAU,CAAA,EAAG,IAAA;AACzE,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAM,QAAA,GAAW,CAAC,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACpF,cAAA,QAAA,GAAW;AAAA,gBACT,MAAM,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,gBACpC,KAAA,EAAO,KAAK,KAAA,IAAS,KAAA;AAAA,gBACrB,YAAY,IAAA,CAAK,WAAA;AAAA,gBACjB,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,eAC3B;AAAA,YACF,CAAA,MAAA,IAAW,IAAI,UAAA,EAAY;AACzB,cAAA,QAAA,CAAS,aAAa,EAAA,CAAG,UAAA;AAAA,YAC3B;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,QAAA,SAAA,CAAU,eAAe,CAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AAEV,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yCAAyC,CAAA;AACnF,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,MAAA,CAAO,aAAa,MAAA,CAAO,MAAA,EAAQ,mBAAmB,qBAAqB;AAAA,GACpF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,CAAA;AACzD,EAAA,SAAA;AAAA,IACE,MACE,IAAA,CAAK,UAAA,GAAa,CAACA,MAAAA,KAAU;AAC3B,MAAA,SAAA,CAAU,OAAA,GAAU,cAAA;AAAA,QAClBA,MAAAA,CAAM,OAAA,EAAS,KAAA,IACb,IAAA,CAAK,OAAA,EAAS,QAAA,EAAS,CAAE,SAAA,IACzB,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,EAAG,KAAA,IACtB;AAAA,OACJ;AAAA,IACF,CAAC,CAAA;AAAA,IACH,CAAC,MAAM,cAAc;AAAA,GACvB;AAGA,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IACZ,OAAO,OAAe,QAAA,KAAqB;AACzC,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,SAAA,EAAU;AACV,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,YAAY,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,CAAA;AACd,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,QAAA,MAAM,SAAA,CAAU,OAAA;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yCAAyC,CAAA;AACnF,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB;AAAA,GACpC;AAIA,EAAA,MAAM,cAAA,GAAiB,OAAO,KAAK,CAAA;AACnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAA,CAAe,OAAA,IAAW,CAAC,gBAAA,EAAkB;AACjD,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,IAAA,CACG,OAAA,GACA,KAAA,CAAM,MAAM,KAAK,CAAA,CACjB,IAAA,CAAK,OAAO,QAAA,KAAa;AACxB,MAAA,IAAI,QAAA,QAAgB,SAAA,CAAU,OAAA;AAAA,qBACf,cAAc,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAE3B,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,KAAK,KAAK,MAAA,IAAS;AAAA,IACrB;AAEA,IAAA,iBAAA,EAAkB;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,gBAAA,CAAiB,MAAA,CAAO,MAAA,EAAQ,cAAA,CAAe,OAAA,EAAS,IAAI,CAAA;AAC5D,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,SAAA,CAAU,cAAc,CAAA;AACxB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,GAAG,CAAC,IAAA,EAAM,MAAM,MAAA,CAAO,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAMjD,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,OAAO,EAAA,KAAe;AACpB,MAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AACtC,QAAA,IAAI,CAAE,MAAM,eAAA,CAAgB,EAAE,EAAA,EAAI,CAAA,EAAI,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA;AAAA,MACtF,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,MACtB;AACA,MAAA,gBAAA,CAAiB,MAAA,CAAO,MAAA,EAAQ,cAAA,CAAe,OAAA,EAAS,EAAE,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,mBAAmB,eAAe;AAAA,GAChE;AAMA,EAAA,MAAM,mBAAA,GAAsB,YAAY,YAAY;AAClD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,CAAC,IAAA,CAAK,UAAA,EAAY;AACzC,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,EAAS,CAAE,WAAA,EAAa;AACrC,IAAA,MAAM,qBAAA,EAAsB;AAAA,EAC9B,GAAG,CAAC,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,qBAAqB,CAAC,CAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,IAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA,EAAe,gBAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,gBAAA,EAAkB,gBAAA,GAAmB,IAAA,CAAK,mBAAA,EAAoB,GAAI,MAAA;AAAA,MAClE,KAAA;AAAA,MACA,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,mBAAA,EAAqB,IAAA,KAAS,MAAA,GAAS,MAAA,GAAY,MAAA,CAAO,WAAA;AAAA,MAC1D,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,IAAA;AAAA,MACA,MAAA,CAAO,eAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACvD,EAAA,MAAM,gBAAgB,MAAA,KAAW,eAAA;AACjC,EAAA,MAAM,IAAA,GAAO,OAAA;AAAA,IACX,OAAO,EAAE,OAAA,EAAS,EAAE,QAAQ,OAAA,EAAS,UAAA,EAAY,MAAM,aAAA,EAAc,EAAE,CAAA;AAAA,IACvE,CAAC,SAAS,aAAa;AAAA,GACzB;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAC1B,8BAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,IAAA,EAAO,QAAA,EAAS,CAAA,EACpC,CAAA;AAEJ;AAOA,SAAS,oBAAA,CACP,IAAA,EACA,IAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,SAAA,GAAY,MAAA,iBAAO,IAAI,GAAA,EAAiB,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAC,QAAA,KAAa,UAAU,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAS,MAA0B;AACjC,QAAA,MAAM,GAAA,GAAM,KAAK,OAAA,EAAQ;AACzB,QAAA,MAAM,WAAW,OAAA,CAAQ,OAAA;AACzB,QAAA,IAAI,GAAA,IAAO,CAAC,QAAA,EAAU,OAAO,GAAA;AAC7B,QAAA,OAAO;AAAA,UACL,GAAG,aAAA,CAAc;AAAA,YACf,SAAA,EAAW,EAAA;AAAA,YACX,UAAA,EAAY,IAAA;AAAA,YACZ,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,YAC7B,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,UACD,UAAU,QAAA,CAAS;AAAA,SACrB;AAAA,MACF,CAAA;AAAA,MACA,eAAA,EAAiB,CAAC,QAAA,KAAa;AAC7B,QAAA,SAAA,CAAU,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAC9B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AACzC,QAAA,OAAO,MAAM;AACX,UAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AACjC,UAAA,GAAA,EAAI;AAAA,QACN,CAAA;AAAA,MACF,CAAA;AAAA,MACA,SAAS,OAAO,EAAE,UAAA,EAAW,GAAI,EAAC,KAAM;AACtC,QAAA,IAAI;AACF,UAAA,IAAI,UAAA,EAAY,MAAM,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU;AAAA,QAChD,CAAA,SAAE;AACA,UAAA,SAAA,CAAU,OAAA,EAAQ;AAAA,QACpB;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACX;AAEO,SAAS,aAAA,GAAiC;AAC/C,EAAA,MAAM,GAAA,GAAM,WAAW,iBAAiB,CAAA;AACxC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAC3F,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,eAAA,GAAkB,CAAC,CAAA,KAAwB,CAAA,KAAM,UAAU,CAAA,KAAM;AAqB9E,IAAM,iBAAiB,YAAY;AAAC,CAAA;AAGpC,SAAS,YAAY,IAAA,EAAmD;AACtE,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ;AAClC,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,OAAO,OAAA,GACH,gBAAgB,OAAA,EAAS,EAAA,CAAG,UAAU,CAAA,GACtC,EAAE,IAAA,EAAA,CAAO,EAAA,CAAG,KAAA,IAAS,EAAA,EAAI,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA,EAAI,UAAA,EAAY,EAAA,CAAG,UAAA,EAAW;AAC/F;AAOO,SAAS,qBAAA,GAA4C;AAC1D,EAAA,MAAM,UAAA,GAAa,WAAW,iBAAiB,CAAA;AAC/C,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,kBAAA,GAAqB,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,UAAA,GAAa,UAAA,CAAW,MAAA,KAAW,kBAAkB,IAAA,CAAK,UAAA;AACvE,EAAA,MAAM,OAAO,UAAA,GAAa,UAAA,CAAW,OAAO,IAAA,GAAO,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA;AACvE,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,EAAM,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,IAAA,EAAM,IAAA,IAAQ,EAAE,CAAA,CAAA,EAAI,IAAA,EAAM,KAAA,IAAS,EAAE,CAAA,CAAA;AAClF,EAAA,MAAM,EAAE,aAAA,EAAe,aAAA,EAAc,GAAI,oBAAA,EAAqB;AAC9D,EAAA,OAAO,OAAA;AAAA,IACL,OAAO;AAAA,MACL,aAAa,UAAA,GACR,UAAA,CAAW,WAAA,IAAe,UAAA,CAAW,uBAAuB,IAAA,GAC7D,kBAAA;AAAA,MACJ,IAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,IAAA,EAAM,UAAA;AAAA,MACd,mBAAA,EAAqB,YAAY,mBAAA,IAAuB,cAAA;AAAA,MACxD,aAAA,EAAe,OAAO,WAAA,EAAqB,OAAA,KAAgC;AACzE,QAAA,IAAI,UAAA,EAAY,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,CAAA;AACzD,QAAA,aAAA,CAAc,aAAa,OAAO,CAAA;AAAA,MACpC;AAAA,KACF,CAAA;AAAA;AAAA;AAAA,IAGA,CAAC,UAAA,EAAY,kBAAA,EAAoB,IAAA,EAAM,SAAS,aAAa;AAAA,GAC/D;AACF","file":"chunk-TXPOODAY.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 {\n arbiAccountClient,\n clearSealedDrafts,\n toProfileView,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n useSwitchWorkspace,\n type AccountClient,\n type LoginProfile,\n type ProfileView,\n} from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { ArbiHost } from '../provider/host'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n /** The selected workspace: the session state's (`useArbiSessionState`), set by `setWorkspace`. */\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n /**\n * The deployment domain the user's keys are derived for (`arbi.getDeploymentDomain()`), for the\n * document tools' e-signing. `undefined` in demo mode.\n */\n deploymentDomain: string | undefined\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /**\n * The demo's workspace when none is selected. Never set signed in to a live backend: there the\n * selection is the only workspace (none while a switch is in flight), never a remembered one.\n */\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\n/**\n * The sign-in layer of a blocks-only site, mounted by its host (`defaultHost`): login, demo mode\n * and the selected workspace, over the host's session state (the selected workspace lives there,\n * so every block reads one value). Its account client is the host's `account` below it.\n */\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const { switchWorkspace, openSelectedWorkspace, settled } = useSwitchWorkspace()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>(\n isLiveConfigured ? 'connecting' : 'disconnected'\n )\n const [user, setUser] = useState<ArbiUser | null>(null)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const selectWorkspaceId = session.setWorkspaceId\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 selectWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi, selectWorkspaceId]\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 selectWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId, selectWorkspaceId])\n\n /**\n * The session signed in, by whatever path (`login` below, a sign-in page on the host's `Arbi`,\n * a restored session): open the user's workspace and resolve who they are.\n */\n const completeSignIn = useCallback(\n async (email: string) => {\n setMode('live')\n setStatus('connecting')\n setError(null)\n try {\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 selectWorkspaceId(target.external_id)\n if (!(await openSelectedWorkspace()))\n throw new Error('Could not open your workspace. Try signing in again.')\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, config.workspaceId, config.apiUrl, selectWorkspaceId, openSelectedWorkspace]\n )\n\n // Every sign-in on the host's `Arbi` lands here, whichever page or kit made it.\n const signingIn = useRef<Promise<void>>(Promise.resolve())\n useEffect(\n () =>\n arbi.onSignedIn?.((login) => {\n signingIn.current = completeSignIn(\n login.profile?.email ??\n arbi.session?.getState().userEmail ??\n arbi.user.identity()?.email ??\n ''\n )\n }),\n [arbi, completeSignIn]\n )\n\n /** Authenticate: a live login when a backend is configured, otherwise the demo workspace. */\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n // Signed in: `completeSignIn` follows (onSignedIn); done once it is.\n await arbi.login(email, password)\n await signingIn.current\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured]\n )\n\n // The session kept on this device signs in again (no password; the key stays encrypted on the\n // device). Run once even under StrictMode.\n const restoreStarted = useRef(false)\n useEffect(() => {\n if (restoreStarted.current || !isLiveConfigured) return\n restoreStarted.current = true\n arbi\n .restore()\n .catch(() => false)\n .then(async (restored) => {\n if (restored) await signingIn.current\n else setStatus('disconnected')\n })\n }, [arbi, isLiveConfigured])\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n // What was typed never outlives the session (it is sealed, but kept for no one now).\n clearSealedDrafts()\n setUser(null)\n selectWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl, selectWorkspaceId])\n\n // Affirmative selection: the shared workspace switch (live), then remember it so the next\n // login lands there too. This provider IS the host's navigation, so it alone (with sign-in and\n // ensureWorkspaceOpen, which re-open the host's own selection) changes the workspace; kits reach\n // another workspace with `arbi.workspaces.open`.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n if (!(await switchWorkspace({ id }))) throw new Error('Could not open the workspace')\n } else {\n selectWorkspaceId(id)\n }\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl, selectWorkspaceId, switchWorkspace]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped it. Idempotent.\n // A switch in flight is waited out first, then only the selection as of then is opened (none:\n // nothing). Never a remembered or configured workspace: kits call this before reading, and\n // opening another workspace than the selected one would leave the server session in it.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n await settled()\n if (!session.getState().workspaceId) return\n await openSelectedWorkspace()\n }, [arbi, session, mode, settled, openSelectedWorkspace])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n deploymentDomain: isLiveConfigured ? arbi.getDeploymentDomain() : undefined,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: mode === 'live' ? undefined : 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 arbi,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n const account = useConnectionAccount(arbi, user, logout)\n const authenticated = status === 'authenticated'\n const host = useMemo(\n () => ({ account: { client: account, useEnabled: () => authenticated } }),\n [account, authenticated]\n )\n\n return (\n <ConnectionContext.Provider value={value}>\n <ArbiHost config={host}>{children}</ArbiHost>\n </ConnectionContext.Provider>\n )\n}\n\n/**\n * The account client of the settings blocks below: the SDK's, with sign-out going through this\n * connection (so its state is cleared too) and, for a session restored without a login (no SDK\n * profile), the connection user as the profile.\n */\nfunction useConnectionAccount(\n arbi: ReturnType<typeof useArbi>,\n user: ArbiUser | null,\n logout: () => void\n): AccountClient {\n const userRef = useRef(user)\n const logoutRef = useRef(logout)\n logoutRef.current = logout\n const listeners = useRef(new Set<() => void>())\n useEffect(() => {\n userRef.current = user\n listeners.current.forEach((listener) => listener())\n }, [user])\n return useMemo(() => {\n const base = arbiAccountClient(arbi)\n return {\n ...base,\n profile: (): ProfileView | null => {\n const own = base.profile()\n const fallback = userRef.current\n if (own || !fallback) return own\n return {\n ...toProfileView({\n givenName: '',\n familyName: null,\n picture: fallback.picture ?? null,\n email: fallback.email,\n isSso: false,\n }),\n fullName: fallback.name,\n }\n },\n onProfileChange: (listener) => {\n listeners.current.add(listener)\n const off = base.onProfileChange(listener)\n return () => {\n listeners.current.delete(listener)\n off()\n }\n },\n signOut: async ({ everywhere } = {}) => {\n try {\n if (everywhere) await arbi.sessions.logoutAll()\n } finally {\n logoutRef.current()\n }\n },\n }\n }, [arbi])\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection needs the sign-in layer of `defaultHost` above it')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n\n/** The open workspace as the connected kits see it, whoever hosts them. */\nexport interface ConnectedWorkspace {\n /** The selected workspace (the session state's; with a connection, else its fallback). */\n workspaceId: string | null\n /** Signed in to a live backend: workspace-scoped queries may run. */\n live: boolean\n /** The signed-in user (their name and email, e.g. to sign a document). */\n user: ArbiUser | null\n /** The signed-in user's external id. */\n userId: string | undefined\n /** Re-assert the workspace on the server session before a workspace-scoped write. */\n ensureWorkspaceOpen: () => Promise<void>\n /**\n * Go into a workspace: select it (with a connection) and show it (`BlocksEnvironment.\n * openWorkspace`, where a host without a connection also switches its session).\n */\n openWorkspace: (workspaceId: string, options?: { name?: string }) => Promise<void>\n}\n\nconst keptOpenByHost = async () => {}\n\n/** The signed-in user of a host's own session, from its login profile. */\nfunction sessionUser(arbi: ReturnType<typeof useArbi>): ArbiUser | null {\n if (!arbi.isLoggedIn) return null\n const me = arbi.user.identity()\n const profile = arbi.user.profile()\n if (!me) return null\n return profile\n ? userFromProfile(profile, me.externalId)\n : { name: (me.email ?? '').split('@')[0], email: me.email ?? '', externalId: me.externalId }\n}\n\n/**\n * The workspace for a connected kit: the sign-in layer's (`defaultHost`) when there is one, else the\n * host's own session (an app whose host config has its `arbi` and `session` and keeps its\n * workspace open itself). So a kit runs the same in Clarum and in the ARBI app.\n */\nexport function useConnectedWorkspace(): ConnectedWorkspace {\n const connection = useContext(ConnectionContext)\n const arbi = useArbi()\n const sessionWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const live = connection ? connection.status === 'authenticated' : arbi.isLoggedIn\n const user = connection ? connection.user : live ? sessionUser(arbi) : null\n const userKey = `${user?.externalId ?? ''}|${user?.name ?? ''}|${user?.email ?? ''}`\n const { openWorkspace: showWorkspace } = useBlocksEnvironment()\n return useMemo(\n () => ({\n workspaceId: connection\n ? (connection.workspaceId ?? connection.fallbackWorkspaceId ?? null)\n : sessionWorkspaceId,\n live,\n user,\n userId: user?.externalId,\n ensureWorkspaceOpen: connection?.ensureWorkspaceOpen ?? keptOpenByHost,\n openWorkspace: async (workspaceId: string, options?: { name?: string }) => {\n if (connection) await connection.setWorkspace(workspaceId)\n showWorkspace(workspaceId, options)\n },\n }),\n // `user` is rebuilt each render without a connection: its key says when it changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [connection, sessionWorkspaceId, live, userKey, showWorkspace]\n )\n}\n"]}
@@ -996,7 +996,8 @@ function buildThreadDiagram(threads) {
996
996
  return diagram;
997
997
  }
998
998
  function threadForNode(threads, nodeId) {
999
- const messageId = nodeId.replace(/^flowchart-/, "").replace(/-\d+$/, "");
999
+ const messageId = /(?:^|-)flowchart-(.+)-\d+$/.exec(nodeId)?.[1];
1000
+ if (!messageId) return null;
1000
1001
  if (threads.some((thread) => thread.leaf_message_ext_id === messageId)) return messageId;
1001
1002
  const containing = threads.find(
1002
1003
  (thread) => thread.history.some((msg) => msg.external_id === messageId)
@@ -1618,96 +1619,6 @@ async function downloadTableAsCsv(table, anchor = table) {
1618
1619
  downloadBlob(new Blob([csv], { type: "text/csv;charset=utf-8" }), filename);
1619
1620
  return filename;
1620
1621
  }
1621
-
1622
- // src/chat/doc-links.ts
1623
- var DOC_ID_IN_HREF = /\b(doc-[a-zA-Z0-9]{8})\b/;
1624
- function workspaceDocIdFromHref(href, deploymentDomain) {
1625
- if (!href) return null;
1626
- const match = DOC_ID_IN_HREF.exec(href);
1627
- if (!match) return null;
1628
- if (/^[a-z][a-z0-9+.-]*:/i.test(href)) {
1629
- try {
1630
- const target = new URL(href);
1631
- const isDeployment = !!deploymentDomain && target.protocol === "https:" && target.hostname === deploymentDomain;
1632
- if (target.origin !== window.location.origin && !isDeployment) return null;
1633
- } catch {
1634
- return null;
1635
- }
1636
- }
1637
- return match[1];
1638
- }
1639
-
1640
- // src/chat/rehype-doc-entity-pills.ts
1641
- var DOC_ID_PATTERN = /\b((?:doc|eml)-[a-zA-Z0-9]+)\b/;
1642
- var MAX_CACHE_ENTRIES = 512;
1643
- var textCache = /* @__PURE__ */ new Map();
1644
- function cacheGet(key) {
1645
- if (!textCache.has(key)) return void 0;
1646
- const value = textCache.get(key);
1647
- textCache.delete(key);
1648
- textCache.set(key, value);
1649
- return value;
1650
- }
1651
- function cacheSet(key, value) {
1652
- if (textCache.size >= MAX_CACHE_ENTRIES) {
1653
- const oldest = textCache.keys().next().value;
1654
- if (oldest !== void 0) textCache.delete(oldest);
1655
- }
1656
- textCache.set(key, value);
1657
- }
1658
- function buildReplacementNodes(text) {
1659
- if (!DOC_ID_PATTERN.test(text)) return null;
1660
- const globalPattern = /\b((?:doc|eml)-[a-zA-Z0-9]+)\b/g;
1661
- const newNodes = [];
1662
- let lastIndex = 0;
1663
- let m;
1664
- while ((m = globalPattern.exec(text)) !== null) {
1665
- if (m.index > lastIndex) {
1666
- newNodes.push({ type: "text", value: text.slice(lastIndex, m.index) });
1667
- }
1668
- newNodes.push({
1669
- type: "element",
1670
- tagName: "span",
1671
- properties: m[1].startsWith("eml-") ? { dataMailId: m[1] } : { dataDocId: m[1] },
1672
- children: []
1673
- });
1674
- lastIndex = m.index + m[0].length;
1675
- }
1676
- if (lastIndex < text.length) {
1677
- newNodes.push({ type: "text", value: text.slice(lastIndex) });
1678
- }
1679
- return newNodes;
1680
- }
1681
- function transformChildren(parent) {
1682
- const children = parent.children;
1683
- if (!children) return;
1684
- const inCode = parent.tagName === "code" || parent.tagName === "pre";
1685
- for (let index = 0; index < children.length; index++) {
1686
- const node = children[index];
1687
- if (node.type !== "text") {
1688
- transformChildren(node);
1689
- continue;
1690
- }
1691
- if (inCode) continue;
1692
- const text = node.value ?? "";
1693
- let replacement = cacheGet(text);
1694
- if (replacement === void 0) {
1695
- replacement = buildReplacementNodes(text);
1696
- cacheSet(text, replacement);
1697
- }
1698
- if (replacement === null) continue;
1699
- const cloned = replacement.map(
1700
- (n) => typeof n === "object" && n !== null ? { ...n } : n
1701
- );
1702
- children.splice(index, 1, ...cloned);
1703
- index += cloned.length - 1;
1704
- }
1705
- }
1706
- function rehypeDocEntityPills() {
1707
- return (tree) => {
1708
- transformChildren(tree);
1709
- };
1710
- }
1711
1622
  var WARM_REMAINING_THRESHOLD_PERCENT = 50;
1712
1623
  function ContextUsageBar({
1713
1624
  contextUsage,
@@ -1781,6 +1692,6 @@ function findMessageDocument(docs, messageExtId) {
1781
1692
  return matches.sort(newestFirst)[0];
1782
1693
  }
1783
1694
 
1784
- export { BranchControls, ComposerAccessories, ComposerTools, ContextUsageBar, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_DRAFTING_DOC_CHIP_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, DEFAULT_THREAD_VISUALIZER_LABELS, DOC_ID_IN_HREF, DraftingDocChip, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, ThreadVisualizer, buildMessageLink, buildSlashItems, buildThreadDiagram, copyMessageToClipboard, downloadTableAsCsv, filterSlashItems, findMessageDocument, flashMessage, getParticipantTints, groupOutputsByConversation, isLongPastedText, latestThreadVersionMessage, rehypeDocEntityPills, threadForNode, useLongPaste, useRecipientDraft, workspaceDocIdFromHref };
1785
- //# sourceMappingURL=chunk-XUUKUIKH.js.map
1786
- //# sourceMappingURL=chunk-XUUKUIKH.js.map
1695
+ export { BranchControls, ComposerAccessories, ComposerTools, ContextUsageBar, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_DRAFTING_DOC_CHIP_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, DEFAULT_THREAD_VISUALIZER_LABELS, DraftingDocChip, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, ThreadVisualizer, buildMessageLink, buildSlashItems, buildThreadDiagram, copyMessageToClipboard, downloadTableAsCsv, filterSlashItems, findMessageDocument, flashMessage, getParticipantTints, groupOutputsByConversation, isLongPastedText, latestThreadVersionMessage, threadForNode, useLongPaste, useRecipientDraft };
1696
+ //# sourceMappingURL=chunk-ULQV2NJT.js.map
1697
+ //# sourceMappingURL=chunk-ULQV2NJT.js.map