@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.
- package/dist/agents/definitions/AgentCard.d.ts +4 -1
- package/dist/agents/index.cjs +211 -211
- package/dist/agents/index.js +5 -5
- package/dist/chat/ChatPage.d.ts +1 -1
- package/dist/chat/chat-page-types.d.ts +2 -0
- package/dist/chat/index.cjs +169 -168
- package/dist/chat/index.js +3 -2
- package/dist/chunk-5TRALRWN.js +42 -0
- package/dist/chunk-5TRALRWN.js.map +1 -0
- package/dist/chunk-7UTB4PHM.cjs +300 -0
- package/dist/chunk-7UTB4PHM.cjs.map +1 -0
- package/dist/chunk-AA3PT6KR.js +286 -0
- package/dist/chunk-AA3PT6KR.js.map +1 -0
- package/dist/{chunk-QJEJBLHI.js → chunk-CQ6CYPV4.js} +7 -281
- package/dist/chunk-CQ6CYPV4.js.map +1 -0
- package/dist/chunk-EUOGPUMJ.cjs +59 -0
- package/dist/chunk-EUOGPUMJ.cjs.map +1 -0
- package/dist/{chunk-PRVKJ5XL.cjs → chunk-J22DXUJY.cjs} +4 -3
- package/dist/chunk-J22DXUJY.cjs.map +1 -0
- package/dist/{chunk-ZPOLKYR2.cjs → chunk-JCVZKCXC.cjs} +22 -69
- package/dist/chunk-JCVZKCXC.cjs.map +1 -0
- package/dist/{chunk-557EU3G4.js → chunk-JLOYWXRB.js} +3 -3
- package/dist/{chunk-557EU3G4.js.map → chunk-JLOYWXRB.js.map} +1 -1
- package/dist/{chunk-UVIOQUJA.js → chunk-JLPYOPCX.js} +4 -3
- package/dist/chunk-JLPYOPCX.js.map +1 -0
- package/dist/{chunk-4TBZRZFC.js → chunk-MLJDOH3B.js} +23 -6
- package/dist/chunk-MLJDOH3B.js.map +1 -0
- package/dist/chunk-NNH7N62N.cjs +876 -0
- package/dist/chunk-NNH7N62N.cjs.map +1 -0
- package/dist/{chunk-7Q6RBXIV.cjs → chunk-OEQXYWUO.cjs} +22 -5
- package/dist/chunk-OEQXYWUO.cjs.map +1 -0
- package/dist/{chunk-J4AOAFZF.cjs → chunk-TL2DHSC5.cjs} +11 -297
- package/dist/chunk-TL2DHSC5.cjs.map +1 -0
- package/dist/chunk-UOLMFC5K.js +846 -0
- package/dist/chunk-UOLMFC5K.js.map +1 -0
- package/dist/{chunk-DCEI37AX.cjs → chunk-YVIOCITQ.cjs} +3 -3
- package/dist/{chunk-DCEI37AX.cjs.map → chunk-YVIOCITQ.cjs.map} +1 -1
- package/dist/{chunk-S74WZNK7.js → chunk-ZEIOREJY.js} +5 -36
- package/dist/chunk-ZEIOREJY.js.map +1 -0
- package/dist/connect/docx.cjs +86 -0
- package/dist/connect/docx.cjs.map +1 -0
- package/dist/connect/docx.d.ts +1 -0
- package/dist/connect/docx.js +84 -0
- package/dist/connect/docx.js.map +1 -0
- package/dist/connect/index.cjs +136 -69
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +91 -25
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedNativeDocxEditor.d.ts +5 -0
- package/dist/connection/useConnectedDocxNotifications.d.ts +9 -0
- package/dist/docx/DocxMentions.d.ts +17 -0
- package/dist/docx/NativeDocxComparison.d.ts +10 -0
- package/dist/docx/NativeDocxEditor.d.ts +50 -0
- package/dist/docx/export.d.ts +2 -0
- package/dist/docx/fonts.d.ts +2 -0
- package/dist/docx/index.cjs +116 -0
- package/dist/docx/index.cjs.map +1 -0
- package/dist/docx/index.d.ts +10 -0
- package/dist/docx/index.js +63 -0
- package/dist/docx/index.js.map +1 -0
- package/dist/docx/mentions.d.ts +8 -0
- package/dist/facts/index.cjs +1 -1
- package/dist/facts/index.js +1 -1
- package/dist/files/index.cjs +5 -5
- package/dist/files/index.js +6 -6
- package/dist/index.cjs +795 -794
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/settings/index.cjs +41 -41
- package/dist/settings/index.js +4 -4
- package/dist/shell/index.cjs +9 -9
- package/dist/shell/index.js +1 -1
- package/dist/site/index.cjs +13 -13
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +6 -5
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.js +4 -3
- package/dist/studio/index.js.map +1 -1
- package/dist/workspaces/index.cjs +2 -2
- package/dist/workspaces/index.js +2 -2
- package/package.json +48 -7
- package/src/docx/README.md +68 -0
- package/src/docx/styles.css +36 -0
- package/dist/chunk-4TBZRZFC.js.map +0 -1
- package/dist/chunk-7Q6RBXIV.cjs.map +0 -1
- package/dist/chunk-J4AOAFZF.cjs.map +0 -1
- package/dist/chunk-PRVKJ5XL.cjs.map +0 -1
- package/dist/chunk-QJEJBLHI.js.map +0 -1
- package/dist/chunk-S74WZNK7.js.map +0 -1
- package/dist/chunk-UVIOQUJA.js.map +0 -1
- package/dist/chunk-ZPOLKYR2.cjs.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
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
|
-
|
|
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
|
|
49
|
-
const [user, setUser] = react
|
|
50
|
-
const [workspaceId, setWorkspaceId] = react
|
|
51
|
-
const [mode, setMode] = react
|
|
52
|
-
const [error, setError] = react
|
|
53
|
-
const storageUserRef = react
|
|
54
|
-
react
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
249
|
-
|
|
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-
|
|
1156
|
-
//# sourceMappingURL=chunk-
|
|
1155
|
+
//# sourceMappingURL=chunk-JLOYWXRB.js.map
|
|
1156
|
+
//# sourceMappingURL=chunk-JLOYWXRB.js.map
|