@arbidocs/blocks 0.4.138 → 0.4.140

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 (177) hide show
  1. package/dist/agents/definitions/AgentConnectInstructions.d.ts +12 -0
  2. package/dist/agents/definitions/defaults.d.ts +12 -0
  3. package/dist/agents/definitions/index.d.ts +2 -0
  4. package/dist/agents/index.cjs +333 -318
  5. package/dist/agents/index.js +7 -8
  6. package/dist/calendar/CalendarFormDialog.d.ts +13 -0
  7. package/dist/calendar/ProposeTimeDialog.d.ts +22 -0
  8. package/dist/calendar/WeeklyHoursEditor.d.ts +7 -0
  9. package/dist/calendar/access-setup.d.ts +8 -0
  10. package/dist/calendar/api-mapping.d.ts +22 -0
  11. package/dist/calendar/booking-form.d.ts +46 -0
  12. package/dist/calendar/conference.d.ts +11 -0
  13. package/dist/calendar/errors.d.ts +7 -0
  14. package/dist/calendar/feeds.d.ts +2 -0
  15. package/dist/calendar/freebusy.d.ts +22 -0
  16. package/dist/calendar/ics.d.ts +33 -0
  17. package/dist/calendar/index.cjs +472 -4293
  18. package/dist/calendar/index.cjs.map +1 -1
  19. package/dist/calendar/index.d.ts +17 -1
  20. package/dist/calendar/index.js +1 -4227
  21. package/dist/calendar/index.js.map +1 -1
  22. package/dist/calendar/requests.d.ts +42 -0
  23. package/dist/calendar/room-window.d.ts +6 -0
  24. package/dist/calendar/settings-value.d.ts +4 -0
  25. package/dist/calls/index.cjs +3 -3
  26. package/dist/calls/index.js +2 -2
  27. package/dist/{chunk-IE5CUCZK.cjs → chunk-3BFGL2JL.cjs} +6 -6
  28. package/dist/{chunk-IE5CUCZK.cjs.map → chunk-3BFGL2JL.cjs.map} +1 -1
  29. package/dist/{chunk-2KUCVSFF.js → chunk-45LRMW54.js} +3 -3
  30. package/dist/{chunk-2KUCVSFF.js.map → chunk-45LRMW54.js.map} +1 -1
  31. package/dist/chunk-5FTIHRZH.cjs +177 -0
  32. package/dist/chunk-5FTIHRZH.cjs.map +1 -0
  33. package/dist/{chunk-FUTMU4FR.js → chunk-5HFPRI3W.js} +3 -3
  34. package/dist/{chunk-FUTMU4FR.js.map → chunk-5HFPRI3W.js.map} +1 -1
  35. package/dist/{chunk-HLB4DIYV.cjs → chunk-5Y3SAJUK.cjs} +6 -6
  36. package/dist/{chunk-HLB4DIYV.cjs.map → chunk-5Y3SAJUK.cjs.map} +1 -1
  37. package/dist/chunk-6YTHQ73P.cjs +5334 -0
  38. package/dist/chunk-6YTHQ73P.cjs.map +1 -0
  39. package/dist/chunk-A3XPS2EU.js +245 -0
  40. package/dist/chunk-A3XPS2EU.js.map +1 -0
  41. package/dist/chunk-B3AHCIV5.js +5206 -0
  42. package/dist/chunk-B3AHCIV5.js.map +1 -0
  43. package/dist/{chunk-2Q7FDZAY.js → chunk-BPBSSMRB.js} +5 -163
  44. package/dist/chunk-BPBSSMRB.js.map +1 -0
  45. package/dist/{chunk-ED4HHTIA.js → chunk-BPUZEYSP.js} +3 -3
  46. package/dist/{chunk-ED4HHTIA.js.map → chunk-BPUZEYSP.js.map} +1 -1
  47. package/dist/{chunk-KSHKTOY2.js → chunk-CKCBBYTA.js} +205 -5
  48. package/dist/chunk-CKCBBYTA.js.map +1 -0
  49. package/dist/chunk-CYNF5PZI.js +170 -0
  50. package/dist/chunk-CYNF5PZI.js.map +1 -0
  51. package/dist/{chunk-3BI6EWKP.cjs → chunk-DAIHYDK6.cjs} +867 -7
  52. package/dist/chunk-DAIHYDK6.cjs.map +1 -0
  53. package/dist/{chunk-OPTBQSCV.cjs → chunk-DJM7DLCT.cjs} +3 -3
  54. package/dist/{chunk-OPTBQSCV.cjs.map → chunk-DJM7DLCT.cjs.map} +1 -1
  55. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  56. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  57. package/dist/{chunk-KDUGTKVI.cjs → chunk-GFNELPDP.cjs} +17 -6
  58. package/dist/chunk-GFNELPDP.cjs.map +1 -0
  59. package/dist/{chunk-OGBXV326.cjs → chunk-GFRQG36Y.cjs} +2 -243
  60. package/dist/chunk-GFRQG36Y.cjs.map +1 -0
  61. package/dist/{chunk-WXYQ66KC.cjs → chunk-HEMU73OP.cjs} +2 -166
  62. package/dist/chunk-HEMU73OP.cjs.map +1 -0
  63. package/dist/{chunk-XVME4XYD.js → chunk-IBIUPT23.js} +845 -7
  64. package/dist/chunk-IBIUPT23.js.map +1 -0
  65. package/dist/{chunk-UUHUQHXR.cjs → chunk-JZNXRMLH.cjs} +6 -6
  66. package/dist/{chunk-UUHUQHXR.cjs.map → chunk-JZNXRMLH.cjs.map} +1 -1
  67. package/dist/{chunk-RQ2Y7USX.cjs → chunk-MIDXCYZB.cjs} +235 -15
  68. package/dist/chunk-MIDXCYZB.cjs.map +1 -0
  69. package/dist/{chunk-W3VYZXNS.js → chunk-O6W6RW3B.js} +5 -240
  70. package/dist/chunk-O6W6RW3B.js.map +1 -0
  71. package/dist/{chunk-OQ7RUNOC.js → chunk-OCDDWDH2.js} +21 -5
  72. package/dist/chunk-OCDDWDH2.js.map +1 -0
  73. package/dist/{chunk-UBEI6WFJ.js → chunk-RYEJ6AA5.js} +12 -705
  74. package/dist/chunk-RYEJ6AA5.js.map +1 -0
  75. package/dist/{chunk-MJKBVIV3.cjs → chunk-SU7QY7U2.cjs} +36 -748
  76. package/dist/chunk-SU7QY7U2.cjs.map +1 -0
  77. package/dist/{chunk-ZNI4SW2G.js → chunk-UGCKUXRV.js} +3 -3
  78. package/dist/{chunk-ZNI4SW2G.js.map → chunk-UGCKUXRV.js.map} +1 -1
  79. package/dist/{chunk-AAFX64WD.cjs → chunk-UMG5S6H5.cjs} +21 -4
  80. package/dist/chunk-UMG5S6H5.cjs.map +1 -0
  81. package/dist/{chunk-L2PAPOZ5.js → chunk-US3S4DCB.js} +17 -6
  82. package/dist/chunk-US3S4DCB.js.map +1 -0
  83. package/dist/chunk-V46W7YLI.cjs +252 -0
  84. package/dist/chunk-V46W7YLI.cjs.map +1 -0
  85. package/dist/{chunk-JVL7HUIQ.cjs → chunk-YLUEQSMK.cjs} +5 -5
  86. package/dist/{chunk-JVL7HUIQ.cjs.map → chunk-YLUEQSMK.cjs.map} +1 -1
  87. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  88. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  89. package/dist/{chunk-E5OYHJMU.js → chunk-ZNTHEXNJ.js} +4 -4
  90. package/dist/{chunk-E5OYHJMU.js.map → chunk-ZNTHEXNJ.js.map} +1 -1
  91. package/dist/citations/QuietMarks.d.ts +5 -2
  92. package/dist/citations/index.cjs +14 -13
  93. package/dist/citations/index.js +2 -1
  94. package/dist/collaboration/index.cjs +42 -42
  95. package/dist/collaboration/index.js +2 -2
  96. package/dist/connect/docx.cjs +6 -6
  97. package/dist/connect/docx.js +5 -5
  98. package/dist/connect/index.cjs +4792 -179
  99. package/dist/connect/index.cjs.map +1 -1
  100. package/dist/connect/index.d.ts +4 -0
  101. package/dist/connect/index.js +4684 -91
  102. package/dist/connect/index.js.map +1 -1
  103. package/dist/connection/ConnectedAgentCreator.d.ts +37 -0
  104. package/dist/connection/ConnectedWorkflowHistory.d.ts +45 -0
  105. package/dist/connection/ConnectionProvider.d.ts +3 -1
  106. package/dist/connection/calendar/AddCalendarDialogs.d.ts +9 -0
  107. package/dist/connection/calendar/BookingPagesPanel.d.ts +13 -0
  108. package/dist/connection/calendar/CalendarAccountsPanel.d.ts +5 -0
  109. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +12 -0
  110. package/dist/connection/calendar/ConnectedCalendar.d.ts +13 -0
  111. package/dist/connection/calendar/ConnectedMailInviteCard.d.ts +12 -0
  112. package/dist/connection/calendar/ConnectedPublicBooking.d.ts +9 -0
  113. package/dist/connection/calendar/ConnectedUpcomingEvents.d.ts +12 -0
  114. package/dist/connection/calendar/CopyField.d.ts +9 -0
  115. package/dist/connection/calendar/EventEditorDialog.d.ts +29 -0
  116. package/dist/connection/calendar/EventScheduling.d.ts +8 -0
  117. package/dist/connection/calendar/InvitationsPanel.d.ts +5 -0
  118. package/dist/connection/calendar/OpenAccessPanel.d.ts +7 -0
  119. package/dist/connection/calendar/PublishCalendarDialog.d.ts +8 -0
  120. package/dist/connection/calendar/RoomsDirectoryPanel.d.ts +8 -0
  121. package/dist/connection/calendar/ShareCalendarDialog.d.ts +6 -0
  122. package/dist/connection/calendar/copy.d.ts +2 -0
  123. package/dist/connection/calendar/index.d.ts +6 -0
  124. package/dist/connection/calendar/store.d.ts +47 -0
  125. package/dist/connection/calendar/types.d.ts +36 -0
  126. package/dist/connection/calendar/useWebinarAttendee.d.ts +3 -0
  127. package/dist/connection/notification-center/ConnectedNotificationCenter.d.ts +15 -0
  128. package/dist/connection/notification-center/NotificationCenter.d.ts +37 -0
  129. package/dist/connection/notification-center/NotificationEvent.d.ts +33 -0
  130. package/dist/connection/notification-center/index.d.ts +4 -0
  131. package/dist/connection/notification-center/items.d.ts +44 -0
  132. package/dist/facts/index.cjs +3 -3
  133. package/dist/facts/index.js +3 -3
  134. package/dist/files/index.cjs +3 -3
  135. package/dist/files/index.js +3 -3
  136. package/dist/home/index.cjs +2 -2
  137. package/dist/home/index.js +2 -2
  138. package/dist/index.cjs +685 -668
  139. package/dist/index.cjs.map +1 -1
  140. package/dist/index.js +20 -19
  141. package/dist/index.js.map +1 -1
  142. package/dist/retrieval/index.cjs +1 -1
  143. package/dist/retrieval/index.js +1 -1
  144. package/dist/settings/index.cjs +52 -66
  145. package/dist/settings/index.cjs.map +1 -1
  146. package/dist/settings/index.js +7 -24
  147. package/dist/settings/index.js.map +1 -1
  148. package/dist/shell/index.cjs +61 -60
  149. package/dist/shell/index.js +5 -4
  150. package/dist/site/index.cjs +5 -5
  151. package/dist/site/index.js +1 -1
  152. package/dist/studio/index.cjs +7 -7
  153. package/dist/studio/index.js +5 -5
  154. package/dist/workflow-canvas/index.cjs +26 -27
  155. package/dist/workflow-canvas/index.cjs.map +1 -1
  156. package/dist/workflow-canvas/index.js +9 -10
  157. package/dist/workflow-canvas/index.js.map +1 -1
  158. package/node_modules/@arbidocs/coedit/package.json +1 -1
  159. package/package.json +4 -4
  160. package/dist/chunk-2Q7FDZAY.js.map +0 -1
  161. package/dist/chunk-3BI6EWKP.cjs.map +0 -1
  162. package/dist/chunk-AAFX64WD.cjs.map +0 -1
  163. package/dist/chunk-CQCC7LE7.js +0 -210
  164. package/dist/chunk-CQCC7LE7.js.map +0 -1
  165. package/dist/chunk-KDUGTKVI.cjs.map +0 -1
  166. package/dist/chunk-KSHKTOY2.js.map +0 -1
  167. package/dist/chunk-L2PAPOZ5.js.map +0 -1
  168. package/dist/chunk-MJKBVIV3.cjs.map +0 -1
  169. package/dist/chunk-OGBXV326.cjs.map +0 -1
  170. package/dist/chunk-OQ7RUNOC.js.map +0 -1
  171. package/dist/chunk-RFIBUWLF.cjs +0 -232
  172. package/dist/chunk-RFIBUWLF.cjs.map +0 -1
  173. package/dist/chunk-RQ2Y7USX.cjs.map +0 -1
  174. package/dist/chunk-UBEI6WFJ.js.map +0 -1
  175. package/dist/chunk-W3VYZXNS.js.map +0 -1
  176. package/dist/chunk-WXYQ66KC.cjs.map +0 -1
  177. package/dist/chunk-XVME4XYD.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Event drafts and the write requests built from them.
3
+ *
4
+ * PATCH semantics on the server: only the fields sent change (`exclude_unset`), and for an occurrence of a
5
+ * series the request carries `recurrence_id` + `scope` (`this` = override, `following` = split, `all` =
6
+ * the series; a time change made from one occurrence moves the whole series by the same delta). So an
7
+ * edit sends exactly the fields that differ from what the editor opened with, and a drag sends the
8
+ * occurrence's new start/end in the event's own zone.
9
+ */
10
+ import type { CalendarEvent, CalendarSettings, EditScope, EventCreateBody, EventPatchBody, ScopedTarget } from '@arbidocs/react';
11
+ import type { EventDraft, EventTimeChange, SlotSelection } from './types';
12
+ /** A series occurrence needs the "this / following / all" choice before it is changed or deleted. */
13
+ export declare function needsScope(event: Pick<CalendarEvent, 'recurrence_id'>): boolean;
14
+ export declare function scopedTarget(event: Pick<CalendarEvent, 'id' | 'recurrence_id'>, scope: EditScope): ScopedTarget;
15
+ /** The editor's starting draft for an existing event (series fields from `master` when editing an occurrence). */
16
+ export declare function eventToDraft(event: CalendarEvent, master?: CalendarEvent | null): EventDraft;
17
+ /** A new event draft from a grid slot (or "now" rounded up), in the settings zone. */
18
+ export declare function newEventDraft(settings: Pick<CalendarSettings, 'time_zone' | 'default_duration_minutes'>, { slot, calendarId, now, }?: {
19
+ slot?: SlotSelection | null;
20
+ calendarId?: string | null;
21
+ now?: Date;
22
+ }): EventDraft;
23
+ /** The fields of `draft` that differ from `original` (a cleared field is sent as null). */
24
+ export declare function diffDraft(original: EventDraft, draft: EventDraft): EventPatchBody;
25
+ export interface EditRequest {
26
+ target: ScopedTarget;
27
+ /** PATCH body; empty when only the calendar changed. */
28
+ body: EventPatchBody;
29
+ /** Calendar to move the event to (POST /move), when the calendar selector changed. */
30
+ moveTo: string | null;
31
+ }
32
+ /** The scoped PATCH (and optional move) for saving the editor. */
33
+ export declare function buildEditRequest(event: CalendarEvent, original: EventDraft, draft: EventDraft, scope: EditScope): EditRequest;
34
+ /** POST /events body from a create draft. */
35
+ export declare function buildCreateBody(draft: EventDraft): EventCreateBody;
36
+ /** The scoped PATCH for a drag / resize on the grid. */
37
+ export declare function buildTimeChangeRequest(event: CalendarEvent, change: Pick<EventTimeChange, 'startUtc' | 'endUtc' | 'allDay' | 'startDate' | 'endDate'>, scope: EditScope, zone: string): {
38
+ target: ScopedTarget;
39
+ body: EventPatchBody;
40
+ };
41
+ /** The scoped DELETE target. */
42
+ export declare function buildDeleteTarget(event: CalendarEvent, scope: EditScope): ScopedTarget;
@@ -0,0 +1,6 @@
1
+ /** Default window: the next half hour, for one hour. */
2
+ export declare function defaultRoomWindow(zone: string, now?: Date): {
3
+ start: string;
4
+ end: string;
5
+ };
6
+ export declare function formatBusy(start: string, end: string, zone: string): string;
@@ -0,0 +1,4 @@
1
+ import type { CalendarSettings } from '@arbidocs/react';
2
+ import type { CalendarSettingsValue } from './types';
3
+ /** API settings → the settings form's value. */
4
+ export declare function toSettingsValue(s: CalendarSettings): CalendarSettingsValue;
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkDWZXSPMB_cjs = require('../chunk-DWZXSPMB.cjs');
4
+ var chunkZAVEMQ37_cjs = require('../chunk-ZAVEMQ37.cjs');
5
5
  var chunk7RGLTF76_cjs = require('../chunk-7RGLTF76.cjs');
6
+ require('../chunk-ULWRNGGE.cjs');
6
7
  var chunkMWDW5UBW_cjs = require('../chunk-MWDW5UBW.cjs');
7
8
  require('../chunk-PPCATBOY.cjs');
8
9
  require('../chunk-MHVNT4J3.cjs');
9
- require('../chunk-ULWRNGGE.cjs');
10
10
  var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
11
11
  require('../chunk-DES3K4SD.cjs');
12
12
  var react = require('react');
@@ -1986,7 +1986,7 @@ function WebinarEndConfirm({
1986
1986
  const { isPending, run } = usePending();
1987
1987
  const ending = isPending("end");
1988
1988
  return /* @__PURE__ */ jsxRuntime.jsx(
1989
- chunkDWZXSPMB_cjs.ConfirmDialog,
1989
+ chunkZAVEMQ37_cjs.ConfirmDialog,
1990
1990
  {
1991
1991
  isOpen: open,
1992
1992
  onClose: () => onOpenChange(false),
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { ConfirmDialog } from '../chunk-VHJHY7TT.js';
2
+ import { ConfirmDialog } from '../chunk-ECERC6TI.js';
3
3
  import { TabHeader } from '../chunk-4WWM3GQ5.js';
4
+ import '../chunk-TX2ZICS7.js';
4
5
  import { NOTICE_MS, gridSlots, gridLayout, spotlightBox, CAPTION_TTL_MS, CAPTION_LINES, speakerAccent, formatElapsed, initialsOf, SPEAKING_LEVEL, nextSpotlight, INITIAL_SPOTLIGHT } from '../chunk-Z3AZ7Q5X.js';
5
6
  export { CAPTION_LINES, CAPTION_TTL_MS, INITIAL_SPOTLIGHT, MAX_GRID_TILES, NOTICE_MS, SPEAKER_ACCENTS, SPEAKING_LEVEL, TILE_ASPECT, formatElapsed, gridLayout, gridSlots, initialsOf, nearestCorner, nextSpotlight, pickSpotlight, rowCounts, speakerAccent, speakerBorder, spotlightBox, stageContentHeight } from '../chunk-Z3AZ7Q5X.js';
6
7
  import '../chunk-NPLYHR2E.js';
7
8
  import '../chunk-7F6CBP3Z.js';
8
- import '../chunk-TX2ZICS7.js';
9
9
  import { fromNow } from '../chunk-OXF2IFXG.js';
10
10
  import '../chunk-VUNV25KB.js';
11
11
  import { forwardRef, useState, useRef, useMemo, useEffect, useSyncExternalStore, useCallback } from 'react';
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkKDUGTKVI_cjs = require('./chunk-KDUGTKVI.cjs');
4
+ var chunkGFNELPDP_cjs = require('./chunk-GFNELPDP.cjs');
5
5
  var chunk7YLJHTDC_cjs = require('./chunk-7YLJHTDC.cjs');
6
6
  var chunkJKB7WT7L_cjs = require('./chunk-JKB7WT7L.cjs');
7
7
  var react$1 = require('react');
@@ -9,7 +9,7 @@ var react = require('@arbidocs/react');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
 
11
11
  function useConnectedAiTask() {
12
- const { assistantConfig } = chunkKDUGTKVI_cjs.useConnection();
12
+ const { assistantConfig } = chunkGFNELPDP_cjs.useConnection();
13
13
  const task = react.useAiTask();
14
14
  const kitRun = task.run;
15
15
  const run = react$1.useCallback(
@@ -19,7 +19,7 @@ function useConnectedAiTask() {
19
19
  return { ...task, run };
20
20
  }
21
21
  function useWorkspaceDocs() {
22
- const { workspaceId, fallbackWorkspaceId } = chunkKDUGTKVI_cjs.useConnection();
22
+ const { workspaceId, fallbackWorkspaceId } = chunkGFNELPDP_cjs.useConnection();
23
23
  return react.useWorkspaceDocs(workspaceId ?? fallbackWorkspaceId);
24
24
  }
25
25
  function useSemanticSearch() {
@@ -27,7 +27,7 @@ function useSemanticSearch() {
27
27
  return react.useSemanticSearch(docIds);
28
28
  }
29
29
  function useConnectedChat(options) {
30
- const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } = chunkKDUGTKVI_cjs.useConnection();
30
+ const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } = chunkGFNELPDP_cjs.useConnection();
31
31
  const wsId = workspaceId ?? fallbackWorkspaceId;
32
32
  const { data: members = [] } = react.useWorkspaceUsers(wsId, {
33
33
  enabled: status === "authenticated" && !!wsId,
@@ -84,5 +84,5 @@ exports.useConnectedAiTask = useConnectedAiTask;
84
84
  exports.useConnectedChat = useConnectedChat;
85
85
  exports.useSemanticSearch = useSemanticSearch;
86
86
  exports.useWorkspaceDocs = useWorkspaceDocs;
87
- //# sourceMappingURL=chunk-IE5CUCZK.cjs.map
88
- //# sourceMappingURL=chunk-IE5CUCZK.cjs.map
87
+ //# sourceMappingURL=chunk-3BFGL2JL.cjs.map
88
+ //# sourceMappingURL=chunk-3BFGL2JL.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/ai.tsx"],"names":["useConnection","useKitAiTask","useCallback","useKitWorkspaceDocs","useKitSemanticSearch","useWorkspaceUsers","useArbiChat","takeOpenDocumentForTurn","jsx","AssistantDock"],"mappings":"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","file":"chunk-IE5CUCZK.cjs","sourcesContent":["/**\n * The connected agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the host's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n useArbiChat,\n useWorkspaceUsers,\n type ArbiChat,\n type UseArbiChatOptions,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport { AssistantDock, type AssistantDockProps } from '../chat/AssistantDock'\nimport type { MentionCandidate } from '../chat/mentions'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a host app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the host's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useConnectedAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n\n/**\n * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's\n * default assistant configuration are injected, so a host writes\n * `<ChatPage chat={useConnectedChat()} />`.\n */\nexport function useConnectedChat(\n options?: Omit<UseArbiChatOptions, 'workspaceId'>\n): ArbiChat & { mentionCandidates: MentionCandidate[] } {\n const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } =\n useConnection()\n const wsId = workspaceId ?? fallbackWorkspaceId\n const { data: members = [] } = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const mentionCandidates: MentionCandidate[] = [\n { id: 'assistant', kind: 'assistant', label: 'Assistant' },\n ...(status === 'authenticated' ? members : [])\n .filter(\n (member) =>\n !member.agent_ext_id &&\n member.user.external_id !== user?.externalId &&\n !member.user.external_id.startsWith('agt-')\n )\n .map((member) => ({\n id: member.user.external_id,\n kind: 'user' as const,\n label:\n [member.user.given_name, member.user.family_name].filter(Boolean).join(' ') ||\n member.user.email,\n description: member.user.email,\n }))\n .sort((a, b) => a.label.localeCompare(b.label)),\n ]\n const chat = useArbiChat({\n // Drafting mode: each question names the document open beside the chat.\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId: wsId }),\n ...options,\n workspaceId: wsId,\n model: options?.model ?? assistantConfig,\n })\n return {\n ...chat,\n mentionCandidates,\n messages: chat.messages.map((message) => ({\n ...message,\n ...(message.authorId\n ? {\n senderName:\n message.authorId === user?.externalId\n ? user?.name || user?.email\n : mentionCandidates.find((candidate) => candidate.id === message.authorId)?.label,\n }\n : {}),\n })),\n }\n}\n\n/**\n * The assistant dock bound to the connection: mount it once in the layout (`Shell.Root`'s `aside`)\n * and put `AssistantDockToggle` in the topbar. Chat state lives here, so it survives closing the dock.\n */\nexport function ConnectedAssistantDock(props: Omit<AssistantDockProps, 'chat'>) {\n const chat = useConnectedChat()\n return <AssistantDock {...props} chat={chat} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/ai.tsx"],"names":["useConnection","useKitAiTask","useCallback","useKitWorkspaceDocs","useKitSemanticSearch","useWorkspaceUsers","useArbiChat","takeOpenDocumentForTurn","jsx","AssistantDock"],"mappings":";;;;;;;;;AAiCO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIA,+BAAA,EAAc;AAC1C,EAAA,MAAM,OAAOC,eAAA,EAAa;AAC1B,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AACpB,EAAA,MAAM,GAAA,GAAMC,mBAAA;AAAA,IACV,CAAC,QAAA,EAAkB,MAAA,EAAkB,IAAA,KACnC,OAAO,QAAA,EAAU,MAAA,EAAQ,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,iBAAiB,CAAA;AAAA,IAC7E,CAAC,QAAQ,eAAe;AAAA,GAC1B;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAA,EAAI;AACxB;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAIF,+BAAA,EAAc;AAC3D,EAAA,OAAOG,sBAAA,CAAoB,eAAe,mBAAmB,CAAA;AAC/D;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AACpC,EAAA,OAAOC,wBAAqB,MAAM,CAAA;AACpC;AAOO,SAAS,iBACd,OAAA,EACsD;AACtD,EAAA,MAAM,EAAE,aAAa,mBAAA,EAAqB,eAAA,EAAiB,MAAM,MAAA,EAAQ,mBAAA,KACvEJ,+BAAA,EAAc;AAChB,EAAA,MAAM,OAAO,WAAA,IAAe,mBAAA;AAC5B,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,GAAU,EAAC,EAAE,GAAIK,wBAAkB,IAAA,EAAM;AAAA,IACrD,OAAA,EAAS,MAAA,KAAW,eAAA,IAAmB,CAAC,CAAC,IAAA;AAAA,IACzC,WAAA,EAAa;AAAA,GACd,CAAA;AACD,EAAA,MAAM,iBAAA,GAAwC;AAAA,IAC5C,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,IACzD,GAAA,CAAI,MAAA,KAAW,eAAA,GAAkB,OAAA,GAAU,EAAC,EACzC,MAAA;AAAA,MACC,CAAC,MAAA,KACC,CAAC,MAAA,CAAO,gBACR,MAAA,CAAO,IAAA,CAAK,WAAA,KAAgB,IAAA,EAAM,cAClC,CAAC,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,WAAW,MAAM;AAAA,KAC9C,CACC,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAChB,EAAA,EAAI,OAAO,IAAA,CAAK,WAAA;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,OACE,CAAC,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAC1E,OAAO,IAAA,CAAK,KAAA;AAAA,MACd,WAAA,EAAa,OAAO,IAAA,CAAK;AAAA,KAC3B,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAC;AAAA,GAClD;AACA,EAAA,MAAM,OAAOC,iBAAA,CAAY;AAAA;AAAA,IAEvB,gBAAgB,MAAMC,yCAAA,CAAwB,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,IACnE,GAAG,OAAA;AAAA,IACH,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,SAAS,KAAA,IAAS;AAAA,GAC1B,CAAA;AACD,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,iBAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACxC,GAAG,OAAA;AAAA,MACH,GAAI,QAAQ,QAAA,GACR;AAAA,QACE,YACE,OAAA,CAAQ,QAAA,KAAa,IAAA,EAAM,UAAA,GACvB,MAAM,IAAA,IAAQ,IAAA,EAAM,KAAA,GACpB,iBAAA,CAAkB,KAAK,CAAC,SAAA,KAAc,UAAU,EAAA,KAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAAA,UAElF;AAAC,KACP,CAAE;AAAA,GACJ;AACF;AAMO,SAAS,uBAAuB,KAAA,EAAyC;AAC9E,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAC9B,EAAA,uBAAOC,cAAA,CAACC,+BAAA,EAAA,EAAe,GAAG,KAAA,EAAO,IAAA,EAAY,CAAA;AAC/C","file":"chunk-3BFGL2JL.cjs","sourcesContent":["/**\n * The connected agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the host's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n useArbiChat,\n useWorkspaceUsers,\n type ArbiChat,\n type UseArbiChatOptions,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport { AssistantDock, type AssistantDockProps } from '../chat/AssistantDock'\nimport type { MentionCandidate } from '../chat/mentions'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a host app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the host's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useConnectedAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n\n/**\n * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's\n * default assistant configuration are injected, so a host writes\n * `<ChatPage chat={useConnectedChat()} />`.\n */\nexport function useConnectedChat(\n options?: Omit<UseArbiChatOptions, 'workspaceId'>\n): ArbiChat & { mentionCandidates: MentionCandidate[] } {\n const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } =\n useConnection()\n const wsId = workspaceId ?? fallbackWorkspaceId\n const { data: members = [] } = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const mentionCandidates: MentionCandidate[] = [\n { id: 'assistant', kind: 'assistant', label: 'Assistant' },\n ...(status === 'authenticated' ? members : [])\n .filter(\n (member) =>\n !member.agent_ext_id &&\n member.user.external_id !== user?.externalId &&\n !member.user.external_id.startsWith('agt-')\n )\n .map((member) => ({\n id: member.user.external_id,\n kind: 'user' as const,\n label:\n [member.user.given_name, member.user.family_name].filter(Boolean).join(' ') ||\n member.user.email,\n description: member.user.email,\n }))\n .sort((a, b) => a.label.localeCompare(b.label)),\n ]\n const chat = useArbiChat({\n // Drafting mode: each question names the document open beside the chat.\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId: wsId }),\n ...options,\n workspaceId: wsId,\n model: options?.model ?? assistantConfig,\n })\n return {\n ...chat,\n mentionCandidates,\n messages: chat.messages.map((message) => ({\n ...message,\n ...(message.authorId\n ? {\n senderName:\n message.authorId === user?.externalId\n ? user?.name || user?.email\n : mentionCandidates.find((candidate) => candidate.id === message.authorId)?.label,\n }\n : {}),\n })),\n }\n}\n\n/**\n * The assistant dock bound to the connection: mount it once in the layout (`Shell.Root`'s `aside`)\n * and put `AssistantDockToggle` in the topbar. Chat state lives here, so it survives closing the dock.\n */\nexport function ConnectedAssistantDock(props: Omit<AssistantDockProps, 'chat'>) {\n const chat = useConnectedChat()\n return <AssistantDock {...props} chat={chat} />\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useConnectedWorkspace } from './chunk-L2PAPOZ5.js';
2
+ import { useConnectedWorkspace } from './chunk-US3S4DCB.js';
3
3
  import { createContext, useMemo, useContext } from 'react';
4
4
  import { useDocuments, useTags, useConversations } from '@arbidocs/react';
5
5
  import { jsx } from 'react/jsx-runtime';
@@ -47,5 +47,5 @@ function useConnectedConversations(options) {
47
47
  }
48
48
 
49
49
  export { ConnectedWorkspaceDataProvider, useConnectedConversations, useConnectedDocuments, useConnectedTags };
50
- //# sourceMappingURL=chunk-2KUCVSFF.js.map
51
- //# sourceMappingURL=chunk-2KUCVSFF.js.map
50
+ //# sourceMappingURL=chunk-45LRMW54.js.map
51
+ //# sourceMappingURL=chunk-45LRMW54.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/workspaceData.tsx"],"names":[],"mappings":";;;;;AA+BA,IAAM,oBAAA,GAAuB,aAAA,CAAsC,EAAE,CAAA;AAE9D,SAAS,8BAAA,CAA+B;AAAA,EAC7C,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,aAAA,EAAc,CAAA;AAAA,IACxC,CAAC,SAAA,EAAW,IAAA,EAAM,aAAa;AAAA,GACjC;AACA,EAAA,uBAAO,GAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAe,QAAA,EAAS,CAAA;AAChE;AASA,IAAM,QAAiB,EAAC;AAExB,SAAS,OAAA,CACP,QACA,GAAA,EACwB;AACxB,EAAA,MAAM,SAAS,MAAA,IAAU,GAAA;AACzB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAS,KAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,GAAA,CAAI,OAAA;AAC9C,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,WAAW,OAAA,EAAQ,CAAA;AAAA,IACjD,CAAC,IAAA,EAAM,MAAA,CAAO,SAAA,EAAW,OAAO;AAAA,GAClC;AACF;AAGO,SAAS,qBAAA,GAAgE;AAC9E,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,SAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,aAAa,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,QAAQ,CAAA;AACvE,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B;AAGO,SAAS,gBAAA,GAAsD;AACpE,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,IAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,QAAQ,CAAA;AAClE,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B;AAMO,SAAS,0BAA0B,OAAA,EAEK;AAC7C,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,aAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AAChG,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B","file":"chunk-2KUCVSFF.js","sourcesContent":["/**\n * The open workspace's documents, tags and conversations for the connected kits. By default each kit reads them\n * through the `@arbidocs/react` hooks. A host that already keeps these lists live in its own cache\n * (the ARBI app, with its progressive loader and WebSocket patches) passes them once through\n * `ConnectedWorkspaceDataProvider`, so the kits show the same list and nothing is fetched twice.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useConversations, useDocuments, useTags } from '@arbidocs/react'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport type ConnectedDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\nexport type ConnectedTag = NonNullable<ReturnType<typeof useTags>['data']>[number]\nexport type ConnectedConversation = NonNullable<ReturnType<typeof useConversations>['data']>[number]\n\n/**\n * A list the host keeps: its rows, whether it has arrived, and how to read it again (absent: the\n * host keeps it current itself, so a kit never re-reads it).\n */\nexport interface ConnectedList<T> {\n data: T[] | undefined\n isFetched: boolean\n refetch?: () => unknown\n}\n\nexport interface ConnectedWorkspaceData {\n documents?: ConnectedList<ConnectedDocument>\n tags?: ConnectedList<ConnectedTag>\n conversations?: ConnectedList<ConnectedConversation>\n}\n\nconst WorkspaceDataContext = createContext<ConnectedWorkspaceData>({})\n\nexport function ConnectedWorkspaceDataProvider({\n documents,\n tags,\n conversations,\n children,\n}: ConnectedWorkspaceData & { children: ReactNode }) {\n const value = useMemo(\n () => ({ documents, tags, conversations }),\n [documents, tags, conversations]\n )\n return <WorkspaceDataContext.Provider value={value}>{children}</WorkspaceDataContext.Provider>\n}\n\nexport interface ConnectedListResult<T> {\n data: T[]\n loaded: boolean\n /** Read the list again after a change made here; absent when the host keeps it current. */\n refetch?: () => unknown\n}\n\nconst EMPTY: never[] = []\n\nfunction useList<T>(\n hosted: ConnectedList<T> | undefined,\n own: { data?: T[]; isFetched: boolean; refetch: () => unknown }\n): ConnectedListResult<T> {\n const source = hosted ?? own\n const data = source.data ?? (EMPTY as T[])\n const refetch = hosted ? hosted.refetch : own.refetch\n return useMemo(\n () => ({ data, loaded: source.isFetched, refetch }),\n [data, source.isFetched, refetch]\n )\n}\n\n/** The open workspace's documents: the host's list when it gives one, else read here. */\nexport function useConnectedDocuments(): ConnectedListResult<ConnectedDocument> {\n const hosted = useContext(WorkspaceDataContext).documents\n const { workspaceId } = useConnectedWorkspace()\n const own = useDocuments(workspaceId ?? undefined, { enabled: !hosted })\n return useList(hosted, own)\n}\n\n/** The open workspace's tags: the host's list when it gives one, else read here. */\nexport function useConnectedTags(): ConnectedListResult<ConnectedTag> {\n const hosted = useContext(WorkspaceDataContext).tags\n const { workspaceId } = useConnectedWorkspace()\n const own = useTags(workspaceId ?? undefined, { enabled: !hosted })\n return useList(hosted, own)\n}\n\n/**\n * The open workspace's conversations (threads and tasks): the host's list when it gives one, else\n * read here (`live`: re-read while shown, as a run moves on by itself).\n */\nexport function useConnectedConversations(options?: {\n live?: boolean\n}): ConnectedListResult<ConnectedConversation> {\n const hosted = useContext(WorkspaceDataContext).conversations\n const { workspaceId } = useConnectedWorkspace()\n const own = useConversations(workspaceId ?? undefined, { enabled: !hosted, live: options?.live })\n return useList(hosted, own)\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/workspaceData.tsx"],"names":[],"mappings":";;;;;AA+BA,IAAM,oBAAA,GAAuB,aAAA,CAAsC,EAAE,CAAA;AAE9D,SAAS,8BAAA,CAA+B;AAAA,EAC7C,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,aAAA,EAAc,CAAA;AAAA,IACxC,CAAC,SAAA,EAAW,IAAA,EAAM,aAAa;AAAA,GACjC;AACA,EAAA,uBAAO,GAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAe,QAAA,EAAS,CAAA;AAChE;AASA,IAAM,QAAiB,EAAC;AAExB,SAAS,OAAA,CACP,QACA,GAAA,EACwB;AACxB,EAAA,MAAM,SAAS,MAAA,IAAU,GAAA;AACzB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAS,KAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,GAAA,CAAI,OAAA;AAC9C,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,WAAW,OAAA,EAAQ,CAAA;AAAA,IACjD,CAAC,IAAA,EAAM,MAAA,CAAO,SAAA,EAAW,OAAO;AAAA,GAClC;AACF;AAGO,SAAS,qBAAA,GAAgE;AAC9E,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,SAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,aAAa,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,QAAQ,CAAA;AACvE,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B;AAGO,SAAS,gBAAA,GAAsD;AACpE,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,IAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,QAAQ,CAAA;AAClE,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B;AAMO,SAAS,0BAA0B,OAAA,EAEK;AAC7C,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,oBAAoB,CAAA,CAAE,aAAA;AAChD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,qBAAA,EAAsB;AAC9C,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,WAAA,IAAe,MAAA,EAAW,EAAE,OAAA,EAAS,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AAChG,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC5B","file":"chunk-45LRMW54.js","sourcesContent":["/**\n * The open workspace's documents, tags and conversations for the connected kits. By default each kit reads them\n * through the `@arbidocs/react` hooks. A host that already keeps these lists live in its own cache\n * (the ARBI app, with its progressive loader and WebSocket patches) passes them once through\n * `ConnectedWorkspaceDataProvider`, so the kits show the same list and nothing is fetched twice.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useConversations, useDocuments, useTags } from '@arbidocs/react'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport type ConnectedDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\nexport type ConnectedTag = NonNullable<ReturnType<typeof useTags>['data']>[number]\nexport type ConnectedConversation = NonNullable<ReturnType<typeof useConversations>['data']>[number]\n\n/**\n * A list the host keeps: its rows, whether it has arrived, and how to read it again (absent: the\n * host keeps it current itself, so a kit never re-reads it).\n */\nexport interface ConnectedList<T> {\n data: T[] | undefined\n isFetched: boolean\n refetch?: () => unknown\n}\n\nexport interface ConnectedWorkspaceData {\n documents?: ConnectedList<ConnectedDocument>\n tags?: ConnectedList<ConnectedTag>\n conversations?: ConnectedList<ConnectedConversation>\n}\n\nconst WorkspaceDataContext = createContext<ConnectedWorkspaceData>({})\n\nexport function ConnectedWorkspaceDataProvider({\n documents,\n tags,\n conversations,\n children,\n}: ConnectedWorkspaceData & { children: ReactNode }) {\n const value = useMemo(\n () => ({ documents, tags, conversations }),\n [documents, tags, conversations]\n )\n return <WorkspaceDataContext.Provider value={value}>{children}</WorkspaceDataContext.Provider>\n}\n\nexport interface ConnectedListResult<T> {\n data: T[]\n loaded: boolean\n /** Read the list again after a change made here; absent when the host keeps it current. */\n refetch?: () => unknown\n}\n\nconst EMPTY: never[] = []\n\nfunction useList<T>(\n hosted: ConnectedList<T> | undefined,\n own: { data?: T[]; isFetched: boolean; refetch: () => unknown }\n): ConnectedListResult<T> {\n const source = hosted ?? own\n const data = source.data ?? (EMPTY as T[])\n const refetch = hosted ? hosted.refetch : own.refetch\n return useMemo(\n () => ({ data, loaded: source.isFetched, refetch }),\n [data, source.isFetched, refetch]\n )\n}\n\n/** The open workspace's documents: the host's list when it gives one, else read here. */\nexport function useConnectedDocuments(): ConnectedListResult<ConnectedDocument> {\n const hosted = useContext(WorkspaceDataContext).documents\n const { workspaceId } = useConnectedWorkspace()\n const own = useDocuments(workspaceId ?? undefined, { enabled: !hosted })\n return useList(hosted, own)\n}\n\n/** The open workspace's tags: the host's list when it gives one, else read here. */\nexport function useConnectedTags(): ConnectedListResult<ConnectedTag> {\n const hosted = useContext(WorkspaceDataContext).tags\n const { workspaceId } = useConnectedWorkspace()\n const own = useTags(workspaceId ?? undefined, { enabled: !hosted })\n return useList(hosted, own)\n}\n\n/**\n * The open workspace's conversations (threads and tasks): the host's list when it gives one, else\n * read here (`live`: re-read while shown, as a run moves on by itself).\n */\nexport function useConnectedConversations(options?: {\n live?: boolean\n}): ConnectedListResult<ConnectedConversation> {\n const hosted = useContext(WorkspaceDataContext).conversations\n const { workspaceId } = useConnectedWorkspace()\n const own = useConversations(workspaceId ?? undefined, { enabled: !hosted, live: options?.live })\n return useList(hosted, own)\n}\n"]}
@@ -0,0 +1,177 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkC4WSHRR6_cjs = require('./chunk-C4WSHRR6.cjs');
5
+ var react = require('react');
6
+ var ui = require('@arbidocs/react/ui');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ var DEFAULT_QUIET_MARK_LABELS = {
10
+ openLink: "Open link",
11
+ copyLink: "Copy link",
12
+ linkCopied: "Link copied",
13
+ copyFailed: "Could not copy",
14
+ jumpHere: "Jump to here",
15
+ copyPlaceLink: "Copy link to this place",
16
+ openDocument: "Open document",
17
+ linkMenu: "Link actions",
18
+ bookmarkMenu: "Bookmark actions"
19
+ };
20
+ function useCopyText(labels) {
21
+ const { notify } = chunkC4WSHRR6_cjs.useBlocksEnvironment();
22
+ const done = labels?.linkCopied ?? DEFAULT_QUIET_MARK_LABELS.linkCopied;
23
+ const failed = labels?.copyFailed ?? DEFAULT_QUIET_MARK_LABELS.copyFailed;
24
+ return react.useCallback(
25
+ async (text, message) => {
26
+ try {
27
+ await navigator.clipboard.writeText(text);
28
+ notify(message ?? done, "success");
29
+ return true;
30
+ } catch {
31
+ notify(failed, "error");
32
+ return false;
33
+ }
34
+ },
35
+ [notify, done, failed]
36
+ );
37
+ }
38
+ var LINK_STYLE = {
39
+ external: "text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary",
40
+ document: "text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary",
41
+ // A bookmark is nearly invisible until hovered or focused.
42
+ anchor: "text-inherit underline decoration-dotted decoration-1 decoration-foreground/25 underline-offset-[3px] transition-colors hover:decoration-foreground/70 focus-visible:decoration-foreground/70"
43
+ };
44
+ function scrollToHash(href) {
45
+ const id = href?.startsWith("#") ? decodeURIComponent(href.slice(1)) : "";
46
+ document.getElementById(id)?.scrollIntoView({ behavior: "smooth", block: "start" });
47
+ }
48
+ function QuietLink({
49
+ href,
50
+ kind = "external",
51
+ onOpen,
52
+ placeLink,
53
+ labels,
54
+ className,
55
+ testId,
56
+ children
57
+ }) {
58
+ const l = { ...DEFAULT_QUIET_MARK_LABELS, ...labels };
59
+ const copy = useCopyText(l);
60
+ const open = onOpen ?? (kind === "anchor" ? () => scrollToHash(href) : () => {
61
+ if (href) window.open(href, "_blank", "noopener,noreferrer");
62
+ });
63
+ const copyTarget = kind === "anchor" ? placeLink ?? `${window.location.href.split("#")[0]}${href ?? ""}` : placeLink ?? href ?? "";
64
+ const items = [
65
+ {
66
+ id: "open",
67
+ label: kind === "anchor" ? l.jumpHere : kind === "document" ? l.openDocument : l.openLink,
68
+ primary: true,
69
+ onSelect: open,
70
+ testId: "mark-open"
71
+ },
72
+ {
73
+ id: "copy",
74
+ label: kind === "anchor" ? l.copyPlaceLink : l.copyLink,
75
+ onSelect: () => void copy(copyTarget),
76
+ testId: "mark-copy"
77
+ }
78
+ ];
79
+ return /* @__PURE__ */ jsxRuntime.jsx(
80
+ ui.MarkMenu,
81
+ {
82
+ as: "a",
83
+ href,
84
+ items,
85
+ menuLabel: kind === "anchor" ? l.bookmarkMenu : l.linkMenu,
86
+ preview: kind === "external" && href ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block break-all text-xs text-muted-foreground", children: href }) : void 0,
87
+ className: ui.cn(LINK_STYLE[kind], "cursor-pointer", className),
88
+ testId,
89
+ "data-mark-kind": kind,
90
+ children
91
+ }
92
+ );
93
+ }
94
+ function PassageMark({ label, menuLabel, items, className, testId }) {
95
+ return /* @__PURE__ */ jsxRuntime.jsx(
96
+ ui.MarkMenu,
97
+ {
98
+ items,
99
+ menuLabel,
100
+ testId,
101
+ "data-mark-kind": "passage",
102
+ className: ui.cn(
103
+ "touch-hit cursor-pointer select-none rounded-sm px-1 text-xs tabular-nums text-muted-foreground/80 transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-2",
104
+ className
105
+ ),
106
+ children: label
107
+ }
108
+ );
109
+ }
110
+ function LabelMark({
111
+ colors,
112
+ menuLabel,
113
+ preview,
114
+ items,
115
+ name,
116
+ className,
117
+ testId
118
+ }) {
119
+ return /* @__PURE__ */ jsxRuntime.jsx(
120
+ ui.MarkMenu,
121
+ {
122
+ items,
123
+ preview,
124
+ menuLabel,
125
+ testId,
126
+ "aria-label": name,
127
+ "data-mark-kind": "label",
128
+ className: ui.cn(
129
+ "flex cursor-pointer flex-col gap-1 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-1",
130
+ className
131
+ ),
132
+ children: colors.slice(0, 4).map((c, i) => /* @__PURE__ */ jsxRuntime.jsx(
133
+ "span",
134
+ {
135
+ "aria-hidden": "true",
136
+ className: "h-2.5 w-1 rounded-full",
137
+ style: { backgroundColor: c }
138
+ },
139
+ i
140
+ ))
141
+ }
142
+ );
143
+ }
144
+ function NoteMark({
145
+ label,
146
+ title,
147
+ menuLabel = "Note actions",
148
+ items = [],
149
+ className,
150
+ testId
151
+ }) {
152
+ return /* @__PURE__ */ jsxRuntime.jsx(
153
+ ui.MarkMenu,
154
+ {
155
+ items,
156
+ preview: title ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: title }) : void 0,
157
+ menuLabel,
158
+ testId,
159
+ "data-slot": "note-mark",
160
+ "data-mark-kind": "note",
161
+ className: ui.cn(
162
+ "cursor-default select-none rounded-sm px-1 text-xs font-medium tabular-nums text-foreground/80 underline decoration-yellow-400 decoration-2 underline-offset-[3px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
163
+ className
164
+ ),
165
+ children: label
166
+ }
167
+ );
168
+ }
169
+
170
+ exports.DEFAULT_QUIET_MARK_LABELS = DEFAULT_QUIET_MARK_LABELS;
171
+ exports.LabelMark = LabelMark;
172
+ exports.NoteMark = NoteMark;
173
+ exports.PassageMark = PassageMark;
174
+ exports.QuietLink = QuietLink;
175
+ exports.useCopyText = useCopyText;
176
+ //# sourceMappingURL=chunk-5FTIHRZH.cjs.map
177
+ //# sourceMappingURL=chunk-5FTIHRZH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/citations/QuietMarks.tsx"],"names":["useBlocksEnvironment","useCallback","jsx","MarkMenu","cn"],"mappings":"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","file":"chunk-5FTIHRZH.cjs","sourcesContent":["import { useCallback, type ReactNode } from 'react'\nimport { MarkMenu, cn, type MarkMenuItem } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/**\n * Quiet inline marks: links, bookmarks, passage references, label and note marks.\n *\n * Each is typographically distinct TEXT (no pill, no button chrome, no icon in the flow) and owns\n * exactly one contextual menu through the shared `MarkMenu`. Domain-neutral: hosts supply the\n * handlers that make a row mean something.\n */\n\n/** Every fixed string of the quiet marks. */\nexport interface QuietMarkLabels {\n openLink: string\n copyLink: string\n linkCopied: string\n copyFailed: string\n jumpHere: string\n copyPlaceLink: string\n openDocument: string\n linkMenu: string\n bookmarkMenu: string\n}\n\nexport const DEFAULT_QUIET_MARK_LABELS: QuietMarkLabels = {\n openLink: 'Open link',\n copyLink: 'Copy link',\n linkCopied: 'Link copied',\n copyFailed: 'Could not copy',\n jumpHere: 'Jump to here',\n copyPlaceLink: 'Copy link to this place',\n openDocument: 'Open document',\n linkMenu: 'Link actions',\n bookmarkMenu: 'Bookmark actions',\n}\n\n/**\n * Copy text to the clipboard and say so (or say it failed) through the host's `notify`. Resolves\n * whether it was copied.\n */\nexport function useCopyText(labels?: Partial<Pick<QuietMarkLabels, 'linkCopied' | 'copyFailed'>>) {\n const { notify } = useBlocksEnvironment()\n const done = labels?.linkCopied ?? DEFAULT_QUIET_MARK_LABELS.linkCopied\n const failed = labels?.copyFailed ?? DEFAULT_QUIET_MARK_LABELS.copyFailed\n return useCallback(\n async (text: string, message?: string): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text)\n notify(message ?? done, 'success')\n return true\n } catch {\n notify(failed, 'error')\n return false\n }\n },\n [notify, done, failed]\n )\n}\n\nexport type QuietLinkKind = 'external' | 'anchor' | 'document'\n\nexport interface QuietLinkProps {\n href?: string\n /** `external` (default) opens elsewhere, `anchor` jumps within the page, `document` is an in-app target. */\n kind?: QuietLinkKind\n /** The primary action. Defaults: external opens a new tab, anchor scrolls to the id. */\n onOpen?: () => void\n /** Absolute URL a copied anchor should carry; defaults to the current page plus the hash. */\n placeLink?: string\n labels?: Partial<QuietMarkLabels>\n className?: string\n testId?: string\n children: ReactNode\n}\n\nconst LINK_STYLE: Record<QuietLinkKind, string> = {\n external:\n 'text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary',\n document:\n 'text-primary underline decoration-primary/40 decoration-1 underline-offset-[3px] transition-colors hover:decoration-primary focus-visible:decoration-primary',\n // A bookmark is nearly invisible until hovered or focused.\n anchor:\n 'text-inherit underline decoration-dotted decoration-1 decoration-foreground/25 underline-offset-[3px] transition-colors hover:decoration-foreground/70 focus-visible:decoration-foreground/70',\n}\n\nfunction scrollToHash(href: string | undefined) {\n const id = href?.startsWith('#') ? decodeURIComponent(href.slice(1)) : ''\n document.getElementById(id)?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n}\n\n/** A hyperlink, bookmark or document link as quiet text with one menu (open / copy). */\nexport function QuietLink({\n href,\n kind = 'external',\n onOpen,\n placeLink,\n labels,\n className,\n testId,\n children,\n}: QuietLinkProps) {\n const l = { ...DEFAULT_QUIET_MARK_LABELS, ...labels }\n const copy = useCopyText(l)\n\n const open =\n onOpen ??\n (kind === 'anchor'\n ? () => scrollToHash(href)\n : () => {\n if (href) window.open(href, '_blank', 'noopener,noreferrer')\n })\n const copyTarget =\n kind === 'anchor'\n ? (placeLink ?? `${window.location.href.split('#')[0]}${href ?? ''}`)\n : (placeLink ?? href ?? '')\n\n const items: MarkMenuItem[] = [\n {\n id: 'open',\n label: kind === 'anchor' ? l.jumpHere : kind === 'document' ? l.openDocument : l.openLink,\n primary: true,\n onSelect: open,\n testId: 'mark-open',\n },\n {\n id: 'copy',\n label: kind === 'anchor' ? l.copyPlaceLink : l.copyLink,\n onSelect: () => void copy(copyTarget),\n testId: 'mark-copy',\n },\n ]\n\n return (\n <MarkMenu\n as=\"a\"\n href={href}\n items={items}\n menuLabel={kind === 'anchor' ? l.bookmarkMenu : l.linkMenu}\n preview={\n kind === 'external' && href ? (\n <span className=\"block break-all text-xs text-muted-foreground\">{href}</span>\n ) : undefined\n }\n className={cn(LINK_STYLE[kind], 'cursor-pointer', className)}\n testId={testId}\n data-mark-kind={kind}\n >\n {children}\n </MarkMenu>\n )\n}\n\nexport interface PassageMarkProps {\n /** The reference as plain text, e.g. \"¶4\" or \"¶4–9 · p.1\". */\n label: string\n menuLabel: string\n /** Menu rows: copy, link, label, open in navigator. */\n items: MarkMenuItem[]\n className?: string\n testId?: string\n}\n\n/** A passage's reference as a faint text mark in the margin; its menu carries the passage actions. */\nexport function PassageMark({ label, menuLabel, items, className, testId }: PassageMarkProps) {\n return (\n <MarkMenu\n items={items}\n menuLabel={menuLabel}\n testId={testId}\n data-mark-kind=\"passage\"\n className={cn(\n 'touch-hit cursor-pointer select-none rounded-sm px-1 text-xs tabular-nums text-muted-foreground/80 transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-2',\n className\n )}\n >\n {label}\n </MarkMenu>\n )\n}\n\nexport interface LabelMarkProps {\n /** Colours of every label marking the passage. */\n colors: string[]\n menuLabel: string\n /** Names of the labels, shown in the menu. */\n preview?: ReactNode\n items: MarkMenuItem[]\n /** Accessible name of the stripes. */\n name: string\n className?: string\n testId?: string\n}\n\n/** The labels on a passage as thin margin stripes (not a chip); the menu shows / removes them. */\nexport function LabelMark({\n colors,\n menuLabel,\n preview,\n items,\n name,\n className,\n testId,\n}: LabelMarkProps) {\n return (\n <MarkMenu\n items={items}\n preview={preview}\n menuLabel={menuLabel}\n testId={testId}\n aria-label={name}\n data-mark-kind=\"label\"\n className={cn(\n 'flex cursor-pointer flex-col gap-1 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:px-2 pointer-coarse:py-1',\n className\n )}\n >\n {colors.slice(0, 4).map((c, i) => (\n <span\n key={i}\n aria-hidden=\"true\"\n className=\"h-2.5 w-1 rounded-full\"\n style={{ backgroundColor: c }}\n />\n ))}\n </MarkMenu>\n )\n}\n\nexport interface NoteMarkProps {\n /** Short label, e.g. the passage range this run covers (\"¶4–9\"). */\n label: string\n /** Full note text, shown as the menu preview so the mark is self-explaining. */\n title?: string\n menuLabel?: string\n /** Rows such as \"Show note\" and \"Edit\". With none, the menu is a read-only preview. */\n items?: MarkMenuItem[]\n className?: string\n testId?: string\n}\n\n/**\n * Marks a passage as cited by a Note: small text with a soft yellow underline, drawn once on\n * each CONTIGUOUS run of cited passages (a run is one citation).\n */\nexport function NoteMark({\n label,\n title,\n menuLabel = 'Note actions',\n items = [],\n className,\n testId,\n}: NoteMarkProps) {\n return (\n <MarkMenu\n items={items}\n preview={\n title ? <span className=\"block text-xs text-muted-foreground\">{title}</span> : undefined\n }\n menuLabel={menuLabel}\n testId={testId}\n data-slot=\"note-mark\"\n data-mark-kind=\"note\"\n className={cn(\n 'cursor-default select-none rounded-sm px-1 text-xs font-medium tabular-nums text-foreground/80 underline decoration-yellow-400 decoration-2 underline-offset-[3px] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n className\n )}\n >\n {label}\n </MarkMenu>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { RoleBadge } from './chunk-NBV56SGU.js';
3
- import { testIdOr } from './chunk-7F6CBP3Z.js';
4
3
  import { ModalSection, ModalSectionTitle } from './chunk-TX2ZICS7.js';
4
+ import { testIdOr } from './chunk-7F6CBP3Z.js';
5
5
  import { Clock, UserMinus, Trash2, Gift, AtSign, Contact, Mail, Phone, MoreHorizontal, Download, UserPlus, MoreVertical, Plus, KeyRound, Loader2, BellOff, Bell, X, ChevronsUpDown, AlertCircle, XCircle, CheckCircle, ChevronDown, ChevronRight } from 'lucide-react';
6
6
  import { cn, Tooltip, TooltipTrigger, Select, SelectTrigger, SelectContent, SelectItem, TooltipContent, SelectValue, Button, Textarea, Avatar, AvatarImage, AvatarFallback, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, ScrollArea, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, Checkbox } from '@arbidocs/react/ui';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -973,5 +973,5 @@ function MailFolderTree({
973
973
  }
974
974
 
975
975
  export { ActionMenu, AddContactsForm, AddContactsResults, ContactCard, DEFAULT_ADD_CONTACTS_LABELS, DEFAULT_CONTACT_CARD_LABELS, DEFAULT_CONTACT_OUTCOME_LABELS, DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS, DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS, DEFAULT_DM_INVITE_CHIP_LABELS, DEFAULT_DM_THREAD_FRAME_LABELS, DEFAULT_MAIL_FOLDER_TREE_LABELS, DEFAULT_RECIPIENT_PICKER_LABELS, DmAccessRequestBanner, DmGrantAccessDialogView, DmInviteAvatar, DmInviteChip, DmNewTabIcon, DmThreadFrame, DmThreadHeader, MAX_INVITE_EMAILS, MailFolderTree, MemberBulkActions, MemberListLoading, MemberMutedText, MemberNameCell, MemberRoleCell, RecipientPicker, RoleSelect, WorkspaceDeleteButton, buildMailFolderTree, contactToVCard, descendantFolderIds, downloadVCard, isInboxFolder, parseEmails, toAddContactsRow, toAddContactsRows, toggleMailFolder, vCardFilename };
976
- //# sourceMappingURL=chunk-FUTMU4FR.js.map
977
- //# sourceMappingURL=chunk-FUTMU4FR.js.map
976
+ //# sourceMappingURL=chunk-5HFPRI3W.js.map
977
+ //# sourceMappingURL=chunk-5HFPRI3W.js.map