@arbidocs/blocks 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +25 -0
  2. package/dist/agents/definitions/AgentCreator.d.ts +11 -2
  3. package/dist/agents/definitions/index.d.ts +1 -0
  4. package/dist/agents/definitions/persona.d.ts +16 -0
  5. package/dist/agents/index.cjs +202 -150
  6. package/dist/agents/index.js +6 -6
  7. package/dist/agents/tasks/TaskRunsDialog.d.ts +15 -3
  8. package/dist/agents/tasks/index.d.ts +1 -0
  9. package/dist/agents/tasks/taskRequest.d.ts +61 -0
  10. package/dist/artifacts/ArtifactCompareBar.d.ts +33 -0
  11. package/dist/artifacts/ArtifactEditor.d.ts +64 -0
  12. package/dist/artifacts/ArtifactEditorBody.d.ts +34 -0
  13. package/dist/artifacts/ArtifactRedlineView.d.ts +57 -0
  14. package/dist/artifacts/ArtifactToolbar.d.ts +53 -0
  15. package/dist/artifacts/ArtifactVersionBar.d.ts +42 -0
  16. package/dist/{files → artifacts}/RedlineParts.d.ts +4 -0
  17. package/dist/artifacts/editor/ArtifactMarkdownEditor.d.ts +39 -0
  18. package/dist/artifacts/editor/index.cjs +89 -0
  19. package/dist/artifacts/editor/index.cjs.map +1 -0
  20. package/dist/artifacts/editor/index.d.ts +1 -0
  21. package/dist/artifacts/editor/index.js +86 -0
  22. package/dist/artifacts/editor/index.js.map +1 -0
  23. package/dist/artifacts/index.cjs +807 -0
  24. package/dist/artifacts/index.cjs.map +1 -0
  25. package/dist/artifacts/index.d.ts +8 -0
  26. package/dist/artifacts/index.js +787 -0
  27. package/dist/artifacts/index.js.map +1 -0
  28. package/dist/chat/index.cjs +54 -54
  29. package/dist/chat/index.js +2 -2
  30. package/dist/{chunk-XKKGGUU2.cjs → chunk-3MIQASHO.cjs} +4 -4
  31. package/dist/{chunk-XKKGGUU2.cjs.map → chunk-3MIQASHO.cjs.map} +1 -1
  32. package/dist/{chunk-B673CCW5.js → chunk-3PJCET7H.js} +3 -3
  33. package/dist/{chunk-B673CCW5.js.map → chunk-3PJCET7H.js.map} +1 -1
  34. package/dist/{chunk-VXOGANFJ.cjs → chunk-3PZPRAAR.cjs} +189 -34
  35. package/dist/chunk-3PZPRAAR.cjs.map +1 -0
  36. package/dist/{chunk-AAY5ASZD.js → chunk-5XTZFH65.js} +170 -28
  37. package/dist/chunk-5XTZFH65.js.map +1 -0
  38. package/dist/{chunk-JPO3F4J7.js → chunk-6YHWXMPQ.js} +3 -3
  39. package/dist/{chunk-JPO3F4J7.js.map → chunk-6YHWXMPQ.js.map} +1 -1
  40. package/dist/{chunk-TYZUCAT7.js → chunk-7YADKWZT.js} +43 -6
  41. package/dist/chunk-7YADKWZT.js.map +1 -0
  42. package/dist/{chunk-SYDHKKRZ.cjs → chunk-IZHWP6WQ.cjs} +47 -5
  43. package/dist/chunk-IZHWP6WQ.cjs.map +1 -0
  44. package/dist/{chunk-ZVPTFTGV.cjs → chunk-MVNCQDDE.cjs} +4 -4
  45. package/dist/{chunk-ZVPTFTGV.cjs.map → chunk-MVNCQDDE.cjs.map} +1 -1
  46. package/dist/{chunk-NJL4LIXX.js → chunk-NPKGUQU5.js} +4 -4
  47. package/dist/{chunk-NJL4LIXX.js.map → chunk-NPKGUQU5.js.map} +1 -1
  48. package/dist/{chunk-ATXPAD6S.cjs → chunk-YLOKCIQJ.cjs} +3 -3
  49. package/dist/{chunk-ATXPAD6S.cjs.map → chunk-YLOKCIQJ.cjs.map} +1 -1
  50. package/dist/collaboration/contacts/AddContactsParts.d.ts +9 -4
  51. package/dist/collaboration/contacts/index.d.ts +1 -0
  52. package/dist/collaboration/contacts/parseEmails.d.ts +26 -0
  53. package/dist/collaboration/index.cjs +51 -31
  54. package/dist/collaboration/index.js +1 -1
  55. package/dist/connect/index.cjs +18 -18
  56. package/dist/connect/index.js +4 -4
  57. package/dist/facts/index.cjs +1 -1
  58. package/dist/facts/index.js +1 -1
  59. package/dist/files/ViewerChrome.d.ts +0 -45
  60. package/dist/files/ViewerParts.d.ts +0 -19
  61. package/dist/files/index.cjs +4 -436
  62. package/dist/files/index.cjs.map +1 -1
  63. package/dist/files/index.d.ts +2 -4
  64. package/dist/files/index.js +8 -428
  65. package/dist/files/index.js.map +1 -1
  66. package/dist/home/index.cjs +19 -19
  67. package/dist/home/index.js +4 -4
  68. package/dist/index.cjs +411 -339
  69. package/dist/index.js +13 -13
  70. package/dist/settings/index.cjs +3 -3
  71. package/dist/settings/index.js +3 -3
  72. package/dist/shell/index.cjs +10 -10
  73. package/dist/shell/index.js +2 -2
  74. package/dist/site/index.cjs +5 -5
  75. package/dist/site/index.js +1 -1
  76. package/dist/studio/index.cjs +8 -8
  77. package/dist/studio/index.js +6 -6
  78. package/package.json +25 -4
  79. package/dist/chunk-AAY5ASZD.js.map +0 -1
  80. package/dist/chunk-SYDHKKRZ.cjs.map +0 -1
  81. package/dist/chunk-TYZUCAT7.js.map +0 -1
  82. package/dist/chunk-VXOGANFJ.cjs.map +0 -1
  83. /package/dist/{files → artifacts}/VersionTimeline.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/artifacts/ArtifactCompareBar.tsx","../../src/artifacts/ArtifactEditorBody.tsx","../../src/artifacts/ArtifactToolbar.tsx","../../src/artifacts/ArtifactVersionBar.tsx","../../src/artifacts/ArtifactEditor.tsx","../../src/artifacts/RedlineParts.tsx","../../src/artifacts/ArtifactRedlineView.tsx","../../src/artifacts/VersionTimeline.tsx"],"names":["jsx","cn","jsxs","Fragment","X","Button","GitCompare","ArrowLeftRight","Loader2","History","Eye"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { ArrowLeftRight, Eye, EyeOff, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the compare bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactCompareBarLabels {\n compareVs: string\n trackChanges: string\n trackChangesBack: string\n trackChangesView: string\n flipComparison: string\n stopComparing: string\n}\n\nexport const DEFAULT_ARTIFACT_COMPARE_BAR_LABELS: ArtifactCompareBarLabels = {\n compareVs: 'Compare vs.',\n trackChanges: 'Track changes',\n trackChangesBack: 'Back to editing (your comparison stays active)',\n trackChangesView: 'View tracked changes against Compare vs.',\n flipComparison: 'Flip comparison direction',\n stopComparing: 'Stop comparing',\n}\n\nexport interface ArtifactCompareBarTestIds {\n trackChanges: string\n}\n\nexport interface ArtifactCompareBarProps {\n /** The compared-against version (the host renders its name or pill). */\n compareTarget: ReactNode\n /** \"v2\": which version it is, when every version shares one file name. */\n versionLabel?: string | null\n /** An editable artifact toggles Track changes; a read-only comparison gets a flip arrow. */\n mode: 'track-changes' | 'flip'\n showTrackChanges: boolean\n onToggleTrackChanges: () => void\n onFlip: () => void\n onStop: () => void\n labels?: Partial<ArtifactCompareBarLabels>\n testIds?: Partial<ArtifactCompareBarTestIds>\n}\n\nconst barButton =\n 'inline-flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5'\n\n/**\n * \"Compare vs. [version]\" row contents: always an explicit text label (an icon-only pill was\n * unclear), with Track changes or Flip, and Stop comparing.\n */\nexport function ArtifactCompareBar({\n compareTarget,\n versionLabel,\n mode,\n showTrackChanges,\n onToggleTrackChanges,\n onFlip,\n onStop,\n labels,\n testIds,\n}: ArtifactCompareBarProps) {\n const l = { ...DEFAULT_ARTIFACT_COMPARE_BAR_LABELS, ...labels }\n return (\n <>\n <span className=\"shrink-0 text-sm text-muted-foreground\">{l.compareVs}</span>\n {compareTarget}\n {versionLabel && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{versionLabel}</span>\n )}\n {mode === 'track-changes' ? (\n <button\n type=\"button\"\n onClick={onToggleTrackChanges}\n aria-pressed={showTrackChanges}\n className={cn(\n barButton,\n showTrackChanges\n ? 'bg-accent text-accent-foreground hover:bg-accent/70'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={showTrackChanges ? l.trackChangesBack : l.trackChangesView}\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-toggle' })}\n >\n {showTrackChanges ? (\n <Eye className=\"size-3.5\" aria-hidden />\n ) : (\n <EyeOff className=\"size-3.5\" aria-hidden />\n )}\n {l.trackChanges}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onFlip}\n className={cn(\n barButton,\n 'p-1 text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" aria-hidden />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onStop}\n className={cn(\n barButton,\n 'ml-auto text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.stopComparing}\n >\n <X className=\"size-3\" aria-hidden />\n {l.stopComparing}\n </button>\n </>\n )\n}\n","import { useCallback, type KeyboardEvent, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\n\nexport interface ArtifactEditorBodyTestIds {\n /** The read-only rendered document. */\n rendered: string\n /** The track-changes panel. */\n trackChanges: string\n}\n\nexport interface ArtifactEditorBodyProps {\n /** The saved markdown, shown rendered while not editing. */\n content: string\n isEditing: boolean\n /** A comparison is active. */\n comparing: boolean\n /** Show the track-changes panel instead of the editor (needs `comparing`). */\n showTrackChanges: boolean\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Mod+S while editing; omit to leave the shortcut to the browser. */\n onSave?: () => void\n /** Mod+S only saves when this is true (there are changes and no save is running). */\n canSave?: boolean\n className?: string\n testIds?: Partial<ArtifactEditorBodyTestIds>\n}\n\n/**\n * The body of an artifact: the rendered document when reading, the editor when editing, and the\n * track-changes panel in its place while comparing. It is either typing or reviewing, never both\n * stacked, as in Word's Show Markup. Mod+S saves from anywhere inside it.\n */\nexport function ArtifactEditorBody({\n content,\n isEditing,\n comparing,\n showTrackChanges,\n editor,\n redline,\n renderMarkdown,\n onSave,\n canSave = true,\n className,\n testIds,\n}: ArtifactEditorBodyProps) {\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isEditing || !onSave) return\n if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === 's') {\n e.preventDefault()\n if (canSave) onSave()\n }\n },\n [isEditing, onSave, canSave]\n )\n\n const tracking = isEditing && comparing && showTrackChanges\n return (\n // The key handler only listens to bubbling keystrokes of the editor inside; the editor itself\n // is the focusable element.\n <div\n data-slot=\"artifact-body\"\n className={cn('h-full min-h-0 overflow-auto', className)}\n onKeyDown={onKeyDown}\n >\n {!isEditing ? (\n <div\n className=\"p-6\"\n data-slot=\"artifact-rendered\"\n data-testid={testIdOr(testIds?.rendered, { testId: 'document-rendered-markdown' })}\n >\n {renderMarkdown(content)}\n </div>\n ) : tracking ? (\n <div\n className=\"h-full\"\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-panel' })}\n >\n {redline}\n </div>\n ) : (\n editor\n )}\n </div>\n )\n}\n","import { Check, GitCompare, Loader2, Pencil, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the toolbar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactToolbarLabels {\n /** The accessible name of the group of actions. */\n group: string\n edit: string\n cancel: string\n cancelTitle: string\n compare: string\n compareTitle: string\n saveDocument: string\n saveAsVersion: string\n noChanges: string\n saving: string\n save: string\n saveVersion: string\n /** Announced (not shown) when there are unsaved changes. */\n unsaved: string\n}\n\nexport const DEFAULT_ARTIFACT_TOOLBAR_LABELS: ArtifactToolbarLabels = {\n group: 'Document actions',\n edit: 'Edit',\n cancel: 'Cancel',\n cancelTitle: 'Cancel editing',\n compare: 'Compare',\n compareTitle: 'Compare against the previous version',\n saveDocument: 'Save document',\n saveAsVersion: 'Save as a new version',\n noChanges: 'No changes to save',\n saving: 'Saving…',\n save: 'Save',\n saveVersion: 'Save version',\n unsaved: 'Unsaved changes',\n}\n\nexport interface ArtifactToolbarTestIds {\n edit: string\n cancel: string\n compare: string\n save: string\n unsavedDot: string\n}\n\nexport interface ArtifactToolbarProps {\n isEditing: boolean\n /** A new document that has no earlier version: \"Save\" instead of \"Save version\", no Cancel. */\n isDraft?: boolean\n /** Narrow panel: icon-only Edit and Compare. Save keeps its label. */\n compact?: boolean\n /** The buffer differs from the saved version. */\n hasChanges: boolean\n isSaving: boolean\n /** Offer \"Compare against the previous version\". */\n canCompare: boolean\n onStartEdit: () => void\n /** Discard the buffer and leave edit mode. */\n onCancel: () => void\n onCompare: () => void\n /** Save the buffer as a NEW version. */\n onSave: () => void\n className?: string\n labels?: Partial<ArtifactToolbarLabels>\n testIds?: Partial<ArtifactToolbarTestIds>\n}\n\n/**\n * Edit, Cancel (discard), Compare and Save for an artifact. Save is the ONE filled button and only\n * once there is something to save; a dot marks unsaved changes and a polite status announces them.\n * Touch targets are 44px on coarse pointers.\n */\nexport function ArtifactToolbar({\n isEditing,\n isDraft = false,\n compact = false,\n hasChanges,\n isSaving,\n canCompare,\n onStartEdit,\n onCancel,\n onCompare,\n onSave,\n className,\n labels,\n testIds,\n}: ArtifactToolbarProps) {\n const l = { ...DEFAULT_ARTIFACT_TOOLBAR_LABELS, ...labels }\n const group = (children: React.ReactNode): React.ReactElement => (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-toolbar\"\n className={cn('flex items-center gap-2', compact && 'gap-1', className)}\n >\n {children}\n </div>\n )\n\n if (!isEditing) {\n return group(\n <Button\n onClick={onStartEdit}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.edit}\n aria-label={l.edit}\n data-testid={testIdOr(testIds?.edit, { testId: 'edit-document-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <Pencil className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.edit}</span>}\n </Button>\n )\n }\n return group(\n <>\n {/* A draft has no Cancel: the panel's own Close is the one way out (it warns first). */}\n {!isDraft && (\n <Button\n onClick={onCancel}\n variant=\"outline\"\n size=\"sm\"\n title={l.cancelTitle}\n data-testid={testIdOr(testIds?.cancel, { testId: 'cancel-edit-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <X className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.cancel}</span>\n </Button>\n )}\n {canCompare && (\n <Button\n onClick={onCompare}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.compareTitle}\n aria-label={l.compare}\n data-testid={testIdOr(testIds?.compare, { testId: 'compare-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <GitCompare className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.compare}</span>}\n </Button>\n )}\n <div className=\"relative\">\n <Button\n onClick={onSave}\n variant={hasChanges ? 'default' : 'outline'}\n size=\"sm\"\n title={hasChanges ? (isDraft ? l.saveDocument : l.saveAsVersion) : l.noChanges}\n disabled={!hasChanges || isSaving}\n data-testid={testIdOr(testIds?.save, { testId: 'save-document-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Check className=\"size-4\" aria-hidden />\n )}\n <span className=\"ml-1\">{isSaving ? l.saving : isDraft ? l.save : l.saveVersion}</span>\n </Button>\n {hasChanges && !isSaving && (\n <span\n className=\"absolute -right-1 -top-1 size-2.5 rounded-full bg-primary ring-2 ring-background\"\n aria-hidden\n data-testid={testIdOr(testIds?.unsavedDot, { testId: 'unsaved-changes-dot' })}\n />\n )}\n </div>\n <span role=\"status\" className=\"sr-only\">\n {hasChanges && !isSaving ? l.unsaved : ''}\n </span>\n </>\n )\n}\n","import { GitCompare, History } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { VersionEntry } from './VersionTimeline'\n\n/** Every fixed string of the version bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactVersionBarLabels {\n group: string\n /** \"Version 2 of 3\". */\n position: (index: number, total: number) => string\n /** The only version: nothing to choose from yet. */\n only: string\n latest: string\n select: string\n option: (index: number, date: string, isCurrent: boolean) => string\n compare: string\n compareTitle: string\n}\n\nexport const DEFAULT_ARTIFACT_VERSION_BAR_LABELS: ArtifactVersionBarLabels = {\n group: 'Versions',\n position: (index, total) => `Version ${index} of ${total}`,\n only: 'Version 1',\n latest: 'Latest',\n select: 'Open a version',\n option: (index, date, isCurrent) => `Version ${index} · ${date}${isCurrent ? ' (open)' : ''}`,\n compare: 'Compare with previous',\n compareTitle: 'Compare this version against the one it was saved from',\n}\n\nexport interface ArtifactVersionBarTestIds {\n root: string\n position: string\n select: string\n compare: string\n}\n\nexport interface ArtifactVersionBarProps {\n /** The lineage, oldest first. */\n versions: VersionEntry[]\n /** The open version. */\n currentId: string\n formatDate: (iso: string) => string\n /** Open another version (selected from the list). */\n onOpen: (id: string) => void\n /** Compare the open version with the one before it. Omit to hide the button. */\n onCompare?: () => void\n className?: string\n labels?: Partial<ArtifactVersionBarLabels>\n testIds?: Partial<ArtifactVersionBarTestIds>\n}\n\n/**\n * Where you are in an artifact's versions: \"Version 2 of 3\", a list to open any version, and\n * Compare with the previous one. Saving a new version is the toolbar's Save button; the editor\n * lays the two out on one row. The list is a native select: it is keyboard and screen-reader\n * complete and uses the phone's own picker.\n */\nexport function ArtifactVersionBar({\n versions,\n currentId,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: ArtifactVersionBarProps) {\n const l = { ...DEFAULT_ARTIFACT_VERSION_BAR_LABELS, ...labels }\n const index = versions.findIndex((v) => v.id === currentId)\n const isLatest = index === versions.length - 1\n return (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-version-bar\"\n className={cn('flex min-w-0 flex-wrap items-center gap-2 text-sm', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-version-bar' })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span\n className=\"shrink-0 font-medium text-foreground\"\n data-testid={testIdOr(testIds?.position, { testId: 'artifact-version-position' })}\n >\n {versions.length > 1 && index >= 0 ? l.position(index + 1, versions.length) : l.only}\n </span>\n {versions.length > 1 && index >= 0 && isLatest && (\n <span className=\"shrink-0 rounded-full bg-accent px-2 py-0.5 text-xs font-medium text-accent-foreground\">\n {l.latest}\n </span>\n )}\n {versions.length > 1 && (\n <select\n aria-label={l.select}\n value={currentId}\n onChange={(e) => onOpen(e.target.value)}\n className=\"min-w-0 max-w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:text-base\"\n data-testid={testIdOr(testIds?.select, { testId: 'artifact-version-select' })}\n >\n {versions.map((v, i) => (\n <option key={v.id} value={v.id}>\n {l.option(i + 1, formatDate(v.createdAt), v.id === currentId)}\n </option>\n ))}\n </select>\n )}\n {onCompare && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCompare}\n title={l.compareTitle}\n className=\"pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare, { testId: 'artifact-version-compare' })}\n >\n <GitCompare className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.compare}</span>\n </Button>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ArtifactCompareBar, type ArtifactCompareBarLabels } from './ArtifactCompareBar'\nimport { ArtifactEditorBody, type ArtifactEditorBodyTestIds } from './ArtifactEditorBody'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\nimport { ArtifactToolbar, type ArtifactToolbarLabels } from './ArtifactToolbar'\nimport {\n ArtifactVersionBar,\n type ArtifactVersionBarLabels,\n type ArtifactVersionBarTestIds,\n} from './ArtifactVersionBar'\nimport type { VersionEntry } from './VersionTimeline'\n\nexport interface ArtifactEditorLabels {\n toolbar: Partial<ArtifactToolbarLabels>\n versions: Partial<ArtifactVersionBarLabels>\n compare: Partial<ArtifactCompareBarLabels>\n}\n\nexport interface ArtifactEditorTestIds {\n root: string\n compareRow: string\n body: Partial<ArtifactEditorBodyTestIds>\n versions: Partial<ArtifactVersionBarTestIds>\n}\n\nexport interface ArtifactEditorProps {\n /** The saved markdown of the open version. */\n content: string\n isEditing: boolean\n hasChanges: boolean\n isSaving: boolean\n isDraft?: boolean\n /** Narrow container: icon-only Edit and Compare. */\n compact?: boolean\n canCompare: boolean\n /** A comparison is active. */\n comparing: boolean\n /** The version being compared against. */\n compareId?: string | null\n showTrackChanges: boolean\n /** The lineage, oldest first. The version bar shows only for two or more. */\n versions?: VersionEntry[]\n currentVersionId?: string\n onStartEdit: () => void\n onCancel: () => void\n /** Save the buffer as a new version. */\n onSave: () => void\n onCompare: () => void\n onStopCompare: () => void\n onToggleTrackChanges: () => void\n /** Open another version from the version list. */\n onOpenVersion?: (id: string) => void\n formatDate?: (iso: string) => string\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Extra actions in the header (share, download...). */\n actions?: ReactNode\n className?: string\n labels?: Partial<ArtifactEditorLabels>\n testIds?: Partial<ArtifactEditorTestIds>\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const date = new Date(iso)\n return Number.isNaN(date.getTime()) ? iso : date.toLocaleString()\n}\n\n/**\n * The artifact surface: a header with the version bar and the toolbar (Edit, Cancel, Compare,\n * Save as a new version), a compare row while comparing, and the body (read, edit or track\n * changes). Everything is view-model driven: a host binds state with `useArtifactSession` from\n * `@arbidocs/react/artifacts` and passes the editor and redline as slots.\n */\nexport function ArtifactEditor({\n content,\n isEditing,\n hasChanges,\n isSaving,\n isDraft = false,\n compact = false,\n canCompare,\n comparing,\n compareId,\n showTrackChanges,\n versions = [],\n currentVersionId = '',\n onStartEdit,\n onCancel,\n onSave,\n onCompare,\n onStopCompare,\n onToggleTrackChanges,\n onOpenVersion,\n formatDate = defaultFormatDate,\n editor,\n redline,\n renderMarkdown,\n actions,\n className,\n labels,\n testIds,\n}: ArtifactEditorProps) {\n const compared = versions.findIndex((v) => v.id === compareId)\n return (\n <div\n data-slot=\"artifact-editor\"\n className={cn('flex h-full max-h-dvh min-h-0 flex-col bg-background', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-editor' })}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-b border-border px-3 py-2\">\n {versions.length > 0 && onOpenVersion ? (\n <ArtifactVersionBar\n versions={versions}\n currentId={currentVersionId}\n formatDate={formatDate}\n onOpen={onOpenVersion}\n onCompare={canCompare ? onCompare : undefined}\n labels={labels?.versions}\n testIds={testIds?.versions}\n />\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <ArtifactToolbar\n isEditing={isEditing}\n isDraft={isDraft}\n compact={compact}\n hasChanges={hasChanges}\n isSaving={isSaving}\n // The version bar already carries Compare when it is shown.\n canCompare={canCompare && !(versions.length > 0 && onOpenVersion)}\n onStartEdit={onStartEdit}\n onCancel={onCancel}\n onCompare={onCompare}\n onSave={onSave}\n labels={labels?.toolbar}\n />\n {actions}\n </div>\n </div>\n {comparing && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'artifact-compare-row' })}\n >\n <ArtifactCompareBar\n compareTarget={\n <span className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {compared >= 0 ? versions[compared].name : ''}\n </span>\n }\n versionLabel={compared >= 0 && versions.length > 1 ? `v${compared + 1}` : null}\n mode=\"track-changes\"\n showTrackChanges={showTrackChanges}\n onToggleTrackChanges={onToggleTrackChanges}\n onFlip={onStopCompare}\n onStop={onStopCompare}\n labels={labels?.compare}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n <ArtifactEditorBody\n content={content}\n isEditing={isEditing}\n comparing={comparing}\n showTrackChanges={showTrackChanges}\n editor={editor}\n redline={redline}\n renderMarkdown={renderMarkdown}\n onSave={onSave}\n canSave={hasChanges && !isSaving}\n testIds={testIds?.body}\n />\n </div>\n </div>\n )\n}\n","import type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react'\nimport { ArrowLeftRight, Undo2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the redline parts. Pass a partial `labels` to translate or reword. */\nexport interface RedlineLabels {\n flipComparison: string\n noDocument: string\n noChangesYet: string\n identical: string\n unavailable: string\n revertMove: string\n revertReplace: string\n revertAdd: string\n revertRemove: string\n /** The accessible name of the redline region. */\n tracked: string\n /** Announced while the diff computes. */\n computing: string\n}\n\nexport const DEFAULT_REDLINE_LABELS: RedlineLabels = {\n flipComparison: 'Flip comparison',\n noDocument: 'No document selected for comparison.',\n noChangesYet: 'No changes yet — start editing to see redlined differences here.',\n identical: 'Documents are identical.',\n unavailable: 'Document text not available for comparison.',\n revertMove: 'Undo this move (revert both ends)',\n revertReplace: 'Undo this edit',\n revertAdd: 'Undo this insertion',\n revertRemove: 'Undo this deletion',\n tracked: 'Tracked changes',\n computing: 'Comparing…',\n}\n\nexport type RedlineRegionKind = 'replace' | 'remove' | 'add' | 'move'\n\n// ── Frame ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineFrameProps {\n /** Optional header row (see RedlineHeader). */\n header?: ReactNode\n children: ReactNode\n}\n\n/** Column shell for a redline: optional header, scrolling body. */\nexport function RedlineFrame({ header, children }: RedlineFrameProps) {\n return (\n <div className=\"flex h-full flex-col\" data-slot=\"redline-frame\">\n {header}\n <div className=\"flex-1 overflow-auto text-sm leading-relaxed\">{children}</div>\n </div>\n )\n}\n\nexport interface RedlineHeaderProps {\n /** The base document pill. */\n base: ReactNode\n /** The compared document pill. */\n compare?: ReactNode\n onFlip: () => void\n labels?: Partial<RedlineLabels>\n}\n\n/** \"Base ⇄ Compare\" row with the flip control. */\nexport function RedlineHeader({ base, compare, onFlip, labels }: RedlineHeaderProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n return (\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border bg-muted px-3 py-2\">\n {base}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0 pointer-coarse:size-11\"\n onClick={onFlip}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" />\n </Button>\n {compare}\n </div>\n )\n}\n\nexport type RedlineStatusKind = 'idle' | 'identical' | 'unavailable'\n\n/** A centred status line for the redline body (nothing to diff). */\nexport function RedlineStatus({\n kind,\n reviewMode,\n labels,\n}: {\n kind: RedlineStatusKind\n /** Accept/reject mode: \"identical\" means no edits yet. */\n reviewMode?: boolean\n labels?: Partial<RedlineLabels>\n}) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const text =\n kind === 'idle'\n ? l.noDocument\n : kind === 'identical'\n ? reviewMode\n ? l.noChangesYet\n : l.identical\n : l.unavailable\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {text}\n </div>\n )\n}\n\n/** Centres a loading indicator while the diff computes. */\nexport function RedlineComputing({ children }: { children: ReactNode }) {\n return <div className=\"flex h-full items-center justify-center\">{children}</div>\n}\n\n// ── Document + marks ────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineDocumentProps {\n /** Rendered redline markdown. */\n children: ReactNode\n /** Ref to the rendered body (the host measures change positions from it). */\n bodyRef?: Ref<HTMLDivElement>\n /** Margin gutter (revert buttons) shown in accept/reject mode. */\n gutter?: ReactNode\n}\n\nexport function RedlineDocument({ children, bodyRef, gutter }: RedlineDocumentProps) {\n return (\n <div className=\"relative\">\n <div ref={bodyRef} className=\"mx-auto max-w-3xl px-6 py-4 pr-14\">\n {children}\n </div>\n {gutter}\n </div>\n )\n}\n\nconst MARK_TONE = {\n del: {\n base: 'font-semibold text-red-600 line-through decoration-2 dark:text-red-400',\n move: 'font-semibold text-emerald-600 line-through decoration-2 dark:text-emerald-400',\n },\n ins: {\n base: 'font-semibold text-blue-600 underline decoration-2 dark:text-blue-400',\n move: 'font-semibold text-emerald-600 underline decoration-2 dark:text-emerald-400',\n },\n} as const\n\n/** `<del>` / `<ins>` for the markdown renderer: red strike, blue underline, green for moves. */\nexport function RedlineMark({\n as: Tag,\n isMove,\n children,\n ...props\n}: (ComponentPropsWithoutRef<'del'> | ComponentPropsWithoutRef<'ins'>) & {\n as: 'del' | 'ins'\n isMove: boolean\n}) {\n const cls = MARK_TONE[Tag][isMove ? 'move' : 'base']\n return (\n <Tag className={cls} {...props}>\n {children}\n </Tag>\n )\n}\n\n// ── Revert gutter ───────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineMarkerView {\n cid: string\n /** Vertical offset in px, already spaced so buttons never overlap. */\n top: number\n kind: RedlineRegionKind\n}\n\nconst REVERT_TONE: Record<RedlineRegionKind, string> = {\n move: 'border-emerald-600 text-emerald-700 hover:bg-emerald-50 dark:border-emerald-400 dark:text-emerald-300 dark:hover:bg-emerald-950/40',\n add: 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n replace:\n 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n remove:\n 'border-red-600 text-red-700 hover:bg-red-50 dark:border-red-400 dark:text-red-300 dark:hover:bg-red-950/40',\n}\n\n/** One undo button per change, aligned with the change in the margin. */\nexport function RedlineRevertGutter({\n markers,\n onRevert,\n labels,\n testId,\n}: {\n markers: RedlineMarkerView[]\n onRevert: (cid: string) => void\n labels?: Partial<RedlineLabels>\n /** Replaces the whole `redline-revert-<cid>` id. */\n testId?: (cid: string) => string\n}) {\n if (markers.length === 0) return null\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const revertTitle: Record<RedlineRegionKind, string> = {\n move: l.revertMove,\n replace: l.revertReplace,\n add: l.revertAdd,\n remove: l.revertRemove,\n }\n return (\n <div className=\"pointer-events-none absolute right-2 top-0 w-9\" data-slot=\"redline-gutter\">\n {markers.map((m) => (\n <button\n key={m.cid}\n type=\"button\"\n onClick={() => onRevert(m.cid)}\n title={revertTitle[m.kind]}\n aria-label={revertTitle[m.kind]}\n style={{ top: m.top - 2 }}\n className={cn(\n 'pointer-events-auto absolute right-0 inline-flex h-6 w-7 items-center justify-center rounded-md border bg-background transition-colors pointer-coarse:h-11 pointer-coarse:w-11',\n REVERT_TONE[m.kind]\n )}\n data-testid={testIdOr(testId?.(m.cid), { testId: `redline-revert-${m.cid}` })}\n >\n <Undo2 className=\"size-3.5\" />\n </button>\n ))}\n </div>\n )\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_REDLINE_LABELS,\n RedlineComputing,\n RedlineDocument,\n RedlineFrame,\n RedlineMark,\n RedlineRevertGutter,\n RedlineStatus,\n type RedlineLabels,\n type RedlineMarkerView,\n type RedlineRegionKind,\n} from './RedlineParts'\n\ntype DelProps = React.ComponentPropsWithoutRef<'del'> & { 'data-cid'?: string }\ntype InsProps = React.ComponentPropsWithoutRef<'ins'> & { 'data-cid'?: string }\n\n/** The `<del>` / `<ins>` renderers a markdown renderer must use for the tracked changes. */\nexport interface RedlineMarkdownComponents {\n del: React.FC<DelProps>\n ins: React.FC<InsProps>\n}\n\n/**\n * Renders markdown to React. The redline markdown carries raw `<del>` / `<ins>` tags, so the\n * renderer must allow inline HTML and honour `components`.\n */\nexport type RenderMarkdown = (markdown: string, components?: RedlineMarkdownComponents) => ReactNode\n\n/** What the view shows. Matches `RedlineState` of `@arbidocs/react/artifacts`. */\nexport type ArtifactRedlineState =\n | { kind: 'idle' }\n | { kind: 'computing' }\n | { kind: 'ready'; markdown: string; regions: { id: string; kind: RedlineRegionKind }[] }\n | { kind: 'identical' }\n | { kind: 'unavailable' }\n\nexport interface ArtifactRedlineViewTestIds {\n /** Replaces the whole `redline-revert-<cid>` id. */\n revert: (cid: string) => string\n root: string\n}\n\nexport interface ArtifactRedlineViewProps {\n state: ArtifactRedlineState\n renderMarkdown: RenderMarkdown\n /** Accept/reject mode: a margin button per change undoes that change. Omit for read-only. */\n onRevert?: (regionId: string) => void\n /** A header row (for example `RedlineHeader`). */\n header?: ReactNode\n labels?: Partial<RedlineLabels>\n testIds?: Partial<ArtifactRedlineViewTestIds>\n}\n\n/** First char of a change id encodes its kind: p(replace) r(remove) a(add) m(move). */\nfunction kindFromCid(cid: string | undefined): RedlineRegionKind | null {\n switch (cid?.[0]) {\n case 'p':\n return 'replace'\n case 'r':\n return 'remove'\n case 'a':\n return 'add'\n case 'm':\n return 'move'\n default:\n return null\n }\n}\n\n/** Two changes on one line would stack their buttons; nudge each down by one button height. */\nconst MARKER_MIN_GAP = 26\n\n/**\n * Word-style track changes between two versions: deletions struck through in red, insertions\n * underlined in blue, moves in green, status lines when there is nothing to diff, and (when\n * `onRevert` is set) an undo button per change aligned in the margin.\n */\nexport function ArtifactRedlineView({\n state,\n renderMarkdown,\n onRevert,\n header,\n labels,\n testIds,\n}: ArtifactRedlineViewProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const reviewMode = typeof onRevert === 'function'\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const [markers, setMarkers] = useState<RedlineMarkerView[]>([])\n\n const regionKinds = useMemo(\n () => (state.kind === 'ready' ? new Map(state.regions.map((r) => [r.id, r.kind])) : null),\n [state]\n )\n\n const components = useMemo<RedlineMarkdownComponents>(() => {\n const isMove = (cid: string | undefined): boolean =>\n (regionKinds?.get(cid ?? '') ?? kindFromCid(cid)) === 'move'\n return {\n del: ({ children, ...props }: DelProps) => (\n <RedlineMark as=\"del\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n ins: ({ children, ...props }: InsProps) => (\n <RedlineMark as=\"ins\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n }\n }, [regionKinds])\n\n // After each render, find each change's first element and put its undo button level with it.\n useLayoutEffect(() => {\n const host = bodyRef.current\n if (!reviewMode || state.kind !== 'ready' || !host) {\n setMarkers([])\n return\n }\n const hostTop = host.getBoundingClientRect().top\n const seen = new Map<string, { top: number; kind: RedlineRegionKind }>()\n host.querySelectorAll<HTMLElement>('[data-cid]').forEach((el) => {\n const cid = el.dataset.cid\n if (!cid || seen.has(cid)) return\n seen.set(cid, {\n top: el.getBoundingClientRect().top - hostTop,\n kind: regionKinds?.get(cid) ?? kindFromCid(cid) ?? 'replace',\n })\n })\n const sorted = Array.from(seen, ([cid, v]) => ({ cid, ...v })).sort((a, b) => a.top - b.top)\n const spaced: RedlineMarkerView[] = []\n for (const m of sorted) {\n const prev = spaced[spaced.length - 1]\n spaced.push({\n ...m,\n top: prev && m.top - prev.top < MARKER_MIN_GAP ? prev.top + MARKER_MIN_GAP : m.top,\n })\n }\n setMarkers(spaced)\n }, [reviewMode, state, regionKinds])\n\n return (\n <section\n aria-label={l.tracked}\n className=\"h-full\"\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-redline' })}\n >\n <RedlineFrame header={header}>\n {state.kind === 'idle' || state.kind === 'identical' || state.kind === 'unavailable' ? (\n <div role=\"status\" className=\"h-full\">\n <RedlineStatus kind={state.kind} reviewMode={reviewMode} labels={labels} />\n </div>\n ) : state.kind === 'computing' ? (\n <RedlineComputing>\n <Loader2 className=\"size-5 animate-spin text-muted-foreground\" aria-hidden />\n <span className=\"sr-only\" role=\"status\">\n {l.computing}\n </span>\n </RedlineComputing>\n ) : (\n <RedlineDocument\n bodyRef={bodyRef}\n gutter={\n reviewMode ? (\n <RedlineRevertGutter\n markers={markers}\n onRevert={onRevert}\n labels={labels}\n testId={testIds?.revert}\n />\n ) : null\n }\n >\n {renderMarkdown(state.markdown, components)}\n </RedlineDocument>\n )}\n </RedlineFrame>\n </section>\n )\n}\n","import { Eye, GitCompare, History } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the timeline. Pass a partial `labels` to translate or reword. */\nexport interface VersionTimelineLabels {\n emptyLive: string\n emptyDocument: string\n untitled: string\n latest: string\n viewing: string\n current: string\n version: (n: number) => string\n branchedFrom: (n: number) => string\n open: string\n compare: string\n}\n\nexport const DEFAULT_VERSION_TIMELINE_LABELS: VersionTimelineLabels = {\n emptyLive:\n 'No earlier versions yet. When you ask the assistant for a change, the previous version is kept here.',\n emptyDocument:\n 'No earlier versions yet. Editing this draft and saving creates a new version here.',\n untitled: 'Untitled',\n latest: 'Latest',\n viewing: 'Viewing',\n current: 'Current',\n version: (n) => `Version ${n}`,\n branchedFrom: (n) => `branched from Version ${n}`,\n open: 'Open',\n compare: 'Compare',\n}\n\nexport interface VersionTimelineTestIds {\n root: string\n empty: string\n currentBadge: string\n /** Replaces the whole `version-row-<id>` id. */\n row: (id: string) => string\n branch: (id: string) => string\n open: (id: string) => string\n compare: (id: string) => string\n}\n\nexport interface VersionEntry {\n id: string\n /** File name as stored (live artifacts have their extension stripped for display). */\n name: string\n /** ISO string; formatted with `formatDate`. */\n createdAt: string\n /** The version this one was saved from (a branch when it is not the row above). */\n parentId?: string | null\n}\n\nexport interface VersionTimelineProps {\n /** Versions in creation order (oldest first). */\n versions: VersionEntry[]\n /** The version currently open. */\n currentId: string\n /**\n * A live (html/react) artifact: plain-language labels for non-developers, no file extension,\n * and no Compare (a text diff of source code means nothing to them).\n */\n live?: boolean\n formatDate: (iso: string) => string\n onOpen: (id: string) => void\n /** Omit to hide Compare (also hidden for `live`). */\n onCompare?: (id: string) => void\n className?: string\n labels?: Partial<VersionTimelineLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<VersionTimelineTestIds>\n}\n\n/**\n * Clickable timeline of an immutable version chain: open any version or compare it with the\n * current one. Versions are numbered in creation order; a version saved from an OLD version is a\n * deliberate branch and says where it came from instead of implying it follows the row above.\n * Test ids: `version-timeline`, `version-timeline-empty`, `version-row-{id}`,\n * `version-current-badge`, `version-branch-{id}`, `open-version-{id}`, `compare-version-{id}`.\n */\nexport function VersionTimeline({\n versions,\n currentId,\n live = false,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: VersionTimelineProps) {\n const l = { ...DEFAULT_VERSION_TIMELINE_LABELS, ...labels }\n if (versions.length <= 1) {\n return (\n <div\n className={cn('p-6 text-sm text-muted-foreground', className)}\n data-testid={testIdOr(testIds?.empty, { testId: 'version-timeline-empty' })}\n >\n {live ? l.emptyLive : l.emptyDocument}\n </div>\n )\n }\n\n const numberById = new Map<string, number>()\n versions.forEach((v, i) => numberById.set(v.id, i + 1))\n const canCompare = !live && !!onCompare\n\n return (\n <div\n className={cn('h-full overflow-auto p-4', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'version-timeline' })}\n >\n <ol className=\"mx-auto max-w-2xl space-y-1\">\n {versions.map((v, i) => {\n const isCurrent = v.id === currentId\n const isLatest = i === versions.length - 1\n const parentNumber = v.parentId ? numberById.get(v.parentId) : undefined\n const branchedFrom =\n parentNumber !== undefined && parentNumber !== i ? parentNumber : null\n // Live artifacts say \"Latest\"/\"Viewing\" (open vs. newest) instead of \"Current\".\n const badge = !isCurrent ? null : live ? (isLatest ? l.latest : l.viewing) : l.current\n const name = live\n ? (v.name || l.untitled).replace(/\\.[A-Za-z0-9]+$/, '')\n : v.name || l.untitled\n return (\n <li\n key={v.id}\n className={cn(\n 'flex items-center gap-3 rounded-md px-3 py-2.5',\n isCurrent && 'bg-accent'\n )}\n data-testid={testIdOr(testIds?.row?.(v.id), { testId: `version-row-${v.id}` })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-foreground\">{l.version(i + 1)}</span>\n {badge && (\n <span\n className=\"rounded-full bg-background px-2 py-0.5 text-xs font-medium text-accent-foreground\"\n data-testid={testIdOr(testIds?.currentBadge, {\n testId: 'version-current-badge',\n })}\n >\n {badge}\n </span>\n )}\n </div>\n <div className=\"truncate text-sm text-muted-foreground\">\n {name} · {formatDate(v.createdAt)}\n {branchedFrom !== null && (\n <span\n data-testid={testIdOr(testIds?.branch?.(v.id), {\n testId: `version-branch-${v.id}`,\n })}\n >\n {' '}\n · {l.branchedFrom(branchedFrom)}\n </span>\n )}\n </div>\n </div>\n {!isCurrent && (\n <>\n <button\n type=\"button\"\n onClick={() => onOpen(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.open?.(v.id), {\n testId: `open-version-${v.id}`,\n })}\n >\n <Eye className=\"size-3.5\" /> {l.open}\n </button>\n {canCompare && (\n <button\n type=\"button\"\n onClick={() => onCompare(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare?.(v.id), {\n testId: `compare-version-${v.id}`,\n })}\n >\n <GitCompare className=\"size-3.5\" /> {l.compare}\n </button>\n )}\n </>\n )}\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n"]}
@@ -2,10 +2,10 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkRIL7G7AS_cjs = require('../chunk-RIL7G7AS.cjs');
5
- var chunkATXPAD6S_cjs = require('../chunk-ATXPAD6S.cjs');
5
+ var chunkYLOKCIQJ_cjs = require('../chunk-YLOKCIQJ.cjs');
6
6
  require('../chunk-KHX2BX3S.cjs');
7
- require('../chunk-KDG6FER6.cjs');
8
7
  require('../chunk-MHVNT4J3.cjs');
8
+ require('../chunk-KDG6FER6.cjs');
9
9
 
10
10
 
11
11
 
@@ -255,211 +255,211 @@ Object.defineProperty(exports, "useLongPaste", {
255
255
  });
256
256
  Object.defineProperty(exports, "AssistantDock", {
257
257
  enumerable: true,
258
- get: function () { return chunkATXPAD6S_cjs.AssistantDock; }
258
+ get: function () { return chunkYLOKCIQJ_cjs.AssistantDock; }
259
259
  });
260
260
  Object.defineProperty(exports, "AssistantDockToggle", {
261
261
  enumerable: true,
262
- get: function () { return chunkATXPAD6S_cjs.AssistantDockToggle; }
262
+ get: function () { return chunkYLOKCIQJ_cjs.AssistantDockToggle; }
263
263
  });
264
264
  Object.defineProperty(exports, "ChatDocuments", {
265
265
  enumerable: true,
266
- get: function () { return chunkATXPAD6S_cjs.ChatDocuments; }
266
+ get: function () { return chunkYLOKCIQJ_cjs.ChatDocuments; }
267
267
  });
268
268
  Object.defineProperty(exports, "ChatPage", {
269
269
  enumerable: true,
270
- get: function () { return chunkATXPAD6S_cjs.ChatPage; }
270
+ get: function () { return chunkYLOKCIQJ_cjs.ChatPage; }
271
271
  });
272
272
  Object.defineProperty(exports, "ChatThreadList", {
273
273
  enumerable: true,
274
- get: function () { return chunkATXPAD6S_cjs.ChatThreadList; }
274
+ get: function () { return chunkYLOKCIQJ_cjs.ChatThreadList; }
275
275
  });
276
276
  Object.defineProperty(exports, "ChatThreadSelect", {
277
277
  enumerable: true,
278
- get: function () { return chunkATXPAD6S_cjs.ChatThreadSelect; }
278
+ get: function () { return chunkYLOKCIQJ_cjs.ChatThreadSelect; }
279
279
  });
280
280
  Object.defineProperty(exports, "Composer", {
281
281
  enumerable: true,
282
- get: function () { return chunkATXPAD6S_cjs.Composer; }
282
+ get: function () { return chunkYLOKCIQJ_cjs.Composer; }
283
283
  });
284
284
  Object.defineProperty(exports, "ComposerBranchingNotice", {
285
285
  enumerable: true,
286
- get: function () { return chunkATXPAD6S_cjs.ComposerBranchingNotice; }
286
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerBranchingNotice; }
287
287
  });
288
288
  Object.defineProperty(exports, "ComposerContainer", {
289
289
  enumerable: true,
290
- get: function () { return chunkATXPAD6S_cjs.ComposerContainer; }
290
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerContainer; }
291
291
  });
292
292
  Object.defineProperty(exports, "ComposerDock", {
293
293
  enumerable: true,
294
- get: function () { return chunkATXPAD6S_cjs.ComposerDock; }
294
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerDock; }
295
295
  });
296
296
  Object.defineProperty(exports, "ComposerFrame", {
297
297
  enumerable: true,
298
- get: function () { return chunkATXPAD6S_cjs.ComposerFrame; }
298
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerFrame; }
299
299
  });
300
300
  Object.defineProperty(exports, "ComposerInput", {
301
301
  enumerable: true,
302
- get: function () { return chunkATXPAD6S_cjs.ComposerInput; }
302
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerInput; }
303
303
  });
304
304
  Object.defineProperty(exports, "ComposerRoot", {
305
305
  enumerable: true,
306
- get: function () { return chunkATXPAD6S_cjs.ComposerRoot; }
306
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerRoot; }
307
307
  });
308
308
  Object.defineProperty(exports, "ComposerSend", {
309
309
  enumerable: true,
310
- get: function () { return chunkATXPAD6S_cjs.ComposerSend; }
310
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerSend; }
311
311
  });
312
312
  Object.defineProperty(exports, "ComposerToolbar", {
313
313
  enumerable: true,
314
- get: function () { return chunkATXPAD6S_cjs.ComposerToolbar; }
314
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerToolbar; }
315
315
  });
316
316
  Object.defineProperty(exports, "ComposerVoiceButton", {
317
317
  enumerable: true,
318
- get: function () { return chunkATXPAD6S_cjs.ComposerVoiceButton; }
318
+ get: function () { return chunkYLOKCIQJ_cjs.ComposerVoiceButton; }
319
319
  });
320
320
  Object.defineProperty(exports, "ContextChip", {
321
321
  enumerable: true,
322
- get: function () { return chunkATXPAD6S_cjs.ContextChip; }
322
+ get: function () { return chunkYLOKCIQJ_cjs.ContextChip; }
323
323
  });
324
324
  Object.defineProperty(exports, "ConversationEmpty", {
325
325
  enumerable: true,
326
- get: function () { return chunkATXPAD6S_cjs.ConversationEmpty; }
326
+ get: function () { return chunkYLOKCIQJ_cjs.ConversationEmpty; }
327
327
  });
328
328
  Object.defineProperty(exports, "DEFAULT_CHAT_PAGE_LABELS", {
329
329
  enumerable: true,
330
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_CHAT_PAGE_LABELS; }
330
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_CHAT_PAGE_LABELS; }
331
331
  });
332
332
  Object.defineProperty(exports, "DEFAULT_COMPOSER_LABELS", {
333
333
  enumerable: true,
334
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_COMPOSER_LABELS; }
334
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_COMPOSER_LABELS; }
335
335
  });
336
336
  Object.defineProperty(exports, "DEFAULT_CONVERSATION_EMPTY_LABELS", {
337
337
  enumerable: true,
338
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_CONVERSATION_EMPTY_LABELS; }
338
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_CONVERSATION_EMPTY_LABELS; }
339
339
  });
340
340
  Object.defineProperty(exports, "DEFAULT_MESSAGE_ALERT_LABELS", {
341
341
  enumerable: true,
342
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_MESSAGE_ALERT_LABELS; }
342
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_MESSAGE_ALERT_LABELS; }
343
343
  });
344
344
  Object.defineProperty(exports, "DEFAULT_MESSAGE_LABELS", {
345
345
  enumerable: true,
346
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_MESSAGE_LABELS; }
346
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_MESSAGE_LABELS; }
347
347
  });
348
348
  Object.defineProperty(exports, "DEFAULT_MESSAGE_LIST_LABELS", {
349
349
  enumerable: true,
350
- get: function () { return chunkATXPAD6S_cjs.DEFAULT_MESSAGE_LIST_LABELS; }
350
+ get: function () { return chunkYLOKCIQJ_cjs.DEFAULT_MESSAGE_LIST_LABELS; }
351
351
  });
352
352
  Object.defineProperty(exports, "Message", {
353
353
  enumerable: true,
354
- get: function () { return chunkATXPAD6S_cjs.Message; }
354
+ get: function () { return chunkYLOKCIQJ_cjs.Message; }
355
355
  });
356
356
  Object.defineProperty(exports, "MessageActionButton", {
357
357
  enumerable: true,
358
- get: function () { return chunkATXPAD6S_cjs.MessageActionButton; }
358
+ get: function () { return chunkYLOKCIQJ_cjs.MessageActionButton; }
359
359
  });
360
360
  Object.defineProperty(exports, "MessageActionMenu", {
361
361
  enumerable: true,
362
- get: function () { return chunkATXPAD6S_cjs.MessageActionMenu; }
362
+ get: function () { return chunkYLOKCIQJ_cjs.MessageActionMenu; }
363
363
  });
364
364
  Object.defineProperty(exports, "MessageAlert", {
365
365
  enumerable: true,
366
- get: function () { return chunkATXPAD6S_cjs.MessageAlert; }
366
+ get: function () { return chunkYLOKCIQJ_cjs.MessageAlert; }
367
367
  });
368
368
  Object.defineProperty(exports, "MessageBody", {
369
369
  enumerable: true,
370
- get: function () { return chunkATXPAD6S_cjs.MessageBody; }
370
+ get: function () { return chunkYLOKCIQJ_cjs.MessageBody; }
371
371
  });
372
372
  Object.defineProperty(exports, "MessageBubble", {
373
373
  enumerable: true,
374
- get: function () { return chunkATXPAD6S_cjs.MessageBubble; }
374
+ get: function () { return chunkYLOKCIQJ_cjs.MessageBubble; }
375
375
  });
376
376
  Object.defineProperty(exports, "MessageByline", {
377
377
  enumerable: true,
378
- get: function () { return chunkATXPAD6S_cjs.MessageByline; }
378
+ get: function () { return chunkYLOKCIQJ_cjs.MessageByline; }
379
379
  });
380
380
  Object.defineProperty(exports, "MessageContent", {
381
381
  enumerable: true,
382
- get: function () { return chunkATXPAD6S_cjs.MessageContent; }
382
+ get: function () { return chunkYLOKCIQJ_cjs.MessageContent; }
383
383
  });
384
384
  Object.defineProperty(exports, "MessageFooter", {
385
385
  enumerable: true,
386
- get: function () { return chunkATXPAD6S_cjs.MessageFooter; }
386
+ get: function () { return chunkYLOKCIQJ_cjs.MessageFooter; }
387
387
  });
388
388
  Object.defineProperty(exports, "MessageList", {
389
389
  enumerable: true,
390
- get: function () { return chunkATXPAD6S_cjs.MessageList; }
390
+ get: function () { return chunkYLOKCIQJ_cjs.MessageList; }
391
391
  });
392
392
  Object.defineProperty(exports, "MessageListBanner", {
393
393
  enumerable: true,
394
- get: function () { return chunkATXPAD6S_cjs.MessageListBanner; }
394
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListBanner; }
395
395
  });
396
396
  Object.defineProperty(exports, "MessageListEmpty", {
397
397
  enumerable: true,
398
- get: function () { return chunkATXPAD6S_cjs.MessageListEmpty; }
398
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListEmpty; }
399
399
  });
400
400
  Object.defineProperty(exports, "MessageListRoot", {
401
401
  enumerable: true,
402
- get: function () { return chunkATXPAD6S_cjs.MessageListRoot; }
402
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListRoot; }
403
403
  });
404
404
  Object.defineProperty(exports, "MessageListRow", {
405
405
  enumerable: true,
406
- get: function () { return chunkATXPAD6S_cjs.MessageListRow; }
406
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListRow; }
407
407
  });
408
408
  Object.defineProperty(exports, "MessageListRows", {
409
409
  enumerable: true,
410
- get: function () { return chunkATXPAD6S_cjs.MessageListRows; }
410
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListRows; }
411
411
  });
412
412
  Object.defineProperty(exports, "MessageListStatus", {
413
413
  enumerable: true,
414
- get: function () { return chunkATXPAD6S_cjs.MessageListStatus; }
414
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListStatus; }
415
415
  });
416
416
  Object.defineProperty(exports, "MessageListTail", {
417
417
  enumerable: true,
418
- get: function () { return chunkATXPAD6S_cjs.MessageListTail; }
418
+ get: function () { return chunkYLOKCIQJ_cjs.MessageListTail; }
419
419
  });
420
420
  Object.defineProperty(exports, "MessageNarration", {
421
421
  enumerable: true,
422
- get: function () { return chunkATXPAD6S_cjs.MessageNarration; }
422
+ get: function () { return chunkYLOKCIQJ_cjs.MessageNarration; }
423
423
  });
424
424
  Object.defineProperty(exports, "MessageRoot", {
425
425
  enumerable: true,
426
- get: function () { return chunkATXPAD6S_cjs.MessageRoot; }
426
+ get: function () { return chunkYLOKCIQJ_cjs.MessageRoot; }
427
427
  });
428
428
  Object.defineProperty(exports, "MessageSources", {
429
429
  enumerable: true,
430
- get: function () { return chunkATXPAD6S_cjs.MessageSources; }
430
+ get: function () { return chunkYLOKCIQJ_cjs.MessageSources; }
431
431
  });
432
432
  Object.defineProperty(exports, "MessageSubagentBadge", {
433
433
  enumerable: true,
434
- get: function () { return chunkATXPAD6S_cjs.MessageSubagentBadge; }
434
+ get: function () { return chunkYLOKCIQJ_cjs.MessageSubagentBadge; }
435
435
  });
436
436
  Object.defineProperty(exports, "ScrollToBottom", {
437
437
  enumerable: true,
438
- get: function () { return chunkATXPAD6S_cjs.ScrollToBottom; }
438
+ get: function () { return chunkYLOKCIQJ_cjs.ScrollToBottom; }
439
439
  });
440
440
  Object.defineProperty(exports, "SourceChip", {
441
441
  enumerable: true,
442
- get: function () { return chunkATXPAD6S_cjs.SourceChip; }
442
+ get: function () { return chunkYLOKCIQJ_cjs.SourceChip; }
443
443
  });
444
444
  Object.defineProperty(exports, "toSpeakableText", {
445
445
  enumerable: true,
446
- get: function () { return chunkATXPAD6S_cjs.toSpeakableText; }
446
+ get: function () { return chunkYLOKCIQJ_cjs.toSpeakableText; }
447
447
  });
448
448
  Object.defineProperty(exports, "useAssistantDock", {
449
449
  enumerable: true,
450
- get: function () { return chunkATXPAD6S_cjs.useAssistantDock; }
450
+ get: function () { return chunkYLOKCIQJ_cjs.useAssistantDock; }
451
451
  });
452
452
  Object.defineProperty(exports, "useChatSurface", {
453
453
  enumerable: true,
454
- get: function () { return chunkATXPAD6S_cjs.useChatSurface; }
454
+ get: function () { return chunkYLOKCIQJ_cjs.useChatSurface; }
455
455
  });
456
456
  Object.defineProperty(exports, "useRegisterEmbeddedChat", {
457
457
  enumerable: true,
458
- get: function () { return chunkATXPAD6S_cjs.useRegisterEmbeddedChat; }
458
+ get: function () { return chunkYLOKCIQJ_cjs.useRegisterEmbeddedChat; }
459
459
  });
460
460
  Object.defineProperty(exports, "useStreamAnnouncement", {
461
461
  enumerable: true,
462
- get: function () { return chunkATXPAD6S_cjs.useStreamAnnouncement; }
462
+ get: function () { return chunkYLOKCIQJ_cjs.useStreamAnnouncement; }
463
463
  });
464
464
  //# sourceMappingURL=index.cjs.map
465
465
  //# sourceMappingURL=index.cjs.map
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  export { BranchControls, ComposerAccessories, ComposerTools, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, ContextSelectList, ContextSelectRow, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSearchView, ConversationSettingsButton, DEFAULT_BRANCH_CONTROLS_LABELS, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_MODEL_PRICING_TIP_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, DEFAULT_SLASH_MENU_LABELS, DEFAULT_THREAD_MAP_LABELS, LabelPinRow, ModelAutoIcon, ModelConfigureButton, ModelDot, ModelMenuDivider, ModelMenuMessage, ModelOption, ModelOptionLabel, ModelPickerPopover, ModelPickerTrigger, ModelPricingTip, ModelTierIcon, ModelTierOption, ModelTriggerContent, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, PinnedDocChip, SlashMenu, ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading, isLongPastedText, useDismissibleCard, useListKeyNav, useLongPaste } from '../chunk-RCP6THBS.js';
3
- export { AssistantDock, AssistantDockToggle, ChatDocuments, ChatPage, ChatThreadList, ChatThreadSelect, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, toSpeakableText, useAssistantDock, useChatSurface, useRegisterEmbeddedChat, useStreamAnnouncement } from '../chunk-JPO3F4J7.js';
3
+ export { AssistantDock, AssistantDockToggle, ChatDocuments, ChatPage, ChatThreadList, ChatThreadSelect, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, toSpeakableText, useAssistantDock, useChatSurface, useRegisterEmbeddedChat, useStreamAnnouncement } from '../chunk-6YHWXMPQ.js';
4
4
  import '../chunk-2VBJ763Y.js';
5
- import '../chunk-OXF2IFXG.js';
6
5
  import '../chunk-7F6CBP3Z.js';
6
+ import '../chunk-OXF2IFXG.js';
7
7
  //# sourceMappingURL=index.js.map
8
8
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkATXPAD6S_cjs = require('./chunk-ATXPAD6S.cjs');
4
+ var chunkYLOKCIQJ_cjs = require('./chunk-YLOKCIQJ.cjs');
5
5
  var react$1 = require('react');
6
6
  var react = require('@arbidocs/react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -203,7 +203,7 @@ function useConnectedChat(options) {
203
203
  }
204
204
  function ConnectedAssistantDock(props) {
205
205
  const chat = useConnectedChat();
206
- return /* @__PURE__ */ jsxRuntime.jsx(chunkATXPAD6S_cjs.AssistantDock, { ...props, chat });
206
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkYLOKCIQJ_cjs.AssistantDock, { ...props, chat });
207
207
  }
208
208
 
209
209
  Object.defineProperty(exports, "redlineStats", {
@@ -227,5 +227,5 @@ exports.useConnectedChat = useConnectedChat;
227
227
  exports.useConnection = useConnection;
228
228
  exports.useSemanticSearch = useSemanticSearch;
229
229
  exports.useWorkspaceDocs = useWorkspaceDocs;
230
- //# sourceMappingURL=chunk-XKKGGUU2.cjs.map
231
- //# sourceMappingURL=chunk-XKKGGUU2.cjs.map
230
+ //# sourceMappingURL=chunk-3MIQASHO.cjs.map
231
+ //# sourceMappingURL=chunk-3MIQASHO.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/ConnectionProvider.tsx","../src/connection/ai.tsx"],"names":["createContext","useArbi","useState","useRef","useEffect","useCallback","useMemo","jsx","useContext","useKitAiTask","useKitWorkspaceDocs","useKitSemanticSearch","useArbiChat","AssistantDock"],"mappings":"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","file":"chunk-XKKGGUU2.cjs","sourcesContent":["/**\n * The demo/live connection layer for a host app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo workspace. Host-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link ArbiConnectionConfig}.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo workspace. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend AND per signed-in user, so a returning\n * user lands back in the workspace they last chose, while the next person on a shared browser\n * never starts from someone else's workspace id. Namespaced by apiUrl so distinct deployments\n * (and the demo workspace) don't clobber each other. Cleared on logout.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst normalizeUserKey = (email: string) => email.trim().toLowerCase()\n\n/** Exported for tests. */\nexport const workspaceStorageKey = (apiUrl: string, userKey: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}:${normalizeUserKey(userKey)}`\n\n/** The pre-isolation key (apiUrl only). Never read: removed so it cannot leak across users. */\nconst legacyWorkspaceStorageKey = (apiUrl: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string, userKey: string | null): string | null {\n if (!userKey) return null\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl, userKey))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, userKey: string | null, id: string | null): void {\n if (!userKey) return\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl, userKey), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl, userKey))\n window.localStorage.removeItem(legacyWorkspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\n\n/** Shown on the sign-in screen after the session could not be recovered. */\nexport const SESSION_EXPIRED_MESSAGE = 'Your session expired. Sign in again.'\n\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>('disconnected')\n const [user, setUser] = useState<ArbiUser | null>(null)\n const [workspaceId, setWorkspaceId] = useState<string | null>(null)\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n // Who the persisted workspace belongs to; set at sign-in, cleared at logout.\n const storageUserRef = useRef<string | null>(null)\n\n // The SDK could not recover the session (token refused, workspace not re-openable): drop to\n // 'disconnected' with a plain message, so the host's gate sends the user to sign in instead of\n // every call failing with a raw backend error. The remembered workspace is kept for next login.\n useEffect(\n () =>\n arbi.onSessionExpired?.(() => {\n storageUserRef.current = null\n setUser(null)\n setWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi]\n )\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n setWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n // No backend configured → run the seeded demo workspace.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n await arbi.login(email, password)\n storageUserRef.current = normalizeUserKey(email)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the workspace the user last affirmatively selected (persisted),\n // then the configured workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl, storageUserRef.current)\n const preferred = persisted ?? config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n setWorkspaceId(target.external_id)\n persistWorkspace(config.apiUrl, storageUserRef.current, target.external_id)\n }\n // Resolve the real profile (name + avatar) by finding ourselves in the\n // workspace roster — the login response doesn't surface the picture, but\n // the member list does. Best-effort: fall back to the email local-part.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n try {\n const me = arbi.user.identity()\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n setUser(resolved)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId, config.apiUrl]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n setWorkspaceId(id)\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n const id =\n workspaceId ??\n readPersistedWorkspace(config.apiUrl, storageUserRef.current) ??\n config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n return <ConnectionContext.Provider value={value}>{children}</ConnectionContext.Provider>\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n","/**\n * The connected agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the host's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n useArbiChat,\n type ArbiChat,\n type UseArbiChatOptions,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport { AssistantDock, type AssistantDockProps } from '../chat/AssistantDock'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a host app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the host's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useConnectedAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n\n/**\n * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's\n * default assistant configuration are injected, so a host writes\n * `<ChatPage chat={useConnectedChat()} />`.\n */\nexport function useConnectedChat(options?: Omit<UseArbiChatOptions, 'workspaceId'>): ArbiChat {\n const { workspaceId, fallbackWorkspaceId, assistantConfig } = useConnection()\n return useArbiChat({\n ...options,\n workspaceId: workspaceId ?? fallbackWorkspaceId,\n model: options?.model ?? assistantConfig,\n })\n}\n\n/**\n * The assistant dock bound to the connection: mount it once in the layout (`Shell.Root`'s `aside`)\n * and put `AssistantDockToggle` in the topbar. Chat state lives here, so it survives closing the dock.\n */\nexport function ConnectedAssistantDock(props: Omit<AssistantDockProps, 'chat'>) {\n const chat = useConnectedChat()\n return <AssistantDock {...props} chat={chat} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/ConnectionProvider.tsx","../src/connection/ai.tsx"],"names":["createContext","useArbi","useState","useRef","useEffect","useCallback","useMemo","jsx","useContext","useKitAiTask","useKitWorkspaceDocs","useKitSemanticSearch","useArbiChat","AssistantDock"],"mappings":"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","file":"chunk-3MIQASHO.cjs","sourcesContent":["/**\n * The demo/live connection layer for a host app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo workspace. Host-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link ArbiConnectionConfig}.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo workspace. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend AND per signed-in user, so a returning\n * user lands back in the workspace they last chose, while the next person on a shared browser\n * never starts from someone else's workspace id. Namespaced by apiUrl so distinct deployments\n * (and the demo workspace) don't clobber each other. Cleared on logout.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst normalizeUserKey = (email: string) => email.trim().toLowerCase()\n\n/** Exported for tests. */\nexport const workspaceStorageKey = (apiUrl: string, userKey: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}:${normalizeUserKey(userKey)}`\n\n/** The pre-isolation key (apiUrl only). Never read: removed so it cannot leak across users. */\nconst legacyWorkspaceStorageKey = (apiUrl: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string, userKey: string | null): string | null {\n if (!userKey) return null\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl, userKey))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, userKey: string | null, id: string | null): void {\n if (!userKey) return\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl, userKey), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl, userKey))\n window.localStorage.removeItem(legacyWorkspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\n\n/** Shown on the sign-in screen after the session could not be recovered. */\nexport const SESSION_EXPIRED_MESSAGE = 'Your session expired. Sign in again.'\n\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>('disconnected')\n const [user, setUser] = useState<ArbiUser | null>(null)\n const [workspaceId, setWorkspaceId] = useState<string | null>(null)\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n // Who the persisted workspace belongs to; set at sign-in, cleared at logout.\n const storageUserRef = useRef<string | null>(null)\n\n // The SDK could not recover the session (token refused, workspace not re-openable): drop to\n // 'disconnected' with a plain message, so the host's gate sends the user to sign in instead of\n // every call failing with a raw backend error. The remembered workspace is kept for next login.\n useEffect(\n () =>\n arbi.onSessionExpired?.(() => {\n storageUserRef.current = null\n setUser(null)\n setWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi]\n )\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n setWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n // No backend configured → run the seeded demo workspace.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n await arbi.login(email, password)\n storageUserRef.current = normalizeUserKey(email)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the workspace the user last affirmatively selected (persisted),\n // then the configured workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl, storageUserRef.current)\n const preferred = persisted ?? config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n setWorkspaceId(target.external_id)\n persistWorkspace(config.apiUrl, storageUserRef.current, target.external_id)\n }\n // Resolve the real profile (name + avatar) by finding ourselves in the\n // workspace roster — the login response doesn't surface the picture, but\n // the member list does. Best-effort: fall back to the email local-part.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n try {\n const me = arbi.user.identity()\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n setUser(resolved)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId, config.apiUrl]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n setWorkspaceId(id)\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n const id =\n workspaceId ??\n readPersistedWorkspace(config.apiUrl, storageUserRef.current) ??\n config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n return <ConnectionContext.Provider value={value}>{children}</ConnectionContext.Provider>\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n","/**\n * The connected agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the host's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n useArbiChat,\n type ArbiChat,\n type UseArbiChatOptions,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\nimport { AssistantDock, type AssistantDockProps } from '../chat/AssistantDock'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a host app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the host's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useConnectedAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n\n/**\n * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's\n * default assistant configuration are injected, so a host writes\n * `<ChatPage chat={useConnectedChat()} />`.\n */\nexport function useConnectedChat(options?: Omit<UseArbiChatOptions, 'workspaceId'>): ArbiChat {\n const { workspaceId, fallbackWorkspaceId, assistantConfig } = useConnection()\n return useArbiChat({\n ...options,\n workspaceId: workspaceId ?? fallbackWorkspaceId,\n model: options?.model ?? assistantConfig,\n })\n}\n\n/**\n * The assistant dock bound to the connection: mount it once in the layout (`Shell.Root`'s `aside`)\n * and put `AssistantDockToggle` in the topbar. Chat state lives here, so it survives closing the dock.\n */\nexport function ConnectedAssistantDock(props: Omit<AssistantDockProps, 'chat'>) {\n const chat = useConnectedChat()\n return <AssistantDock {...props} chat={chat} />\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { AssistantDock } from './chunk-JPO3F4J7.js';
2
+ import { AssistantDock } from './chunk-6YHWXMPQ.js';
3
3
  import { createContext, useState, useRef, useEffect, useCallback, useMemo, useContext } from 'react';
4
4
  import { useArbi, useAiTask, useWorkspaceDocs as useWorkspaceDocs$1, useSemanticSearch as useSemanticSearch$1, useArbiChat } from '@arbidocs/react';
5
5
  export { redlineStats, textToArtifact, toRedlineMarkdown } from '@arbidocs/react';
@@ -206,5 +206,5 @@ function ConnectedAssistantDock(props) {
206
206
  }
207
207
 
208
208
  export { ConnectedAssistantDock, ConnectionProvider, SESSION_EXPIRED_MESSAGE, isAuthenticated, useConnectedAiTask, useConnectedChat, useConnection, useSemanticSearch, useWorkspaceDocs };
209
- //# sourceMappingURL=chunk-B673CCW5.js.map
210
- //# sourceMappingURL=chunk-B673CCW5.js.map
209
+ //# sourceMappingURL=chunk-3PJCET7H.js.map
210
+ //# sourceMappingURL=chunk-3PJCET7H.js.map