@arbidocs/blocks 0.4.144 → 0.4.145

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 (146) hide show
  1. package/dist/agents/index.cjs +267 -267
  2. package/dist/agents/index.js +10 -10
  3. package/dist/chat/index.cjs +1 -1
  4. package/dist/chat/index.js +1 -1
  5. package/dist/{chunk-BUWBXJ2N.cjs → chunk-34GDGE77.cjs} +5 -5
  6. package/dist/{chunk-BUWBXJ2N.cjs.map → chunk-34GDGE77.cjs.map} +1 -1
  7. package/dist/{chunk-ON3TKY5Y.js → chunk-5YHEHEJT.js} +242 -4
  8. package/dist/chunk-5YHEHEJT.js.map +1 -0
  9. package/dist/{chunk-YFY3TQ6Q.cjs → chunk-COCGRJLA.cjs} +7 -7
  10. package/dist/{chunk-YFY3TQ6Q.cjs.map → chunk-COCGRJLA.cjs.map} +1 -1
  11. package/dist/{chunk-45LRMW54.js → chunk-DN2KI4BU.js} +8 -10
  12. package/dist/chunk-DN2KI4BU.js.map +1 -0
  13. package/dist/{chunk-R26BK7YL.cjs → chunk-DTROMMDX.cjs} +4 -4
  14. package/dist/{chunk-R26BK7YL.cjs.map → chunk-DTROMMDX.cjs.map} +1 -1
  15. package/dist/{chunk-65THHQVB.cjs → chunk-ECW2R2KF.cjs} +27 -27
  16. package/dist/{chunk-65THHQVB.cjs.map → chunk-ECW2R2KF.cjs.map} +1 -1
  17. package/dist/{chunk-RI6DZA5X.js → chunk-EF4ZLKRM.js} +3 -3
  18. package/dist/{chunk-RI6DZA5X.js.map → chunk-EF4ZLKRM.js.map} +1 -1
  19. package/dist/{chunk-WS5EX7DN.cjs → chunk-EYKISBDO.cjs} +5 -5
  20. package/dist/{chunk-WS5EX7DN.cjs.map → chunk-EYKISBDO.cjs.map} +1 -1
  21. package/dist/{chunk-JZNXRMLH.cjs → chunk-GAYMJWTC.cjs} +8 -10
  22. package/dist/chunk-GAYMJWTC.cjs.map +1 -0
  23. package/dist/{chunk-I7WG3JRD.js → chunk-H4D7WKDY.js} +3 -3
  24. package/dist/{chunk-I7WG3JRD.js.map → chunk-H4D7WKDY.js.map} +1 -1
  25. package/dist/{chunk-3RJN2VTL.js → chunk-IXWJGOM2.js} +3 -3
  26. package/dist/{chunk-3RJN2VTL.js.map → chunk-IXWJGOM2.js.map} +1 -1
  27. package/dist/{chunk-7NGAWGA3.js → chunk-J4M37SXY.js} +3 -3
  28. package/dist/{chunk-7NGAWGA3.js.map → chunk-J4M37SXY.js.map} +1 -1
  29. package/dist/{chunk-CYNF5PZI.js → chunk-J5CWKFSC.js} +3 -3
  30. package/dist/{chunk-CYNF5PZI.js.map → chunk-J5CWKFSC.js.map} +1 -1
  31. package/dist/{chunk-TP6PLDNM.cjs → chunk-KMZWKSKO.cjs} +8 -8
  32. package/dist/{chunk-TP6PLDNM.cjs.map → chunk-KMZWKSKO.cjs.map} +1 -1
  33. package/dist/{chunk-XGZX22ET.cjs → chunk-KPO67GBR.cjs} +39 -39
  34. package/dist/{chunk-XGZX22ET.cjs.map → chunk-KPO67GBR.cjs.map} +1 -1
  35. package/dist/{chunk-C4WSHRR6.cjs → chunk-KPZZ5FHE.cjs} +32 -12
  36. package/dist/chunk-KPZZ5FHE.cjs.map +1 -0
  37. package/dist/{chunk-X3TGXEFS.js → chunk-KTSF4HFC.js} +7 -7
  38. package/dist/{chunk-X3TGXEFS.js.map → chunk-KTSF4HFC.js.map} +1 -1
  39. package/dist/{chunk-33ZOUJXA.js → chunk-NGDXDHLG.js} +13 -32
  40. package/dist/chunk-NGDXDHLG.js.map +1 -0
  41. package/dist/chunk-NHZK64TQ.js +75 -0
  42. package/dist/chunk-NHZK64TQ.js.map +1 -0
  43. package/dist/{chunk-BPBSSMRB.js → chunk-NRFAWUVD.js} +3 -3
  44. package/dist/{chunk-BPBSSMRB.js.map → chunk-NRFAWUVD.js.map} +1 -1
  45. package/dist/{chunk-O2ODDTMA.cjs → chunk-NSNHRZBH.cjs} +8 -8
  46. package/dist/{chunk-O2ODDTMA.cjs.map → chunk-NSNHRZBH.cjs.map} +1 -1
  47. package/dist/chunk-NWNVWO6L.cjs +80 -0
  48. package/dist/chunk-NWNVWO6L.cjs.map +1 -0
  49. package/dist/{chunk-Y3KA6X7B.js → chunk-OVR3XMYL.js} +4 -4
  50. package/dist/{chunk-Y3KA6X7B.js.map → chunk-OVR3XMYL.js.map} +1 -1
  51. package/dist/{chunk-2FJMTZNJ.js → chunk-QOL3M4FJ.js} +9 -9
  52. package/dist/{chunk-2FJMTZNJ.js.map → chunk-QOL3M4FJ.js.map} +1 -1
  53. package/dist/{chunk-LYUO3E6V.js → chunk-SZOFGU7W.js} +3 -3
  54. package/dist/{chunk-LYUO3E6V.js.map → chunk-SZOFGU7W.js.map} +1 -1
  55. package/dist/{chunk-YNIBUKV5.js → chunk-TBEVGWY3.js} +32 -14
  56. package/dist/chunk-TBEVGWY3.js.map +1 -0
  57. package/dist/{chunk-MJCCBMM5.cjs → chunk-TC3RQNEX.cjs} +6 -80
  58. package/dist/chunk-TC3RQNEX.cjs.map +1 -0
  59. package/dist/{chunk-QIMVTGKS.cjs → chunk-U73KPFYH.cjs} +255 -2
  60. package/dist/chunk-U73KPFYH.cjs.map +1 -0
  61. package/dist/{chunk-RA3ZJ45L.cjs → chunk-ULPFRK3J.cjs} +25 -44
  62. package/dist/chunk-ULPFRK3J.cjs.map +1 -0
  63. package/dist/{chunk-HFGXA5CL.cjs → chunk-UTTTJSQU.cjs} +4 -4
  64. package/dist/{chunk-HFGXA5CL.cjs.map → chunk-UTTTJSQU.cjs.map} +1 -1
  65. package/dist/{chunk-DLBUFHLY.js → chunk-VTTZZ4FN.js} +4 -74
  66. package/dist/chunk-VTTZZ4FN.js.map +1 -0
  67. package/dist/{chunk-A6J2IBUG.js → chunk-VVZ34A2P.js} +3 -3
  68. package/dist/{chunk-A6J2IBUG.js.map → chunk-VVZ34A2P.js.map} +1 -1
  69. package/dist/{chunk-ABUO6PIQ.cjs → chunk-WO7QAVTL.cjs} +13 -13
  70. package/dist/{chunk-ABUO6PIQ.cjs.map → chunk-WO7QAVTL.cjs.map} +1 -1
  71. package/dist/{chunk-5FTIHRZH.cjs → chunk-XVUOMWMD.cjs} +4 -4
  72. package/dist/{chunk-5FTIHRZH.cjs.map → chunk-XVUOMWMD.cjs.map} +1 -1
  73. package/dist/{chunk-444XKG46.js → chunk-YKQ2DPIP.js} +3 -3
  74. package/dist/{chunk-444XKG46.js.map → chunk-YKQ2DPIP.js.map} +1 -1
  75. package/dist/{chunk-HEMU73OP.cjs → chunk-YSHIC4NJ.cjs} +4 -4
  76. package/dist/{chunk-HEMU73OP.cjs.map → chunk-YSHIC4NJ.cjs.map} +1 -1
  77. package/dist/citations/index.cjs +12 -12
  78. package/dist/citations/index.js +3 -3
  79. package/dist/collaboration/index.cjs +9 -9
  80. package/dist/collaboration/index.js +1 -1
  81. package/dist/connect/docx.cjs +11 -11
  82. package/dist/connect/docx.js +8 -8
  83. package/dist/connect/index.cjs +716 -329
  84. package/dist/connect/index.cjs.map +1 -1
  85. package/dist/connect/index.d.ts +1 -0
  86. package/dist/connect/index.js +591 -217
  87. package/dist/connect/index.js.map +1 -1
  88. package/dist/connection/ConnectedSettings.d.ts +3 -2
  89. package/dist/connection/ai.d.ts +27 -72
  90. package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +35 -0
  91. package/dist/connection/settings-page/ConnectedMailSettings.d.ts +13 -0
  92. package/dist/connection/settings-page/ConnectedPremiumModels.d.ts +1 -0
  93. package/dist/connection/settings-page/ConnectedPrivacySettings.d.ts +12 -0
  94. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +29 -0
  95. package/dist/connection/settings-page/SessionStatusIcon.d.ts +7 -0
  96. package/dist/connection/settings-page/index.d.ts +6 -0
  97. package/dist/connection/workspaceData.d.ts +6 -6
  98. package/dist/document-tools/index.cjs +1 -1
  99. package/dist/document-tools/index.js +1 -1
  100. package/dist/facts/index.cjs +4 -4
  101. package/dist/facts/index.js +3 -3
  102. package/dist/files/index.cjs +3 -3
  103. package/dist/files/index.js +2 -2
  104. package/dist/home/index.cjs +20 -20
  105. package/dist/home/index.js +4 -4
  106. package/dist/index.cjs +476 -467
  107. package/dist/index.cjs.map +1 -1
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.js +23 -22
  110. package/dist/index.js.map +1 -1
  111. package/dist/provider/BlocksProvider.d.ts +5 -1
  112. package/dist/provider/settings-section.d.ts +9 -0
  113. package/dist/retrieval/index.cjs +4 -4
  114. package/dist/retrieval/index.js +2 -2
  115. package/dist/settings/AppearanceSettings.d.ts +18 -0
  116. package/dist/settings/ServerConnectionControls.d.ts +16 -0
  117. package/dist/settings/SettingsPage.d.ts +31 -0
  118. package/dist/settings/index.cjs +187 -250
  119. package/dist/settings/index.cjs.map +1 -1
  120. package/dist/settings/index.d.ts +3 -1
  121. package/dist/settings/index.js +87 -199
  122. package/dist/settings/index.js.map +1 -1
  123. package/dist/shell/index.cjs +44 -44
  124. package/dist/shell/index.js +3 -3
  125. package/dist/site/index.cjs +75 -74
  126. package/dist/site/index.js +4 -3
  127. package/dist/studio/index.cjs +80 -79
  128. package/dist/studio/index.cjs.map +1 -1
  129. package/dist/studio/index.js +12 -11
  130. package/dist/studio/index.js.map +1 -1
  131. package/dist/workflow-canvas/index.cjs +28 -28
  132. package/dist/workflow-canvas/index.js +11 -11
  133. package/dist/workspaces/index.cjs +3 -3
  134. package/dist/workspaces/index.js +2 -2
  135. package/node_modules/@arbidocs/coedit/package.json +1 -1
  136. package/package.json +4 -4
  137. package/dist/chunk-33ZOUJXA.js.map +0 -1
  138. package/dist/chunk-45LRMW54.js.map +0 -1
  139. package/dist/chunk-C4WSHRR6.cjs.map +0 -1
  140. package/dist/chunk-DLBUFHLY.js.map +0 -1
  141. package/dist/chunk-JZNXRMLH.cjs.map +0 -1
  142. package/dist/chunk-MJCCBMM5.cjs.map +0 -1
  143. package/dist/chunk-ON3TKY5Y.js.map +0 -1
  144. package/dist/chunk-QIMVTGKS.cjs.map +0 -1
  145. package/dist/chunk-RA3ZJ45L.cjs.map +0 -1
  146. package/dist/chunk-YNIBUKV5.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/settings/DraggableHeader.tsx","../src/settings/AvatarPicker.tsx","../src/settings/SettingsPanel.tsx","../src/settings/ProfileCard.tsx","../src/settings/IdentityVerification.tsx","../src/settings/PasswordChangeDialog.tsx","../src/settings/AccountDialogs.tsx","../src/settings/LogoutDialog.tsx","../src/settings/SettingsSwitchRow.tsx","../src/settings/NotificationCategoryList.tsx","../src/settings/account-views.ts"],"names":["jsx","useMemo","useRef","jsxs","Avatar","AvatarImage","AvatarFallback","cn","Loader2","Camera","ChevronRight","ChevronDown","Input","Button","Check","VerifiedBadge","Pencil","Mail","Tooltip","TooltipTrigger","TooltipContent","Fragment","ShieldCheck","ExternalLink","ModalScaffold","useId","Dialog","DialogContent","testIdOr","DialogHeader","DialogTitle","DialogDescription","CheckCircle2","PasswordStrengthInput","AlertCircle","prefixedTestId","Badge","LogOut","Radio","AlertTriangle","formatCount","useState","useRestoreFocus","DialogFooter","Collapsible","CollapsibleTrigger","CollapsibleContent","Switch","Checkbox"],"mappings":"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","file":"chunk-QIMVTGKS.cjs","sourcesContent":["/**\n * Wrapper that makes a header region draggable for FloatingPanel,\n * while ignoring clicks on interactive elements (buttons, inputs, tabs, etc.).\n */\n\nimport React from 'react'\n\nexport interface DraggableHeaderProps {\n onDragStart?: (e: React.MouseEvent) => void\n children: React.ReactNode\n}\n\nconst INTERACTIVE_SELECTOR = 'button, input, select, a, [role=\"tab\"], [role=\"radio\"]'\n\nexport function DraggableHeader({ onDragStart, children }: DraggableHeaderProps) {\n return (\n <div\n className=\"flex-shrink-0\"\n onMouseDown={\n onDragStart\n ? (e) => {\n const target = e.target as HTMLElement\n if (target.closest(INTERACTIVE_SELECTOR)) return\n onDragStart(e)\n }\n : undefined\n }\n style={onDragStart ? { cursor: 'move' } : undefined}\n >\n {children}\n </div>\n )\n}\n","import { useMemo, useRef, type ChangeEvent } from 'react'\nimport { Camera, Loader2 } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the avatar picker. */\nexport interface AvatarPickerLabels {\n uploadingPicture: string\n changeProfilePicture: string\n change: string\n}\n\nexport const DEFAULT_AVATAR_PICKER_LABELS: AvatarPickerLabels = {\n uploadingPicture: 'Uploading picture',\n changeProfilePicture: 'Change profile picture',\n change: 'Change',\n}\n\nexport interface AvatarPickerProps {\n labels?: Partial<AvatarPickerLabels>\n /** Image URL / data URL; the initials show when absent. */\n pictureUrl?: string | null\n initials: string\n /** Background class of the initials fallback (a stable per-user colour). */\n fallbackClassName?: string\n isUploading?: boolean\n disabled?: boolean\n /** A file was chosen; the host validates, crops and uploads it. */\n onFileChosen: (file: File) => void\n testId?: string\n}\n\n/**\n * Profile picture with a change affordance. A permanent camera mark says the picture is tappable on\n * touch screens; the overlay (revealed on hover/focus) is the actual control.\n */\nexport function AvatarPicker({\n pictureUrl,\n initials,\n fallbackClassName,\n isUploading,\n disabled,\n onFileChosen,\n testId = 'avatar-uploader-input',\n labels,\n}: AvatarPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_AVATAR_PICKER_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n // Reset so choosing the same file again still fires a change.\n e.target.value = ''\n if (file) onFileChosen(file)\n }\n\n return (\n <div data-slot=\"avatar-picker\" className=\"group/avatar relative shrink-0\">\n <Avatar className=\"h-20 w-20 ring-1 ring-border\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt={initials} />}\n <AvatarFallback\n className={cn('text-2xl font-semibold leading-none text-white', fallbackClassName)}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isUploading}\n className={cn(\n 'absolute inset-0 flex items-center justify-center rounded-full',\n 'bg-foreground/70 text-background',\n 'opacity-0 focus-visible:opacity-100 group-hover/avatar:opacity-100',\n // Touch has no hover: keep the change affordance visible (lighter scrim over the photo).\n 'pointer-coarse:opacity-100',\n 'transition-opacity duration-200',\n 'disabled:cursor-not-allowed disabled:opacity-100'\n )}\n aria-label={isUploading ? l.uploadingPicture : l.changeProfilePicture}\n >\n {isUploading ? (\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n ) : (\n <div className=\"flex flex-col items-center gap-0.5\">\n <Camera className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{l.change}</span>\n </div>\n )}\n </button>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-background text-muted-foreground ring-1 ring-border\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </span>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n onChange={handleChange}\n hidden\n className=\"hidden\"\n data-testid={testId}\n />\n </div>\n )\n}\n","import { useMemo, type ComponentProps, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the danger zone. `label` prop wins. */\nexport interface SettingsDangerZoneLabels {\n dangerZone: string\n}\n\nexport const DEFAULT_SETTINGS_DANGER_ZONE_LABELS: SettingsDangerZoneLabels = {\n dangerZone: 'Danger Zone',\n}\n\nexport interface SettingsPanelProps extends ComponentProps<'div'> {\n /** Stable test id of the panel. */\n testId?: string\n}\n\n/** Centred column of {@link SettingsSection}s with a readable measure. */\nexport function SettingsPanel({ className, testId, ...props }: SettingsPanelProps) {\n return (\n <div\n data-slot=\"settings-panel\"\n data-testid={testId}\n className={cn('mx-auto w-full max-w-xl space-y-6', className)}\n {...props}\n />\n )\n}\n\nexport interface SettingsSectionProps extends Omit<ComponentProps<'section'>, 'title'> {\n /** Small muted icon before the title. */\n icon?: ReactNode\n title?: ReactNode\n description?: ReactNode\n /** Right-aligned control in the heading row (e.g. a Reset button). */\n action?: ReactNode\n testId?: string\n}\n\n/** Titled group of settings: heading row, optional description, then the controls. */\nexport function SettingsSection({\n icon,\n title,\n description,\n action,\n testId,\n className,\n children,\n ...props\n}: SettingsSectionProps) {\n return (\n <section\n data-slot=\"settings-section\"\n data-testid={testId}\n className={cn('space-y-3', className)}\n {...props}\n >\n {(title || action) && (\n <div className=\"flex items-center justify-between gap-3\">\n {title && (\n <div className=\"flex items-center gap-2\">\n {icon && (\n <span className=\"text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\">{icon}</span>\n )}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n </div>\n )}\n {action}\n </div>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n {children}\n </section>\n )\n}\n\nexport interface SettingsRowProps extends Omit<ComponentProps<'div'>, 'title'> {\n label: ReactNode\n /** Id of the control: renders the label as a `<label htmlFor>` so it toggles the control. */\n labelFor?: string\n description?: ReactNode\n /** The control: switch, select, button. Sits at the end of the row. */\n children?: ReactNode\n testId?: string\n}\n\n/** One setting: label + help text on the left, its control on the right (stacks on phones). */\nexport function SettingsRow({\n label,\n labelFor,\n description,\n children,\n testId,\n className,\n ...props\n}: SettingsRowProps) {\n return (\n <div\n data-slot=\"settings-row\"\n data-testid={testId}\n className={cn(\n 'flex flex-col gap-2 py-2 @xl:flex-row @xl:items-center @xl:justify-between @xl:gap-6',\n className\n )}\n {...props}\n >\n <div className=\"min-w-0\">\n {labelFor ? (\n <label htmlFor={labelFor} className=\"text-sm font-medium text-foreground\">\n {label}\n </label>\n ) : (\n <div className=\"text-sm font-medium text-foreground\">{label}</div>\n )}\n {description && <div className=\"text-sm text-muted-foreground\">{description}</div>}\n </div>\n {children && <div className=\"flex shrink-0 items-center gap-2\">{children}</div>}\n </div>\n )\n}\n\nexport interface SettingsCardProps extends ComponentProps<'div'> {\n /** `md` for form-like content, `sm` when the card holds a list of full-bleed action rows. */\n padding?: 'md' | 'sm'\n}\n\n/** Bordered card that groups related settings, the same surface as the dashboard cards. */\nexport function SettingsCard({ padding = 'md', className, ...props }: SettingsCardProps) {\n return (\n <div\n data-slot=\"settings-card\"\n className={cn(\n 'rounded-lg border border-border bg-card shadow-xs',\n padding === 'md' ? 'space-y-5 p-5' : 'divide-y divide-border p-2',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface SettingsActionRowProps {\n title: ReactNode\n description?: ReactNode\n onClick: () => void\n testId?: string\n}\n\n/** Full-width row that opens a dialog or sub-page: title, help text and a chevron. */\nexport function SettingsActionRow({ title, description, onClick, testId }: SettingsActionRowProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-slot=\"settings-action-row\"\n data-testid={testId}\n className=\"flex w-full items-center gap-3 rounded-md px-3 py-3 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold text-foreground\">{title}</div>\n {description && (\n <div className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{description}</div>\n )}\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n )\n}\n\nexport interface SettingsDangerZoneProps {\n isOpen: boolean\n onToggle: () => void\n /** Heading of the collapsed zone. */\n label?: string\n title: ReactNode\n description: ReactNode\n /** The destructive control (a Button). */\n action: ReactNode\n labels?: Partial<SettingsDangerZoneLabels>\n}\n\n/** Collapsed-by-default zone for irreversible actions. */\nexport function SettingsDangerZone({\n isOpen,\n onToggle,\n label,\n title,\n description,\n action,\n labels,\n}: SettingsDangerZoneProps) {\n const l = useMemo(() => ({ ...DEFAULT_SETTINGS_DANGER_ZONE_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"settings-danger-zone\" className=\"mt-8 pt-2\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n className=\"flex w-full items-center gap-1.5 text-left pointer-coarse:min-h-11\"\n >\n {isOpen ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <p className=\"text-sm font-medium text-muted-foreground\">{label ?? l.dangerZone}</p>\n </button>\n {isOpen && (\n <div className=\"mt-3 flex items-center justify-between gap-4 rounded-lg bg-destructive/5 p-4\">\n <div>\n <p className=\"font-medium\">{title}</p>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n <div className=\"shrink-0\">{action}</div>\n </div>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Check, Loader2, Mail, Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n VerifiedBadge,\n} from '@arbidocs/react/ui'\nimport { SettingsCard } from './SettingsPanel'\n\n/** Every fixed string of the profile card. `ssoTooltip` prop wins over the label. */\nexport interface ProfileCardLabels {\n firstName: string\n lastName: string\n save: string\n cancel: string\n sso: string\n ssoTooltip: string\n change: string\n newEmailAddress: string\n emailPlaceholder: string\n /** Sentence under the new-email field. */\n codeWillBeSent: string\n sendCode: string\n /** Heading of the verify step: \"Verify new@example.com\". */\n verify: (email: string) => string\n codePlaceholder: string\n enterCodeHint: string\n confirm: string\n /** Resend button while cooling down: \"Resend in 30s\". */\n resendIn: (seconds: number) => string\n resendCode: string\n /** Shown while editing the name of a verified account. */\n verifiedNameLocked: string\n}\n\nexport const DEFAULT_PROFILE_CARD_LABELS: ProfileCardLabels = {\n firstName: 'First name',\n lastName: 'Last name',\n save: 'Save',\n cancel: 'Cancel',\n sso: 'SSO',\n ssoTooltip:\n 'Your email is managed by your sign-in provider. Change it there and it will sync here automatically on your next sign-in.',\n change: 'Change',\n newEmailAddress: 'New email address',\n emailPlaceholder: 'you@example.com',\n codeWillBeSent: 'We\\u2019ll send a 3-word verification code to this address.',\n sendCode: 'Send code',\n verify: (email) => `Verify ${email}`,\n codePlaceholder: 'WORD-WORD-WORD',\n enterCodeHint: 'Enter the 3-word code from the email we just sent.',\n confirm: 'Confirm',\n resendIn: (seconds) => `Resend in ${seconds}s`,\n resendCode: 'Resend code',\n verifiedNameLocked: 'Verified name. Remove your identity verification to change it.',\n}\n\nexport interface ProfileNameView {\n /** Display name; \"Unnamed\" is the host's call. */\n display: string\n isEditing: boolean\n givenName: string\n familyName: string\n onGivenNameChange: (value: string) => void\n onFamilyNameChange: (value: string) => void\n onStartEdit: () => void\n onSave: () => void\n onCancel: () => void\n isSaving: boolean\n}\n\nexport interface ProfileEmailChangeView {\n step: 'enter' | 'verify'\n newEmail: string\n onNewEmailChange: (value: string) => void\n onSendCode: () => void\n isSending: boolean\n code: string\n onCodeChange: (value: string) => void\n onConfirm: () => void\n isConfirming: boolean\n /** Seconds until a new code may be requested; 0 when allowed. */\n cooldownSeconds: number\n onCancel: () => void\n}\n\nexport interface ProfileCardProps {\n /** The picture with its change control. */\n avatar: ReactNode\n name: ProfileNameView\n email: string\n /** Email is managed by the sign-in provider: shows an \"SSO\" marker instead of \"Change\". */\n isSso: boolean\n /** Verified tick after the name. A verified name is locked (the server refuses a rename), so it is not editable. */\n isVerified?: boolean\n onStartEmailChange: () => void\n /** Open email-change flow; hides the plain email row. */\n emailChange?: ProfileEmailChangeView\n ssoTooltip?: string\n labels?: Partial<ProfileCardLabels>\n}\n\n/** Profile identity: avatar, editable name, email and the inline email-change flow. */\nexport function ProfileCard({\n avatar,\n name,\n email,\n isSso,\n isVerified = false,\n onStartEmailChange,\n emailChange,\n ssoTooltip,\n labels,\n}: ProfileCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROFILE_CARD_LABELS, ...labels }), [labels])\n return (\n <SettingsCard>\n <div className=\"flex items-start gap-5\">\n {avatar}\n\n <div className=\"min-w-0 flex-1 space-y-3\">\n {name.isEditing ? (\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 @xl:flex-row\">\n <Input\n value={name.givenName}\n onChange={(e) => name.onGivenNameChange(e.target.value)}\n placeholder={l.firstName}\n className=\"flex-1\"\n autoFocus\n />\n <Input\n value={name.familyName}\n onChange={(e) => name.onFamilyNameChange(e.target.value)}\n placeholder={l.lastName}\n className=\"flex-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={name.onSave}\n size=\"sm\"\n disabled={!name.givenName.trim() || name.isSaving}\n >\n {name.isSaving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.save}\n </Button>\n <Button onClick={name.onCancel} size=\"sm\" variant=\"ghost\" disabled={name.isSaving}>\n {l.cancel}\n </Button>\n </div>\n </div>\n ) : isVerified ? (\n <div className=\"-mx-2 w-full px-2 py-1\" data-testid=\"verified-name\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <VerifiedBadge className=\"h-4 w-4\" />\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{l.verifiedNameLocked}</p>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={name.onStartEdit}\n className=\"-mx-2 w-full rounded-md px-2 py-1 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <Pencil className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </div>\n </button>\n )}\n\n {!emailChange && (\n <div className=\"-mx-2 flex min-w-0 items-center gap-2 px-2 py-1\">\n <Mail className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">{email}</span>\n {isSso ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"ml-1 shrink-0 cursor-help rounded bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\"\n tabIndex={0}\n >\n {l.sso}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{ssoTooltip ?? l.ssoTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <button\n type=\"button\"\n onClick={onStartEmailChange}\n className=\"ml-auto shrink-0 text-xs font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n >\n {l.change}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {emailChange && !isSso && (\n <div className=\"animate-accordion-down overflow-hidden\">\n <div className=\"space-y-3 rounded-lg bg-background p-4\">\n {emailChange.step === 'enter' ? (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.newEmailAddress}\n </div>\n <Input\n type=\"email\"\n value={emailChange.newEmail}\n onChange={(e) => emailChange.onNewEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.codeWillBeSent}</p>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onSendCode}\n size=\"sm\"\n disabled={!emailChange.newEmail.trim() || emailChange.isSending}\n >\n {emailChange.isSending ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Mail className=\"mr-1 h-4 w-4\" />\n )}\n {l.sendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isSending}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.verify(emailChange.newEmail)}\n </div>\n <Input\n value={emailChange.code}\n onChange={(e) =>\n emailChange.onCodeChange(e.target.value.toUpperCase().replace(/\\s+/g, '-'))\n }\n className={cn('text-center font-mono tracking-wider')}\n placeholder={l.codePlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.enterCodeHint}</p>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onConfirm}\n size=\"sm\"\n disabled={!emailChange.code.trim() || emailChange.isConfirming}\n >\n {emailChange.isConfirming ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.confirm}\n </Button>\n <Button\n onClick={() => {\n if (emailChange.cooldownSeconds > 0) return\n emailChange.onSendCode()\n }}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.cooldownSeconds > 0 || emailChange.isSending}\n >\n {emailChange.cooldownSeconds > 0\n ? l.resendIn(emailChange.cooldownSeconds)\n : l.resendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isConfirming}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n )}\n </div>\n </div>\n )}\n </SettingsCard>\n )\n}\n","/**\n * Identity verification blocks: the settings card, the dialog (pay → verify in Didit's frame →\n * result) and a gate for deployments that require it. All take the `IdentityVerificationFlow` from\n * `@arbidocs/react` (`useIdentityVerification` with a provider, or `useIdentityVerificationFlow`\n * bound to a host's own API), so they work the same inside ARBI and on a customer's site.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { ExternalLink, Loader2, ShieldCheck } from 'lucide-react'\nimport { Button, VerifiedBadge, type IdentityVerificationFlow } from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\nimport { SettingsCard, SettingsRow } from './SettingsPanel'\n\n/** Every fixed string of the identity verification blocks. */\nexport interface IdentityVerificationLabels {\n title: string\n intro: string\n /** \"£5.00 incl. VAT · 3 attempts\" (`price` comes formatted, VAT note included). */\n priceLine: (price: string, attempts: number) => string\n proOnly: string\n seePlans: string\n manageBilling: string\n verify: string\n continue: string\n attemptsLeft: (n: number) => string\n verified: string\n verifiedDetail: (country: string) => string\n inReview: string\n finishName: string\n finish: string\n remove: string\n payTitle: string\n payBody: (price: string, attempts: number) => string\n pay: string\n confirmPayment: string\n paymentConfirmed: string\n verifyTitle: string\n embedFailed: string\n openInNewTab: string\n checkResult: string\n resultVerified: string\n resultDeclined: (attemptsLeft: number) => string\n tryAgain: string\n resultInReview: string\n nameMismatchTitle: string\n nameMismatchBody: string\n documentName: string\n accountName: string\n useDocumentName: (name: string) => string\n keepName: string\n close: string\n requiredTitle: string\n requiredBody: string\n requiredProOnly: string\n}\n\nexport const DEFAULT_IDENTITY_VERIFICATION_LABELS: IdentityVerificationLabels = {\n title: 'Identity verification',\n intro: 'Check your ID once to get a verified tick next to your name.',\n priceLine: (price, attempts) => `${price} · ${attempts} attempts`,\n proOnly: 'Available on Pro plans.',\n seePlans: 'See plans',\n manageBilling: 'Manage billing',\n verify: 'Verify identity',\n continue: 'Continue',\n attemptsLeft: (n) => `${n} attempt${n === 1 ? '' : 's'} left`,\n verified: 'Verified',\n verifiedDetail: (country) => `ID issued in ${country}`,\n inReview: 'Your check is being reviewed. We’ll update this when it’s done.',\n finishName: 'Your ID was verified. Confirm your name to get the tick.',\n finish: 'Finish',\n remove: 'Remove',\n payTitle: 'Verify your identity',\n payBody: (price, attempts) =>\n `A one-time fee of ${price} is charged to the card on your Pro plan. It covers up to ${attempts} attempts. Your ID is checked by our provider, Didit; ARBI does not keep your document.`,\n pay: 'Pay and continue',\n confirmPayment: 'Confirm payment with your bank',\n paymentConfirmed: 'I’ve confirmed it',\n verifyTitle: 'Scan your ID',\n embedFailed: 'Your camera isn’t available here. Continue in a new tab, then come back.',\n openInNewTab: 'Open in a new tab',\n checkResult: 'I’ve finished',\n resultVerified: 'You’re verified. The tick now shows next to your name.',\n resultDeclined: (n) =>\n n > 0\n ? `We couldn’t verify your ID. You have ${n} attempt${n === 1 ? '' : 's'} left.`\n : 'We couldn’t verify your ID and no attempts are left.',\n tryAgain: 'Try again',\n resultInReview: 'Your check needs a manual review. We’ll show the result here when it’s done.',\n nameMismatchTitle: 'Your ID was verified',\n nameMismatchBody:\n 'The name on your ID differs from your account name. The tick shows only with the name on your ID.',\n documentName: 'Name on your ID',\n accountName: 'Account name',\n useDocumentName: (name) => `Change my name to ${name}`,\n keepName: 'Keep my name',\n close: 'Close',\n requiredTitle: 'Identity verification required',\n requiredBody: 'This workspace requires a verified identity before you continue.',\n requiredProOnly: 'Identity verification is available on Pro plans. Ask your administrator.',\n}\n\nfunction useLabels(labels?: Partial<IdentityVerificationLabels>) {\n return useMemo(() => ({ ...DEFAULT_IDENTITY_VERIFICATION_LABELS, ...labels }), [labels])\n}\n\n/** Refusals the user fixes in billing (plan, card, address). */\nconst BILLING_CODES = [\n 'PRO_REQUIRED',\n 'PAYMENT_METHOD_REQUIRED',\n 'BILLING_ADDRESS_REQUIRED',\n 'PAYMENT_DECLINED',\n]\n\nfunction Problem({\n flow,\n onManageBilling,\n label,\n}: {\n flow: IdentityVerificationFlow\n onManageBilling?: () => void\n label: string\n}) {\n if (!flow.problem) return null\n const billing = onManageBilling && BILLING_CODES.includes(flow.problem.code ?? '')\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"identity-problem\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {flow.problem.message}\n </p>\n {billing && (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {label}\n </Button>\n )}\n </div>\n )\n}\n\n// ── Card ────────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationCardProps {\n flow: IdentityVerificationFlow\n /** Open the host's plans / billing (upgrade to Pro, fix the card or address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** Settings row for the ID check: offer, progress, or the tick. Renders nothing when not offered. */\nexport function IdentityVerificationCard({\n flow,\n onManageBilling,\n labels,\n}: IdentityVerificationCardProps) {\n const l = useLabels(labels)\n const { status } = flow\n if (!status?.enabled) return null\n const busy = flow.busy !== null\n\n let description: ReactNode\n let action: ReactNode = null\n if (status.verified) {\n description = (\n <span className=\"inline-flex items-center gap-1.5\">\n <VerifiedBadge />\n {l.verified}\n {status.document_country && (\n <span className=\"text-muted-foreground\">\n {' · '}\n {l.verifiedDetail(status.document_country)}\n </span>\n )}\n </span>\n )\n action = (\n <Button size=\"sm\" variant=\"ghost\" onClick={flow.remove} disabled={busy}>\n {l.remove}\n </Button>\n )\n } else if (!status.eligible) {\n description = `${l.intro} ${l.proOnly}`\n action = onManageBilling ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {l.seePlans}\n </Button>\n ) : null\n } else if (status.state === 'in_review') {\n description = l.inReview\n } else if (status.state === 'name_mismatch') {\n description = l.finishName\n action = (\n <Button size=\"sm\" onClick={flow.open}>\n {l.finish}\n </Button>\n )\n } else {\n const resuming = status.attempts_left > 0 || status.state === 'in_progress'\n description = (\n <>\n {l.intro}{' '}\n <span className=\"text-muted-foreground\">\n {resuming\n ? l.attemptsLeft(status.attempts_left)\n : l.priceLine(flow.price ?? '', status.attempts_per_fee)}\n </span>\n </>\n )\n action = (\n <Button size=\"sm\" onClick={flow.open} disabled={busy}>\n <ShieldCheck className=\"mr-1 h-4 w-4\" />\n {resuming ? l.continue : l.verify}\n </Button>\n )\n }\n\n return (\n <SettingsCard padding=\"sm\" data-testid=\"identity-verification-card\">\n <SettingsRow label={l.title} description={description}>\n {action}\n </SettingsRow>\n {!flow.isOpen && (\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n )}\n </SettingsCard>\n )\n}\n\n// ── Dialog ──────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationDialogProps {\n flow: IdentityVerificationFlow\n /** The account name as shown, compared with the name on the document. */\n accountName: string\n /** Block closing (the `RequireVerified` gate). Default true. */\n dismissible?: boolean\n /** Open the host's billing to fix a refused payment (plan, card, address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The verification dialog: pay the fee, verify in Didit's embedded frame, then the result. */\nexport function IdentityVerificationDialog({\n flow,\n accountName,\n dismissible = true,\n onManageBilling,\n labels,\n}: IdentityVerificationDialogProps) {\n const l = useLabels(labels)\n const { status } = flow\n const attempts = status?.attempts_per_fee ?? 0\n const docName = [status?.document_given_name, status?.document_family_name]\n .filter(Boolean)\n .join(' ')\n const spinner = <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n\n let body: ReactNode\n let footer: ReactNode = null\n if (flow.step === 'pay') {\n body = flow.paymentUrl ? (\n <a\n href={flow.paymentUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {l.confirmPayment}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.payBody(flow.price ?? '', attempts)}</p>\n )\n footer = flow.paymentUrl ? (\n <Button onClick={flow.recheckPayment} disabled={flow.busy !== null}>\n {flow.busy === 'start' && spinner}\n {l.paymentConfirmed}\n </Button>\n ) : (\n <Button onClick={flow.pay} disabled={flow.busy !== null} data-testid=\"identity-pay\">\n {flow.busy === 'pay' && spinner}\n {l.pay}\n </Button>\n )\n } else if (flow.step === 'verify') {\n body = (\n <div className=\"space-y-3\">\n {flow.embedFailed ? (\n <p className=\"text-sm text-muted-foreground\">{l.embedFailed}</p>\n ) : (\n <div\n id={flow.verifyContainerId}\n ref={flow.verifyContainerRef}\n className=\"h-[560px] w-full overflow-hidden rounded-md bg-muted\"\n data-testid=\"identity-didit-frame\"\n >\n {flow.busy === 'start' && (\n <div className=\"flex h-full items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n </div>\n )\n footer = (\n <>\n {flow.embedFailed && (\n <Button variant=\"outline\" onClick={flow.openInNewTab}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n {l.openInNewTab}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={flow.checkResult} disabled={flow.busy !== null}>\n {flow.busy === 'refresh' && spinner}\n {l.checkResult}\n </Button>\n </>\n )\n } else if (status?.state === 'name_mismatch') {\n body = (\n <div className=\"space-y-3\" data-testid=\"identity-name-mismatch\">\n <p className=\"text-sm text-muted-foreground\">{l.nameMismatchBody}</p>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n <dt className=\"text-muted-foreground\">{l.documentName}</dt>\n <dd className=\"font-medium\">{docName}</dd>\n <dt className=\"text-muted-foreground\">{l.accountName}</dt>\n <dd>{accountName}</dd>\n </dl>\n </div>\n )\n footer = (\n <>\n <Button variant=\"ghost\" onClick={flow.keepName} disabled={flow.busy !== null}>\n {l.keepName}\n </Button>\n <Button onClick={flow.acceptName} disabled={flow.busy !== null || !docName}>\n {flow.busy === 'accept' && spinner}\n {l.useDocumentName(docName)}\n </Button>\n </>\n )\n } else if (status?.verified) {\n body = (\n <p className=\"flex items-center gap-2 text-sm\">\n <VerifiedBadge className=\"h-4 w-4\" />\n {l.resultVerified}\n </p>\n )\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else if (status?.state === 'in_review') {\n body = <p className=\"text-sm text-muted-foreground\">{l.resultInReview}</p>\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else {\n const left = status?.attempts_left ?? 0\n body = <p className=\"text-sm text-muted-foreground\">{l.resultDeclined(left)}</p>\n footer =\n left > 0 ? (\n <Button onClick={flow.retry} disabled={flow.busy !== null}>\n {l.tryAgain}\n </Button>\n ) : (\n <Button onClick={flow.close}>{l.close}</Button>\n )\n }\n\n const title =\n status?.state === 'name_mismatch' && flow.step === 'result'\n ? l.nameMismatchTitle\n : flow.step === 'verify'\n ? l.verifyTitle\n : l.payTitle\n return (\n <ModalScaffold\n open={flow.isOpen}\n onOpenChange={(open) => (open ? flow.open() : flow.close())}\n title={title}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n size={flow.step === 'verify' ? 'lg' : 'md'}\n dismissible={dismissible}\n testId=\"identity-verification-dialog\"\n >\n <ModalScaffold.Body>\n {body}\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>{footer}</ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n// ── Gate ────────────────────────────────────────────────────────────────────\n\nexport interface RequireVerifiedProps {\n flow: IdentityVerificationFlow\n accountName: string\n onManageBilling?: () => void\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/**\n * Children behind a verified identity when the deployment requires it (`status.required`): until\n * the user is verified a dialog that cannot be dismissed covers them. Passes through otherwise.\n */\nexport function RequireVerified({\n flow,\n accountName,\n onManageBilling,\n children,\n labels,\n}: RequireVerifiedProps) {\n const l = useLabels(labels)\n const { status } = flow\n const blocked = Boolean(status?.enabled && status.required && !status.verified)\n if (!blocked || !status) return <>{children}</>\n\n if (flow.isOpen) {\n return (\n <>\n {children}\n <IdentityVerificationDialog\n flow={flow}\n accountName={accountName}\n dismissible={false}\n onManageBilling={onManageBilling}\n labels={labels}\n />\n </>\n )\n }\n return (\n <>\n {children}\n <ModalScaffold\n open\n onOpenChange={() => {}}\n title={l.requiredTitle}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n dismissible={false}\n testId=\"identity-required-gate\"\n >\n <ModalScaffold.Body>\n <p className=\"text-sm text-muted-foreground\">\n {status.eligible ? l.requiredBody : l.requiredProOnly}\n </p>\n </ModalScaffold.Body>\n {status.eligible && (\n <ModalScaffold.Footer>\n <Button onClick={flow.open}>{l.verify}</Button>\n </ModalScaffold.Footer>\n )}\n </ModalScaffold>\n </>\n )\n}\n","import { useMemo, type FormEvent, type ReactNode, useId } from 'react'\nimport { AlertCircle, CheckCircle2, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n PasswordStrengthInput,\n type PasswordStrengthInputLabels,\n type PasswordStrengthInputTestIds,\n} from '../auth/PasswordStrengthInput'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the password-change dialog. */\nexport interface PasswordChangeDialogLabels {\n setNewPasswordTitle: string\n changeMasterPasswordTitle: string\n recoveryDescription: string\n changeDescription: string\n passwordChanged: string\n /** Success note: a password change keeps the account key, so the saved recovery key still works. */\n recoveryKeyUnchanged: string\n done: string\n recoverySuccessful: string\n currentPassword: string\n currentPasswordPlaceholder: string\n masterPassword: string\n newPassword: string\n confirmPassword: string\n confirmNewPassword: string\n cancel: string\n settingPassword: string\n changingPassword: string\n continue: string\n changePassword: string\n}\n\nexport const DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS: PasswordChangeDialogLabels = {\n setNewPasswordTitle: 'Set New Password',\n changeMasterPasswordTitle: 'Change Master Password',\n recoveryDescription: 'Set a new password for your recovered account',\n changeDescription: 'Change your master password dialog',\n passwordChanged: 'Password changed',\n recoveryKeyUnchanged:\n 'Your recovery key is unchanged: the one you saved still recovers this account.',\n done: 'Done',\n recoverySuccessful: 'Recovery successful. Set a new master password to continue.',\n currentPassword: 'Current Password',\n currentPasswordPlaceholder: 'Enter current password',\n masterPassword: 'Master Password',\n newPassword: 'New Password',\n confirmPassword: 'Confirm Password',\n confirmNewPassword: 'Confirm New Password',\n cancel: 'Cancel',\n settingPassword: 'Setting Password...',\n changingPassword: 'Changing Password...',\n continue: 'Continue',\n changePassword: 'Change Password',\n}\n\nexport interface PasswordChangeDialogProps {\n labels?: Partial<PasswordChangeDialogLabels>\n /** Labels forwarded to the embedded password input. */\n passwordInputLabels?: Partial<PasswordStrengthInputLabels>\n /** Dialog test id (default `change-password-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'done' | 'currentInput' | 'error' | 'cancel' | 'submit', string>>\n /** Ids forwarded to the embedded password input. */\n passwordInputTestIds?: PasswordStrengthInputTestIds\n open: boolean\n /** Dismiss (also fired by Cancel and the close button). */\n onClose: () => void\n /** After recovery with a key: no current password, no Cancel, full-width Continue. */\n recoveryMode: boolean\n currentPassword: string\n onCurrentPasswordChange: (value: string) => void\n newPassword: string\n onNewPasswordChange: (value: string) => void\n confirmPassword: string\n onConfirmPasswordChange: (value: string) => void\n /** The host's password policy (see `PasswordStrengthInput`). */\n getUnmetRequirement: (password: string) => string | null\n error: string | null\n isProcessing: boolean\n isSubmitDisabled: boolean\n onSubmit: () => void\n /** The password changed: the success state replaces the form. */\n isChanged: boolean\n /** Extra content under the success note. */\n success?: ReactNode\n onDone: () => void\n}\n\n/** Change (or set, after recovery) the master password. */\nexport function PasswordChangeDialog({\n open,\n onClose,\n recoveryMode,\n currentPassword,\n onCurrentPasswordChange,\n newPassword,\n onNewPasswordChange,\n confirmPassword,\n onConfirmPasswordChange,\n getUnmetRequirement,\n error,\n isProcessing,\n isSubmitDisabled,\n onSubmit,\n isChanged,\n success,\n onDone,\n labels,\n passwordInputLabels,\n testId,\n testIds,\n passwordInputTestIds,\n}: PasswordChangeDialogProps) {\n const currentPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit()\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'change-password-dialog' })}\n >\n <DialogHeader>\n <DialogTitle>\n {recoveryMode ? l.setNewPasswordTitle : l.changeMasterPasswordTitle}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {recoveryMode ? l.recoveryDescription : l.changeDescription}\n </DialogDescription>\n </DialogHeader>\n\n {isChanged ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-green-text\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <span className=\"font-medium\">{l.passwordChanged}</span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{l.recoveryKeyUnchanged}</p>\n {success}\n <div className=\"flex justify-end\">\n <Button\n onClick={onDone}\n data-testid={testIdOr(testIds?.done, { testId: 'change-password-done-button' })}\n >\n {l.done}\n </Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {recoveryMode && (\n <p className=\"text-sm font-medium text-green-text\">{l.recoverySuccessful}</p>\n )}\n\n {!recoveryMode && (\n <div className=\"space-y-1.5\">\n <label htmlFor={currentPasswordId} className=\"text-sm font-medium text-foreground\">\n {l.currentPassword} <span className=\"text-red-text\">*</span>\n </label>\n <Input\n id={currentPasswordId}\n type=\"password\"\n value={currentPassword}\n onChange={(e) => onCurrentPasswordChange(e.target.value)}\n disabled={isProcessing}\n placeholder={l.currentPasswordPlaceholder}\n autoComplete=\"current-password\"\n className=\"placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.currentInput, {\n testId: 'change-password-current-input',\n })}\n />\n </div>\n )}\n\n <PasswordStrengthInput\n password={newPassword}\n confirmPassword={confirmPassword}\n onPasswordChange={onNewPasswordChange}\n onConfirmPasswordChange={onConfirmPasswordChange}\n showConfirmation\n disabled={isProcessing}\n passwordLabel={recoveryMode ? l.masterPassword : l.newPassword}\n confirmLabel={recoveryMode ? l.confirmPassword : l.confirmNewPassword}\n labels={passwordInputLabels}\n testIds={passwordInputTestIds}\n layout={recoveryMode ? 'side-by-side' : 'stacked'}\n showStrengthIndicator\n getUnmetRequirement={getUnmetRequirement}\n />\n\n {error && (\n <div\n className=\"rounded-md bg-red-bg p-3\"\n data-testid={testIdOr(testIds?.error, { testId: 'change-password-error' })}\n >\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" />\n <p className=\"text-sm text-red-text\">{error}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3 pt-4\">\n {!recoveryMode && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, {\n testId: 'change-password-cancel-button',\n })}\n >\n {l.cancel}\n </Button>\n )}\n <Button\n type=\"submit\"\n disabled={isSubmitDisabled}\n className={recoveryMode ? 'w-full' : ''}\n data-testid={testIdOr(testIds?.submit, { testId: 'change-password-submit-button' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {recoveryMode ? l.settingPassword : l.changingPassword}\n </>\n ) : recoveryMode ? (\n l.continue\n ) : (\n l.changePassword\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { AlertTriangle, Loader2, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the active-sessions dialog. */\nexport interface ActiveSessionsDialogLabels {\n title: string\n description: string\n noSessions: string\n thisDevice: string\n agent: string\n endSession: string\n}\n\nexport const DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS: ActiveSessionsDialogLabels = {\n title: 'Active sessions',\n description:\n 'Devices and agents currently signed in to your account. Ending a session signs it out immediately.',\n noSessions: 'No active sessions.',\n thisDevice: 'This device',\n agent: 'Agent',\n endSession: 'End this session',\n}\n\n/** Every fixed string of the delete-account dialog. */\nexport interface DeleteAccountDialogLabels {\n warningTitle: string\n /** Sentence start, before the emphasised part (keep the trailing space). */\n warningBefore: string\n /** Emphasised (bold) part of the warning. */\n warningEmphasis: string\n /** Sentence end, after the emphasised part. */\n warningAfter: string\n blockersHeading: string\n cancel: string\n continue: string\n confirmTitle: string\n confirmDescription: string\n yourEmail: string\n back: string\n deleting: string\n deleteAccount: string\n}\n\nexport const DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS: DeleteAccountDialogLabels = {\n warningTitle: 'Delete your account?',\n warningBefore: 'Once deleted, your account will be ',\n warningEmphasis: 'immediately closed and you will be logged out',\n warningAfter: '. This action cannot be undone.',\n blockersHeading: 'You must resolve these first:',\n cancel: 'Cancel',\n continue: 'Continue',\n confirmTitle: 'Confirm account deletion',\n confirmDescription:\n 'Type your email address to confirm. Your account will be closed immediately and you will be logged out.',\n yourEmail: 'Your email',\n back: 'Back',\n deleting: 'Deleting...',\n deleteAccount: 'Delete Account',\n}\n\nexport interface ActiveSessionView {\n id: string\n /** Display name, e.g. \"Browser session\". */\n name: string\n /** The session of this device: badged, and cannot be ended here. */\n isCurrent: boolean\n isAgent: boolean\n /** Secondary line, e.g. \"10.0.0.1 · expires in 2h · 3 workspaces\". */\n detail: string\n isTerminating: boolean\n /** Avatar glyph (monitor / bot). */\n icon?: ReactNode\n}\n\nexport interface ActiveSessionsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n isLoading: boolean\n sessions: ActiveSessionView[]\n onTerminate: (id: string) => void\n labels?: Partial<ActiveSessionsDialogLabels>\n /** Dialog test id (default `active-sessions-dialog`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `sessionItem` is a prefix (`<prefix>-<session id>`);\n * `terminateSession` is a prefix (`<prefix>-<session id>-button`).\n */\n testIds?: Partial<Record<'list' | 'sessionItem' | 'terminateSession', string>>\n}\n\nfunction SessionListRow({\n session,\n onTerminate,\n labels,\n testIds,\n}: {\n session: ActiveSessionView\n onTerminate: (id: string) => void\n labels: ActiveSessionsDialogLabels\n testIds?: ActiveSessionsDialogProps['testIds']\n}) {\n return (\n <div\n className=\"flex w-full items-center gap-3 border-b border-border/60 px-4 py-3 last:border-b-0\"\n data-testid={prefixedTestId(testIds?.sessionItem, session.id, {\n testId: `session-item-${session.id}`,\n })}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n {session.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{session.name}</span>\n {session.isCurrent && (\n <Badge className=\"border-transparent bg-accent px-1.5 py-0 text-xs text-accent-foreground shadow-none hover:bg-accent\">\n {labels.thisDevice}\n </Badge>\n )}\n {session.isAgent && (\n <Badge variant=\"default\" className=\"px-1 py-0 text-xs\">\n {labels.agent}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">{session.detail}</div>\n </div>\n {!session.isCurrent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={labels.endSession}\n onClick={() => onTerminate(session.id)}\n disabled={session.isTerminating}\n data-testid={prefixedTestId(\n testIds?.terminateSession,\n session.id,\n { testId: `terminate-session-${session.id}-button` },\n '-button'\n )}\n >\n {session.isTerminating ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <LogOut className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{labels.endSession}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/**\n * Every session signed in to the account (this device, other devices, agents). Any but the current\n * one can be ended; ending the current one belongs to the Logout flow.\n */\nexport function ActiveSessionsDialog({\n open,\n onOpenChange,\n isLoading,\n sessions,\n onTerminate,\n labels,\n testId,\n testIds,\n}: ActiveSessionsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-lg\"\n data-testid={testIdOr(testId, { testId: 'active-sessions-dialog' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <Radio className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noSessions}</p>\n ) : (\n <div\n className=\"-mx-2 max-h-96 overflow-auto rounded-lg bg-muted\"\n data-testid={testIdOr(testIds?.list, { testId: 'session-list' })}\n >\n {sessions.map((session) => (\n <SessionListRow\n key={session.id}\n session={session}\n onTerminate={onTerminate}\n labels={l}\n testIds={testIds}\n />\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DeleteAccountBlocker {\n key: string\n content: ReactNode\n}\n\nexport interface DeleteAccountDialogProps {\n open: boolean\n onClose: () => void\n step: 'warning' | 'confirm'\n /** Reasons the account cannot be deleted yet; Continue is disabled while any exist. */\n blockers: DeleteAccountBlocker[]\n onContinue: () => void\n onBack: () => void\n userEmail: string\n confirmEmail: string\n onConfirmEmailChange: (email: string) => void\n isDeleting: boolean\n onSubmit: () => void\n labels?: Partial<DeleteAccountDialogLabels>\n /** Dialog test id (default `delete-account-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'continue' | 'emailInput' | 'back' | 'submit', string>>\n}\n\n/** Two-step account deletion: a warning (with blockers), then type-your-email to confirm. */\nexport function DeleteAccountDialog({\n open,\n onClose,\n step,\n blockers,\n onContinue,\n onBack,\n userEmail,\n confirmEmail,\n onConfirmEmailChange,\n isDeleting,\n onSubmit,\n labels,\n testId,\n testIds,\n}: DeleteAccountDialogProps) {\n const confirmEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, ...labels }), [labels])\n const emailMatches = confirmEmail.toLowerCase() === userEmail.toLowerCase()\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'delete-account-dialog' })}\n >\n {step === 'warning' ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\n {l.warningTitle}\n </DialogTitle>\n <DialogDescription>\n {l.warningBefore}\n <strong>{l.warningEmphasis}</strong>\n {l.warningAfter}\n </DialogDescription>\n </DialogHeader>\n {blockers.length > 0 && (\n <div className=\"rounded-md bg-yellow-bg p-3 text-sm text-yellow-text\">\n <p className=\"mb-1 font-semibold\">{l.blockersHeading}</p>\n <ul className=\"list-inside list-disc space-y-1\">\n {blockers.map((blocker) => (\n <li key={blocker.key}>{blocker.content}</li>\n ))}\n </ul>\n </div>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'delete-account-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={blockers.length > 0}\n onClick={onContinue}\n data-testid={testIdOr(testIds?.continue, {\n testId: 'delete-account-continue-button',\n })}\n >\n {l.continue}\n </Button>\n </div>\n </>\n ) : (\n <>\n <DialogHeader>\n <DialogTitle>{l.confirmTitle}</DialogTitle>\n <DialogDescription>{l.confirmDescription}</DialogDescription>\n </DialogHeader>\n <div>\n <label htmlFor={confirmEmailId} className=\"mb-1 block text-sm font-medium\">\n {l.yourEmail}\n </label>\n <Input\n id={confirmEmailId}\n type=\"email\"\n placeholder={userEmail}\n value={confirmEmail}\n onChange={(e) => onConfirmEmailChange(e.target.value)}\n autoFocus\n data-testid={testIdOr(testIds?.emailInput, {\n testId: 'delete-account-email-input',\n })}\n />\n </div>\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onBack}\n data-testid={testIdOr(testIds?.back, { testId: 'delete-account-back-button' })}\n >\n {l.back}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!emailMatches || isDeleting}\n onClick={onSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'delete-account-submit-button' })}\n >\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.deleting}\n </>\n ) : (\n l.deleteAccount\n )}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the logout dialog. */\nexport interface LogoutDialogLabels {\n title: string\n descriptionAll: string\n descriptionThis: string\n cancel: string\n allSessions: string\n offlineTooltip: string\n thisSession: string\n offlineNote: string\n /** Disclosure trigger: \"3 active sessions\". */\n activeSessions: (count: number) => string\n /** Session row: \"2 workspaces\". */\n workspaces: (count: number) => string\n /** Session row: \"TTL 2h\". */\n ttl: (ttlLabel: string) => string\n}\n\nexport const DEFAULT_LOGOUT_DIALOG_LABELS: LogoutDialogLabels = {\n title: 'Logout',\n descriptionAll: 'End this session or all active sessions?',\n descriptionThis: 'End this session and return to the login page.',\n cancel: 'Cancel',\n allSessions: 'All sessions',\n offlineTooltip: 'Ending all sessions needs a connection — you can still log out of this device.',\n thisSession: 'This session',\n offlineNote:\n 'You’re offline — ending all sessions needs a connection. You can still log out of this device.',\n activeSessions: (count) =>\n formatCount(count, { one: 'active session', other: 'active sessions' }),\n workspaces: (count) => formatCount(count, { one: 'workspace', other: 'workspaces' }),\n ttl: (ttlLabel) => `TTL ${ttlLabel}`,\n}\n\nexport interface LogoutSessionView {\n id: string\n /** `agent` sessions are shown with the primary badge. */\n status: string\n ipAddress?: string | null\n /** Pre-formatted remaining lifetime, e.g. \"2h\". */\n ttlLabel: string\n workspaceCount: number\n}\n\nexport interface LogoutDialogProps {\n open: boolean\n onClose: () => void\n onLogoutThis: () => void\n onLogoutAll: () => void\n /** False for agent accounts: \"All sessions\" is not offered. */\n canLogoutAll: boolean\n isOnline: boolean\n sessions: LogoutSessionView[]\n /** Icon for a session row (monitor / bot). */\n renderSessionIcon?: (status: string) => ReactNode\n labels?: Partial<LogoutDialogLabels>\n /** Dialog test id (default `logout-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'all' | 'this' | 'offlineNote', string>>\n}\n\nfunction SessionRow({\n session,\n icon,\n labels,\n}: {\n session: LogoutSessionView\n icon?: ReactNode\n labels: LogoutDialogLabels\n}) {\n const { status } = session\n return (\n <div className=\"flex items-center gap-3 rounded-md bg-muted/50 px-3 py-2\">\n {icon && <div className=\"flex-shrink-0\">{icon}</div>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <code className=\"truncate font-mono text-sm\">{session.id.slice(0, 12)}</code>\n <Badge\n variant={status === 'agent' ? 'default' : 'secondary'}\n className=\"px-1 py-0 text-sm\"\n >\n {status}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {session.ipAddress && <span>{session.ipAddress}</span>}\n <span>{labels.ttl(session.ttlLabel)}</span>\n {session.workspaceCount > 0 && <span>{labels.workspaces(session.workspaceCount)}</span>}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Logout confirmation: end this session or all sessions, with the list of the\n * user's active sessions (including agent sessions) under a disclosure.\n * \"All sessions\" is disabled while offline because it must reach the server.\n */\nexport function LogoutDialog({\n open,\n onClose,\n onLogoutThis,\n onLogoutAll,\n canLogoutAll,\n isOnline,\n sessions,\n renderSessionIcon,\n labels,\n testId,\n testIds,\n}: LogoutDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_LOGOUT_DIALOG_LABELS, ...labels }), [labels])\n const [sessionsOpen, setSessionsOpen] = useState(false)\n const restoreFocus = useRestoreFocus()\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n {...restoreFocus}\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'logout-modal' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <LogOut className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription className=\"text-base\">\n {canLogoutAll ? l.descriptionAll : l.descriptionThis}\n </DialogDescription>\n </DialogHeader>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'logout-modal-cancel-button' })}\n >\n {l.cancel}\n </Button>\n {canLogoutAll && (\n <Button\n variant=\"secondary\"\n onClick={onLogoutAll}\n disabled={!isOnline}\n title={isOnline ? undefined : l.offlineTooltip}\n data-testid={testIdOr(testIds?.all, { testId: 'logout-modal-all-button' })}\n >\n {l.allSessions}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onLogoutThis}\n data-testid={testIdOr(testIds?.this, { testId: 'logout-modal-this-button' })}\n >\n {l.thisSession}\n </Button>\n </DialogFooter>\n\n {canLogoutAll && !isOnline && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.offlineNote, { testId: 'logout-offline-note' })}\n >\n {l.offlineNote}\n </p>\n )}\n\n {sessions.length > 0 && (\n <Collapsible open={sessionsOpen} onOpenChange={setSessionsOpen}>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 py-1 text-left transition-opacity hover:opacity-80 pointer-coarse:py-3\">\n {sessionsOpen ? (\n <ChevronDown className=\"h-4 w-4 flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n )}\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Radio className=\"h-3 w-3\" />\n <span>{l.activeSessions(sessions.length)}</span>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"max-h-48 space-y-1.5 overflow-auto pt-2\">\n {sessions.map((session) => (\n <SessionRow\n key={session.id}\n session={session}\n icon={renderSessionIcon?.(session.status)}\n labels={l}\n />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Switch, cn } from '@arbidocs/react/ui'\n\nexport interface SettingsSwitchRowProps {\n /** Id of the switch; also the `htmlFor` of the label so clicking the label toggles it. */\n id: string\n title: ReactNode\n /** Leading glyph of the title. */\n icon?: ReactNode\n description?: ReactNode\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n testId?: string\n disabled?: boolean\n className?: string\n}\n\n/** One on/off setting: icon + title + help text at the start, the switch at the end. */\nexport function SettingsSwitchRow({\n id,\n title,\n icon,\n description,\n checked,\n onCheckedChange,\n testId,\n disabled,\n className,\n}: SettingsSwitchRowProps) {\n return (\n <div\n data-slot=\"settings-switch-row\"\n className={cn('flex items-center justify-between gap-4', className)}\n >\n <div className=\"min-w-0 flex-1\">\n <label htmlFor={id} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {icon}\n {title}\n </label>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n data-testid={testId}\n />\n </div>\n )\n}\n\n/** Indented group of rows that belong to the row above (e.g. the connectors of \"Connectors\"). */\nexport function SettingsSwitchGroup({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"settings-switch-group\"\n className={cn('ml-6 space-y-4 border-l border-border pl-4', className)}\n >\n {children}\n </div>\n )\n}\n","import { Checkbox, cn } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { SettingsSwitchRow } from './SettingsSwitchRow'\n\nexport interface NotificationCategory {\n key: string\n label: string\n description: string\n checked: boolean\n}\n\nexport interface NotificationCategoryListProps {\n /** Master switch: on while at least one category is on. */\n masterId: string\n masterTitle: string\n masterDescription: string\n masterChecked: boolean\n onMasterChange: (checked: boolean) => void\n masterTestId?: string\n categories: NotificationCategory[]\n onCategoryChange: (key: string, checked: boolean) => void\n /** Prefix of the checkbox ids (`<prefix>-<key>`); default the master id. */\n idPrefix?: string\n /** Prefix of the checkbox test ids (`<prefix>-<key>`); default `toggle-email`. */\n testIdPrefix?: string\n}\n\n/**\n * A master switch with per-category checkboxes under it. The checkboxes are greyed out and\n * disabled while the master is off.\n */\nexport function NotificationCategoryList({\n masterId,\n masterTitle,\n masterDescription,\n masterChecked,\n onMasterChange,\n masterTestId,\n categories,\n onCategoryChange,\n idPrefix = masterId,\n testIdPrefix,\n}: NotificationCategoryListProps) {\n return (\n <div data-slot=\"notification-category-list\">\n <SettingsSwitchRow\n id={masterId}\n title={masterTitle}\n description={masterDescription}\n checked={masterChecked}\n onCheckedChange={onMasterChange}\n testId={testIdOr(masterTestId, { testId: 'toggle-email-notifications' })}\n />\n <div className=\"ml-1 mt-3 space-y-3 border-l border-border pl-4 pointer-coarse:mt-5 pointer-coarse:space-y-5\">\n {categories.map((c) => (\n <label\n key={c.key}\n htmlFor={`${idPrefix}-${c.key}`}\n className={cn(\n 'flex items-start gap-3 pointer-coarse:min-h-11',\n masterChecked ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n )}\n >\n <Checkbox\n id={`${idPrefix}-${c.key}`}\n checked={c.checked}\n disabled={!masterChecked}\n onCheckedChange={(value) => onCategoryChange(c.key, value === true)}\n data-testid={prefixedTestId(testIdPrefix, c.key, { testId: `toggle-email-${c.key}` })}\n className=\"mt-0.5 size-5 shrink-0\"\n />\n <div className=\"min-w-0\">\n <span className=\"text-sm\">{c.label}</span>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{c.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * Pure mappers from the account data the hooks return to the props of the settings parts\n * (`ActiveSessionsDialog`, `LogoutDialog`, `DeleteAccountDialog`, `NotificationCategoryList`).\n * No React Query, no SDK: a host with its own data layer uses them too.\n */\n\nimport type { ReactNode } from 'react'\nimport type { ActiveSessionView, DeleteAccountBlocker } from './AccountDialogs'\nimport type { LogoutSessionView } from './LogoutDialog'\nimport type { NotificationCategory } from './NotificationCategoryList'\n\n/** A session as `GET /v1/user/sessions` reports it (the fields the views read). */\nexport interface SessionLike {\n session_id: string\n name?: string | null\n ip_address?: string | null\n workspaces: readonly string[]\n status?: string | null\n /** Seconds left. */\n ttl: number\n}\n\n/** Remaining seconds as `1d 2h 3m`; `expired` at or below zero. */\nexport function formatSessionTtl(totalSeconds: number): string {\n if (totalSeconds <= 0) return 'expired'\n const days = Math.floor(totalSeconds / 86400)\n const hours = Math.floor((totalSeconds % 86400) / 3600)\n const minutes = Math.floor((totalSeconds % 3600) / 60)\n const parts: string[] = []\n if (days > 0) parts.push(`${days}d`)\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0) parts.push(`${minutes}m`)\n return parts.length > 0 ? parts.join(' ') : '<1m'\n}\n\nexport interface ToActiveSessionViewsOptions {\n /** This device's session id (`useCurrentSessionId`); it is listed first and cannot be ended. */\n currentSessionId: string | null\n /** The session being ended right now, for its spinner. */\n terminatingId?: string | null\n /** Glyph per status (`user` / `agent`). */\n renderIcon?: (status: string) => ReactNode\n formatTtl?: (seconds: number) => string\n}\n\n/** Sessions as `ActiveSessionsDialog` rows: this device first, a detail line, agents marked. */\nexport function toActiveSessionViews(\n sessions: readonly SessionLike[],\n {\n currentSessionId,\n terminatingId,\n renderIcon,\n formatTtl = formatSessionTtl,\n }: ToActiveSessionViewsOptions\n): ActiveSessionView[] {\n return sessions\n .map((session) => {\n const status = session.status || 'user'\n const count = session.workspaces.length\n return {\n id: session.session_id,\n name: session.name || (status === 'agent' ? 'Agent session' : 'Browser session'),\n isCurrent: session.session_id === currentSessionId,\n isAgent: status === 'agent',\n detail: `${session.ip_address ?? 'Unknown IP'} · expires in ${formatTtl(session.ttl)}${\n count > 0 ? ` · ${count} workspace${count > 1 ? 's' : ''}` : ''\n }`,\n isTerminating: terminatingId === session.session_id,\n icon: renderIcon?.(status),\n }\n })\n .sort((a, b) => Number(b.isCurrent) - Number(a.isCurrent))\n}\n\n/** Sessions as `LogoutDialog` rows. */\nexport function toLogoutSessionViews(\n sessions: readonly SessionLike[],\n formatTtl: (seconds: number) => string = formatSessionTtl\n): LogoutSessionView[] {\n return sessions.map((session) => ({\n id: session.session_id,\n status: session.status || 'user',\n ipAddress: session.ip_address,\n ttlLabel: formatTtl(session.ttl),\n workspaceCount: session.workspaces.length,\n }))\n}\n\n/** A reason the account cannot be closed yet (see `parseDeleteAccountBlockers`). */\nexport type DeleteBlockerLike =\n { type: 'active_subscription' } | { type: 'workspace_members'; workspaces: readonly string[] }\n\n/** Blockers as `DeleteAccountDialog` rows. `renderSubscriptionLink` lets the host link its billing page. */\nexport function toDeleteBlockerViews(\n blockers: readonly DeleteBlockerLike[],\n renderSubscriptionLink?: () => ReactNode\n): DeleteAccountBlocker[] {\n return blockers.flatMap<DeleteAccountBlocker>((blocker) =>\n blocker.type === 'active_subscription'\n ? [\n {\n key: 'active_subscription',\n content: renderSubscriptionLink\n ? renderSubscriptionLink()\n : 'Active subscription: cancel it in your subscription settings first',\n },\n ]\n : blocker.workspaces.map((ws) => ({\n key: `workspace-${ws}`,\n content: `You are the sole admin of workspace \"${ws}\" — transfer admin rights or remove all other members first`,\n }))\n )\n}\n\n/** One email category the user can switch: its key in the settings record and its wording. */\nexport interface EmailNotificationCategoryDef {\n key: string\n label: string\n description: string\n}\n\n/** The categories ARBI sends email for today (add one when the backend adds it). */\nexport const EMAIL_NOTIFICATION_CATEGORIES: readonly EmailNotificationCategoryDef[] = [\n { key: 'messages', label: 'New messages', description: 'A direct message while you’re offline' },\n { key: 'workspace_added', label: 'Workspace access', description: 'You’re added to a workspace' },\n {\n key: 'contact_accepted',\n label: 'Invitation accepted',\n description: 'Someone accepts your invitation',\n },\n { key: 'referral_reward', label: 'Rewards', description: 'You earn a reward' },\n {\n key: 'product_updates',\n label: 'ARBI update',\n description: 'Weekly digest of new features and highlights',\n },\n]\n\n/** The category keys, in the order the list shows them. */\nexport const EMAIL_NOTIFICATION_KEYS: readonly string[] = EMAIL_NOTIFICATION_CATEGORIES.map(\n (c) => c.key\n)\n\n/** Category definitions plus their states as `NotificationCategoryList` rows. */\nexport function toNotificationCategories(\n checked: Readonly<Record<string, boolean>>,\n defs: readonly EmailNotificationCategoryDef[] = EMAIL_NOTIFICATION_CATEGORIES\n): NotificationCategory[] {\n return defs.map((def) => ({ ...def, checked: checked[def.key] ?? true }))\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/connection/docx/support.tsx","../src/connection/ConnectedWorkflowLauncher.tsx","../src/connection/ConnectedWorkflowsTable.tsx","../src/connection/docx/useConnectedDocxReferences.tsx","../src/connection/docx/useConnectedHouseTemplate.ts","../src/connection/docx/ConnectedNativeDocxEditor.tsx"],"names":["createContext","jsx","useContext","useConnectedDocuments","useConnectedTags","useMemo","buildWorkflowScopeSource","documentScopeLabels","useAgents","useArbi","useBlocksEnvironment","useConnectedWorkspace","useThumbnails","useRef","useState","useCallback","jsxs","Fragment","WorkflowDocumentsField","WorkflowLauncher","useWorkspaceUsers","workflowTriggerType","fmtDate","useWorkflows","useConnectedConversations","useUpdateWorkflow","useDeleteWorkflow","useRunWorkflow","useEffect","WorkflowsTable","DocumentPicker","buildDeepLinkUrl","parseDeepLinkPath","useSetWorkspaceHouseTemplate","useWorkspaces","supportsHouseTemplates","workspaceHouseTemplateId","useHouseTemplateCandidates","contentPath","builtinHouseTemplate","isCandidate","useRegisterOpenDocument","NativeDocxEditor","useQueryClient","useOptionalDocumentTools","loadDocxFonts","arbiQueryKeys"],"mappings":"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","file":"chunk-RA3ZJ45L.cjs","sourcesContent":["/**\n * What a host adds to the connected Word editor that the platform API alone cannot give: the\n * workspace's definitions (facts labelled \"Definitions\"), image generation (an assistant run), the\n * host's leave-page guard, and a comment to open the editor at. Every field is optional; without a\n * provider the editor simply offers less (no Defined term, no Generate image).\n */\n\nimport { createContext, useContext, type ReactNode } from 'react'\nimport type { DefinitionSource } from '../../tags/definitions'\nimport type { DocxImageGeneration } from '../../docx/layout/GenerateImage'\n\nexport interface NativeDocxSupport {\n /** The workspace's definitions. Present: Insert offers Defined term and `@@` the type-ahead. */\n definitions?: () => Promise<DefinitionSource[]>\n /** The platform's image generation. Present: Insert offers Generate image. */\n imageGeneration?: DocxImageGeneration\n /** The open editor has (or no longer has) unsaved changes. */\n onDirtyChange?: (dirty: boolean) => void\n /** A comment thread to open when its document opens (a notification's link). */\n commentTarget?: { documentId: string; commentId: string } | null\n}\n\nconst NativeDocxSupportContext = createContext<NativeDocxSupport>({})\n\nexport function NativeDocxSupportProvider({\n value,\n children,\n}: {\n value: NativeDocxSupport\n children: ReactNode\n}) {\n return (\n <NativeDocxSupportContext.Provider value={value}>{children}</NativeDocxSupportContext.Provider>\n )\n}\n\nexport function useNativeDocxSupport(): NativeDocxSupport {\n return useContext(NativeDocxSupportContext)\n}\n","/**\n * The workflow launcher bound to the connection: the open workspace's folders, labels and files\n * behind its scope and `documents` fields (files can be added right there), and the user's agents\n * behind \"Run as\". The host still says what a launch does (`onLaunch`): open a chat, start a task.\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useAgents, useArbi, useThumbnails } from '@arbidocs/react'\nimport { WorkflowLauncher, type WorkflowLauncherProps } from '../agents/workflows/WorkflowLauncher'\nimport {\n WorkflowDocumentsField,\n type WorkflowDocumentsFieldLabels,\n type WorkflowFieldDocument,\n} from '../agents/workflows/WorkflowDocumentsField'\nimport type { WorkflowScopeSource } from '../agents/workflows/WorkflowConfigDialog'\nimport { buildWorkflowScopeSource, documentScopeLabels } from '../agents/workflows/workspaceScope'\nimport type { AgentOption } from '../agents/workflows/AgentSelect'\nimport type { WorkflowField, WorkflowScope } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedDocuments, useConnectedTags, type ConnectedDocument } from './workspaceData'\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/** A workspace document as a `documents` field offers it. */\nexport function toWorkflowFieldDocument(doc: ConnectedDocument): WorkflowFieldDocument {\n // Pages and tokens are a text-parsing concept: never meaningful for an image.\n const isImage = IMAGE_FILE_TYPES.has((doc.file_type ?? '').toLowerCase())\n return {\n id: doc.external_id,\n title: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n fileName: doc.file_name,\n pages: isImage ? null : (doc.n_pages ?? null),\n tokens: isImage ? null : (doc.tokens ?? null),\n status: doc.status,\n isImage,\n }\n}\n\n/** The open workspace's folders and labels for a workflow's scope field. */\nexport function useConnectedWorkflowScopeSource(): WorkflowScopeSource {\n const { data: docs } = useConnectedDocuments()\n const { data: tags } = useConnectedTags()\n return useMemo(() => buildWorkflowScopeSource(docs, documentScopeLabels(tags)), [docs, tags])\n}\n\n/** The user's agents, for \"Run as\". */\nexport function useConnectedAgentOptions(): AgentOption[] {\n const { data: agents } = useAgents()\n return useMemo(\n () => (agents ?? []).map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n}\n\nexport interface ConnectedWorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** Add files the host's way (its upload dialog). Absent: they are uploaded here. */\n onAddFiles?: (files?: File[]) => void\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\n/**\n * A workflow `documents` field over the open workspace's files: pick, add (or drop) files, see the\n * chosen images. A launcher's or a task composer's `renderDocuments`.\n */\nexport function ConnectedWorkflowDocumentsField({\n field,\n value,\n onChange,\n onAddFiles,\n labels,\n}: ConnectedWorkflowDocumentsFieldProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const { ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: docs, loaded, refetch } = useConnectedDocuments()\n const documents = useMemo(() => docs.map(toWorkflowFieldDocument), [docs])\n const chosen = value.documents ?? []\n const { data: thumbnails } = useThumbnails(chosen, { enabled: (field.max ?? 1) > 1 })\n const input = useRef<HTMLInputElement>(null)\n const [adding, setAdding] = useState(false)\n\n const upload = useCallback(\n async (files: File[]) => {\n setAdding(true)\n try {\n await ensureWorkspaceOpen()\n for (const file of files) await arbi.documents.uploadFile(file, file.name)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : String(error), 'error')\n } finally {\n setAdding(false)\n await refetch?.()\n }\n },\n [arbi, ensureWorkspaceOpen, notify, refetch]\n )\n\n return (\n <>\n {!onAddFiles && (\n <input\n ref={input}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Add files\"\n data-testid=\"workflow-add-files-input\"\n onChange={(e) => {\n const files = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (files.length) void upload(files)\n }}\n />\n )}\n <WorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n documents={documents}\n loaded={loaded}\n thumbnailOf={(id) => thumbnails?.[id]}\n onAddFiles={\n onAddFiles ?? ((files) => (files?.length ? void upload(files) : input.current?.click()))\n }\n adding={adding}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedWorkflowLauncherProps extends Omit<\n WorkflowLauncherProps,\n 'scopeSource' | 'renderDocuments' | 'agents'\n> {\n /** Add files from a `documents` field the host's way (its upload dialog). Absent: uploaded here. */\n onAddFiles?: (files?: File[]) => void\n}\n\nexport function ConnectedWorkflowLauncher({\n onAddFiles,\n ...props\n}: ConnectedWorkflowLauncherProps) {\n const scopeSource = useConnectedWorkflowScopeSource()\n const agents = useConnectedAgentOptions()\n return (\n <WorkflowLauncher\n {...props}\n scopeSource={scopeSource}\n agents={agents}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={onAddFiles}\n />\n )}\n />\n )\n}\n","/**\n * The saved workflows bound to the connection: when each starts, its last run (a link to the thread\n * it created) and next run, who runs it, pause and resume, share, run now, delete (one or many), and\n * the workflow's history. The host opens a workflow (its builder) and its history; threads open\n * through the environment's `openConversation`, failures are told through its `notify`.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useAgents,\n useDeleteWorkflow,\n useRunWorkflow,\n useUpdateWorkflow,\n useWorkflows,\n useWorkspaceUsers,\n type WorkflowResponse,\n} from '@arbidocs/react'\nimport { WorkflowsTable, type WorkflowsTableProps } from '../agents/tasks/WorkflowsTable'\nimport { workflowTriggerType } from '../agents/tasks/workflowRows'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedConversations } from './workspaceData'\n\n/** The viewer's role in the open workspace, and the workspace's members. */\nexport function useConnectedWorkspaceRole() {\n const { workspaceId, live, userId, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: members = [] } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const role = members.find((m) => m.user.external_id === userId)?.role\n return {\n members,\n role,\n /** An owner or a collaborator edits, pauses, resumes and runs what is shared with the workspace. */\n canEditShared: role === 'owner' || role === 'collaborator',\n /** With an item's creator, the only one who deletes it. */\n isWorkspaceOwner: role === 'owner',\n }\n}\n\nexport interface ConnectedWorkflowsTableLabels {\n /** A change (pause, share, delete) that failed without a message. */\n updateFailed: string\n deleteTitle: string\n deleteOne: (name: string) => string\n deleteMany: (count: number) => string\n /** A run that failed: its history has the error report. */\n runFailed: string\n /** A run that created no thread. */\n noThread: string\n /** A document action that started (it has no thread): what is happening. */\n documentAction: (workflow: WorkflowResponse) => string\n untitledTask: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS: ConnectedWorkflowsTableLabels = {\n updateFailed: 'Could not update the workflow',\n deleteTitle: 'Delete workflow',\n deleteOne: (name) => `Delete “${name}”? Threads it already created stay.`,\n deleteMany: (count) => `Delete ${count} workflows? Threads they already created stay.`,\n runFailed: 'The workflow failed. You can send an error report from its history.',\n noThread: 'The workflow did not create a thread.',\n documentAction: (workflow) =>\n workflow.action?.type === 'email_documents'\n ? 'Preparing your document email'\n : 'Reviewing documents',\n untitledTask: 'Untitled thread',\n}\n\ntype TableProps = WorkflowsTableProps<WorkflowResponse>\n\nexport interface ConnectedWorkflowsTableProps extends Omit<\n TableProps,\n | 'workflows'\n | 'isLoading'\n | 'busyId'\n | 'describeTrigger'\n | 'formatDate'\n | 'onToggleActive'\n | 'onToggleShared'\n | 'onDelete'\n | 'onDeleteMany'\n | 'onToggleActiveMany'\n | 'onRun'\n | 'onOpenThread'\n | 'lastRuns'\n | 'agentNames'\n | 'taskNames'\n | 'canEditShared'\n | 'isWorkspaceOwner'\n> {\n /** Which saved workflows to list (e.g. those on a schedule). Default: all. */\n filter?: (workflow: WorkflowResponse) => boolean\n /** When a workflow starts, in the host's words. Default: its trigger type. */\n describeTrigger?: TableProps['describeTrigger']\n formatDate?: TableProps['formatDate']\n connectedLabels?: Partial<ConnectedWorkflowsTableLabels>\n}\n\nconst messageOf = (error: unknown) => (error instanceof Error ? error.message : '')\n\nexport function ConnectedWorkflowsTable({\n filter,\n describeTrigger = (w) => workflowTriggerType(w).replaceAll('_', ' '),\n formatDate = fmtDate,\n onViewRuns,\n connectedLabels,\n ...tableProps\n}: ConnectedWorkflowsTableProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS, ...connectedLabels }\n const { notify, confirm, openConversation } = useBlocksEnvironment()\n const { canEditShared, isWorkspaceOwner } = useConnectedWorkspaceRole()\n const { data: saved = [], isLoading } = useWorkflows({ live: true })\n const { data: conversations, refetch } = useConnectedConversations({ live: true })\n const { data: agents = [] } = useAgents()\n const update = useUpdateWorkflow()\n const remove = useDeleteWorkflow()\n const run = useRunWorkflow()\n const [busyId, setBusyId] = useState<string | null>(null)\n\n const workflows = useMemo(() => (filter ? saved.filter(filter) : saved), [saved, filter])\n // A clock or an event fired a workflow: the thread it created is new to the conversation list.\n const firingStamp = saved.map((w) => `${w.external_id}:${w.last_fired_at ?? ''}`).join('|')\n useEffect(() => {\n void refetch?.()\n }, [firingStamp, refetch])\n\n const lastRuns = useMemo(() => {\n const out: NonNullable<TableProps['lastRuns']> = {}\n for (const c of conversations) {\n const id = c.workflow_ext_id\n if (id && (!out[id] || Date.parse(c.created_at) > Date.parse(out[id].at)))\n out[id] = { conversationId: c.external_id, at: c.created_at, threadStatus: c.status }\n }\n return out\n }, [conversations])\n const agentNames = useMemo(\n () => Object.fromEntries(agents.map((a) => [a.external_id, a.given_name || a.email])),\n [agents]\n )\n const taskNames = useMemo(\n () =>\n Object.fromEntries(\n conversations\n .filter((c) => c.status != null)\n .map((c) => [c.external_id, c.title || l.untitledTask])\n ),\n [conversations, l.untitledTask]\n )\n\n const act = async (workflow: WorkflowResponse, action: () => Promise<unknown>) => {\n setBusyId(workflow.external_id)\n try {\n await action()\n } catch (error) {\n notify(messageOf(error) || l.updateFailed, 'error')\n } finally {\n setBusyId(null)\n }\n }\n const setActive = (workflow: WorkflowResponse, active: boolean) =>\n act(workflow, () => update.mutateAsync({ workflowId: workflow.external_id, patch: { active } }))\n const deleteAll = async (items: WorkflowResponse[]) => {\n if (!items.length) return\n const ok = await confirm({\n title: l.deleteTitle,\n message: items.length === 1 ? l.deleteOne(items[0].name) : l.deleteMany(items.length),\n })\n if (!ok) return\n for (const workflow of items)\n await act(workflow, () => remove.mutateAsync(workflow.external_id))\n }\n\n return (\n <WorkflowsTable\n {...tableProps}\n workflows={workflows}\n isLoading={isLoading}\n busyId={busyId}\n describeTrigger={describeTrigger}\n formatDate={formatDate}\n agentNames={agentNames}\n taskNames={taskNames}\n lastRuns={lastRuns}\n canEditShared={canEditShared}\n isWorkspaceOwner={isWorkspaceOwner}\n onOpenThread={(conversationId) => openConversation(conversationId)}\n onViewRuns={onViewRuns}\n onToggleActive={(workflow, active) => void setActive(workflow, active)}\n onToggleActiveMany={(items, active) => {\n void (async () => {\n for (const workflow of items) await setActive(workflow, active)\n })()\n }}\n onToggleShared={(workflow, shared) =>\n void act(workflow, () =>\n update.mutateAsync({ workflowId: workflow.external_id, patch: { shared } })\n )\n }\n onDelete={(workflow) => void deleteAll([workflow])}\n onDeleteMany={(items) => void deleteAll(items)}\n onRun={(workflow) =>\n void act(workflow, async () => {\n const result = await run.mutateAsync(workflow.external_id)\n if (result.conversation_ext_id) openConversation(result.conversation_ext_id)\n if (result.error) {\n onViewRuns?.(workflow)\n notify(l.runFailed, 'error')\n return\n }\n if (result.execution_id && !result.conversation_ext_id) {\n // A document action runs without a thread: its history shows how it goes.\n onViewRuns?.(workflow)\n notify(l.documentAction(workflow), 'success')\n return\n }\n if (!result.conversation_ext_id) throw new Error(l.noThread)\n })\n }\n />\n )\n}\n","/**\n * The Word editor's references to the workspace's other documents: the documents and their\n * passages (the same parsed passages a fact's citations quote), the ARBI address of a passage\n * (`/wrk-…/doc-…/cnk-…`, the deep link that opens a document at a passage, so the link works from\n * Word too), and opening one wherever the host shows documents, highlighted like a citation.\n */\nimport { useMemo, useRef } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport type { DocxReferencesAdapter } from '../../docx/references/CrossReferences'\nimport { DocumentPicker } from '../../settings/DocumentPicker'\nimport { buildDeepLinkUrl, parseDeepLinkPath } from '../../lib/deep-link'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { toWorkflowFieldDocument } from '../ConnectedWorkflowLauncher'\nimport { useConnectedDocuments, type ConnectedDocument } from '../workspaceData'\n\ninterface ParsedChunk {\n content?: string | null\n metadata?: { chunk_ext_id?: string | null; page_number?: number | null } | null\n}\n\n/** Top-level documents only: an attachment opens with its parent. */\nconst isTopLevel = (doc: ConnectedDocument) => !doc.parent_ext_id\n\nfunction ReferencePicker({\n documents,\n selectedId,\n onSelect,\n}: {\n documents: ConnectedDocument[]\n selectedId: string | null\n onSelect: (documentId: string) => void\n}) {\n const groups = useMemo(() => {\n const docs = documents\n .filter(isTopLevel)\n .map(toWorkflowFieldDocument)\n .sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase()))\n return [{ id: 'all', heading: 'In this workspace', docs }]\n }, [documents])\n const selected = groups[0].docs.find((d) => d.id === selectedId)\n return (\n <DocumentPicker\n groups={groups}\n value={selectedId ?? ''}\n onValueChange={onSelect}\n selected={selected}\n labels={{ placeholder: 'Search documents…' }}\n />\n )\n}\n\nexport function useConnectedDocxReferences(): DocxReferencesAdapter {\n const arbi = useArbi()\n const { workspaceId } = useConnectedWorkspace()\n const { openDocument, runtimeConfig } = useBlocksEnvironment()\n const { data: documents } = useConnectedDocuments()\n // Read when called (the picker, a link): the list grows while the editor is open.\n const documentsRef = useRef(documents)\n documentsRef.current = documents\n return useMemo<DocxReferencesAdapter>(\n () => ({\n documents: async () =>\n documentsRef.current\n .filter(isTopLevel)\n .map((d) => ({ id: d.external_id, title: toWorkflowFieldDocument(d).title })),\n passages: async (documentId) => {\n const parsed = await arbi.documents.getParsedContent(documentId, 'final')\n return ((parsed.chunks ?? []) as ParsedChunk[]).flatMap((chunk) =>\n chunk.metadata?.chunk_ext_id && chunk.content?.trim()\n ? [\n {\n chunkId: chunk.metadata.chunk_ext_id,\n page: chunk.metadata.page_number ?? null,\n text: chunk.content,\n },\n ]\n : []\n )\n },\n linkFor: ({ documentId, chunkId, page }) => {\n const url = buildDeepLinkUrl(\n { workspaceId: workspaceId ?? undefined, documentId, chunkId },\n runtimeConfig.deploymentDomain\n )\n return page ? `${url}?page=${page}` : url\n },\n targetOf: (href) => {\n let url: URL\n try {\n url = new URL(href, window.location.origin)\n } catch {\n return null\n }\n const { documentId, chunkId } = parseDeepLinkPath(url.pathname)\n if (!documentId || !chunkId) return null\n const page = Number(url.searchParams.get('page')) || null\n return { documentId, chunkId, page }\n },\n open: ({ documentId, chunkId, page }) =>\n openDocument(documentId, { passageId: chunkId, page: page ?? undefined }),\n renderDocumentPicker: (onSelect, selectedId) => (\n <ReferencePicker\n documents={documentsRef.current}\n selectedId={selectedId}\n onSelect={onSelect}\n />\n ),\n }),\n [arbi, workspaceId, openDocument, runtimeConfig.deploymentDomain]\n )\n}\n","/**\n * The house template for the open workspace: its own (a document of the workspace), else the\n * deployment's default, else ARBI's built-in legal template. A workspace owner can make a document\n * the house template once the server supports it.\n */\nimport { useMemo } from 'react'\nimport {\n supportsHouseTemplates,\n useArbi,\n useHouseTemplateCandidates,\n useSetWorkspaceHouseTemplate,\n useWorkspaces,\n workspaceHouseTemplateId,\n} from '@arbidocs/react'\nimport { contentPath } from '../../docx/NativeDocxEditor'\nimport {\n builtinHouseTemplate,\n type HouseTemplate,\n type HouseTemplateHost,\n} from '../../docx/template/HouseTemplate'\nimport { isCandidate } from '../../docx/template/candidates'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedWorkspaceRole } from '../ConnectedWorkflowsTable'\n\nexport function useConnectedHouseTemplate(): HouseTemplateHost {\n const arbi = useArbi()\n const { mutateAsync: setWorkspaceTemplate } = useSetWorkspaceHouseTemplate()\n const { workspaceId, live, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: workspaces } = useWorkspaces({ enabled: live })\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const { isWorkspaceOwner } = useConnectedWorkspaceRole()\n const supported = supportsHouseTemplates(workspace)\n const templateId = workspaceHouseTemplateId(workspace)\n // Only an eligible document (shared, Word, here or in a public workspace) is offered as the template.\n const { data: candidates } = useHouseTemplateCandidates(\n workspaceId,\n supported && isWorkspaceOwner\n )\n return useMemo<HouseTemplateHost>(\n () => ({\n load: async (): Promise<HouseTemplate> => {\n if (templateId) {\n await ensureWorkspaceOpen()\n const response = await arbi.editor.request(contentPath(templateId))\n const [record] = await arbi.documents.get([templateId]).catch(() => [])\n return {\n bytes: new Uint8Array(await response.arrayBuffer()),\n name: record?.file_name ?? 'House template.docx',\n source: 'workspace',\n documentId: templateId,\n }\n }\n if (supported) {\n const deployment = await arbi.houseTemplates.deployment()\n if (deployment) return { ...deployment, source: 'deployment' }\n }\n return builtinHouseTemplate()\n },\n setFromDocument:\n supported && isWorkspaceOwner\n ? async (documentId) => {\n await ensureWorkspaceOpen()\n await setWorkspaceTemplate(documentId)\n }\n : undefined,\n isEligible: (documentId) => isCandidate(candidates, documentId),\n }),\n [\n arbi,\n setWorkspaceTemplate,\n supported,\n templateId,\n isWorkspaceOwner,\n candidates,\n ensureWorkspaceOpen,\n ]\n )\n}\n","import { useMemo, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { arbiQueryKeys, useArbi, useWorkspaceUsers } from '@arbidocs/react'\nimport { useOptionalDocumentTools } from '@arbidocs/react/document-tools'\nimport {\n NativeDocxEditor,\n type NativeDocxAdapter,\n type NativeDocxEditorProps,\n} from '../../docx/NativeDocxEditor'\nimport { loadDocxFonts } from '../../docx/fonts'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useNativeDocxSupport } from './support'\nimport { useConnectedDocxReferences } from './useConnectedDocxReferences'\nimport { useConnectedHouseTemplate } from './useConnectedHouseTemplate'\n\nexport type ConnectedNativeDocxEditorProps = Omit<NativeDocxEditorProps, 'adapter'> & {\n fontBaseUrl?: string\n}\n\n/**\n * The native Word editor on the signed-in ARBI session, under any host (a `ConnectionProvider`, or\n * the host's own `ArbiProvider` + session state). Until a live session has opened, a failure to\n * open one falls back to the saved copy, read-only, so the document is still readable; later token\n * refreshes are not guarded (switching modes would drop unsaved edits).\n */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: ConnectedNativeDocxEditorProps) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { workspaceId } = useConnectedWorkspace()\n const { commentTarget } = useNativeDocxSupport()\n const [openFailed, setOpenFailed] = useState(false)\n const hasOpened = useRef(false)\n const guardedAdapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...adapter,\n open: async (documentId) => {\n try {\n const session = await adapter.open(documentId)\n hasOpened.current = true\n return session\n } catch (error) {\n if (!hasOpened.current) setOpenFailed(true)\n throw error\n }\n },\n }),\n [adapter]\n )\n // Drafting mode: the saved Word document being edited is what the chat is about. A history\n // snapshot, a streamed preview, an unsaved draft and an embedded body field are not.\n const live = !props.snapshot && !props.stream && !props.draftContent && !props.compact\n useRegisterOpenDocument({ documentId: live ? props.documentId : null, workspaceId })\n const initialCommentId =\n props.initialCommentId ??\n (commentTarget?.documentId === props.documentId ? commentTarget.commentId : undefined)\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {openFailed && (\n <p role=\"status\" className=\"text-muted-foreground border-b px-3 py-2 text-xs\">\n Co-editing isn&apos;t available for this document right now, so this is a read-only copy\n of the last saved version.\n </p>\n )}\n <div className=\"min-h-0 flex-1\">\n <NativeDocxEditor\n {...props}\n snapshot={props.snapshot || openFailed}\n initialCommentId={initialCommentId}\n adapter={guardedAdapter}\n />\n </div>\n </div>\n )\n}\n\n/** The access token changed (a refresh): the live room is told the new one. */\nfunction tokenChanges(arbi: ReturnType<typeof useArbi>) {\n return (listener: () => void) => {\n if (!arbi.isLoggedIn) return () => {}\n const session = arbi.getClient().session\n let token = session.getState().accessToken\n return session.subscribe((state) => {\n if (state.accessToken === token) return\n token = state.accessToken\n listener()\n })\n }\n}\n\n/**\n * The native Word adapter on the signed-in session: the editor transport, the people to mention,\n * cross-references, the house template, and the host's extras (`NativeDocxSupportProvider`).\n */\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, live, user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const queries = useQueryClient()\n const { notify } = useBlocksEnvironment()\n const tools = useOptionalDocumentTools()\n const support = useNativeDocxSupport()\n const references = useConnectedDocxReferences()\n const houseTemplate = useConnectedHouseTemplate()\n const { data: members } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const onDocumentsChanged = tools?.onDocumentsChanged\n // Tracked changes and comments are authored by the user's first name.\n const author = (live && arbi.user.profile()?.givenName) || user?.name || 'You'\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => loadDocxFonts(fontBaseUrl),\n baseUrl: arbi.getConnectionInfo()?.baseUrl || window.location.origin,\n author,\n subscribeTokenChanges: tokenChanges(arbi),\n onDirtyChange: support.onDirtyChange,\n onVersionSaved: async (id) => {\n // The host's own lists (a documents grid) learn of the new version too.\n const hostRefresh = onDocumentsChanged?.([id], 'version')\n if (workspaceId) {\n const key = arbiQueryKeys.documents(workspaceId)\n try {\n const documents = await arbi.documents.get([id])\n if (!documents.length) throw new Error('The saved version is not available yet.')\n queries.setQueryData<Awaited<ReturnType<typeof arbi.documents.list>>>(\n key,\n (previous) => [\n ...documents,\n ...(previous || []).filter(\n (doc) => !documents.some((saved) => saved.external_id === doc.external_id)\n ),\n ]\n )\n } catch {\n await queries.invalidateQueries({ queryKey: key })\n }\n }\n await hostRefresh\n },\n notify,\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify('Mention delivered.', 'success')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n definitions: support.definitions,\n references,\n imageGeneration: support.imageGeneration,\n houseTemplate,\n }),\n [\n arbi,\n author,\n members,\n ensureWorkspaceOpen,\n fontBaseUrl,\n queries,\n workspaceId,\n notify,\n onDocumentsChanged,\n support,\n references,\n houseTemplate,\n ]\n )\n return adapter\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/provider/dialogs.tsx","../src/provider/BlocksProvider.tsx"],"names":["notifyStore","jsx"],"mappings":"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","file":"chunk-YNIBUKV5.js","sourcesContent":["/**\n * Promise-based prompt dialogs — the blocks replacement for `window.confirm` / `window.alert`.\n * Each call mounts its own short-lived React root, so it works from any event handler with no\n * dialog host in the tree. Hosts reach these through `useBlocksEnvironment().confirm` / `.choose`\n * (the defaults), which lets an app swap in its own dialogs without touching callers.\n *\n * For a confirmation with a loading state, render the declarative {@link ConfirmDialog} instead.\n */\nimport { useState, type ReactElement } from 'react'\nimport { AlertCircle, Info } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../settings/ModalScaffold'\n\ntype ChoiceVariant = 'default' | 'destructive' | 'outline'\n\nexport interface PromptChoice<T extends string> {\n label: string\n value: T\n variant?: ChoiceVariant\n}\n\n/** A dialog offering arbitrary choices (e.g. Overwrite / Skip / Cancel). */\nexport interface ChoiceRequest<T extends string> {\n message: string\n title?: string\n choices: PromptChoice<T>[]\n icon?: 'alert' | 'info'\n /** Dialog test id; each button is `${testId}-${value}-button`. Default `choice-modal`. */\n testId?: string\n}\n\n/**\n * `confirm` — Cancel / Confirm (destructive); `yesno` — No / Yes; `alert` — a single OK\n * (resolves true once acknowledged).\n */\nexport type ConfirmKind = 'confirm' | 'yesno' | 'alert'\n\nexport interface ConfirmRequest {\n message: string\n /** Default: \"Alert\" for `alert`, else \"Confirm\". */\n title?: string\n kind?: ConfirmKind\n}\n\n/** Close animation length before the root is unmounted. */\nconst UNMOUNT_DELAY_MS = 300\n\nfunction PromptDialog<T extends string>({\n request,\n onSettle,\n}: {\n request: ChoiceRequest<T>\n onSettle: (value: T | null) => void\n}): ReactElement {\n const [open, setOpen] = useState(true)\n const { message, title = 'Confirm', choices, icon = 'alert', testId = 'choice-modal' } = request\n const settle = (value: T | null) => {\n setOpen(false)\n onSettle(value)\n }\n return (\n <ModalScaffold\n open={open}\n onOpenChange={(next) => {\n if (!next) settle(null)\n }}\n title={title}\n icon={\n icon === 'info' ? (\n <Info className=\"h-5 w-5 text-blue-text\" aria-hidden=\"true\" />\n ) : (\n <AlertCircle className=\"h-5 w-5\" aria-hidden=\"true\" />\n )\n }\n description={<span className=\"whitespace-pre-line\">{message}</span>}\n showDescription\n testId={testId}\n >\n <ModalScaffold.Footer>\n {choices.map((choice) => (\n <Button\n key={choice.value}\n variant={choice.variant ?? 'default'}\n onClick={() => settle(choice.value)}\n data-testid={`${testId}-${choice.value.toLowerCase()}-button`}\n >\n {choice.label}\n </Button>\n ))}\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n/** Show a choice dialog; resolves with the chosen `value`, or `null` when dismissed. */\nexport function choiceDialog<T extends string>(request: ChoiceRequest<T>): Promise<T | null> {\n if (typeof document === 'undefined') return Promise.resolve(null)\n return new Promise((resolve) => {\n const container = document.createElement('div')\n document.body.appendChild(container)\n let settled = false\n void import('react-dom/client').then(({ createRoot }) => {\n const root = createRoot(container)\n const onSettle = (value: T | null) => {\n if (settled) return\n settled = true\n resolve(value)\n setTimeout(() => {\n root.unmount()\n container.remove()\n }, UNMOUNT_DELAY_MS)\n }\n root.render(<PromptDialog request={request} onSettle={onSettle} />)\n })\n })\n}\n\nconst CONFIRM_CHOICES: Record<\n ConfirmKind,\n PromptChoice<'confirm' | 'cancel' | 'yes' | 'no' | 'ok'>[]\n> = {\n confirm: [\n { label: 'Cancel', value: 'cancel', variant: 'outline' },\n { label: 'Confirm', value: 'confirm', variant: 'destructive' },\n ],\n yesno: [\n { label: 'No', value: 'no', variant: 'outline' },\n { label: 'Yes', value: 'yes' },\n ],\n alert: [{ label: 'OK', value: 'ok' }],\n}\n\nconst CONFIRM_TEST_ID: Record<ConfirmKind, string> = {\n confirm: 'confirmation-modal',\n yesno: 'yes-no-modal',\n alert: 'alert-modal',\n}\n\n/** Show a confirmation; resolves true on Confirm / Yes / OK, false on cancel or dismissal. */\nexport async function confirmDialog(request: ConfirmRequest): Promise<boolean> {\n const kind = request.kind ?? 'confirm'\n const choice = await choiceDialog({\n message: request.message,\n title: request.title ?? (kind === 'alert' ? 'Alert' : 'Confirm'),\n choices: CONFIRM_CHOICES[kind],\n icon: kind === 'alert' ? 'info' : 'alert',\n testId: CONFIRM_TEST_ID[kind],\n })\n return choice === 'confirm' || choice === 'yes' || choice === 'ok'\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport {\n notify as notifyStore,\n type NotifyOptions,\n type NotifyVariant,\n} from '@arbidocs/react/shell'\nimport type { BlockLinkComponent } from '../components/blockLink'\nimport { choiceDialog, confirmDialog, type ChoiceRequest, type ConfirmRequest } from './dialogs'\n\n/** What blocks need from the host's runtime configuration (the app's `config.json`). */\nexport interface BlocksRuntimeConfig {\n /** Origin of the ARBI API; `''` means the page's own origin. */\n apiBaseUrl: string\n /** The deployment's domain, e.g. `www.arbidocs.com` (deep links, key derivation, labels). */\n deploymentDomain: string\n}\n\nexport interface OpenDocumentOptions {\n /** 1-based page to scroll to. */\n page?: number\n /** Passage (chunk) to highlight. */\n passageId?: string\n}\n\n/**\n * The only way blocks reach the host app's environment. Blocks never import a router, a toast\n * library or an app store; the host injects what it has, and every field has a safe default so a\n * block renders correctly with no provider at all. A nested provider overrides only the fields\n * it is given and inherits the rest.\n */\nexport interface BlocksEnvironment {\n /** Router-aware link (keeps navigation in-SPA). Default: a plain `<a href>`. */\n linkComponent?: BlockLinkComponent\n /** Imperative navigation for buttons and keyboard shortcuts. Default: `window.location.assign`. */\n navigate: (href: string) => void\n /** Surface a transient message (and record it in the notification centre). Default: the shared\n * `@arbidocs/react` notify store, rendered by its `<Toaster/>`. */\n notify: (message: ReactNode, kind?: NotifyVariant, options?: NotifyOptions) => void\n /** Ask the user to confirm. Default: the blocks prompt dialog. */\n confirm: (request: ConfirmRequest) => Promise<boolean>\n /** Ask the user to pick one of several choices; `null` when dismissed. Default: the blocks\n * prompt dialog. */\n choose: <T extends string>(request: ChoiceRequest<T>) => Promise<T | null>\n /** Deployment configuration. Default: same-origin API on the page's own host. */\n runtimeConfig: BlocksRuntimeConfig\n /** Open a document (optionally at a page / passage) wherever the host shows documents.\n * Default: no-op. */\n openDocument: (documentId: string, options?: OpenDocumentOptions) => void\n /** Open a conversation thread, optionally scrolled to a message. Default: no-op. */\n openConversation: (conversationId: string, options?: { messageId?: string }) => void\n /** Open the user's settings, optionally at a section. Default: no-op. */\n openSettings: (section?: string) => void\n /** Open a project. Default: no-op. */\n openProject: (projectId: string) => void\n}\n\nconst noop = () => {}\n\nconst defaultEnvironment: BlocksEnvironment = {\n navigate: (href) => {\n if (typeof window !== 'undefined') window.location.assign(href)\n },\n notify: (message, kind = 'info', options) => {\n notifyStore[kind](message, options)\n },\n confirm: confirmDialog,\n choose: choiceDialog,\n runtimeConfig: {\n apiBaseUrl: '',\n deploymentDomain: typeof window !== 'undefined' ? window.location.host : '',\n },\n openDocument: noop,\n openConversation: noop,\n openSettings: noop,\n openProject: noop,\n}\n\nconst BlocksContext = createContext<BlocksEnvironment>(defaultEnvironment)\n\nexport interface BlocksProviderProps extends Partial<BlocksEnvironment> {\n children: ReactNode\n}\n\nexport function BlocksProvider({\n children,\n linkComponent,\n navigate,\n notify,\n confirm,\n choose,\n runtimeConfig,\n openDocument,\n openConversation,\n openSettings,\n openProject,\n}: BlocksProviderProps) {\n const parent = useContext(BlocksContext)\n const value = useMemo<BlocksEnvironment>(\n () => ({\n linkComponent: linkComponent ?? parent.linkComponent,\n navigate: navigate ?? parent.navigate,\n notify: notify ?? parent.notify,\n confirm: confirm ?? parent.confirm,\n choose: choose ?? parent.choose,\n runtimeConfig: runtimeConfig ?? parent.runtimeConfig,\n openDocument: openDocument ?? parent.openDocument,\n openConversation: openConversation ?? parent.openConversation,\n openSettings: openSettings ?? parent.openSettings,\n openProject: openProject ?? parent.openProject,\n }),\n [\n parent,\n linkComponent,\n navigate,\n notify,\n confirm,\n choose,\n runtimeConfig,\n openDocument,\n openConversation,\n openSettings,\n openProject,\n ]\n )\n return <BlocksContext.Provider value={value}>{children}</BlocksContext.Provider>\n}\n\nexport function useBlocksEnvironment(): BlocksEnvironment {\n return useContext(BlocksContext)\n}\n"]}