@arbidocs/blocks 0.5.95 → 0.5.97

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 (109) hide show
  1. package/README.md +21 -8
  2. package/dist/{ConnectedNativeDocxComparison-FNHQKY57.js → ConnectedNativeDocxComparison-6KL5XI3L.js} +6 -6
  3. package/dist/{ConnectedNativeDocxComparison-FNHQKY57.js.map → ConnectedNativeDocxComparison-6KL5XI3L.js.map} +1 -1
  4. package/dist/{ConnectedNativeDocxComparison-KIMSYQV2.cjs → ConnectedNativeDocxComparison-P346QOX5.cjs} +7 -7
  5. package/dist/{ConnectedNativeDocxComparison-KIMSYQV2.cjs.map → ConnectedNativeDocxComparison-P346QOX5.cjs.map} +1 -1
  6. package/dist/{ConnectedNativeDocxEditor-UOZGILPM.cjs → ConnectedNativeDocxEditor-7JHSQ6KI.cjs} +7 -7
  7. package/dist/{ConnectedNativeDocxEditor-UOZGILPM.cjs.map → ConnectedNativeDocxEditor-7JHSQ6KI.cjs.map} +1 -1
  8. package/dist/{ConnectedNativeDocxEditor-WFDFGJYW.js → ConnectedNativeDocxEditor-ATZ2TG2L.js} +5 -5
  9. package/dist/{ConnectedNativeDocxEditor-WFDFGJYW.js.map → ConnectedNativeDocxEditor-ATZ2TG2L.js.map} +1 -1
  10. package/dist/{ConnectedStreamedWordArtifact-WFKYXIX5.cjs → ConnectedStreamedWordArtifact-5HI3WSAJ.cjs} +7 -7
  11. package/dist/ConnectedStreamedWordArtifact-5HI3WSAJ.cjs.map +1 -0
  12. package/dist/{ConnectedStreamedWordArtifact-SFELZUTS.js → ConnectedStreamedWordArtifact-FHSGQHXQ.js} +6 -6
  13. package/dist/{ConnectedStreamedWordArtifact-SFELZUTS.js.map → ConnectedStreamedWordArtifact-FHSGQHXQ.js.map} +1 -1
  14. package/dist/{DocumentReviewCard-X5DXEU2G.js → DocumentReviewCard-7UFQGDOG.js} +3 -3
  15. package/dist/{DocumentReviewCard-X5DXEU2G.js.map → DocumentReviewCard-7UFQGDOG.js.map} +1 -1
  16. package/dist/{DocumentReviewCard-7XUBPCQD.cjs → DocumentReviewCard-E3HB3K2G.cjs} +3 -3
  17. package/dist/{DocumentReviewCard-7XUBPCQD.cjs.map → DocumentReviewCard-E3HB3K2G.cjs.map} +1 -1
  18. package/dist/{FilesViewerDialog-H4ZXFNLV.cjs → FilesViewerDialog-3KWTQARB.cjs} +41 -32
  19. package/dist/FilesViewerDialog-3KWTQARB.cjs.map +1 -0
  20. package/dist/{FilesViewerDialog-4Q6WJMSX.js → FilesViewerDialog-EQKBFAWI.js} +40 -31
  21. package/dist/FilesViewerDialog-EQKBFAWI.js.map +1 -0
  22. package/dist/WorkspaceTableView-DYABS53K.js +1 -1
  23. package/dist/WorkspaceTableView-ZIQ7JWT5.cjs +1 -1
  24. package/dist/agents/index.cjs +254 -254
  25. package/dist/agents/index.js +4 -4
  26. package/dist/agents/workflows/WorkflowStepAction.d.ts +9 -2
  27. package/dist/agents/workflows/requiredLabels.d.ts +7 -2
  28. package/dist/{chunk-CY2K4K5M.js → chunk-42IVGYNL.js} +4 -4
  29. package/dist/{chunk-CY2K4K5M.js.map → chunk-42IVGYNL.js.map} +1 -1
  30. package/dist/{chunk-45M4QWCM.js → chunk-4LTDELP2.js} +3 -3
  31. package/dist/{chunk-45M4QWCM.js.map → chunk-4LTDELP2.js.map} +1 -1
  32. package/dist/{chunk-NIXAAPIG.js → chunk-4RCLA52C.js} +5 -5
  33. package/dist/{chunk-NIXAAPIG.js.map → chunk-4RCLA52C.js.map} +1 -1
  34. package/dist/{chunk-CJBDBBN2.cjs → chunk-6IS3IRUF.cjs} +4 -4
  35. package/dist/{chunk-CJBDBBN2.cjs.map → chunk-6IS3IRUF.cjs.map} +1 -1
  36. package/dist/{chunk-I4PB257E.js → chunk-76O7J6IZ.js} +3 -3
  37. package/dist/{chunk-I4PB257E.js.map → chunk-76O7J6IZ.js.map} +1 -1
  38. package/dist/{chunk-ZSWMRG72.cjs → chunk-AINS6VU6.cjs} +4 -4
  39. package/dist/{chunk-ZSWMRG72.cjs.map → chunk-AINS6VU6.cjs.map} +1 -1
  40. package/dist/{chunk-U4ZLFL6M.cjs → chunk-CCALU47C.cjs} +5 -5
  41. package/dist/{chunk-U4ZLFL6M.cjs.map → chunk-CCALU47C.cjs.map} +1 -1
  42. package/dist/{chunk-5ZWEUUJN.cjs → chunk-ECCV4YOL.cjs} +8 -8
  43. package/dist/{chunk-5ZWEUUJN.cjs.map → chunk-ECCV4YOL.cjs.map} +1 -1
  44. package/dist/{chunk-D3ABKS7T.cjs → chunk-HDPT7D6F.cjs} +3 -3
  45. package/dist/{chunk-D3ABKS7T.cjs.map → chunk-HDPT7D6F.cjs.map} +1 -1
  46. package/dist/{chunk-MBXQSBG3.cjs → chunk-J4CXF4A7.cjs} +170 -12
  47. package/dist/chunk-J4CXF4A7.cjs.map +1 -0
  48. package/dist/{chunk-TG4S236F.js → chunk-LZI4EGOW.js} +206 -53
  49. package/dist/chunk-LZI4EGOW.js.map +1 -0
  50. package/dist/{chunk-AJ4TBTA3.js → chunk-PCAWLVHE.js} +3 -3
  51. package/dist/{chunk-AJ4TBTA3.js.map → chunk-PCAWLVHE.js.map} +1 -1
  52. package/dist/{chunk-O5MH74TI.js → chunk-QSBPOYWA.js} +3 -3
  53. package/dist/{chunk-O5MH74TI.js.map → chunk-QSBPOYWA.js.map} +1 -1
  54. package/dist/{chunk-H2DG5HIO.js → chunk-RZG4ALKZ.js} +3 -3
  55. package/dist/{chunk-H2DG5HIO.js.map → chunk-RZG4ALKZ.js.map} +1 -1
  56. package/dist/{chunk-CVYFX7AD.js → chunk-SEBNGA3F.js} +31 -15
  57. package/dist/chunk-SEBNGA3F.js.map +1 -0
  58. package/dist/{chunk-6HI5OXB6.cjs → chunk-SYWJNSPS.cjs} +3 -3
  59. package/dist/{chunk-6HI5OXB6.cjs.map → chunk-SYWJNSPS.cjs.map} +1 -1
  60. package/dist/{chunk-SOBLG72E.js → chunk-T7LLYVOW.js} +166 -8
  61. package/dist/chunk-T7LLYVOW.js.map +1 -0
  62. package/dist/{chunk-VVQEEHDV.cjs → chunk-V2CNHRLZ.cjs} +4 -4
  63. package/dist/{chunk-VVQEEHDV.cjs.map → chunk-V2CNHRLZ.cjs.map} +1 -1
  64. package/dist/{chunk-KTHBUDYQ.cjs → chunk-WN7XPEYK.cjs} +5 -5
  65. package/dist/{chunk-KTHBUDYQ.cjs.map → chunk-WN7XPEYK.cjs.map} +1 -1
  66. package/dist/{chunk-DCHNB7DF.cjs → chunk-XM4KRGCK.cjs} +246 -93
  67. package/dist/chunk-XM4KRGCK.cjs.map +1 -0
  68. package/dist/{chunk-CIXA5A65.cjs → chunk-YZ6YOOTF.cjs} +30 -14
  69. package/dist/chunk-YZ6YOOTF.cjs.map +1 -0
  70. package/dist/{chunk-HU3MX5PY.js → chunk-Z4IPTLRS.js} +3 -3
  71. package/dist/{chunk-HU3MX5PY.js.map → chunk-Z4IPTLRS.js.map} +1 -1
  72. package/dist/connect/docx.cjs +10 -10
  73. package/dist/connect/docx.js +6 -6
  74. package/dist/connect/index.cjs +279 -249
  75. package/dist/connect/index.cjs.map +1 -1
  76. package/dist/connect/index.js +52 -22
  77. package/dist/connect/index.js.map +1 -1
  78. package/dist/connect/viewer.cjs +3 -3
  79. package/dist/connect/viewer.js +2 -2
  80. package/dist/connection/files/page/ConnectedFilesPage.d.ts +11 -7
  81. package/dist/connection/viewer/DocumentViewerDialog.d.ts +3 -0
  82. package/dist/connection/viewer/documentPlace.d.ts +10 -4
  83. package/dist/connection/workflows/ConnectedWorkflowRunPage.d.ts +4 -3
  84. package/dist/connection/workflows/WorkflowRunPage.d.ts +18 -15
  85. package/dist/connection/workflows/index.d.ts +2 -1
  86. package/dist/connection/workflows/runProject.d.ts +47 -0
  87. package/dist/embed/index.cjs +2 -2
  88. package/dist/embed/index.js +2 -2
  89. package/dist/facts/index.cjs +43 -43
  90. package/dist/facts/index.js +2 -2
  91. package/dist/index.cjs +307 -307
  92. package/dist/index.js +6 -6
  93. package/dist/settings/index.cjs +1 -1
  94. package/dist/settings/index.js +1 -1
  95. package/dist/workflow-canvas/index.cjs +23 -23
  96. package/dist/workflow-canvas/index.js +8 -8
  97. package/dist/workspaces/index.cjs +8 -8
  98. package/dist/workspaces/index.js +1 -1
  99. package/node_modules/@arbidocs/coedit/package.json +1 -1
  100. package/package.json +5 -5
  101. package/dist/ConnectedStreamedWordArtifact-WFKYXIX5.cjs.map +0 -1
  102. package/dist/FilesViewerDialog-4Q6WJMSX.js.map +0 -1
  103. package/dist/FilesViewerDialog-H4ZXFNLV.cjs.map +0 -1
  104. package/dist/chunk-CIXA5A65.cjs.map +0 -1
  105. package/dist/chunk-CVYFX7AD.js.map +0 -1
  106. package/dist/chunk-DCHNB7DF.cjs.map +0 -1
  107. package/dist/chunk-MBXQSBG3.cjs.map +0 -1
  108. package/dist/chunk-SOBLG72E.js.map +0 -1
  109. package/dist/chunk-TG4S236F.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  export { AskBar } from './chunk-KRBZUTQE.js';
3
3
  export { DroppableContainer } from './chunk-63IH7V5F.js';
4
- export { DataTableBlock, StatGroup } from './chunk-F3PMG5GW.js';
5
4
  export { ArticleList, CheckList, CollectionDetail, CtaBand, DefinitionList, EditorialHeading, EditorialHero, EditorialProse, EditorialSection, Eyebrow, PanelGrid, ProofStrip, Reveal, TagList, createAppearanceStore, themeFromCss } from './chunk-BIJJTO4R.js';
5
+ export { DataTableBlock, StatGroup } from './chunk-F3PMG5GW.js';
6
6
  export { Accordion, AvatarBlock, BlockImage, BlockLink, CTABanner, Columns, ContactForm, Container, EditorialProfileCard, FAQ, FeatureGrid, Footer, Gallery, Hero, ListBlock, LogoCloud, MediaText, Navbar, PricingTable, RichTextBlock, SectionHeading, Spacer, Steps, TeamGrid, Testimonial, TestimonialGrid, VideoEmbed, applyStoredTheme, createThemeStore, toEmbedUrl } from './chunk-FVNQMMXK.js';
7
7
  export { Timeline } from './chunk-UYA4URGM.js';
8
8
  export { Highlight, splitByTerms } from './chunk-Q5EUEJD7.js';
9
9
  import './chunk-QAB4O4EE.js';
10
10
  export { ContactCard, DEFAULT_CONTACT_CARD_LABELS, contactToVCard, downloadVCard, vCardFilename } from './chunk-TTS353W2.js';
11
- export { DEFAULT_GLOSSARY_LABELS, DEFAULT_TAG_COLUMNS_EDITOR_LABELS, DEFAULT_TAG_DETAIL_LABELS, DEFAULT_TAG_TABLE_DOCX_LABELS, DEFAULT_TAG_TABLE_LABELS, DEFAULT_WORKSPACE_ACTIVITY_LABELS, EXTRACT_LIMIT, EntityIdentityBar, ExtractEntitiesDialog, GridRowNavigator, IDENTITY_NAME_MAX_LENGTH, LoadingIndicator, TAG_TABLE_DOCX_LANDSCAPE_AFTER, TagColumnsEditor, TagDetail, TagTable, TagTableCell, Toolbar, WorkspaceActivityList, cellText, cellValue, documentCount, entitiesPhrase, fieldWrites, glossaryDocumentXml, glossaryDocx, glossaryEntries, glossaryFileName, glossaryMarkdown, isGap, parseCell, rowLinks, tagDetailLabels, tagKindDescription, tagNoteLabel, tagTableDocumentXml, tagTableDocx, tagTableLabels, tagTableMarkdown, tagsPageNouns, useTipsPlacement, workspaceActivityHeadline, workspaceActivityTarget } from './chunk-45M4QWCM.js';
11
+ export { DEFAULT_GLOSSARY_LABELS, DEFAULT_TAG_COLUMNS_EDITOR_LABELS, DEFAULT_TAG_DETAIL_LABELS, DEFAULT_TAG_TABLE_DOCX_LABELS, DEFAULT_TAG_TABLE_LABELS, DEFAULT_WORKSPACE_ACTIVITY_LABELS, EXTRACT_LIMIT, EntityIdentityBar, ExtractEntitiesDialog, GridRowNavigator, IDENTITY_NAME_MAX_LENGTH, LoadingIndicator, TAG_TABLE_DOCX_LANDSCAPE_AFTER, TagColumnsEditor, TagDetail, TagTable, TagTableCell, Toolbar, WorkspaceActivityList, cellText, cellValue, documentCount, entitiesPhrase, fieldWrites, glossaryDocumentXml, glossaryDocx, glossaryEntries, glossaryFileName, glossaryMarkdown, isGap, parseCell, rowLinks, tagDetailLabels, tagKindDescription, tagNoteLabel, tagTableDocumentXml, tagTableDocx, tagTableLabels, tagTableMarkdown, tagsPageNouns, useTipsPlacement, workspaceActivityHeadline, workspaceActivityTarget } from './chunk-4LTDELP2.js';
12
12
  export { ThemeEditor, ThemePreview } from './chunk-VI2V3U2P.js';
13
13
  export { CONTRAST_PAIRS, DEFAULT_THEME_PREVIEW_LABELS, THEME_STYLE_ID, Tabs, applyFontVars, applyThemeVars, clearFontVars, clearThemeVars, contrastIssues, contrastRatio, deriveColors, ensureContrast, inferInputs, themeCssVars, themeMetaVars, toHslTriplet } from './chunk-J77BACGX.js';
14
14
  export { DEFAULT_THREAD_FOLLOW_LABELS, DEFAULT_WORKSPACE_NOTIFICATION_MENU_LABELS, ThreadFollowButton, ThreadFollowMenuItem, WorkspaceNotificationMenu } from './chunk-66NMPTOH.js';
@@ -40,12 +40,12 @@ export { tid } from './chunk-AMTWY22T.js';
40
40
  export { PageHeader } from './chunk-XCVLUXFP.js';
41
41
  export { Chart } from './chunk-VIIBJBTX.js';
42
42
  export { DEFAULT_DETAIL_PANEL_LABELS, DetailBody, DetailEmpty, DetailField, DetailFields, DetailLinkItem, DetailLinkList, DetailLoading, DetailPanel, DetailSection } from './chunk-OC2PD52M.js';
43
- export { useWorkflowPreview } from './chunk-I4PB257E.js';
44
- export { ANNOTATE, ANNOTATE_ID, ActionStepBody, AgentAvatarField, AgentBar, AgentBarIconButton, AgentBarMenu, AgentBarNotes, AgentBarProbeAnswer, AgentBarQueuedNote, AgentBarStatus, AgentCard, AgentConnectInstructions, AgentCreateView, AgentCreatedView, AgentCreator, AgentEditView, AgentGallery, AgentMainView, AgentTypeSelector, ApprovalEvidence, AssigneeLine, BUILTIN_SKILLS, CHRONOLOGY, CHRONOLOGY_ID, CUSTOM_TASK, CUSTOM_TASK_ID, CapabilityGrid, CapabilityTile, ConfigField, ConfigForm, ConsentActions, ConsentBulletList, ConsentCard, ConsentFootnote, ConsentHeader, ConsentMessage, ConsentNotice, ConsentPage, ConsentPermissionList, ConsentSection, ConsentStrong, ConsentText, ConversationListView, ConversationTurnSpeaker, CopyableUrl, DASHBOARD_OPERATIONS, DASHBOARD_PINNED, DEEP_RESEARCH, DEEP_RESEARCH_ID, DEFAULT_AGENT_AVATAR_FIELD_LABELS, DEFAULT_AGENT_BAR_LABELS, DEFAULT_AGENT_CAPABILITIES, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_CREATOR_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_AGENT_TEMPLATES, DEFAULT_AGENT_TYPES, DEFAULT_AGENT_TYPE_SELECTOR_LABELS, DEFAULT_AUTHORIZE_AGENT_LABELS, DEFAULT_CONFIG_FIELD_LABELS, DEFAULT_CONFIG_FORM_LABELS, DEFAULT_CONSENT_ACTIONS_LABELS, DEFAULT_COPYABLE_URL_LABELS, DEFAULT_NEW_THREAD_DIALOG_LABELS, DEFAULT_PILL_SELECT_LABELS, DEFAULT_RECURRENCE_BUILDER_LABELS, DEFAULT_SKILL_EDIT_FORM_LABELS, DEFAULT_SKILL_GENERATE_FORM_LABELS, DEFAULT_SKILL_VIEW_TOGGLE_LABELS, DEFAULT_STEP_BAR_LABELS, DEFAULT_TASK_ACTIVITY_LABELS, DEFAULT_TASK_COMPOSER_LABELS, DEFAULT_TASK_LIST_LABELS, DEFAULT_TASK_OUTPUTS_CELL_LABELS, DEFAULT_TASK_PLAN_LABELS, DEFAULT_TASK_RUNS_DIALOG_LABELS, DEFAULT_TASK_STATUS_PILL_LABELS, DEFAULT_THREAD_STATE_LABELS, DEFAULT_TUPLE_ARRAY_FIELD_LABELS, DEFAULT_UPLOAD_TASK_ITEM_LABELS, DEFAULT_UPLOAD_TASK_LIST_LABELS, DEFAULT_WORKFLOW_RUNNER_LABELS, DEFAULT_WORKFLOW_RUN_STATUS_LABELS, DEFAULT_WORKFLOW_STEP_PARTS_LABELS, DEFAULT_WORKFLOW_THREAD_STRIP_LABELS, DERIVED_NAME_WORDS, EMPTY_NEW_THREAD, GENERATE_IMAGE, GENERATE_IMAGE_ID, IMAGE_ASPECT_AUTO, IMAGE_ASPECT_RATIOS, MAX_TASK_DEPTH, NewThreadDialog, PillSelect, REMIND_TASK, REMIND_TASK_ID, RecurrenceBuilder, SKILL_FIELD_TYPE_LABELS, SKILL_MAIN_FILENAME, SKILL_SOURCE_LABELS, SKILL_TYPES, SKILL_TYPE_LABELS, STATUS_LABELS, STATUS_ORDER, STATUS_TONE, SUMMARISE, SUMMARISE_ID, SendBackControl, SkillDetail, SkillDetailSection, SkillEditForm, SkillFilterChips, SkillGenerateForm, SkillLibraryDetail, SkillTile, SkillViewToggle, TASK_COLUMN_ORDER, TIMELINE, TIMELINE_ID, TIMELINE_PROMPT, TRANSLATE, TRANSLATE_ID, TRANSLATE_LANGUAGES, TRIGGER_LABELS, TaskActivityDialog, TaskActivityTimeline, TaskComposer, TaskEmptyState, TaskMoveDialog, TaskOutputsCell, TaskPlan, TaskRunsDialog, TaskStatusPill, TaskTable, ThreadStatusLine, TupleArrayField, UploadTaskItem, UploadTaskList, WEB_WORKFLOWS, WORKFLOW_REGISTRY, WorkflowRunStatus, WorkflowRunner, WorkflowStepAction, WorkflowThreadStartedBy, WorkflowThreadStrip, activeStepId, agentConfigSectionToValues, agentCreatorToConfigSection, asTaskStatus, authModeFor, buildLibrarySkills, buildTaskRows, buildZipSkillImport, closeWorkflowLaunch, composePersona, composerToTaskQuery, composerToWorkRequest, composerToWorkflowRequest, composerToWorkflowUpdate, createTaskColumns, createsWork, defaultScopeRenderer, defaultTaskComposerValues, deriveAgentName, deriveAnnotationName, deriveWorkflowName, descendantIds, filterConversationRows, filterLibrarySkills, firstWords, formatElapsed, goalProgress, groupAgentTasks, groupThreadActivity, hasTaskFields, humanizeSection, importMarkdownSkill, importSkillFile, importSkillFromUrl, indexTasks, inferType, inputDocumentIds, isAgenticWorkflow, isMainSkillFile, isOutOfBounds, isPlainTodo, isValidAgentName, isoToLocalInput, labelRef, labelRefKey, localInputToIso, matchRequiredLabels, moveTargets, newThreadToRequest, nextCriterionId, openWorkflowLaunch, ownerExtId, parseSkillFrontmatter, prettifyKey, readSkillArchive, recordWorkflowUse, renderWorkflowIcon, requiredLabelsOf, resetWorkflowUsage, resolveScopeInputs, serializeSkill, skillSlug, sortByRecentUse, stepWindow, stripPersonaPreamble, summarizeAgent, summarizeCapabilities, taskActivityHeadline, taskComposerToCreateRequest, taskComposerToUpdateRequest, taskNeedsAccess, taskToComposerValues, unresolvedLabelRefs, useWorkflowLaunchRequest, useWorkflowUsage, useWorkflowView, withLabelIds, workflowFromSkillMarkdown, workflowTaskFields, workflowToComposerValues, workflowToSkillMarkdown, workflowWhen } from './chunk-SOBLG72E.js';
43
+ export { useWorkflowPreview } from './chunk-76O7J6IZ.js';
44
+ export { ANNOTATE, ANNOTATE_ID, ActionStepBody, AgentAvatarField, AgentBar, AgentBarIconButton, AgentBarMenu, AgentBarNotes, AgentBarProbeAnswer, AgentBarQueuedNote, AgentBarStatus, AgentCard, AgentConnectInstructions, AgentCreateView, AgentCreatedView, AgentCreator, AgentEditView, AgentGallery, AgentMainView, AgentTypeSelector, ApprovalEvidence, AssigneeLine, BUILTIN_SKILLS, CHRONOLOGY, CHRONOLOGY_ID, CUSTOM_TASK, CUSTOM_TASK_ID, CapabilityGrid, CapabilityTile, ConfigField, ConfigForm, ConsentActions, ConsentBulletList, ConsentCard, ConsentFootnote, ConsentHeader, ConsentMessage, ConsentNotice, ConsentPage, ConsentPermissionList, ConsentSection, ConsentStrong, ConsentText, ConversationListView, ConversationTurnSpeaker, CopyableUrl, DASHBOARD_OPERATIONS, DASHBOARD_PINNED, DEEP_RESEARCH, DEEP_RESEARCH_ID, DEFAULT_AGENT_AVATAR_FIELD_LABELS, DEFAULT_AGENT_BAR_LABELS, DEFAULT_AGENT_CAPABILITIES, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_CREATOR_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_AGENT_TEMPLATES, DEFAULT_AGENT_TYPES, DEFAULT_AGENT_TYPE_SELECTOR_LABELS, DEFAULT_AUTHORIZE_AGENT_LABELS, DEFAULT_CONFIG_FIELD_LABELS, DEFAULT_CONFIG_FORM_LABELS, DEFAULT_CONSENT_ACTIONS_LABELS, DEFAULT_COPYABLE_URL_LABELS, DEFAULT_NEW_THREAD_DIALOG_LABELS, DEFAULT_PILL_SELECT_LABELS, DEFAULT_RECURRENCE_BUILDER_LABELS, DEFAULT_SKILL_EDIT_FORM_LABELS, DEFAULT_SKILL_GENERATE_FORM_LABELS, DEFAULT_SKILL_VIEW_TOGGLE_LABELS, DEFAULT_STEP_BAR_LABELS, DEFAULT_TASK_ACTIVITY_LABELS, DEFAULT_TASK_COMPOSER_LABELS, DEFAULT_TASK_LIST_LABELS, DEFAULT_TASK_OUTPUTS_CELL_LABELS, DEFAULT_TASK_PLAN_LABELS, DEFAULT_TASK_RUNS_DIALOG_LABELS, DEFAULT_TASK_STATUS_PILL_LABELS, DEFAULT_THREAD_STATE_LABELS, DEFAULT_TUPLE_ARRAY_FIELD_LABELS, DEFAULT_UPLOAD_TASK_ITEM_LABELS, DEFAULT_UPLOAD_TASK_LIST_LABELS, DEFAULT_WORKFLOW_RUNNER_LABELS, DEFAULT_WORKFLOW_RUN_STATUS_LABELS, DEFAULT_WORKFLOW_STEP_PARTS_LABELS, DEFAULT_WORKFLOW_THREAD_STRIP_LABELS, DERIVED_NAME_WORDS, EMPTY_NEW_THREAD, GENERATE_IMAGE, GENERATE_IMAGE_ID, IMAGE_ASPECT_AUTO, IMAGE_ASPECT_RATIOS, MAX_TASK_DEPTH, NewThreadDialog, PillSelect, REMIND_TASK, REMIND_TASK_ID, RecurrenceBuilder, SKILL_FIELD_TYPE_LABELS, SKILL_MAIN_FILENAME, SKILL_SOURCE_LABELS, SKILL_TYPES, SKILL_TYPE_LABELS, STATUS_LABELS, STATUS_ORDER, STATUS_TONE, SUMMARISE, SUMMARISE_ID, SendBackControl, SkillDetail, SkillDetailSection, SkillEditForm, SkillFilterChips, SkillGenerateForm, SkillLibraryDetail, SkillTile, SkillViewToggle, TASK_COLUMN_ORDER, TIMELINE, TIMELINE_ID, TIMELINE_PROMPT, TRANSLATE, TRANSLATE_ID, TRANSLATE_LANGUAGES, TRIGGER_LABELS, TaskActivityDialog, TaskActivityTimeline, TaskComposer, TaskEmptyState, TaskMoveDialog, TaskOutputsCell, TaskPlan, TaskRunsDialog, TaskStatusPill, TaskTable, ThreadStatusLine, TupleArrayField, UploadTaskItem, UploadTaskList, WEB_WORKFLOWS, WORKFLOW_REGISTRY, WorkflowRunStatus, WorkflowRunner, WorkflowStepAction, WorkflowThreadStartedBy, WorkflowThreadStrip, activeStepId, agentConfigSectionToValues, agentCreatorToConfigSection, asTaskStatus, authModeFor, buildLibrarySkills, buildTaskRows, buildZipSkillImport, closeWorkflowLaunch, composePersona, composerToTaskQuery, composerToWorkRequest, composerToWorkflowRequest, composerToWorkflowUpdate, createTaskColumns, createsWork, defaultScopeRenderer, defaultTaskComposerValues, deriveAgentName, deriveAnnotationName, deriveWorkflowName, descendantIds, filterConversationRows, filterLibrarySkills, firstWords, formatElapsed, goalProgress, groupAgentTasks, groupThreadActivity, hasTaskFields, humanizeSection, importMarkdownSkill, importSkillFile, importSkillFromUrl, indexTasks, inferType, inputDocumentIds, isAgenticWorkflow, isMainSkillFile, isOutOfBounds, isPlainTodo, isValidAgentName, isoToLocalInput, labelRef, labelRefKey, localInputToIso, matchRequiredLabels, moveTargets, newThreadToRequest, nextCriterionId, openWorkflowLaunch, ownerExtId, parseSkillFrontmatter, prettifyKey, readSkillArchive, recordWorkflowUse, renderWorkflowIcon, requiredLabelsOf, resetWorkflowUsage, resolveScopeInputs, serializeSkill, skillSlug, sortByRecentUse, stepWindow, stripPersonaPreamble, summarizeAgent, summarizeCapabilities, taskActivityHeadline, taskComposerToCreateRequest, taskComposerToUpdateRequest, taskNeedsAccess, taskToComposerValues, unresolvedLabelRefs, useWorkflowLaunchRequest, useWorkflowUsage, useWorkflowView, withLabelIds, workflowFromSkillMarkdown, workflowTaskFields, workflowToComposerValues, workflowToSkillMarkdown, workflowWhen } from './chunk-T7LLYVOW.js';
45
45
  export { AUTOMATION_EVENTS, AssistantEntity, DEFAULT_AGENT_STEPS_LABELS, DEFAULT_RECURRENCE, DEFAULT_SUBAGENT_ROSTER_LABELS, EntityChip, GoalCriteria, MODEL_NAME_ICONS, MODEL_TIER_ICON_MAP, MODEL_TIER_LABELS, STEP_ICON_MAP, StepDetail, StepNarration, StepOutcome, StepParams, StepRow, StepSummary, StepTrace, StepTraceSummary, SubAgentLane, SubStepGroup, SubagentRoster, TAG_ICONS, TOOL_ICON_MAP, TaskFlow, ThreadActivity, WEEKDAYS, buildRRule, compactThreadActivity, describeRRule, describeTrigger, fromPlanAssignee, fromPlanDocumentRef, fromPlanSteps, getAgentStepIcon, getAgentStepPresentation, getCurrentAgentStepPresentation, getModelIcon, isIncompleteSignal, isSupersededStop, latestMessageTime, layoutFromPlanSteps, linkedRunsFromActivity, notifiedLabel, parseRRule, stepAccent, toPlanAssignee, toPlanDocumentRef, toPlanSteps, unnotifiedMentions } from './chunk-RIBQCTBQ.js';
46
46
  export { ChevronShape, ProgressChevron, ProgressChevronBar } from './chunk-LRPGXNMA.js';
47
47
  export { WORD_ASK, WORD_ASK_ID, WORD_CONTINUE, WORD_CONTINUE_ID, WORD_SUMMARISE, WORD_SUMMARISE_ID, WORD_SUPPORT, WORD_SUPPORT_ID, WORD_WORKFLOWS } from './chunk-3NBIP4K2.js';
48
- export { AgentSelect, DEFAULT_AGENT_SELECT_LABELS, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_TASK_TRIGGER_CHIP_LABELS, DEFAULT_WORKFLOW_CATALOGUE_LABELS, DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS, DEFAULT_WORKFLOW_LIST_LABELS, PersonPill, SchemaForm, TaskTriggerChip, WORKFLOW_COLUMN_ORDER, WorkflowCatalogueSections, WorkflowConfigDialog, WorkflowDocumentsField, WorkflowLauncher, WorkflowsTable, buildWorkflowScopeSource, createWorkflowColumns, documentScopeLabels, matchWorkflowScope } from './chunk-H2DG5HIO.js';
48
+ export { AgentSelect, DEFAULT_AGENT_SELECT_LABELS, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_TASK_TRIGGER_CHIP_LABELS, DEFAULT_WORKFLOW_CATALOGUE_LABELS, DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, DEFAULT_WORKFLOW_DOCUMENTS_FIELD_LABELS, DEFAULT_WORKFLOW_LIST_LABELS, PersonPill, SchemaForm, TaskTriggerChip, WORKFLOW_COLUMN_ORDER, WorkflowCatalogueSections, WorkflowConfigDialog, WorkflowDocumentsField, WorkflowLauncher, WorkflowsTable, buildWorkflowScopeSource, createWorkflowColumns, documentScopeLabels, matchWorkflowScope } from './chunk-RZG4ALKZ.js';
49
49
  export { hasTrigger, isScheduledWorkflow, isSkillRow, workflowSignal, workflowStatus, workflowTriggerType } from './chunk-4QUUU7GH.js';
50
50
  import './chunk-DL6KPLNR.js';
51
51
  import './chunk-I2W77S37.js';
@@ -63,13 +63,13 @@ export { ARBI_ROUTES, createRouteCodec, hrefFor, isDeepLinkPath, parseHref, path
63
63
  export { AccountRecoveryDialog, AuthAlert, AuthConsent, AuthDivider, AuthField, AuthFieldBadge, AuthFooterLinks, AuthHeading, AuthHero, AuthInput, AuthLayout, AuthLink, AuthNote, AuthOfflineBadge, AuthSubmitButton, AuthTabs, DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS, DEFAULT_AUTH_CONSENT_LABELS, DEFAULT_AUTH_FOOTER_LINKS_LABELS, DEFAULT_AUTH_OFFLINE_BADGE_LABELS, DEFAULT_PASSWORD_RULES, DEFAULT_RECOVERY_KEY_DIALOG_LABELS, DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS, RecoveryKeyDialog, RevealablePasswordInput, consumeFragmentCredentials, createPasswordRules, parseAuthError, parseFragmentCredentials, promptSaveCredential, useFragmentCredentials } from './chunk-FVZ2CN4A.js';
64
64
  export { getInstallInstructions, isIosDevice } from './chunk-GIVU67LY.js';
65
65
  export { DEFAULT_PASSWORD_STRENGTH_INPUT_LABELS, PasswordStrengthInput } from './chunk-I6F6RBKV.js';
66
+ import './chunk-WNDIVNPT.js';
66
67
  export { EntityTooltip, EntityTooltipHeader, EntityTooltipHint, EntityTooltipSection, EntityTooltipStats } from './chunk-3UIJLUXN.js';
67
68
  export { DEFAULT_DM_INVITE_CHIP_LABELS, DmInviteChip, DmThreadHeader } from './chunk-2S3LT5KE.js';
68
69
  export { ArbiHost, useHost } from './chunk-BH4MK2J5.js';
69
70
  export { DEFAULT_TAB_HEADER_LABELS, TabHeader } from './chunk-USTSEENR.js';
70
71
  export { EmptyState } from './chunk-P6GHJSLR.js';
71
72
  import './chunk-PFF5IZGS.js';
72
- import './chunk-WNDIVNPT.js';
73
73
  export { AssistantToaster } from './chunk-YCINS3YV.js';
74
74
  export { ComposerAccessories, ComposerTools, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, Conversation, ConversationBody, ConversationHeader, ConversationHeaderActions, ConversationHistoryPane, ConversationLoading, ConversationMain, ConversationRoot, ConversationSearchView, ConversationSettingsButton, DEFAULT_CONVERSATION_LAYOUT_LABELS, DEFAULT_CONVERSATION_PARTS_LABELS, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_DRAFTING_DOC_CHIP_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_PENDING_ANSWER_BAR_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, DraftingDocChip, LabelPinRow, NewChatButton, NewPaChatButton, PaModeBadge, PendingAnswerBar, PinnedDocChip, useDismissibleCard } from './chunk-KFVOZOMX.js';
75
75
  export { AssistantDock, AssistantDockToggle, useAssistantDock } from './chunk-E4MNUJEU.js';
@@ -11,8 +11,8 @@ var chunkOYXWQTHF_cjs = require('../chunk-OYXWQTHF.cjs');
11
11
  require('../chunk-II2OEXHW.cjs');
12
12
  var chunk4PA6VCCR_cjs = require('../chunk-4PA6VCCR.cjs');
13
13
  require('../chunk-M74FWYNL.cjs');
14
- require('../chunk-SJSGSHIT.cjs');
15
14
  var chunkVZOOGA47_cjs = require('../chunk-VZOOGA47.cjs');
15
+ require('../chunk-SJSGSHIT.cjs');
16
16
  require('../chunk-UDSHVNU3.cjs');
17
17
  require('../chunk-IPSHAMO2.cjs');
18
18
  require('../chunk-PPCATBOY.cjs');
@@ -9,8 +9,8 @@ export { MultiSelect } from '../chunk-I2W77S37.js';
9
9
  import '../chunk-53EY2DOZ.js';
10
10
  export { DEFAULT_TRI_STATE_FILTER_MENU_LABELS, TriStateFilterMenu } from '../chunk-ZQ5YTC3P.js';
11
11
  import '../chunk-I6F6RBKV.js';
12
- import '../chunk-USTSEENR.js';
13
12
  export { DEFAULT_DOCUMENT_PICKER_LABELS, DocumentPicker } from '../chunk-WNDIVNPT.js';
13
+ import '../chunk-USTSEENR.js';
14
14
  import '../chunk-XDDORJPA.js';
15
15
  import '../chunk-X5YMI6A7.js';
16
16
  import '../chunk-NPLYHR2E.js';
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkDCHNB7DF_cjs = require('../chunk-DCHNB7DF.cjs');
5
- require('../chunk-CIXA5A65.cjs');
4
+ var chunkXM4KRGCK_cjs = require('../chunk-XM4KRGCK.cjs');
5
+ require('../chunk-YZ6YOOTF.cjs');
6
6
  require('../chunk-KWJW5TMH.cjs');
7
7
  require('../chunk-XTCNETMI.cjs');
8
8
  require('../chunk-TZHLO7HF.cjs');
9
9
  require('../chunk-AEQT2QQX.cjs');
10
- var chunk5ZWEUUJN_cjs = require('../chunk-5ZWEUUJN.cjs');
10
+ var chunkECCV4YOL_cjs = require('../chunk-ECCV4YOL.cjs');
11
11
  require('../chunk-464YPRAE.cjs');
12
12
  require('../chunk-LCPU44GW.cjs');
13
13
  var chunkSIYNZR5B_cjs = require('../chunk-SIYNZR5B.cjs');
@@ -32,12 +32,12 @@ require('../chunk-SK6HQ46Q.cjs');
32
32
  require('../chunk-VLCY46K6.cjs');
33
33
  var chunkNSD37OF5_cjs = require('../chunk-NSD37OF5.cjs');
34
34
  require('../chunk-OEJQFPWO.cjs');
35
- var chunkZSWMRG72_cjs = require('../chunk-ZSWMRG72.cjs');
36
- var chunkMBXQSBG3_cjs = require('../chunk-MBXQSBG3.cjs');
35
+ var chunkAINS6VU6_cjs = require('../chunk-AINS6VU6.cjs');
36
+ var chunkJ4CXF4A7_cjs = require('../chunk-J4CXF4A7.cjs');
37
37
  var chunkKNC77LZZ_cjs = require('../chunk-KNC77LZZ.cjs');
38
38
  var chunkI4IS6ST6_cjs = require('../chunk-I4IS6ST6.cjs');
39
39
  require('../chunk-EVZH6Z5O.cjs');
40
- var chunk6HI5OXB6_cjs = require('../chunk-6HI5OXB6.cjs');
40
+ var chunkSYWJNSPS_cjs = require('../chunk-SYWJNSPS.cjs');
41
41
  require('../chunk-3YEXZX4H.cjs');
42
42
  require('../chunk-ZHUQYIV3.cjs');
43
43
  require('../chunk-OYXWQTHF.cjs');
@@ -50,6 +50,8 @@ require('../chunk-6UZC4XVV.cjs');
50
50
  require('../chunk-ZK3D3RWK.cjs');
51
51
  require('../chunk-LKK52DEY.cjs');
52
52
  require('../chunk-M74FWYNL.cjs');
53
+ require('../chunk-QUMUAJ2P.cjs');
54
+ require('../chunk-VZOOGA47.cjs');
53
55
  require('../chunk-F5T4W2R2.cjs');
54
56
  require('../chunk-5HEMXXHR.cjs');
55
57
  var chunkBFKTZUFT_cjs = require('../chunk-BFKTZUFT.cjs');
@@ -59,8 +61,6 @@ var chunkLUO46ELJ_cjs = require('../chunk-LUO46ELJ.cjs');
59
61
  require('../chunk-SJSGSHIT.cjs');
60
62
  require('../chunk-ZW6FPIFC.cjs');
61
63
  require('../chunk-ZT5MIFLC.cjs');
62
- require('../chunk-QUMUAJ2P.cjs');
63
- require('../chunk-VZOOGA47.cjs');
64
64
  require('../chunk-7CSEMMDJ.cjs');
65
65
  require('../chunk-YQT24SAZ.cjs');
66
66
  require('../chunk-Z6JUJI4A.cjs');
@@ -1661,7 +1661,7 @@ function triggerFields(trigger, clearOthers) {
1661
1661
  return {
1662
1662
  timezone: trigger.timezone,
1663
1663
  rrule: trigger.start === "repeat" ? trigger.rrule.trim() : none,
1664
- run_at: trigger.start === "once" ? chunkMBXQSBG3_cjs.localInputToIso(trigger.runAt) : none,
1664
+ run_at: trigger.start === "once" ? chunkJ4CXF4A7_cjs.localInputToIso(trigger.runAt) : none,
1665
1665
  event_kind: trigger.start === "event" ? trigger.eventKind.trim() : none,
1666
1666
  // A step signal is `workflow_signal` narrowed to one signal name.
1667
1667
  event_filter: filter ?? none,
@@ -1720,7 +1720,7 @@ function workflowRecordToBuilder(record) {
1720
1720
  ...record.skill_ref ? { workflow: record.skill_ref } : { run: { kind: "prompt", promptTemplate: record.prompt } }
1721
1721
  }
1722
1722
  ] : [];
1723
- const when = chunkMBXQSBG3_cjs.workflowWhen(record);
1723
+ const when = chunkJ4CXF4A7_cjs.workflowWhen(record);
1724
1724
  return {
1725
1725
  workflow: {
1726
1726
  id: record.external_id,
@@ -1734,7 +1734,7 @@ function workflowRecordToBuilder(record) {
1734
1734
  trigger: {
1735
1735
  ...DEFAULT_WORKFLOW_TRIGGER,
1736
1736
  start: when === "now" ? "manual" : when,
1737
- runAt: chunkMBXQSBG3_cjs.isoToLocalInput(record.run_at),
1737
+ runAt: chunkJ4CXF4A7_cjs.isoToLocalInput(record.run_at),
1738
1738
  rrule: record.rrule ?? "",
1739
1739
  timezone: record.timezone || DEFAULT_WORKFLOW_TRIGGER.timezone,
1740
1740
  eventKind: record.event_kind ?? "",
@@ -1849,7 +1849,7 @@ function TriggerInspector({
1849
1849
  }
1850
1850
  )
1851
1851
  ] }),
1852
- trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkMBXQSBG3_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1852
+ trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkJ4CXF4A7_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1853
1853
  trigger.start === "event" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1854
1854
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.event }),
1855
1855
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1901,7 +1901,7 @@ function TriggerInspector({
1901
1901
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1902
1902
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.agent }),
1903
1903
  /* @__PURE__ */ jsxRuntime.jsx(
1904
- chunk6HI5OXB6_cjs.AgentSelect,
1904
+ chunkSYWJNSPS_cjs.AgentSelect,
1905
1905
  {
1906
1906
  agents,
1907
1907
  value: trigger.agentId,
@@ -2740,13 +2740,13 @@ function WorkflowPreview({
2740
2740
  renderIcon,
2741
2741
  testId
2742
2742
  }) {
2743
- const run = chunkZSWMRG72_cjs.useWorkflowPreview(workflow, {
2743
+ const run = chunkAINS6VU6_cjs.useWorkflowPreview(workflow, {
2744
2744
  resolveWorkflow: (id) => workflows.find((w) => w.id === id),
2745
2745
  compose,
2746
2746
  answer
2747
2747
  });
2748
2748
  return /* @__PURE__ */ jsxRuntime.jsx(
2749
- chunkMBXQSBG3_cjs.WorkflowRunner,
2749
+ chunkJ4CXF4A7_cjs.WorkflowRunner,
2750
2750
  {
2751
2751
  workflow,
2752
2752
  run,
@@ -3005,7 +3005,7 @@ function ConnectedWorkflowsPage({
3005
3005
  const config = host.workflows;
3006
3006
  const { openConversation, openFiles } = chunkUIXY4HKM_cjs.useBlocksEnvironment();
3007
3007
  const openWorkflow = chunkSIYNZR5B_cjs.useOpenWorkflow();
3008
- const renderPerson = chunkDCHNB7DF_cjs.useRenderTaskPerson();
3008
+ const renderPerson = chunkXM4KRGCK_cjs.useRenderTaskPerson();
3009
3009
  const refreshDocuments = react$2.useRefreshDocuments();
3010
3010
  const invalidateTags = react$2.useInvalidateTagData();
3011
3011
  const { data: tags = [] } = react$2.useTags();
@@ -3036,7 +3036,7 @@ function ConnectedWorkflowsPage({
3036
3036
  openHistory,
3037
3037
  closeHistoryTab,
3038
3038
  selectHistoryTab
3039
- } = chunkDCHNB7DF_cjs.useWorkflowsPageState({
3039
+ } = chunkXM4KRGCK_cjs.useWorkflowsPageState({
3040
3040
  historyWorkflowId: requestedHistoryId ?? historyWorkflowId,
3041
3041
  onHistoryWorkflowConsumed: consumeHistory
3042
3042
  });
@@ -3094,11 +3094,11 @@ function ConnectedWorkflowsPage({
3094
3094
  const renderErrorReport = config?.renderErrorReport;
3095
3095
  const running = runningId ? config?.catalogue?.find((entry) => entry.workflow.id === runningId) : void 0;
3096
3096
  if (running && running.runnable !== false) {
3097
- const stepWorkflows = config?.stepWorkflows ?? chunkMBXQSBG3_cjs.WEB_WORKFLOWS;
3097
+ const stepWorkflows = config?.stepWorkflows ?? chunkJ4CXF4A7_cjs.WEB_WORKFLOWS;
3098
3098
  return (
3099
3099
  // The page in the Workflows page's frame: padded, scrolling.
3100
3100
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full min-h-0 w-full overflow-auto p-4 sm:p-6", children: /* @__PURE__ */ jsxRuntime.jsx(
3101
- chunkDCHNB7DF_cjs.ConnectedWorkflowRunPage,
3101
+ chunkXM4KRGCK_cjs.ConnectedWorkflowRunPage,
3102
3102
  {
3103
3103
  workflow: running.workflow,
3104
3104
  projectFrom: running.projectFrom,
@@ -3171,7 +3171,7 @@ function ConnectedWorkflowsPage({
3171
3171
  {
3172
3172
  workflowId: builder.kind === "saved" ? builder.id : void 0,
3173
3173
  initial: template ? { workflow: template.workflow, trigger: DEFAULT_WORKFLOW_TRIGGER } : void 0,
3174
- workflows: config?.stepWorkflows ?? chunkMBXQSBG3_cjs.WEB_WORKFLOWS,
3174
+ workflows: config?.stepWorkflows ?? chunkJ4CXF4A7_cjs.WEB_WORKFLOWS,
3175
3175
  renderIcon: config?.renderIcon,
3176
3176
  onSaved: (id) => builderSaved(id, builderKey),
3177
3177
  testId: "workflow-builder-canvas",
@@ -3186,7 +3186,7 @@ function ConnectedWorkflowsPage({
3186
3186
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col", "data-testid": testId, children: [
3187
3187
  pageHeader && /* @__PURE__ */ jsxRuntime.jsx(chunkNSD37OF5_cjs.PageHeader, { ...pageHeader }),
3188
3188
  /* @__PURE__ */ jsxRuntime.jsx(
3189
- chunk5ZWEUUJN_cjs.ConnectedWorkflowsTable,
3189
+ chunkECCV4YOL_cjs.ConnectedWorkflowsTable,
3190
3190
  {
3191
3191
  onOpenTemplate: (id) => openBuilder({ kind: "template", id }),
3192
3192
  tabs: [
@@ -3216,7 +3216,7 @@ function ConnectedWorkflowsPage({
3216
3216
  }
3217
3217
  },
3218
3218
  content: hostTab ? hostTab.content : runsFor ? /* @__PURE__ */ jsxRuntime.jsx(
3219
- chunkDCHNB7DF_cjs.ConnectedWorkflowHistory,
3219
+ chunkXM4KRGCK_cjs.ConnectedWorkflowHistory,
3220
3220
  {
3221
3221
  inline: true,
3222
3222
  hideHeader: true,
@@ -3280,7 +3280,7 @@ function ConnectedWorkflowsPage({
3280
3280
  }
3281
3281
  ),
3282
3282
  /* @__PURE__ */ jsxRuntime.jsx(
3283
- chunkDCHNB7DF_cjs.ConnectedTaskComposer,
3283
+ chunkXM4KRGCK_cjs.ConnectedTaskComposer,
3284
3284
  {
3285
3285
  kind: "workflow",
3286
3286
  saveOnly: true,
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { useRenderTaskPerson, useWorkflowsPageState, ConnectedWorkflowRunPage, ConnectedWorkflowHistory, ConnectedTaskComposer } from '../chunk-TG4S236F.js';
3
- import '../chunk-CVYFX7AD.js';
2
+ import { useRenderTaskPerson, useWorkflowsPageState, ConnectedWorkflowRunPage, ConnectedWorkflowHistory, ConnectedTaskComposer } from '../chunk-LZI4EGOW.js';
3
+ import '../chunk-SEBNGA3F.js';
4
4
  import '../chunk-57CG33XJ.js';
5
5
  import '../chunk-Y7UHKEVT.js';
6
6
  import '../chunk-5T5CM7UC.js';
7
7
  import '../chunk-5PAQWN5U.js';
8
- import { ConnectedWorkflowsTable } from '../chunk-CY2K4K5M.js';
8
+ import { ConnectedWorkflowsTable } from '../chunk-42IVGYNL.js';
9
9
  import '../chunk-MTSKK3BN.js';
10
10
  import '../chunk-Y7UIFRWC.js';
11
11
  import { useOpenWorkflow } from '../chunk-K2U5BCQ2.js';
@@ -30,12 +30,12 @@ import '../chunk-ELA7Y5YW.js';
30
30
  import '../chunk-K4BGOPGG.js';
31
31
  import { PageHeader } from '../chunk-XCVLUXFP.js';
32
32
  import '../chunk-VIIBJBTX.js';
33
- import { useWorkflowPreview } from '../chunk-I4PB257E.js';
34
- import { workflowWhen, isoToLocalInput, RecurrenceBuilder, WorkflowRunner, WEB_WORKFLOWS, localInputToIso } from '../chunk-SOBLG72E.js';
33
+ import { useWorkflowPreview } from '../chunk-76O7J6IZ.js';
34
+ import { workflowWhen, isoToLocalInput, RecurrenceBuilder, WorkflowRunner, WEB_WORKFLOWS, localInputToIso } from '../chunk-T7LLYVOW.js';
35
35
  import { isIncompleteSignal, fromPlanSteps, layoutFromPlanSteps, describeRRule, describeTrigger, toPlanSteps } from '../chunk-RIBQCTBQ.js';
36
36
  import { ChevronShape } from '../chunk-LRPGXNMA.js';
37
37
  import '../chunk-3NBIP4K2.js';
38
- import { AgentSelect } from '../chunk-H2DG5HIO.js';
38
+ import { AgentSelect } from '../chunk-RZG4ALKZ.js';
39
39
  import '../chunk-4QUUU7GH.js';
40
40
  import '../chunk-DL6KPLNR.js';
41
41
  import '../chunk-I2W77S37.js';
@@ -48,6 +48,8 @@ import '../chunk-P4CH2ATT.js';
48
48
  import '../chunk-KPLWLHWH.js';
49
49
  import '../chunk-7F5Z4K5W.js';
50
50
  import '../chunk-I6F6RBKV.js';
51
+ import '../chunk-OJIX5NBN.js';
52
+ import '../chunk-WNDIVNPT.js';
51
53
  import '../chunk-SOLSDXOZ.js';
52
54
  import '../chunk-46IG4KY7.js';
53
55
  import { useConnectedTags, useListedDocuments, useConnectedConversations } from '../chunk-CCUXCN4M.js';
@@ -57,8 +59,6 @@ import { useHost } from '../chunk-BH4MK2J5.js';
57
59
  import '../chunk-USTSEENR.js';
58
60
  import '../chunk-P6GHJSLR.js';
59
61
  import '../chunk-PFF5IZGS.js';
60
- import '../chunk-OJIX5NBN.js';
61
- import '../chunk-WNDIVNPT.js';
62
62
  import '../chunk-K57LFBUW.js';
63
63
  import '../chunk-GWAL6O7B.js';
64
64
  import '../chunk-W3E4F65Y.js';
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkC5CWKZ5D_cjs = require('../chunk-C5CWKZ5D.cjs');
5
- var chunkCIXA5A65_cjs = require('../chunk-CIXA5A65.cjs');
5
+ var chunkYZ6YOOTF_cjs = require('../chunk-YZ6YOOTF.cjs');
6
6
  var chunkKWJW5TMH_cjs = require('../chunk-KWJW5TMH.cjs');
7
7
  require('../chunk-UMMZNZV3.cjs');
8
8
  require('../chunk-AEQT2QQX.cjs');
@@ -156,31 +156,31 @@ Object.defineProperty(exports, "getRoleDescription", {
156
156
  });
157
157
  Object.defineProperty(exports, "FormActions", {
158
158
  enumerable: true,
159
- get: function () { return chunkCIXA5A65_cjs.FormActions; }
159
+ get: function () { return chunkYZ6YOOTF_cjs.FormActions; }
160
160
  });
161
161
  Object.defineProperty(exports, "FormErrorBanner", {
162
162
  enumerable: true,
163
- get: function () { return chunkCIXA5A65_cjs.FormErrorBanner; }
163
+ get: function () { return chunkYZ6YOOTF_cjs.FormErrorBanner; }
164
164
  });
165
165
  Object.defineProperty(exports, "ModalActionRow", {
166
166
  enumerable: true,
167
- get: function () { return chunkCIXA5A65_cjs.ModalActionRow; }
167
+ get: function () { return chunkYZ6YOOTF_cjs.ModalActionRow; }
168
168
  });
169
169
  Object.defineProperty(exports, "ProjectOptionRow", {
170
170
  enumerable: true,
171
- get: function () { return chunkCIXA5A65_cjs.ProjectOptionRow; }
171
+ get: function () { return chunkYZ6YOOTF_cjs.ProjectOptionRow; }
172
172
  });
173
173
  Object.defineProperty(exports, "ProjectPicker", {
174
174
  enumerable: true,
175
- get: function () { return chunkCIXA5A65_cjs.ProjectPicker; }
175
+ get: function () { return chunkYZ6YOOTF_cjs.ProjectPicker; }
176
176
  });
177
177
  Object.defineProperty(exports, "WorkspaceFieldsView", {
178
178
  enumerable: true,
179
- get: function () { return chunkCIXA5A65_cjs.WorkspaceFieldsView; }
179
+ get: function () { return chunkYZ6YOOTF_cjs.WorkspaceFieldsView; }
180
180
  });
181
181
  Object.defineProperty(exports, "WorkspaceFormModal", {
182
182
  enumerable: true,
183
- get: function () { return chunkCIXA5A65_cjs.WorkspaceFormModal; }
183
+ get: function () { return chunkYZ6YOOTF_cjs.WorkspaceFormModal; }
184
184
  });
185
185
  Object.defineProperty(exports, "NO_PROJECT_GROUP_KEY", {
186
186
  enumerable: true,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { WorkspaceCard } from '../chunk-JGA2JJEL.js';
3
3
  export { CommonWorkspaceToggle, DEFAULT_WORKSPACE_CARD_LABELS, ExpandableSection, ItalicNone, LeaveFooter, PageLoading, WorkspaceAudienceLine, WorkspaceCard, WorkspaceGroup, WorkspaceIdentityPanel, WorkspaceList, WorkspacePageFrame, WorkspaceProjectSlot, WorkspaceTypeBadge, formatRole, getRoleBadgeClass, getRoleDescription } from '../chunk-JGA2JJEL.js';
4
- export { FormActions, FormErrorBanner, ModalActionRow, ProjectOptionRow, ProjectPicker, WorkspaceFieldsView, WorkspaceFormModal } from '../chunk-CVYFX7AD.js';
4
+ export { FormActions, FormErrorBanner, ModalActionRow, ProjectOptionRow, ProjectPicker, WorkspaceFieldsView, WorkspaceFormModal } from '../chunk-SEBNGA3F.js';
5
5
  export { NO_PROJECT_GROUP_KEY, WORKSPACE_CATEGORY_FILTERS, byRecentUpdate, getHumanUserCount, getVariantBgClass, getVariantBorderClass, getWorkspaceTypeInfo, groupWorkspacesByProject, isAgentAccount, isListedWorkspace, projectFilterId, workspaceConversationCount, workspaceDocumentCount, workspaceFilterAttributes, workspaceGroupStats } from '../chunk-57CG33XJ.js';
6
6
  import '../chunk-CPLZ6XGT.js';
7
7
  import '../chunk-5PAQWN5U.js';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/coedit",
3
- "version": "0.5.95",
3
+ "version": "0.5.97",
4
4
  "description": "Real-time collaboration for the ARBI native DOCX editor: a Yjs mirror of the canonical OOXML package, session, and server runtime",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/blocks",
3
- "version": "0.5.95",
3
+ "version": "0.5.97",
4
4
  "description": "Composable, domain-neutral UI blocks for ARBI apps, organised by capability (retrieval, facts, agents, workspaces, citations, collaboration) plus shell, theme and site primitives, on top of @arbidocs/react.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -331,9 +331,9 @@
331
331
  "example:test:e2e": "playwright test -c examples/custom-ui/playwright.config.ts"
332
332
  },
333
333
  "dependencies": {
334
- "@arbidocs/client": "0.5.95",
335
- "@arbidocs/coedit": "0.5.95",
336
- "@arbidocs/sdk": "0.5.95",
334
+ "@arbidocs/client": "0.5.97",
335
+ "@arbidocs/coedit": "0.5.97",
336
+ "@arbidocs/sdk": "0.5.97",
337
337
  "@auth0/auth0-react": "^2.19.0",
338
338
  "@dnd-kit/core": "^6.3.1",
339
339
  "@dnd-kit/sortable": "^10.0.0",
@@ -382,7 +382,7 @@
382
382
  "y-protocols": "^1.0.6"
383
383
  },
384
384
  "peerDependencies": {
385
- "@arbidocs/react": "0.5.95",
385
+ "@arbidocs/react": "0.5.97",
386
386
  "@lexical/html": "0.35.0",
387
387
  "@lexical/link": "0.35.0",
388
388
  "@lexical/list": "0.35.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ConnectedStreamedWordArtifact-WFKYXIX5.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/connection/viewer/DocumentViewerDialog.tsx","../src/connection/files/page/FilesViewerDialog.tsx"],"names":["tab","jsx"],"mappings":"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","file":"FilesViewerDialog-4Q6WJMSX.js","sourcesContent":["/**\n * The document viewer as a dialog (the files page's own viewer): a title, the tabs\n * the host offers, and under them the review (`DocumentReview`), the whole viewer, or a question\n * (`AskBar`) that starts a thread about the document. Views of existing parts, not a new viewer.\n */\n\nimport { useState, type ReactNode } from 'react'\nimport { Eye, FileText, MessageSquareText, PenLine } from 'lucide-react'\nimport {\n DocumentReview,\n useArbiSessionState,\n useArbiSessionStore,\n useDocuments,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { AskBar } from '../../components/AskBar'\nimport { SegmentedControl, type SegmentedOption } from '../../settings/SegmentedControl'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport {\n DEFAULT_ASK_SUGGESTIONS,\n DEFAULT_DOCUMENT_VIEWER_LABELS,\n DEFAULT_DOCUMENT_VIEWER_TABS,\n type DocumentViewerDialogLabels,\n type DocumentViewerTab,\n} from './documentViewerTabs'\n\ntype ReviewDocument = Parameters<typeof DocumentReview>[0]['doc']\n\nexport interface DocumentViewerDialogProps {\n /** The document, or a version reference `doc-…@v{n}`. */\n documentId: string\n /** The views offered, in order. Default: review, document, ask. */\n tabs?: readonly DocumentViewerTab[]\n /** The view it opens on. Default: the first offered. */\n initialTab?: DocumentViewerTab\n labels?: DocumentViewerDialogLabels\n /** The ask view's suggested questions. */\n askSuggestions?: readonly string[]\n onClose: () => void\n /** The whole viewer, for the document view. */\n renderDocument: (documentId: string) => ReactNode\n}\n\nconst titleOf = (doc: WorkspaceDocument | undefined) =>\n doc?.doc_metadata?.title || doc?.file_name || 'Document'\n\nconst TAB_ICONS: Record<DocumentViewerTab, ReactNode> = {\n review: <Eye className=\"size-4\" />,\n document: <PenLine className=\"size-4\" />,\n ask: <MessageSquareText className=\"size-4\" />,\n}\n\nconst TAB_TEST_IDS: Record<DocumentViewerTab, string> = {\n review: 'review-tab-review',\n document: 'review-tab-pdf',\n ask: 'review-tab-qa',\n}\n\nexport function DocumentViewerDialog({\n documentId,\n tabs = DEFAULT_DOCUMENT_VIEWER_TABS,\n initialTab,\n labels: labelOverrides,\n askSuggestions = DEFAULT_ASK_SUGGESTIONS,\n onClose,\n renderDocument,\n}: DocumentViewerDialogProps) {\n const labels = { ...DEFAULT_DOCUMENT_VIEWER_LABELS, ...labelOverrides }\n const { workspaceId, live } = useConnectedWorkspace()\n const session = useArbiSessionStore()\n const { openNewConversation } = useBlocksEnvironment()\n const passageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const { data: documents } = useDocuments()\n const baseId = parseVersionRef(documentId).docId\n const doc = documents?.find((d) => d.external_id === baseId)\n const title = titleOf(doc)\n\n // The whole viewer needs a signed-in session (marking up, signing, versions).\n const offered = tabs.filter((tab) => tab !== 'document' || live)\n const [chosen, setChosen] = useState<DocumentViewerTab | undefined>(initialTab)\n const tab = chosen && offered.includes(chosen) ? chosen : offered[0]\n\n const options: SegmentedOption<DocumentViewerTab>[] = offered.map((value) => ({\n value,\n label: labels[value],\n icon: TAB_ICONS[value],\n testId: TAB_TEST_IDS[value],\n }))\n\n // A question opens a new thread about the document, as the viewer's \"Chat\" does.\n const ask = (question: string) => {\n openNewConversation({ prompt: question })\n session.setNewChatDocumentId(baseId)\n }\n\n return (\n <Dialog open onOpenChange={(open) => !open && onClose()}>\n <DialogContent\n className=\"flex h-[90vh] max-w-[95vw] flex-col gap-0 p-0 sm:max-w-[95vw]\"\n data-testid=\"documents-dialog\"\n >\n <DialogHeader className=\"border-b px-4 py-3\">\n <DialogTitle className=\"flex min-w-0 items-center gap-2 pr-8 text-base\">\n <FileText className=\"size-4 shrink-0\" />\n <span className=\"truncate\" data-testid=\"documents-dialog-title\">\n {title}\n </span>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {offered.map((value) => labels[value]).join(', ')}: {title}\n </DialogDescription>\n {options.length > 1 && tab && (\n <SegmentedControl\n ariaLabel=\"Document view\"\n // A phone fits the three on one row: no label breaks over two lines.\n className=\"mt-2 w-fit max-w-full overflow-x-auto [&_button]:whitespace-nowrap max-sm:[&_button]:px-2.5\"\n value={tab}\n onChange={setChosen}\n options={options}\n />\n )}\n </DialogHeader>\n <div className=\"min-h-0 flex-1 overflow-hidden p-3\">\n {tab === 'review' && (\n <DocumentReview\n docId={baseId}\n doc={doc as ReviewDocument}\n workspaceId={workspaceId ?? undefined}\n activeChunkId={passageId}\n />\n )}\n {tab === 'document' && (\n <div className=\"h-full overflow-hidden\" data-testid=\"documents-dialog-viewer\">\n {renderDocument(documentId)}\n </div>\n )}\n {tab === 'ask' && (\n <div className=\"mx-auto max-w-2xl space-y-3 pt-6\" data-testid=\"doc-qa-panel\">\n <p className=\"text-sm text-muted-foreground\">{labels.askIntro}</p>\n <AskBar\n testId=\"doc-ask\"\n placeholder={labels.askPlaceholder.replace('{title}', title)}\n suggestions={[...askSuggestions]}\n onAsk={ask}\n />\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The files page's own viewer (a page without a host viewer): `DocumentViewerDialog`, with the\n * whole `ConnectedDocumentViewer` as its document view. The page lazy-loads this module, so the\n * viewer stays out of the page's chunk.\n */\nimport { ConnectedDocumentViewer } from '../../viewer/ConnectedDocumentViewer'\nimport {\n DocumentViewerDialog,\n type DocumentViewerDialogProps,\n} from '../../viewer/DocumentViewerDialog'\n\nexport interface FilesViewerDialogProps extends Omit<DocumentViewerDialogProps, 'renderDocument'> {\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\nexport function FilesViewerDialog({ artifactRuntimeUrl, ...props }: FilesViewerDialogProps) {\n return (\n <DocumentViewerDialog\n {...props}\n renderDocument={(id) => (\n <ConnectedDocumentViewer documentId={id} artifactRuntimeUrl={artifactRuntimeUrl} />\n )}\n />\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/connection/viewer/DocumentViewerDialog.tsx","../src/connection/files/page/FilesViewerDialog.tsx"],"names":["jsx","Eye","PenLine","MessageSquareText","DEFAULT_DOCUMENT_VIEWER_TABS","DEFAULT_ASK_SUGGESTIONS","DEFAULT_DOCUMENT_VIEWER_LABELS","useConnectedWorkspace","useArbiSessionStore","useBlocksEnvironment","useArbiSessionState","useDocuments","parseVersionRef","tab","useState","Dialog","jsxs","DialogContent","DialogHeader","DialogTitle","FileText","DialogDescription","SegmentedControl","DocumentReview","AskBar","ConnectedDocumentViewer"],"mappings":"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","file":"FilesViewerDialog-H4ZXFNLV.cjs","sourcesContent":["/**\n * The document viewer as a dialog (the files page's own viewer): a title, the tabs\n * the host offers, and under them the review (`DocumentReview`), the whole viewer, or a question\n * (`AskBar`) that starts a thread about the document. Views of existing parts, not a new viewer.\n */\n\nimport { useState, type ReactNode } from 'react'\nimport { Eye, FileText, MessageSquareText, PenLine } from 'lucide-react'\nimport {\n DocumentReview,\n useArbiSessionState,\n useArbiSessionStore,\n useDocuments,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { AskBar } from '../../components/AskBar'\nimport { SegmentedControl, type SegmentedOption } from '../../settings/SegmentedControl'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport {\n DEFAULT_ASK_SUGGESTIONS,\n DEFAULT_DOCUMENT_VIEWER_LABELS,\n DEFAULT_DOCUMENT_VIEWER_TABS,\n type DocumentViewerDialogLabels,\n type DocumentViewerTab,\n} from './documentViewerTabs'\n\ntype ReviewDocument = Parameters<typeof DocumentReview>[0]['doc']\n\nexport interface DocumentViewerDialogProps {\n /** The document, or a version reference `doc-…@v{n}`. */\n documentId: string\n /** The views offered, in order. Default: review, document, ask. */\n tabs?: readonly DocumentViewerTab[]\n /** The view it opens on. Default: the first offered. */\n initialTab?: DocumentViewerTab\n labels?: DocumentViewerDialogLabels\n /** The ask view's suggested questions. */\n askSuggestions?: readonly string[]\n onClose: () => void\n /** The whole viewer, for the document view. */\n renderDocument: (documentId: string) => ReactNode\n}\n\nconst titleOf = (doc: WorkspaceDocument | undefined) =>\n doc?.doc_metadata?.title || doc?.file_name || 'Document'\n\nconst TAB_ICONS: Record<DocumentViewerTab, ReactNode> = {\n review: <Eye className=\"size-4\" />,\n document: <PenLine className=\"size-4\" />,\n ask: <MessageSquareText className=\"size-4\" />,\n}\n\nconst TAB_TEST_IDS: Record<DocumentViewerTab, string> = {\n review: 'review-tab-review',\n document: 'review-tab-pdf',\n ask: 'review-tab-qa',\n}\n\nexport function DocumentViewerDialog({\n documentId,\n tabs = DEFAULT_DOCUMENT_VIEWER_TABS,\n initialTab,\n labels: labelOverrides,\n askSuggestions = DEFAULT_ASK_SUGGESTIONS,\n onClose,\n renderDocument,\n}: DocumentViewerDialogProps) {\n const labels = { ...DEFAULT_DOCUMENT_VIEWER_LABELS, ...labelOverrides }\n const { workspaceId, live } = useConnectedWorkspace()\n const session = useArbiSessionStore()\n const { openNewConversation } = useBlocksEnvironment()\n const passageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const { data: documents } = useDocuments()\n const baseId = parseVersionRef(documentId).docId\n const doc = documents?.find((d) => d.external_id === baseId)\n const title = titleOf(doc)\n\n // The whole viewer needs a signed-in session (marking up, signing, versions).\n const offered = tabs.filter((tab) => tab !== 'document' || live)\n const [chosen, setChosen] = useState<DocumentViewerTab | undefined>(initialTab)\n const tab = chosen && offered.includes(chosen) ? chosen : offered[0]\n\n const options: SegmentedOption<DocumentViewerTab>[] = offered.map((value) => ({\n value,\n label: labels[value],\n icon: TAB_ICONS[value],\n testId: TAB_TEST_IDS[value],\n }))\n\n // A question opens a new thread about the document, as the viewer's \"Chat\" does.\n const ask = (question: string) => {\n openNewConversation({ prompt: question })\n session.setNewChatDocumentId(baseId)\n }\n\n return (\n <Dialog open onOpenChange={(open) => !open && onClose()}>\n <DialogContent\n className=\"flex h-[90vh] max-w-[95vw] flex-col gap-0 p-0 sm:max-w-[95vw]\"\n data-testid=\"documents-dialog\"\n >\n <DialogHeader className=\"border-b px-4 py-3\">\n <DialogTitle className=\"flex min-w-0 items-center gap-2 pr-8 text-base\">\n <FileText className=\"size-4 shrink-0\" />\n <span className=\"truncate\" data-testid=\"documents-dialog-title\">\n {title}\n </span>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {offered.map((value) => labels[value]).join(', ')}: {title}\n </DialogDescription>\n {options.length > 1 && tab && (\n <SegmentedControl\n ariaLabel=\"Document view\"\n // A phone fits the three on one row: no label breaks over two lines.\n className=\"mt-2 w-fit max-w-full overflow-x-auto [&_button]:whitespace-nowrap max-sm:[&_button]:px-2.5\"\n value={tab}\n onChange={setChosen}\n options={options}\n />\n )}\n </DialogHeader>\n <div className=\"min-h-0 flex-1 overflow-hidden p-3\">\n {tab === 'review' && (\n <DocumentReview\n docId={baseId}\n doc={doc as ReviewDocument}\n workspaceId={workspaceId ?? undefined}\n activeChunkId={passageId}\n />\n )}\n {tab === 'document' && (\n <div className=\"h-full overflow-hidden\" data-testid=\"documents-dialog-viewer\">\n {renderDocument(documentId)}\n </div>\n )}\n {tab === 'ask' && (\n <div className=\"mx-auto max-w-2xl space-y-3 pt-6\" data-testid=\"doc-qa-panel\">\n <p className=\"text-sm text-muted-foreground\">{labels.askIntro}</p>\n <AskBar\n testId=\"doc-ask\"\n placeholder={labels.askPlaceholder.replace('{title}', title)}\n suggestions={[...askSuggestions]}\n onAsk={ask}\n />\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The files page's own viewer (a page without a host viewer): `DocumentViewerDialog`, with the\n * whole `ConnectedDocumentViewer` as its document view. The page lazy-loads this module, so the\n * viewer stays out of the page's chunk.\n */\nimport { ConnectedDocumentViewer } from '../../viewer/ConnectedDocumentViewer'\nimport {\n DocumentViewerDialog,\n type DocumentViewerDialogProps,\n} from '../../viewer/DocumentViewerDialog'\n\nexport interface FilesViewerDialogProps extends Omit<DocumentViewerDialogProps, 'renderDocument'> {\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\nexport function FilesViewerDialog({ artifactRuntimeUrl, ...props }: FilesViewerDialogProps) {\n return (\n <DocumentViewerDialog\n {...props}\n renderDocument={(id) => (\n <ConnectedDocumentViewer documentId={id} artifactRuntimeUrl={artifactRuntimeUrl} />\n )}\n />\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workspaces/WorkspaceFormParts.tsx"],"names":["jsxs","cn","jsx","AlertCircle","entityNoun","getEntityLabel","Dialog","DialogContent","ModalHeader","Fragment","DialogTitle","DialogDescription","Select","SelectTrigger","FolderKanban","SelectValue","SelectContent","SelectItem","SelectSeparator","Plus","useId","useState","KeyValueRow","FileText","Input","AlignLeft","Globe","CreditCard"],"mappings":"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","file":"chunk-CIXA5A65.cjs","sourcesContent":["import { useState, type ReactNode, useId } from 'react'\nimport {\n AlertCircle,\n AlignLeft,\n CreditCard,\n FileText,\n FolderKanban,\n Globe,\n Plus,\n} from 'lucide-react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n entityNoun,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport { KeyValueRow } from '../home/KeyValueRow'\nimport { ModalHeader } from '../settings/ModalScaffold'\n\n/** Inline error strip of a form. */\nexport function FormErrorBanner({\n message,\n testId,\n className,\n id,\n}: {\n message: string\n testId?: string\n className?: string\n /** Lets a field point at this message with `aria-describedby`. */\n id?: string\n}) {\n return (\n <div\n id={id}\n role=\"alert\"\n data-slot=\"form-error\"\n data-testid={testId}\n className={cn(\n 'flex items-center gap-2 rounded-md border border-red-border bg-red-bg p-3 text-sm text-red-text',\n className\n )}\n >\n <AlertCircle className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n {message}\n </div>\n )\n}\n\n/** Right-aligned footer row of a form (Cancel + submit). */\nexport function FormActions({ className, children }: { className?: string; children: ReactNode }) {\n return (\n <div\n data-slot=\"form-actions\"\n className={cn('sticky bottom-0 flex justify-end gap-2 bg-background pt-2', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Footer row of a modal body, separated by a rule. */\nexport function ModalActionRow({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"modal-action-row\"\n className=\"sticky bottom-0 -mx-6 -mb-6 flex flex-col-reverse gap-2 border-t border-border bg-background px-6 pb-6 pt-3 sm:flex-row sm:items-center sm:justify-end\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceFormModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n variant?: 'create' | 'welcome' | 'forProject'\n title?: ReactNode\n /** Icon before the title. */\n icon?: ReactNode\n /** Optional intro paragraph above the form (first-run welcome). */\n intro?: ReactNode\n testId?: string\n /** Visually hidden description. */\n description?: string\n children: ReactNode\n}\n\n/** Dialog frame of the create-workspace form: header, optional intro, scrolling body. */\nexport function WorkspaceFormModal({\n open,\n onOpenChange,\n variant = 'create',\n title,\n icon,\n intro,\n testId,\n description = `Create a new ${entityNoun('WORKSPACE')}`,\n children,\n}: WorkspaceFormModalProps) {\n const noun = entityNoun('WORKSPACE')\n const heading =\n title ??\n (variant === 'welcome'\n ? `Welcome — let's create your first ${noun}`\n : `Create New ${getEntityLabel('WORKSPACE')}`)\n const introduction =\n intro ??\n (variant === 'welcome'\n ? `A ${noun} is an encrypted vault for storing information and collaborating with AI. Give it a name to get started — you can always create more later.`\n : undefined)\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0\"\n data-testid={testId}\n >\n <ModalHeader>\n <ModalTitleRow icon={icon} title={heading} description={description} />\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">\n {introduction && <p className=\"pb-4 text-sm text-muted-foreground\">{introduction}</p>}\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction ModalTitleRow({\n icon,\n title,\n description,\n}: {\n icon?: ReactNode\n title: ReactNode\n description: string\n}) {\n return (\n <>\n <DialogTitle>\n <div className=\"flex items-center gap-2\">\n {icon}\n <span>{title}</span>\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </>\n )\n}\n\n/** One entry of the project picker: identity on the left, optional quota summary on the right. */\nexport function ProjectOptionRow({ identity, meta }: { identity: ReactNode; meta?: string }) {\n return (\n <div className=\"flex w-full min-w-0 items-center gap-2\">\n {identity}\n {meta && <span className=\"ml-auto truncate text-sm text-muted-foreground\">{meta}</span>}\n </div>\n )\n}\n\nexport interface ProjectPickerOption {\n id: string\n content: ReactNode\n}\n\nexport interface ProjectPickerProps {\n value?: string\n options: ProjectPickerOption[]\n onChange: (id: string) => void\n /**\n * `form` (default): the full-width field of the workspace form. `welcome`: the compact switcher\n * in the welcome dialog's quota header (muted pill, menu aligned to its end). `run`: where a\n * workflow run works (the run page's target), a taller field with the project mark, as wide as\n * a project's name needs on a desktop and the full width on a phone.\n */\n variant?: 'form' | 'welcome' | 'run'\n /** Adds a \"Create new project...\" entry. */\n onCreate?: () => void\n disabled?: boolean\n readOnly?: boolean\n className?: string\n labels?: { placeholder: string; create: string }\n /**\n * Trigger test id (default `workspace-project-select`, `welcome-modal-project-select` or\n * `workflow-run-project-select`).\n */\n testId?: string\n}\n\nconst CREATE_VALUE = '__create__'\n\n/** The one project picker: a workspace's owning project (optionally with a create entry), or the\n * welcome dialog's project switcher (`variant=\"welcome\"`). */\nexport function ProjectPicker({\n value,\n options,\n onChange,\n variant = 'form',\n onCreate,\n disabled,\n readOnly,\n className,\n labels = {\n placeholder: `Select ${entityNoun('PROJECT')}`,\n create: `Create new ${entityNoun('PROJECT')}...`,\n },\n testId,\n}: ProjectPickerProps) {\n const welcome = variant === 'welcome'\n const run = variant === 'run'\n return (\n <Select\n // A run starts on no project until one is chosen: the placeholder, not the first one.\n value={run ? value : (value ?? options[0]?.id)}\n onValueChange={(v) => (v === CREATE_VALUE ? onCreate?.() : onChange(v))}\n disabled={disabled || readOnly}\n >\n <SelectTrigger\n className={cn(\n welcome &&\n 'h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11',\n run && 'h-10 w-full gap-2 sm:max-w-md pointer-coarse:h-11',\n className,\n readOnly && 'cursor-not-allowed'\n )}\n data-testid={\n testId ??\n (welcome\n ? 'welcome-modal-project-select'\n : run\n ? 'workflow-run-project-select'\n : 'workspace-project-select')\n }\n >\n {run && <FolderKanban className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />}\n {welcome ? (\n <SelectValue />\n ) : run ? (\n <span className=\"min-w-0 flex-1 truncate text-left\">\n <SelectValue placeholder={labels.placeholder} />\n </span>\n ) : (\n <SelectValue placeholder={labels.placeholder} />\n )}\n </SelectTrigger>\n <SelectContent align={welcome ? 'end' : run ? 'start' : undefined}>\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id}>\n {o.content}\n </SelectItem>\n ))}\n {onCreate && (\n <>\n <SelectSeparator />\n <SelectItem value={CREATE_VALUE}>\n <div className=\"flex items-center gap-1.5 text-primary\">\n <Plus className=\"size-3.5\" />\n <span>{labels.create}</span>\n </div>\n </SelectItem>\n </>\n )}\n </SelectContent>\n </Select>\n )\n}\n\nexport interface WorkspaceFieldsViewProps {\n /** `modal` (create flow) or `settings` (editing an existing workspace). */\n variant?: 'modal' | 'settings'\n name: string\n description: string\n onNameChange: (value: string) => void\n onDescriptionChange: (value: string) => void\n onNameBlur?: () => void\n onNameFocus?: () => void\n onDescriptionBlur?: () => void\n disabled?: boolean\n readOnly?: boolean\n maxNameLength?: number\n /** Id of the form's error message (a `FormErrorBanner id`): the name input is then `aria-invalid`\n * and described by it. */\n errorId?: string\n /** Content of the Visibility row (settings only); omit to hide the row. */\n visibility?: ReactNode\n /** Content of the Project row; omit to hide the row. */\n project?: ReactNode\n labels?: Partial<WorkspaceFieldsLabels>\n}\n\nexport interface WorkspaceFieldsLabels {\n readOnlyNotice: string\n name: string\n description: string\n visibility: string\n project: string\n over: (n: number) => string\n charsLeft: (n: number) => string\n}\n\nconst DEFAULT_LABELS: WorkspaceFieldsLabels = {\n readOnlyNotice: 'Read-only workspace',\n name: 'Name *',\n description: 'Description',\n visibility: 'Visibility',\n get project() {\n return getEntityLabel('PROJECT')\n },\n over: (n) => `${n} over`,\n charsLeft: (n) => `${n} chars left`,\n}\n\n/** Name / description / visibility / project rows shared by the create and settings forms. */\nexport function WorkspaceFieldsView({\n variant = 'modal',\n name,\n description,\n onNameChange,\n onDescriptionChange,\n onNameBlur,\n onNameFocus,\n onDescriptionBlur,\n disabled = false,\n readOnly = false,\n errorId,\n maxNameLength = 50,\n visibility,\n project,\n labels,\n}: WorkspaceFieldsViewProps) {\n const workspaceDescriptionId = useId()\n const workspaceNameId = useId()\n const l = { ...DEFAULT_LABELS, ...labels }\n const [nameFocused, setNameFocused] = useState(false)\n const isModal = variant === 'modal'\n const charsLeft = maxNameLength - name.length\n // The modal only surfaces the counter near the limit; settings shows it while focused.\n const counterVisible = !readOnly && nameFocused && (!isModal || charsLeft <= 10)\n const isDisabled = isModal ? disabled : disabled || readOnly\n\n return (\n <div className=\"space-y-1\" data-slot=\"workspace-fields\">\n {readOnly && (\n <div data-testid=\"workspace-form-readonly-notice\" className=\"sr-only\">\n {l.readOnlyNotice}\n </div>\n )}\n <KeyValueRow label={l.name} icon={<FileText size={14} />} htmlFor={workspaceNameId}>\n <div className=\"relative\">\n <Input\n id={workspaceNameId}\n type=\"text\"\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n onBlur={() => {\n setNameFocused(false)\n onNameBlur?.()\n }}\n onFocus={() => {\n setNameFocused(true)\n onNameFocus?.()\n }}\n maxLength={maxNameLength}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(\n isModal ? 'bg-background' : 'capitalize',\n readOnly && 'cursor-not-allowed',\n 'pr-20'\n )}\n required\n aria-invalid={errorId ? true : undefined}\n aria-describedby={errorId}\n data-testid=\"workspace-form-name-input\"\n />\n {counterVisible && (\n <div\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-red-text' : 'text-muted-foreground'\n )}\n >\n {charsLeft < 0 ? l.over(-charsLeft) : l.charsLeft(charsLeft)}\n </div>\n )}\n </div>\n </KeyValueRow>\n\n <KeyValueRow\n label={l.description}\n icon={<AlignLeft size={14} />}\n htmlFor={workspaceDescriptionId}\n >\n <Input\n id={workspaceDescriptionId}\n type=\"text\"\n dictate\n value={description}\n onChange={(e) => onDescriptionChange(e.target.value)}\n onBlur={onDescriptionBlur}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(isModal && 'bg-background', readOnly && 'cursor-not-allowed')}\n data-testid=\"workspace-form-description-input\"\n />\n </KeyValueRow>\n\n {visibility && (\n <KeyValueRow label={l.visibility} icon={<Globe size={14} />}>\n {visibility}\n </KeyValueRow>\n )}\n {project && (\n <KeyValueRow label={l.project} icon={<CreditCard size={14} />}>\n {project}\n </KeyValueRow>\n )}\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workspaces/WorkspaceFormParts.tsx"],"names":[],"mappings":"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","file":"chunk-CVYFX7AD.js","sourcesContent":["import { useState, type ReactNode, useId } from 'react'\nimport {\n AlertCircle,\n AlignLeft,\n CreditCard,\n FileText,\n FolderKanban,\n Globe,\n Plus,\n} from 'lucide-react'\nimport {\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n entityNoun,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport { KeyValueRow } from '../home/KeyValueRow'\nimport { ModalHeader } from '../settings/ModalScaffold'\n\n/** Inline error strip of a form. */\nexport function FormErrorBanner({\n message,\n testId,\n className,\n id,\n}: {\n message: string\n testId?: string\n className?: string\n /** Lets a field point at this message with `aria-describedby`. */\n id?: string\n}) {\n return (\n <div\n id={id}\n role=\"alert\"\n data-slot=\"form-error\"\n data-testid={testId}\n className={cn(\n 'flex items-center gap-2 rounded-md border border-red-border bg-red-bg p-3 text-sm text-red-text',\n className\n )}\n >\n <AlertCircle className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n {message}\n </div>\n )\n}\n\n/** Right-aligned footer row of a form (Cancel + submit). */\nexport function FormActions({ className, children }: { className?: string; children: ReactNode }) {\n return (\n <div\n data-slot=\"form-actions\"\n className={cn('sticky bottom-0 flex justify-end gap-2 bg-background pt-2', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Footer row of a modal body, separated by a rule. */\nexport function ModalActionRow({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"modal-action-row\"\n className=\"sticky bottom-0 -mx-6 -mb-6 flex flex-col-reverse gap-2 border-t border-border bg-background px-6 pb-6 pt-3 sm:flex-row sm:items-center sm:justify-end\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceFormModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n variant?: 'create' | 'welcome' | 'forProject'\n title?: ReactNode\n /** Icon before the title. */\n icon?: ReactNode\n /** Optional intro paragraph above the form (first-run welcome). */\n intro?: ReactNode\n testId?: string\n /** Visually hidden description. */\n description?: string\n children: ReactNode\n}\n\n/** Dialog frame of the create-workspace form: header, optional intro, scrolling body. */\nexport function WorkspaceFormModal({\n open,\n onOpenChange,\n variant = 'create',\n title,\n icon,\n intro,\n testId,\n description = `Create a new ${entityNoun('WORKSPACE')}`,\n children,\n}: WorkspaceFormModalProps) {\n const noun = entityNoun('WORKSPACE')\n const heading =\n title ??\n (variant === 'welcome'\n ? `Welcome — let's create your first ${noun}`\n : `Create New ${getEntityLabel('WORKSPACE')}`)\n const introduction =\n intro ??\n (variant === 'welcome'\n ? `A ${noun} is an encrypted vault for storing information and collaborating with AI. Give it a name to get started — you can always create more later.`\n : undefined)\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex max-h-panel w-modal max-w-modal-vw flex-col overflow-hidden p-0\"\n data-testid={testId}\n >\n <ModalHeader>\n <ModalTitleRow icon={icon} title={heading} description={description} />\n </ModalHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-6 pb-6\">\n {introduction && <p className=\"pb-4 text-sm text-muted-foreground\">{introduction}</p>}\n {children}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction ModalTitleRow({\n icon,\n title,\n description,\n}: {\n icon?: ReactNode\n title: ReactNode\n description: string\n}) {\n return (\n <>\n <DialogTitle>\n <div className=\"flex items-center gap-2\">\n {icon}\n <span>{title}</span>\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </>\n )\n}\n\n/** One entry of the project picker: identity on the left, optional quota summary on the right. */\nexport function ProjectOptionRow({ identity, meta }: { identity: ReactNode; meta?: string }) {\n return (\n <div className=\"flex w-full min-w-0 items-center gap-2\">\n {identity}\n {meta && <span className=\"ml-auto truncate text-sm text-muted-foreground\">{meta}</span>}\n </div>\n )\n}\n\nexport interface ProjectPickerOption {\n id: string\n content: ReactNode\n}\n\nexport interface ProjectPickerProps {\n value?: string\n options: ProjectPickerOption[]\n onChange: (id: string) => void\n /**\n * `form` (default): the full-width field of the workspace form. `welcome`: the compact switcher\n * in the welcome dialog's quota header (muted pill, menu aligned to its end). `run`: where a\n * workflow run works (the run page's target), a taller field with the project mark, as wide as\n * a project's name needs on a desktop and the full width on a phone.\n */\n variant?: 'form' | 'welcome' | 'run'\n /** Adds a \"Create new project...\" entry. */\n onCreate?: () => void\n disabled?: boolean\n readOnly?: boolean\n className?: string\n labels?: { placeholder: string; create: string }\n /**\n * Trigger test id (default `workspace-project-select`, `welcome-modal-project-select` or\n * `workflow-run-project-select`).\n */\n testId?: string\n}\n\nconst CREATE_VALUE = '__create__'\n\n/** The one project picker: a workspace's owning project (optionally with a create entry), or the\n * welcome dialog's project switcher (`variant=\"welcome\"`). */\nexport function ProjectPicker({\n value,\n options,\n onChange,\n variant = 'form',\n onCreate,\n disabled,\n readOnly,\n className,\n labels = {\n placeholder: `Select ${entityNoun('PROJECT')}`,\n create: `Create new ${entityNoun('PROJECT')}...`,\n },\n testId,\n}: ProjectPickerProps) {\n const welcome = variant === 'welcome'\n const run = variant === 'run'\n return (\n <Select\n // A run starts on no project until one is chosen: the placeholder, not the first one.\n value={run ? value : (value ?? options[0]?.id)}\n onValueChange={(v) => (v === CREATE_VALUE ? onCreate?.() : onChange(v))}\n disabled={disabled || readOnly}\n >\n <SelectTrigger\n className={cn(\n welcome &&\n 'h-7 w-auto max-w-[9.5rem] shrink-0 gap-1 border-none bg-muted px-2 text-xs font-medium pointer-coarse:h-11',\n run && 'h-10 w-full gap-2 sm:max-w-md pointer-coarse:h-11',\n className,\n readOnly && 'cursor-not-allowed'\n )}\n data-testid={\n testId ??\n (welcome\n ? 'welcome-modal-project-select'\n : run\n ? 'workflow-run-project-select'\n : 'workspace-project-select')\n }\n >\n {run && <FolderKanban className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />}\n {welcome ? (\n <SelectValue />\n ) : run ? (\n <span className=\"min-w-0 flex-1 truncate text-left\">\n <SelectValue placeholder={labels.placeholder} />\n </span>\n ) : (\n <SelectValue placeholder={labels.placeholder} />\n )}\n </SelectTrigger>\n <SelectContent align={welcome ? 'end' : run ? 'start' : undefined}>\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id}>\n {o.content}\n </SelectItem>\n ))}\n {onCreate && (\n <>\n <SelectSeparator />\n <SelectItem value={CREATE_VALUE}>\n <div className=\"flex items-center gap-1.5 text-primary\">\n <Plus className=\"size-3.5\" />\n <span>{labels.create}</span>\n </div>\n </SelectItem>\n </>\n )}\n </SelectContent>\n </Select>\n )\n}\n\nexport interface WorkspaceFieldsViewProps {\n /** `modal` (create flow) or `settings` (editing an existing workspace). */\n variant?: 'modal' | 'settings'\n name: string\n description: string\n onNameChange: (value: string) => void\n onDescriptionChange: (value: string) => void\n onNameBlur?: () => void\n onNameFocus?: () => void\n onDescriptionBlur?: () => void\n disabled?: boolean\n readOnly?: boolean\n maxNameLength?: number\n /** Id of the form's error message (a `FormErrorBanner id`): the name input is then `aria-invalid`\n * and described by it. */\n errorId?: string\n /** Content of the Visibility row (settings only); omit to hide the row. */\n visibility?: ReactNode\n /** Content of the Project row; omit to hide the row. */\n project?: ReactNode\n labels?: Partial<WorkspaceFieldsLabels>\n}\n\nexport interface WorkspaceFieldsLabels {\n readOnlyNotice: string\n name: string\n description: string\n visibility: string\n project: string\n over: (n: number) => string\n charsLeft: (n: number) => string\n}\n\nconst DEFAULT_LABELS: WorkspaceFieldsLabels = {\n readOnlyNotice: 'Read-only workspace',\n name: 'Name *',\n description: 'Description',\n visibility: 'Visibility',\n get project() {\n return getEntityLabel('PROJECT')\n },\n over: (n) => `${n} over`,\n charsLeft: (n) => `${n} chars left`,\n}\n\n/** Name / description / visibility / project rows shared by the create and settings forms. */\nexport function WorkspaceFieldsView({\n variant = 'modal',\n name,\n description,\n onNameChange,\n onDescriptionChange,\n onNameBlur,\n onNameFocus,\n onDescriptionBlur,\n disabled = false,\n readOnly = false,\n errorId,\n maxNameLength = 50,\n visibility,\n project,\n labels,\n}: WorkspaceFieldsViewProps) {\n const workspaceDescriptionId = useId()\n const workspaceNameId = useId()\n const l = { ...DEFAULT_LABELS, ...labels }\n const [nameFocused, setNameFocused] = useState(false)\n const isModal = variant === 'modal'\n const charsLeft = maxNameLength - name.length\n // The modal only surfaces the counter near the limit; settings shows it while focused.\n const counterVisible = !readOnly && nameFocused && (!isModal || charsLeft <= 10)\n const isDisabled = isModal ? disabled : disabled || readOnly\n\n return (\n <div className=\"space-y-1\" data-slot=\"workspace-fields\">\n {readOnly && (\n <div data-testid=\"workspace-form-readonly-notice\" className=\"sr-only\">\n {l.readOnlyNotice}\n </div>\n )}\n <KeyValueRow label={l.name} icon={<FileText size={14} />} htmlFor={workspaceNameId}>\n <div className=\"relative\">\n <Input\n id={workspaceNameId}\n type=\"text\"\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n onBlur={() => {\n setNameFocused(false)\n onNameBlur?.()\n }}\n onFocus={() => {\n setNameFocused(true)\n onNameFocus?.()\n }}\n maxLength={maxNameLength}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(\n isModal ? 'bg-background' : 'capitalize',\n readOnly && 'cursor-not-allowed',\n 'pr-20'\n )}\n required\n aria-invalid={errorId ? true : undefined}\n aria-describedby={errorId}\n data-testid=\"workspace-form-name-input\"\n />\n {counterVisible && (\n <div\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-red-text' : 'text-muted-foreground'\n )}\n >\n {charsLeft < 0 ? l.over(-charsLeft) : l.charsLeft(charsLeft)}\n </div>\n )}\n </div>\n </KeyValueRow>\n\n <KeyValueRow\n label={l.description}\n icon={<AlignLeft size={14} />}\n htmlFor={workspaceDescriptionId}\n >\n <Input\n id={workspaceDescriptionId}\n type=\"text\"\n dictate\n value={description}\n onChange={(e) => onDescriptionChange(e.target.value)}\n onBlur={onDescriptionBlur}\n readOnly={readOnly}\n disabled={isDisabled}\n className={cn(isModal && 'bg-background', readOnly && 'cursor-not-allowed')}\n data-testid=\"workspace-form-description-input\"\n />\n </KeyValueRow>\n\n {visibility && (\n <KeyValueRow label={l.visibility} icon={<Globe size={14} />}>\n {visibility}\n </KeyValueRow>\n )}\n {project && (\n <KeyValueRow label={l.project} icon={<CreditCard size={14} />}>\n {project}\n </KeyValueRow>\n )}\n </div>\n )\n}\n"]}