@arbidocs/blocks 0.4.20 → 0.4.22

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 (93) hide show
  1. package/dist/agents/definitions/AgentCard.d.ts +4 -1
  2. package/dist/agents/index.cjs +211 -211
  3. package/dist/agents/index.js +5 -5
  4. package/dist/chat/ChatPage.d.ts +1 -1
  5. package/dist/chat/chat-page-types.d.ts +2 -0
  6. package/dist/chat/index.cjs +169 -168
  7. package/dist/chat/index.js +3 -2
  8. package/dist/chunk-5TRALRWN.js +42 -0
  9. package/dist/chunk-5TRALRWN.js.map +1 -0
  10. package/dist/chunk-7UTB4PHM.cjs +300 -0
  11. package/dist/chunk-7UTB4PHM.cjs.map +1 -0
  12. package/dist/chunk-AA3PT6KR.js +286 -0
  13. package/dist/chunk-AA3PT6KR.js.map +1 -0
  14. package/dist/{chunk-QJEJBLHI.js → chunk-CQ6CYPV4.js} +7 -281
  15. package/dist/chunk-CQ6CYPV4.js.map +1 -0
  16. package/dist/chunk-EUOGPUMJ.cjs +59 -0
  17. package/dist/chunk-EUOGPUMJ.cjs.map +1 -0
  18. package/dist/{chunk-PRVKJ5XL.cjs → chunk-J22DXUJY.cjs} +4 -3
  19. package/dist/chunk-J22DXUJY.cjs.map +1 -0
  20. package/dist/{chunk-ZPOLKYR2.cjs → chunk-JCVZKCXC.cjs} +22 -69
  21. package/dist/chunk-JCVZKCXC.cjs.map +1 -0
  22. package/dist/{chunk-557EU3G4.js → chunk-JLOYWXRB.js} +3 -3
  23. package/dist/{chunk-557EU3G4.js.map → chunk-JLOYWXRB.js.map} +1 -1
  24. package/dist/{chunk-UVIOQUJA.js → chunk-JLPYOPCX.js} +4 -3
  25. package/dist/chunk-JLPYOPCX.js.map +1 -0
  26. package/dist/{chunk-4TBZRZFC.js → chunk-MLJDOH3B.js} +23 -6
  27. package/dist/chunk-MLJDOH3B.js.map +1 -0
  28. package/dist/chunk-NNH7N62N.cjs +876 -0
  29. package/dist/chunk-NNH7N62N.cjs.map +1 -0
  30. package/dist/{chunk-7Q6RBXIV.cjs → chunk-OEQXYWUO.cjs} +22 -5
  31. package/dist/chunk-OEQXYWUO.cjs.map +1 -0
  32. package/dist/{chunk-J4AOAFZF.cjs → chunk-TL2DHSC5.cjs} +11 -297
  33. package/dist/chunk-TL2DHSC5.cjs.map +1 -0
  34. package/dist/chunk-UOLMFC5K.js +846 -0
  35. package/dist/chunk-UOLMFC5K.js.map +1 -0
  36. package/dist/{chunk-DCEI37AX.cjs → chunk-YVIOCITQ.cjs} +3 -3
  37. package/dist/{chunk-DCEI37AX.cjs.map → chunk-YVIOCITQ.cjs.map} +1 -1
  38. package/dist/{chunk-S74WZNK7.js → chunk-ZEIOREJY.js} +5 -36
  39. package/dist/chunk-ZEIOREJY.js.map +1 -0
  40. package/dist/connect/docx.cjs +86 -0
  41. package/dist/connect/docx.cjs.map +1 -0
  42. package/dist/connect/docx.d.ts +1 -0
  43. package/dist/connect/docx.js +84 -0
  44. package/dist/connect/docx.js.map +1 -0
  45. package/dist/connect/index.cjs +136 -69
  46. package/dist/connect/index.cjs.map +1 -1
  47. package/dist/connect/index.d.ts +1 -0
  48. package/dist/connect/index.js +91 -25
  49. package/dist/connect/index.js.map +1 -1
  50. package/dist/connection/ConnectedNativeDocxEditor.d.ts +5 -0
  51. package/dist/connection/useConnectedDocxNotifications.d.ts +9 -0
  52. package/dist/docx/DocxMentions.d.ts +17 -0
  53. package/dist/docx/NativeDocxComparison.d.ts +10 -0
  54. package/dist/docx/NativeDocxEditor.d.ts +50 -0
  55. package/dist/docx/export.d.ts +2 -0
  56. package/dist/docx/fonts.d.ts +2 -0
  57. package/dist/docx/index.cjs +116 -0
  58. package/dist/docx/index.cjs.map +1 -0
  59. package/dist/docx/index.d.ts +10 -0
  60. package/dist/docx/index.js +63 -0
  61. package/dist/docx/index.js.map +1 -0
  62. package/dist/docx/mentions.d.ts +8 -0
  63. package/dist/facts/index.cjs +1 -1
  64. package/dist/facts/index.js +1 -1
  65. package/dist/files/index.cjs +5 -5
  66. package/dist/files/index.js +6 -6
  67. package/dist/index.cjs +795 -794
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.js +17 -16
  70. package/dist/index.js.map +1 -1
  71. package/dist/settings/index.cjs +41 -41
  72. package/dist/settings/index.js +4 -4
  73. package/dist/shell/index.cjs +9 -9
  74. package/dist/shell/index.js +1 -1
  75. package/dist/site/index.cjs +13 -13
  76. package/dist/site/index.js +1 -1
  77. package/dist/studio/index.cjs +6 -5
  78. package/dist/studio/index.cjs.map +1 -1
  79. package/dist/studio/index.js +4 -3
  80. package/dist/studio/index.js.map +1 -1
  81. package/dist/workspaces/index.cjs +2 -2
  82. package/dist/workspaces/index.js +2 -2
  83. package/package.json +48 -7
  84. package/src/docx/README.md +68 -0
  85. package/src/docx/styles.css +36 -0
  86. package/dist/chunk-4TBZRZFC.js.map +0 -1
  87. package/dist/chunk-7Q6RBXIV.cjs.map +0 -1
  88. package/dist/chunk-J4AOAFZF.cjs.map +0 -1
  89. package/dist/chunk-PRVKJ5XL.cjs.map +0 -1
  90. package/dist/chunk-QJEJBLHI.js.map +0 -1
  91. package/dist/chunk-S74WZNK7.js.map +0 -1
  92. package/dist/chunk-UVIOQUJA.js.map +0 -1
  93. package/dist/chunk-ZPOLKYR2.cjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkPRVKJ5XL_cjs = require('./chunk-PRVKJ5XL.cjs');
5
- var react$1 = require('react');
6
- var react = require('@arbidocs/react');
4
+ var react = require('react');
5
+ var react$1 = require('@arbidocs/react');
7
6
  var jsxRuntime = require('react/jsx-runtime');
8
7
 
9
- var ConnectionContext = react$1.createContext(null);
8
+ // src/connection/ConnectionProvider.tsx
9
+ var ConnectionContext = react.createContext(null);
10
10
  var WORKSPACE_STORAGE_PREFIX = "arbi:selectedWorkspace";
11
11
  var normalizeUserKey = (email) => email.trim().toLowerCase();
12
12
  var workspaceStorageKey = (apiUrl, userKey) => `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || "demo"}:${normalizeUserKey(userKey)}`;
@@ -42,16 +42,16 @@ function ConnectionProvider({
42
42
  config,
43
43
  children
44
44
  }) {
45
- const arbi = react.useArbi();
45
+ const arbi = react$1.useArbi();
46
46
  const isLiveConfigured = config.apiUrl.length > 0;
47
47
  const demoWorkspaceId = config.demoWorkspaceId ?? "demo-workspace";
48
- const [status, setStatus] = react$1.useState("disconnected");
49
- const [user, setUser] = react$1.useState(null);
50
- const [workspaceId, setWorkspaceId] = react$1.useState(null);
51
- const [mode, setMode] = react$1.useState("demo");
52
- const [error, setError] = react$1.useState(null);
53
- const storageUserRef = react$1.useRef(null);
54
- react$1.useEffect(
48
+ const [status, setStatus] = react.useState("disconnected");
49
+ const [user, setUser] = react.useState(null);
50
+ const [workspaceId, setWorkspaceId] = react.useState(null);
51
+ const [mode, setMode] = react.useState("demo");
52
+ const [error, setError] = react.useState(null);
53
+ const storageUserRef = react.useRef(null);
54
+ react.useEffect(
55
55
  () => arbi.onSessionExpired?.(() => {
56
56
  storageUserRef.current = null;
57
57
  setUser(null);
@@ -61,20 +61,20 @@ function ConnectionProvider({
61
61
  }),
62
62
  [arbi]
63
63
  );
64
- react$1.useEffect(
64
+ react.useEffect(
65
65
  () => arbi.user.onProfileChange?.(
66
66
  (profile) => setUser((current) => current ? userFromProfile(profile, current.externalId) : current)
67
67
  ),
68
68
  [arbi]
69
69
  );
70
- const enterDemo = react$1.useCallback(() => {
70
+ const enterDemo = react.useCallback(() => {
71
71
  setMode("demo");
72
72
  setStatus("demo");
73
73
  setError(null);
74
74
  setUser({ name: config.demoUser.name, email: config.demoUser.email });
75
75
  setWorkspaceId(demoWorkspaceId);
76
76
  }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId]);
77
- const login = react$1.useCallback(
77
+ const login = react.useCallback(
78
78
  async (email, password) => {
79
79
  setError(null);
80
80
  if (!isLiveConfigured) {
@@ -127,7 +127,7 @@ function ConnectionProvider({
127
127
  },
128
128
  [arbi, enterDemo, isLiveConfigured, config.workspaceId, config.apiUrl]
129
129
  );
130
- const logout = react$1.useCallback(() => {
130
+ const logout = react.useCallback(() => {
131
131
  if (mode === "live") {
132
132
  void arbi.logout?.();
133
133
  }
@@ -138,7 +138,7 @@ function ConnectionProvider({
138
138
  setStatus("disconnected");
139
139
  setError(null);
140
140
  }, [arbi, mode, config.apiUrl]);
141
- const setWorkspace = react$1.useCallback(
141
+ const setWorkspace = react.useCallback(
142
142
  async (id) => {
143
143
  if (mode === "live" && arbi.isLoggedIn) {
144
144
  await arbi.selectWorkspace(id);
@@ -148,12 +148,12 @@ function ConnectionProvider({
148
148
  },
149
149
  [arbi, mode, config.apiUrl]
150
150
  );
151
- const ensureWorkspaceOpen = react$1.useCallback(async () => {
151
+ const ensureWorkspaceOpen = react.useCallback(async () => {
152
152
  if (mode !== "live" || !arbi.isLoggedIn) return;
153
153
  const id = workspaceId ?? readPersistedWorkspace(config.apiUrl, storageUserRef.current) ?? config.workspaceId;
154
154
  if (id) await arbi.selectWorkspace(id);
155
155
  }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId]);
156
- const value = react$1.useMemo(
156
+ const value = react.useMemo(
157
157
  () => ({
158
158
  mode,
159
159
  status,
@@ -190,62 +190,15 @@ function ConnectionProvider({
190
190
  return /* @__PURE__ */ jsxRuntime.jsx(ConnectionContext.Provider, { value, children });
191
191
  }
192
192
  function useConnection() {
193
- const ctx = react$1.useContext(ConnectionContext);
193
+ const ctx = react.useContext(ConnectionContext);
194
194
  if (!ctx) throw new Error("useConnection must be used within ConnectionProvider");
195
195
  return ctx;
196
196
  }
197
197
  var isAuthenticated = (s) => s === "demo" || s === "authenticated";
198
- function useConnectedAiTask() {
199
- const { assistantConfig } = useConnection();
200
- const task = react.useAiTask();
201
- const kitRun = task.run;
202
- const run = react$1.useCallback(
203
- (question, docIds, opts) => kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),
204
- [kitRun, assistantConfig]
205
- );
206
- return { ...task, run };
207
- }
208
- function useWorkspaceDocs() {
209
- const { workspaceId, fallbackWorkspaceId } = useConnection();
210
- return react.useWorkspaceDocs(workspaceId ?? fallbackWorkspaceId);
211
- }
212
- function useSemanticSearch() {
213
- const { docIds } = useWorkspaceDocs();
214
- return react.useSemanticSearch(docIds);
215
- }
216
- function useConnectedChat(options) {
217
- const { workspaceId, fallbackWorkspaceId, assistantConfig } = useConnection();
218
- return react.useArbiChat({
219
- ...options,
220
- workspaceId: workspaceId ?? fallbackWorkspaceId,
221
- model: options?.model ?? assistantConfig
222
- });
223
- }
224
- function ConnectedAssistantDock(props) {
225
- const chat = useConnectedChat();
226
- return /* @__PURE__ */ jsxRuntime.jsx(chunkPRVKJ5XL_cjs.AssistantDock, { ...props, chat });
227
- }
228
198
 
229
- Object.defineProperty(exports, "redlineStats", {
230
- enumerable: true,
231
- get: function () { return react.redlineStats; }
232
- });
233
- Object.defineProperty(exports, "textToArtifact", {
234
- enumerable: true,
235
- get: function () { return react.textToArtifact; }
236
- });
237
- Object.defineProperty(exports, "toRedlineMarkdown", {
238
- enumerable: true,
239
- get: function () { return react.toRedlineMarkdown; }
240
- });
241
- exports.ConnectedAssistantDock = ConnectedAssistantDock;
242
199
  exports.ConnectionProvider = ConnectionProvider;
243
200
  exports.SESSION_EXPIRED_MESSAGE = SESSION_EXPIRED_MESSAGE;
244
201
  exports.isAuthenticated = isAuthenticated;
245
- exports.useConnectedAiTask = useConnectedAiTask;
246
- exports.useConnectedChat = useConnectedChat;
247
202
  exports.useConnection = useConnection;
248
- exports.useSemanticSearch = useSemanticSearch;
249
- exports.useWorkspaceDocs = useWorkspaceDocs;
250
- //# sourceMappingURL=chunk-ZPOLKYR2.cjs.map
251
- //# sourceMappingURL=chunk-ZPOLKYR2.cjs.map
203
+ //# sourceMappingURL=chunk-JCVZKCXC.cjs.map
204
+ //# sourceMappingURL=chunk-JCVZKCXC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection/ConnectionProvider.tsx"],"names":["createContext","useArbi","useState","useRef","useEffect","useCallback","useMemo","jsx","useContext"],"mappings":"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","file":"chunk-JCVZKCXC.cjs","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"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { PasswordStrengthInput } from './chunk-VILAPTCB.js';
3
- import { useRestoreFocus } from './chunk-TJMKFY5P.js';
4
3
  import { formatCount } from './chunk-OXF2IFXG.js';
4
+ import { useRestoreFocus } from './chunk-TJMKFY5P.js';
5
5
  import { testIdOr, prefixedTestId } from './chunk-7F6CBP3Z.js';
6
6
  import { useMemo, useRef, useId, useState } from 'react';
7
7
  import { Loader2, Camera, ChevronRight, ChevronDown, Check, Pencil, Mail, CheckCircle2, AlertCircle, Radio, AlertTriangle, LogOut } from 'lucide-react';
@@ -1152,5 +1152,5 @@ function toNotificationCategories(checked, defs = EMAIL_NOTIFICATION_CATEGORIES)
1152
1152
  }
1153
1153
 
1154
1154
  export { ActiveSessionsDialog, AvatarPicker, DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, DEFAULT_AVATAR_PICKER_LABELS, DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, DEFAULT_LOGOUT_DIALOG_LABELS, DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, DEFAULT_PROFILE_CARD_LABELS, DEFAULT_SETTINGS_DANGER_ZONE_LABELS, DeleteAccountDialog, EMAIL_NOTIFICATION_CATEGORIES, EMAIL_NOTIFICATION_KEYS, LogoutDialog, NotificationCategoryList, PasswordChangeDialog, ProfileCard, SettingsActionRow, SettingsCard, SettingsDangerZone, SettingsPanel, SettingsRow, SettingsSection, SettingsSwitchGroup, SettingsSwitchRow, formatSessionTtl, toActiveSessionViews, toDeleteBlockerViews, toLogoutSessionViews, toNotificationCategories };
1155
- //# sourceMappingURL=chunk-557EU3G4.js.map
1156
- //# sourceMappingURL=chunk-557EU3G4.js.map
1155
+ //# sourceMappingURL=chunk-JLOYWXRB.js.map
1156
+ //# sourceMappingURL=chunk-JLOYWXRB.js.map