@arbidocs/react 0.5.57 → 0.5.58

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 (56) hide show
  1. package/README.md +9 -0
  2. package/dist/artifacts/index.cjs +14 -14
  3. package/dist/artifacts/index.js +4 -4
  4. package/dist/calls/livekit/index.cjs +49 -49
  5. package/dist/calls/livekit/index.js +4 -4
  6. package/dist/{chunk-V64EETLS.cjs → chunk-3QK4VVPG.cjs} +4 -4
  7. package/dist/{chunk-V64EETLS.cjs.map → chunk-3QK4VVPG.cjs.map} +1 -1
  8. package/dist/{chunk-WRMA2JYX.js → chunk-7VENKMLD.js} +5 -5
  9. package/dist/{chunk-WRMA2JYX.js.map → chunk-7VENKMLD.js.map} +1 -1
  10. package/dist/{chunk-2JQ7QNOO.cjs → chunk-A675AQXL.cjs} +154 -69
  11. package/dist/chunk-A675AQXL.cjs.map +1 -0
  12. package/dist/{chunk-KUGZXI7V.js → chunk-CE4RY7VA.js} +3 -3
  13. package/dist/{chunk-KUGZXI7V.js.map → chunk-CE4RY7VA.js.map} +1 -1
  14. package/dist/{chunk-RRWAX52L.cjs → chunk-G76ASVVH.cjs} +6 -2
  15. package/dist/chunk-G76ASVVH.cjs.map +1 -0
  16. package/dist/{chunk-PVUZULHI.js → chunk-J33GSXDT.js} +92 -12
  17. package/dist/chunk-J33GSXDT.js.map +1 -0
  18. package/dist/{chunk-3CVY5SGY.cjs → chunk-JNS3BOPU.cjs} +65 -65
  19. package/dist/{chunk-3CVY5SGY.cjs.map → chunk-JNS3BOPU.cjs.map} +1 -1
  20. package/dist/{chunk-UKEUDTOE.cjs → chunk-LCSUCZVX.cjs} +46 -46
  21. package/dist/{chunk-UKEUDTOE.cjs.map → chunk-LCSUCZVX.cjs.map} +1 -1
  22. package/dist/{chunk-4TKNUJKD.js → chunk-M2SZQBCO.js} +3 -3
  23. package/dist/{chunk-4TKNUJKD.js.map → chunk-M2SZQBCO.js.map} +1 -1
  24. package/dist/{chunk-DFZECLD3.js → chunk-R7YNABZY.js} +2 -2
  25. package/dist/chunk-R7YNABZY.js.map +1 -0
  26. package/dist/{chunk-JFL7BBZ6.js → chunk-S2W3ZOWG.js} +4 -4
  27. package/dist/{chunk-JFL7BBZ6.js.map → chunk-S2W3ZOWG.js.map} +1 -1
  28. package/dist/{chunk-FSPLYO52.cjs → chunk-SOOLC65L.cjs} +3 -3
  29. package/dist/{chunk-FSPLYO52.cjs.map → chunk-SOOLC65L.cjs.map} +1 -1
  30. package/dist/{chunk-PBXJFMES.js → chunk-U64WCQP3.js} +6 -2
  31. package/dist/chunk-U64WCQP3.js.map +1 -0
  32. package/dist/{chunk-YRY6DGRU.cjs → chunk-Y7S2SQH3.cjs} +2 -2
  33. package/dist/chunk-Y7S2SQH3.cjs.map +1 -0
  34. package/dist/document-tools/index.cjs +60 -60
  35. package/dist/document-tools/index.d.cts +2 -2
  36. package/dist/document-tools/index.d.ts +2 -2
  37. package/dist/document-tools/index.js +5 -5
  38. package/dist/index.cjs +2567 -1342
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +1672 -1085
  41. package/dist/index.d.ts +1672 -1085
  42. package/dist/index.js +1226 -63
  43. package/dist/index.js.map +1 -1
  44. package/dist/{query-keys.d-DM2N5pzN.d.cts → query-keys.d-DEEMzkLz.d.cts} +4 -0
  45. package/dist/{query-keys.d-DM2N5pzN.d.ts → query-keys.d-DEEMzkLz.d.ts} +4 -0
  46. package/dist/ui/index.cjs +164 -164
  47. package/dist/ui/index.js +2 -2
  48. package/dist/viewers/index.cjs +2 -2
  49. package/dist/viewers/index.js +1 -1
  50. package/package.json +3 -3
  51. package/dist/chunk-2JQ7QNOO.cjs.map +0 -1
  52. package/dist/chunk-DFZECLD3.js.map +0 -1
  53. package/dist/chunk-PBXJFMES.js.map +0 -1
  54. package/dist/chunk-PVUZULHI.js.map +0 -1
  55. package/dist/chunk-RRWAX52L.cjs.map +0 -1
  56. package/dist/chunk-YRY6DGRU.cjs.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { b as ArbiHostConnection, H as HostConfigRecord, c as ArbiHostProps, T as ThreadBinding, e as MentionCandidate, o as SearchStatus, m as SearchSession, l as NotifyVariant, A as AppNotification } from './index.d-BLw5AN0H.js';
2
2
  export { D as DEFAULT_NOTIFY_TONE, L as LEGACY_THREAD_DOCUMENTS_KEY, M as MAX_SESSION_NOTIFICATIONS, d as MENTION_HREF_PREFIX, f as MentionKind, g as MessageMentionRef, N as NotificationBell, h as NotificationBellProps, i as NotificationBellTriggerState, j as NotifyConfig, k as NotifyOptions, O as OpenDocumentRegistration, S as SavedDocumentInput, n as SearchSessionState, p as ThreadBindingRow, q as Toaster, r as TurnDocumentInput, U as UNBOUND, W as WordDocumentKind, s as bindingOfRow, t as clearSearchSession, u as configureNotify, v as createSearchSession, w as extractMentions, x as filterMentionCandidates, y as findMentionQuery, z as forgetLegacyThreadDocuments, B as hasMessageBody, C as insertMention, E as latestThreadOfDocument, F as linkMentions, G as mentionFromHref, I as notify, J as openDocumentId, K as opensInWord, P as persistNotifyHistory, Q as persistSearchSession, R as readLegacyThreadDocuments, V as requestSearch, X as savedDocumentIdFor, Y as seedNotifications, Z as selectUnread, _ as sharedSearchSession, $ as takeDocumentForTurn, a0 as takePendingSearch, a1 as toMessageMentions, a2 as useHostConfigRecord, a3 as useNotify, a4 as useOpenDocumentId, a5 as useRegisterOpenDocument, a6 as useTurnDocumentId } from './index.d-BLw5AN0H.js';
3
3
  import * as _arbidocs_sdk_browser from '@arbidocs/sdk/browser';
4
- import { LoginProfile, Arbi, EventCreateBody, ScopedTarget, EventPatchBody, RespondParams, ArtifactEvent, MailDraftSSEEvent, QuotaExceeded, ProbeAnswerEvent, AskRequest, AgentStepEvent, ChatMessage, OutputItemDone, UserInputRequestEvent, MessageQueuedEvent, UserMessageEvent, SSEStreamStartData, MessageMetadataPayload, DeferredInterjectionEvent, AgentControlStateEvent, TokenBudgetContext, ConversationResponse, Thread, workspaces, SSEStreamResult, AskHandlers, TagListQuery, ListFactsOptions, UpdateFactRequest, StepActionRequest, UpdateConversationRequest, UpdateWorkflowRequest, DatabaseRow, tags, TagResponse, TagKind, TagKindSchema, TagChange, TagFieldDefinition, ProjectEventKind, ProjectUpdateRequest, ProjectResponse, ProjectCreateOptions, ProjectAddonKind, ProjectPlanChangeRequest, ProjectCheckoutRequest, ProjectQuoteRequest, ProjectAddonSettingsRequest, ProjectNextPeriodAddonsRequest, contacts, settings, account, ListEventsParams, CalendarWindow, OverlayLayerName, RoomCreateBody, CalendarEvent, FindTimeParams, RoomQuery, ShareRole, CalendarUpdate, OAuthAccountKind, CalendarAccount, CalDavConnectBody, calls, SearchChunk, chats, UploadDocumentsOptions, UploadResult } from '@arbidocs/sdk/browser';
4
+ import { LoginProfile, Arbi, EventCreateBody, ScopedTarget, EventPatchBody, RespondParams, ArtifactEvent, MailDraftSSEEvent, QuotaExceeded, ProbeAnswerEvent, AskRequest, AgentStepEvent, ChatMessage, OutputItemDone, UserInputRequestEvent, MessageQueuedEvent, UserMessageEvent, SSEStreamStartData, MessageMetadataPayload, DeferredInterjectionEvent, AgentControlStateEvent, TokenBudgetContext, ConversationResponse, Thread, SSEStreamResult, AskHandlers, TagListQuery, workspaces, ListFactsOptions, UpdateFactRequest, StepActionRequest, UpdateConversationRequest, UpdateWorkflowRequest, DatabaseRow, tags, TagResponse, TagKind, TagKindSchema, TagChange, TagFieldDefinition, ProjectEventKind, ProjectUpdateRequest, ProjectResponse, ProjectCreateOptions, ProjectAddonKind, ProjectPlanChangeRequest, ProjectCheckoutRequest, ProjectQuoteRequest, ProjectAddonSettingsRequest, ProjectNextPeriodAddonsRequest, contacts, settings, account, ListEventsParams, CalendarWindow, OverlayLayerName, RoomCreateBody, CalendarEvent, FindTimeParams, RoomQuery, ShareRole, CalendarUpdate, OAuthAccountKind, CalendarAccount, CalDavConnectBody, calls, SearchChunk, chats, UploadDocumentsOptions, UploadResult } from '@arbidocs/sdk/browser';
5
5
  export { ACCOUNT_VENDOR, AccountSyncResult, ActivityKind, ActivityResponse, AgentStepEvent, Arbi, ArbiError, ArbiOptions, ArtifactEvent, AskHandlers, AskRequest, AttendeeRead, AuthMode, BookingConfirmation, BookingPage, BookingPageWriteBody, BookingRequestBody, BridgeTokensOptions, CalDavConnectBody, CalDavProfile, CalendarAccount, CalendarAccountKind, CalendarCreateBody, CalendarEvent, CalendarRead, CalendarSettings, CalendarSettingsBody, CalendarUpdate, CalendarWindow, ConnectorCatalogEntry, ConnectorFolder, ConnectorSyncProgress, ConnectorSyncStatus, ConnectorVendorKey, ConnectorVisibilitySettings, ConversationResponse, CreateFactRequest, CreateWorkRequest, CreateWorkflowRequest, DEFAULT_AI_USD_PER_GBP, DRIVE_SYNC_VENDORS, Database, DatabaseColumn, DatabaseColumnWrite, DatabaseImportResult, DatabaseRow, DatabaseRowPage, DateTimeSpec, DriveSyncProgress, DriveSyncSummary, EditScope, EventCreateBody, EventPatchBody, FactResponse, FactSearchRequest, FactSearchResponse, FindTimeParams, FreeBusyEntry, GOOGLE_VENDORS, HolidayCountry, IMANAGE_VENDORS, ImportResult, InvitationRead, ListEventsParams, LoginProfile, MAILBOX_SYNC_VENDORS, MAX_RETRIEVE_DOC_IDS, MICROSOFT_VENDORS, MessageMetadataPayload, OAuthAccountKind, OutputTokensDetails, OverlayItem, OverlayLayerName, PendingAuthResponse, PersonKey, PlanWorkRequest, ProductResponse, ProjectAddonKind, ProjectCheckoutRequest, ProjectInvoicesResponse, ProjectPlanChangeRequest, ProjectQuoteRequest, ProjectResponse, ProjectUsageResponse, PublicBookingError, PublicBookingPage, RespondParams, RespondPartstat, ResponseCompletedEvent, ResponseContentPartAddedEvent, ResponseCreatedEvent, ResponseFailedEvent, ResponseOutputItemAddedEvent, ResponseOutputItemDoneEvent, ResponseOutputTextDeltaEvent, ResponseOutputTextDoneEvent, ResponseUsage, RoomCreateBody, RoomQuery, RoomRead, SHAREPOINT_VENDORS, SSEStreamCallbacks, SSEStreamResult, SSEStreamStartData, ScopedTarget, SearchChunk, ShareRead, ShareRole, SkillSummary, SlackConnectionStatus, SubscribeParams, SyncTriggerResult, TaskPlan, TaxQuoteResponse, TimeSuggestion, UpdateConversationRequest, UpdateWorkflowRequest, UserConnectorEntry, UserDailyUsageResponse, UserInputRequestEvent, UserMessageEvent, WeeklyHoursSpec, WorkStatus, WorkflowAuthMode, WorkflowResponse, WorkflowRunResponse, bookPublicSlot, cancelPublicBooking, connectErrorMessage, formatGbp, formatGbpPerMillionTokens, getPublicBookingPage, isConnectorVendorVisible, isDriveSyncVendor, isMailboxSyncVendor, isSharePointVendor, usdToGbp } from '@arbidocs/sdk/browser';
6
6
  import * as _arbidocs_client from '@arbidocs/client';
7
7
  import { components, WsAuthResultMessage, WebSocketServerMessage, WsTaskUpdateMessage, WsPresenceUpdateMessage, SessionUser, SessionManager, ArbiClient, RecoveryKeyParams, CallPeer } from '@arbidocs/client';
@@ -16,7 +16,7 @@ import { M as MeetingChatRef, a as ActiveCall, W as SegmenterConfig, G as Incomi
16
16
  export { A as AUDIENCE_CHOICES, c as AudioRecorderState, d as AudioSegment, C as CALL_CAPTION_TOPIC, e as CALL_CHAT_MAX_CHARS, f as CALL_CHAT_TOPIC, g as CALL_RECORDING_TOPIC, h as CALL_TRANSCRIPTION_TOPIC, i as CALL_WEBINAR_TOPIC, j as CAPTION_MAX_CHARS, k as COMPOSITE_AUDIO_BITS_PER_SECOND, l as COMPOSITE_VIDEO_BITS_PER_SECOND, m as CallChatLine, n as CallChatPacket, o as CallSessionState, p as CaptionLine, q as CaptionPacket, r as ChatAttachmentFile, s as ChatEvent, u as ChatMessageResponse, w as ChatThreadData, y as ConversationKey, D as DEFAULT_JOIN_CHOICES, z as DEFAULT_SEGMENTER_CONFIG, B as DecryptedChatMessage, E as EMPTY_CALL_SESSION, H as HISTORY_LIMIT, F as HistoryMessage, I as INITIAL_SEGMENTER_STATE, L as LIVE_SEGMENTER, K as LiveCall, O as NewActiveCall, P as OpenQuestion, Q as PendingKnock, R as PendingPart, S as READ_ONLY_MEETING_TEXT, T as RECORDING_CHUNK_MS, U as SEGMENT_ID_PATTERN, V as SPEAKER_AUDIO_BITS_PER_SECOND, X as SegmenterEvent, Y as SegmenterState, Z as TrackUploader, _ as TrackUploaderOptions, $ as TranscriptSegment, a0 as UPLOAD_ATTEMPTS, a1 as UPLOAD_BACKOFF_MS, a2 as UploaderDeps, a3 as UseAudioRecorderOptions, a4 as UseAudioRecorderResult, a5 as WebinarPacket, a6 as appendToThread, a7 as applyAgentDmStatus, a8 as applyChatEvent, a9 as applyChatMessage, aa as applyChatRead, ab as applyChatUpdated, ac as buildMeetingChatBody, ad as cachedChat, ae as cachedChats, af as callMemberKeys, ag as callSession, ah as chatByExtId, ai as chatHasLiveCall, aj as chatLiveCallId, ak as clearMeetingChatCache, al as clearTrackUploaders, am as conversationKeyForCall, an as decodeCallChatPacket, ao as decodeCaptionPacket, ap as decryptPart, aq as encodeCallChatPacket, ar as encodeCaptionPacket, as as encryptPart, at as ensureMeetingChat, au as flushSegmenter, av as getOpenChat, aw as isRecordingOver, ax as isRetryable, ay as knownMeetingChat, az as levelFromRms, aA as loadMeetingHistory, aB as markRejoining, aC as meetingChatRefFrom, aD as meetingRefForCall, aE as mergeChatLines, aF as myChatId, aG as newPacketId, aH as newSegmentId, aI as newTrackKey, aJ as nextSeqAfter, aK as openQuestion, aL as parseWebinarPacket, aM as partOffsetMs, aN as persistMeetingMessage, aO as persistTranscriptSegment, aP as rejoinAsAudience, aQ as removeChat, aR as resetCallSession, aS as resolveMeetingChat, aT as sealQuestionText, aU as setOpenChat, aV as stepSegmenter, aW as storeTranscriptSegment, aX as threadHasLiveCall, aY as threadLiveCallId, aZ as threadTranscriptText, a_ as trackUploaderFor, a$ as transcriptPersistRole, b0 as unwrapTrackKey, b1 as upsertChat, b2 as useAudioRecorder, b3 as useCallSession, b4 as wrapTrackKey } from './useAudioRecorder.d-DpDeeeAZ.js';
17
17
  import * as zustand from 'zustand';
18
18
  import * as _tanstack_query_core from '@tanstack/query-core';
19
- export { a as arbiMutationKeys, b as arbiQueryKeys, c as calendarQueryKeys, d as callQueryKeys, e as connectorQueryKeys, i as isUnderQueryKey, m as mailQueryKeys } from './query-keys.d-DM2N5pzN.js';
19
+ export { a as arbiMutationKeys, b as arbiQueryKeys, c as calendarQueryKeys, d as callQueryKeys, e as connectorQueryKeys, i as isUnderQueryKey, m as mailQueryKeys } from './query-keys.d-DEEMzkLz.js';
20
20
  import { VerificationResult } from '@didit-protocol/sdk-web';
21
21
  import { LucideIcon } from 'lucide-react';
22
22
  import { Components } from 'react-markdown';
@@ -1136,6 +1136,59 @@ interface ArbiLayoutStoreOptions {
1136
1136
  }
1137
1137
  declare function createArbiLayoutStore({ persist }?: ArbiLayoutStoreOptions): ArbiLayoutStore;
1138
1138
 
1139
+ /**
1140
+ * The session's selected workspace (`workspaceId`) and where it stands on the server session
1141
+ * (`workspaceStatus`). `useSwitchWorkspace` moves both; a session store reads them from here.
1142
+ *
1143
+ * The selection is kept per tab (sessionStorage), so a reload stays in the workspace and each tab
1144
+ * can be in a different one; a new sign-in starts with none ({@link ArbiWorkspaceStore.reset}).
1145
+ * The status is never kept: after a reload the server session is new, and
1146
+ * `useOpenSelectedWorkspace` opens the kept selection again.
1147
+ */
1148
+
1149
+ /** Where the selection is kept across reloads. */
1150
+ interface ArbiWorkspaceStorage {
1151
+ load(): string | null;
1152
+ save(workspaceId: string | null): void;
1153
+ }
1154
+ /** The selection and its status. */
1155
+ interface ArbiWorkspaceState {
1156
+ workspaceId: string | null;
1157
+ workspaceStatus: ArbiWorkspaceStatus;
1158
+ }
1159
+ interface ArbiWorkspaceStore {
1160
+ getState(): ArbiWorkspaceState;
1161
+ subscribe(listener: () => void): () => void;
1162
+ setWorkspaceId(workspaceId: string | null): void;
1163
+ setWorkspaceStatus(status: ArbiWorkspaceStatus): void;
1164
+ /** No workspace, closed (a sign-in or sign-out: the next person starts on the workspace list). */
1165
+ reset(): void;
1166
+ }
1167
+ interface ArbiWorkspaceStoreOptions {
1168
+ storage?: ArbiWorkspaceStorage;
1169
+ /** The selection to start with instead of the kept one. */
1170
+ workspaceId?: string | null;
1171
+ }
1172
+ declare function createArbiWorkspaceStore({ storage, workspaceId, }?: ArbiWorkspaceStoreOptions): ArbiWorkspaceStore;
1173
+ /** The sessionStorage key of the selection (per tab). */
1174
+ declare const WORKSPACE_STORAGE_KEY = "arbi_workspace_id";
1175
+ /** The localStorage key of when each workspace was last opened (per browser). */
1176
+ declare const WORKSPACE_LAST_OPENED_KEY = "arbi_workspace_last_opened";
1177
+ interface BrowserWorkspaceStorageOptions {
1178
+ /** Default {@link WORKSPACE_STORAGE_KEY}. */
1179
+ key?: string;
1180
+ /** Default {@link WORKSPACE_LAST_OPENED_KEY}. */
1181
+ lastOpenedKey?: string;
1182
+ }
1183
+ /**
1184
+ * The browser's: the selection per tab (sessionStorage), and when each workspace was last opened
1185
+ * per browser (localStorage, read with {@link readWorkspaceLastOpened}: "recently opened" is a
1186
+ * history that outlives a tab, the selection deliberately does not).
1187
+ */
1188
+ declare function browserWorkspaceStorage({ key, lastOpenedKey, }?: BrowserWorkspaceStorageOptions): ArbiWorkspaceStorage;
1189
+ /** When each workspace was last opened in this browser (`external_id` → epoch ms). */
1190
+ declare function readWorkspaceLastOpened(lastOpenedKey?: string): Record<string, number>;
1191
+
1139
1192
  /**
1140
1193
  * The live state of a running turn that is not in the threads cache: follow-ups waiting in the
1141
1194
  * agent bar's queue box, and the run-control state (pause / resume / report). Both are keyed by the
@@ -1482,10 +1535,16 @@ interface ArbiSessionStoreOptions {
1482
1535
  draftStorage?: ArbiDraftStorage;
1483
1536
  /** Keep the layout across reloads (see {@link createStoragePersist}). */
1484
1537
  persist?: ArbiSessionPersist<ArbiSavedLayout>;
1538
+ /**
1539
+ * The selected workspace and its status (default: in memory, from `initial.workspaceId`). Give
1540
+ * one kept per tab (`createArbiWorkspaceStore({ storage: browserWorkspaceStorage() })`) for a
1541
+ * reload to stay in the workspace.
1542
+ */
1543
+ workspace?: ArbiWorkspaceStore;
1485
1544
  }
1486
1545
  /** The layout actions of a session store, on its layout store. */
1487
1546
  declare function layoutActionsOf(layout: ArbiLayoutStore): ArbiLayoutActions;
1488
- declare function createArbiSessionStore(initial?: Partial<ArbiSessionState>, { draftStorage, persist }?: ArbiSessionStoreOptions): ArbiSessionStore;
1547
+ declare function createArbiSessionStore(initial?: Partial<ArbiSessionState>, { draftStorage, persist, workspace, }?: ArbiSessionStoreOptions): ArbiSessionStore;
1489
1548
 
1490
1549
  /** A PATCH of the user settings: only the fields given change (lists are sent whole). */
1491
1550
  type UserSettingsPatch = components['schemas']['UserSettingsUpdate'];
@@ -1666,6 +1725,283 @@ interface LocalFeatureStoreOptions {
1666
1725
  /** Feature switches kept on this device, read synchronously once saved. */
1667
1726
  declare function createLocalFeatureStore({ key, storage, migrate, }: LocalFeatureStoreOptions): LocalFeatureStore;
1668
1727
 
1728
+ /**
1729
+ * Datasets: the one shape every chart and dashboard reads, whatever the data comes from.
1730
+ *
1731
+ * Three layers, each knowing only the one below it:
1732
+ * 1. A `DataSource` adapter (AI usage, documents, threads, projects, a database, later an external
1733
+ * feed) exposes its data as a normalized `Dataset`: typed fields and plain rows. Filtering,
1734
+ * grouping and aggregation happen here (`aggregateDataset`, or on the server where the backend
1735
+ * can, as a database does), never in a chart.
1736
+ * 2. A `ChartSpec` (inside a `PanelSpec`, inside a `DashboardSpec`) says what to show in terms of
1737
+ * field ids only: the chart type, x / series / y fields, the aggregate, sort and limit. It is
1738
+ * plain JSON, saved in dashboards and studio pages.
1739
+ * 3. A renderer (`@arbidocs/blocks/dashboards`) maps a spec plus the aggregated dataset onto the
1740
+ * drawing component. No renderer type appears here, so the renderer stays swappable.
1741
+ */
1742
+ /** A field's value type. Dates are ISO strings (`2026-06-12` or a full timestamp). */
1743
+ type DatasetFieldType = 'string' | 'number' | 'date' | 'boolean';
1744
+ /** One column of a dataset. */
1745
+ interface DatasetField {
1746
+ /** Stable id: what specs and rows use. */
1747
+ id: string;
1748
+ /** What people read (a column name, "Status"). */
1749
+ label: string;
1750
+ type: DatasetFieldType;
1751
+ /**
1752
+ * The unit of a number field, which picks its formatting: `gbp` (£), `bytes`, `tokens`, or any
1753
+ * suffix (`"MB"`, `"%"`).
1754
+ */
1755
+ unit?: string;
1756
+ /** The values a string field takes, when known (a select column's options), for a filter picker. */
1757
+ options?: readonly string[];
1758
+ /** A string field whose cell holds several values (tags, linked rows): a row counts in each. */
1759
+ multiple?: boolean;
1760
+ }
1761
+ /** A cell: a scalar, `null` when empty, or a list for a `multiple` field. */
1762
+ type DatasetValue = string | number | boolean | null | readonly string[];
1763
+ /** One row, keyed by field id. */
1764
+ type DatasetRow = Readonly<Record<string, DatasetValue | undefined>>;
1765
+ /** A normalized dataset: typed fields and the rows. */
1766
+ interface Dataset {
1767
+ fields: readonly DatasetField[];
1768
+ rows: readonly DatasetRow[];
1769
+ /** Rows matched before grouping (after filters). */
1770
+ totalRows?: number;
1771
+ /** More groups existed than the query's `limit`. */
1772
+ truncated?: boolean;
1773
+ }
1774
+ /** How a date field is grouped. Keys: `2026-06-12`, `2026-W24`, `2026-06`, `2026-Q2`, `2026`. */
1775
+ type TimeBucket = 'day' | 'week' | 'month' | 'quarter' | 'year';
1776
+ type AggregateOp = 'count' | 'sum' | 'avg' | 'min' | 'max';
1777
+ type FilterOp = 'eq' | 'neq' | 'contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'empty' | 'not_empty';
1778
+ /** Keep rows whose `field` satisfies `op value` (compared in the field's type). */
1779
+ interface DatasetFilter {
1780
+ field: string;
1781
+ op: FilterOp;
1782
+ value?: string | number | boolean | null;
1783
+ }
1784
+ /** How the groups are ordered: by label (dates: chronological), or by value. */
1785
+ type DatasetSort = 'label' | 'value-desc' | 'value-asc';
1786
+ /** How records are ordered: by a field (empty cells last). */
1787
+ interface DatasetOrder {
1788
+ field: string;
1789
+ /** Default `asc`. */
1790
+ direction?: 'asc' | 'desc';
1791
+ }
1792
+ /**
1793
+ * What to read of a source. Grouped (the default): the (filtered) rows grouped and each group
1794
+ * measured, a dataset in long form with the fields {@link AGGREGATE_FIELDS}, one row per group (and
1795
+ * series). With `records`: the matching rows themselves, ordered by `orderBy` and cut at `limit`.
1796
+ */
1797
+ interface DatasetQuery {
1798
+ /** List the matching records instead of grouping them (`groupBy`, `splitBy`, `measure` unused). */
1799
+ records?: boolean;
1800
+ /** The order of the records. */
1801
+ orderBy?: DatasetOrder;
1802
+ filters?: readonly DatasetFilter[];
1803
+ /** The field whose values (or date buckets) are the groups. Absent: one group, "All". */
1804
+ groupBy?: string;
1805
+ /** The bucket of a date `groupBy` / `splitBy`. Default `month`. */
1806
+ bucket?: TimeBucket;
1807
+ /** A second field: one series per value (a stacked or multi-line chart). */
1808
+ splitBy?: string;
1809
+ /** Default: count rows. `count` with a `field` counts the rows where it is not empty. */
1810
+ measure?: {
1811
+ op: AggregateOp;
1812
+ field?: string;
1813
+ };
1814
+ /** Default: dates chronological, others by value, largest first. */
1815
+ sort?: DatasetSort;
1816
+ /** Most groups kept (by value), or records listed. Default 50 groups; every record. */
1817
+ limit?: number;
1818
+ }
1819
+ /** The field ids of an aggregated dataset. */
1820
+ declare const AGGREGATE_FIELDS: {
1821
+ /** The group's label ("Open", "2026-06"). */
1822
+ readonly group: "group";
1823
+ /** The group's key as grouped (a date bucket, an id), for ordering and links. */
1824
+ readonly key: "key";
1825
+ /** The series' label (only with `splitBy`). */
1826
+ readonly series: "series";
1827
+ /** The measured value; `null` when the group has no value to measure. */
1828
+ readonly value: "value";
1829
+ };
1830
+ /** A dataset (or a source's fields) as a hook reads it. */
1831
+ interface DatasetState {
1832
+ dataset: Dataset | undefined;
1833
+ isLoading: boolean;
1834
+ error: unknown;
1835
+ }
1836
+ interface DataSourceFieldsState {
1837
+ fields: readonly DatasetField[];
1838
+ isLoading: boolean;
1839
+ error: unknown;
1840
+ }
1841
+ /** A source's parameters as saved in a panel (a database id, a period). */
1842
+ type DataSourceParams = Readonly<Record<string, string | number | boolean | null | undefined>>;
1843
+ /** A choice for a parameter (an option of a select). */
1844
+ interface DataSourceOption {
1845
+ value: string;
1846
+ label: string;
1847
+ }
1848
+ /** A parameter the panel editor asks for, before the source's fields are known. */
1849
+ interface DataSourceParam {
1850
+ id: string;
1851
+ label: string;
1852
+ /** Absent: the parameter may be left empty. */
1853
+ required?: boolean;
1854
+ /** Shown when nothing is chosen ("All columns"). */
1855
+ placeholder?: string;
1856
+ /** The choices, read live (databases of the open workspace; a database's saved views). */
1857
+ useOptions: (params: DataSourceParams) => {
1858
+ options: readonly DataSourceOption[];
1859
+ isLoading: boolean;
1860
+ };
1861
+ }
1862
+ /**
1863
+ * A data source adapter: where a dataset comes from.
1864
+ *
1865
+ * `useFields` and `useDataset` are hooks. A caller renders them from a component keyed by the
1866
+ * source id, so switching source mounts afresh (the hooks differ between sources).
1867
+ *
1868
+ * Extension point: an external source (an HTTP/JSON API, a CSV feed, a warehouse) is one more
1869
+ * adapter. It reads its rows however it likes (its own `useQuery`) and returns them as a `Dataset`;
1870
+ * `defineRowsSource` aggregates them for it. A host lists it in `<ArbiHost config={{ dashboards:
1871
+ * { sources } }}>` and every editor, panel and studio block offers it. Fetching third-party URLs
1872
+ * from the browser is the host's decision (CORS, credentials, what a shared dashboard may reach),
1873
+ * so none is built in; data to chart today is imported into a database (CSV / spreadsheet import).
1874
+ */
1875
+ interface DataSource {
1876
+ id: string;
1877
+ label: string;
1878
+ description?: string;
1879
+ params?: readonly DataSourceParam[];
1880
+ /** The fields a panel can use, given the parameters. */
1881
+ useFields: (params: DataSourceParams) => DataSourceFieldsState;
1882
+ /**
1883
+ * The dataset: grouped and measured (long form with {@link AGGREGATE_FIELDS}), or the records
1884
+ * (`query.records`), filtered either way.
1885
+ */
1886
+ useDataset: (params: DataSourceParams, query: DatasetQuery, options?: {
1887
+ enabled?: boolean;
1888
+ }) => DatasetState;
1889
+ }
1890
+ /** How a panel draws its data. `metric` is one number; `table` a table of rows or groups. */
1891
+ type ChartType = 'metric' | 'bar' | 'line' | 'area' | 'pie' | 'donut' | 'table';
1892
+ /** What to show, in terms of the dataset's field ids. Serialisable. */
1893
+ interface ChartSpec {
1894
+ type: ChartType;
1895
+ /** The category or date field along the x axis (pie slices; table groups). */
1896
+ x?: string;
1897
+ /** The bucket of a date `x`. Default `month`. */
1898
+ bucket?: TimeBucket;
1899
+ /** A field whose values become the series (stacked bars or areas, several lines). */
1900
+ series?: string;
1901
+ /** The number field the aggregate reads (absent: rows are counted). */
1902
+ y?: string;
1903
+ /** Default `count`. */
1904
+ aggregate?: AggregateOp;
1905
+ sort?: DatasetSort;
1906
+ limit?: number;
1907
+ /** Stack the series (bar, area). */
1908
+ stacked?: boolean;
1909
+ filters?: readonly DatasetFilter[];
1910
+ /** A table of records (no aggregate): the fields shown, in order. Absent: every field. */
1911
+ columns?: readonly string[];
1912
+ /** A table of records: their order. */
1913
+ orderBy?: DatasetOrder;
1914
+ }
1915
+ /** The source a panel reads, by registry id, with its parameters. */
1916
+ interface DataSourceRef {
1917
+ id: string;
1918
+ params?: DataSourceParams;
1919
+ }
1920
+ /** One panel of a dashboard. */
1921
+ interface PanelSpec {
1922
+ id: string;
1923
+ title: string;
1924
+ description?: string;
1925
+ source: DataSourceRef;
1926
+ chart: ChartSpec;
1927
+ /** Columns of the 12-column grid it spans on a wide screen (it is full width on a phone). */
1928
+ width?: number;
1929
+ }
1930
+ /** A dashboard: a titled grid of panels. Plain JSON (`version` for later migrations). */
1931
+ interface DashboardSpec {
1932
+ version: 1;
1933
+ title: string;
1934
+ description?: string;
1935
+ panels: readonly PanelSpec[];
1936
+ }
1937
+
1938
+ /** A dashboard as stored. */
1939
+ interface SavedDashboard {
1940
+ id: string;
1941
+ spec: DashboardSpec;
1942
+ updatedAt?: string;
1943
+ }
1944
+ /** Where dashboards are kept. */
1945
+ interface DashboardStore {
1946
+ /** What the saved list is cached under (the workspace it belongs to). `null`: not available. */
1947
+ scope: string | null;
1948
+ list: () => Promise<SavedDashboard[]>;
1949
+ /** Create (no `id`) or replace a dashboard; resolves with it as stored. */
1950
+ save: (dashboard: {
1951
+ id?: string;
1952
+ spec: DashboardSpec;
1953
+ }) => Promise<SavedDashboard>;
1954
+ remove: (id: string) => Promise<void>;
1955
+ }
1956
+ /** The longest spec a database text cell holds (the server's limit). */
1957
+ declare const MAX_DASHBOARD_SPEC_CHARS = 10000;
1958
+ /** A stored spec, checked: `null` when it is not a dashboard (malformed panels are dropped). */
1959
+ declare function parseDashboardSpec(value: unknown): DashboardSpec | null;
1960
+ /** A spec as JSON for storage; throws when it is longer than the store holds. */
1961
+ declare function serializeDashboardSpec(spec: DashboardSpec, max?: number): string;
1962
+ /** A store kept in memory (a demo, a test, a page without a workspace). */
1963
+ declare function createMemoryDashboardStore(initial?: readonly SavedDashboard[], scope?: string): DashboardStore;
1964
+ interface DatabaseDashboardStoreOptions {
1965
+ /** The database's name. Default "Dashboards". */
1966
+ name?: string;
1967
+ }
1968
+ /** Dashboards kept as rows of a database of the open workspace (made on the first save). */
1969
+ declare function useDatabaseDashboardStore(options?: DatabaseDashboardStoreOptions): DashboardStore;
1970
+ /** The store dashboards are kept in here: the host's (`dashboards.useStore`) or a database. */
1971
+ declare function useDashboardStore(): DashboardStore;
1972
+ /** The saved dashboards, oldest first. */
1973
+ declare function useSavedDashboards(store: DashboardStore): _tanstack_react_query.UseQueryResult<NoInfer<SavedDashboard[]>, Error>;
1974
+ /** Save a dashboard (create without `id`); the saved list takes it straight away. */
1975
+ declare function useSaveDashboard(store: DashboardStore): _tanstack_react_query.UseMutationResult<SavedDashboard, Error, {
1976
+ id?: string;
1977
+ spec: DashboardSpec;
1978
+ }, unknown>;
1979
+ declare function useDeleteDashboard(store: DashboardStore): _tanstack_react_query.UseMutationResult<void, Error, string, unknown>;
1980
+
1981
+ /** What a host configures for charts and dashboards. */
1982
+ interface DashboardsHost {
1983
+ /** More sources, or replacements for built-ins (same `id`). */
1984
+ sources?: readonly DataSource[];
1985
+ /** Leave the built-in sources out (only `sources` are offered). */
1986
+ builtins?: false;
1987
+ /**
1988
+ * Where saved dashboards are kept, as a hook. Absent: a database of the open workspace
1989
+ * (`useDatabaseDashboardStore`).
1990
+ */
1991
+ useStore?: () => DashboardStore;
1992
+ }
1993
+ /** A lookup of sources by id, in the order offered. */
1994
+ interface DataSourceRegistry {
1995
+ list: readonly DataSource[];
1996
+ get: (id: string) => DataSource | undefined;
1997
+ }
1998
+ /** Built-in sources with their default (neutral) labels. */
1999
+ declare const BUILTIN_DATA_SOURCES: readonly DataSource[];
2000
+ /** A registry over `sources`; a later source replaces an earlier one with the same id. */
2001
+ declare function createDataSourceRegistry(sources: readonly DataSource[]): DataSourceRegistry;
2002
+ /** The sources offered here: the built-ins and the host's (`dashboards.sources`). */
2003
+ declare function useDataSources(): DataSourceRegistry;
2004
+
1669
2005
  /**
1670
2006
  * What a host hands the `@arbidocs/react` hooks, as one configuration (`<ArbiHost config>`). Every
1671
2007
  * field is optional: without one the hooks use their own default. `@arbidocs/blocks` extends it
@@ -1765,6 +2101,11 @@ interface ArbiHostConfig {
1765
2101
  * `getEntityLabel`. Absent: the registry's ("Project", "Workspace", "Thread", …).
1766
2102
  */
1767
2103
  vocabulary?: EntityVocabulary;
2104
+ /**
2105
+ * Charts and dashboards: more data sources (an external feed, a source relabelled in the site's
2106
+ * words) and where saved dashboards are kept. Absent: the built-in sources, saved in a database.
2107
+ */
2108
+ dashboards?: DashboardsHost;
1768
2109
  }
1769
2110
  /** The host configuration in scope (`{}` outside an `<ArbiHost>`). */
1770
2111
  declare function useArbiHost(): ArbiHostConfig;
@@ -2603,6 +2944,12 @@ declare function useConversationTurn({ selectedWorkspaceId, parentMessageId, }:
2603
2944
  lastErrorMessage: string | null;
2604
2945
  };
2605
2946
 
2947
+ /**
2948
+ * The configuration new work runs with: the one chosen for the next message (`session.chatModel`),
2949
+ * else the one the replied-to message ran with (`session.cursor`), else the person's last one.
2950
+ */
2951
+ declare function useActiveConfigId(): string | undefined;
2952
+
2606
2953
  /**
2607
2954
  * Hook that manages documents associated with a conversation
2608
2955
  *
@@ -3245,312 +3592,51 @@ declare function applyLiveUpdate(queryClient: QueryClient, message: {
3245
3592
  }): Promise<boolean>;
3246
3593
 
3247
3594
  /**
3248
- * Pure workspace adapters: an SDK `WorkspaceResponse` (or the host's own copy of it) to the view
3249
- * models the shell and the workspaces gallery show. No React state, no SDK calls, so a host that
3250
- * has no `arbi` in its host can use them too.
3251
- */
3252
-
3253
- /** Workspace visibility: public = common, several members = shared, else private. */
3254
- type ShellWorkspaceKind = 'private' | 'shared' | 'common';
3255
- /** One face on a workspace card. */
3256
- interface ShellWorkspaceMember {
3257
- name: string;
3258
- picture?: string | null;
3259
- }
3260
- /**
3261
- * The fields of an SDK workspace the adapters read. Every field but the id and the name is
3262
- * optional, so the SDK's `WorkspaceResponse` and a host's own copy of it are both assignable.
3263
- */
3264
- interface ShellWorkspaceSource {
3265
- external_id: string;
3266
- name: string;
3267
- description?: string | null;
3268
- is_public?: boolean;
3269
- project_name?: string | null;
3270
- updated_at?: string;
3271
- shared_document_count?: number;
3272
- private_document_count?: number;
3273
- users?: ReadonlyArray<{
3274
- user?: {
3275
- given_name?: string | null;
3276
- family_name?: string | null;
3277
- email?: string | null;
3278
- picture?: string | null;
3279
- };
3280
- /** Set when the member is an agent: agents are not people and are left off the faces. */
3281
- agent_ext_id?: string | null;
3282
- }>;
3283
- }
3284
- /**
3285
- * A workspace as the shell and the gallery see it. Structurally a superset of blocks'
3286
- * `ShellWorkspace` and `WorkspaceSummary`, so it is passed to both unchanged.
3287
- */
3288
- interface ShellWorkspaceItem {
3289
- id: string;
3290
- name: string;
3291
- kind: ShellWorkspaceKind;
3292
- description?: string | null;
3293
- projectName?: string | null;
3294
- /** A rendered project pill; the host supplies it (see `decorate`). */
3295
- projectLine?: ReactNode;
3296
- /** Shared plus private documents. */
3297
- docCount: number;
3298
- /** People in the workspace (agents excluded). */
3299
- memberCount: number;
3300
- members: ShellWorkspaceMember[];
3301
- /** ISO timestamp. */
3302
- updatedAt?: string;
3303
- }
3304
- /** A workspace offered in the switcher menu. */
3305
- interface ShellRecentWorkspaceItem extends ShellWorkspaceItem {
3306
- /** Pre-formatted "last seen" text, when the host supplies `formatLastSeen`. */
3307
- lastSeen?: string;
3308
- }
3309
- /** Public, several members: shared. Otherwise private. */
3310
- declare function getWorkspaceKind(workspace: Pick<ShellWorkspaceSource, 'is_public' | 'users'>): ShellWorkspaceKind;
3311
- /** Adapt one SDK workspace to the shell and gallery view model. */
3312
- declare function toShellWorkspace(workspace: ShellWorkspaceSource): ShellWorkspaceItem;
3313
- /**
3314
- * The workspace the app is in. Order: the host's selection if it is in the list; else the first
3315
- * workspace of a live list; else the seed's active one; else the first workspace.
3316
- */
3317
- declare function resolveActiveWorkspace(items: readonly ShellWorkspaceItem[], selectedId: string | null | undefined, options?: {
3318
- isSeed?: boolean;
3319
- seedActiveId?: string;
3320
- }): ShellWorkspaceItem | undefined;
3321
- /** The other workspaces for the quick-switch menu, most recently opened first, capped. */
3322
- declare function pickRecentWorkspaces(items: readonly ShellWorkspaceItem[], activeId: string | undefined, options?: {
3323
- limit?: number;
3324
- lastOpened?: Readonly<Record<string, number>>;
3325
- formatLastSeen?: (timestamp: number) => string;
3326
- }): ShellRecentWorkspaceItem[];
3327
-
3328
- /**
3329
- * `useShellWorkspaces`: the user's workspaces as the shell's switcher and the workspaces gallery
3330
- * show them, the one the app is in, and `open(workspace)`.
3595
+ * Types for a document's parsed content (`GET /v1/document/{id}/parsed-{stage}`).
3331
3596
  *
3332
- * Source-agnostic on purpose: the host hands in the list and the selection mechanism it already
3333
- * has (ARBI-frontend its React Query hook and workspace store, a connected app `useWorkspaces`
3334
- * plus the connection's `setWorkspace`). `useArbiShellWorkspaces` is the same hook wired to an
3335
- * `<ArbiHost>`.
3597
+ * The SDK returns this endpoint untyped (`Record<string, unknown>`); these are
3598
+ * the structural types the review viewer relies on. Kept dependency-free so both
3599
+ * the `useParsedDocument` hook and `<DocumentReview>` can import them.
3336
3600
  */
3337
-
3338
- /** Workspaces to show while the account has none (a demo); the host owns the data. */
3339
- interface ShellWorkspaceSeed {
3340
- workspaces: readonly ShellWorkspaceItem[];
3341
- /** The seed workspace that counts as the current one when nothing is selected. */
3342
- activeId?: string;
3601
+ interface ParsedChunkMetadata {
3602
+ page_number?: number;
3603
+ /** Stable chunk id — the join key for citations (`CitationData.chunk_ids`). */
3604
+ chunk_ext_id?: string;
3605
+ chunk_pg_idx?: number;
3606
+ chunk_doc_idx?: number;
3607
+ doc_title?: string;
3608
+ heading?: string | null;
3609
+ heading_level?: number | null;
3610
+ /** JSON mode only: "text" | "header" | "table" | "figure" | … */
3611
+ element_type?: string;
3612
+ /** JSON mode only: [x_min, y_min, x_max, y_max]. */
3613
+ bbox?: [number, number, number, number];
3343
3614
  }
3344
- interface UseShellWorkspacesOptions<S extends ShellWorkspaceSource = ShellWorkspaceSource> {
3345
- /** The account's workspaces (SDK shape). `undefined` while loading. */
3346
- workspaces: readonly S[] | undefined;
3347
- isLoading?: boolean;
3348
- /** The list query's error, passed through as `error`. */
3349
- loadError?: unknown;
3350
- /** The workspace the host says the app is in (the connection's selection). */
3351
- selectedId?: string | null;
3352
- /**
3353
- * Make the workspace the app's current one: open it on the server and record the selection.
3354
- * Throw (reject) to report failure. Called for EVERY open, including the current workspace, so
3355
- * a click on the current card still re-opens it and then navigates.
3356
- */
3357
- select: (workspace: ShellWorkspaceItem) => Promise<unknown> | unknown;
3358
- /** After a successful select: navigate, toast, close a menu. The "switch, then navigate" hook. */
3359
- onOpened?: (workspace: ShellWorkspaceItem) => void;
3360
- /** When select rejects. The active workspace is unchanged. Without it the error is in `error`. */
3361
- onOpenError?: (error: unknown, workspace: ShellWorkspaceItem) => void;
3362
- /** Demo list for an account that has no workspaces (never while loading). */
3363
- seed?: ShellWorkspaceSeed;
3364
- /** Host decoration per workspace, e.g. a rendered project pill. Merged over the adapter. */
3365
- decorate?: (item: ShellWorkspaceItem, source: S) => Partial<ShellWorkspaceItem>;
3366
- /** How many recent workspaces the switcher offers. Default 4. */
3367
- recentLimit?: number;
3368
- /** `workspace id -> epoch ms` last opened here; orders `recent`, falling back to `updatedAt`. */
3369
- lastOpened?: Readonly<Record<string, number>>;
3370
- /** Format a recency timestamp into `recent[].lastSeen`. */
3371
- formatLastSeen?: (timestamp: number) => string;
3615
+ interface ParsedChunk {
3616
+ /** Markdown content of the chunk. */
3617
+ content: string;
3618
+ metadata: ParsedChunkMetadata;
3372
3619
  }
3373
- interface UseShellWorkspacesResult {
3374
- /** All workspaces: the account's, or the seed when it has none. */
3375
- items: ShellWorkspaceItem[];
3376
- /** The single current workspace; undefined only when there are no workspaces at all. */
3377
- active: ShellWorkspaceItem | undefined;
3378
- /** The other workspaces, most recently opened first, for the quick-switch menu. */
3379
- recent: ShellRecentWorkspaceItem[];
3380
- /** The account's own workspaces: false while `items` is the seed. */
3381
- isLive: boolean;
3382
- isLoading: boolean;
3383
- /** The list query's error or the last failed open; cleared by the next open. */
3384
- error: unknown;
3385
- /** Id of the workspace being opened, else null (for a spinner on its card). */
3386
- openingId: string | null;
3387
- /** Select the workspace (always, even the current one), then `onOpened`. False if select threw. */
3388
- open: (workspace: Pick<ShellWorkspaceItem, 'id'> | string) => Promise<boolean>;
3620
+ interface ParsedDocumentMetadata {
3621
+ total_number_of_pages?: number;
3622
+ file_name?: string;
3623
+ output_mode?: string;
3389
3624
  }
3390
- declare function useShellWorkspaces<S extends ShellWorkspaceSource = ShellWorkspaceSource>(options: UseShellWorkspacesOptions<S>): UseShellWorkspacesResult;
3391
- interface UseArbiShellWorkspacesOptions extends Omit<UseShellWorkspacesOptions, 'workspaces' | 'isLoading' | 'loadError' | 'select'> {
3392
- /**
3393
- * Override how a workspace is made current. Default: `useSwitchWorkspace` (open it on the
3394
- * server, then record it as the session's workspace, so the host and the server agree).
3395
- */
3396
- select?: UseShellWorkspacesOptions['select'];
3625
+ interface ParsedDocument {
3626
+ metadata?: ParsedDocumentMetadata;
3627
+ footnotes?: Record<string, string>;
3628
+ chunks: ParsedChunk[];
3397
3629
  }
3398
- /**
3399
- * `useShellWorkspaces` over the host `Arbi`'s workspace list and the session's workspace. Opening
3400
- * one is navigation: it switches the session's workspace (see `select`).
3401
- */
3402
- declare function useArbiShellWorkspaces(options?: UseArbiShellWorkspacesOptions): UseShellWorkspacesResult;
3403
3630
 
3404
- /**
3405
- * The session state the blocks share (see `./store`). A host passes its own {@link ArbiSessionStore}
3406
- * as the host configuration's `session` (ARBI-frontend backs it with its zustand store). Without
3407
- * one, each top-level `<ArbiHost>` keeps an in-memory one, and blocks rendered with no host share a
3408
- * module default, so a standalone block still coordinates with its siblings. A host's own store
3409
- * keeps the composers' drafts across reloads, sealed to the person signed in on the host's `Arbi`
3410
- * and only for them; the module default (no host, so no one signed in) keeps them in memory.
3411
- */
3412
-
3413
- /** The session store: its setters, and `getState()` for the state as of now (in callbacks). */
3414
- declare function useArbiSessionStore(): ArbiSessionStore;
3415
- /**
3416
- * A slice of the session state; re-renders when it changes. The selector returns a value from the
3417
- * state or a primitive (a new object each call would never settle).
3418
- */
3419
- declare function useArbiSessionState<T>(selector: (state: ArbiSessionState) => T): T;
3420
- /**
3421
- * A view setting kept in the session and saved across reloads (`views.values`: a page's view
3422
- * mode, a zoom, a filter box's text), and its setter. `fallback` while none is set.
3423
- */
3424
- declare function useSessionView<T>(key: string, fallback: T): [T, (value: T) => void];
3425
- /**
3426
- * View state kept for this session only (`views.transient`: a search's results, a one-shot
3427
- * request), and its setter (`undefined` drops it). `fallback` while none is set.
3428
- */
3429
- declare function useTransientView<T>(key: string, fallback: T): [T, (value: T | undefined) => void];
3430
- /** A page's selected tab, kept across reloads; the host supplies its default tab. */
3431
- declare function useSessionPageTab(page: string, fallback: string): {
3432
- activeTab: string;
3433
- setActiveTab: (tab: string) => void;
3434
- };
3435
-
3436
- /**
3437
- * Who is signed in: the host `Arbi`'s session (`arbi.session`, the client's session state), the
3438
- * one source for the user, the sign-in status and the SSO mode. Re-renders when it changes.
3439
- */
3440
-
3441
- type ArbiSessionStatus = 'signed-out' | 'signed-in';
3442
- interface ArbiSignedInSession {
3443
- /** `signed-in` once a login finished on this device (also before this tab has a token). */
3444
- status: ArbiSessionStatus;
3445
- /** The signed-in user; `null` signed out. */
3446
- user: SessionUser | null;
3447
- /** The account signs in through SSO. */
3448
- isSso: boolean;
3449
- /** This tab holds a server session (a token). A new tab or an offline unlock does not, yet. */
3450
- hasToken: boolean;
3451
- /** The server session key workspace keys are sealed to; `null` until known. */
3452
- serverSessionKey: Uint8Array | null;
3453
- }
3454
- /** The signed-in session of the host's `Arbi`; signed out without one. */
3455
- declare function useArbiSession(): ArbiSignedInSession;
3456
- /** The same for a session the caller holds (the host building its `Arbi` on it). */
3457
- declare function useSignedInSession(session: SessionManager | null): ArbiSignedInSession;
3458
-
3459
- /**
3460
- * Switching the workspace the app is in: the one coordinator for "the user is now in workspace X".
3461
- *
3462
- * The server keeps the active workspace in the session, so every workspace-scoped GET reads the
3463
- * workspace currently open for the session. A naive switch (set the id, `/open` in the background)
3464
- * races every observer that refetches when the id changes: those requests reach a server still in
3465
- * the previous workspace and seed the cache with its data. `switchWorkspace` keeps the order:
3466
- *
3467
- * 1. leave the workspace: its session state (`leaveWorkspace`) and its cached queries go, so
3468
- * nothing shows or refetches the old workspace's data;
3469
- * 2. the selection is cleared, so queries gated on it stop during the round trip;
3470
- * 3. `arbi.selectWorkspace(target)`: the server session is now in the target;
3471
- * 4. the conversations and tags `/open` returned seed their lists, then the selection is
3472
- * committed (`workspaceId`, `workspaceStatus: 'open'`).
3473
- *
3474
- * Concurrent switches (A, then B, then C in quick succession): only the last one commits, and the
3475
- * SDK runs the opens one at a time with the latest request winning, so the server session ends in
3476
- * the last one too. `settled` waits out the switches in flight.
3477
- *
3478
- * A sign-out (`arbi.onSigningOut`, before the server revokes the token) overtakes every switch and
3479
- * open in flight and cancels the queries in flight: the SDK has already stopped new requests and
3480
- * aborts the ones in flight, so none comes back 401 or is reported as a failure.
3481
- */
3482
-
3483
- /** The server refused to open an archived workspace (423 `workspace_archived`). */
3484
- declare function isWorkspaceArchivedError(error: unknown): boolean;
3485
- /** What to tell someone who tried to open an archived workspace. */
3486
- declare const archivedWorkspaceMessage: (name: string) => string;
3487
- interface SwitchWorkspaceTarget {
3488
- id: string;
3489
- /** For the notices; default: the name in the workspace list. */
3490
- name?: string;
3491
- }
3492
- interface UseSwitchWorkspaceResult {
3493
- /**
3494
- * Make `target` the workspace the app is in. True once it is open (at once when it already
3495
- * is); false when it could not be (archived, offline, refused: the user was told), or when a
3496
- * newer switch overtook it.
3497
- */
3498
- switchWorkspace: (target: SwitchWorkspaceTarget) => Promise<boolean>;
3499
- /** Leave the workspace for none (after deleting or leaving it), with the same clean-up. */
3500
- clearWorkspace: () => void;
3501
- /**
3502
- * Open the selected workspace on the server session as it is, without leaving anything or a
3503
- * notice: after a sign-in or a reload (a new server session), or to re-assert it before a write.
3504
- * False when there is none, it could not be opened, or a switch overtook it.
3505
- */
3506
- openSelectedWorkspace: () => Promise<boolean>;
3507
- /**
3508
- * Resolves once no switch is in flight: the selection is then committed (or back to where it
3509
- * was), so reading it says which workspace the session is in.
3510
- */
3511
- settled: () => Promise<void>;
3512
- }
3513
- /** What a workspace switch runs on. */
3514
- interface WorkspaceSwitchContext {
3515
- /** The `Arbi` on the signed-in session, as of the switch. */
3516
- arbi: () => Arbi;
3517
- session: ArbiSessionStore;
3518
- queryClient: QueryClient;
3519
- }
3520
- /**
3521
- * The workspace switch over a host's session, for code that runs outside `<ArbiHost>` (a host's
3522
- * own environment, built before its host). Inside, use `useSwitchWorkspace`.
3523
- */
3524
- declare function createWorkspaceSwitch({ arbi, session, queryClient, }: WorkspaceSwitchContext): UseSwitchWorkspaceResult;
3525
- /** The workspace switch of the `<ArbiHost>` in scope (its `Arbi`, its session state). */
3526
- declare function useSwitchWorkspace(): UseSwitchWorkspaceResult;
3527
- /**
3528
- * Keep the selected workspace open on the server session: open it once signed in (after a
3529
- * sign-in or a reload, when the selection was kept but the server session is new), and drop it
3530
- * when the workspace list says it was archived since (by its owner, perhaps on another device).
3531
- * Mounted once, by the signed-in app.
3532
- */
3533
- declare function useOpenSelectedWorkspace(): void;
3534
-
3535
- type WorkspaceUpdate = components['schemas']['WorkspaceUpdateRequest'];
3536
- /** A new workspace: its name, the project it belongs to, and optionally a description. */
3537
- interface CreateWorkspaceVars {
3538
- name: string;
3539
- projectId: string;
3540
- description?: string | null;
3541
- isPublic?: boolean;
3542
- }
3543
- /**
3544
- * Create a workspace (its key generated and sealed by the SDK). The new workspace goes into the
3545
- * cached list at once, so opening it right away finds it; the list and the projects (their
3546
- * workspace counts) are then read again.
3547
- */
3548
- declare function useCreateWorkspace(): _tanstack_react_query.UseMutationResult<{
3631
+ /** List the logged-in user's workspaces. */
3632
+ declare function useWorkspaces(options?: {
3633
+ enabled?: boolean;
3634
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
3549
3635
  external_id: string;
3550
3636
  name: string;
3551
3637
  description: string | null;
3552
3638
  is_public: boolean;
3553
- workspace_type: components["schemas"]["WorkspaceType"];
3639
+ workspace_type: _arbidocs_client.components["schemas"]["WorkspaceType"];
3554
3640
  created_by_ext_id: string;
3555
3641
  updated_by_ext_id?: string | null | undefined;
3556
3642
  created_at: string;
@@ -3575,7 +3661,7 @@ declare function useCreateWorkspace(): _tanstack_react_query.UseMutationResult<{
3575
3661
  is_identity_verified: boolean;
3576
3662
  temporary_access_only: boolean;
3577
3663
  };
3578
- role: components["schemas"]["WorkspaceRole"];
3664
+ role: _arbidocs_client.components["schemas"]["WorkspaceRole"];
3579
3665
  joined_at: string;
3580
3666
  conversation_count: number;
3581
3667
  document_count: number;
@@ -3595,620 +3681,53 @@ declare function useCreateWorkspace(): _tanstack_react_query.UseMutationResult<{
3595
3681
  documents_done: number;
3596
3682
  documents_total: number;
3597
3683
  } | null | undefined;
3598
- }, Error, CreateWorkspaceVars, unknown>;
3599
- /** Move a workspace (open or not) to another project; both projects' counts change. */
3600
- declare function useMoveWorkspaceToProject(): _tanstack_react_query.UseMutationResult<{
3601
- workspace_ext_id: string;
3602
- project_ext_id: string;
3603
- project_name: string;
3604
- moved: boolean;
3605
- }, Error, {
3606
- workspaceId: string;
3607
- projectId: string;
3608
- }, unknown>;
3609
- /** Change the open workspace's name, description or visibility. */
3610
- declare function useUpdateWorkspace(): _tanstack_react_query.UseMutationResult<{
3684
+ }[]>, Error>;
3685
+ /** Every version of the document `docId`, oldest first (`is_current` marks the current one). */
3686
+ declare function useDocumentVersionList(docId: string | null | undefined, options?: {
3687
+ enabled?: boolean;
3688
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
3689
+ n: number;
3690
+ created_at?: string | null | undefined;
3691
+ created_by_ext_id?: string | null | undefined;
3692
+ reason: "upload" | "edit" | "signed" | "sync";
3693
+ file_name?: string | null | undefined;
3694
+ file_type?: string | null | undefined;
3695
+ file_size?: number | null | undefined;
3696
+ content_hash?: string | null | undefined;
3697
+ status?: string | null | undefined;
3698
+ n_pages?: number | null | undefined;
3699
+ n_chunks?: number | null | undefined;
3700
+ made_from?: number | null | undefined;
3701
+ is_current: boolean;
3702
+ markup_revision: number;
3703
+ markup_count: number;
3704
+ source_message_ext_id?: string | null | undefined;
3705
+ conversation_ext_id?: string | null | undefined;
3706
+ }[]>, Error>;
3707
+ /**
3708
+ * A workspace's conversations (threads and tasks). The list is kept current by its writers and the
3709
+ * workspace's events (`conversation-list`), so it is not re-read on every mount; `live` re-reads it
3710
+ * on a timer instead, faster while something is generating, for a view that follows runs by itself.
3711
+ */
3712
+ declare function useConversations(workspaceId: string | undefined, options?: {
3713
+ enabled?: boolean;
3714
+ live?: boolean;
3715
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
3716
+ label_ext_ids?: string[] | undefined;
3611
3717
  external_id: string;
3612
- name: string;
3613
- description: string | null;
3614
- is_public: boolean;
3615
- workspace_type: components["schemas"]["WorkspaceType"];
3718
+ title: string | null;
3616
3719
  created_by_ext_id: string;
3617
3720
  updated_by_ext_id?: string | null | undefined;
3618
3721
  created_at: string;
3619
3722
  updated_at: string;
3620
- wrapped_key?: string | null | undefined;
3621
- is_member: boolean;
3622
- shared_conversation_count: number;
3623
- private_conversation_count: number;
3624
- shared_document_count: number;
3625
- private_document_count: number;
3626
- user_files_mb: number;
3627
- users: {
3628
- user: {
3629
- external_id: string;
3630
- parent_ext_id?: string | null | undefined;
3631
- email: string;
3632
- given_name: string;
3633
- family_name?: string | null | undefined;
3634
- picture?: string | null | undefined;
3635
- encryption_public_key: string;
3636
- is_sso: boolean;
3637
- is_identity_verified: boolean;
3638
- temporary_access_only: boolean;
3639
- };
3640
- role: components["schemas"]["WorkspaceRole"];
3641
- joined_at: string;
3642
- conversation_count: number;
3643
- document_count: number;
3644
- files_mb: number;
3645
- agent_ext_id?: string | null | undefined;
3646
- is_temporary: boolean;
3647
- access_expires_at?: string | null | undefined;
3648
- }[];
3649
- project_ext_id?: string | null | undefined;
3650
- project_name?: string | null | undefined;
3651
- project_subscription?: string | null | undefined;
3652
- project_owner_ext_id?: string | null | undefined;
3653
- house_template_ext_id?: string | null | undefined;
3654
- archive?: {
3655
- status: "archiving" | "archived" | "restoring";
3656
- archived_at: string;
3657
- documents_done: number;
3658
- documents_total: number;
3659
- } | null | undefined;
3660
- }, Error, {
3661
- name?: string | null;
3662
- description?: string | null;
3663
- is_public?: boolean | null;
3664
- workspace_type?: components["schemas"]["WorkspaceType"] | null;
3665
- project_ext_id?: string | null;
3666
- house_template_ext_id?: string | null;
3667
- }, unknown>;
3668
-
3669
- type WorkspaceMember = components['schemas']['WorkspaceUserResponse'];
3670
- type AddWorkspaceMembersRequest = workspaces.AddWorkspaceMembersRequest;
3671
- type WorkspaceRole = 'owner' | 'collaborator' | 'guest';
3672
- /**
3673
- * A workspace's members (default: the open one). `beforeFetch` runs first (e.g. to re-open the
3674
- * workspace on the session); `enabled` overrides the "a workspace is open" gate.
3675
- */
3676
- declare function useWorkspaceUsers(workspaceId?: string | null, options?: {
3677
- enabled?: boolean;
3678
- beforeFetch?: () => Promise<unknown>;
3679
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
3680
- user: components["schemas"]["UserResponse"];
3681
- role: components["schemas"]["WorkspaceRole"];
3682
- joined_at: string;
3683
- conversation_count: number;
3684
- document_count: number;
3685
- files_mb: number;
3686
- agent_ext_id?: string | null;
3687
- is_temporary: boolean;
3688
- access_expires_at?: string | null;
3689
- }[]>, Error>;
3690
- /**
3691
- * Add people to a workspace, with the whole request: the open workspace, or `workspace_ext_id`
3692
- * with its key sealed to this session; a session-scoped grant (`session_pubkey_b64`); an invitation
3693
- * to people not on the platform (`confirm_invite`, which also leaves a pending grant on their
3694
- * contact); a share of one resource (`resource_type`, `resource_ext_id`). Resolves with the
3695
- * memberships added (someone already a member, or not on the platform, is missing from it).
3696
- */
3697
- declare function useAddWorkspaceMembers(): _tanstack_react_query.UseMutationResult<{
3698
- user: components["schemas"]["UserResponse"];
3699
- role: components["schemas"]["WorkspaceRole"];
3700
- joined_at: string;
3701
- conversation_count: number;
3702
- document_count: number;
3703
- files_mb: number;
3704
- agent_ext_id?: string | null;
3705
- is_temporary: boolean;
3706
- access_expires_at?: string | null;
3707
- }[], Error, Omit<{
3708
- emails: string[];
3709
- role: components["schemas"]["WorkspaceRole"];
3710
- workspace_key?: string | null;
3711
- workspace_ext_id?: string | null;
3712
- session_pubkey_b64?: string | null;
3713
- access_duration_seconds: number;
3714
- confirm_invite?: boolean | null;
3715
- resource_type?: ("document" | "conversation") | null;
3716
- resource_ext_id?: string | null;
3717
- confirm_share?: boolean | null;
3718
- }, "access_duration_seconds"> & {
3719
- access_duration_seconds?: number;
3720
- }, unknown>;
3721
- /** Remove people from the open workspace (owners; anyone may remove themselves: leaving). */
3722
- declare function useRemoveWorkspaceMembers(): _tanstack_react_query.UseMutationResult<void, Error, string[], unknown>;
3723
- /** Change people's role in the open workspace (owners). */
3724
- declare function useSetWorkspaceMemberRoles(): _tanstack_react_query.UseMutationResult<{
3725
- user: {
3726
- external_id: string;
3727
- parent_ext_id?: string | null | undefined;
3728
- email: string;
3729
- given_name: string;
3730
- family_name?: string | null | undefined;
3731
- picture?: string | null | undefined;
3732
- encryption_public_key: string;
3733
- is_sso: boolean;
3734
- is_identity_verified: boolean;
3735
- temporary_access_only: boolean;
3736
- };
3737
- role: components["schemas"]["WorkspaceRole"];
3738
- joined_at: string;
3739
- conversation_count: number;
3740
- document_count: number;
3741
- files_mb: number;
3742
- agent_ext_id?: string | null | undefined;
3743
- is_temporary: boolean;
3744
- access_expires_at?: string | null | undefined;
3745
- }[], Error, {
3746
- userIds: string[];
3747
- role: WorkspaceRole;
3748
- }, unknown>;
3749
-
3750
- /**
3751
- * Delete workspaces (owners only). They go to Recently deleted, where they can be restored for a
3752
- * while; the workspace list refreshes.
3753
- */
3754
- declare function useDeleteWorkspaces(): _tanstack_react_query.UseMutationResult<void, Error, string[], unknown>;
3755
-
3756
- type TransferScope = components['schemas']['TransferScope'];
3757
- type TransferKind = components['schemas']['TransferKind'];
3758
- type TransferMode = components['schemas']['TransferMode'];
3759
- type TransferPlan = components['schemas']['TransferPlanResponse'];
3760
- type TransferStatus = components['schemas']['TransferStatusResponse'];
3761
- type TransferConflictPolicy = components['schemas']['ConflictPolicy'];
3762
- type WorkspaceExport = components['schemas']['WorkspaceExportResponse'];
3763
- /** Polling cadence while a job runs; it goes idle once the job has finished. */
3764
- declare const TRANSFER_POLL_MS = 1500;
3765
- /** A job no worker runs any more (interrupted, cancelled, failed, or done with failures). */
3766
- declare function isTransferResumable(status: TransferStatus): boolean;
3767
- /** The job has stopped (it is neither queued nor running). */
3768
- declare function isTransferFinished(status: TransferStatus | null | undefined): boolean;
3769
- /** What a scope would take in the open workspace; re-read when the scope or the mode changes. */
3770
- declare function usePlanWorkspaceTransfer(scope: TransferScope, mode: TransferMode, options?: {
3771
- enabled?: boolean;
3772
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
3773
- counts: {
3774
- [key: string]: number;
3775
- };
3776
- added: {
3777
- [key: string]: number;
3778
- };
3779
- relations_inside: number;
3780
- relations_outside: number;
3781
- dangling_references: number;
3782
- not_removable: number;
3783
- total_bytes: number;
3784
- item_count: number;
3785
- }>, Error>;
3786
- /** Start copying or moving into another workspace (a background job). */
3787
- declare function useStartWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
3788
- external_id: string;
3789
- mode: components["schemas"]["TransferMode"];
3790
- status: components["schemas"]["TransferStatus"];
3791
- phase: components["schemas"]["TransferPhase"];
3792
- source_workspace_ext_id?: string | null;
3793
- target_workspace_ext_id?: string | null;
3794
- total: number;
3795
- processed: number;
3796
- counts: {
3797
- [key: string]: unknown;
3798
- };
3799
- error?: string | null;
3800
- created_at: string;
3801
- finished_at?: string | null;
3802
- issues: components["schemas"]["TransferItemResult"][];
3803
- }, Error, {
3804
- scope: TransferScope;
3805
- mode: TransferMode;
3806
- targetWorkspaceId: string;
3807
- onConflict?: TransferConflictPolicy;
3808
- }, unknown>;
3809
- /** Resume a stopped job (nothing is copied twice). */
3810
- declare function useResumeWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
3811
- external_id: string;
3812
- mode: components["schemas"]["TransferMode"];
3813
- status: components["schemas"]["TransferStatus"];
3814
- phase: components["schemas"]["TransferPhase"];
3815
- source_workspace_ext_id?: string | null;
3816
- target_workspace_ext_id?: string | null;
3817
- total: number;
3818
- processed: number;
3819
- counts: {
3820
- [key: string]: unknown;
3821
- };
3822
- error?: string | null;
3823
- created_at: string;
3824
- finished_at?: string | null;
3825
- issues: components["schemas"]["TransferItemResult"][];
3826
- }, Error, {
3827
- transferId: string;
3828
- targetWorkspaceId: string;
3829
- }, unknown>;
3830
- declare function useCancelWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
3831
- external_id: string;
3832
- mode: components["schemas"]["TransferMode"];
3833
- status: components["schemas"]["TransferStatus"];
3834
- phase: components["schemas"]["TransferPhase"];
3835
- source_workspace_ext_id?: string | null | undefined;
3836
- target_workspace_ext_id?: string | null | undefined;
3837
- total: number;
3838
- processed: number;
3839
- counts: {
3840
- [x: string]: unknown;
3841
- };
3842
- error?: string | null | undefined;
3843
- created_at: string;
3844
- finished_at?: string | null | undefined;
3845
- issues: {
3846
- kind: string;
3847
- source_ext_id: string;
3848
- target_ext_id?: string | null | undefined;
3849
- status: components["schemas"]["TransferItemStatus"];
3850
- message?: string | null | undefined;
3851
- }[];
3852
- }, Error, string, unknown>;
3853
- /** One job's progress, polled while it runs. */
3854
- declare function useWorkspaceTransfer(transferId: string | null): _tanstack_react_query.UseQueryResult<NoInfer<{
3855
- external_id: string;
3856
- mode: components["schemas"]["TransferMode"];
3857
- status: components["schemas"]["TransferStatus"];
3858
- phase: components["schemas"]["TransferPhase"];
3859
- source_workspace_ext_id?: string | null;
3860
- target_workspace_ext_id?: string | null;
3861
- total: number;
3862
- processed: number;
3863
- counts: {
3864
- [key: string]: unknown;
3865
- };
3866
- error?: string | null;
3867
- created_at: string;
3868
- finished_at?: string | null;
3869
- issues: components["schemas"]["TransferItemResult"][];
3870
- }>, Error>;
3871
- /** The caller's recent jobs out of the open workspace (to offer a resume). */
3872
- declare function useWorkspaceTransfers(options?: {
3873
- enabled?: boolean;
3874
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
3875
- external_id: string;
3876
- mode: components["schemas"]["TransferMode"];
3877
- status: components["schemas"]["TransferStatus"];
3878
- phase: components["schemas"]["TransferPhase"];
3879
- source_workspace_ext_id?: string | null;
3880
- target_workspace_ext_id?: string | null;
3881
- total: number;
3882
- processed: number;
3883
- counts: {
3884
- [key: string]: unknown;
3885
- };
3886
- error?: string | null;
3887
- created_at: string;
3888
- finished_at?: string | null;
3889
- issues: components["schemas"]["TransferItemResult"][];
3890
- }[]>, Error>;
3891
- /** What to refresh once a job has finished: the workspaces' counts always, this one's lists after a move. */
3892
- declare function useInvalidateAfterTransfer(): (mode: TransferMode) => void;
3893
- interface ExportDownloadRequest {
3894
- scope: TransferScope;
3895
- /** Documents known to the page, for `index.csv` (only those in the export are listed). */
3896
- documents?: WorkspaceDocument[];
3897
- /** CSV columns: undefined = all standard columns, [] = no index.csv. */
3898
- csvColumns?: string[];
3899
- }
3900
- /**
3901
- * Download a scope of the open workspace as files: its documents (every version, and each
3902
- * version's markup PDF), one JSON file per entity type and a manifest (`buildWorkspaceArchive`).
3903
- */
3904
- declare function useWorkspaceExportDownload({ workspaceName }?: {
3905
- workspaceName?: string;
3906
- }): {
3907
- download: ({ scope, documents, csvColumns }: ExportDownloadRequest) => Promise<boolean>;
3908
- isDownloading: boolean;
3909
- progress: {
3910
- done: number;
3911
- total: number;
3912
- } | null;
3913
- };
3914
-
3915
- /**
3916
- * Assemble the workspace export archive from `POST /v1/workspace/export`.
3917
- *
3918
- * manifest.json what the archive is: format, scope, counts, layout
3919
- * documents/<folder>/<name> current versions (older ones under documents/_versions/); one
3920
- * document id may name several files, one per version
3921
- * .../<name> (markup).pdf beside a version with markup: its PDF with the annotations as
3922
- * native PDF annotations
3923
- * data/<entity>.json one JSON array per entity type, cross-referenced by external_id
3924
- * index.csv the documents' metadata table (when columns were chosen)
3925
- *
3926
- * Pure apart from `fetchFile`, so it is tested without a network.
3927
- */
3928
-
3929
- type ExportFileKind = 'original' | 'markup';
3930
- interface BuildArchiveInput {
3931
- exportData: WorkspaceExport;
3932
- /**
3933
- * Fetch one file: a version of a document (`original`), or that version's markup PDF
3934
- * (`markup`); `null` when it could not be fetched.
3935
- */
3936
- fetchFile: (docExtId: string, version: number, kind: ExportFileKind) => Promise<Blob | null>;
3937
- /** Ready-made `index.csv` content, or null for none. */
3938
- metadataCsv?: string | null;
3939
- onProgress?: (done: number, total: number) => void;
3940
- }
3941
- interface BuiltArchive {
3942
- blob: Blob;
3943
- fileCount: number;
3944
- /** Archive paths of the files that could not be fetched. */
3945
- failed: string[];
3946
- }
3947
- declare function buildWorkspaceArchive({ exportData, fetchFile, metadataCsv, onProgress, }: BuildArchiveInput): Promise<BuiltArchive>;
3948
-
3949
- /** What a request carries, sealed from the requester to the owner. */
3950
- interface AccessRequestPayload {
3951
- session_pubkey_b64: string;
3952
- note?: string;
3953
- }
3954
- /**
3955
- * Open a request's sealed content with the signed-in person's key. Null when no one is signed in
3956
- * or it cannot be opened (not meant for them, damaged).
3957
- */
3958
- declare function openAccessRequest(content: string, requesterPublicKey: string): Promise<AccessRequestPayload | null>;
3959
- /** Who a request goes to: anyone we can address and seal to. */
3960
- interface AccessRequestRecipient {
3961
- external_id: string;
3962
- encryption_public_key: string;
3963
- }
3964
- /** What a request says beyond the session key: a note, and (rarely) the workspace it is for. */
3965
- interface RequestAccessOptions {
3966
- note?: string;
3967
- /**
3968
- * Only when the workspace is already known (an invite-and-share completed after sign-up): it
3969
- * locks the owner's review to it. Otherwise the owner picks.
3970
- */
3971
- workspaceExtId?: string;
3972
- }
3973
- /**
3974
- * Ask someone for workspace access: seal this session's public key (for a temporary grant) and a
3975
- * note to them, and send it as a `workspace_access_request` notification.
3976
- */
3977
- declare function useRequestWorkspaceAccess(): _tanstack_react_query.UseMutationResult<{
3978
- type: _arbidocs_client.components["schemas"]["NotificationType"];
3979
- external_id: string;
3980
- sender: {
3981
- external_id: string;
3982
- parent_ext_id?: string | null | undefined;
3983
- email: string;
3984
- given_name: string;
3985
- family_name?: string | null | undefined;
3986
- picture?: string | null | undefined;
3987
- encryption_public_key: string;
3988
- is_sso: boolean;
3989
- is_identity_verified: boolean;
3990
- temporary_access_only: boolean;
3991
- };
3992
- recipient: {
3993
- external_id: string;
3994
- parent_ext_id?: string | null | undefined;
3995
- email: string;
3996
- given_name: string;
3997
- family_name?: string | null | undefined;
3998
- picture?: string | null | undefined;
3999
- encryption_public_key: string;
4000
- is_sso: boolean;
4001
- is_identity_verified: boolean;
4002
- temporary_access_only: boolean;
4003
- };
4004
- workspace_ext_id?: string | null | undefined;
4005
- content?: string | null | undefined;
4006
- conversation_ext_id?: string | null | undefined;
4007
- message_ext_id?: string | null | undefined;
4008
- read: boolean;
4009
- created_at: string;
4010
- updated_at: string;
4011
- }, Error, {
4012
- recipient: AccessRequestRecipient;
4013
- options?: RequestAccessOptions;
4014
- }, unknown>;
4015
-
4016
- type WorkspaceArchive = components['schemas']['WorkspaceArchiveRead'];
4017
- type WorkspaceArchiveState = components['schemas']['WorkspaceArchiveState'];
4018
- type UnarchiveEstimate = components['schemas']['UnarchiveEstimate'];
4019
- /** How often a workspace on its way to or from the archive is checked. */
4020
- declare const ARCHIVE_POLL_MS = 5000;
4021
- /** Its files are moving (to the archive, or back and re-indexing): progress keeps changing. */
4022
- declare const isArchiveMoving: (status: string | null | undefined) => status is "archiving" | "restoring";
4023
- /** A workspace's archive state, bytes per tier and (while archived) what unarchiving costs. */
4024
- declare function useWorkspaceArchive(workspaceId: string | null | undefined, enabled?: boolean): _tanstack_react_query.UseQueryResult<NoInfer<{
4025
- workspace_ext_id: string;
4026
- status: "live" | "archiving" | "archived" | "restoring";
4027
- archived_at: string | null;
4028
- documents_done: number;
4029
- documents_total: number;
4030
- can_manage: boolean;
4031
- available: boolean;
4032
- live_bytes: number;
4033
- archived_bytes: number;
4034
- error?: string | null;
4035
- estimate?: components["schemas"]["UnarchiveEstimate"] | null;
4036
- }>, Error>;
4037
- /** Archive a workspace (its owner or its project's owner). */
4038
- declare function useArchiveWorkspace(): _tanstack_react_query.UseMutationResult<{
4039
- workspace_ext_id: string;
4040
- status: "live" | "archiving" | "archived" | "restoring";
4041
- archived_at: string | null;
4042
- documents_done: number;
4043
- documents_total: number;
4044
- can_manage: boolean;
4045
- available: boolean;
4046
- live_bytes: number;
4047
- archived_bytes: number;
4048
- error?: string | null;
4049
- estimate?: components["schemas"]["UnarchiveEstimate"] | null;
4050
- }, Error, string, unknown>;
4051
- /** Start unarchiving a workspace; refused up front when the AI budget cannot cover the re-index. */
4052
- declare function useUnarchiveWorkspace(): _tanstack_react_query.UseMutationResult<{
4053
- workspace_ext_id: string;
4054
- status: "live" | "archiving" | "archived" | "restoring";
4055
- archived_at: string | null;
4056
- documents_done: number;
4057
- documents_total: number;
4058
- can_manage: boolean;
4059
- available: boolean;
4060
- live_bytes: number;
4061
- archived_bytes: number;
4062
- error?: string | null;
4063
- estimate?: components["schemas"]["UnarchiveEstimate"] | null;
4064
- }, Error, string, unknown>;
4065
- /**
4066
- * Keep the workspace list fresh while any workspace in it is archiving or restoring, so its card
4067
- * shows the progress and opens again as soon as it is back.
4068
- */
4069
- declare function useArchiveProgressPolling(workspaces: ReadonlyArray<{
4070
- archive?: {
4071
- status?: string | null;
4072
- } | null;
4073
- }> | undefined): void;
4074
-
4075
- /**
4076
- * Types for a document's parsed content (`GET /v1/document/{id}/parsed-{stage}`).
4077
- *
4078
- * The SDK returns this endpoint untyped (`Record<string, unknown>`); these are
4079
- * the structural types the review viewer relies on. Kept dependency-free so both
4080
- * the `useParsedDocument` hook and `<DocumentReview>` can import them.
4081
- */
4082
- interface ParsedChunkMetadata {
4083
- page_number?: number;
4084
- /** Stable chunk id — the join key for citations (`CitationData.chunk_ids`). */
4085
- chunk_ext_id?: string;
4086
- chunk_pg_idx?: number;
4087
- chunk_doc_idx?: number;
4088
- doc_title?: string;
4089
- heading?: string | null;
4090
- heading_level?: number | null;
4091
- /** JSON mode only: "text" | "header" | "table" | "figure" | … */
4092
- element_type?: string;
4093
- /** JSON mode only: [x_min, y_min, x_max, y_max]. */
4094
- bbox?: [number, number, number, number];
4095
- }
4096
- interface ParsedChunk {
4097
- /** Markdown content of the chunk. */
4098
- content: string;
4099
- metadata: ParsedChunkMetadata;
4100
- }
4101
- interface ParsedDocumentMetadata {
4102
- total_number_of_pages?: number;
4103
- file_name?: string;
4104
- output_mode?: string;
4105
- }
4106
- interface ParsedDocument {
4107
- metadata?: ParsedDocumentMetadata;
4108
- footnotes?: Record<string, string>;
4109
- chunks: ParsedChunk[];
4110
- }
4111
-
4112
- /** List the logged-in user's workspaces. */
4113
- declare function useWorkspaces(options?: {
4114
- enabled?: boolean;
4115
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
4116
- external_id: string;
4117
- name: string;
4118
- description: string | null;
4119
- is_public: boolean;
4120
- workspace_type: _arbidocs_client.components["schemas"]["WorkspaceType"];
4121
- created_by_ext_id: string;
4122
- updated_by_ext_id?: string | null | undefined;
4123
- created_at: string;
4124
- updated_at: string;
4125
- wrapped_key?: string | null | undefined;
4126
- is_member: boolean;
4127
- shared_conversation_count: number;
4128
- private_conversation_count: number;
4129
- shared_document_count: number;
4130
- private_document_count: number;
4131
- user_files_mb: number;
4132
- users: {
4133
- user: {
4134
- external_id: string;
4135
- parent_ext_id?: string | null | undefined;
4136
- email: string;
4137
- given_name: string;
4138
- family_name?: string | null | undefined;
4139
- picture?: string | null | undefined;
4140
- encryption_public_key: string;
4141
- is_sso: boolean;
4142
- is_identity_verified: boolean;
4143
- temporary_access_only: boolean;
4144
- };
4145
- role: _arbidocs_client.components["schemas"]["WorkspaceRole"];
4146
- joined_at: string;
4147
- conversation_count: number;
4148
- document_count: number;
4149
- files_mb: number;
4150
- agent_ext_id?: string | null | undefined;
4151
- is_temporary: boolean;
4152
- access_expires_at?: string | null | undefined;
4153
- }[];
4154
- project_ext_id?: string | null | undefined;
4155
- project_name?: string | null | undefined;
4156
- project_subscription?: string | null | undefined;
4157
- project_owner_ext_id?: string | null | undefined;
4158
- house_template_ext_id?: string | null | undefined;
4159
- archive?: {
4160
- status: "archiving" | "archived" | "restoring";
4161
- archived_at: string;
4162
- documents_done: number;
4163
- documents_total: number;
4164
- } | null | undefined;
4165
- }[]>, Error>;
4166
- /** Every version of the document `docId`, oldest first (`is_current` marks the current one). */
4167
- declare function useDocumentVersionList(docId: string | null | undefined, options?: {
4168
- enabled?: boolean;
4169
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
4170
- n: number;
4171
- created_at?: string | null | undefined;
4172
- created_by_ext_id?: string | null | undefined;
4173
- reason: "upload" | "edit" | "signed" | "sync";
4174
- file_name?: string | null | undefined;
4175
- file_type?: string | null | undefined;
4176
- file_size?: number | null | undefined;
4177
- content_hash?: string | null | undefined;
4178
- status?: string | null | undefined;
4179
- n_pages?: number | null | undefined;
4180
- n_chunks?: number | null | undefined;
4181
- made_from?: number | null | undefined;
4182
- is_current: boolean;
4183
- markup_revision: number;
4184
- markup_count: number;
4185
- source_message_ext_id?: string | null | undefined;
4186
- conversation_ext_id?: string | null | undefined;
4187
- }[]>, Error>;
4188
- /**
4189
- * A workspace's conversations (threads and tasks). The list is kept current by its writers and the
4190
- * workspace's events (`conversation-list`), so it is not re-read on every mount; `live` re-reads it
4191
- * on a timer instead, faster while something is generating, for a view that follows runs by itself.
4192
- */
4193
- declare function useConversations(workspaceId: string | undefined, options?: {
4194
- enabled?: boolean;
4195
- live?: boolean;
4196
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
4197
- label_ext_ids?: string[] | undefined;
4198
- external_id: string;
4199
- title: string | null;
4200
- created_by_ext_id: string;
4201
- updated_by_ext_id?: string | null | undefined;
4202
- created_at: string;
4203
- updated_at: string;
4204
- is_shared: boolean;
4205
- message_count: number;
4206
- last_message_actor?: {
4207
- external_id: string;
4208
- given_name: string;
4209
- family_name?: string | null | undefined;
4210
- picture?: string | null | undefined;
4211
- parent_ext_id?: string | null | undefined;
3723
+ is_shared: boolean;
3724
+ message_count: number;
3725
+ last_message_actor?: {
3726
+ external_id: string;
3727
+ given_name: string;
3728
+ family_name?: string | null | undefined;
3729
+ picture?: string | null | undefined;
3730
+ parent_ext_id?: string | null | undefined;
4212
3731
  } | null | undefined;
4213
3732
  last_message_ext_id?: string | null | undefined;
4214
3733
  last_message_role?: string | null | undefined;
@@ -5771,203 +5290,1054 @@ declare function useProjectUsage(projectExtId: string | undefined, monthsBack?:
5771
5290
  invoice_pdf?: string | null;
5772
5291
  }>>;
5773
5292
  };
5774
- /** One day of aggregated usage across projects (for a spend/token trend). */
5775
- interface AggregatedDailyUsage {
5776
- date: string;
5777
- /** £ of AI usage that day. */
5778
- gbp: number;
5779
- totalTokens: number;
5780
- apiRequests: number;
5293
+ /** One day of aggregated usage across projects (for a spend/token trend). */
5294
+ interface AggregatedDailyUsage {
5295
+ date: string;
5296
+ /** £ of AI usage that day. */
5297
+ gbp: number;
5298
+ totalTokens: number;
5299
+ apiRequests: number;
5300
+ }
5301
+ /** One model group's aggregated usage across projects (for a breakdown). */
5302
+ interface AggregatedModelGroupUsage {
5303
+ model: string;
5304
+ /** £ of AI usage by this model group. */
5305
+ gbp: number;
5306
+ totalTokens: number;
5307
+ promptTokens: number;
5308
+ completionTokens: number;
5309
+ successfulRequests: number;
5310
+ }
5311
+ /** Aggregated AI usage + spend across several projects. */
5312
+ interface ProjectsUsageAggregate {
5313
+ /** Summed usage across the projects, in £ (ex VAT). */
5314
+ totalGbp: number;
5315
+ /** Summed token count across the projects. */
5316
+ totalTokens: number;
5317
+ /** Summed API request count across the projects. */
5318
+ totalRequests: number;
5319
+ /** Per-day totals merged across every project, oldest first. */
5320
+ daily: AggregatedDailyUsage[];
5321
+ /** Per-model-group totals merged across every project, most £ first. */
5322
+ modelGroups: AggregatedModelGroupUsage[];
5323
+ /**
5324
+ * False when none of the loaded projects records usage (billing is off on this deployment), so
5325
+ * zeros mean "not metered". True while anything real was recorded, or before data arrived.
5326
+ */
5327
+ metered: boolean;
5328
+ /** True while any per-project query is still loading. */
5329
+ isLoading: boolean;
5330
+ /** True if any per-project query errored. */
5331
+ isError: boolean;
5332
+ }
5333
+ /**
5334
+ * Firm-wide AI usage + spend: aggregates {@link useProjectUsage} across several
5335
+ * projects (e.g. all of a firm's matters) in parallel and merges the real totals,
5336
+ * the daily trend, and the per-model breakdown. Shares the per-project query
5337
+ * cache, so it costs nothing extra where a project's usage is already loaded.
5338
+ * Numbers are genuine — zero projects (or zero billed work) yields zero totals;
5339
+ * callers render that honestly.
5340
+ */
5341
+ declare function useProjectsUsage(projectExtIds: string[], monthsBack?: number, options?: {
5342
+ enabled?: boolean;
5343
+ }): ProjectsUsageAggregate;
5344
+ /** List the Stripe invoices for a project's subscription. */
5345
+ declare function useProjectInvoices(projectExtId: string | undefined, options?: {
5346
+ enabled?: boolean;
5347
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
5348
+ project_ext_id: string;
5349
+ invoices: _arbidocs_client.components["schemas"]["ProjectInvoice"][];
5350
+ }>, Error>;
5351
+ /**
5352
+ * The signed-in user from `GET /v1/user/me`. Refetched on window focus, so a role granted or
5353
+ * removed elsewhere shows up without a reload; invalidate `arbiQueryKeys.currentUser()` after a
5354
+ * change you made yourself.
5355
+ */
5356
+ declare function useCurrentUser(options?: {
5357
+ enabled?: boolean;
5358
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
5359
+ external_id: string;
5360
+ parent_ext_id?: string | null;
5361
+ email: string;
5362
+ given_name: string;
5363
+ family_name?: string | null;
5364
+ picture?: string | null;
5365
+ encryption_public_key: string;
5366
+ is_sso: boolean;
5367
+ is_identity_verified: boolean;
5368
+ temporary_access_only: boolean;
5369
+ can_create_projects: boolean;
5370
+ is_deployment_admin: boolean;
5371
+ user_type: _arbidocs_client.components["schemas"]["UserRole"];
5372
+ can_upgrade_projects: boolean;
5373
+ is_billing_manager: boolean;
5374
+ }>, Error>;
5375
+ /**
5376
+ * The firm's pooled monthly £ of AI usage (Box deployments). A 403 (the caller is not a firm member
5377
+ * or Box admin) is not retried: treat an error like `has_pool: false` and show nothing.
5378
+ */
5379
+ declare function useFirmPool(options?: {
5380
+ enabled?: boolean;
5381
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
5382
+ has_pool: boolean;
5383
+ month?: string | null;
5384
+ resets_at?: string | null;
5385
+ licence_status?: string | null;
5386
+ expires_at?: string | null;
5387
+ premium_only: boolean;
5388
+ users?: number | null;
5389
+ storage_gb?: number | null;
5390
+ ai_gbp?: number | null;
5391
+ unlimited_standard_ai?: boolean | null;
5392
+ interval?: string | null;
5393
+ kept_until?: string | null;
5394
+ renews?: _arbidocs_client.components["schemas"]["FirmRenewingQuantities"] | null;
5395
+ support?: string | null;
5396
+ addon_gbp?: number | null;
5397
+ base_gbp?: number | null;
5398
+ auto_addons?: number | null;
5399
+ auto_addon_gbp?: number | null;
5400
+ auto_storage_gb?: number | null;
5401
+ auto_addon_price_pence?: number | null;
5402
+ auto_addon_spent_pence?: number | null;
5403
+ auto_addon_limit_pence?: number | null;
5404
+ total_gbp?: number | null;
5405
+ used_gbp?: number | null;
5406
+ remaining_gbp?: number | null;
5407
+ people_this_month?: number | null;
5408
+ report_computed_at?: string | null;
5409
+ subscription_status?: string | null;
5410
+ cancel_at_period_end?: boolean | null;
5411
+ period_end?: string | null;
5412
+ can_top_up: boolean;
5413
+ storage_used_gb?: number | null;
5414
+ internal_users?: number | null;
5415
+ }>, Error>;
5416
+ /**
5417
+ * Whether this deployment runs under a Box licence (`isBox`) and whether the user administers it in
5418
+ * the ARBI portal (`isBoxAdmin`), from the firm pool. Anyone outside the firm gets a 403 (not
5419
+ * retried), read as no Box. The API has no Box-admin flag yet: `can_top_up` is true only for a Box
5420
+ * admin of a licence central can bill, so admins of a hand-set licence read as members for now.
5421
+ */
5422
+ declare function useBoxRole(options?: {
5423
+ enabled?: boolean;
5424
+ }): {
5425
+ isBox: boolean;
5426
+ isBoxAdmin: boolean;
5427
+ };
5428
+ /** Buy add-ons for the firm (Box admins). Refreshes the pool; the result may carry an invoice URL. */
5429
+ declare function useTopUpFirmPool(): _tanstack_react_query.UseMutationResult<{
5430
+ pool: {
5431
+ has_pool: boolean;
5432
+ month?: string | null | undefined;
5433
+ resets_at?: string | null | undefined;
5434
+ licence_status?: string | null | undefined;
5435
+ expires_at?: string | null | undefined;
5436
+ premium_only: boolean;
5437
+ users?: number | null | undefined;
5438
+ storage_gb?: number | null | undefined;
5439
+ ai_gbp?: number | null | undefined;
5440
+ unlimited_standard_ai?: boolean | null | undefined;
5441
+ interval?: string | null | undefined;
5442
+ kept_until?: string | null | undefined;
5443
+ renews?: {
5444
+ users?: number | null | undefined;
5445
+ storage_gb?: number | null | undefined;
5446
+ ai_gbp?: number | null | undefined;
5447
+ unlimited_standard_ai?: boolean | null | undefined;
5448
+ support?: string | null | undefined;
5449
+ } | null | undefined;
5450
+ support?: string | null | undefined;
5451
+ addon_gbp?: number | null | undefined;
5452
+ base_gbp?: number | null | undefined;
5453
+ auto_addons?: number | null | undefined;
5454
+ auto_addon_gbp?: number | null | undefined;
5455
+ auto_storage_gb?: number | null | undefined;
5456
+ auto_addon_price_pence?: number | null | undefined;
5457
+ auto_addon_spent_pence?: number | null | undefined;
5458
+ auto_addon_limit_pence?: number | null | undefined;
5459
+ total_gbp?: number | null | undefined;
5460
+ used_gbp?: number | null | undefined;
5461
+ remaining_gbp?: number | null | undefined;
5462
+ people_this_month?: number | null | undefined;
5463
+ report_computed_at?: string | null | undefined;
5464
+ subscription_status?: string | null | undefined;
5465
+ cancel_at_period_end?: boolean | null | undefined;
5466
+ period_end?: string | null | undefined;
5467
+ can_top_up: boolean;
5468
+ storage_used_gb?: number | null | undefined;
5469
+ internal_users?: number | null | undefined;
5470
+ };
5471
+ invoice_url?: string | null | undefined;
5472
+ }, Error, number, unknown>;
5473
+ /** Why "New project" / "New workspace" is unavailable to someone who may not create them. */
5474
+ declare const PROJECT_CREATION_DENIED_REASON = "Only members of your firm can create projects and workspaces.";
5475
+ /**
5476
+ * Whether the signed-in user may create projects and workspaces. `undefined` while the user is
5477
+ * loading: callers should neither offer nor refuse creation until it is known.
5478
+ */
5479
+ declare function useCanCreateProjects(): boolean | undefined;
5480
+ /**
5481
+ * Today's deployment-wide AI usage (£, `used_gbp`) for the signed-in user: pair it with a project's
5482
+ * `daily_cap_per_user` for a "£ used today" indicator. Re-read on mount and window focus, and when
5483
+ * the host invalidates it after the user's own generation; never polled.
5484
+ */
5485
+ declare function useUserUsageToday(options?: {
5486
+ enabled?: boolean;
5487
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
5488
+ used_gbp: number;
5489
+ }>, Error>;
5490
+
5491
+ /**
5492
+ * The session state the blocks share (see `./store`). A host passes its own {@link ArbiSessionStore}
5493
+ * as the host configuration's `session` (ARBI-frontend backs it with its zustand store). Without
5494
+ * one, each top-level `<ArbiHost>` keeps an in-memory one, and blocks rendered with no host share a
5495
+ * module default, so a standalone block still coordinates with its siblings. A host's own store
5496
+ * keeps the composers' drafts across reloads, sealed to the person signed in on the host's `Arbi`
5497
+ * and only for them; the module default (no host, so no one signed in) keeps them in memory.
5498
+ */
5499
+
5500
+ /** The session store: its setters, and `getState()` for the state as of now (in callbacks). */
5501
+ declare function useArbiSessionStore(): ArbiSessionStore;
5502
+ /**
5503
+ * A slice of the session state; re-renders when it changes. The selector returns a value from the
5504
+ * state or a primitive (a new object each call would never settle).
5505
+ */
5506
+ declare function useArbiSessionState<T>(selector: (state: ArbiSessionState) => T): T;
5507
+ /**
5508
+ * A view setting kept in the session and saved across reloads (`views.values`: a page's view
5509
+ * mode, a zoom, a filter box's text), and its setter. `fallback` while none is set.
5510
+ */
5511
+ declare function useSessionView<T>(key: string, fallback: T): [T, (value: T) => void];
5512
+ /**
5513
+ * View state kept for this session only (`views.transient`: a search's results, a one-shot
5514
+ * request), and its setter (`undefined` drops it). `fallback` while none is set.
5515
+ */
5516
+ declare function useTransientView<T>(key: string, fallback: T): [T, (value: T | undefined) => void];
5517
+ /** A page's selected tab, kept across reloads; the host supplies its default tab. */
5518
+ declare function useSessionPageTab(page: string, fallback: string): {
5519
+ activeTab: string;
5520
+ setActiveTab: (tab: string) => void;
5521
+ };
5522
+
5523
+ /**
5524
+ * Who is signed in: the host `Arbi`'s session (`arbi.session`, the client's session state), the
5525
+ * one source for the user, the sign-in status and the SSO mode. Re-renders when it changes.
5526
+ */
5527
+
5528
+ type ArbiSessionStatus = 'signed-out' | 'signed-in';
5529
+ interface ArbiSignedInSession {
5530
+ /** `signed-in` once a login finished on this device (also before this tab has a token). */
5531
+ status: ArbiSessionStatus;
5532
+ /** The signed-in user; `null` signed out. */
5533
+ user: SessionUser | null;
5534
+ /** The account signs in through SSO. */
5535
+ isSso: boolean;
5536
+ /** This tab holds a server session (a token). A new tab or an offline unlock does not, yet. */
5537
+ hasToken: boolean;
5538
+ /** The server session key workspace keys are sealed to; `null` until known. */
5539
+ serverSessionKey: Uint8Array | null;
5781
5540
  }
5782
- /** One model group's aggregated usage across projects (for a breakdown). */
5783
- interface AggregatedModelGroupUsage {
5784
- model: string;
5785
- /** £ of AI usage by this model group. */
5786
- gbp: number;
5787
- totalTokens: number;
5788
- promptTokens: number;
5789
- completionTokens: number;
5790
- successfulRequests: number;
5541
+ /** The signed-in session of the host's `Arbi`; signed out without one. */
5542
+ declare function useArbiSession(): ArbiSignedInSession;
5543
+ /** The same for a session the caller holds (the host building its `Arbi` on it). */
5544
+ declare function useSignedInSession(session: SessionManager | null): ArbiSignedInSession;
5545
+
5546
+ /**
5547
+ * The workspace the app is in: the session's selection, as the workspace list has it, and the
5548
+ * signed-in person's membership in it.
5549
+ */
5550
+
5551
+ type Workspace = NonNullable<ReturnType<typeof useWorkspaces>['data']>[number];
5552
+ type WorkspaceRole$1 = components['schemas']['WorkspaceRole'];
5553
+ interface CurrentWorkspace {
5554
+ /** The selected workspace (`wrk-…`), also before the list has it; null on the workspace list. */
5555
+ workspaceId: string | null;
5556
+ /** Whether it is open on the server session. */
5557
+ workspaceStatus: ArbiWorkspaceStatus;
5558
+ /** Its entry in the workspace list (undefined until listed, or when it is no longer there). */
5559
+ workspace: Workspace | undefined;
5560
+ /** The signed-in person's role in it, null when they are not a member (a public workspace). */
5561
+ role: WorkspaceRole$1 | null;
5562
+ isMember: boolean;
5563
+ /** The signed-in person (`usr-…`). */
5564
+ userId: string | null;
5791
5565
  }
5792
- /** Aggregated AI usage + spend across several projects. */
5793
- interface ProjectsUsageAggregate {
5794
- /** Summed usage across the projects, in £ (ex VAT). */
5795
- totalGbp: number;
5796
- /** Summed token count across the projects. */
5797
- totalTokens: number;
5798
- /** Summed API request count across the projects. */
5799
- totalRequests: number;
5800
- /** Per-day totals merged across every project, oldest first. */
5801
- daily: AggregatedDailyUsage[];
5802
- /** Per-model-group totals merged across every project, most £ first. */
5803
- modelGroups: AggregatedModelGroupUsage[];
5566
+ declare function useCurrentWorkspace(): CurrentWorkspace;
5567
+
5568
+ /**
5569
+ * Pure workspace adapters: an SDK `WorkspaceResponse` (or the host's own copy of it) to the view
5570
+ * models the shell and the workspaces gallery show. No React state, no SDK calls, so a host that
5571
+ * has no `arbi` in its host can use them too.
5572
+ */
5573
+
5574
+ /** Workspace visibility: public = common, several members = shared, else private. */
5575
+ type ShellWorkspaceKind = 'private' | 'shared' | 'common';
5576
+ /** One face on a workspace card. */
5577
+ interface ShellWorkspaceMember {
5578
+ name: string;
5579
+ picture?: string | null;
5580
+ }
5581
+ /**
5582
+ * The fields of an SDK workspace the adapters read. Every field but the id and the name is
5583
+ * optional, so the SDK's `WorkspaceResponse` and a host's own copy of it are both assignable.
5584
+ */
5585
+ interface ShellWorkspaceSource {
5586
+ external_id: string;
5587
+ name: string;
5588
+ description?: string | null;
5589
+ is_public?: boolean;
5590
+ project_name?: string | null;
5591
+ updated_at?: string;
5592
+ shared_document_count?: number;
5593
+ private_document_count?: number;
5594
+ users?: ReadonlyArray<{
5595
+ user?: {
5596
+ given_name?: string | null;
5597
+ family_name?: string | null;
5598
+ email?: string | null;
5599
+ picture?: string | null;
5600
+ };
5601
+ /** Set when the member is an agent: agents are not people and are left off the faces. */
5602
+ agent_ext_id?: string | null;
5603
+ }>;
5604
+ }
5605
+ /**
5606
+ * A workspace as the shell and the gallery see it. Structurally a superset of blocks'
5607
+ * `ShellWorkspace` and `WorkspaceSummary`, so it is passed to both unchanged.
5608
+ */
5609
+ interface ShellWorkspaceItem {
5610
+ id: string;
5611
+ name: string;
5612
+ kind: ShellWorkspaceKind;
5613
+ description?: string | null;
5614
+ projectName?: string | null;
5615
+ /** A rendered project pill; the host supplies it (see `decorate`). */
5616
+ projectLine?: ReactNode;
5617
+ /** Shared plus private documents. */
5618
+ docCount: number;
5619
+ /** People in the workspace (agents excluded). */
5620
+ memberCount: number;
5621
+ members: ShellWorkspaceMember[];
5622
+ /** ISO timestamp. */
5623
+ updatedAt?: string;
5624
+ }
5625
+ /** A workspace offered in the switcher menu. */
5626
+ interface ShellRecentWorkspaceItem extends ShellWorkspaceItem {
5627
+ /** Pre-formatted "last seen" text, when the host supplies `formatLastSeen`. */
5628
+ lastSeen?: string;
5629
+ }
5630
+ /** Public, several members: shared. Otherwise private. */
5631
+ declare function getWorkspaceKind(workspace: Pick<ShellWorkspaceSource, 'is_public' | 'users'>): ShellWorkspaceKind;
5632
+ /** Adapt one SDK workspace to the shell and gallery view model. */
5633
+ declare function toShellWorkspace(workspace: ShellWorkspaceSource): ShellWorkspaceItem;
5634
+ /**
5635
+ * The workspace the app is in. Order: the host's selection if it is in the list; else the first
5636
+ * workspace of a live list; else the seed's active one; else the first workspace.
5637
+ */
5638
+ declare function resolveActiveWorkspace(items: readonly ShellWorkspaceItem[], selectedId: string | null | undefined, options?: {
5639
+ isSeed?: boolean;
5640
+ seedActiveId?: string;
5641
+ }): ShellWorkspaceItem | undefined;
5642
+ /** The other workspaces for the quick-switch menu, most recently opened first, capped. */
5643
+ declare function pickRecentWorkspaces(items: readonly ShellWorkspaceItem[], activeId: string | undefined, options?: {
5644
+ limit?: number;
5645
+ lastOpened?: Readonly<Record<string, number>>;
5646
+ formatLastSeen?: (timestamp: number) => string;
5647
+ }): ShellRecentWorkspaceItem[];
5648
+
5649
+ /**
5650
+ * `useShellWorkspaces`: the user's workspaces as the shell's switcher and the workspaces gallery
5651
+ * show them, the one the app is in, and `open(workspace)`.
5652
+ *
5653
+ * Source-agnostic on purpose: the host hands in the list and the selection mechanism it already
5654
+ * has (ARBI-frontend its React Query hook and workspace store, a connected app `useWorkspaces`
5655
+ * plus the connection's `setWorkspace`). `useArbiShellWorkspaces` is the same hook wired to an
5656
+ * `<ArbiHost>`.
5657
+ */
5658
+
5659
+ /** Workspaces to show while the account has none (a demo); the host owns the data. */
5660
+ interface ShellWorkspaceSeed {
5661
+ workspaces: readonly ShellWorkspaceItem[];
5662
+ /** The seed workspace that counts as the current one when nothing is selected. */
5663
+ activeId?: string;
5664
+ }
5665
+ interface UseShellWorkspacesOptions<S extends ShellWorkspaceSource = ShellWorkspaceSource> {
5666
+ /** The account's workspaces (SDK shape). `undefined` while loading. */
5667
+ workspaces: readonly S[] | undefined;
5668
+ isLoading?: boolean;
5669
+ /** The list query's error, passed through as `error`. */
5670
+ loadError?: unknown;
5671
+ /** The workspace the host says the app is in (the connection's selection). */
5672
+ selectedId?: string | null;
5673
+ /**
5674
+ * Make the workspace the app's current one: open it on the server and record the selection.
5675
+ * Throw (reject) to report failure. Called for EVERY open, including the current workspace, so
5676
+ * a click on the current card still re-opens it and then navigates.
5677
+ */
5678
+ select: (workspace: ShellWorkspaceItem) => Promise<unknown> | unknown;
5679
+ /** After a successful select: navigate, toast, close a menu. The "switch, then navigate" hook. */
5680
+ onOpened?: (workspace: ShellWorkspaceItem) => void;
5681
+ /** When select rejects. The active workspace is unchanged. Without it the error is in `error`. */
5682
+ onOpenError?: (error: unknown, workspace: ShellWorkspaceItem) => void;
5683
+ /** Demo list for an account that has no workspaces (never while loading). */
5684
+ seed?: ShellWorkspaceSeed;
5685
+ /** Host decoration per workspace, e.g. a rendered project pill. Merged over the adapter. */
5686
+ decorate?: (item: ShellWorkspaceItem, source: S) => Partial<ShellWorkspaceItem>;
5687
+ /** How many recent workspaces the switcher offers. Default 4. */
5688
+ recentLimit?: number;
5689
+ /** `workspace id -> epoch ms` last opened here; orders `recent`, falling back to `updatedAt`. */
5690
+ lastOpened?: Readonly<Record<string, number>>;
5691
+ /** Format a recency timestamp into `recent[].lastSeen`. */
5692
+ formatLastSeen?: (timestamp: number) => string;
5693
+ }
5694
+ interface UseShellWorkspacesResult {
5695
+ /** All workspaces: the account's, or the seed when it has none. */
5696
+ items: ShellWorkspaceItem[];
5697
+ /** The single current workspace; undefined only when there are no workspaces at all. */
5698
+ active: ShellWorkspaceItem | undefined;
5699
+ /** The other workspaces, most recently opened first, for the quick-switch menu. */
5700
+ recent: ShellRecentWorkspaceItem[];
5701
+ /** The account's own workspaces: false while `items` is the seed. */
5702
+ isLive: boolean;
5703
+ isLoading: boolean;
5704
+ /** The list query's error or the last failed open; cleared by the next open. */
5705
+ error: unknown;
5706
+ /** Id of the workspace being opened, else null (for a spinner on its card). */
5707
+ openingId: string | null;
5708
+ /** Select the workspace (always, even the current one), then `onOpened`. False if select threw. */
5709
+ open: (workspace: Pick<ShellWorkspaceItem, 'id'> | string) => Promise<boolean>;
5710
+ }
5711
+ declare function useShellWorkspaces<S extends ShellWorkspaceSource = ShellWorkspaceSource>(options: UseShellWorkspacesOptions<S>): UseShellWorkspacesResult;
5712
+ interface UseArbiShellWorkspacesOptions extends Omit<UseShellWorkspacesOptions, 'workspaces' | 'isLoading' | 'loadError' | 'select'> {
5713
+ /**
5714
+ * Override how a workspace is made current. Default: `useSwitchWorkspace` (open it on the
5715
+ * server, then record it as the session's workspace, so the host and the server agree).
5716
+ */
5717
+ select?: UseShellWorkspacesOptions['select'];
5718
+ }
5719
+ /**
5720
+ * `useShellWorkspaces` over the host `Arbi`'s workspace list and the session's workspace. Opening
5721
+ * one is navigation: it switches the session's workspace (see `select`).
5722
+ */
5723
+ declare function useArbiShellWorkspaces(options?: UseArbiShellWorkspacesOptions): UseShellWorkspacesResult;
5724
+
5725
+ /**
5726
+ * Switching the workspace the app is in: the one coordinator for "the user is now in workspace X".
5727
+ *
5728
+ * The server keeps the active workspace in the session, so every workspace-scoped GET reads the
5729
+ * workspace currently open for the session. A naive switch (set the id, `/open` in the background)
5730
+ * races every observer that refetches when the id changes: those requests reach a server still in
5731
+ * the previous workspace and seed the cache with its data. `switchWorkspace` keeps the order:
5732
+ *
5733
+ * 1. leave the workspace: its session state (`leaveWorkspace`) and its cached queries go, so
5734
+ * nothing shows or refetches the old workspace's data;
5735
+ * 2. the selection is cleared, so queries gated on it stop during the round trip;
5736
+ * 3. `arbi.selectWorkspace(target)`: the server session is now in the target;
5737
+ * 4. the conversations and tags `/open` returned seed their lists, then the selection is
5738
+ * committed (`workspaceId`, `workspaceStatus: 'open'`).
5739
+ *
5740
+ * Concurrent switches (A, then B, then C in quick succession): only the last one commits, and the
5741
+ * SDK runs the opens one at a time with the latest request winning, so the server session ends in
5742
+ * the last one too. `settled` waits out the switches in flight.
5743
+ *
5744
+ * A sign-out (`arbi.onSigningOut`, before the server revokes the token) overtakes every switch and
5745
+ * open in flight and cancels the queries in flight: the SDK has already stopped new requests and
5746
+ * aborts the ones in flight, so none comes back 401 or is reported as a failure.
5747
+ */
5748
+
5749
+ /** The server refused to open an archived workspace (423 `workspace_archived`). */
5750
+ declare function isWorkspaceArchivedError(error: unknown): boolean;
5751
+ /** What to tell someone who tried to open an archived workspace. */
5752
+ declare const archivedWorkspaceMessage: (name: string) => string;
5753
+ interface SwitchWorkspaceTarget {
5754
+ id: string;
5755
+ /** For the notices; default: the name in the workspace list. */
5756
+ name?: string;
5757
+ }
5758
+ interface UseSwitchWorkspaceResult {
5759
+ /**
5760
+ * Make `target` the workspace the app is in. True once it is open (at once when it already
5761
+ * is); false when it could not be (archived, offline, refused: the user was told), or when a
5762
+ * newer switch overtook it.
5763
+ */
5764
+ switchWorkspace: (target: SwitchWorkspaceTarget) => Promise<boolean>;
5765
+ /** Leave the workspace for none (after deleting or leaving it), with the same clean-up. */
5766
+ clearWorkspace: () => void;
5804
5767
  /**
5805
- * False when none of the loaded projects records usage (billing is off on this deployment), so
5806
- * zeros mean "not metered". True while anything real was recorded, or before data arrived.
5768
+ * Open the selected workspace on the server session as it is, without leaving anything or a
5769
+ * notice: after a sign-in or a reload (a new server session), or to re-assert it before a write.
5770
+ * False when there is none, it could not be opened, or a switch overtook it.
5807
5771
  */
5808
- metered: boolean;
5809
- /** True while any per-project query is still loading. */
5810
- isLoading: boolean;
5811
- /** True if any per-project query errored. */
5812
- isError: boolean;
5772
+ openSelectedWorkspace: () => Promise<boolean>;
5773
+ /**
5774
+ * Resolves once no switch is in flight: the selection is then committed (or back to where it
5775
+ * was), so reading it says which workspace the session is in.
5776
+ */
5777
+ settled: () => Promise<void>;
5778
+ }
5779
+ /** What a workspace switch runs on. */
5780
+ interface WorkspaceSwitchContext {
5781
+ /** The `Arbi` on the signed-in session, as of the switch. */
5782
+ arbi: () => Arbi;
5783
+ session: ArbiSessionStore;
5784
+ queryClient: QueryClient;
5785
+ }
5786
+ /**
5787
+ * The workspace switch over a host's session, for code that runs outside `<ArbiHost>` (a host's
5788
+ * own environment, built before its host). Inside, use `useSwitchWorkspace`.
5789
+ */
5790
+ declare function createWorkspaceSwitch({ arbi, session, queryClient, }: WorkspaceSwitchContext): UseSwitchWorkspaceResult;
5791
+ /** The workspace switch of the `<ArbiHost>` in scope (its `Arbi`, its session state). */
5792
+ declare function useSwitchWorkspace(): UseSwitchWorkspaceResult;
5793
+ /**
5794
+ * Keep the selected workspace open on the server session: open it once signed in (after a
5795
+ * sign-in or a reload, when the selection was kept but the server session is new), and drop it
5796
+ * when the workspace list says it was archived since (by its owner, perhaps on another device),
5797
+ * or that it is gone (deleted, or the person left or was removed): the app is then on the
5798
+ * workspace list. Mounted once, by the signed-in app.
5799
+ */
5800
+ declare function useOpenSelectedWorkspace(): void;
5801
+
5802
+ type WorkspaceUpdate = components['schemas']['WorkspaceUpdateRequest'];
5803
+ /** A new workspace: its name, the project it belongs to, and optionally a description. */
5804
+ interface CreateWorkspaceVars {
5805
+ name: string;
5806
+ projectId: string;
5807
+ description?: string | null;
5808
+ isPublic?: boolean;
5813
5809
  }
5814
5810
  /**
5815
- * Firm-wide AI usage + spend: aggregates {@link useProjectUsage} across several
5816
- * projects (e.g. all of a firm's matters) in parallel and merges the real totals,
5817
- * the daily trend, and the per-model breakdown. Shares the per-project query
5818
- * cache, so it costs nothing extra where a project's usage is already loaded.
5819
- * Numbers are genuine — zero projects (or zero billed work) yields zero totals;
5820
- * callers render that honestly.
5811
+ * Create a workspace (its key generated and sealed by the SDK). The new workspace goes into the
5812
+ * cached list at once, so opening it right away finds it; the list and the projects (their
5813
+ * workspace counts) are then read again.
5814
+ */
5815
+ declare function useCreateWorkspace(): _tanstack_react_query.UseMutationResult<{
5816
+ external_id: string;
5817
+ name: string;
5818
+ description: string | null;
5819
+ is_public: boolean;
5820
+ workspace_type: components["schemas"]["WorkspaceType"];
5821
+ created_by_ext_id: string;
5822
+ updated_by_ext_id?: string | null | undefined;
5823
+ created_at: string;
5824
+ updated_at: string;
5825
+ wrapped_key?: string | null | undefined;
5826
+ is_member: boolean;
5827
+ shared_conversation_count: number;
5828
+ private_conversation_count: number;
5829
+ shared_document_count: number;
5830
+ private_document_count: number;
5831
+ user_files_mb: number;
5832
+ users: {
5833
+ user: {
5834
+ external_id: string;
5835
+ parent_ext_id?: string | null | undefined;
5836
+ email: string;
5837
+ given_name: string;
5838
+ family_name?: string | null | undefined;
5839
+ picture?: string | null | undefined;
5840
+ encryption_public_key: string;
5841
+ is_sso: boolean;
5842
+ is_identity_verified: boolean;
5843
+ temporary_access_only: boolean;
5844
+ };
5845
+ role: components["schemas"]["WorkspaceRole"];
5846
+ joined_at: string;
5847
+ conversation_count: number;
5848
+ document_count: number;
5849
+ files_mb: number;
5850
+ agent_ext_id?: string | null | undefined;
5851
+ is_temporary: boolean;
5852
+ access_expires_at?: string | null | undefined;
5853
+ }[];
5854
+ project_ext_id?: string | null | undefined;
5855
+ project_name?: string | null | undefined;
5856
+ project_subscription?: string | null | undefined;
5857
+ project_owner_ext_id?: string | null | undefined;
5858
+ house_template_ext_id?: string | null | undefined;
5859
+ archive?: {
5860
+ status: "archiving" | "archived" | "restoring";
5861
+ archived_at: string;
5862
+ documents_done: number;
5863
+ documents_total: number;
5864
+ } | null | undefined;
5865
+ }, Error, CreateWorkspaceVars, unknown>;
5866
+ /** Move a workspace (open or not) to another project; both projects' counts change. */
5867
+ declare function useMoveWorkspaceToProject(): _tanstack_react_query.UseMutationResult<{
5868
+ workspace_ext_id: string;
5869
+ project_ext_id: string;
5870
+ project_name: string;
5871
+ moved: boolean;
5872
+ }, Error, {
5873
+ workspaceId: string;
5874
+ projectId: string;
5875
+ }, unknown>;
5876
+ /** Change the open workspace's name, description or visibility. */
5877
+ declare function useUpdateWorkspace(): _tanstack_react_query.UseMutationResult<{
5878
+ external_id: string;
5879
+ name: string;
5880
+ description: string | null;
5881
+ is_public: boolean;
5882
+ workspace_type: components["schemas"]["WorkspaceType"];
5883
+ created_by_ext_id: string;
5884
+ updated_by_ext_id?: string | null | undefined;
5885
+ created_at: string;
5886
+ updated_at: string;
5887
+ wrapped_key?: string | null | undefined;
5888
+ is_member: boolean;
5889
+ shared_conversation_count: number;
5890
+ private_conversation_count: number;
5891
+ shared_document_count: number;
5892
+ private_document_count: number;
5893
+ user_files_mb: number;
5894
+ users: {
5895
+ user: {
5896
+ external_id: string;
5897
+ parent_ext_id?: string | null | undefined;
5898
+ email: string;
5899
+ given_name: string;
5900
+ family_name?: string | null | undefined;
5901
+ picture?: string | null | undefined;
5902
+ encryption_public_key: string;
5903
+ is_sso: boolean;
5904
+ is_identity_verified: boolean;
5905
+ temporary_access_only: boolean;
5906
+ };
5907
+ role: components["schemas"]["WorkspaceRole"];
5908
+ joined_at: string;
5909
+ conversation_count: number;
5910
+ document_count: number;
5911
+ files_mb: number;
5912
+ agent_ext_id?: string | null | undefined;
5913
+ is_temporary: boolean;
5914
+ access_expires_at?: string | null | undefined;
5915
+ }[];
5916
+ project_ext_id?: string | null | undefined;
5917
+ project_name?: string | null | undefined;
5918
+ project_subscription?: string | null | undefined;
5919
+ project_owner_ext_id?: string | null | undefined;
5920
+ house_template_ext_id?: string | null | undefined;
5921
+ archive?: {
5922
+ status: "archiving" | "archived" | "restoring";
5923
+ archived_at: string;
5924
+ documents_done: number;
5925
+ documents_total: number;
5926
+ } | null | undefined;
5927
+ }, Error, {
5928
+ name?: string | null;
5929
+ description?: string | null;
5930
+ is_public?: boolean | null;
5931
+ workspace_type?: components["schemas"]["WorkspaceType"] | null;
5932
+ project_ext_id?: string | null;
5933
+ house_template_ext_id?: string | null;
5934
+ }, unknown>;
5935
+
5936
+ type WorkspaceMember = components['schemas']['WorkspaceUserResponse'];
5937
+ type AddWorkspaceMembersRequest = workspaces.AddWorkspaceMembersRequest;
5938
+ type WorkspaceRole = 'owner' | 'collaborator' | 'guest';
5939
+ /**
5940
+ * A workspace's members (default: the open one). `beforeFetch` runs first (e.g. to re-open the
5941
+ * workspace on the session); `enabled` overrides the "a workspace is open" gate.
5942
+ */
5943
+ declare function useWorkspaceUsers(workspaceId?: string | null, options?: {
5944
+ enabled?: boolean;
5945
+ beforeFetch?: () => Promise<unknown>;
5946
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
5947
+ user: components["schemas"]["UserResponse"];
5948
+ role: components["schemas"]["WorkspaceRole"];
5949
+ joined_at: string;
5950
+ conversation_count: number;
5951
+ document_count: number;
5952
+ files_mb: number;
5953
+ agent_ext_id?: string | null;
5954
+ is_temporary: boolean;
5955
+ access_expires_at?: string | null;
5956
+ }[]>, Error>;
5957
+ /**
5958
+ * Add people to a workspace, with the whole request: the open workspace, or `workspace_ext_id`
5959
+ * with its key sealed to this session; a session-scoped grant (`session_pubkey_b64`); an invitation
5960
+ * to people not on the platform (`confirm_invite`, which also leaves a pending grant on their
5961
+ * contact); a share of one resource (`resource_type`, `resource_ext_id`). Resolves with the
5962
+ * memberships added (someone already a member, or not on the platform, is missing from it).
5963
+ */
5964
+ declare function useAddWorkspaceMembers(): _tanstack_react_query.UseMutationResult<{
5965
+ user: components["schemas"]["UserResponse"];
5966
+ role: components["schemas"]["WorkspaceRole"];
5967
+ joined_at: string;
5968
+ conversation_count: number;
5969
+ document_count: number;
5970
+ files_mb: number;
5971
+ agent_ext_id?: string | null;
5972
+ is_temporary: boolean;
5973
+ access_expires_at?: string | null;
5974
+ }[], Error, Omit<{
5975
+ emails: string[];
5976
+ role: components["schemas"]["WorkspaceRole"];
5977
+ workspace_key?: string | null;
5978
+ workspace_ext_id?: string | null;
5979
+ session_pubkey_b64?: string | null;
5980
+ access_duration_seconds: number;
5981
+ confirm_invite?: boolean | null;
5982
+ resource_type?: ("document" | "conversation") | null;
5983
+ resource_ext_id?: string | null;
5984
+ confirm_share?: boolean | null;
5985
+ }, "access_duration_seconds"> & {
5986
+ access_duration_seconds?: number;
5987
+ }, unknown>;
5988
+ /** Remove people from the open workspace (owners; anyone may remove themselves: leaving). */
5989
+ declare function useRemoveWorkspaceMembers(): _tanstack_react_query.UseMutationResult<void, Error, string[], unknown>;
5990
+ /** Change people's role in the open workspace (owners). */
5991
+ declare function useSetWorkspaceMemberRoles(): _tanstack_react_query.UseMutationResult<{
5992
+ user: {
5993
+ external_id: string;
5994
+ parent_ext_id?: string | null | undefined;
5995
+ email: string;
5996
+ given_name: string;
5997
+ family_name?: string | null | undefined;
5998
+ picture?: string | null | undefined;
5999
+ encryption_public_key: string;
6000
+ is_sso: boolean;
6001
+ is_identity_verified: boolean;
6002
+ temporary_access_only: boolean;
6003
+ };
6004
+ role: components["schemas"]["WorkspaceRole"];
6005
+ joined_at: string;
6006
+ conversation_count: number;
6007
+ document_count: number;
6008
+ files_mb: number;
6009
+ agent_ext_id?: string | null | undefined;
6010
+ is_temporary: boolean;
6011
+ access_expires_at?: string | null | undefined;
6012
+ }[], Error, {
6013
+ userIds: string[];
6014
+ role: WorkspaceRole;
6015
+ }, unknown>;
6016
+
6017
+ /**
6018
+ * Delete workspaces (owners only). They go to Recently deleted, where they can be restored for a
6019
+ * while; the workspace list refreshes.
5821
6020
  */
5822
- declare function useProjectsUsage(projectExtIds: string[], monthsBack?: number, options?: {
5823
- enabled?: boolean;
5824
- }): ProjectsUsageAggregate;
5825
- /** List the Stripe invoices for a project's subscription. */
5826
- declare function useProjectInvoices(projectExtId: string | undefined, options?: {
6021
+ declare function useDeleteWorkspaces(): _tanstack_react_query.UseMutationResult<void, Error, string[], unknown>;
6022
+
6023
+ type TransferScope = components['schemas']['TransferScope'];
6024
+ type TransferKind = components['schemas']['TransferKind'];
6025
+ type TransferMode = components['schemas']['TransferMode'];
6026
+ type TransferPlan = components['schemas']['TransferPlanResponse'];
6027
+ type TransferStatus = components['schemas']['TransferStatusResponse'];
6028
+ type TransferConflictPolicy = components['schemas']['ConflictPolicy'];
6029
+ type WorkspaceExport = components['schemas']['WorkspaceExportResponse'];
6030
+ /** Polling cadence while a job runs; it goes idle once the job has finished. */
6031
+ declare const TRANSFER_POLL_MS = 1500;
6032
+ /** A job no worker runs any more (interrupted, cancelled, failed, or done with failures). */
6033
+ declare function isTransferResumable(status: TransferStatus): boolean;
6034
+ /** The job has stopped (it is neither queued nor running). */
6035
+ declare function isTransferFinished(status: TransferStatus | null | undefined): boolean;
6036
+ /** What a scope would take in the open workspace; re-read when the scope or the mode changes. */
6037
+ declare function usePlanWorkspaceTransfer(scope: TransferScope, mode: TransferMode, options?: {
5827
6038
  enabled?: boolean;
5828
6039
  }): _tanstack_react_query.UseQueryResult<NoInfer<{
5829
- project_ext_id: string;
5830
- invoices: _arbidocs_client.components["schemas"]["ProjectInvoice"][];
6040
+ counts: {
6041
+ [key: string]: number;
6042
+ };
6043
+ added: {
6044
+ [key: string]: number;
6045
+ };
6046
+ relations_inside: number;
6047
+ relations_outside: number;
6048
+ dangling_references: number;
6049
+ not_removable: number;
6050
+ total_bytes: number;
6051
+ item_count: number;
5831
6052
  }>, Error>;
5832
- /**
5833
- * The signed-in user from `GET /v1/user/me`. Refetched on window focus, so a role granted or
5834
- * removed elsewhere shows up without a reload; invalidate `arbiQueryKeys.currentUser()` after a
5835
- * change you made yourself.
5836
- */
5837
- declare function useCurrentUser(options?: {
6053
+ /** Start copying or moving into another workspace (a background job). */
6054
+ declare function useStartWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
6055
+ external_id: string;
6056
+ mode: components["schemas"]["TransferMode"];
6057
+ status: components["schemas"]["TransferStatus"];
6058
+ phase: components["schemas"]["TransferPhase"];
6059
+ source_workspace_ext_id?: string | null;
6060
+ target_workspace_ext_id?: string | null;
6061
+ total: number;
6062
+ processed: number;
6063
+ counts: {
6064
+ [key: string]: unknown;
6065
+ };
6066
+ error?: string | null;
6067
+ created_at: string;
6068
+ finished_at?: string | null;
6069
+ issues: components["schemas"]["TransferItemResult"][];
6070
+ }, Error, {
6071
+ scope: TransferScope;
6072
+ mode: TransferMode;
6073
+ targetWorkspaceId: string;
6074
+ onConflict?: TransferConflictPolicy;
6075
+ }, unknown>;
6076
+ /** Resume a stopped job (nothing is copied twice). */
6077
+ declare function useResumeWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
6078
+ external_id: string;
6079
+ mode: components["schemas"]["TransferMode"];
6080
+ status: components["schemas"]["TransferStatus"];
6081
+ phase: components["schemas"]["TransferPhase"];
6082
+ source_workspace_ext_id?: string | null;
6083
+ target_workspace_ext_id?: string | null;
6084
+ total: number;
6085
+ processed: number;
6086
+ counts: {
6087
+ [key: string]: unknown;
6088
+ };
6089
+ error?: string | null;
6090
+ created_at: string;
6091
+ finished_at?: string | null;
6092
+ issues: components["schemas"]["TransferItemResult"][];
6093
+ }, Error, {
6094
+ transferId: string;
6095
+ targetWorkspaceId: string;
6096
+ }, unknown>;
6097
+ declare function useCancelWorkspaceTransfer(): _tanstack_react_query.UseMutationResult<{
6098
+ external_id: string;
6099
+ mode: components["schemas"]["TransferMode"];
6100
+ status: components["schemas"]["TransferStatus"];
6101
+ phase: components["schemas"]["TransferPhase"];
6102
+ source_workspace_ext_id?: string | null | undefined;
6103
+ target_workspace_ext_id?: string | null | undefined;
6104
+ total: number;
6105
+ processed: number;
6106
+ counts: {
6107
+ [x: string]: unknown;
6108
+ };
6109
+ error?: string | null | undefined;
6110
+ created_at: string;
6111
+ finished_at?: string | null | undefined;
6112
+ issues: {
6113
+ kind: string;
6114
+ source_ext_id: string;
6115
+ target_ext_id?: string | null | undefined;
6116
+ status: components["schemas"]["TransferItemStatus"];
6117
+ message?: string | null | undefined;
6118
+ }[];
6119
+ }, Error, string, unknown>;
6120
+ /** One job's progress, polled while it runs. */
6121
+ declare function useWorkspaceTransfer(transferId: string | null): _tanstack_react_query.UseQueryResult<NoInfer<{
6122
+ external_id: string;
6123
+ mode: components["schemas"]["TransferMode"];
6124
+ status: components["schemas"]["TransferStatus"];
6125
+ phase: components["schemas"]["TransferPhase"];
6126
+ source_workspace_ext_id?: string | null;
6127
+ target_workspace_ext_id?: string | null;
6128
+ total: number;
6129
+ processed: number;
6130
+ counts: {
6131
+ [key: string]: unknown;
6132
+ };
6133
+ error?: string | null;
6134
+ created_at: string;
6135
+ finished_at?: string | null;
6136
+ issues: components["schemas"]["TransferItemResult"][];
6137
+ }>, Error>;
6138
+ /** The caller's recent jobs out of the open workspace (to offer a resume). */
6139
+ declare function useWorkspaceTransfers(options?: {
5838
6140
  enabled?: boolean;
5839
6141
  }): _tanstack_react_query.UseQueryResult<NoInfer<{
5840
6142
  external_id: string;
5841
- parent_ext_id?: string | null;
5842
- email: string;
5843
- given_name: string;
5844
- family_name?: string | null;
5845
- picture?: string | null;
5846
- encryption_public_key: string;
5847
- is_sso: boolean;
5848
- is_identity_verified: boolean;
5849
- temporary_access_only: boolean;
5850
- can_create_projects: boolean;
5851
- is_deployment_admin: boolean;
5852
- user_type: _arbidocs_client.components["schemas"]["UserRole"];
5853
- can_upgrade_projects: boolean;
5854
- is_billing_manager: boolean;
5855
- }>, Error>;
6143
+ mode: components["schemas"]["TransferMode"];
6144
+ status: components["schemas"]["TransferStatus"];
6145
+ phase: components["schemas"]["TransferPhase"];
6146
+ source_workspace_ext_id?: string | null;
6147
+ target_workspace_ext_id?: string | null;
6148
+ total: number;
6149
+ processed: number;
6150
+ counts: {
6151
+ [key: string]: unknown;
6152
+ };
6153
+ error?: string | null;
6154
+ created_at: string;
6155
+ finished_at?: string | null;
6156
+ issues: components["schemas"]["TransferItemResult"][];
6157
+ }[]>, Error>;
6158
+ /** What to refresh once a job has finished: the workspaces' counts always, this one's lists after a move. */
6159
+ declare function useInvalidateAfterTransfer(): (mode: TransferMode) => void;
6160
+ interface ExportDownloadRequest {
6161
+ scope: TransferScope;
6162
+ /** Documents known to the page, for `index.csv` (only those in the export are listed). */
6163
+ documents?: WorkspaceDocument[];
6164
+ /** CSV columns: undefined = all standard columns, [] = no index.csv. */
6165
+ csvColumns?: string[];
6166
+ }
5856
6167
  /**
5857
- * The firm's pooled monthly £ of AI usage (Box deployments). A 403 (the caller is not a firm member
5858
- * or Box admin) is not retried: treat an error like `has_pool: false` and show nothing.
6168
+ * Download a scope of the open workspace as files: its documents (every version, and each
6169
+ * version's markup PDF), one JSON file per entity type and a manifest (`buildWorkspaceArchive`).
5859
6170
  */
5860
- declare function useFirmPool(options?: {
5861
- enabled?: boolean;
5862
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
5863
- has_pool: boolean;
5864
- month?: string | null;
5865
- resets_at?: string | null;
5866
- licence_status?: string | null;
5867
- expires_at?: string | null;
5868
- premium_only: boolean;
5869
- users?: number | null;
5870
- storage_gb?: number | null;
5871
- ai_gbp?: number | null;
5872
- unlimited_standard_ai?: boolean | null;
5873
- interval?: string | null;
5874
- kept_until?: string | null;
5875
- renews?: _arbidocs_client.components["schemas"]["FirmRenewingQuantities"] | null;
5876
- support?: string | null;
5877
- addon_gbp?: number | null;
5878
- base_gbp?: number | null;
5879
- auto_addons?: number | null;
5880
- auto_addon_gbp?: number | null;
5881
- auto_storage_gb?: number | null;
5882
- auto_addon_price_pence?: number | null;
5883
- auto_addon_spent_pence?: number | null;
5884
- auto_addon_limit_pence?: number | null;
5885
- total_gbp?: number | null;
5886
- used_gbp?: number | null;
5887
- remaining_gbp?: number | null;
5888
- people_this_month?: number | null;
5889
- report_computed_at?: string | null;
5890
- subscription_status?: string | null;
5891
- cancel_at_period_end?: boolean | null;
5892
- period_end?: string | null;
5893
- can_top_up: boolean;
5894
- storage_used_gb?: number | null;
5895
- internal_users?: number | null;
5896
- }>, Error>;
6171
+ declare function useWorkspaceExportDownload({ workspaceName }?: {
6172
+ workspaceName?: string;
6173
+ }): {
6174
+ download: ({ scope, documents, csvColumns }: ExportDownloadRequest) => Promise<boolean>;
6175
+ isDownloading: boolean;
6176
+ progress: {
6177
+ done: number;
6178
+ total: number;
6179
+ } | null;
6180
+ };
6181
+
6182
+ /**
6183
+ * Assemble the workspace export archive from `POST /v1/workspace/export`.
6184
+ *
6185
+ * manifest.json what the archive is: format, scope, counts, layout
6186
+ * documents/<folder>/<name> current versions (older ones under documents/_versions/); one
6187
+ * document id may name several files, one per version
6188
+ * .../<name> (markup).pdf beside a version with markup: its PDF with the annotations as
6189
+ * native PDF annotations
6190
+ * data/<entity>.json one JSON array per entity type, cross-referenced by external_id
6191
+ * index.csv the documents' metadata table (when columns were chosen)
6192
+ *
6193
+ * Pure apart from `fetchFile`, so it is tested without a network.
6194
+ */
6195
+
6196
+ type ExportFileKind = 'original' | 'markup';
6197
+ interface BuildArchiveInput {
6198
+ exportData: WorkspaceExport;
6199
+ /**
6200
+ * Fetch one file: a version of a document (`original`), or that version's markup PDF
6201
+ * (`markup`); `null` when it could not be fetched.
6202
+ */
6203
+ fetchFile: (docExtId: string, version: number, kind: ExportFileKind) => Promise<Blob | null>;
6204
+ /** Ready-made `index.csv` content, or null for none. */
6205
+ metadataCsv?: string | null;
6206
+ onProgress?: (done: number, total: number) => void;
6207
+ }
6208
+ interface BuiltArchive {
6209
+ blob: Blob;
6210
+ fileCount: number;
6211
+ /** Archive paths of the files that could not be fetched. */
6212
+ failed: string[];
6213
+ }
6214
+ declare function buildWorkspaceArchive({ exportData, fetchFile, metadataCsv, onProgress, }: BuildArchiveInput): Promise<BuiltArchive>;
6215
+
6216
+ /** What a request carries, sealed from the requester to the owner. */
6217
+ interface AccessRequestPayload {
6218
+ session_pubkey_b64: string;
6219
+ note?: string;
6220
+ }
5897
6221
  /**
5898
- * Whether this deployment runs under a Box licence (`isBox`) and whether the user administers it in
5899
- * the ARBI portal (`isBoxAdmin`), from the firm pool. Anyone outside the firm gets a 403 (not
5900
- * retried), read as no Box. The API has no Box-admin flag yet: `can_top_up` is true only for a Box
5901
- * admin of a licence central can bill, so admins of a hand-set licence read as members for now.
6222
+ * Open a request's sealed content with the signed-in person's key. Null when no one is signed in
6223
+ * or it cannot be opened (not meant for them, damaged).
5902
6224
  */
5903
- declare function useBoxRole(options?: {
5904
- enabled?: boolean;
5905
- }): {
5906
- isBox: boolean;
5907
- isBoxAdmin: boolean;
5908
- };
5909
- /** Buy add-ons for the firm (Box admins). Refreshes the pool; the result may carry an invoice URL. */
5910
- declare function useTopUpFirmPool(): _tanstack_react_query.UseMutationResult<{
5911
- pool: {
5912
- has_pool: boolean;
5913
- month?: string | null | undefined;
5914
- resets_at?: string | null | undefined;
5915
- licence_status?: string | null | undefined;
5916
- expires_at?: string | null | undefined;
5917
- premium_only: boolean;
5918
- users?: number | null | undefined;
5919
- storage_gb?: number | null | undefined;
5920
- ai_gbp?: number | null | undefined;
5921
- unlimited_standard_ai?: boolean | null | undefined;
5922
- interval?: string | null | undefined;
5923
- kept_until?: string | null | undefined;
5924
- renews?: {
5925
- users?: number | null | undefined;
5926
- storage_gb?: number | null | undefined;
5927
- ai_gbp?: number | null | undefined;
5928
- unlimited_standard_ai?: boolean | null | undefined;
5929
- support?: string | null | undefined;
5930
- } | null | undefined;
5931
- support?: string | null | undefined;
5932
- addon_gbp?: number | null | undefined;
5933
- base_gbp?: number | null | undefined;
5934
- auto_addons?: number | null | undefined;
5935
- auto_addon_gbp?: number | null | undefined;
5936
- auto_storage_gb?: number | null | undefined;
5937
- auto_addon_price_pence?: number | null | undefined;
5938
- auto_addon_spent_pence?: number | null | undefined;
5939
- auto_addon_limit_pence?: number | null | undefined;
5940
- total_gbp?: number | null | undefined;
5941
- used_gbp?: number | null | undefined;
5942
- remaining_gbp?: number | null | undefined;
5943
- people_this_month?: number | null | undefined;
5944
- report_computed_at?: string | null | undefined;
5945
- subscription_status?: string | null | undefined;
5946
- cancel_at_period_end?: boolean | null | undefined;
5947
- period_end?: string | null | undefined;
5948
- can_top_up: boolean;
5949
- storage_used_gb?: number | null | undefined;
5950
- internal_users?: number | null | undefined;
5951
- };
5952
- invoice_url?: string | null | undefined;
5953
- }, Error, number, unknown>;
5954
- /** Why "New project" / "New workspace" is unavailable to someone who may not create them. */
5955
- declare const PROJECT_CREATION_DENIED_REASON = "Only members of your firm can create projects and workspaces.";
6225
+ declare function openAccessRequest(content: string, requesterPublicKey: string): Promise<AccessRequestPayload | null>;
6226
+ /** Who a request goes to: anyone we can address and seal to. */
6227
+ interface AccessRequestRecipient {
6228
+ external_id: string;
6229
+ encryption_public_key: string;
6230
+ }
6231
+ /** What a request says beyond the session key: a note, and (rarely) the workspace it is for. */
6232
+ interface RequestAccessOptions {
6233
+ note?: string;
6234
+ /**
6235
+ * Only when the workspace is already known (an invite-and-share completed after sign-up): it
6236
+ * locks the owner's review to it. Otherwise the owner picks.
6237
+ */
6238
+ workspaceExtId?: string;
6239
+ }
5956
6240
  /**
5957
- * Whether the signed-in user may create projects and workspaces. `undefined` while the user is
5958
- * loading: callers should neither offer nor refuse creation until it is known.
6241
+ * Ask someone for workspace access: seal this session's public key (for a temporary grant) and a
6242
+ * note to them, and send it as a `workspace_access_request` notification.
5959
6243
  */
5960
- declare function useCanCreateProjects(): boolean | undefined;
6244
+ declare function useRequestWorkspaceAccess(): _tanstack_react_query.UseMutationResult<{
6245
+ type: _arbidocs_client.components["schemas"]["NotificationType"];
6246
+ external_id: string;
6247
+ sender: {
6248
+ external_id: string;
6249
+ parent_ext_id?: string | null | undefined;
6250
+ email: string;
6251
+ given_name: string;
6252
+ family_name?: string | null | undefined;
6253
+ picture?: string | null | undefined;
6254
+ encryption_public_key: string;
6255
+ is_sso: boolean;
6256
+ is_identity_verified: boolean;
6257
+ temporary_access_only: boolean;
6258
+ };
6259
+ recipient: {
6260
+ external_id: string;
6261
+ parent_ext_id?: string | null | undefined;
6262
+ email: string;
6263
+ given_name: string;
6264
+ family_name?: string | null | undefined;
6265
+ picture?: string | null | undefined;
6266
+ encryption_public_key: string;
6267
+ is_sso: boolean;
6268
+ is_identity_verified: boolean;
6269
+ temporary_access_only: boolean;
6270
+ };
6271
+ workspace_ext_id?: string | null | undefined;
6272
+ content?: string | null | undefined;
6273
+ conversation_ext_id?: string | null | undefined;
6274
+ message_ext_id?: string | null | undefined;
6275
+ read: boolean;
6276
+ created_at: string;
6277
+ updated_at: string;
6278
+ }, Error, {
6279
+ recipient: AccessRequestRecipient;
6280
+ options?: RequestAccessOptions;
6281
+ }, unknown>;
6282
+
6283
+ type WorkspaceArchive = components['schemas']['WorkspaceArchiveRead'];
6284
+ type WorkspaceArchiveState = components['schemas']['WorkspaceArchiveState'];
6285
+ type UnarchiveEstimate = components['schemas']['UnarchiveEstimate'];
6286
+ /** How often a workspace on its way to or from the archive is checked. */
6287
+ declare const ARCHIVE_POLL_MS = 5000;
6288
+ /** Its files are moving (to the archive, or back and re-indexing): progress keeps changing. */
6289
+ declare const isArchiveMoving: (status: string | null | undefined) => status is "archiving" | "restoring";
6290
+ /** A workspace's archive state, bytes per tier and (while archived) what unarchiving costs. */
6291
+ declare function useWorkspaceArchive(workspaceId: string | null | undefined, enabled?: boolean): _tanstack_react_query.UseQueryResult<NoInfer<{
6292
+ workspace_ext_id: string;
6293
+ status: "live" | "archiving" | "archived" | "restoring";
6294
+ archived_at: string | null;
6295
+ documents_done: number;
6296
+ documents_total: number;
6297
+ can_manage: boolean;
6298
+ available: boolean;
6299
+ live_bytes: number;
6300
+ archived_bytes: number;
6301
+ error?: string | null;
6302
+ estimate?: components["schemas"]["UnarchiveEstimate"] | null;
6303
+ }>, Error>;
6304
+ /** Archive a workspace (its owner or its project's owner). */
6305
+ declare function useArchiveWorkspace(): _tanstack_react_query.UseMutationResult<{
6306
+ workspace_ext_id: string;
6307
+ status: "live" | "archiving" | "archived" | "restoring";
6308
+ archived_at: string | null;
6309
+ documents_done: number;
6310
+ documents_total: number;
6311
+ can_manage: boolean;
6312
+ available: boolean;
6313
+ live_bytes: number;
6314
+ archived_bytes: number;
6315
+ error?: string | null;
6316
+ estimate?: components["schemas"]["UnarchiveEstimate"] | null;
6317
+ }, Error, string, unknown>;
6318
+ /** Start unarchiving a workspace; refused up front when the AI budget cannot cover the re-index. */
6319
+ declare function useUnarchiveWorkspace(): _tanstack_react_query.UseMutationResult<{
6320
+ workspace_ext_id: string;
6321
+ status: "live" | "archiving" | "archived" | "restoring";
6322
+ archived_at: string | null;
6323
+ documents_done: number;
6324
+ documents_total: number;
6325
+ can_manage: boolean;
6326
+ available: boolean;
6327
+ live_bytes: number;
6328
+ archived_bytes: number;
6329
+ error?: string | null;
6330
+ estimate?: components["schemas"]["UnarchiveEstimate"] | null;
6331
+ }, Error, string, unknown>;
5961
6332
  /**
5962
- * Today's deployment-wide AI usage (£, `used_gbp`) for the signed-in user: pair it with a project's
5963
- * `daily_cap_per_user` for a "£ used today" indicator. Re-read on mount and window focus, and when
5964
- * the host invalidates it after the user's own generation; never polled.
6333
+ * Keep the workspace list fresh while any workspace in it is archiving or restoring, so its card
6334
+ * shows the progress and opens again as soon as it is back.
5965
6335
  */
5966
- declare function useUserUsageToday(options?: {
5967
- enabled?: boolean;
5968
- }): _tanstack_react_query.UseQueryResult<NoInfer<{
5969
- used_gbp: number;
5970
- }>, Error>;
6336
+ declare function useArchiveProgressPolling(workspaces: ReadonlyArray<{
6337
+ archive?: {
6338
+ status?: string | null;
6339
+ } | null;
6340
+ }> | undefined): void;
5971
6341
 
5972
6342
  /** What a list asks for: the timeline range, or the notes carrying tags or citing a document. */
5973
6343
  type FactListFilter = Pick<ListFactsOptions, 'from' | 'to' | 'datedOnly' | 'tagExtIds' | 'docExtId'>;
@@ -7710,6 +8080,8 @@ declare function invalidateConversationDetails(queryClient: QueryClient, convers
7710
8080
 
7711
8081
  type DatabaseUpdate = components['schemas']['DatabaseUpdate'];
7712
8082
  type DatabaseRowValues = components['schemas']['DatabaseRowWrite']['values'];
8083
+ type DatabaseAggregateRequest = components['schemas']['DatabaseAggregateRequest'];
8084
+ type DatabaseAggregateResult = components['schemas']['DatabaseAggregateResult'];
7713
8085
  /** The most rows the grid loads at once (the API's page limit). Search runs on the server. */
7714
8086
  declare const DATABASE_ROWS_PAGE = 1000;
7715
8087
  /** The most rows a relation cell's picker lists for one search. */
@@ -7744,6 +8116,19 @@ declare function useDatabaseRows(databaseId: string | null, q: string): _tanstac
7744
8116
  rows: components["schemas"]["DatabaseRowRead"][];
7745
8117
  total: number;
7746
8118
  }>, Error>;
8119
+ /**
8120
+ * A database's rows grouped and measured on the server (over every row): the labels and series a
8121
+ * chart or a metric tile draws. Row writes here refresh it.
8122
+ */
8123
+ declare function useDatabaseAggregate(databaseId: string | null, request: Partial<DatabaseAggregateRequest>, options?: {
8124
+ enabled?: boolean;
8125
+ }): _tanstack_react_query.UseQueryResult<NoInfer<{
8126
+ keys: string[];
8127
+ labels: string[];
8128
+ series: components["schemas"]["DatabaseSeries"][];
8129
+ total_rows: number;
8130
+ truncated: boolean;
8131
+ }>, Error>;
7747
8132
  /**
7748
8133
  * Search a database's rows (any cell, on the server) for a relation cell's picker. Read once per
7749
8134
  * search rather than cached: the picker debounces its typing.
@@ -7844,6 +8229,208 @@ declare function useImportDatabaseRows(): _tanstack_react_query.UseMutationResul
7844
8229
  /** Download a database as .xlsx or .csv. */
7845
8230
  declare function useExportDatabase(): (databaseId: string, format: "csv" | "xlsx") => Promise<Blob>;
7846
8231
 
8232
+ /**
8233
+ * Saved table views in the user settings (`tableviews`): one array holding the views of every
8234
+ * table, keyed by workspace and table. A view without `table` belongs to the workspace's documents
8235
+ * table; one with `table` to that database (`dbs-…`). The grids write them (blocks' `useTableViews`);
8236
+ * a chart over a database reads a view's columns.
8237
+ */
8238
+
8239
+ type TableView = components['schemas']['TableView'];
8240
+ /** The table a view belongs to: a database id, or `null` for the documents table. */
8241
+ type TableViewTable = string | null;
8242
+ /** Whether `view` is one of `table`'s views in the workspace. */
8243
+ declare function isTableViewOf(view: TableView, workspaceId: string, table: TableViewTable): boolean;
8244
+ /** The views of one table, one per name (the last one stored wins). */
8245
+ declare function viewsOfTable(all: readonly TableView[] | null | undefined, workspaceId: string | null | undefined, table: TableViewTable): TableView[];
8246
+
8247
+ /**
8248
+ * Grouping and measuring a dataset in the browser, for sources whose rows are already loaded
8249
+ * (documents, threads, projects, AI usage). The rules are the server's database aggregation
8250
+ * (`POST /v1/databases/{id}/aggregate`), so a panel reads the same whichever side measured it:
8251
+ * empty cells group as "(empty)", a multi-valued cell counts in each of its values' groups, date
8252
+ * groups run chronologically and others by value, at most {@link MAX_SERIES} series.
8253
+ */
8254
+
8255
+ /** The label of the group of empty cells. */
8256
+ declare const EMPTY_GROUP_LABEL = "(empty)";
8257
+ /** The most series a split keeps (the largest). */
8258
+ declare const MAX_SERIES = 12;
8259
+ /** The bucket key of a date (`2026-06-12`, `2026-W24`, `2026-06`, `2026-Q2`, `2026`), or null. */
8260
+ declare function bucketOf(value: DatasetValue | undefined, bucket: TimeBucket): string | null;
8261
+ /** Every bucket key from `first` to `last` (at most `max`; null when the keys are not buckets). */
8262
+ declare function bucketRange(first: string, last: string, bucket: TimeBucket, max?: number): string[] | null;
8263
+ /** The records of a query: those that pass its filters, in its order, at most its limit. */
8264
+ declare function recordsOf(dataset: Dataset, query: DatasetQuery): Dataset;
8265
+ /** The rows that pass every filter (a filter on an unknown field passes nothing). */
8266
+ declare function filterRows(rows: readonly DatasetRow[], fields: readonly DatasetField[], filters?: readonly DatasetFilter[]): DatasetRow[];
8267
+ /**
8268
+ * Group the rows that pass the filters and measure each group: a long-form dataset with the fields
8269
+ * `AGGREGATE_FIELDS` (one row per group, or per group and series with `splitBy`).
8270
+ */
8271
+ declare function aggregateDataset(dataset: Dataset, query: DatasetQuery): Dataset;
8272
+ /**
8273
+ * Add the missing date buckets between the first and last group of an aggregated dataset (value
8274
+ * `null`), so a trend over time has no silent gaps. Datasets whose keys are not buckets, or that
8275
+ * would grow beyond a few hundred groups, come back unchanged.
8276
+ */
8277
+ declare function fillTimeGaps(dataset: Dataset, bucket: TimeBucket): Dataset;
8278
+
8279
+ /** What a rows adapter's hook reads. */
8280
+ interface RowsState {
8281
+ rows: readonly DatasetRow[] | undefined;
8282
+ isLoading: boolean;
8283
+ error: unknown;
8284
+ }
8285
+ interface RowsSourceDefinition {
8286
+ id: string;
8287
+ label: string;
8288
+ description?: string;
8289
+ params?: readonly DataSourceParam[];
8290
+ /** The fields; a hook, so they may depend on loaded data (a project's own fields). */
8291
+ useFields: (params: DataSourceParams) => DataSourceFieldsState;
8292
+ /** The rows (the same fields' ids). */
8293
+ useRows: (params: DataSourceParams, enabled: boolean) => RowsState;
8294
+ }
8295
+ /** A `DataSource` over rows loaded in the browser. */
8296
+ declare function defineRowsSource(definition: RowsSourceDefinition): DataSource;
8297
+
8298
+ /**
8299
+ * The query a chart asks: its x field grouped (a metric: one group), its series split, its y
8300
+ * measured by the aggregate; a table without `x` lists the records (filtered, ordered, limited).
8301
+ */
8302
+ declare function queryOfChart(chart: ChartSpec): DatasetQuery;
8303
+ interface PanelDatasetState extends DatasetState {
8304
+ /** The source's fields (for labels and units). */
8305
+ fields: readonly DatasetField[];
8306
+ }
8307
+ /**
8308
+ * The dataset a panel shows. Render it from a component keyed by `source.id`: the source's hooks
8309
+ * run here, and differ from one source to another.
8310
+ */
8311
+ declare function usePanelDataset(source: DataSource, params: DataSourceParams | undefined, chart: ChartSpec, options?: {
8312
+ enabled?: boolean;
8313
+ }): PanelDatasetState;
8314
+
8315
+ interface ConversationsSourceLabels {
8316
+ source: string;
8317
+ description: string;
8318
+ title: string;
8319
+ created: string;
8320
+ lastActivity: string;
8321
+ due: string;
8322
+ completed: string;
8323
+ kind: string;
8324
+ /** The `kind` of a conversation without a work status. */
8325
+ thread: string;
8326
+ /** The `kind` of a conversation with a work status. */
8327
+ task: string;
8328
+ status: string;
8329
+ statuses: {
8330
+ todo: string;
8331
+ generating: string;
8332
+ done: string;
8333
+ };
8334
+ overdue: string;
8335
+ owner: string;
8336
+ messages: string;
8337
+ shared: string;
8338
+ }
8339
+ declare const DEFAULT_CONVERSATIONS_SOURCE_LABELS: ConversationsSourceLabels;
8340
+ declare function createConversationsSource(labels?: Partial<ConversationsSourceLabels>): DataSource;
8341
+
8342
+ interface DatabaseSourceLabels {
8343
+ source: string;
8344
+ description: string;
8345
+ database: string;
8346
+ view: string;
8347
+ allColumns: string;
8348
+ }
8349
+ declare const DEFAULT_DATABASE_SOURCE_LABELS: DatabaseSourceLabels;
8350
+ declare function createDatabaseSource(labels?: Partial<DatabaseSourceLabels>): DataSource;
8351
+
8352
+ /** The field labels (a site's words). */
8353
+ interface DocumentsSourceLabels {
8354
+ source: string;
8355
+ description: string;
8356
+ created: string;
8357
+ updated: string;
8358
+ documentDate: string;
8359
+ status: string;
8360
+ type: string;
8361
+ folder: string;
8362
+ nature: string;
8363
+ author: string;
8364
+ createdBy: string;
8365
+ pages: string;
8366
+ size: string;
8367
+ shared: string;
8368
+ }
8369
+ declare const DEFAULT_DOCUMENTS_SOURCE_LABELS: DocumentsSourceLabels;
8370
+ declare function createDocumentsSource(labels?: Partial<DocumentsSourceLabels>): DataSource;
8371
+
8372
+ interface ProjectsSourceLabels {
8373
+ source: string;
8374
+ description: string;
8375
+ name: string;
8376
+ opened: string;
8377
+ stage: string;
8378
+ stageChanged: string;
8379
+ lead: string;
8380
+ client: string;
8381
+ plan: string;
8382
+ state: string;
8383
+ open: string;
8384
+ closed: string;
8385
+ closedAt: string;
8386
+ }
8387
+ declare const DEFAULT_PROJECTS_SOURCE_LABELS: ProjectsSourceLabels;
8388
+ interface ProjectsSourceOptions {
8389
+ labels?: Partial<ProjectsSourceLabels>;
8390
+ /** Stages that close a project (compared without case). */
8391
+ closedStages?: readonly string[];
8392
+ }
8393
+ declare function createProjectsSource(options?: ProjectsSourceOptions): DataSource;
8394
+
8395
+ interface WorkspacesSourceLabels {
8396
+ source: string;
8397
+ description: string;
8398
+ name: string;
8399
+ project: string;
8400
+ documents: string;
8401
+ threads: string;
8402
+ members: string;
8403
+ storage: string;
8404
+ created: string;
8405
+ updated: string;
8406
+ shared: string;
8407
+ }
8408
+ declare const DEFAULT_WORKSPACES_SOURCE_LABELS: WorkspacesSourceLabels;
8409
+ declare function createWorkspacesSource(labels?: Partial<WorkspacesSourceLabels>): DataSource;
8410
+
8411
+ /**
8412
+ * People's names for model groups whose gateway names are not meant to be read (the LLM tiers are
8413
+ * already readable).
8414
+ */
8415
+ declare const MODEL_GROUP_LABELS: Readonly<Record<string, string>>;
8416
+ interface UsageSourceLabels {
8417
+ source: string;
8418
+ description: string;
8419
+ period: string;
8420
+ periods: {
8421
+ current: string;
8422
+ previous: string;
8423
+ };
8424
+ day: string;
8425
+ project: string;
8426
+ model: string;
8427
+ spend: string;
8428
+ tokens: string;
8429
+ requests: string;
8430
+ }
8431
+ declare const DEFAULT_USAGE_SOURCE_LABELS: UsageSourceLabels;
8432
+ declare function createUsageSource(labels?: Partial<UsageSourceLabels>): DataSource;
8433
+
7847
8434
  /**
7848
8435
  * Apply `reducer` to a workspace's cached tag list (nothing cached: nothing to do). The list is
7849
8436
  * read once, then kept current by these patches; a host's own write that changes a tag (applying
@@ -15330,4 +15917,4 @@ declare function finishEntityExtraction(docIds: readonly string[]): void;
15330
15917
  /** The documents being extracted now. */
15331
15918
  declare function useEntityExtractionDocIds(): readonly string[];
15332
15919
 
15333
- export { AGENT_CONTROL_COMMANDS, ALLOWED_PORTAL_ORIGINS, ARCHIVE_POLL_MS, ASSISTANT_MENTION_LABEL, AUDIO_MIME_PREFERENCE, AUTO_CHAT_MODEL, type AccessRequestPayload, type AccessRequestRecipient, type AccountClient, type AccountClientContextValue, type AccountHost, type AccountSession, type AccountSignOutOptions, ActiveCall, type ActivityContent, type ActivityDescription, ActivityFeed, type ActivityFeedProps, type AddWorkspaceMembersRequest, type AgentAccessMode, type AgentConfigSections, type AgentControlMaps, AgentDmStatus, type AgentQuestionRef, type AgentRunControlState, type AggregatedDailyUsage, type AggregatedModelGroupUsage, AiActionCard, AiAnswer, type AiRunOptions, type AiTaskStatus, AppNotification, AppleIcon, type ApplyCallEventOptions, ArbiBotHeadIcon, ArbiBotIcon, type ArbiChatCitation, type ArbiChatDocument, type ArbiChatHost, type ArbiChatMessage, type ArbiChatMessageStatus, type ArbiChatPassage, type ArbiChatRole, type ArbiChatThread, type ArbiConversation, type ArbiConversationDocument, type ArbiConversationGeneration, type ArbiDmTab, type ArbiDocumentViewerState, type ArbiDraftStorage, type ArbiFeature, type ArbiFeatures, type ArbiGridLayoutState, ArbiHost, type ArbiHostConfig, ArbiHostConnection, ArbiHostProps, type ArbiKeyValueStorage, type ArbiLayoutActions, type ArbiLayoutState, type ArbiLayoutStore, type ArbiLayoutStoreOptions, type ArbiMessageTimer, type ArbiPanelMode, type ArbiPanelsState, type ArbiSavedLayout, type ArbiSessionPersist, type ArbiSessionState, type ArbiSessionStatus, type ArbiSessionStore, type ArbiSessionStoreOptions, type ArbiShellState, type ArbiSidebarState, type ArbiSignedInSession, type ArbiTabsState, type ArbiThreadTab, type ArbiThreadView, type ArbiViewerTab, type ArbiViewingDocument, type ArbiViewingDocumentInput, type ArbiViewsState, ArbiWebSocketProvider, type ArbiWebSocketProviderProps, type ArbiWorkspaceStatus, type ArbiWsState, type ArbiWsStatus, ArtifactCanvas, type AskAgain, type AspectOption, type AssignDocTagsInput, type AssistantMode, AudIcon, type AudioPiece, type AvatarCrop, type AvatarFileProblem, BOX_SEAT_REFUSED, BOX_SEAT_REFUSED_ACTION, BOX_SEAT_REFUSED_TITLE, type BranchNavigation, type BranchPoint, type BuildArchiveInput, type BuiltArchive, CALL_MODERATION_TOPIC, CONVERSATION_SWITCH_MEASURE, type CalendarConnectorSupport, type CalendarNotificationMeta, type CalendarOfflineSupport, type CalendarPendingWrite, type CalendarSupport, type CalendarWriteOp, type CallInviteContact, type CallMutedNotice, type CallRoomEvents, type CallSlotMode, type CallUserPillProps, type CallsHost, type ChatArrival, ChatBubble, type ChatBubbleProps, ChatMemberKey, type ChatPost, ChatResponse, type ChatSummary, ChatThreadMessage, type Chunk, type ChunkActivation, type ChunkedRecorder, type ChunkedRecorderOptions, CitationRenderer, type CitationRendererProps, type CitationState, ClaudeIcon, CommandPalette, type CommandPaletteClassNames, type CommandPaletteProps, CommandPaletteProvider, type CommandPaletteProviderProps, type CommandPaletteValue, type ConfigUpdate, type ConversationActionsInput, type ConversationEvent, ConversationList, type ConversationListProps, ConversationScope, type ConversationScopeProps, type CreateProjectVars, type CreateSkillPackOptions, type CreateTagInput, type CreateWorkspaceVars, type CreatedProject, type CropArea, type CropOutput, type CropResult, DATABASE_RELATION_PICK_LIMIT, DATABASE_ROWS_PAGE, DEFAULT_ASPECT_OPTIONS, DEFAULT_DOCUMENT_VIEWER_STATE, DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, DISMISSED_TASK_TTL_MS, DOCUMENTS_FIRST_PAGE_MEASURE, DOCUMENTS_FIRST_PAGE_SIZE, DOCUMENTS_PAGE_SIZE, DateSeparator, type DateSeparatorProps, type DebouncedWriter, type DebouncedWriterOptions, type DeleteAccountBlocker, type DeleteAccountFlow, type DeletedDocument, type DeletedDocumentsPage, type DescribeCalendarNotificationOptions, type DescribeServerNotificationOptions, DictateContextValue, DmAvatar, type DmAvatarProps, type DmClassNames, DmComposer, type DmComposerProps, type DmConversation, type DmMessage, type DmUser, DocIcon, DocQaPanel, DocSearch, DocumentCardMenu, type DocumentCardMenuProps, type DocumentHostActions, type DocumentPerson, DocumentReview, type DocumentReviewProps, type DocumentRowChange, type DocumentStartItem, type DocumentsSupport, type DraftKeyValueStore, DraftTitleControls, type DraftTitleControlsProps, EMPTY_SESSION_STATE, EXPORT_SAMPLE_RATE, type EmailChange, type EmailPreferences, EmlIcon, type EnableDriveSyncVars, type EnableMailboxSyncVars, type EntitledFeature, EntityIconComponent, EntityVocabulary, type ExportDownloadRequest, type ExportFileKind, type ExtractedZip, FILE_TYPE_COLORS, FINISHED_DOCUMENT_STATUSES, FIRST_TOKEN_MEASURE, type FactListFilter, type FeatureEntitlements, type FeatureRefusal, type FeatureSource, type FeatureSwitch, FileIcon, FireworksIcon, type FollowSaveCallbacks, GeminiIcon, type GenerateDocTagsInput, GitHubIcon, GoogleIcon, type GrantAgentAccessVars, HostConfigRecord, HtmlIcon, IN_FLIGHT_DOCUMENT_STATUSES, IdentityPurchase, IdentityStatus, IdentityStep, type IdentityVerificationApi, IdentityVerificationFlow, ImageCropModal, type ImageCropModalProps, ImageCropper, type ImageCropperProps, ImgIcon, IncomingCall, InlineMicButton, type InlineMicButtonProps, type InstallSkillPackVariables, JoinChoices, LIVE_UPDATE_TYPES, LinkedInIcon, type LiveTask, type LocalFeatureStore, type LocalFeatureStoreOptions, MAIL_DRAFT_REPLACED_EVENT, MAX_AVATAR_FILE_BYTES, MAX_THREAD_TABS, MIN_NARRATION_DWELL_MS, MIN_QUEUED_MESSAGE_VISIBILITY_MS, MUTED_DEDUPE_MS, type MailAccount, type MailAddress, type MailAttachment, type MailClient, type MailClientContextValue, type MailCompose, type MailDeliveryRecipient, type MailDeliveryStatus, type MailDeviceFallback, type MailDraftEditorRequest, type MailDraftEditorSession, type MailFetch, type MailFolder, type MailHost, type MailMessage, type MailMessageUpdate, MailOfflineUnavailableError, type MailPage, type MailPolicy, type MailProject, MeetingChatRef, MeetingChatTarget, MentionCandidate, type MessageArtifact, MessageArtifactCard, type MessageTimerResult, MicRecordingOverlay, type MicRecordingOverlayProps, MicWaveformIndicator, type MicWaveformIndicatorProps, type ModeratedTrack, type MountDiditOptions, type NameEditor, type NotificationPreferencesModel, type NotificationTarget, type NotificationTypeMeta, NotifyVariant, type OfflineDocumentRecord, OpenAIIcon, type OpenedRecording, type OptimisticDocumentEdit, type OrderResolver, PENDING_SYNC_PREDICATE, PLAYBACK_LOOKAHEAD_MS, POLL_EVERY_MS, PROJECT_CREATION_DENIED_REASON, type PaletteNavItem, type ParsedChunk, type ParsedChunkMetadata, type ParsedDocument, type ParsedDocumentMetadata, type PassageResolvers, type PasswordChangeForm, type PasswordChangeFormMessages, type PasswordChangeVars, PdfIcon, type PendingSyncItem, type PeopleDirectory, type Person, PhotoCapture, type PhotoCaptureProps, type ProcessingTask, type ProfileView, type ProjectsUsageAggregate, type QueuedCalendarWrite, type QueuedMessage, type QueuedMessages, type QuoteResolver, RECORDING_SEGMENTER, RUN_WINDOW_MS, type RawPending, type RecordedChunk, type RecordingWindow, type RefusedUploadFile, type RelatedDocs, type RelatedDocsMap, type RelevancePatch, type RemoveDocTagsInput, type RenderMarkdown, type RequestAccessOptions, SEGMENT_FRAME_MS, SEGMENT_PRE_ROLL_MS, SHORT_PIECE_MERGE_GAP_MS, SIGNATURE_NOTIFICATION_TYPES, SIMILARITY_THRESHOLD, SLOW_AFTER_MS, STILL_WORKING, type SaveAgentConfigVars, type SealedDraftStorageOptions, type SearchMode, SearchSession, SearchStatus, SegmenterConfig, type SemanticSearch, type SemanticSearchOptions, type SendMessageOptions, type SequencedRow, type SequencedTask, type ServerNotificationBellOptions, type ServerNotificationDescription, type ShellRecentWorkspaceItem, type ShellWorkspaceItem, type ShellWorkspaceKind, type ShellWorkspaceMember, type ShellWorkspaceSeed, type ShellWorkspaceSource, type SignatureNotificationType, type SkillPack, type SkillPackEntry, type StartTaskQuery, StorageActionError, type StorageActions, type StorageDeploymentUsage, type StorageItem, type StorageItemKind, type StorageItemState, type StorageItemsQuery, type StorageKindUsage, type StoragePersistOptions, type StorageProjectUsage, type StorageScope, type StorageSnapshot, type StreamHandlerContext, type StreamHandlerParams, type StreamHandlers, type StreamState, type SwitchWorkspaceTarget, TRANSFER_POLL_MS, TaskThreadPendingError, type ThreadAccessors, ThreadBinding, type ThreadItem, type TimelinePart, type ToolResponses, type TrackCutter, type TrackPiece, type TranscriptExportLine, type TranscriptLineRef, type TranscriptSegmentMarker, type TransferConflictPolicy, type TransferKind, type TransferMode, type TransferPlan, type TransferScope, type TransferStatus, type TurnTools, TxtIcon, TypingIndicator, UPLOAD_ACCEPT, UPLOAD_MAX_FILE_SIZE, type UnarchiveEstimate, type UpdateDocTagInput, type UpdateDocumentsInput, type UpdateProfileVars, type UploadDocumentsInput, type UploadFilesInput, type UploadFilesProgress, type UploadFilesResult, type UploadFromUrlsInput, type UploadFromUrlsResult, type UploadRefusal, type UploadUrlsInput, type UsageTotals, type UseArbiShellWorkspacesOptions, type UseAskAgainOptions, type UseAvatarCropOptions, type UseCameraStreamResult, type UseConversationOptions, type UseDeleteAccountFlowOptions, type UseDownloadDocumentsOptions, type UseEmailChangeOptions, type UseIdentityVerificationFlowOptions, type UseMessageTimerOptions, type UseNameEditorOptions, type UsePasswordChangeFormOptions, type UseShellWorkspacesOptions, type UseShellWorkspacesResult, type UseSwitchWorkspaceResult, type UseVideoRecorderResult, type UserResponse, type UserSettingFlag, type UserSettingsPatch, VIDEO_MIME_PREFERENCE, VidIcon, VideoCapture, type VideoCaptureProps, type VideoRecorderState, VoiceNoteRecorder, type VoiceNoteRecorderProps, WORK_NOTIFICATION_LABELS, type WorkspaceArchive, type WorkspaceArchiveState, type WorkspaceDocument, type WorkspaceExport, type WorkspaceMember, type WorkspaceNotificationLevel, type WorkspaceProcessing, type WorkspaceRole, type WorkspaceSwitchContext, type WorkspaceUpdate, XlsIcon, type ZipExtractor, __resetPendingFinalCommitsForTests, __resetStreamingTokenBufferForTests, acceptRing, accountPath, addAssistantMessageToCache, addConversationToList, addUserMessageToCache, adjustTagCounts, adoptNewChatDocument, agentControl, aliasTakenMessage, allConversationThreads, annotateThread, announceMailDraftReplaced, appendTokenToMessage, applyCallEvent, applyConversationEvent, applyFinalContextToMessage, applyLiveUpdate, applyNotificationRow, applyOptimisticDocumentEdit, applyOutputItemToMessage, applyTaskEvent, arbiAccountClient, arbiMailClient, archiveName, archivedWorkspaceMessage, bindThreadDocument, boundDocumentOf, buildDocumentMetadataRows, buildMentionCandidates, buildPendingFirstTurn, buildPendingSyncItem, buildWorkspaceArchive, cacheThreadBinding, cachedAssistantMode, cachedMentionCandidates, cachedQuotaUsedUp, calendarNotificationMeta, callLink, callNotificationMeta, captureFrameAsBlob, chatTranscriptRef, classifyMediaError, clearLoadingState, clearSealedDrafts, clearUserInputRequest, clockTime, closePanelIn, commitFinalMessage, completeQueuedUserMessageByContent, compositeFiles, compositeTrack, connectOAuthCalendarAccount, connectorErrorStatus, connectorReturnTo, conversationKey, createArbiLayoutStore, createArbiSessionStore, createChunkedRecorder, createDebouncedWriter, createLocalFeatureStore, createMailClient, createMutedNotifier, createSealedDraftStorage, createSkillPack, createStoragePersist, createStreamHandlers, createTrackCutter, createWorkspaceSwitch, cropImage, cutAtPauses, dayKey, declineRing, decodeMono16k, defaultLayoutState, defaultMailAlias, deploymentUserMeta, describeActivity, describeCalendarNotification, describeServerNotification, discardStreamingTokensForMessage, disconnectAttachedRun, dmTabId, documentActivityMeta, documentActivityPhrase, documentDisplayName, docxMentionMeta, downloadRecoveryFile, dropTagFromCachedDocuments, encodeWav, ensureAssistantMessageLoading, entitlementRefusal, extensionFor, extractZipFile, fallbackFileName, fetchPart, fileAttachment, fileSafe, filesFromDrop, findConversation, finishEntityExtraction, floatToWav, flushOnPageExit, flushStreamingTokens, forgetDocuments, forgetUploadedDocumentFolder, formatConfigValidationError, formatElapsed, formatIdentityPrice, formatTranscriptMarkdown, getCachedDocuments, getInterjectionText, getNotificationTypeMeta, getOfflineDocument, getOrphanedLastMessage, getRelatedLabels, getRelatedTotal, getRunStartedAt, getThreadsQueryKey, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasPendingFinalCommit, hasRecordingTranscript, hasVideoTrack, identityStepFor, inputRequestTitle, invalidateCalendarEvents, invalidateCalendars, invalidateCall, invalidateConversationActivity, invalidateConversationDetails, invalidateConversationLists, invalidateTagData, invalidateTagTables, isActivityKey, isAliasTakenError, isArchiveMoving, isCommentToPeople, isConversationListKey, isConversationShared, isDeploymentAdmin, isDeploymentUserNotification, isDocumentsLoading, isFullConfig, isKnownSoloConversation, isMessageRunning, isNotificationRow, isOfflineReadableArbiQuery, isOrphanedUserMessage, isPanelOpen, isQueuedCalendarWrite, isRecordingSegmentId, isReplayableArbiMutation, isRestorableArbiQueryOnline, isRowNewer, isSignatureNotificationType, isStaleTaskUpdate, isTransferFinished, isTransferResumable, isUsageMetered, isWorkspaceArchivedError, isWorkspaceGuestOf, isWorkspaceNotificationType, isZipFile, joinFromPreJoin, layoutActionsOf, loadOfflineDocument, mailDraftIdFromContent, mailJson, markMessageAsFailed, markNarrationSettled, mergeHostConfig, migrateLegacyThreadDocuments, mountDiditVerification, mutedNoticeFromEvent, mutedNoticeFromPacket, mutedNoticeText, nextAliasSuggestion, nextViewingDocument, notificationUserName, onCallEvent, openAccessRequest, openCall, openPanelIn, openRecording, panelPlace, parseActivityContent, parseDeleteAccountBlockers, parseSavedLayout, partKey, partsDue, patchCachedDocument, patchConversation, patchConversationList, patchDocuments, patchWorkspaceTags, pendingChatModelSave, peopleDirectory, personOfUser, pickRecentWorkspaces, pickRecorderMimeType, playheadAt, postRecordingDocsToThread, postTranscriptToThread, prepareUploadFiles, queuedMessages, readLocalFeature, recordingFiles, recordingWindowsOf, redlineStats, refreshDocuments, refuseChatWhenOffline, registerArbiMutationDefaults, registerAttachedRun, removeConversationFromLists, removeSettledNarration, requestPersistentStorage, resetCalendarAccountSyncState, resetMessageContent, resolveActiveWorkspace, resolveConfigModel, resolveDocumentStatus, resolveReplyTarget, restoreLayout, rollbackOptimisticDocumentEdit, safePortalUrl, saveRecordingFilesToThread, savedLayoutOf, schedulePart, selectDraft, selectIsGenerating, selectViewingDocumentId, serverCallsExperimental, serverNotificationBellEntry, setCachedDocument, setMessageContent, setUserInputRequest, settledByRows, signatureNotificationPhrase, signatureRequestMeta, sortTranscriptMessages, sortedParts, speakerTracks, speakerWav, splitIntoFiles, standalone, startChatCall, startContactsCall, startDmCall, startEntityExtraction, startThreadCall, startsMediaFile, stopDocumentsLoading, stripSpeakerPrefix, subscribeDocumentReads, subscribeDocumentRows, supersedeLiveTranscript, supersededTranscriptLines, supportsHouseTemplates, textToArtifact, threadBinding, threadEndingAtContains, threadTabId, threadTranscriptLines, threadTranscriptRef, timelineDurationMs, timelineOf, titleFromQuestion, toChatCitations, toNotificationPreferences, toProfileView, toRedlineMarkdown, toShellWorkspace, transcribeRecording, transcriptSegmentOf, updateMessageWithMetadata, updateUserMessageInCache, updateUserMessageStateInCache, uploadFolderOf, uploadedDocumentFolder, upsertDocuments, useAccountClient, useActOnStep, useActivity, useAddChatMembers, useAddDatabaseRows, useAddHolidayCalendar, useAddProjectAddonBlock, useAddWorkspaceMembers, useAddonQuote, useAgentChats, useAgentConfig, useAgentDmStatus, useAgentModels, useAgentRunControl, useAgentSession, useAgentWorkspaces, useAgents, useAiTask, useAnswerAgentQuestion, useApplyChatModel, useArbi, useArbiConnected, useArbiHost, useArbiSession, useArbiSessionState, useArbiSessionStore, useArbiShellWorkspaces, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArbiWsStore, useArchiveProgressPolling, useArchiveWorkspace, useAskAgain, useAssignDocTags, useAssistantQuery, useAuthorizeLimits, useAutoSendDraft, useAvailableModels, useAvatarCrop, useBookingPages, useBoxRole, useBranchNavigation, useBuiltinCommands, useCalDavProfiles, useCalendarAccounts, useCalendarEvent, useCalendarEventByUid, useCalendarEvents, useCalendarInvitations, useCalendarOutbox, useCalendarOverlays, useCalendarSettings, useCalendarShares, useCalendarSupport, useCalendars, useCall, useCallInviteLinks, useCallRecording, useCallRecordings, useCallTranscriptionAvailable, useCallsConfig, useCallsEnabled, useCameraStream, useCanCreateProjects, useCanEditShared, useCanHostCalls, useCancelDriveSync, useCancelMailboxSync, useCancelManyPendingSync, useCancelProjectSubscription, useCancelWorkspaceTransfer, useChangeProjectPlan, useChargeWatch, useChatArrivals, useChatPost, useChatSummaries, useChatThread, useChatUnreadTotal, useChats, useClaimNativeAlias, useCloseAgentSession, useCommandPalette, useConfig, useConfigSchema, useConfigs, useConfirmEmailChange, useConnectCalDavAccount, useConnectMailAccount, useConnectOAuthAccount, useConnectRunStream, useConnectorAutoSync, useConnectorCatalog, useConnectorVendorVisibility, useContacts, useConversation, useConversationActions, useConversationActivity, useConversationData, useConversationDocuments, useConversationIsShared, useConversationItems, useConversationPendingAuth, useConversationSearch, useConversationThreads, useConversationTurn, useConversationUsage, useConversations, useCreateAgent, useCreateCalendar, useCreateContact, useCreateDatabase, useCreateEvent, useCreateFact, useCreateFacts, useCreateGroupChat, useCreateProject, useCreateProjectCheckout, useCreateRoom, useCreateTag, useCreateWork, useCreateWorkflow, useCreateWorkspace, useCurrentSessionId, useCurrentUser, useDatabase, useDatabaseRows, useDatabases, useDecideCounter, useDeleteAccount, useDeleteAccountFlow, useDeleteAgents, useDeleteBookingPage, useDeleteCalendar, useDeleteChatMessage, useDeleteConfig, useDeleteContact, useDeleteConversation, useDeleteDatabase, useDeleteDatabaseRows, useDeleteDocuments, useDeleteEvent, useDeleteFact, useDeleteMessage, useDeleteNotifications, useDeleteProject, useDeleteSkill, useDeleteTag, useDeleteWorkflow, useDeleteWorkspaces, useDeploymentDomain, useDisconnectCalendarAccount, useDisconnectConnector, useDisconnectMailAccount, useDisconnectSlack, useDismissedTips, useDocument, useDocumentAutoAdd, useDocumentHostActions, useDocumentPendingSync, useDocumentThumbnails, useDocumentVersionList, useDocuments, useDocumentsById, useDocumentsLoading, useDocumentsSupport, useDownloadDocuments, useDriveFolderChildren, useDriveFolderDocCount, useDriveFolders, useDriveSyncEstimate, useDriveSyncProgress, useEmailChange, useEnableDriveSync, useEnableMailboxSync, useEntitlements, useEntityExtractionDocIds, useExportDatabase, useExtractEntities, useFacts, useFeature, useFeatureSwitch, useFetchCalendarEvent, useFilteredProjects, useFinaliseTranslation, useFindTime, useFirmPool, useFollowThread, useFreeBusy, useGenerateAgentAvatar, useGenerateDocTags, useGrantAgentAccess, useHealth, useHolidayCountries, useHouseTemplateCandidates, useIdentityVerification, useIdentityVerificationFlow, useImportCalendar, useImportContacts, useImportDatabase, useImportDatabaseRows, useInstallSkillPack, useInvalidateAfterTransfer, useInvalidateProjects, useInvalidateStorage, useInvalidateTagData, useInviteContacts, useIsCreatingTag, useIsEntitled, useIsSlow, useIsWorkspaceOwner, useKeepDocumentsOffline, useLinkContact, useMailAccounts, useMailAttachmentText, useMailCache, useMailClient, useMailDraftCompose, useMailDraftEditor, useMailDraftReplaced, useMailFolders, useMailMessage, useMailMessages, useMailOnline, useMailPolicy, useMailProjects, useMailUnlock, useMailboxFolders, useMailboxSyncProgress, useMarkChatRead, useMarkDocumentShared, useMarkNotificationsRead, useMcpTools, useMeetingReadOnly, useMentionCandidates, useMessageDetails, useMessageTimer, useMoveEvent, useMoveWorkspaceToProject, useMyConnectors, useNameEditor, useNotificationPreferences, useNotifications, useNotifyConversation, useOfflineDocumentIds, useOpenCallMeetingChat, useOpenSelectedWorkspace, useOpenViewerDocumentId, useParsedDocument, usePassageQuotes, usePasswordChange, usePasswordChangeForm, usePendingContacts, usePendingSyncCounts, usePendingSyncItems, usePeople, usePeopleSearch, usePlanQuote, usePlanWork, usePlanWorkspaceTransfer, usePreviewProjectPlanChange, useProcessingTask, useProcessingTasks, useProducts, useProfile, useProjectBillingPortal, useProjectConversationUsage, useProjectEvents, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, usePublishCalendar, useRecordingActions, useRecordingWindows, useRefreshCalendar, useRefreshConnectorsOnRunEnd, useRefreshDocuments, useRefreshProject, useRelatedDocuments, useRemoveChatMember, useRemoveDocTags, useRemoveDocumentsOffline, useRemoveWorkspaceMembers, useRenameChat, useRenameFolder, useRequestEmailChange, useRequestWorkspaceAccess, useRespondToEvent, useResumeCalendarAccountConnect, useResumeWorkspaceTransfer, useRevokeAgentAccess, useRevokeCallInviteLink, useRooms, useRunConversation, useRunWorkflow, useSaveAgentConfig, useSaveBookingPage, useSaveCalendarSettings, useSaveConfig, useSaveConfigField, useSaveMailDraft, useSaveSkill, useSaveToThread, useSearchContacts, useSearchDatabaseRows, useSearchFacts, useSemanticSearch, useSendBackStep, useSendMail, useServerCallsEnabled, useServerCallsExperimental, useSessionPageTab, useSessionView, useSessions, useSetDeploymentHouseTemplate, useSetSkillVisibility, useSetTagValues, useSetWorkspaceHouseTemplate, useSetWorkspaceMemberRoles, useShareCalendar, useShellWorkspaces, useSignOut, useSignedInSession, useSimilarDocuments, useSkillSource, useSkills, useSlackConnection, useStartAgentSession, useStartCalendarAccountOAuth, useStartTaskQuery, useStartWorkspaceTransfer, useStorageActions, useStorageItemNames, useStorageItems, useStorageProjects, useStorageSnapshots, useStreamHandlers, useSubscribeCalendar, useSwitchWorkspace, useSyncAccountsOnOpen, useSyncCalendarAccount, useTagKindSchema, useTags, useTerminateSession, useThinkingContent, useThreadDocument, useThumbnails, useTopUpFirmPool, useTransientView, useTriggerDriveSync, useTriggerMailboxSync, useUnarchiveWorkspace, useUnreadByPeer, useUnshareCalendar, useUpdateCalendar, useUpdateCalendarAccount, useUpdateContact, useUpdateConversation, useUpdateDatabase, useUpdateDatabaseRow, useUpdateDocTag, useUpdateDocuments, useUpdateEvent, useUpdateFact, useUpdateMailMessage, useUpdateProfile, useUpdateProjectAddonSettings, useUpdateProjectFields, useUpdateProjectNextPeriodAddons, useUpdateTag, useUpdateTagKindSchema, useUpdateUserSettings, useUpdateWorkflow, useUpdateWorkspace, useUploadDocuments, useUploadFiles, useUploadFromUrls, useUploadSkillFiles, useUploadUrls, useUserSettings, useUserUsageToday, useVideoRecorder, useWorkItems, useWorkNotifications, useWorkflowRuns, useWorkflows, useWorkspaceActivity, useWorkspaceArchive, useWorkspaceDocs, useWorkspaceExportDownload, useWorkspaceNotificationLevel, useWorkspaceProcessing, useWorkspaceRole, useWorkspaceTransfer, useWorkspaceTransfers, useWorkspaceTrash, useWorkspaceUsers, useWorkspaces, userDisplayName, userInitials, waitForResponseId, wipeOfflineDocuments, withRelativePath, workflowStepOf, workspaceHouseTemplateId, writeSamples };
15920
+ export { AGENT_CONTROL_COMMANDS, AGGREGATE_FIELDS, ALLOWED_PORTAL_ORIGINS, ARCHIVE_POLL_MS, ASSISTANT_MENTION_LABEL, AUDIO_MIME_PREFERENCE, AUTO_CHAT_MODEL, type AccessRequestPayload, type AccessRequestRecipient, type AccountClient, type AccountClientContextValue, type AccountHost, type AccountSession, type AccountSignOutOptions, ActiveCall, type ActivityContent, type ActivityDescription, ActivityFeed, type ActivityFeedProps, type AddWorkspaceMembersRequest, type AgentAccessMode, type AgentConfigSections, type AgentControlMaps, AgentDmStatus, type AgentQuestionRef, type AgentRunControlState, type AggregateOp, type AggregatedDailyUsage, type AggregatedModelGroupUsage, AiActionCard, AiAnswer, type AiRunOptions, type AiTaskStatus, AppNotification, AppleIcon, type ApplyCallEventOptions, ArbiBotHeadIcon, ArbiBotIcon, type ArbiChatCitation, type ArbiChatDocument, type ArbiChatHost, type ArbiChatMessage, type ArbiChatMessageStatus, type ArbiChatPassage, type ArbiChatRole, type ArbiChatThread, type ArbiConversation, type ArbiConversationDocument, type ArbiConversationGeneration, type ArbiDmTab, type ArbiDocumentViewerState, type ArbiDraftStorage, type ArbiFeature, type ArbiFeatures, type ArbiGridLayoutState, ArbiHost, type ArbiHostConfig, ArbiHostConnection, ArbiHostProps, type ArbiKeyValueStorage, type ArbiLayoutActions, type ArbiLayoutState, type ArbiLayoutStore, type ArbiLayoutStoreOptions, type ArbiMessageTimer, type ArbiPanelMode, type ArbiPanelsState, type ArbiSavedLayout, type ArbiSessionPersist, type ArbiSessionState, type ArbiSessionStatus, type ArbiSessionStore, type ArbiSessionStoreOptions, type ArbiShellState, type ArbiSidebarState, type ArbiSignedInSession, type ArbiTabsState, type ArbiThreadTab, type ArbiThreadView, type ArbiViewerTab, type ArbiViewingDocument, type ArbiViewingDocumentInput, type ArbiViewsState, ArbiWebSocketProvider, type ArbiWebSocketProviderProps, type ArbiWorkspaceState, type ArbiWorkspaceStatus, type ArbiWorkspaceStorage, type ArbiWorkspaceStore, type ArbiWorkspaceStoreOptions, type ArbiWsState, type ArbiWsStatus, ArtifactCanvas, type AskAgain, type AspectOption, type AssignDocTagsInput, type AssistantMode, AudIcon, type AudioPiece, type AvatarCrop, type AvatarFileProblem, BOX_SEAT_REFUSED, BOX_SEAT_REFUSED_ACTION, BOX_SEAT_REFUSED_TITLE, BUILTIN_DATA_SOURCES, type BranchNavigation, type BranchPoint, type BrowserWorkspaceStorageOptions, type BuildArchiveInput, type BuiltArchive, CALL_MODERATION_TOPIC, CONVERSATION_SWITCH_MEASURE, type CalendarConnectorSupport, type CalendarNotificationMeta, type CalendarOfflineSupport, type CalendarPendingWrite, type CalendarSupport, type CalendarWriteOp, type CallInviteContact, type CallMutedNotice, type CallRoomEvents, type CallSlotMode, type CallUserPillProps, type CallsHost, type ChartSpec, type ChartType, type ChatArrival, ChatBubble, type ChatBubbleProps, ChatMemberKey, type ChatPost, ChatResponse, type ChatSummary, ChatThreadMessage, type Chunk, type ChunkActivation, type ChunkedRecorder, type ChunkedRecorderOptions, CitationRenderer, type CitationRendererProps, type CitationState, ClaudeIcon, CommandPalette, type CommandPaletteClassNames, type CommandPaletteProps, CommandPaletteProvider, type CommandPaletteProviderProps, type CommandPaletteValue, type ConfigUpdate, type ConversationActionsInput, type ConversationEvent, ConversationList, type ConversationListProps, ConversationScope, type ConversationScopeProps, type ConversationsSourceLabels, type CreateProjectVars, type CreateSkillPackOptions, type CreateTagInput, type CreateWorkspaceVars, type CreatedProject, type CropArea, type CropOutput, type CropResult, type CurrentWorkspace, DATABASE_RELATION_PICK_LIMIT, DATABASE_ROWS_PAGE, DEFAULT_ASPECT_OPTIONS, DEFAULT_CONVERSATIONS_SOURCE_LABELS, DEFAULT_DATABASE_SOURCE_LABELS, DEFAULT_DOCUMENTS_SOURCE_LABELS, DEFAULT_DOCUMENT_VIEWER_STATE, DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, DEFAULT_PROJECTS_SOURCE_LABELS, DEFAULT_USAGE_SOURCE_LABELS, DEFAULT_WORKSPACES_SOURCE_LABELS, DISMISSED_TASK_TTL_MS, DOCUMENTS_FIRST_PAGE_MEASURE, DOCUMENTS_FIRST_PAGE_SIZE, DOCUMENTS_PAGE_SIZE, type DashboardSpec, type DashboardStore, type DashboardsHost, type DataSource, type DataSourceFieldsState, type DataSourceOption, type DataSourceParam, type DataSourceParams, type DataSourceRef, type DataSourceRegistry, type DatabaseAggregateRequest, type DatabaseAggregateResult, type DatabaseDashboardStoreOptions, type DatabaseSourceLabels, type Dataset, type DatasetField, type DatasetFieldType, type DatasetFilter, type DatasetOrder, type DatasetQuery, type DatasetRow, type DatasetSort, type DatasetState, type DatasetValue, DateSeparator, type DateSeparatorProps, type DebouncedWriter, type DebouncedWriterOptions, type DeleteAccountBlocker, type DeleteAccountFlow, type DeletedDocument, type DeletedDocumentsPage, type DescribeCalendarNotificationOptions, type DescribeServerNotificationOptions, DictateContextValue, DmAvatar, type DmAvatarProps, type DmClassNames, DmComposer, type DmComposerProps, type DmConversation, type DmMessage, type DmUser, DocIcon, DocQaPanel, DocSearch, DocumentCardMenu, type DocumentCardMenuProps, type DocumentHostActions, type DocumentPerson, DocumentReview, type DocumentReviewProps, type DocumentRowChange, type DocumentStartItem, type DocumentsSourceLabels, type DocumentsSupport, type DraftKeyValueStore, DraftTitleControls, type DraftTitleControlsProps, EMPTY_GROUP_LABEL, EMPTY_SESSION_STATE, EXPORT_SAMPLE_RATE, type EmailChange, type EmailPreferences, EmlIcon, type EnableDriveSyncVars, type EnableMailboxSyncVars, type EntitledFeature, EntityIconComponent, EntityVocabulary, type ExportDownloadRequest, type ExportFileKind, type ExtractedZip, FILE_TYPE_COLORS, FINISHED_DOCUMENT_STATUSES, FIRST_TOKEN_MEASURE, type FactListFilter, type FeatureEntitlements, type FeatureRefusal, type FeatureSource, type FeatureSwitch, FileIcon, type FilterOp, FireworksIcon, type FollowSaveCallbacks, GeminiIcon, type GenerateDocTagsInput, GitHubIcon, GoogleIcon, type GrantAgentAccessVars, HostConfigRecord, HtmlIcon, IN_FLIGHT_DOCUMENT_STATUSES, IdentityPurchase, IdentityStatus, IdentityStep, type IdentityVerificationApi, IdentityVerificationFlow, ImageCropModal, type ImageCropModalProps, ImageCropper, type ImageCropperProps, ImgIcon, IncomingCall, InlineMicButton, type InlineMicButtonProps, type InstallSkillPackVariables, JoinChoices, LIVE_UPDATE_TYPES, LinkedInIcon, type LiveTask, type LocalFeatureStore, type LocalFeatureStoreOptions, MAIL_DRAFT_REPLACED_EVENT, MAX_AVATAR_FILE_BYTES, MAX_DASHBOARD_SPEC_CHARS, MAX_SERIES, MAX_THREAD_TABS, MIN_NARRATION_DWELL_MS, MIN_QUEUED_MESSAGE_VISIBILITY_MS, MODEL_GROUP_LABELS, MUTED_DEDUPE_MS, type MailAccount, type MailAddress, type MailAttachment, type MailClient, type MailClientContextValue, type MailCompose, type MailDeliveryRecipient, type MailDeliveryStatus, type MailDeviceFallback, type MailDraftEditorRequest, type MailDraftEditorSession, type MailFetch, type MailFolder, type MailHost, type MailMessage, type MailMessageUpdate, MailOfflineUnavailableError, type MailPage, type MailPolicy, type MailProject, MeetingChatRef, MeetingChatTarget, MentionCandidate, type MessageArtifact, MessageArtifactCard, type MessageTimerResult, MicRecordingOverlay, type MicRecordingOverlayProps, MicWaveformIndicator, type MicWaveformIndicatorProps, type ModeratedTrack, type MountDiditOptions, type NameEditor, type NotificationPreferencesModel, type NotificationTarget, type NotificationTypeMeta, NotifyVariant, type OfflineDocumentRecord, OpenAIIcon, type OpenedRecording, type OptimisticDocumentEdit, type OrderResolver, PENDING_SYNC_PREDICATE, PLAYBACK_LOOKAHEAD_MS, POLL_EVERY_MS, PROJECT_CREATION_DENIED_REASON, type PaletteNavItem, type PanelDatasetState, type PanelSpec, type ParsedChunk, type ParsedChunkMetadata, type ParsedDocument, type ParsedDocumentMetadata, type PassageResolvers, type PasswordChangeForm, type PasswordChangeFormMessages, type PasswordChangeVars, PdfIcon, type PendingSyncItem, type PeopleDirectory, type Person, PhotoCapture, type PhotoCaptureProps, type ProcessingTask, type ProfileView, type ProjectsSourceLabels, type ProjectsSourceOptions, type ProjectsUsageAggregate, type QueuedCalendarWrite, type QueuedMessage, type QueuedMessages, type QuoteResolver, RECORDING_SEGMENTER, RUN_WINDOW_MS, type RawPending, type RecordedChunk, type RecordingWindow, type RefusedUploadFile, type RelatedDocs, type RelatedDocsMap, type RelevancePatch, type RemoveDocTagsInput, type RenderMarkdown, type RequestAccessOptions, type RowsSourceDefinition, type RowsState, SEGMENT_FRAME_MS, SEGMENT_PRE_ROLL_MS, SHORT_PIECE_MERGE_GAP_MS, SIGNATURE_NOTIFICATION_TYPES, SIMILARITY_THRESHOLD, SLOW_AFTER_MS, STILL_WORKING, type SaveAgentConfigVars, type SavedDashboard, type SealedDraftStorageOptions, type SearchMode, SearchSession, SearchStatus, SegmenterConfig, type SemanticSearch, type SemanticSearchOptions, type SendMessageOptions, type SequencedRow, type SequencedTask, type ServerNotificationBellOptions, type ServerNotificationDescription, type ShellRecentWorkspaceItem, type ShellWorkspaceItem, type ShellWorkspaceKind, type ShellWorkspaceMember, type ShellWorkspaceSeed, type ShellWorkspaceSource, type SignatureNotificationType, type SkillPack, type SkillPackEntry, type StartTaskQuery, StorageActionError, type StorageActions, type StorageDeploymentUsage, type StorageItem, type StorageItemKind, type StorageItemState, type StorageItemsQuery, type StorageKindUsage, type StoragePersistOptions, type StorageProjectUsage, type StorageScope, type StorageSnapshot, type StreamHandlerContext, type StreamHandlerParams, type StreamHandlers, type StreamState, type SwitchWorkspaceTarget, TRANSFER_POLL_MS, type TableView, type TableViewTable, TaskThreadPendingError, type ThreadAccessors, ThreadBinding, type ThreadItem, type TimeBucket, type TimelinePart, type ToolResponses, type TrackCutter, type TrackPiece, type TranscriptExportLine, type TranscriptLineRef, type TranscriptSegmentMarker, type TransferConflictPolicy, type TransferKind, type TransferMode, type TransferPlan, type TransferScope, type TransferStatus, type TurnTools, TxtIcon, TypingIndicator, UPLOAD_ACCEPT, UPLOAD_MAX_FILE_SIZE, type UnarchiveEstimate, type UpdateDocTagInput, type UpdateDocumentsInput, type UpdateProfileVars, type UploadDocumentsInput, type UploadFilesInput, type UploadFilesProgress, type UploadFilesResult, type UploadFromUrlsInput, type UploadFromUrlsResult, type UploadRefusal, type UploadUrlsInput, type UsageSourceLabels, type UsageTotals, type UseArbiShellWorkspacesOptions, type UseAskAgainOptions, type UseAvatarCropOptions, type UseCameraStreamResult, type UseConversationOptions, type UseDeleteAccountFlowOptions, type UseDownloadDocumentsOptions, type UseEmailChangeOptions, type UseIdentityVerificationFlowOptions, type UseMessageTimerOptions, type UseNameEditorOptions, type UsePasswordChangeFormOptions, type UseShellWorkspacesOptions, type UseShellWorkspacesResult, type UseSwitchWorkspaceResult, type UseVideoRecorderResult, type UserResponse, type UserSettingFlag, type UserSettingsPatch, VIDEO_MIME_PREFERENCE, VidIcon, VideoCapture, type VideoCaptureProps, type VideoRecorderState, VoiceNoteRecorder, type VoiceNoteRecorderProps, WORKSPACE_LAST_OPENED_KEY, WORKSPACE_STORAGE_KEY, WORK_NOTIFICATION_LABELS, type WorkspaceArchive, type WorkspaceArchiveState, type WorkspaceDocument, type WorkspaceExport, type WorkspaceMember, type WorkspaceNotificationLevel, type WorkspaceProcessing, type WorkspaceRole, type WorkspaceSwitchContext, type WorkspaceUpdate, type WorkspacesSourceLabels, XlsIcon, type ZipExtractor, __resetPendingFinalCommitsForTests, __resetStreamingTokenBufferForTests, acceptRing, accountPath, addAssistantMessageToCache, addConversationToList, addUserMessageToCache, adjustTagCounts, adoptNewChatDocument, agentControl, aggregateDataset, aliasTakenMessage, allConversationThreads, annotateThread, announceMailDraftReplaced, appendTokenToMessage, applyCallEvent, applyConversationEvent, applyFinalContextToMessage, applyLiveUpdate, applyNotificationRow, applyOptimisticDocumentEdit, applyOutputItemToMessage, applyTaskEvent, arbiAccountClient, arbiMailClient, archiveName, archivedWorkspaceMessage, bindThreadDocument, boundDocumentOf, browserWorkspaceStorage, bucketOf, bucketRange, buildDocumentMetadataRows, buildMentionCandidates, buildPendingFirstTurn, buildPendingSyncItem, buildWorkspaceArchive, cacheThreadBinding, cachedAssistantMode, cachedMentionCandidates, cachedQuotaUsedUp, calendarNotificationMeta, callLink, callNotificationMeta, captureFrameAsBlob, chatTranscriptRef, classifyMediaError, clearLoadingState, clearSealedDrafts, clearUserInputRequest, clockTime, closePanelIn, commitFinalMessage, completeQueuedUserMessageByContent, compositeFiles, compositeTrack, connectOAuthCalendarAccount, connectorErrorStatus, connectorReturnTo, conversationKey, createArbiLayoutStore, createArbiSessionStore, createArbiWorkspaceStore, createChunkedRecorder, createConversationsSource, createDataSourceRegistry, createDatabaseSource, createDebouncedWriter, createDocumentsSource, createLocalFeatureStore, createMailClient, createMemoryDashboardStore, createMutedNotifier, createProjectsSource, createSealedDraftStorage, createSkillPack, createStoragePersist, createStreamHandlers, createTrackCutter, createUsageSource, createWorkspaceSwitch, createWorkspacesSource, cropImage, cutAtPauses, dayKey, declineRing, decodeMono16k, defaultLayoutState, defaultMailAlias, defineRowsSource, deploymentUserMeta, describeActivity, describeCalendarNotification, describeServerNotification, discardStreamingTokensForMessage, disconnectAttachedRun, dmTabId, documentActivityMeta, documentActivityPhrase, documentDisplayName, docxMentionMeta, downloadRecoveryFile, dropTagFromCachedDocuments, encodeWav, ensureAssistantMessageLoading, entitlementRefusal, extensionFor, extractZipFile, fallbackFileName, fetchPart, fileAttachment, fileSafe, filesFromDrop, fillTimeGaps, filterRows, findConversation, finishEntityExtraction, floatToWav, flushOnPageExit, flushStreamingTokens, forgetDocuments, forgetUploadedDocumentFolder, formatConfigValidationError, formatElapsed, formatIdentityPrice, formatTranscriptMarkdown, getCachedDocuments, getInterjectionText, getNotificationTypeMeta, getOfflineDocument, getOrphanedLastMessage, getRelatedLabels, getRelatedTotal, getRunStartedAt, getThreadsQueryKey, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasPendingFinalCommit, hasRecordingTranscript, hasVideoTrack, identityStepFor, inputRequestTitle, invalidateCalendarEvents, invalidateCalendars, invalidateCall, invalidateConversationActivity, invalidateConversationDetails, invalidateConversationLists, invalidateTagData, invalidateTagTables, isActivityKey, isAliasTakenError, isArchiveMoving, isCommentToPeople, isConversationListKey, isConversationShared, isDeploymentAdmin, isDeploymentUserNotification, isDocumentsLoading, isFullConfig, isKnownSoloConversation, isMessageRunning, isNotificationRow, isOfflineReadableArbiQuery, isOrphanedUserMessage, isPanelOpen, isQueuedCalendarWrite, isRecordingSegmentId, isReplayableArbiMutation, isRestorableArbiQueryOnline, isRowNewer, isSignatureNotificationType, isStaleTaskUpdate, isTableViewOf, isTransferFinished, isTransferResumable, isUsageMetered, isWorkspaceArchivedError, isWorkspaceGuestOf, isWorkspaceNotificationType, isZipFile, joinFromPreJoin, layoutActionsOf, loadOfflineDocument, mailDraftIdFromContent, mailJson, markMessageAsFailed, markNarrationSettled, mergeHostConfig, migrateLegacyThreadDocuments, mountDiditVerification, mutedNoticeFromEvent, mutedNoticeFromPacket, mutedNoticeText, nextAliasSuggestion, nextViewingDocument, notificationUserName, onCallEvent, openAccessRequest, openCall, openPanelIn, openRecording, panelPlace, parseActivityContent, parseDashboardSpec, parseDeleteAccountBlockers, parseSavedLayout, partKey, partsDue, patchCachedDocument, patchConversation, patchConversationList, patchDocuments, patchWorkspaceTags, pendingChatModelSave, peopleDirectory, personOfUser, pickRecentWorkspaces, pickRecorderMimeType, playheadAt, postRecordingDocsToThread, postTranscriptToThread, prepareUploadFiles, queryOfChart, queuedMessages, readLocalFeature, readWorkspaceLastOpened, recordingFiles, recordingWindowsOf, recordsOf, redlineStats, refreshDocuments, refuseChatWhenOffline, registerArbiMutationDefaults, registerAttachedRun, removeConversationFromLists, removeSettledNarration, requestPersistentStorage, resetCalendarAccountSyncState, resetMessageContent, resolveActiveWorkspace, resolveConfigModel, resolveDocumentStatus, resolveReplyTarget, restoreLayout, rollbackOptimisticDocumentEdit, safePortalUrl, saveRecordingFilesToThread, savedLayoutOf, schedulePart, selectDraft, selectIsGenerating, selectViewingDocumentId, serializeDashboardSpec, serverCallsExperimental, serverNotificationBellEntry, setCachedDocument, setMessageContent, setUserInputRequest, settledByRows, signatureNotificationPhrase, signatureRequestMeta, sortTranscriptMessages, sortedParts, speakerTracks, speakerWav, splitIntoFiles, standalone, startChatCall, startContactsCall, startDmCall, startEntityExtraction, startThreadCall, startsMediaFile, stopDocumentsLoading, stripSpeakerPrefix, subscribeDocumentReads, subscribeDocumentRows, supersedeLiveTranscript, supersededTranscriptLines, supportsHouseTemplates, textToArtifact, threadBinding, threadEndingAtContains, threadTabId, threadTranscriptLines, threadTranscriptRef, timelineDurationMs, timelineOf, titleFromQuestion, toChatCitations, toNotificationPreferences, toProfileView, toRedlineMarkdown, toShellWorkspace, transcribeRecording, transcriptSegmentOf, updateMessageWithMetadata, updateUserMessageInCache, updateUserMessageStateInCache, uploadFolderOf, uploadedDocumentFolder, upsertDocuments, useAccountClient, useActOnStep, useActiveConfigId, useActivity, useAddChatMembers, useAddDatabaseRows, useAddHolidayCalendar, useAddProjectAddonBlock, useAddWorkspaceMembers, useAddonQuote, useAgentChats, useAgentConfig, useAgentDmStatus, useAgentModels, useAgentRunControl, useAgentSession, useAgentWorkspaces, useAgents, useAiTask, useAnswerAgentQuestion, useApplyChatModel, useArbi, useArbiConnected, useArbiHost, useArbiSession, useArbiSessionState, useArbiSessionStore, useArbiShellWorkspaces, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArbiWsStore, useArchiveProgressPolling, useArchiveWorkspace, useAskAgain, useAssignDocTags, useAssistantQuery, useAuthorizeLimits, useAutoSendDraft, useAvailableModels, useAvatarCrop, useBookingPages, useBoxRole, useBranchNavigation, useBuiltinCommands, useCalDavProfiles, useCalendarAccounts, useCalendarEvent, useCalendarEventByUid, useCalendarEvents, useCalendarInvitations, useCalendarOutbox, useCalendarOverlays, useCalendarSettings, useCalendarShares, useCalendarSupport, useCalendars, useCall, useCallInviteLinks, useCallRecording, useCallRecordings, useCallTranscriptionAvailable, useCallsConfig, useCallsEnabled, useCameraStream, useCanCreateProjects, useCanEditShared, useCanHostCalls, useCancelDriveSync, useCancelMailboxSync, useCancelManyPendingSync, useCancelProjectSubscription, useCancelWorkspaceTransfer, useChangeProjectPlan, useChargeWatch, useChatArrivals, useChatPost, useChatSummaries, useChatThread, useChatUnreadTotal, useChats, useClaimNativeAlias, useCloseAgentSession, useCommandPalette, useConfig, useConfigSchema, useConfigs, useConfirmEmailChange, useConnectCalDavAccount, useConnectMailAccount, useConnectOAuthAccount, useConnectRunStream, useConnectorAutoSync, useConnectorCatalog, useConnectorVendorVisibility, useContacts, useConversation, useConversationActions, useConversationActivity, useConversationData, useConversationDocuments, useConversationIsShared, useConversationItems, useConversationPendingAuth, useConversationSearch, useConversationThreads, useConversationTurn, useConversationUsage, useConversations, useCreateAgent, useCreateCalendar, useCreateContact, useCreateDatabase, useCreateEvent, useCreateFact, useCreateFacts, useCreateGroupChat, useCreateProject, useCreateProjectCheckout, useCreateRoom, useCreateTag, useCreateWork, useCreateWorkflow, useCreateWorkspace, useCurrentSessionId, useCurrentUser, useCurrentWorkspace, useDashboardStore, useDataSources, useDatabase, useDatabaseAggregate, useDatabaseDashboardStore, useDatabaseRows, useDatabases, useDecideCounter, useDeleteAccount, useDeleteAccountFlow, useDeleteAgents, useDeleteBookingPage, useDeleteCalendar, useDeleteChatMessage, useDeleteConfig, useDeleteContact, useDeleteConversation, useDeleteDashboard, useDeleteDatabase, useDeleteDatabaseRows, useDeleteDocuments, useDeleteEvent, useDeleteFact, useDeleteMessage, useDeleteNotifications, useDeleteProject, useDeleteSkill, useDeleteTag, useDeleteWorkflow, useDeleteWorkspaces, useDeploymentDomain, useDisconnectCalendarAccount, useDisconnectConnector, useDisconnectMailAccount, useDisconnectSlack, useDismissedTips, useDocument, useDocumentAutoAdd, useDocumentHostActions, useDocumentPendingSync, useDocumentThumbnails, useDocumentVersionList, useDocuments, useDocumentsById, useDocumentsLoading, useDocumentsSupport, useDownloadDocuments, useDriveFolderChildren, useDriveFolderDocCount, useDriveFolders, useDriveSyncEstimate, useDriveSyncProgress, useEmailChange, useEnableDriveSync, useEnableMailboxSync, useEntitlements, useEntityExtractionDocIds, useExportDatabase, useExtractEntities, useFacts, useFeature, useFeatureSwitch, useFetchCalendarEvent, useFilteredProjects, useFinaliseTranslation, useFindTime, useFirmPool, useFollowThread, useFreeBusy, useGenerateAgentAvatar, useGenerateDocTags, useGrantAgentAccess, useHealth, useHolidayCountries, useHouseTemplateCandidates, useIdentityVerification, useIdentityVerificationFlow, useImportCalendar, useImportContacts, useImportDatabase, useImportDatabaseRows, useInstallSkillPack, useInvalidateAfterTransfer, useInvalidateProjects, useInvalidateStorage, useInvalidateTagData, useInviteContacts, useIsCreatingTag, useIsEntitled, useIsSlow, useIsWorkspaceOwner, useKeepDocumentsOffline, useLinkContact, useMailAccounts, useMailAttachmentText, useMailCache, useMailClient, useMailDraftCompose, useMailDraftEditor, useMailDraftReplaced, useMailFolders, useMailMessage, useMailMessages, useMailOnline, useMailPolicy, useMailProjects, useMailUnlock, useMailboxFolders, useMailboxSyncProgress, useMarkChatRead, useMarkDocumentShared, useMarkNotificationsRead, useMcpTools, useMeetingReadOnly, useMentionCandidates, useMessageDetails, useMessageTimer, useMoveEvent, useMoveWorkspaceToProject, useMyConnectors, useNameEditor, useNotificationPreferences, useNotifications, useNotifyConversation, useOfflineDocumentIds, useOpenCallMeetingChat, useOpenSelectedWorkspace, useOpenViewerDocumentId, usePanelDataset, useParsedDocument, usePassageQuotes, usePasswordChange, usePasswordChangeForm, usePendingContacts, usePendingSyncCounts, usePendingSyncItems, usePeople, usePeopleSearch, usePlanQuote, usePlanWork, usePlanWorkspaceTransfer, usePreviewProjectPlanChange, useProcessingTask, useProcessingTasks, useProducts, useProfile, useProjectBillingPortal, useProjectConversationUsage, useProjectEvents, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, usePublishCalendar, useRecordingActions, useRecordingWindows, useRefreshCalendar, useRefreshConnectorsOnRunEnd, useRefreshDocuments, useRefreshProject, useRelatedDocuments, useRemoveChatMember, useRemoveDocTags, useRemoveDocumentsOffline, useRemoveWorkspaceMembers, useRenameChat, useRenameFolder, useRequestEmailChange, useRequestWorkspaceAccess, useRespondToEvent, useResumeCalendarAccountConnect, useResumeWorkspaceTransfer, useRevokeAgentAccess, useRevokeCallInviteLink, useRooms, useRunConversation, useRunWorkflow, useSaveAgentConfig, useSaveBookingPage, useSaveCalendarSettings, useSaveConfig, useSaveConfigField, useSaveDashboard, useSaveMailDraft, useSaveSkill, useSaveToThread, useSavedDashboards, useSearchContacts, useSearchDatabaseRows, useSearchFacts, useSemanticSearch, useSendBackStep, useSendMail, useServerCallsEnabled, useServerCallsExperimental, useSessionPageTab, useSessionView, useSessions, useSetDeploymentHouseTemplate, useSetSkillVisibility, useSetTagValues, useSetWorkspaceHouseTemplate, useSetWorkspaceMemberRoles, useShareCalendar, useShellWorkspaces, useSignOut, useSignedInSession, useSimilarDocuments, useSkillSource, useSkills, useSlackConnection, useStartAgentSession, useStartCalendarAccountOAuth, useStartTaskQuery, useStartWorkspaceTransfer, useStorageActions, useStorageItemNames, useStorageItems, useStorageProjects, useStorageSnapshots, useStreamHandlers, useSubscribeCalendar, useSwitchWorkspace, useSyncAccountsOnOpen, useSyncCalendarAccount, useTagKindSchema, useTags, useTerminateSession, useThinkingContent, useThreadDocument, useThumbnails, useTopUpFirmPool, useTransientView, useTriggerDriveSync, useTriggerMailboxSync, useUnarchiveWorkspace, useUnreadByPeer, useUnshareCalendar, useUpdateCalendar, useUpdateCalendarAccount, useUpdateContact, useUpdateConversation, useUpdateDatabase, useUpdateDatabaseRow, useUpdateDocTag, useUpdateDocuments, useUpdateEvent, useUpdateFact, useUpdateMailMessage, useUpdateProfile, useUpdateProjectAddonSettings, useUpdateProjectFields, useUpdateProjectNextPeriodAddons, useUpdateTag, useUpdateTagKindSchema, useUpdateUserSettings, useUpdateWorkflow, useUpdateWorkspace, useUploadDocuments, useUploadFiles, useUploadFromUrls, useUploadSkillFiles, useUploadUrls, useUserSettings, useUserUsageToday, useVideoRecorder, useWorkItems, useWorkNotifications, useWorkflowRuns, useWorkflows, useWorkspaceActivity, useWorkspaceArchive, useWorkspaceDocs, useWorkspaceExportDownload, useWorkspaceNotificationLevel, useWorkspaceProcessing, useWorkspaceRole, useWorkspaceTransfer, useWorkspaceTransfers, useWorkspaceTrash, useWorkspaceUsers, useWorkspaces, userDisplayName, userInitials, viewsOfTable, waitForResponseId, wipeOfflineDocuments, withRelativePath, workflowStepOf, workspaceHouseTemplateId, writeSamples };