@arbidocs/blocks 0.4.78 → 0.4.80

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 (83) hide show
  1. package/dist/agents/index.cjs +281 -281
  2. package/dist/agents/index.js +6 -6
  3. package/dist/agents/workflows/StepBarFrame.d.ts +8 -2
  4. package/dist/agents/workflows/stepWindow.d.ts +7 -0
  5. package/dist/chat/index.cjs +125 -125
  6. package/dist/chat/index.js +3 -3
  7. package/dist/{chunk-VFIZYSZB.cjs → chunk-2FEQGDW2.cjs} +28 -12
  8. package/dist/chunk-2FEQGDW2.cjs.map +1 -0
  9. package/dist/{chunk-5OC5CGYX.js → chunk-A5WCK6ZG.js} +8 -8
  10. package/dist/chunk-A5WCK6ZG.js.map +1 -0
  11. package/dist/{chunk-IF6VAYIA.cjs → chunk-C3DRLFU7.cjs} +5 -5
  12. package/dist/{chunk-IF6VAYIA.cjs.map → chunk-C3DRLFU7.cjs.map} +1 -1
  13. package/dist/{chunk-GJV2G4FC.js → chunk-E367ZUHE.js} +3 -3
  14. package/dist/{chunk-GJV2G4FC.js.map → chunk-E367ZUHE.js.map} +1 -1
  15. package/dist/{chunk-XMBYDLZQ.cjs → chunk-HUJLKDWX.cjs} +4 -4
  16. package/dist/{chunk-XMBYDLZQ.cjs.map → chunk-HUJLKDWX.cjs.map} +1 -1
  17. package/dist/{chunk-ICBAFX5B.js → chunk-LBE36YNZ.js} +3 -3
  18. package/dist/{chunk-ICBAFX5B.js.map → chunk-LBE36YNZ.js.map} +1 -1
  19. package/dist/{chunk-SSDISIDW.cjs → chunk-LGDX34UR.cjs} +45 -45
  20. package/dist/chunk-LGDX34UR.cjs.map +1 -0
  21. package/dist/{chunk-B3WCKBJ7.cjs → chunk-MFDGNUKX.cjs} +3 -3
  22. package/dist/{chunk-B3WCKBJ7.cjs.map → chunk-MFDGNUKX.cjs.map} +1 -1
  23. package/dist/{chunk-MP6FK43E.cjs → chunk-O5NDG4EA.cjs} +3 -3
  24. package/dist/{chunk-MP6FK43E.cjs.map → chunk-O5NDG4EA.cjs.map} +1 -1
  25. package/dist/{chunk-DDF5GPIJ.js → chunk-P5ST47VY.js} +3 -3
  26. package/dist/{chunk-DDF5GPIJ.js.map → chunk-P5ST47VY.js.map} +1 -1
  27. package/dist/{chunk-EWSEQEPL.js → chunk-PFA43QNX.js} +3 -3
  28. package/dist/{chunk-EWSEQEPL.js.map → chunk-PFA43QNX.js.map} +1 -1
  29. package/dist/{chunk-WXRCMIAE.js → chunk-QFA3NCWL.js} +27 -13
  30. package/dist/chunk-QFA3NCWL.js.map +1 -0
  31. package/dist/{chunk-CWAZNXC5.js → chunk-SWSVPQNB.js} +30 -8
  32. package/dist/chunk-SWSVPQNB.js.map +1 -0
  33. package/dist/{chunk-MLAHDAN5.cjs → chunk-UA2AMDR6.cjs} +30 -8
  34. package/dist/chunk-UA2AMDR6.cjs.map +1 -0
  35. package/dist/{chunk-XQDM6T6C.js → chunk-WDD255XQ.js} +3 -3
  36. package/dist/{chunk-XQDM6T6C.js.map → chunk-WDD255XQ.js.map} +1 -1
  37. package/dist/{chunk-Z5VUZ6YD.cjs → chunk-ZV3BKLFY.cjs} +3 -3
  38. package/dist/{chunk-Z5VUZ6YD.cjs.map → chunk-ZV3BKLFY.cjs.map} +1 -1
  39. package/dist/connect/index.cjs +68 -64
  40. package/dist/connect/index.cjs.map +1 -1
  41. package/dist/connect/index.d.ts +1 -1
  42. package/dist/connect/index.js +18 -14
  43. package/dist/connect/index.js.map +1 -1
  44. package/dist/connection/ConnectedWorkflowRunner.d.ts +16 -1
  45. package/dist/databases/ColumnConfigFields.d.ts +68 -0
  46. package/dist/databases/DatabaseColumnDialog.d.ts +27 -2
  47. package/dist/databases/DatabaseTable.d.ts +8 -1
  48. package/dist/databases/PickCellEditor.d.ts +21 -0
  49. package/dist/databases/column-types.d.ts +73 -9
  50. package/dist/databases/databaseColumns.d.ts +4 -0
  51. package/dist/databases/index.cjs +758 -27
  52. package/dist/databases/index.cjs.map +1 -1
  53. package/dist/databases/index.d.ts +4 -1
  54. package/dist/databases/index.js +745 -31
  55. package/dist/databases/index.js.map +1 -1
  56. package/dist/databases/linkCells.d.ts +48 -0
  57. package/dist/facts/index.cjs +1 -1
  58. package/dist/facts/index.js +1 -1
  59. package/dist/files/index.cjs +2 -2
  60. package/dist/files/index.js +2 -2
  61. package/dist/home/index.cjs +17 -17
  62. package/dist/home/index.js +3 -3
  63. package/dist/index.cjs +513 -513
  64. package/dist/index.js +11 -11
  65. package/dist/retrieval/index.cjs +1 -1
  66. package/dist/retrieval/index.js +1 -1
  67. package/dist/settings/index.cjs +35 -35
  68. package/dist/settings/index.js +2 -2
  69. package/dist/shell/index.cjs +1 -1
  70. package/dist/shell/index.js +1 -1
  71. package/dist/studio/index.cjs +4 -4
  72. package/dist/studio/index.js +3 -3
  73. package/dist/workflow-canvas/index.cjs +49 -49
  74. package/dist/workflow-canvas/index.js +6 -6
  75. package/dist/workspaces/index.cjs +2 -2
  76. package/dist/workspaces/index.js +2 -2
  77. package/package.json +4 -4
  78. package/dist/chunk-5OC5CGYX.js.map +0 -1
  79. package/dist/chunk-CWAZNXC5.js.map +0 -1
  80. package/dist/chunk-MLAHDAN5.cjs.map +0 -1
  81. package/dist/chunk-SSDISIDW.cjs.map +0 -1
  82. package/dist/chunk-VFIZYSZB.cjs.map +0 -1
  83. package/dist/chunk-WXRCMIAE.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagMatrix.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/ConnectedSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["jsx","useState","jsxs","Button","useConversations","useEffect","useArbi","useMemo","useDocuments","useRef","useCallback","files","Loader2","Fragment","useWorkspaceUsers","id","notify","useWorkspaces","useNotify","useArbiChat"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label } from '@arbidocs/react/ui'\n\n/** Import a main skill file; uploaded skills appear in the shared skill launcher. */\nexport function ConnectedSkillUpload() {\n const [name, setName] = useState('')\n const [file, setFile] = useState<File | null>(null)\n const upload = useUploadSkillFiles()\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return (\n <section className=\"space-y-3 rounded-lg border p-4\" data-testid=\"skill-upload\">\n <h2 className=\"text-sm font-semibold\">Add a skill</h2>\n <p className=\"text-xs text-muted-foreground\">\n Upload a SKILL.md file containing the instructions your assistant should follow.\n </p>\n <Label htmlFor=\"skill-upload-name\">Skill name</Label>\n <Input\n id=\"skill-upload-name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"disclosure-review\"\n data-testid=\"skill-upload-name\"\n />\n <Input\n type=\"file\"\n accept=\".md\"\n aria-label=\"Skill instructions file\"\n onChange={(event) => setFile(event.target.files?.[0] ?? null)}\n data-testid=\"skill-upload-file\"\n />\n <Button\n disabled={!slug || !file || upload.isPending}\n onClick={() =>\n file && upload.mutate([{ folder: `skills/${slug}`, fileName: 'SKILL.md', content: file }])\n }\n data-testid=\"skill-upload-submit\"\n >\n {upload.isPending ? 'Uploading…' : 'Upload skill'}\n </Button>\n {upload.isSuccess && (\n <p role=\"status\" className=\"text-sm\">\n Uploaded. The skill will appear once processing finishes.\n </p>\n )}\n {upload.error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {upload.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /** An existing run to show (its thread). Absent: a new run starts when its first step is done. */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, status } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n let id = threadId\n if (!id) {\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n id = created.external_id\n setThreadId(id)\n setLocalStates((s) => ({ ...s, [step.id]: { status: 'done' } }))\n options.onStarted?.(id)\n }\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, ensureWorkspaceOpen, createWork, workflow, act]\n )\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step's title by id (step messages show it). */\n stepTitle?: (stepId: string) => string | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepTitle,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepTitle={stepTitle}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport { DocumentToolsProvider, useOptionalDocumentTools } from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './ConnectedNativeDocxEditor'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n wordTitle: 'Tracked changes',\n}\n\n/** The sign flow on one document version: its PDF is fetched, then the blocks sign dialog. */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnection()\n const tools = useOptionalDocumentTools()\n const { id, version } = splitDocRef(docRef)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const res = await arbi.documents.download(id, version)\n if (!res.ok) throw new Error(String(res.status))\n const blob = await res.blob()\n if (live) setPdf(blob)\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog open onOpenChange={(o) => !o && onClose()} documentId={id} pdfBlob={pdf} />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnection()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n const docs = {\n isLoading: all.isLoading,\n data: (all.data ?? []).filter((d) => documents.includes(d.external_id)),\n }\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {docs.isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 border-b border-border bg-card p-2 text-left font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th key={c.id} className=\"border-b border-border p-2 text-left font-medium\">\n {c.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {(docs.data ?? []).map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 max-w-56 border-b border-border bg-card p-2 align-top\">\n <Cell onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </Cell>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"max-w-72 border-b border-border p-2 align-top text-muted-foreground\"\n >\n <span className=\"line-clamp-4 whitespace-pre-line\">\n {note || labels.empty}\n </span>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\nfunction Cell({ onClick, children }: { onClick?: () => void; children: ReactNode }) {\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"truncate text-left font-medium text-primary hover:underline\"\n >\n {children}\n </button>\n ) : (\n <span className=\"truncate font-medium\">{children}</span>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /** Open a document (a version: `version`): the host navigates. Absent: no document links. */\n onOpenDocument?: (documentId: string, version?: number) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n}\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, user } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const { data: docs = [], refetch } = useDocuments(wsId)\n const [uploading, setUploading] = useState(false)\n // The files added on each upload step in this run (doc id -> step id).\n const [added, setAdded] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: user?.externalId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [user?.externalId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n const onUpload = useCallback(\n async (files: File[], step: WorkflowUploadStep) => {\n if (!files.length) return\n setUploading(true)\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n for (const f of files) {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(f, f.name)) ?? {}\n setAdded((a) => ({ ...a, ...Object.fromEntries(doc_ext_ids.map((id) => [id, step.id])) }))\n }\n await refetch()\n } finally {\n setUploading(false)\n }\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n\n const files = docs.map((d): WorkflowRunnerFile => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n }))\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={uploading}\n files={files}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepTitle={(id) => view.steps.find((s) => s.id === id)?.title}\n targetMessageId={target}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { status, user, ensureWorkspaceOpen } = useConnection()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id &&\n !m.user.external_id.startsWith('agt-') &&\n m.user.external_id !== user?.externalId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagMatrix` bound to the connection: a parent label's children from `useTagMatrix`, cells saved\n * with `useUpdateTagFields`, \"Add row\" creating a child label, the workspace's people for person\n * columns, and the export filed in the workspace as a Markdown document (its id goes to\n * `onExported`, so a host can open it or send it for signature).\n */\n\nimport { useState } from 'react'\nimport {\n useArbi,\n useInvalidateTagData,\n useTagMatrix,\n useUpdateTagFields,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagMatrix, type TagMatrixProps } from '../tags/TagMatrix'\nimport { tagMatrixMarkdown } from '../tags/tagMatrixModel'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedTagMatrixProps extends Pick<\n TagMatrixProps,\n 'onOpenDocument' | 'onOpenFact' | 'onOpenRow' | 'actions' | 'labels' | 'className' | 'testId'\n> {\n /** The parent label whose children are the rows (`tag-…`). */\n parentId: string\n /** How many documents and facts each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the parent label's name. */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Read only: no cell edits, no \"Add row\". */\n readOnly?: boolean\n}\n\nexport function ConnectedTagMatrix({\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n readOnly,\n ...props\n}: ConnectedTagMatrixProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const matrix = useTagMatrix({ parentId }, { linksLimit })\n const update = useUpdateTagFields()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n\n return (\n <div className=\"space-y-2\">\n <TagMatrix\n {...props}\n matrix={matrix.data}\n isLoading={matrix.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await update.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onAddRow={\n readOnly\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({ name, parentId })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && matrix.data\n ? async () => {\n setError(null)\n try {\n const data = matrix.data\n if (!data) return\n const title = exportTitle ?? data.parent?.name ?? 'Matrix'\n const markdown = tagMatrixMarkdown(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n await ensureWorkspaceOpen()\n const stamp = new Date().toISOString().slice(0, 10)\n const uploaded = await arbi.documents.uploadFile(\n new Blob([markdown], { type: 'text/markdown' }),\n `${title} (${stamp}).md`\n )\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","/**\n * The account area of a settings page, bound to the ARBI SDK: each section is a blocks part wired\n * to its `@arbidocs/react` hook, so a host drops them in a `SettingsPanel` and owns only the\n * layout (see the \"Settings page recipe\" in docs/design/blocks-package.md).\n *\n * Every section takes an optional `notify` for toasts and renders the default test ids of its\n * part. Anything the hooks cannot know (the recovery-key download, the billing link of a blocked\n * deletion, the password policy) is a prop.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useLogoutAllSessions,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useTerminateSession,\n useUpdateProfile,\n useWorkspaces,\n type AvatarFileProblem,\n type PasswordChangeResult,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport {\n EMAIL_NOTIFICATION_CATEGORIES,\n EMAIL_NOTIFICATION_KEYS,\n toActiveSessionViews,\n toDeleteBlockerViews,\n toLogoutSessionViews,\n toNotificationCategories,\n type EmailNotificationCategoryDef,\n} from '../settings/account-views'\nimport { useConnection } from './ConnectionProvider'\n\nexport type SettingsNotify = (message: string, kind: 'success' | 'error') => void\n\n/** The error text of a failed call: the backend `detail` when it sent one. */\nfunction errorText(error: unknown, fallback: string): string {\n const body = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n return typeof body?.detail === 'string' ? body.detail : fallback\n}\n\nconst AVATAR_PROBLEMS: Record<AvatarFileProblem, string> = {\n 'not-image': 'Please choose an image file',\n 'too-large': 'Image must be 5 MB or smaller',\n unreadable: \"Couldn't read that image — try a different file\",\n}\n\n// ── Profile ─────────────────────────────────────────────────────────────────\n\nexport interface ConnectedProfileCardProps {\n notify?: SettingsNotify\n /** Section heading; default `Profile`. */\n title?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({ notify, title = 'Profile' }: ConnectedProfileCardProps) {\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n const { user } = useConnection()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify?.('Name updated', 'success')\n } catch (e) {\n notify?.('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify?.('Profile picture updated', 'success')\n } catch (e) {\n notify?.('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify?.(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify?.('Verification code sent to your new email', 'success')\n } catch (e) {\n notify?.(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify?.('Email address updated', 'success')\n } catch (e) {\n notify?.(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || user?.name || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture ?? user?.picture}\n initials={initials(display)}\n fallbackClassName=\"bg-primary text-primary-foreground\"\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? user?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n notify?: SettingsNotify\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The ID check card and its dialog, bound to the SDK. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n notify,\n labels,\n}: ConnectedIdentityVerificationProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n onVerifiedChange: (verified) =>\n notify?.(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify?.('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedSecuritySectionProps {\n notify?: SettingsNotify\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** The recovery-key download for the key the new password produced (shown on success). */\n renderRecoveryKey?: (result: PasswordChangeResult) => ReactNode\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it (`PasswordChangeDialog`). */\nexport function ConnectedSecuritySection({\n notify,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n renderRecoveryKey,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n const change = usePasswordChange()\n // Only workspaces the user belongs to are re-keyed.\n const { data: workspaces } = useWorkspaces({ enabled: open })\n const workspaceCount = (workspaces ?? []).filter((w) => w.is_member).length\n const form = usePasswordChangeForm<PasswordChangeResult>({\n getUnmetRequirement,\n submit: async (vars) => {\n const result = await change.mutateAsync(vars)\n notify?.('Password changed successfully', 'success')\n return result\n },\n onClose: () => setOpen(false),\n })\n\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to encrypt your data. Changing it re-encrypts everything in your account.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={false}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n workspaceCount={workspaceCount}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n success={form.result ? (renderRecoveryKey?.(form.result) ?? <></>) : null}\n onDone={form.onDone}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n notify?: SettingsNotify\n /** Ask before ending a session; resolve `false` to cancel. Default: end at once. */\n confirm?: (message: string) => Promise<boolean> | boolean\n /** Glyph per session status. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({\n notify,\n confirm,\n renderSessionIcon,\n}: ConnectedSessionsRowProps) {\n const [open, setOpen] = useState(false)\n const sessions = useSessions({ enabled: open })\n const currentSessionId = useCurrentSessionId()\n const terminate = useTerminateSession()\n const views = toActiveSessionViews(sessions.data ?? [], {\n currentSessionId,\n terminatingId: terminate.isPending ? terminate.variables : null,\n renderIcon: renderSessionIcon,\n })\n return (\n <>\n <SettingsRow\n label=\"Active sessions\"\n description=\"Devices and agents currently signed in to your account.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"flex items-center gap-2\"\n data-testid=\"active-sessions-button\"\n >\n <Radio className=\"h-4 w-4\" />\n Manage\n </Button>\n </SettingsRow>\n <ActiveSessionsDialog\n open={open}\n onOpenChange={setOpen}\n isLoading={sessions.isLoading}\n sessions={views}\n onTerminate={(id) => {\n void (async () => {\n const view = views.find((v) => v.id === id)\n const label = view?.detail.split(' · ')[0]\n const ok =\n (await confirm?.(\n `End the session on ${label}? It will be signed out immediately.`\n )) ?? true\n if (!ok) return\n try {\n await terminate.mutateAsync(id)\n } catch {\n notify?.('Failed to end session. Please try again.', 'error')\n }\n })()\n }}\n />\n </>\n )\n}\n\nexport interface ConnectedLogoutDialogProps {\n open: boolean\n onClose: () => void\n isOnline?: boolean\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** Sign out of this device or all devices (`LogoutDialog`), listing the active sessions. */\nexport function ConnectedLogoutDialog({\n open,\n onClose,\n isOnline = true,\n renderSessionIcon,\n}: ConnectedLogoutDialogProps) {\n const { logout } = useConnection()\n const sessions = useSessions({ enabled: open })\n const logoutAll = useLogoutAllSessions()\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => {\n onClose()\n logout()\n }}\n onLogoutAll={() => {\n onClose()\n // The server drops every session first; the connection then forgets this one.\n void logoutAll.mutateAsync().finally(logout)\n }}\n canLogoutAll\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n notify?: SettingsNotify\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ notify, renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { user, logout } = useConnection()\n const remove = useDeleteAccount()\n const flow = useDeleteAccountFlow({\n userEmail: user?.email ?? '',\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: logout,\n onError: () => notify?.('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!user?.email}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={user?.email ?? ''}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket, notify, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list('docx_mention'),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify.error(\n error instanceof Error ? error.message : 'Could not open the document.'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify.error('Could not mark document mentions read.')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { useWorkNotifications, notify, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify.error(\n error instanceof Error ? error.message : 'Could not open this notification.'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify.error('Could not mark work notifications read.')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a task`,\n conversation_ready: `${sender} has a task ready`,\n conversation_done: `${sender} marked a task done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n const chat = useArbiChat({ agentId, workspaceId })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagMatrix.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/ConnectedSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["jsx","useState","jsxs","Button","useConversations","useEffect","useArbi","useMemo","useDocuments","useRef","useCallback","files","Loader2","Fragment","useWorkspaceUsers","id","notify","useWorkspaces","useNotify","useArbiChat"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label } from '@arbidocs/react/ui'\n\n/** Import a main skill file; uploaded skills appear in the shared skill launcher. */\nexport function ConnectedSkillUpload() {\n const [name, setName] = useState('')\n const [file, setFile] = useState<File | null>(null)\n const upload = useUploadSkillFiles()\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return (\n <section className=\"space-y-3 rounded-lg border p-4\" data-testid=\"skill-upload\">\n <h2 className=\"text-sm font-semibold\">Add a skill</h2>\n <p className=\"text-xs text-muted-foreground\">\n Upload a SKILL.md file containing the instructions your assistant should follow.\n </p>\n <Label htmlFor=\"skill-upload-name\">Skill name</Label>\n <Input\n id=\"skill-upload-name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"disclosure-review\"\n data-testid=\"skill-upload-name\"\n />\n <Input\n type=\"file\"\n accept=\".md\"\n aria-label=\"Skill instructions file\"\n onChange={(event) => setFile(event.target.files?.[0] ?? null)}\n data-testid=\"skill-upload-file\"\n />\n <Button\n disabled={!slug || !file || upload.isPending}\n onClick={() =>\n file && upload.mutate([{ folder: `skills/${slug}`, fileName: 'SKILL.md', content: file }])\n }\n data-testid=\"skill-upload-submit\"\n >\n {upload.isPending ? 'Uploading…' : 'Upload skill'}\n </Button>\n {upload.isSuccess && (\n <p role=\"status\" className=\"text-sm\">\n Uploaded. The skill will appear once processing finishes.\n </p>\n )}\n {upload.error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {upload.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /** An existing run to show (its thread). Absent: a new run starts when its first step is done. */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, status } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n let id = threadId\n if (!id) {\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n id = created.external_id\n setThreadId(id)\n setLocalStates((s) => ({ ...s, [step.id]: { status: 'done' } }))\n options.onStarted?.(id)\n }\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, ensureWorkspaceOpen, createWork, workflow, act]\n )\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step's title by id (step messages show it). */\n stepTitle?: (stepId: string) => string | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepTitle,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepTitle={stepTitle}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport { DocumentToolsProvider, useOptionalDocumentTools } from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './ConnectedNativeDocxEditor'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n wordTitle: 'Tracked changes',\n}\n\n/** The sign flow on one document version: its PDF is fetched, then the blocks sign dialog. */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnection()\n const tools = useOptionalDocumentTools()\n const { id, version } = splitDocRef(docRef)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const res = await arbi.documents.download(id, version)\n if (!res.ok) throw new Error(String(res.status))\n const blob = await res.blob()\n if (live) setPdf(blob)\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog open onOpenChange={(o) => !o && onClose()} documentId={id} pdfBlob={pdf} />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnection()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n const docs = {\n isLoading: all.isLoading,\n data: (all.data ?? []).filter((d) => documents.includes(d.external_id)),\n }\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {docs.isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 border-b border-border bg-card p-2 text-left font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th key={c.id} className=\"border-b border-border p-2 text-left font-medium\">\n {c.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {(docs.data ?? []).map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 max-w-56 border-b border-border bg-card p-2 align-top\">\n <Cell onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </Cell>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"max-w-72 border-b border-border p-2 align-top text-muted-foreground\"\n >\n <span className=\"line-clamp-4 whitespace-pre-line\">\n {note || labels.empty}\n </span>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\nfunction Cell({ onClick, children }: { onClick?: () => void; children: ReactNode }) {\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"truncate text-left font-medium text-primary hover:underline\"\n >\n {children}\n </button>\n ) : (\n <span className=\"truncate font-medium\">{children}</span>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /** Open a document (a version: `version`): the host navigates. Absent: no document links. */\n onOpenDocument?: (documentId: string, version?: number) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n /**\n * Which of the workspace's documents an upload step lists (the files \"in this matter\"): the\n * host hides what is not the matter's own, e.g. skill files kept as workspace documents —\n * `(doc) => !(doc.folder ?? '').startsWith('skills')`. Files added on the run's upload steps are\n * always listed. Absent: every document.\n */\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n}\n\n/** A workspace document, as `fileFilter` sees it. */\nexport type WorkflowRunnerDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n fileFilter,\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, user } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const { data: docs = [], refetch } = useDocuments(wsId)\n const [uploading, setUploading] = useState(false)\n // The files added on each upload step in this run (doc id -> step id).\n const [added, setAdded] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: user?.externalId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [user?.externalId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n const onUpload = useCallback(\n async (files: File[], step: WorkflowUploadStep) => {\n if (!files.length) return\n setUploading(true)\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n for (const f of files) {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(f, f.name)) ?? {}\n setAdded((a) => ({ ...a, ...Object.fromEntries(doc_ext_ids.map((id) => [id, step.id])) }))\n }\n await refetch()\n } finally {\n setUploading(false)\n }\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n\n const files = runnerFiles(docs, added, fileFilter)\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={uploading}\n files={files}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepTitle={(id) => view.steps.find((s) => s.id === id)?.title}\n targetMessageId={target}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/**\n * The upload step's files: the workspace's documents the host's `fileFilter` keeps, plus every\n * file added on one of the run's upload steps (`added`: doc id -> step id), which the step waits on.\n */\nexport function runnerFiles(\n docs: WorkflowRunnerDocument[],\n added: Record<string, string>,\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n): WorkflowRunnerFile[] {\n return docs\n .filter((d) => !fileFilter || added[d.external_id] || fileFilter(d))\n .map((d) => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n }))\n}\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { status, user, ensureWorkspaceOpen } = useConnection()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id &&\n !m.user.external_id.startsWith('agt-') &&\n m.user.external_id !== user?.externalId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagMatrix` bound to the connection: a parent label's children from `useTagMatrix`, cells saved\n * with `useUpdateTagFields`, \"Add row\" creating a child label, the workspace's people for person\n * columns, and the export filed in the workspace as a Markdown document (its id goes to\n * `onExported`, so a host can open it or send it for signature).\n */\n\nimport { useState } from 'react'\nimport {\n useArbi,\n useInvalidateTagData,\n useTagMatrix,\n useUpdateTagFields,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagMatrix, type TagMatrixProps } from '../tags/TagMatrix'\nimport { tagMatrixMarkdown } from '../tags/tagMatrixModel'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedTagMatrixProps extends Pick<\n TagMatrixProps,\n 'onOpenDocument' | 'onOpenFact' | 'onOpenRow' | 'actions' | 'labels' | 'className' | 'testId'\n> {\n /** The parent label whose children are the rows (`tag-…`). */\n parentId: string\n /** How many documents and facts each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the parent label's name. */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Read only: no cell edits, no \"Add row\". */\n readOnly?: boolean\n}\n\nexport function ConnectedTagMatrix({\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n readOnly,\n ...props\n}: ConnectedTagMatrixProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const matrix = useTagMatrix({ parentId }, { linksLimit })\n const update = useUpdateTagFields()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n\n return (\n <div className=\"space-y-2\">\n <TagMatrix\n {...props}\n matrix={matrix.data}\n isLoading={matrix.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await update.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onAddRow={\n readOnly\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({ name, parentId })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && matrix.data\n ? async () => {\n setError(null)\n try {\n const data = matrix.data\n if (!data) return\n const title = exportTitle ?? data.parent?.name ?? 'Matrix'\n const markdown = tagMatrixMarkdown(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n await ensureWorkspaceOpen()\n const stamp = new Date().toISOString().slice(0, 10)\n const uploaded = await arbi.documents.uploadFile(\n new Blob([markdown], { type: 'text/markdown' }),\n `${title} (${stamp}).md`\n )\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","/**\n * The account area of a settings page, bound to the ARBI SDK: each section is a blocks part wired\n * to its `@arbidocs/react` hook, so a host drops them in a `SettingsPanel` and owns only the\n * layout (see the \"Settings page recipe\" in docs/design/blocks-package.md).\n *\n * Every section takes an optional `notify` for toasts and renders the default test ids of its\n * part. Anything the hooks cannot know (the recovery-key download, the billing link of a blocked\n * deletion, the password policy) is a prop.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useLogoutAllSessions,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useTerminateSession,\n useUpdateProfile,\n useWorkspaces,\n type AvatarFileProblem,\n type PasswordChangeResult,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport {\n EMAIL_NOTIFICATION_CATEGORIES,\n EMAIL_NOTIFICATION_KEYS,\n toActiveSessionViews,\n toDeleteBlockerViews,\n toLogoutSessionViews,\n toNotificationCategories,\n type EmailNotificationCategoryDef,\n} from '../settings/account-views'\nimport { useConnection } from './ConnectionProvider'\n\nexport type SettingsNotify = (message: string, kind: 'success' | 'error') => void\n\n/** The error text of a failed call: the backend `detail` when it sent one. */\nfunction errorText(error: unknown, fallback: string): string {\n const body = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n return typeof body?.detail === 'string' ? body.detail : fallback\n}\n\nconst AVATAR_PROBLEMS: Record<AvatarFileProblem, string> = {\n 'not-image': 'Please choose an image file',\n 'too-large': 'Image must be 5 MB or smaller',\n unreadable: \"Couldn't read that image — try a different file\",\n}\n\n// ── Profile ─────────────────────────────────────────────────────────────────\n\nexport interface ConnectedProfileCardProps {\n notify?: SettingsNotify\n /** Section heading; default `Profile`. */\n title?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({ notify, title = 'Profile' }: ConnectedProfileCardProps) {\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n const { user } = useConnection()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify?.('Name updated', 'success')\n } catch (e) {\n notify?.('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify?.('Profile picture updated', 'success')\n } catch (e) {\n notify?.('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify?.(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify?.('Verification code sent to your new email', 'success')\n } catch (e) {\n notify?.(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify?.('Email address updated', 'success')\n } catch (e) {\n notify?.(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || user?.name || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture ?? user?.picture}\n initials={initials(display)}\n fallbackClassName=\"bg-primary text-primary-foreground\"\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? user?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n notify?: SettingsNotify\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The ID check card and its dialog, bound to the SDK. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n notify,\n labels,\n}: ConnectedIdentityVerificationProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n onVerifiedChange: (verified) =>\n notify?.(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify?.('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedSecuritySectionProps {\n notify?: SettingsNotify\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** The recovery-key download for the key the new password produced (shown on success). */\n renderRecoveryKey?: (result: PasswordChangeResult) => ReactNode\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it (`PasswordChangeDialog`). */\nexport function ConnectedSecuritySection({\n notify,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n renderRecoveryKey,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n const change = usePasswordChange()\n // Only workspaces the user belongs to are re-keyed.\n const { data: workspaces } = useWorkspaces({ enabled: open })\n const workspaceCount = (workspaces ?? []).filter((w) => w.is_member).length\n const form = usePasswordChangeForm<PasswordChangeResult>({\n getUnmetRequirement,\n submit: async (vars) => {\n const result = await change.mutateAsync(vars)\n notify?.('Password changed successfully', 'success')\n return result\n },\n onClose: () => setOpen(false),\n })\n\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to encrypt your data. Changing it re-encrypts everything in your account.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={false}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n workspaceCount={workspaceCount}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n success={form.result ? (renderRecoveryKey?.(form.result) ?? <></>) : null}\n onDone={form.onDone}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n notify?: SettingsNotify\n /** Ask before ending a session; resolve `false` to cancel. Default: end at once. */\n confirm?: (message: string) => Promise<boolean> | boolean\n /** Glyph per session status. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({\n notify,\n confirm,\n renderSessionIcon,\n}: ConnectedSessionsRowProps) {\n const [open, setOpen] = useState(false)\n const sessions = useSessions({ enabled: open })\n const currentSessionId = useCurrentSessionId()\n const terminate = useTerminateSession()\n const views = toActiveSessionViews(sessions.data ?? [], {\n currentSessionId,\n terminatingId: terminate.isPending ? terminate.variables : null,\n renderIcon: renderSessionIcon,\n })\n return (\n <>\n <SettingsRow\n label=\"Active sessions\"\n description=\"Devices and agents currently signed in to your account.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"flex items-center gap-2\"\n data-testid=\"active-sessions-button\"\n >\n <Radio className=\"h-4 w-4\" />\n Manage\n </Button>\n </SettingsRow>\n <ActiveSessionsDialog\n open={open}\n onOpenChange={setOpen}\n isLoading={sessions.isLoading}\n sessions={views}\n onTerminate={(id) => {\n void (async () => {\n const view = views.find((v) => v.id === id)\n const label = view?.detail.split(' · ')[0]\n const ok =\n (await confirm?.(\n `End the session on ${label}? It will be signed out immediately.`\n )) ?? true\n if (!ok) return\n try {\n await terminate.mutateAsync(id)\n } catch {\n notify?.('Failed to end session. Please try again.', 'error')\n }\n })()\n }}\n />\n </>\n )\n}\n\nexport interface ConnectedLogoutDialogProps {\n open: boolean\n onClose: () => void\n isOnline?: boolean\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** Sign out of this device or all devices (`LogoutDialog`), listing the active sessions. */\nexport function ConnectedLogoutDialog({\n open,\n onClose,\n isOnline = true,\n renderSessionIcon,\n}: ConnectedLogoutDialogProps) {\n const { logout } = useConnection()\n const sessions = useSessions({ enabled: open })\n const logoutAll = useLogoutAllSessions()\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => {\n onClose()\n logout()\n }}\n onLogoutAll={() => {\n onClose()\n // The server drops every session first; the connection then forgets this one.\n void logoutAll.mutateAsync().finally(logout)\n }}\n canLogoutAll\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n notify?: SettingsNotify\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ notify, renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { user, logout } = useConnection()\n const remove = useDeleteAccount()\n const flow = useDeleteAccountFlow({\n userEmail: user?.email ?? '',\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: logout,\n onError: () => notify?.('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!user?.email}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={user?.email ?? ''}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket, notify, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list('docx_mention'),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify.error(\n error instanceof Error ? error.message : 'Could not open the document.'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify.error('Could not mark document mentions read.')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { useWorkNotifications, notify, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify.error(\n error instanceof Error ? error.message : 'Could not open this notification.'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify.error('Could not mark work notifications read.')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a task`,\n conversation_ready: `${sender} has a task ready`,\n conversation_done: `${sender} marked a task done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n const chat = useArbiChat({ agentId, workspaceId })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}