@arbidocs/blocks 0.5.115 → 0.5.117

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 (147) hide show
  1. package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-OZBTU3IT.cjs} +20 -20
  2. package/dist/{ConnectedCallDock-WER7R222.cjs.map → ConnectedCallDock-OZBTU3IT.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-VMZE2NFP.cjs} +13 -13
  4. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-VMZE2NFP.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs → ConnectedNativeDocxComparison-7OUKTKYP.cjs} +20 -20
  6. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs.map → ConnectedNativeDocxComparison-7OUKTKYP.cjs.map} +1 -1
  7. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
  8. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs → ConnectedStreamedWordArtifact-7V24ZDAC.cjs} +20 -20
  10. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map → ConnectedStreamedWordArtifact-7V24ZDAC.cjs.map} +1 -1
  11. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-OCPFVMLD.cjs} +15 -15
  12. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
  13. package/dist/{FilesViewerDialog-I5QIHQZT.cjs → FilesViewerDialog-KLRDIYEH.cjs} +45 -45
  14. package/dist/{FilesViewerDialog-I5QIHQZT.cjs.map → FilesViewerDialog-KLRDIYEH.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-H6TAEVGY.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
  16. package/dist/{NativeDocxEditor-H6TAEVGY.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
  17. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-IMAZICIZ.cjs} +8 -8
  18. package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
  19. package/dist/agents/index.cjs +297 -297
  20. package/dist/{ai-IM4A23YT.cjs → ai-7U4B4CVF.cjs} +24 -24
  21. package/dist/ai-7U4B4CVF.cjs.map +1 -0
  22. package/dist/calls/index.cjs +121 -121
  23. package/dist/chat/index.cjs +1 -1
  24. package/dist/{chunk-M6IKVKU5.cjs → chunk-2CSLFAGF.cjs} +392 -149
  25. package/dist/chunk-2CSLFAGF.cjs.map +1 -0
  26. package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
  27. package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  28. package/dist/{chunk-P77YTTJ3.cjs → chunk-3ODEWSRO.cjs} +4 -4
  29. package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
  30. package/dist/{chunk-DDIW4HLU.cjs → chunk-3U36VYMD.cjs} +27 -27
  31. package/dist/{chunk-DDIW4HLU.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
  32. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  33. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  34. package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
  35. package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  36. package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
  37. package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
  38. package/dist/{chunk-Y24V6HPR.cjs → chunk-57EE6CMW.cjs} +15 -15
  39. package/dist/{chunk-Y24V6HPR.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
  40. package/dist/{chunk-NNUK5ZM7.cjs → chunk-5QUL5BZO.cjs} +4 -4
  41. package/dist/{chunk-NNUK5ZM7.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
  42. package/dist/{chunk-OEREKAAP.cjs → chunk-6DCIZA3X.cjs} +75 -75
  43. package/dist/{chunk-OEREKAAP.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
  44. package/dist/{chunk-YGXOKB5Z.cjs → chunk-7TEUGFIL.cjs} +4 -4
  45. package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
  46. package/dist/{chunk-TT4IF52H.cjs → chunk-7X3FS5HQ.cjs} +35 -35
  47. package/dist/{chunk-TT4IF52H.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
  48. package/dist/{chunk-CPR6EHG7.cjs → chunk-7XT5B2DZ.cjs} +47 -47
  49. package/dist/{chunk-CPR6EHG7.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
  50. package/dist/chunk-BKY2LAV2.cjs +18 -0
  51. package/dist/{chunk-CIHERNDO.cjs.map → chunk-BKY2LAV2.cjs.map} +1 -1
  52. package/dist/{chunk-XKVPSOKP.cjs → chunk-BW5MF464.cjs} +4 -4
  53. package/dist/{chunk-XKVPSOKP.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
  54. package/dist/{chunk-IW7CDJTA.cjs → chunk-COD5ENHK.cjs} +4 -4
  55. package/dist/{chunk-IW7CDJTA.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
  56. package/dist/{chunk-A3T3IC3K.cjs → chunk-D7ICHGWM.cjs} +239 -85
  57. package/dist/chunk-D7ICHGWM.cjs.map +1 -0
  58. package/dist/{chunk-TDO5UWXF.cjs → chunk-E4BLRF2L.cjs} +5 -5
  59. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E4BLRF2L.cjs.map} +1 -1
  60. package/dist/{chunk-WR2SF44W.cjs → chunk-E4DUXU5K.cjs} +9 -9
  61. package/dist/{chunk-WR2SF44W.cjs.map → chunk-E4DUXU5K.cjs.map} +1 -1
  62. package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
  63. package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  64. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  65. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  66. package/dist/{chunk-6UTKM5AB.cjs → chunk-JSQQV23D.cjs} +3 -3
  67. package/dist/{chunk-6UTKM5AB.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
  68. package/dist/{chunk-557MJ4IH.cjs → chunk-LFRNBT2I.cjs} +20 -20
  69. package/dist/{chunk-557MJ4IH.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
  70. package/dist/{chunk-R7CJEIA5.cjs → chunk-LYTIQQQ2.cjs} +3 -3
  71. package/dist/{chunk-R7CJEIA5.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
  72. package/dist/{chunk-CPG7II4E.cjs → chunk-MC4F2URI.cjs} +28 -28
  73. package/dist/{chunk-CPG7II4E.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
  74. package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
  75. package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  76. package/dist/{chunk-ZTXQIIFV.cjs → chunk-OZVDOAXG.cjs} +6 -6
  77. package/dist/{chunk-ZTXQIIFV.cjs.map → chunk-OZVDOAXG.cjs.map} +1 -1
  78. package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
  79. package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  80. package/dist/{chunk-KTQOGT2L.cjs → chunk-TDN33HSK.cjs} +6 -6
  81. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
  82. package/dist/{chunk-T23UTIRI.cjs → chunk-UNDQYTRF.cjs} +6 -6
  83. package/dist/{chunk-T23UTIRI.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
  84. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  85. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  86. package/dist/{chunk-24EDG4PC.cjs → chunk-VBL3SHWX.cjs} +50 -50
  87. package/dist/{chunk-24EDG4PC.cjs.map → chunk-VBL3SHWX.cjs.map} +1 -1
  88. package/dist/{chunk-3A7QWUAW.cjs → chunk-VKH3BEZE.cjs} +3 -3
  89. package/dist/{chunk-3A7QWUAW.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
  90. package/dist/{chunk-X5LANJDZ.cjs → chunk-VTYJAZDU.cjs} +23 -15
  91. package/dist/chunk-VTYJAZDU.cjs.map +1 -0
  92. package/dist/{chunk-B3LZITVF.cjs → chunk-WW6LXQY6.cjs} +12 -12
  93. package/dist/{chunk-B3LZITVF.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
  94. package/dist/{chunk-NJCK6V6U.cjs → chunk-XKDUPU7B.cjs} +4 -4
  95. package/dist/{chunk-NJCK6V6U.cjs.map → chunk-XKDUPU7B.cjs.map} +1 -1
  96. package/dist/{chunk-42TURFHF.cjs → chunk-YGBHY67W.cjs} +5 -5
  97. package/dist/{chunk-42TURFHF.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
  98. package/dist/connect/docx.cjs +24 -24
  99. package/dist/connect/index.cjs +983 -983
  100. package/dist/connect/viewer.cjs +34 -34
  101. package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
  102. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  103. package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
  104. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  105. package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
  106. package/dist/connection/viewer/VersionDropdown.js +39 -0
  107. package/dist/connection/viewer/VersionDropdown.js.map +7 -0
  108. package/dist/connection/viewer/ViewerPdfPane.js +4 -1
  109. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  110. package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
  111. package/dist/connection/viewer/useViewerBlobs.js +14 -8
  112. package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
  113. package/dist/connection/viewer/useViewerTabs.js +10 -0
  114. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  115. package/dist/dashboards/index.cjs +1 -1
  116. package/dist/docx/DocxCommandMenu.d.ts +8 -0
  117. package/dist/docx/DocxCommandMenu.js +202 -0
  118. package/dist/docx/DocxCommandMenu.js.map +7 -0
  119. package/dist/docx/NativeDocxEditor.d.ts +4 -2
  120. package/dist/docx/NativeDocxEditor.js +51 -12
  121. package/dist/docx/NativeDocxEditor.js.map +2 -2
  122. package/dist/docx/RibbonMenu.d.ts +3 -1
  123. package/dist/docx/RibbonMenu.js +10 -3
  124. package/dist/docx/RibbonMenu.js.map +2 -2
  125. package/dist/docx/RibbonOverflow.d.ts +3 -0
  126. package/dist/docx/RibbonOverflow.js +24 -1
  127. package/dist/docx/RibbonOverflow.js.map +2 -2
  128. package/dist/docx/index.cjs +38 -38
  129. package/dist/docx/signatures/SignatureFields.d.ts +3 -1
  130. package/dist/docx/signatures/SignatureFields.js +17 -8
  131. package/dist/docx/signatures/SignatureFields.js.map +2 -2
  132. package/dist/embed/index.cjs +38 -38
  133. package/dist/files/index.cjs +224 -224
  134. package/dist/index.cjs +1590 -1590
  135. package/dist/settings/index.cjs +147 -147
  136. package/dist/shell/index.cjs +90 -90
  137. package/dist/studio/index.cjs +26 -26
  138. package/dist/styles.css +1 -1
  139. package/dist/workflow-canvas/index.cjs +55 -55
  140. package/node_modules/@arbidocs/coedit/package.json +1 -1
  141. package/package.json +5 -5
  142. package/src/docx/styles.css +94 -0
  143. package/dist/ai-IM4A23YT.cjs.map +0 -1
  144. package/dist/chunk-A3T3IC3K.cjs.map +0 -1
  145. package/dist/chunk-CIHERNDO.cjs +0 -18
  146. package/dist/chunk-M6IKVKU5.cjs.map +0 -1
  147. package/dist/chunk-X5LANJDZ.cjs.map +0 -1
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk7JLJH5CW_cjs = require('./chunk-7JLJH5CW.cjs');
5
- var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
6
5
  var chunkQRAQZTJE_cjs = require('./chunk-QRAQZTJE.cjs');
6
+ var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
7
7
  var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
8
8
  var react = require('@arbidocs/react');
9
9
  var react$1 = require('react');
@@ -189,5 +189,5 @@ exports.useUsableSkillListings = useUsableSkillListings;
189
189
  exports.useWorkflowDefinitions = useWorkflowDefinitions;
190
190
  exports.useWorkflowTasks = useWorkflowTasks;
191
191
  exports.withoutMarketplace = withoutMarketplace;
192
- //# sourceMappingURL=chunk-6UTKM5AB.cjs.map
193
- //# sourceMappingURL=chunk-6UTKM5AB.cjs.map
192
+ //# sourceMappingURL=chunk-JSQQV23D.cjs.map
193
+ //# sourceMappingURL=chunk-JSQQV23D.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/useIsExternalAccount.ts","../src/connection/workflows/useSkillsEnabled.ts","../src/connection/workflows/useHostSkills.ts","../src/connection/workflows/useNamedWorkflows.ts","../src/connection/workflows/useWorkflowDefinitions.ts","../src/connection/workflows/useWorkflowTasks.ts"],"names":["useArbiSession","useUserSettings","useHost","useMemo","skillPackWorkflows","useAssistantCopy","nameBuiltinWorkflows","useSkills","useWorkflowUsage","WEB_WORKFLOWS","DASHBOARD_OPERATIONS","mergeSkillWorkflows","DASHBOARD_PINNED","sortByRecentUse","CUSTOM_TASK","REMIND_TASK","useRunWorkflow","useStartTaskQuery","useCreateWorkflow","useUpdateConversation","useUpdateWorkflow","useArbiSessionState","useCreateWork","useBlocksEnvironment","useGrantAgentAccess","useCallback","useDocuments","getDocumentTitle","taskComposerToCreateRequest","taskComposerToUpdateRequest","composerToWorkflowUpdate"],"mappings":"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","file":"chunk-6UTKM5AB.cjs","sourcesContent":["import { useArbiSession } from '@arbidocs/react'\n\n/** The account fields that say it is an external one. */\ninterface AccountKind {\n temporary_access_only?: boolean | null\n user_type?: string | null\n}\n\n/** An external account: temporary access to shared workspaces only. */\nexport const isExternalAccount = (user: AccountKind | null | undefined): boolean =>\n !!user && (user.temporary_access_only === true || user.user_type === 'external')\n\n/**\n * Whether the signed-in person is an external guest. They get the built-in skills and the host's\n * skill packs, never the marketplace (the backend enforces it as well).\n */\nexport function useIsExternalAccount(): boolean {\n return isExternalAccount(useArbiSession().user)\n}\n\n/** Skill listings without the marketplace's (`visibility: global`): what an external guest gets. */\nexport const withoutMarketplace = <T extends { visibility?: string | null }>(listings: T[]): T[] =>\n listings.filter((s) => s.visibility !== 'global')\n","/**\n * The one gate for everything skill-shaped in the app: the empty chat's Start list, the skill\n * entries of the slash menu, the sidebar's Skills item, the Skills browser's entry points and the\n * typed `/skill` interception. It is the personal `show_skills` user setting, default off; the\n * switch lives in Settings, Experimental (developers only), so today only developers have it.\n */\n\nimport { useUserSettings } from '@arbidocs/react'\nimport { useIsExternalAccount } from '../useIsExternalAccount'\n\nexport function useSkillsEnabled(): boolean {\n const { data: userSettings } = useUserSettings()\n return userSettings?.show_skills ?? false\n}\n\n/**\n * Whether the Skills browser (the marketplace: \"Browse skills\", the Skills menu entry) is offered:\n * to skills users, never to an external guest (the backend enforces it as well).\n */\nexport function useCanBrowseSkills(): boolean {\n const skillsEnabled = useSkillsEnabled()\n const isExternal = useIsExternalAccount()\n return skillsEnabled && !isExternal\n}\n","/**\n * The host's skill packs (`host.workflows.skillPacks`) as the kit's workflows, and the `/` menu's\n * rows for them: one section per heading (a category, else a pack's label).\n */\nimport { useMemo } from 'react'\nimport { skillPackWorkflows, type SkillPackWorkflow } from '../../agents/workflows/skillPack'\nimport type { SlashMenuItem } from '../../chat/SlashMenu'\nimport { useHost } from '../../provider/host'\n\n/** The section heading of a pack without a label or category. */\nconst DEFAULT_PACK_LABEL = 'Skills from this site'\n\nconst NO_PACKS: SkillPackWorkflow[] = []\n\nexport function useHostSkills(): SkillPackWorkflow[] {\n const packs = useHost().workflows?.skillPacks\n return useMemo(() => (packs?.length ? packs.flatMap(skillPackWorkflows) : NO_PACKS), [packs])\n}\n\n/**\n * A pack skill's `/` menu row. Its section is its heading (its category, else its pack's label), so\n * skills of several packs under one heading share one section.\n */\nexport function hostSkillItem(workflow: SkillPackWorkflow): SlashMenuItem {\n const label = workflow.category ?? workflow.pack.label ?? DEFAULT_PACK_LABEL\n return {\n name: workflow.id,\n description: workflow.description,\n kind: 'skill',\n group: { id: `pack-${label.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, label },\n }\n}\n","import { useMemo } from 'react'\nimport { useAssistantCopy } from '@arbidocs/react/shell'\nimport { nameBuiltinWorkflows } from '../../agents/workflows/catalogue/seed'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\n\n/** The seeded workflows in the host's assistant name (`nameBuiltinWorkflows`). */\nexport function useNamedWorkflows(\n workflows: ReadonlyArray<WorkflowDefinition>\n): WorkflowDefinition[] {\n const copy = useAssistantCopy()\n return useMemo(() => nameBuiltinWorkflows(workflows, copy), [workflows, copy])\n}\n","/**\n * The one list of workflows: the seeded ones plus every skill the user can invoke (each degraded\n * to a single-field form from its `arg_hint`). The dashboard tiles, the slash menu, tasks and\n * agents all read this.\n */\n\nimport { useMemo } from 'react'\nimport { useSkills } from '@arbidocs/react'\nimport { mergeSkillWorkflows } from '../../agents/workflows/workflow'\nimport { type WorkflowDefinition } from '../../agents/workflows/types'\nimport {\n CUSTOM_TASK,\n DASHBOARD_OPERATIONS,\n DASHBOARD_PINNED,\n REMIND_TASK,\n} from '../../agents/workflows/catalogue/seed'\nimport { useSkillsEnabled } from './useSkillsEnabled'\nimport { useHostSkills } from './useHostSkills'\nimport { useIsExternalAccount, withoutMarketplace } from '../useIsExternalAccount'\nimport { sortByRecentUse, useWorkflowUsage } from '../../agents/workflows/catalogue/workflow-usage'\nimport { WEB_WORKFLOWS } from '../../agents/workflows/catalogue/registry'\nimport { useNamedWorkflows } from './useNamedWorkflows'\n\nexport interface UseWorkflowDefinitionsResult {\n /**\n * Every skill workflow of this host: built-ins, the host's skill packs, then the user's and the\n * marketplace's (one list).\n */\n skills: WorkflowDefinition[]\n /** The user has skills switched on (`show_skills`): the gate of every skill-shaped surface. */\n skillsEnabled: boolean\n /**\n * The empty chat's Start section: built-ins first (their own order), then the user's own and\n * marketplace skills by recent use, then name. EMPTY for users without skills enabled.\n */\n start: WorkflowDefinition[]\n /** The dashboard Start band: pinned skills in order, then the operation launchers. */\n dashboard: WorkflowDefinition[]\n /** What a task can run: schedulable skills plus a free instruction and a reminder. */\n forTasks: WorkflowDefinition[]\n}\n\n/**\n * The skill listings a person may use from the menus: a host pack's slug is the pack's (an\n * installed copy is the same skill), and an external guest gets no marketplace skills.\n */\nexport function useUsableSkillListings(hostSkills: ReadonlyArray<WorkflowDefinition>) {\n const { data: listings } = useSkills()\n const isExternal = useIsExternalAccount()\n return useMemo(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n const usable = (listings ?? []).filter((s) => !packSlugs.has(s.slug))\n return isExternal ? withoutMarketplace(usable) : usable\n }, [listings, hostSkills, isExternal])\n}\n\nexport function useWorkflowDefinitions(): UseWorkflowDefinitionsResult {\n const hostSkills = useHostSkills()\n const listings = useUsableSkillListings(hostSkills)\n const usage = useWorkflowUsage()\n const skillsEnabled = useSkillsEnabled()\n const web = useNamedWorkflows(WEB_WORKFLOWS)\n const operations = useNamedWorkflows(DASHBOARD_OPERATIONS)\n return useMemo(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n // An uploaded skill of a built-in's slug is used instead of it.\n const { host: builtins, skills: fromServer } = mergeSkillWorkflows(\n web.filter((w) => !packSlugs.has(w.id)),\n listings\n )\n // The host's packs sit with the built-ins; they are listed in the menus, not in Start.\n const all = [...builtins, ...hostSkills, ...fromServer]\n const byId = new Map(all.map((w) => [w.id, w]))\n const pinned = DASHBOARD_PINNED.flatMap((id) => {\n const w = byId.get(id)\n return w ? [w] : []\n })\n return {\n skills: all,\n skillsEnabled,\n start: skillsEnabled ? [...builtins, ...sortByRecentUse(fromServer, usage)] : [],\n dashboard: [...pinned, ...operations],\n forTasks: [CUSTOM_TASK, ...all.filter((w) => w.schedulable), REMIND_TASK],\n }\n }, [hostSkills, listings, usage, skillsEnabled, web, operations])\n}\n","/**\n * Creating and updating work and workflows from the composer, in one place.\n *\n * \"Now\" is an assistant query with task options (the person's own run: the thread becomes a task); a plain\n * to-do creates work with no run. Any other start (a date, a repeat, an event, after another task) saves a workflow\n * that creates the work when it fires. The request mapping is shared with every host (and tested in\n * blocks): `taskComposerToCreateRequest` decides which.\n *\n * Workspace authorization is a per-run, least-privilege choice (`auth_mode`) composed over the shipped\n * workspace-access-request + grant machinery:\n * - Now -> no tier: the query runs as the person asking, with their own access.\n * - Workflow -> `scheduled_require_auth` by default (asks at run time), or `scheduled_permanent`\n * (\"keep access\"): standing membership so unattended runs can decrypt while the owner\n * is away. Only this tier grants membership.\n */\n\nimport {\n useCreateWorkflow,\n useGrantAgentAccess,\n useRunWorkflow,\n useUpdateWorkflow,\n useDocuments,\n useArbiSessionState,\n useCreateWork,\n useStartTaskQuery,\n useUpdateConversation,\n} from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport type { components } from '@arbidocs/client'\nimport { useCallback, useMemo } from 'react'\nimport {\n composerToWorkflowUpdate,\n taskComposerToCreateRequest,\n taskComposerToUpdateRequest,\n} from '../../agents/tasks/taskRequest'\nimport { type TaskComposerValues } from '../../agents/tasks/taskComposerTypes'\nimport { type WorkflowDefinition } from '../../agents/workflows/types'\nimport type { TaskPlan } from '../../agents/workflows/planSteps'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\ntype Task = components['schemas']['ConversationResponse']\ntype Workflow = components['schemas']['WorkflowResponse']\n\nexport interface TaskSubmitContext {\n workflow: WorkflowDefinition\n values: TaskComposerValues\n /** Goal checklist for agent work, if one was drafted. */\n plan?: TaskPlan | null\n}\n\n/** What a composer submission created. `ran` is null for work no agent runs. */\nexport type CreateOutcome =\n | { kind: 'work'; task: Pick<Task, 'title'> & { external_id?: string }; ran: boolean | null }\n | { kind: 'workflow'; workflow: Workflow }\n\nexport function useWorkflowTasks() {\n const runWorkflow = useRunWorkflow()\n const startQuery = useStartTaskQuery()\n const createWorkflow = useCreateWorkflow()\n const updateConversation = useUpdateConversation()\n const updateWorkflowMutation = useUpdateWorkflow()\n const activeWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const createWork = useCreateWork({ workspaceId: activeWorkspaceId })\n const { openFiles } = useBlocksEnvironment()\n\n // Standing access for a workflow's agent, so its unattended runs can read the workspace. An agent\n // that is already a member makes the server refuse the re-grant: that is no failure here.\n const { mutateAsync: grant } = useGrantAgentAccess()\n const grantAgentAccess = useCallback(\n (agentExtId: string, workspaceId: string) =>\n grant({ agentExtId, workspaceId }).then(\n () => undefined,\n () => undefined\n ),\n [grant]\n )\n // File names for the prompt's wording (\"the document <name>\"): the server is told the ids as well.\n const { data: documents = [] } = useDocuments()\n const documentTitles = useMemo(\n () =>\n Object.fromEntries(documents.map((d) => [d.external_id, getDocumentTitle(d, d.external_id)])),\n [documents]\n )\n\n /**\n * Create work or a workflow. `forceWorkflow` is for the workflow dialog, where even a reminder is\n * saved as a workflow.\n */\n const create = useCallback(\n async (ctx: TaskSubmitContext, forceWorkflow = false): Promise<CreateOutcome> => {\n const request = taskComposerToCreateRequest(\n { ...ctx, documentTitles, plan: ctx.plan ?? null },\n activeWorkspaceId ?? undefined,\n forceWorkflow\n )\n if (request.kind === 'workflow') {\n const workflow = await createWorkflow.mutateAsync(request.body)\n // Keep access: deposit the key for the agent the server assigned (the Assistant when none was\n // picked), while the owner is here, so unattended runs start on their own.\n const workspaceId = workflow.workspace_ext_id ?? request.body.workspace_ext_id\n if (\n workflow.auth_mode === 'scheduled_permanent' &&\n !workflow.on_demand &&\n workflow.agent_ext_id &&\n workspaceId\n ) {\n await grantAgentAccess(workflow.agent_ext_id, workspaceId)\n }\n if (ctx.workflow.documentAction && ctx.values.when === 'now' && !forceWorkflow) {\n const result = await runWorkflow.mutateAsync(workflow.external_id)\n if (result.error) throw new Error(result.error)\n openFiles()\n }\n return { kind: 'workflow', workflow }\n }\n if (request.kind === 'query') {\n // Run now is the person's own assistant query: it makes the thread a task and runs it.\n const { conversationId } = await startQuery.start(request.query)\n return {\n kind: 'work',\n task: { external_id: conversationId, title: request.query.task.title ?? null },\n ran: true,\n }\n }\n // A plain to-do (or reminder): a task with no run.\n const task = await createWork.mutateAsync(request.body)\n return { kind: 'work', task, ran: null }\n },\n [\n activeWorkspaceId,\n createWork,\n createWorkflow,\n documentTitles,\n grantAgentAccess,\n startQuery,\n runWorkflow,\n openFiles,\n ]\n )\n\n /** PATCH the editable fields of a task (the instruction, workspace and agent stay as created). */\n const update = useCallback(\n async (task: Pick<Task, 'external_id'> & { is_owner?: boolean }, ctx: TaskSubmitContext) => {\n const patch = taskComposerToUpdateRequest({ ...ctx, plan: ctx.plan ?? null })\n // Who can see a task is its owner's to change: an editor's save leaves it out.\n if (task.is_owner === false) delete patch.shared\n await updateConversation.mutateAsync({ conversationId: task.external_id, patch })\n },\n [updateConversation]\n )\n\n /** PATCH a workflow: its name, trigger and action. */\n const updateWorkflow = useCallback(\n async (\n workflow: Pick<Workflow, 'external_id' | 'agent_ext_id' | 'workspace_ext_id'> & {\n is_owner?: boolean\n },\n ctx: TaskSubmitContext\n ) => {\n const patch = composerToWorkflowUpdate({ ...ctx, documentTitles, plan: ctx.plan ?? null })\n // Sharing a workflow is its owner's: an editor's save leaves it out.\n if (workflow.is_owner === false) delete patch.shared\n const workspaceId = workflow.workspace_ext_id ?? activeWorkspaceId\n const updated = await updateWorkflowMutation.mutateAsync({\n workflowId: workflow.external_id,\n patch,\n })\n // The agent the server keeps (the Assistant when none was picked) gets the key for unattended runs.\n const agentId = updated.agent_ext_id ?? patch.agent_ext_id ?? workflow.agent_ext_id\n if (\n updated.auth_mode === 'scheduled_permanent' &&\n !updated.on_demand &&\n agentId &&\n workspaceId\n ) {\n await grantAgentAccess(agentId, workspaceId)\n }\n },\n [activeWorkspaceId, documentTitles, grantAgentAccess, updateWorkflowMutation]\n )\n\n return {\n create,\n update,\n updateWorkflow,\n isPending:\n createWork.isPending ||\n startQuery.isPending ||\n createWorkflow.isPending ||\n updateConversation.isPending ||\n updateWorkflowMutation.isPending,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/useIsExternalAccount.ts","../src/connection/workflows/useSkillsEnabled.ts","../src/connection/workflows/useHostSkills.ts","../src/connection/workflows/useNamedWorkflows.ts","../src/connection/workflows/useWorkflowDefinitions.ts","../src/connection/workflows/useWorkflowTasks.ts"],"names":["useArbiSession","useUserSettings","useHost","useMemo","skillPackWorkflows","useAssistantCopy","nameBuiltinWorkflows","useSkills","useWorkflowUsage","WEB_WORKFLOWS","DASHBOARD_OPERATIONS","mergeSkillWorkflows","DASHBOARD_PINNED","sortByRecentUse","CUSTOM_TASK","REMIND_TASK","useRunWorkflow","useStartTaskQuery","useCreateWorkflow","useUpdateConversation","useUpdateWorkflow","useArbiSessionState","useCreateWork","useBlocksEnvironment","useGrantAgentAccess","useCallback","useDocuments","getDocumentTitle","taskComposerToCreateRequest","taskComposerToUpdateRequest","composerToWorkflowUpdate"],"mappings":"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","file":"chunk-JSQQV23D.cjs","sourcesContent":["import { useArbiSession } from '@arbidocs/react'\n\n/** The account fields that say it is an external one. */\ninterface AccountKind {\n temporary_access_only?: boolean | null\n user_type?: string | null\n}\n\n/** An external account: temporary access to shared workspaces only. */\nexport const isExternalAccount = (user: AccountKind | null | undefined): boolean =>\n !!user && (user.temporary_access_only === true || user.user_type === 'external')\n\n/**\n * Whether the signed-in person is an external guest. They get the built-in skills and the host's\n * skill packs, never the marketplace (the backend enforces it as well).\n */\nexport function useIsExternalAccount(): boolean {\n return isExternalAccount(useArbiSession().user)\n}\n\n/** Skill listings without the marketplace's (`visibility: global`): what an external guest gets. */\nexport const withoutMarketplace = <T extends { visibility?: string | null }>(listings: T[]): T[] =>\n listings.filter((s) => s.visibility !== 'global')\n","/**\n * The one gate for everything skill-shaped in the app: the empty chat's Start list, the skill\n * entries of the slash menu, the sidebar's Skills item, the Skills browser's entry points and the\n * typed `/skill` interception. It is the personal `show_skills` user setting, default off; the\n * switch lives in Settings, Experimental (developers only), so today only developers have it.\n */\n\nimport { useUserSettings } from '@arbidocs/react'\nimport { useIsExternalAccount } from '../useIsExternalAccount'\n\nexport function useSkillsEnabled(): boolean {\n const { data: userSettings } = useUserSettings()\n return userSettings?.show_skills ?? false\n}\n\n/**\n * Whether the Skills browser (the marketplace: \"Browse skills\", the Skills menu entry) is offered:\n * to skills users, never to an external guest (the backend enforces it as well).\n */\nexport function useCanBrowseSkills(): boolean {\n const skillsEnabled = useSkillsEnabled()\n const isExternal = useIsExternalAccount()\n return skillsEnabled && !isExternal\n}\n","/**\n * The host's skill packs (`host.workflows.skillPacks`) as the kit's workflows, and the `/` menu's\n * rows for them: one section per heading (a category, else a pack's label).\n */\nimport { useMemo } from 'react'\nimport { skillPackWorkflows, type SkillPackWorkflow } from '../../agents/workflows/skillPack'\nimport type { SlashMenuItem } from '../../chat/SlashMenu'\nimport { useHost } from '../../provider/host'\n\n/** The section heading of a pack without a label or category. */\nconst DEFAULT_PACK_LABEL = 'Skills from this site'\n\nconst NO_PACKS: SkillPackWorkflow[] = []\n\nexport function useHostSkills(): SkillPackWorkflow[] {\n const packs = useHost().workflows?.skillPacks\n return useMemo(() => (packs?.length ? packs.flatMap(skillPackWorkflows) : NO_PACKS), [packs])\n}\n\n/**\n * A pack skill's `/` menu row. Its section is its heading (its category, else its pack's label), so\n * skills of several packs under one heading share one section.\n */\nexport function hostSkillItem(workflow: SkillPackWorkflow): SlashMenuItem {\n const label = workflow.category ?? workflow.pack.label ?? DEFAULT_PACK_LABEL\n return {\n name: workflow.id,\n description: workflow.description,\n kind: 'skill',\n group: { id: `pack-${label.toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, label },\n }\n}\n","import { useMemo } from 'react'\nimport { useAssistantCopy } from '@arbidocs/react/shell'\nimport { nameBuiltinWorkflows } from '../../agents/workflows/catalogue/seed'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\n\n/** The seeded workflows in the host's assistant name (`nameBuiltinWorkflows`). */\nexport function useNamedWorkflows(\n workflows: ReadonlyArray<WorkflowDefinition>\n): WorkflowDefinition[] {\n const copy = useAssistantCopy()\n return useMemo(() => nameBuiltinWorkflows(workflows, copy), [workflows, copy])\n}\n","/**\n * The one list of workflows: the seeded ones plus every skill the user can invoke (each degraded\n * to a single-field form from its `arg_hint`). The dashboard tiles, the slash menu, tasks and\n * agents all read this.\n */\n\nimport { useMemo } from 'react'\nimport { useSkills } from '@arbidocs/react'\nimport { mergeSkillWorkflows } from '../../agents/workflows/workflow'\nimport { type WorkflowDefinition } from '../../agents/workflows/types'\nimport {\n CUSTOM_TASK,\n DASHBOARD_OPERATIONS,\n DASHBOARD_PINNED,\n REMIND_TASK,\n} from '../../agents/workflows/catalogue/seed'\nimport { useSkillsEnabled } from './useSkillsEnabled'\nimport { useHostSkills } from './useHostSkills'\nimport { useIsExternalAccount, withoutMarketplace } from '../useIsExternalAccount'\nimport { sortByRecentUse, useWorkflowUsage } from '../../agents/workflows/catalogue/workflow-usage'\nimport { WEB_WORKFLOWS } from '../../agents/workflows/catalogue/registry'\nimport { useNamedWorkflows } from './useNamedWorkflows'\n\nexport interface UseWorkflowDefinitionsResult {\n /**\n * Every skill workflow of this host: built-ins, the host's skill packs, then the user's and the\n * marketplace's (one list).\n */\n skills: WorkflowDefinition[]\n /** The user has skills switched on (`show_skills`): the gate of every skill-shaped surface. */\n skillsEnabled: boolean\n /**\n * The empty chat's Start section: built-ins first (their own order), then the user's own and\n * marketplace skills by recent use, then name. EMPTY for users without skills enabled.\n */\n start: WorkflowDefinition[]\n /** The dashboard Start band: pinned skills in order, then the operation launchers. */\n dashboard: WorkflowDefinition[]\n /** What a task can run: schedulable skills plus a free instruction and a reminder. */\n forTasks: WorkflowDefinition[]\n}\n\n/**\n * The skill listings a person may use from the menus: a host pack's slug is the pack's (an\n * installed copy is the same skill), and an external guest gets no marketplace skills.\n */\nexport function useUsableSkillListings(hostSkills: ReadonlyArray<WorkflowDefinition>) {\n const { data: listings } = useSkills()\n const isExternal = useIsExternalAccount()\n return useMemo(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n const usable = (listings ?? []).filter((s) => !packSlugs.has(s.slug))\n return isExternal ? withoutMarketplace(usable) : usable\n }, [listings, hostSkills, isExternal])\n}\n\nexport function useWorkflowDefinitions(): UseWorkflowDefinitionsResult {\n const hostSkills = useHostSkills()\n const listings = useUsableSkillListings(hostSkills)\n const usage = useWorkflowUsage()\n const skillsEnabled = useSkillsEnabled()\n const web = useNamedWorkflows(WEB_WORKFLOWS)\n const operations = useNamedWorkflows(DASHBOARD_OPERATIONS)\n return useMemo(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n // An uploaded skill of a built-in's slug is used instead of it.\n const { host: builtins, skills: fromServer } = mergeSkillWorkflows(\n web.filter((w) => !packSlugs.has(w.id)),\n listings\n )\n // The host's packs sit with the built-ins; they are listed in the menus, not in Start.\n const all = [...builtins, ...hostSkills, ...fromServer]\n const byId = new Map(all.map((w) => [w.id, w]))\n const pinned = DASHBOARD_PINNED.flatMap((id) => {\n const w = byId.get(id)\n return w ? [w] : []\n })\n return {\n skills: all,\n skillsEnabled,\n start: skillsEnabled ? [...builtins, ...sortByRecentUse(fromServer, usage)] : [],\n dashboard: [...pinned, ...operations],\n forTasks: [CUSTOM_TASK, ...all.filter((w) => w.schedulable), REMIND_TASK],\n }\n }, [hostSkills, listings, usage, skillsEnabled, web, operations])\n}\n","/**\n * Creating and updating work and workflows from the composer, in one place.\n *\n * \"Now\" is an assistant query with task options (the person's own run: the thread becomes a task); a plain\n * to-do creates work with no run. Any other start (a date, a repeat, an event, after another task) saves a workflow\n * that creates the work when it fires. The request mapping is shared with every host (and tested in\n * blocks): `taskComposerToCreateRequest` decides which.\n *\n * Workspace authorization is a per-run, least-privilege choice (`auth_mode`) composed over the shipped\n * workspace-access-request + grant machinery:\n * - Now -> no tier: the query runs as the person asking, with their own access.\n * - Workflow -> `scheduled_require_auth` by default (asks at run time), or `scheduled_permanent`\n * (\"keep access\"): standing membership so unattended runs can decrypt while the owner\n * is away. Only this tier grants membership.\n */\n\nimport {\n useCreateWorkflow,\n useGrantAgentAccess,\n useRunWorkflow,\n useUpdateWorkflow,\n useDocuments,\n useArbiSessionState,\n useCreateWork,\n useStartTaskQuery,\n useUpdateConversation,\n} from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport type { components } from '@arbidocs/client'\nimport { useCallback, useMemo } from 'react'\nimport {\n composerToWorkflowUpdate,\n taskComposerToCreateRequest,\n taskComposerToUpdateRequest,\n} from '../../agents/tasks/taskRequest'\nimport { type TaskComposerValues } from '../../agents/tasks/taskComposerTypes'\nimport { type WorkflowDefinition } from '../../agents/workflows/types'\nimport type { TaskPlan } from '../../agents/workflows/planSteps'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\ntype Task = components['schemas']['ConversationResponse']\ntype Workflow = components['schemas']['WorkflowResponse']\n\nexport interface TaskSubmitContext {\n workflow: WorkflowDefinition\n values: TaskComposerValues\n /** Goal checklist for agent work, if one was drafted. */\n plan?: TaskPlan | null\n}\n\n/** What a composer submission created. `ran` is null for work no agent runs. */\nexport type CreateOutcome =\n | { kind: 'work'; task: Pick<Task, 'title'> & { external_id?: string }; ran: boolean | null }\n | { kind: 'workflow'; workflow: Workflow }\n\nexport function useWorkflowTasks() {\n const runWorkflow = useRunWorkflow()\n const startQuery = useStartTaskQuery()\n const createWorkflow = useCreateWorkflow()\n const updateConversation = useUpdateConversation()\n const updateWorkflowMutation = useUpdateWorkflow()\n const activeWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const createWork = useCreateWork({ workspaceId: activeWorkspaceId })\n const { openFiles } = useBlocksEnvironment()\n\n // Standing access for a workflow's agent, so its unattended runs can read the workspace. An agent\n // that is already a member makes the server refuse the re-grant: that is no failure here.\n const { mutateAsync: grant } = useGrantAgentAccess()\n const grantAgentAccess = useCallback(\n (agentExtId: string, workspaceId: string) =>\n grant({ agentExtId, workspaceId }).then(\n () => undefined,\n () => undefined\n ),\n [grant]\n )\n // File names for the prompt's wording (\"the document <name>\"): the server is told the ids as well.\n const { data: documents = [] } = useDocuments()\n const documentTitles = useMemo(\n () =>\n Object.fromEntries(documents.map((d) => [d.external_id, getDocumentTitle(d, d.external_id)])),\n [documents]\n )\n\n /**\n * Create work or a workflow. `forceWorkflow` is for the workflow dialog, where even a reminder is\n * saved as a workflow.\n */\n const create = useCallback(\n async (ctx: TaskSubmitContext, forceWorkflow = false): Promise<CreateOutcome> => {\n const request = taskComposerToCreateRequest(\n { ...ctx, documentTitles, plan: ctx.plan ?? null },\n activeWorkspaceId ?? undefined,\n forceWorkflow\n )\n if (request.kind === 'workflow') {\n const workflow = await createWorkflow.mutateAsync(request.body)\n // Keep access: deposit the key for the agent the server assigned (the Assistant when none was\n // picked), while the owner is here, so unattended runs start on their own.\n const workspaceId = workflow.workspace_ext_id ?? request.body.workspace_ext_id\n if (\n workflow.auth_mode === 'scheduled_permanent' &&\n !workflow.on_demand &&\n workflow.agent_ext_id &&\n workspaceId\n ) {\n await grantAgentAccess(workflow.agent_ext_id, workspaceId)\n }\n if (ctx.workflow.documentAction && ctx.values.when === 'now' && !forceWorkflow) {\n const result = await runWorkflow.mutateAsync(workflow.external_id)\n if (result.error) throw new Error(result.error)\n openFiles()\n }\n return { kind: 'workflow', workflow }\n }\n if (request.kind === 'query') {\n // Run now is the person's own assistant query: it makes the thread a task and runs it.\n const { conversationId } = await startQuery.start(request.query)\n return {\n kind: 'work',\n task: { external_id: conversationId, title: request.query.task.title ?? null },\n ran: true,\n }\n }\n // A plain to-do (or reminder): a task with no run.\n const task = await createWork.mutateAsync(request.body)\n return { kind: 'work', task, ran: null }\n },\n [\n activeWorkspaceId,\n createWork,\n createWorkflow,\n documentTitles,\n grantAgentAccess,\n startQuery,\n runWorkflow,\n openFiles,\n ]\n )\n\n /** PATCH the editable fields of a task (the instruction, workspace and agent stay as created). */\n const update = useCallback(\n async (task: Pick<Task, 'external_id'> & { is_owner?: boolean }, ctx: TaskSubmitContext) => {\n const patch = taskComposerToUpdateRequest({ ...ctx, plan: ctx.plan ?? null })\n // Who can see a task is its owner's to change: an editor's save leaves it out.\n if (task.is_owner === false) delete patch.shared\n await updateConversation.mutateAsync({ conversationId: task.external_id, patch })\n },\n [updateConversation]\n )\n\n /** PATCH a workflow: its name, trigger and action. */\n const updateWorkflow = useCallback(\n async (\n workflow: Pick<Workflow, 'external_id' | 'agent_ext_id' | 'workspace_ext_id'> & {\n is_owner?: boolean\n },\n ctx: TaskSubmitContext\n ) => {\n const patch = composerToWorkflowUpdate({ ...ctx, documentTitles, plan: ctx.plan ?? null })\n // Sharing a workflow is its owner's: an editor's save leaves it out.\n if (workflow.is_owner === false) delete patch.shared\n const workspaceId = workflow.workspace_ext_id ?? activeWorkspaceId\n const updated = await updateWorkflowMutation.mutateAsync({\n workflowId: workflow.external_id,\n patch,\n })\n // The agent the server keeps (the Assistant when none was picked) gets the key for unattended runs.\n const agentId = updated.agent_ext_id ?? patch.agent_ext_id ?? workflow.agent_ext_id\n if (\n updated.auth_mode === 'scheduled_permanent' &&\n !updated.on_demand &&\n agentId &&\n workspaceId\n ) {\n await grantAgentAccess(agentId, workspaceId)\n }\n },\n [activeWorkspaceId, documentTitles, grantAgentAccess, updateWorkflowMutation]\n )\n\n return {\n create,\n update,\n updateWorkflow,\n isPending:\n createWork.isPending ||\n startQuery.isPending ||\n createWorkflow.isPending ||\n updateConversation.isPending ||\n updateWorkflowMutation.isPending,\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk6UTKM5AB_cjs = require('./chunk-6UTKM5AB.cjs');
5
- var chunkWAV762GP_cjs = require('./chunk-WAV762GP.cjs');
6
- var chunk7JLJH5CW_cjs = require('./chunk-7JLJH5CW.cjs');
7
- var chunkWXUU3COI_cjs = require('./chunk-WXUU3COI.cjs');
8
- var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
4
+ var chunkJSQQV23D_cjs = require('./chunk-JSQQV23D.cjs');
5
+ var chunkGQXPNIRE_cjs = require('./chunk-GQXPNIRE.cjs');
9
6
  var chunk5F4DCIHS_cjs = require('./chunk-5F4DCIHS.cjs');
7
+ var chunk7JLJH5CW_cjs = require('./chunk-7JLJH5CW.cjs');
8
+ var chunkMZ2KZXNU_cjs = require('./chunk-MZ2KZXNU.cjs');
10
9
  var chunkQRAQZTJE_cjs = require('./chunk-QRAQZTJE.cjs');
10
+ var chunk3YZKDCWY_cjs = require('./chunk-3YZKDCWY.cjs');
11
11
  var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
12
12
  var browser = require('@arbidocs/sdk/browser');
13
13
  var react = require('@arbidocs/react');
@@ -50,11 +50,11 @@ function useLaunchWorkflow({
50
50
  } = {}) {
51
51
  const { data: documents = [] } = react.useDocuments();
52
52
  const { data: workspaceTags = [] } = react.useTags();
53
- const tags = react$1.useMemo(() => chunkWXUU3COI_cjs.documentScopeLabels(workspaceTags), [workspaceTags]);
53
+ const tags = react$1.useMemo(() => chunkMZ2KZXNU_cjs.documentScopeLabels(workspaceTags), [workspaceTags]);
54
54
  const createTag = react.useCreateTag();
55
55
  const updateTag = react.useUpdateTag();
56
56
  const generate = react.useGenerateDocTags();
57
- const { create: createTask } = chunk6UTKM5AB_cjs.useWorkflowTasks();
57
+ const { create: createTask } = chunkJSQQV23D_cjs.useWorkflowTasks();
58
58
  const applyModel = react.useApplyChatModel();
59
59
  const session = react.useArbiSessionStore();
60
60
  const { notify, openFiles, openNewConversation } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
@@ -62,7 +62,7 @@ function useLaunchWorkflow({
62
62
  async ({ inputs, scope }) => {
63
63
  const description = text(inputs, "description");
64
64
  const name = text(inputs, "name") || chunk7JLJH5CW_cjs.deriveAnnotationName(description);
65
- const matching = chunkWXUU3COI_cjs.matchWorkflowScope(documents, scope);
65
+ const matching = chunkMZ2KZXNU_cjs.matchWorkflowScope(documents, scope);
66
66
  if (!name || !description || matching.length === 0) return;
67
67
  try {
68
68
  const existing = tags.find((t) => t.name.toLowerCase() === name.toLowerCase());
@@ -162,7 +162,7 @@ function useLaunchWorkflow({
162
162
  const binding = PROMPT_BINDINGS[workflow.id];
163
163
  const prepare = () => {
164
164
  if (binding?.attachScope !== false && !chunkQRAQZTJE_cjs.isEmptyWorkflowScope(scope)) {
165
- const ids = chunkWXUU3COI_cjs.matchWorkflowScope(documents, scope).map((d) => d.external_id);
165
+ const ids = chunkMZ2KZXNU_cjs.matchWorkflowScope(documents, scope).map((d) => d.external_id);
166
166
  if (ids.length > 0) {
167
167
  session.setConversationDocuments(
168
168
  inPlace ? session.getState().conversationId ?? "new" : "new",
@@ -213,7 +213,7 @@ function ConnectedWorkflowStart({
213
213
  );
214
214
  const { openUpload } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
215
215
  const { data: workspaceTags = [] } = react.useTags();
216
- const tags = react$1.useMemo(() => chunkWXUU3COI_cjs.documentScopeLabels(workspaceTags), [workspaceTags]);
216
+ const tags = react$1.useMemo(() => chunkMZ2KZXNU_cjs.documentScopeLabels(workspaceTags), [workspaceTags]);
217
217
  const fieldPlaceholder = react$1.useCallback(
218
218
  (field, inputs, workflow) => {
219
219
  if (workflow.id !== chunk7JLJH5CW_cjs.ANNOTATE_ID || field.name !== "name") return void 0;
@@ -223,7 +223,7 @@ function ConnectedWorkflowStart({
223
223
  []
224
224
  );
225
225
  return /* @__PURE__ */ jsxRuntime.jsx(
226
- chunkWAV762GP_cjs.ConnectedWorkflowLauncher,
226
+ chunkGQXPNIRE_cjs.ConnectedWorkflowLauncher,
227
227
  {
228
228
  ...rest,
229
229
  workflows,
@@ -268,7 +268,7 @@ function canOpenSkill(workflow, skillsEnabled) {
268
268
  return workflow.run.kind === "prompt" && (skillsEnabled || chunk7JLJH5CW_cjs.isSkillPackWorkflow(workflow));
269
269
  }
270
270
  function useSlashSkillWorkflows({ landing, send }) {
271
- const { skills, skillsEnabled } = chunk6UTKM5AB_cjs.useWorkflowDefinitions();
271
+ const { skills, skillsEnabled } = chunkJSQQV23D_cjs.useWorkflowDefinitions();
272
272
  const { commands } = react.useBuiltinCommands();
273
273
  const [active, setActive] = react$1.useState(null);
274
274
  const open = react$1.useCallback(
@@ -332,11 +332,11 @@ function useSlashSkillWorkflows({ landing, send }) {
332
332
  }
333
333
  var NO_SKILLS = [];
334
334
  function useSlashMenuItems(builtinSkills = NO_SKILLS) {
335
- const hostSkills = chunk6UTKM5AB_cjs.useHostSkills();
336
- const listings = chunk6UTKM5AB_cjs.useUsableSkillListings(hostSkills);
337
- const skillsEnabled = chunk6UTKM5AB_cjs.useSkillsEnabled();
335
+ const hostSkills = chunkJSQQV23D_cjs.useHostSkills();
336
+ const listings = chunkJSQQV23D_cjs.useUsableSkillListings(hostSkills);
337
+ const skillsEnabled = chunkJSQQV23D_cjs.useSkillsEnabled();
338
338
  const { commands } = react.useBuiltinCommands();
339
- const builtins = chunk6UTKM5AB_cjs.useNamedWorkflows(builtinSkills);
339
+ const builtins = chunkJSQQV23D_cjs.useNamedWorkflows(builtinSkills);
340
340
  const items = react$1.useMemo(() => {
341
341
  const packSlugs = new Set(hostSkills.map((w) => w.id));
342
342
  return chunk5F4DCIHS_cjs.buildSlashItems(
@@ -347,7 +347,7 @@ function useSlashMenuItems(builtinSkills = NO_SKILLS) {
347
347
  kind: "command"
348
348
  })),
349
349
  [
350
- ...hostSkills.map(chunk6UTKM5AB_cjs.hostSkillItem),
350
+ ...hostSkills.map(chunkJSQQV23D_cjs.hostSkillItem),
351
351
  ...skillsEnabled ? skillItems(
352
352
  builtins.filter((w) => !packSlugs.has(w.id)),
353
353
  listings
@@ -355,7 +355,7 @@ function useSlashMenuItems(builtinSkills = NO_SKILLS) {
355
355
  ]
356
356
  );
357
357
  }, [commands, hostSkills, listings, skillsEnabled, builtins]);
358
- return { items, canBrowseSkills: chunk6UTKM5AB_cjs.useCanBrowseSkills() };
358
+ return { items, canBrowseSkills: chunkJSQQV23D_cjs.useCanBrowseSkills() };
359
359
  }
360
360
  function useSlashItems(text2, builtinSkills = NO_SKILLS) {
361
361
  const { items, canBrowseSkills } = useSlashMenuItems(builtinSkills);
@@ -402,5 +402,5 @@ exports.useLaunchWorkflow = useLaunchWorkflow;
402
402
  exports.useSlashItems = useSlashItems;
403
403
  exports.useSlashMenuItems = useSlashMenuItems;
404
404
  exports.useSlashSkillWorkflows = useSlashSkillWorkflows;
405
- //# sourceMappingURL=chunk-557MJ4IH.cjs.map
406
- //# sourceMappingURL=chunk-557MJ4IH.cjs.map
405
+ //# sourceMappingURL=chunk-LFRNBT2I.cjs.map
406
+ //# sourceMappingURL=chunk-LFRNBT2I.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/workflows/launch-bindings.ts","../src/connection/workflows/useLaunchWorkflow.ts","../src/connection/workflows/ConnectedWorkflowStart.tsx","../src/connection/workflows/useSlashSkillWorkflows.tsx","../src/connection/conversation/useSlashItems.ts"],"names":["GENERATE_IMAGE_ID","buildRetrievalChunkTool","buildRetrievalFullContextTool","IMAGE_ASPECT_AUTO","useDocuments","useTags","useMemo","documentScopeLabels","useCreateTag","useUpdateTag","useGenerateDocTags","useWorkflowTasks","useApplyChatModel","useArbiSessionStore","useBlocksEnvironment","useCallback","deriveAnnotationName","matchWorkflowScope","ANNOTATE_ID","recordWorkflowUse","getDocumentTitle","composeWorkflowPrompt","isEmptyWorkflowScope","useHost","renderWorkflowIcon","jsx","ConnectedWorkflowLauncher","jsxs","TriangleAlert","isSkillPackWorkflow","useWorkflowDefinitions","useBuiltinCommands","useState","text","promptFieldName","useHostSkills","useUsableSkillListings","useSkillsEnabled","useNamedWorkflows","buildSlashItems","hostSkillItem","useCanBrowseSkills","parseSlashTokenInProgress","filterSlashItems","mergeSkillWorkflows"],"mappings":"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","file":"chunk-557MJ4IH.cjs","sourcesContent":["/**\n * Host bindings of prompt workflows that need more than words on send. Bound by workflow id, the\n * same way the annotation operation is: blocks and the registry stay declarative, and the one\n * place that knows the wire shape is here.\n *\n * Generate image: the reference images and the aspect ratio ride structured tool arguments\n * (`retrieval_full_context` over every reference, `image_generation.aspect_ratio`), never the\n * prompt text: the image model does not reliably honour a shape or sources worded into the prompt,\n * and the references go to the separate image model in its own request, so (unlike the app's\n * one-at-a-time pinned document) several of them do not compound against the agent's context.\n */\n\nimport type { WorkflowInputs, WorkflowScope } from '../../agents/workflows/types'\nimport { buildRetrievalChunkTool, buildRetrievalFullContextTool } from '@arbidocs/sdk/browser'\nimport type { TurnTools } from '@arbidocs/react'\nimport { GENERATE_IMAGE_ID, IMAGE_ASPECT_AUTO } from '../../agents/workflows/catalogue/seed'\n\nexport interface PromptBinding {\n /** Attach the scoped files to the chat (default true). Off when the files are tool inputs. */\n attachScope: boolean\n /** Structured tools for the one send, from the form's inputs. */\n tools?: (inputs: WorkflowInputs) => TurnTools\n}\n\nconst referencesOf = (inputs: WorkflowInputs): string[] => {\n const value = inputs.references as WorkflowScope | undefined\n return value?.documents ?? []\n}\n\nexport const PROMPT_BINDINGS: Record<string, PromptBinding> = {\n [GENERATE_IMAGE_ID]: {\n attachScope: false,\n tools: (inputs) => {\n const aspectRatio = typeof inputs.aspect_ratio === 'string' ? inputs.aspect_ratio : ''\n return {\n retrieval_chunk: buildRetrievalChunkTool([]),\n retrieval_full_context: buildRetrievalFullContextTool(referencesOf(inputs)),\n ...(aspectRatio && aspectRatio !== IMAGE_ASPECT_AUTO\n ? {\n image_generation: {\n name: 'image_generation' as const,\n description: 'image generation',\n tool_args: { aspect_ratio: aspectRatio },\n tool_responses: {},\n },\n }\n : {}),\n }\n },\n },\n}\n","/**\n * The host side of the launch contract: `onLaunch({workflow, inputs, scope, agentId})`.\n *\n * Blocks only say WHAT to run; this performs it, so workspace isolation stays host-side:\n *\n * - prompt workflow, my assistant: open a fresh chat (or stay in this one when `inPlace`), scope\n * its documents, set the composed draft and ask for it to be sent (`autoSendDraft`). The host's\n * send waits for the new chat's documents to be seeded, so a scoped run is never sent with the\n * wrong files. Order matters: `openNewConversation` resets the draft, so it is set after it.\n * - prompt workflow, another agent: a run-now task assigned to that agent (the interactive chat\n * query has no agent parameter), created through the same path as the task composer.\n * - operation workflow (tier B): the handler bound to its id (annotation).\n * - a workflow's own model becomes the chat's (`useApplyChatModel`).\n *\n * The prompt is composed in exactly one place: `composeWorkflowPrompt(workflow, inputs)`.\n */\n\nimport {\n useApplyChatModel,\n useArbiSessionStore,\n useCreateTag,\n useDocuments,\n useGenerateDocTags,\n useTags,\n useUpdateTag,\n} from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport { useCallback, useMemo } from 'react'\nimport { composeWorkflowPrompt, isEmptyWorkflowScope } from '../../agents/workflows/workflow'\nimport { documentScopeLabels, matchWorkflowScope } from '../../agents/workflows/workspaceScope'\nimport {\n type WorkflowInputs,\n type WorkflowLanding,\n type WorkflowLaunch,\n} from '../../agents/workflows/types'\nimport { deriveAnnotationName } from '../../agents/workflows/catalogue/annotation-name'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { PROMPT_BINDINGS } from './launch-bindings'\nimport { ANNOTATE_ID } from '../../agents/workflows/catalogue/seed'\nimport { useWorkflowTasks } from './useWorkflowTasks'\nimport { recordWorkflowUse } from '../../agents/workflows/catalogue/workflow-usage'\n\nexport interface UseLaunchWorkflowOptions {\n /**\n * Where launches from this surface land, over each workflow's own default. The empty chat and\n * the slash menu send into the conversation on screen (`current-chat`); everything else opens a\n * fresh one. A single launch can still override it (`WorkflowLaunch.landing`).\n */\n landing?: WorkflowLanding\n /**\n * A prompt run on the user's own assistant is sent here instead of through the session's draft:\n * the surface's own chat (`ChatPage`) or its own ask (the document ask). Everything else is the\n * same: the file scope, the workflow's model and its bound tools are set on the session in scope\n * (before a send in place, after a send that opens a fresh chat), so the turn carries them.\n */\n send?: (prompt: string) => void\n}\n\nconst text = (inputs: WorkflowInputs, name: string): string => {\n const v = inputs[name]\n return typeof v === 'string' ? v.trim() : ''\n}\n\nexport function useLaunchWorkflow({\n landing: surfaceLanding,\n send,\n}: UseLaunchWorkflowOptions = {}) {\n const { data: documents = [] } = useDocuments()\n const { data: workspaceTags = [] } = useTags()\n const tags = useMemo(() => documentScopeLabels(workspaceTags), [workspaceTags])\n const createTag = useCreateTag()\n const updateTag = useUpdateTag()\n const generate = useGenerateDocTags()\n const { create: createTask } = useWorkflowTasks()\n const applyModel = useApplyChatModel()\n const session = useArbiSessionStore()\n const { notify, openFiles, openNewConversation } = useBlocksEnvironment()\n\n /** Annotation: create (or reuse) the label, start the AI run, land on Files filtered to the set. */\n const annotate = useCallback(\n async ({ inputs, scope }: WorkflowLaunch) => {\n const description = text(inputs, 'description')\n const name = text(inputs, 'name') || deriveAnnotationName(description)\n const matching = matchWorkflowScope(documents, scope)\n if (!name || !description || matching.length === 0) return\n try {\n // A same-named label is reused rather than duplicated, the rule the Files page's\n // label-creation paths follow.\n const existing = tags.find((t) => t.name.toLowerCase() === name.toLowerCase())\n let tagId: string\n if (existing) {\n tagId = existing.external_id\n await updateTag.mutateAsync({\n tagId: tagId,\n change: { instruction: description },\n })\n } else {\n const created = await createTag.mutateAsync({\n name,\n tagType: { type: 'text', options: [] },\n shared: true,\n instruction: description,\n })\n const createdId = (created as { external_id?: string } | undefined)?.external_id\n if (!createdId) throw new Error('tag create returned no id')\n tagId = createdId\n }\n const docIds = matching.map((d) => d.external_id)\n // overwrite=true so a re-run on an existing field refreshes stale values, matching the\n // Files page's default review behaviour.\n await generate.mutateAsync({ tagIds: [tagId], docIds: docIds, overwrite: true })\n // Land on Files with those documents selected and the view narrowed to the annotated set\n // through the same tri-state quick filter the pickers write to. An empty scope selected\n // every file, so no filter is applied.\n const filters: Record<string, 'include'> = {}\n scope.folders.forEach((folder) => {\n filters[folder === '' ? 'folder:none' : `folder:${folder}`] = 'include'\n })\n scope.labels.forEach((labelId) => {\n filters[labelId] = 'include'\n })\n openFiles({ select: docIds, filters })\n } catch (error) {\n notify('Could not start the annotation', 'error')\n throw error\n }\n },\n [documents, tags, createTag, updateTag, generate, openFiles, notify]\n )\n\n return useCallback(\n async (launch: WorkflowLaunch) => {\n const { workflow, inputs, scope, agentId } = launch\n if (workflow.run.kind === 'operation') {\n if (workflow.id === ANNOTATE_ID) {\n await annotate(launch)\n recordWorkflowUse(workflow.id)\n return\n }\n throw new Error(`No host handler for workflow \"${workflow.id}\"`)\n }\n\n // Names for the wording: a `documents` field quotes the files it picked.\n const documentTitles = Object.fromEntries(\n documents.map((d) => [d.external_id, getDocumentTitle(d, d.external_id)])\n )\n const prompt = composeWorkflowPrompt(workflow, inputs, { documentTitles })\n if (!prompt) return\n recordWorkflowUse(workflow.id)\n\n if (agentId) {\n try {\n const created = await createTask({\n workflow,\n values: {\n assignee: 'agent',\n workflowId: workflow.id,\n inputs,\n when: 'now',\n runAt: '',\n rrule: '',\n timezone: 'UTC',\n eventKind: '',\n afterTaskId: '',\n parentTaskId: '',\n shared: true,\n description: '',\n dueAt: '',\n agentId,\n name: '',\n notifyOnComplete: true,\n access: 'ask_each_run',\n },\n })\n const ran = created.kind === 'work' ? created.ran : null\n const title = created.kind === 'work' ? created.task.title : created.workflow.name\n notify(\n ran === false\n ? 'Task created, but the run could not start'\n : `Running \\u201c${title ?? workflow.title}\\u201d`,\n ran === false ? 'warning' : 'success'\n )\n } catch (error) {\n notify(\n error instanceof Error && error.message.startsWith('Open a workspace')\n ? error.message\n : 'Could not start the run',\n 'error'\n )\n throw error\n }\n return\n }\n\n const landing = launch.landing ?? surfaceLanding ?? workflow.landing\n const inPlace = landing === 'current-chat'\n const binding = PROMPT_BINDINGS[workflow.id]\n /** The run's setup on the session in scope: its file scope, its model, its bound tools. */\n const prepare = () => {\n // Scope the chat to the chosen files when a restriction was made; otherwise the\n // workspace's usual \"all documents\" attachment (useDocumentAutoAdd) applies.\n if (binding?.attachScope !== false && !isEmptyWorkflowScope(scope)) {\n const ids = matchWorkflowScope(documents, scope).map((d) => d.external_id)\n if (ids.length > 0) {\n session.setConversationDocuments(\n inPlace ? (session.getState().conversationId ?? 'new') : 'new',\n ids.map((docId) => ({ docId, isPinned: false }))\n )\n }\n }\n if (workflow.model) void applyModel(workflow.model, `Workflow - ${workflow.title}`)\n // The tools ride the next send of the session in scope.\n session.setPendingTools(binding?.tools?.(inputs) ?? null)\n }\n // A fresh chat's reset clears the draft and the model, so the setup follows it. A surface\n // with its own send sends in its chat (set up first) or opens a fresh one (set up after).\n if (send) {\n if (inPlace) prepare()\n send(prompt)\n if (!inPlace) prepare()\n return\n }\n if (!inPlace) openNewConversation()\n prepare()\n session.setDraft(prompt)\n session.setAutoSendDraft(true)\n },\n [\n annotate,\n applyModel,\n createTask,\n documents,\n surfaceLanding,\n session,\n notify,\n openNewConversation,\n send,\n ]\n )\n}\n","/**\n * The workflow launcher, wired to run what it launches: `ConnectedWorkflowLauncher` (the\n * workspace's files behind scope and file fields, the user's agents behind \"Run as\") with the one\n * launch handler (`useLaunchWorkflow`), the host's upload dialog for adding files\n * (`environment.openUpload`), and the touches of the annotation operation (its derived name and\n * overwrite warning, \"Annotate N documents\").\n *\n * The dashboard's Start band, Files (\"Create new\") and, headless, the slash menu use it.\n */\n\nimport { useTags } from '@arbidocs/react'\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { TriangleAlert } from 'lucide-react'\nimport { documentScopeLabels } from '../../agents/workflows/workspaceScope'\nimport {\n type WorkflowDefinition,\n type WorkflowField,\n type WorkflowInputs,\n type WorkflowLanding,\n} from '../../agents/workflows/types'\nimport { ConnectedWorkflowLauncher } from '../ConnectedWorkflowLauncher'\nimport { type StartTile } from '../../home/StartTiles'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useHost } from '../../provider/host'\nimport { deriveAnnotationName } from '../../agents/workflows/catalogue/annotation-name'\nimport { ANNOTATE_ID, renderWorkflowIcon } from '../../agents/workflows/catalogue/seed'\nimport { useLaunchWorkflow } from './useLaunchWorkflow'\n\n// The agent picker names the person it hands the work to: the default \"Run as\" / \"My assistant\"\n// copy did not say who an assistant is.\nconst AGENT_LABELS = { label: 'Who this runs for', myAssistant: 'Me (your own assistant)' }\n\nexport interface ConnectedWorkflowStartProps {\n workflows: WorkflowDefinition[]\n /** Which of `workflows` get a tile (a filtered or capped view). */\n tileWorkflows?: WorkflowDefinition[]\n /** Render the Start band (off when another surface opens the dialog). */\n showTiles?: boolean\n caption?: string\n captionTestId?: string\n testId?: string\n /** Plain tiles appended to the band (e.g. the \"Create a file\" menu). */\n extraTiles?: StartTile[]\n /** Controlled open workflow id. */\n activeId?: string | null\n onActiveIdChange?: (id: string | null) => void\n initialInputsFor?: (workflow: WorkflowDefinition) => Partial<WorkflowInputs> | undefined\n /** Where launches land, over each workflow's default (`current-chat` = the chat on screen). */\n landing?: WorkflowLanding\n /** A prompt run's own send (a chat that is not the session's conversation). See `useLaunchWorkflow`. */\n send?: (prompt: string) => void\n /** The host's own \"Add\" control, offered when a workflow needs files and there are none. */\n addFilesAction?: ReactNode\n tileTestId?: (workflow: WorkflowDefinition) => string | undefined\n disabledReason?: (workflow: WorkflowDefinition) => string | undefined\n}\n\nexport function ConnectedWorkflowStart({\n workflows,\n landing,\n send,\n addFilesAction,\n ...rest\n}: ConnectedWorkflowStartProps) {\n const onLaunch = useLaunchWorkflow({ landing, send })\n // The host's icons first (a skill pack names its own), then the kit's, then the skill icon.\n const hostIcon = useHost().workflows?.renderIcon\n const renderIcon = useCallback(\n (key: string) => hostIcon?.(key) ?? renderWorkflowIcon(key) ?? renderWorkflowIcon('skill'),\n [hostIcon]\n )\n const { openUpload } = useBlocksEnvironment()\n const { data: workspaceTags = [] } = useTags()\n const tags = useMemo(() => documentScopeLabels(workspaceTags), [workspaceTags])\n\n // The annotation's name is optional: left blank it is taken from the question, which the\n // field's placeholder shows before anything runs.\n const fieldPlaceholder = useCallback(\n (field: WorkflowField, inputs: WorkflowInputs, workflow: WorkflowDefinition) => {\n if (workflow.id !== ANNOTATE_ID || field.name !== 'name') return undefined\n const derived = deriveAnnotationName(String(inputs.description ?? ''))\n return derived ? `Otherwise “${derived}”` : 'Taken from the description'\n },\n []\n )\n\n return (\n <ConnectedWorkflowLauncher\n {...rest}\n workflows={workflows}\n onLaunch={onLaunch}\n renderIcon={renderIcon}\n onAddFiles={openUpload}\n agentLabels={AGENT_LABELS}\n addFilesAction={addFilesAction}\n fieldPlaceholder={fieldPlaceholder}\n submitLabel={({ workflow, matchedCount }) =>\n workflow.id === ANNOTATE_ID && matchedCount !== null\n ? `Annotate ${matchedCount} document${matchedCount !== 1 ? 's' : ''}`\n : undefined\n }\n renderNotice={({ workflow, inputs }) => {\n if (workflow.id !== ANNOTATE_ID) return null\n // A same-named label is reused: warn that this overwrites its stored description and the\n // cell values for the selected documents.\n const name =\n String(inputs.name ?? '').trim() || deriveAnnotationName(String(inputs.description ?? ''))\n const existing = name\n ? tags.find((t) => t.name.toLowerCase() === name.toLowerCase())\n : undefined\n if (!existing) return null\n return (\n <div\n className=\"flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-sm text-amber-800 dark:text-amber-200\"\n role=\"status\"\n data-testid=\"workflow-existing-label-warning\"\n >\n <TriangleAlert className=\"mt-0.5 size-4 shrink-0 text-amber-500\" />\n <span>\n An annotation called <span className=\"font-medium\">{existing.name}</span> already\n exists. Annotating will overwrite its description and the current cell values for the\n selected files.\n </span>\n </div>\n )\n }}\n />\n )\n}\n","/**\n * Slash skills are launched prompt-first, through the one workflow launcher.\n *\n * A skill (or a prompt-style built-in such as Deep research) is run WITH a prompt, so it never\n * just executes:\n * - picking it in the slash menu opens its form (the prompt field first, focused, required);\n * - typing `/slug` and pressing Enter opens the same form with the field empty;\n * - typing `/slug some text` and pressing Enter opens it with the text already in the field.\n * The rule is the same for any recognised skill slug as the FIRST token of the draft; a backend\n * command (`/goal`, `/compact`, ...) is never a skill and is sent as typed. Nothing is sent from\n * the composer until the user starts it in the form. Without skills enabled (`show_skills`) this\n * applies to the host's skill packs only (`host.workflows.skillPacks`): the menu lists no other\n * skills and any other `/text` is sent as typed.\n *\n * The run lands where the surface says (`landing`), through the one launch handler. A chat that\n * is not the session's conversation (`ChatPage`, the document ask) passes `send`: the composed\n * prompt then goes to its own send, as a typed message would.\n */\n\nimport { useCallback, useMemo, useState, type ReactNode } from 'react'\nimport { promptFieldName } from '../../agents/workflows/workflow'\nimport { isSkillPackWorkflow } from '../../agents/workflows/skillPack'\nimport { type SlashMenuItem } from '../../chat/SlashMenu'\nimport {\n type WorkflowDefinition,\n type WorkflowInputs,\n type WorkflowLanding,\n} from '../../agents/workflows/types'\nimport { useBuiltinCommands } from '@arbidocs/react'\nimport { ConnectedWorkflowStart } from './ConnectedWorkflowStart'\nimport { useWorkflowDefinitions } from './useWorkflowDefinitions'\n\n/** `/slug` or `/slug rest of the line`: the first token and the text after it. */\nconst TYPED_SKILL = /^\\s*\\/([a-zA-Z0-9][a-zA-Z0-9_-]*)(?:\\s+([\\s\\S]*))?$/\n\n/** What the typed draft names: its slug (lower-cased) and the text after it (trimmed). */\nexport function parseTypedSkill(draft: string): { slug: string; text: string } | null {\n const m = TYPED_SKILL.exec(draft)\n return m ? { slug: m[1].toLowerCase(), text: (m[2] ?? '').trim() } : null\n}\n\n/**\n * Whether a skill opens its form from a menu (the `/` menus, the command palette): a prompt skill,\n * and with skills switched off (`show_skills`) only the host's packs. The one gate both share.\n */\nexport function canOpenSkill(workflow: WorkflowDefinition, skillsEnabled: boolean): boolean {\n return workflow.run.kind === 'prompt' && (skillsEnabled || isSkillPackWorkflow(workflow))\n}\n\nexport interface UseSlashSkillWorkflowsOptions {\n landing: WorkflowLanding\n /** Where the composed prompt goes, for a chat that is not the session's conversation. */\n send?: (prompt: string) => void\n}\n\nexport function useSlashSkillWorkflows({ landing, send }: UseSlashSkillWorkflowsOptions): {\n /** Opens the launcher for a picked menu item. True when it did (the caller then clears the draft). */\n openFor: (item: SlashMenuItem) => boolean\n /**\n * Opens the launcher for a typed `/slug text` draft, text pre-filled. True when the draft names\n * a skill (the caller then clears the draft and sends nothing).\n */\n openForDraft: (draft: string) => boolean\n /**\n * Opens the launcher for a skill by id (a surface listing the skills itself, the command\n * palette). True when it is a skill this person may run here.\n */\n openSkill: (id: string) => boolean\n /** The skills this person may open here: the host's packs, and the rest with `show_skills`. */\n openable: WorkflowDefinition[]\n /** Render once, anywhere in the surface that hosts the slash menu. */\n launcher: ReactNode\n} {\n const { skills, skillsEnabled } = useWorkflowDefinitions()\n const { commands } = useBuiltinCommands()\n const [active, setActive] = useState<{ id: string; text: string } | null>(null)\n\n // Stable while the lists are, so a surface can memoise what it builds on them.\n const open = useCallback(\n (workflow: WorkflowDefinition | undefined, text: string): boolean => {\n if (!workflow || !canOpenSkill(workflow, skillsEnabled)) return false\n setActive({ id: workflow.id, text })\n return true\n },\n [skillsEnabled]\n )\n\n const openFor = useCallback(\n (item: SlashMenuItem): boolean =>\n item.kind === 'skill' &&\n open(\n skills.find((w) => w.id === item.name),\n ''\n ),\n [open, skills]\n )\n\n const openSkill = useCallback(\n (id: string): boolean =>\n open(\n skills.find((w) => w.id === id),\n ''\n ),\n [open, skills]\n )\n\n const openable = useMemo(\n () => skills.filter((w) => canOpenSkill(w, skillsEnabled)),\n [skills, skillsEnabled]\n )\n\n const openForDraft = useCallback(\n (draft: string): boolean => {\n const typed = parseTypedSkill(draft)\n if (!typed) return false\n // A backend command wins a name collision, as in the menu: it is sent as typed.\n if (commands.some((c) => c.name.toLowerCase() === typed.slug)) return false\n return open(\n skills.find((w) => w.id.toLowerCase() === typed.slug),\n typed.text\n )\n },\n [open, skills, commands]\n )\n\n // Mounted only while a workflow is open: the ask bar lives in every page's topbar, so the\n // launcher's data hooks (files, agents, tasks) must not run until it is needed.\n const launcher = useMemo(() => {\n if (active === null) return null\n const initialInputsFor = (\n workflow: WorkflowDefinition\n ): Partial<WorkflowInputs> | undefined => {\n const field = promptFieldName(workflow)\n return field && active.text ? { [field]: active.text } : undefined\n }\n return (\n <ConnectedWorkflowStart\n workflows={skills}\n showTiles={false}\n landing={landing}\n send={send}\n activeId={active.id}\n onActiveIdChange={(id) => id === null && setActive(null)}\n initialInputsFor={initialInputsFor}\n />\n )\n }, [active, skills, landing, send])\n\n return { openFor, openForDraft, openSkill, openable, launcher }\n}\n","/**\n * The slash menu's data, in one place for every surface that hosts it (the chat composers, the\n * workspace ask bar, the document ask and `ChatPage`): the backend's built-in commands, the host's\n * skill packs and the user's skills, filtered by the slash token in progress. Commands and the\n * user's skills are typed `/<slug>` and dispatched by the backend; a skill opens its form\n * (`useSlashSkillWorkflows`).\n */\n\nimport { useMemo } from 'react'\nimport { useBuiltinCommands } from '@arbidocs/react'\nimport type { SlashMenuItem } from '../../chat/SlashMenu'\nimport { buildSlashItems, filterSlashItems, parseSlashToken } from '../../chat/slash-menu-helpers'\nimport { mergeSkillWorkflows } from '../../agents/workflows/workflow'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\nimport { useCanBrowseSkills, useSkillsEnabled } from '../workflows/useSkillsEnabled'\nimport { hostSkillItem, useHostSkills } from '../workflows/useHostSkills'\nimport { useUsableSkillListings } from '../workflows/useWorkflowDefinitions'\nimport { useNamedWorkflows } from '../workflows/useNamedWorkflows'\n\nconst NO_SKILLS: ReadonlyArray<WorkflowDefinition> = []\n\n/**\n * Every row of the menu, unfiltered: commands, then the host's packs (always: the host offers\n * them), then, for skills users (`show_skills`), the built-in skills and the user's own.\n *\n * @param builtinSkills The built-in skills to offer (prompt workflows offered as `/slug`), for a\n * surface that can open their form; default none.\n */\nexport function useSlashMenuItems(builtinSkills: ReadonlyArray<WorkflowDefinition> = NO_SKILLS): {\n items: SlashMenuItem[]\n /** The menu's \"Browse all\" footer opens the Skills browser: skills users, never guests. */\n canBrowseSkills: boolean\n} {\n const hostSkills = useHostSkills()\n const listings = useUsableSkillListings(hostSkills)\n const skillsEnabled = useSkillsEnabled()\n const { commands } = useBuiltinCommands()\n const builtins = useNamedWorkflows(builtinSkills)\n const items = useMemo<SlashMenuItem[]>(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n return buildSlashItems(\n commands.map((c) => ({\n name: c.name,\n description: c.description,\n argHint: c.arg_hint,\n kind: 'command' as const,\n })),\n [\n ...hostSkills.map(hostSkillItem),\n ...(skillsEnabled\n ? skillItems(\n builtins.filter((w) => !packSlugs.has(w.id)),\n listings\n )\n : []),\n ]\n )\n }, [commands, hostSkills, listings, skillsEnabled, builtins])\n return { items, canBrowseSkills: useCanBrowseSkills() }\n}\n\n/**\n * @param text The draft.\n * @param builtinSkills The built-in skills (prompt workflows offered as `/slug`).\n */\nexport function useSlashItems(\n text: string,\n builtinSkills: ReadonlyArray<WorkflowDefinition> = NO_SKILLS\n) {\n const { items, canBrowseSkills } = useSlashMenuItems(builtinSkills)\n const slashToken = parseSlashToken(text)\n const filteredItems = useMemo(\n () => (slashToken !== null ? filterSlashItems(items, slashToken) : []),\n [items, slashToken]\n )\n return {\n slashToken,\n filteredItems,\n isOpen: slashToken !== null && filteredItems.length > 0,\n canBrowseSkills,\n }\n}\n\ntype SkillListings = ReturnType<typeof useUsableSkillListings>\n\n/**\n * Built-in skills share the list and the `/slug` path; a same-slug skill of the user's own shadows\n * the built-in, as on the backend.\n */\nfunction skillItems(\n builtinSkills: ReadonlyArray<WorkflowDefinition>,\n listings: SkillListings\n): SlashMenuItem[] {\n const { host, skills } = mergeSkillWorkflows([...builtinSkills], listings)\n const listing = new Map(listings.map((s) => [s.slug, s]))\n return [\n ...host.map((w): SlashMenuItem => ({\n name: w.id,\n description: w.description,\n argHint: w.inputs[0]?.label ?? '',\n visibility: 'global',\n kind: 'skill',\n })),\n ...skills.map((w): SlashMenuItem => {\n const s = listing.get(w.id)\n return {\n name: w.id,\n description: s?.description || (w.title !== w.id ? w.title : ''),\n argHint: s?.arg_hint ?? '',\n visibility: s?.visibility === 'global' ? 'global' : 'mine',\n kind: 'skill',\n }\n }),\n ]\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/workflows/launch-bindings.ts","../src/connection/workflows/useLaunchWorkflow.ts","../src/connection/workflows/ConnectedWorkflowStart.tsx","../src/connection/workflows/useSlashSkillWorkflows.tsx","../src/connection/conversation/useSlashItems.ts"],"names":["GENERATE_IMAGE_ID","buildRetrievalChunkTool","buildRetrievalFullContextTool","IMAGE_ASPECT_AUTO","useDocuments","useTags","useMemo","documentScopeLabels","useCreateTag","useUpdateTag","useGenerateDocTags","useWorkflowTasks","useApplyChatModel","useArbiSessionStore","useBlocksEnvironment","useCallback","deriveAnnotationName","matchWorkflowScope","ANNOTATE_ID","recordWorkflowUse","getDocumentTitle","composeWorkflowPrompt","isEmptyWorkflowScope","useHost","renderWorkflowIcon","jsx","ConnectedWorkflowLauncher","jsxs","TriangleAlert","isSkillPackWorkflow","useWorkflowDefinitions","useBuiltinCommands","useState","text","promptFieldName","useHostSkills","useUsableSkillListings","useSkillsEnabled","useNamedWorkflows","buildSlashItems","hostSkillItem","useCanBrowseSkills","parseSlashTokenInProgress","filterSlashItems","mergeSkillWorkflows"],"mappings":"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","file":"chunk-LFRNBT2I.cjs","sourcesContent":["/**\n * Host bindings of prompt workflows that need more than words on send. Bound by workflow id, the\n * same way the annotation operation is: blocks and the registry stay declarative, and the one\n * place that knows the wire shape is here.\n *\n * Generate image: the reference images and the aspect ratio ride structured tool arguments\n * (`retrieval_full_context` over every reference, `image_generation.aspect_ratio`), never the\n * prompt text: the image model does not reliably honour a shape or sources worded into the prompt,\n * and the references go to the separate image model in its own request, so (unlike the app's\n * one-at-a-time pinned document) several of them do not compound against the agent's context.\n */\n\nimport type { WorkflowInputs, WorkflowScope } from '../../agents/workflows/types'\nimport { buildRetrievalChunkTool, buildRetrievalFullContextTool } from '@arbidocs/sdk/browser'\nimport type { TurnTools } from '@arbidocs/react'\nimport { GENERATE_IMAGE_ID, IMAGE_ASPECT_AUTO } from '../../agents/workflows/catalogue/seed'\n\nexport interface PromptBinding {\n /** Attach the scoped files to the chat (default true). Off when the files are tool inputs. */\n attachScope: boolean\n /** Structured tools for the one send, from the form's inputs. */\n tools?: (inputs: WorkflowInputs) => TurnTools\n}\n\nconst referencesOf = (inputs: WorkflowInputs): string[] => {\n const value = inputs.references as WorkflowScope | undefined\n return value?.documents ?? []\n}\n\nexport const PROMPT_BINDINGS: Record<string, PromptBinding> = {\n [GENERATE_IMAGE_ID]: {\n attachScope: false,\n tools: (inputs) => {\n const aspectRatio = typeof inputs.aspect_ratio === 'string' ? inputs.aspect_ratio : ''\n return {\n retrieval_chunk: buildRetrievalChunkTool([]),\n retrieval_full_context: buildRetrievalFullContextTool(referencesOf(inputs)),\n ...(aspectRatio && aspectRatio !== IMAGE_ASPECT_AUTO\n ? {\n image_generation: {\n name: 'image_generation' as const,\n description: 'image generation',\n tool_args: { aspect_ratio: aspectRatio },\n tool_responses: {},\n },\n }\n : {}),\n }\n },\n },\n}\n","/**\n * The host side of the launch contract: `onLaunch({workflow, inputs, scope, agentId})`.\n *\n * Blocks only say WHAT to run; this performs it, so workspace isolation stays host-side:\n *\n * - prompt workflow, my assistant: open a fresh chat (or stay in this one when `inPlace`), scope\n * its documents, set the composed draft and ask for it to be sent (`autoSendDraft`). The host's\n * send waits for the new chat's documents to be seeded, so a scoped run is never sent with the\n * wrong files. Order matters: `openNewConversation` resets the draft, so it is set after it.\n * - prompt workflow, another agent: a run-now task assigned to that agent (the interactive chat\n * query has no agent parameter), created through the same path as the task composer.\n * - operation workflow (tier B): the handler bound to its id (annotation).\n * - a workflow's own model becomes the chat's (`useApplyChatModel`).\n *\n * The prompt is composed in exactly one place: `composeWorkflowPrompt(workflow, inputs)`.\n */\n\nimport {\n useApplyChatModel,\n useArbiSessionStore,\n useCreateTag,\n useDocuments,\n useGenerateDocTags,\n useTags,\n useUpdateTag,\n} from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport { useCallback, useMemo } from 'react'\nimport { composeWorkflowPrompt, isEmptyWorkflowScope } from '../../agents/workflows/workflow'\nimport { documentScopeLabels, matchWorkflowScope } from '../../agents/workflows/workspaceScope'\nimport {\n type WorkflowInputs,\n type WorkflowLanding,\n type WorkflowLaunch,\n} from '../../agents/workflows/types'\nimport { deriveAnnotationName } from '../../agents/workflows/catalogue/annotation-name'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { PROMPT_BINDINGS } from './launch-bindings'\nimport { ANNOTATE_ID } from '../../agents/workflows/catalogue/seed'\nimport { useWorkflowTasks } from './useWorkflowTasks'\nimport { recordWorkflowUse } from '../../agents/workflows/catalogue/workflow-usage'\n\nexport interface UseLaunchWorkflowOptions {\n /**\n * Where launches from this surface land, over each workflow's own default. The empty chat and\n * the slash menu send into the conversation on screen (`current-chat`); everything else opens a\n * fresh one. A single launch can still override it (`WorkflowLaunch.landing`).\n */\n landing?: WorkflowLanding\n /**\n * A prompt run on the user's own assistant is sent here instead of through the session's draft:\n * the surface's own chat (`ChatPage`) or its own ask (the document ask). Everything else is the\n * same: the file scope, the workflow's model and its bound tools are set on the session in scope\n * (before a send in place, after a send that opens a fresh chat), so the turn carries them.\n */\n send?: (prompt: string) => void\n}\n\nconst text = (inputs: WorkflowInputs, name: string): string => {\n const v = inputs[name]\n return typeof v === 'string' ? v.trim() : ''\n}\n\nexport function useLaunchWorkflow({\n landing: surfaceLanding,\n send,\n}: UseLaunchWorkflowOptions = {}) {\n const { data: documents = [] } = useDocuments()\n const { data: workspaceTags = [] } = useTags()\n const tags = useMemo(() => documentScopeLabels(workspaceTags), [workspaceTags])\n const createTag = useCreateTag()\n const updateTag = useUpdateTag()\n const generate = useGenerateDocTags()\n const { create: createTask } = useWorkflowTasks()\n const applyModel = useApplyChatModel()\n const session = useArbiSessionStore()\n const { notify, openFiles, openNewConversation } = useBlocksEnvironment()\n\n /** Annotation: create (or reuse) the label, start the AI run, land on Files filtered to the set. */\n const annotate = useCallback(\n async ({ inputs, scope }: WorkflowLaunch) => {\n const description = text(inputs, 'description')\n const name = text(inputs, 'name') || deriveAnnotationName(description)\n const matching = matchWorkflowScope(documents, scope)\n if (!name || !description || matching.length === 0) return\n try {\n // A same-named label is reused rather than duplicated, the rule the Files page's\n // label-creation paths follow.\n const existing = tags.find((t) => t.name.toLowerCase() === name.toLowerCase())\n let tagId: string\n if (existing) {\n tagId = existing.external_id\n await updateTag.mutateAsync({\n tagId: tagId,\n change: { instruction: description },\n })\n } else {\n const created = await createTag.mutateAsync({\n name,\n tagType: { type: 'text', options: [] },\n shared: true,\n instruction: description,\n })\n const createdId = (created as { external_id?: string } | undefined)?.external_id\n if (!createdId) throw new Error('tag create returned no id')\n tagId = createdId\n }\n const docIds = matching.map((d) => d.external_id)\n // overwrite=true so a re-run on an existing field refreshes stale values, matching the\n // Files page's default review behaviour.\n await generate.mutateAsync({ tagIds: [tagId], docIds: docIds, overwrite: true })\n // Land on Files with those documents selected and the view narrowed to the annotated set\n // through the same tri-state quick filter the pickers write to. An empty scope selected\n // every file, so no filter is applied.\n const filters: Record<string, 'include'> = {}\n scope.folders.forEach((folder) => {\n filters[folder === '' ? 'folder:none' : `folder:${folder}`] = 'include'\n })\n scope.labels.forEach((labelId) => {\n filters[labelId] = 'include'\n })\n openFiles({ select: docIds, filters })\n } catch (error) {\n notify('Could not start the annotation', 'error')\n throw error\n }\n },\n [documents, tags, createTag, updateTag, generate, openFiles, notify]\n )\n\n return useCallback(\n async (launch: WorkflowLaunch) => {\n const { workflow, inputs, scope, agentId } = launch\n if (workflow.run.kind === 'operation') {\n if (workflow.id === ANNOTATE_ID) {\n await annotate(launch)\n recordWorkflowUse(workflow.id)\n return\n }\n throw new Error(`No host handler for workflow \"${workflow.id}\"`)\n }\n\n // Names for the wording: a `documents` field quotes the files it picked.\n const documentTitles = Object.fromEntries(\n documents.map((d) => [d.external_id, getDocumentTitle(d, d.external_id)])\n )\n const prompt = composeWorkflowPrompt(workflow, inputs, { documentTitles })\n if (!prompt) return\n recordWorkflowUse(workflow.id)\n\n if (agentId) {\n try {\n const created = await createTask({\n workflow,\n values: {\n assignee: 'agent',\n workflowId: workflow.id,\n inputs,\n when: 'now',\n runAt: '',\n rrule: '',\n timezone: 'UTC',\n eventKind: '',\n afterTaskId: '',\n parentTaskId: '',\n shared: true,\n description: '',\n dueAt: '',\n agentId,\n name: '',\n notifyOnComplete: true,\n access: 'ask_each_run',\n },\n })\n const ran = created.kind === 'work' ? created.ran : null\n const title = created.kind === 'work' ? created.task.title : created.workflow.name\n notify(\n ran === false\n ? 'Task created, but the run could not start'\n : `Running \\u201c${title ?? workflow.title}\\u201d`,\n ran === false ? 'warning' : 'success'\n )\n } catch (error) {\n notify(\n error instanceof Error && error.message.startsWith('Open a workspace')\n ? error.message\n : 'Could not start the run',\n 'error'\n )\n throw error\n }\n return\n }\n\n const landing = launch.landing ?? surfaceLanding ?? workflow.landing\n const inPlace = landing === 'current-chat'\n const binding = PROMPT_BINDINGS[workflow.id]\n /** The run's setup on the session in scope: its file scope, its model, its bound tools. */\n const prepare = () => {\n // Scope the chat to the chosen files when a restriction was made; otherwise the\n // workspace's usual \"all documents\" attachment (useDocumentAutoAdd) applies.\n if (binding?.attachScope !== false && !isEmptyWorkflowScope(scope)) {\n const ids = matchWorkflowScope(documents, scope).map((d) => d.external_id)\n if (ids.length > 0) {\n session.setConversationDocuments(\n inPlace ? (session.getState().conversationId ?? 'new') : 'new',\n ids.map((docId) => ({ docId, isPinned: false }))\n )\n }\n }\n if (workflow.model) void applyModel(workflow.model, `Workflow - ${workflow.title}`)\n // The tools ride the next send of the session in scope.\n session.setPendingTools(binding?.tools?.(inputs) ?? null)\n }\n // A fresh chat's reset clears the draft and the model, so the setup follows it. A surface\n // with its own send sends in its chat (set up first) or opens a fresh one (set up after).\n if (send) {\n if (inPlace) prepare()\n send(prompt)\n if (!inPlace) prepare()\n return\n }\n if (!inPlace) openNewConversation()\n prepare()\n session.setDraft(prompt)\n session.setAutoSendDraft(true)\n },\n [\n annotate,\n applyModel,\n createTask,\n documents,\n surfaceLanding,\n session,\n notify,\n openNewConversation,\n send,\n ]\n )\n}\n","/**\n * The workflow launcher, wired to run what it launches: `ConnectedWorkflowLauncher` (the\n * workspace's files behind scope and file fields, the user's agents behind \"Run as\") with the one\n * launch handler (`useLaunchWorkflow`), the host's upload dialog for adding files\n * (`environment.openUpload`), and the touches of the annotation operation (its derived name and\n * overwrite warning, \"Annotate N documents\").\n *\n * The dashboard's Start band, Files (\"Create new\") and, headless, the slash menu use it.\n */\n\nimport { useTags } from '@arbidocs/react'\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { TriangleAlert } from 'lucide-react'\nimport { documentScopeLabels } from '../../agents/workflows/workspaceScope'\nimport {\n type WorkflowDefinition,\n type WorkflowField,\n type WorkflowInputs,\n type WorkflowLanding,\n} from '../../agents/workflows/types'\nimport { ConnectedWorkflowLauncher } from '../ConnectedWorkflowLauncher'\nimport { type StartTile } from '../../home/StartTiles'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useHost } from '../../provider/host'\nimport { deriveAnnotationName } from '../../agents/workflows/catalogue/annotation-name'\nimport { ANNOTATE_ID, renderWorkflowIcon } from '../../agents/workflows/catalogue/seed'\nimport { useLaunchWorkflow } from './useLaunchWorkflow'\n\n// The agent picker names the person it hands the work to: the default \"Run as\" / \"My assistant\"\n// copy did not say who an assistant is.\nconst AGENT_LABELS = { label: 'Who this runs for', myAssistant: 'Me (your own assistant)' }\n\nexport interface ConnectedWorkflowStartProps {\n workflows: WorkflowDefinition[]\n /** Which of `workflows` get a tile (a filtered or capped view). */\n tileWorkflows?: WorkflowDefinition[]\n /** Render the Start band (off when another surface opens the dialog). */\n showTiles?: boolean\n caption?: string\n captionTestId?: string\n testId?: string\n /** Plain tiles appended to the band (e.g. the \"Create a file\" menu). */\n extraTiles?: StartTile[]\n /** Controlled open workflow id. */\n activeId?: string | null\n onActiveIdChange?: (id: string | null) => void\n initialInputsFor?: (workflow: WorkflowDefinition) => Partial<WorkflowInputs> | undefined\n /** Where launches land, over each workflow's default (`current-chat` = the chat on screen). */\n landing?: WorkflowLanding\n /** A prompt run's own send (a chat that is not the session's conversation). See `useLaunchWorkflow`. */\n send?: (prompt: string) => void\n /** The host's own \"Add\" control, offered when a workflow needs files and there are none. */\n addFilesAction?: ReactNode\n tileTestId?: (workflow: WorkflowDefinition) => string | undefined\n disabledReason?: (workflow: WorkflowDefinition) => string | undefined\n}\n\nexport function ConnectedWorkflowStart({\n workflows,\n landing,\n send,\n addFilesAction,\n ...rest\n}: ConnectedWorkflowStartProps) {\n const onLaunch = useLaunchWorkflow({ landing, send })\n // The host's icons first (a skill pack names its own), then the kit's, then the skill icon.\n const hostIcon = useHost().workflows?.renderIcon\n const renderIcon = useCallback(\n (key: string) => hostIcon?.(key) ?? renderWorkflowIcon(key) ?? renderWorkflowIcon('skill'),\n [hostIcon]\n )\n const { openUpload } = useBlocksEnvironment()\n const { data: workspaceTags = [] } = useTags()\n const tags = useMemo(() => documentScopeLabels(workspaceTags), [workspaceTags])\n\n // The annotation's name is optional: left blank it is taken from the question, which the\n // field's placeholder shows before anything runs.\n const fieldPlaceholder = useCallback(\n (field: WorkflowField, inputs: WorkflowInputs, workflow: WorkflowDefinition) => {\n if (workflow.id !== ANNOTATE_ID || field.name !== 'name') return undefined\n const derived = deriveAnnotationName(String(inputs.description ?? ''))\n return derived ? `Otherwise “${derived}”` : 'Taken from the description'\n },\n []\n )\n\n return (\n <ConnectedWorkflowLauncher\n {...rest}\n workflows={workflows}\n onLaunch={onLaunch}\n renderIcon={renderIcon}\n onAddFiles={openUpload}\n agentLabels={AGENT_LABELS}\n addFilesAction={addFilesAction}\n fieldPlaceholder={fieldPlaceholder}\n submitLabel={({ workflow, matchedCount }) =>\n workflow.id === ANNOTATE_ID && matchedCount !== null\n ? `Annotate ${matchedCount} document${matchedCount !== 1 ? 's' : ''}`\n : undefined\n }\n renderNotice={({ workflow, inputs }) => {\n if (workflow.id !== ANNOTATE_ID) return null\n // A same-named label is reused: warn that this overwrites its stored description and the\n // cell values for the selected documents.\n const name =\n String(inputs.name ?? '').trim() || deriveAnnotationName(String(inputs.description ?? ''))\n const existing = name\n ? tags.find((t) => t.name.toLowerCase() === name.toLowerCase())\n : undefined\n if (!existing) return null\n return (\n <div\n className=\"flex items-start gap-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-sm text-amber-800 dark:text-amber-200\"\n role=\"status\"\n data-testid=\"workflow-existing-label-warning\"\n >\n <TriangleAlert className=\"mt-0.5 size-4 shrink-0 text-amber-500\" />\n <span>\n An annotation called <span className=\"font-medium\">{existing.name}</span> already\n exists. Annotating will overwrite its description and the current cell values for the\n selected files.\n </span>\n </div>\n )\n }}\n />\n )\n}\n","/**\n * Slash skills are launched prompt-first, through the one workflow launcher.\n *\n * A skill (or a prompt-style built-in such as Deep research) is run WITH a prompt, so it never\n * just executes:\n * - picking it in the slash menu opens its form (the prompt field first, focused, required);\n * - typing `/slug` and pressing Enter opens the same form with the field empty;\n * - typing `/slug some text` and pressing Enter opens it with the text already in the field.\n * The rule is the same for any recognised skill slug as the FIRST token of the draft; a backend\n * command (`/goal`, `/compact`, ...) is never a skill and is sent as typed. Nothing is sent from\n * the composer until the user starts it in the form. Without skills enabled (`show_skills`) this\n * applies to the host's skill packs only (`host.workflows.skillPacks`): the menu lists no other\n * skills and any other `/text` is sent as typed.\n *\n * The run lands where the surface says (`landing`), through the one launch handler. A chat that\n * is not the session's conversation (`ChatPage`, the document ask) passes `send`: the composed\n * prompt then goes to its own send, as a typed message would.\n */\n\nimport { useCallback, useMemo, useState, type ReactNode } from 'react'\nimport { promptFieldName } from '../../agents/workflows/workflow'\nimport { isSkillPackWorkflow } from '../../agents/workflows/skillPack'\nimport { type SlashMenuItem } from '../../chat/SlashMenu'\nimport {\n type WorkflowDefinition,\n type WorkflowInputs,\n type WorkflowLanding,\n} from '../../agents/workflows/types'\nimport { useBuiltinCommands } from '@arbidocs/react'\nimport { ConnectedWorkflowStart } from './ConnectedWorkflowStart'\nimport { useWorkflowDefinitions } from './useWorkflowDefinitions'\n\n/** `/slug` or `/slug rest of the line`: the first token and the text after it. */\nconst TYPED_SKILL = /^\\s*\\/([a-zA-Z0-9][a-zA-Z0-9_-]*)(?:\\s+([\\s\\S]*))?$/\n\n/** What the typed draft names: its slug (lower-cased) and the text after it (trimmed). */\nexport function parseTypedSkill(draft: string): { slug: string; text: string } | null {\n const m = TYPED_SKILL.exec(draft)\n return m ? { slug: m[1].toLowerCase(), text: (m[2] ?? '').trim() } : null\n}\n\n/**\n * Whether a skill opens its form from a menu (the `/` menus, the command palette): a prompt skill,\n * and with skills switched off (`show_skills`) only the host's packs. The one gate both share.\n */\nexport function canOpenSkill(workflow: WorkflowDefinition, skillsEnabled: boolean): boolean {\n return workflow.run.kind === 'prompt' && (skillsEnabled || isSkillPackWorkflow(workflow))\n}\n\nexport interface UseSlashSkillWorkflowsOptions {\n landing: WorkflowLanding\n /** Where the composed prompt goes, for a chat that is not the session's conversation. */\n send?: (prompt: string) => void\n}\n\nexport function useSlashSkillWorkflows({ landing, send }: UseSlashSkillWorkflowsOptions): {\n /** Opens the launcher for a picked menu item. True when it did (the caller then clears the draft). */\n openFor: (item: SlashMenuItem) => boolean\n /**\n * Opens the launcher for a typed `/slug text` draft, text pre-filled. True when the draft names\n * a skill (the caller then clears the draft and sends nothing).\n */\n openForDraft: (draft: string) => boolean\n /**\n * Opens the launcher for a skill by id (a surface listing the skills itself, the command\n * palette). True when it is a skill this person may run here.\n */\n openSkill: (id: string) => boolean\n /** The skills this person may open here: the host's packs, and the rest with `show_skills`. */\n openable: WorkflowDefinition[]\n /** Render once, anywhere in the surface that hosts the slash menu. */\n launcher: ReactNode\n} {\n const { skills, skillsEnabled } = useWorkflowDefinitions()\n const { commands } = useBuiltinCommands()\n const [active, setActive] = useState<{ id: string; text: string } | null>(null)\n\n // Stable while the lists are, so a surface can memoise what it builds on them.\n const open = useCallback(\n (workflow: WorkflowDefinition | undefined, text: string): boolean => {\n if (!workflow || !canOpenSkill(workflow, skillsEnabled)) return false\n setActive({ id: workflow.id, text })\n return true\n },\n [skillsEnabled]\n )\n\n const openFor = useCallback(\n (item: SlashMenuItem): boolean =>\n item.kind === 'skill' &&\n open(\n skills.find((w) => w.id === item.name),\n ''\n ),\n [open, skills]\n )\n\n const openSkill = useCallback(\n (id: string): boolean =>\n open(\n skills.find((w) => w.id === id),\n ''\n ),\n [open, skills]\n )\n\n const openable = useMemo(\n () => skills.filter((w) => canOpenSkill(w, skillsEnabled)),\n [skills, skillsEnabled]\n )\n\n const openForDraft = useCallback(\n (draft: string): boolean => {\n const typed = parseTypedSkill(draft)\n if (!typed) return false\n // A backend command wins a name collision, as in the menu: it is sent as typed.\n if (commands.some((c) => c.name.toLowerCase() === typed.slug)) return false\n return open(\n skills.find((w) => w.id.toLowerCase() === typed.slug),\n typed.text\n )\n },\n [open, skills, commands]\n )\n\n // Mounted only while a workflow is open: the ask bar lives in every page's topbar, so the\n // launcher's data hooks (files, agents, tasks) must not run until it is needed.\n const launcher = useMemo(() => {\n if (active === null) return null\n const initialInputsFor = (\n workflow: WorkflowDefinition\n ): Partial<WorkflowInputs> | undefined => {\n const field = promptFieldName(workflow)\n return field && active.text ? { [field]: active.text } : undefined\n }\n return (\n <ConnectedWorkflowStart\n workflows={skills}\n showTiles={false}\n landing={landing}\n send={send}\n activeId={active.id}\n onActiveIdChange={(id) => id === null && setActive(null)}\n initialInputsFor={initialInputsFor}\n />\n )\n }, [active, skills, landing, send])\n\n return { openFor, openForDraft, openSkill, openable, launcher }\n}\n","/**\n * The slash menu's data, in one place for every surface that hosts it (the chat composers, the\n * workspace ask bar, the document ask and `ChatPage`): the backend's built-in commands, the host's\n * skill packs and the user's skills, filtered by the slash token in progress. Commands and the\n * user's skills are typed `/<slug>` and dispatched by the backend; a skill opens its form\n * (`useSlashSkillWorkflows`).\n */\n\nimport { useMemo } from 'react'\nimport { useBuiltinCommands } from '@arbidocs/react'\nimport type { SlashMenuItem } from '../../chat/SlashMenu'\nimport { buildSlashItems, filterSlashItems, parseSlashToken } from '../../chat/slash-menu-helpers'\nimport { mergeSkillWorkflows } from '../../agents/workflows/workflow'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\nimport { useCanBrowseSkills, useSkillsEnabled } from '../workflows/useSkillsEnabled'\nimport { hostSkillItem, useHostSkills } from '../workflows/useHostSkills'\nimport { useUsableSkillListings } from '../workflows/useWorkflowDefinitions'\nimport { useNamedWorkflows } from '../workflows/useNamedWorkflows'\n\nconst NO_SKILLS: ReadonlyArray<WorkflowDefinition> = []\n\n/**\n * Every row of the menu, unfiltered: commands, then the host's packs (always: the host offers\n * them), then, for skills users (`show_skills`), the built-in skills and the user's own.\n *\n * @param builtinSkills The built-in skills to offer (prompt workflows offered as `/slug`), for a\n * surface that can open their form; default none.\n */\nexport function useSlashMenuItems(builtinSkills: ReadonlyArray<WorkflowDefinition> = NO_SKILLS): {\n items: SlashMenuItem[]\n /** The menu's \"Browse all\" footer opens the Skills browser: skills users, never guests. */\n canBrowseSkills: boolean\n} {\n const hostSkills = useHostSkills()\n const listings = useUsableSkillListings(hostSkills)\n const skillsEnabled = useSkillsEnabled()\n const { commands } = useBuiltinCommands()\n const builtins = useNamedWorkflows(builtinSkills)\n const items = useMemo<SlashMenuItem[]>(() => {\n const packSlugs = new Set(hostSkills.map((w) => w.id))\n return buildSlashItems(\n commands.map((c) => ({\n name: c.name,\n description: c.description,\n argHint: c.arg_hint,\n kind: 'command' as const,\n })),\n [\n ...hostSkills.map(hostSkillItem),\n ...(skillsEnabled\n ? skillItems(\n builtins.filter((w) => !packSlugs.has(w.id)),\n listings\n )\n : []),\n ]\n )\n }, [commands, hostSkills, listings, skillsEnabled, builtins])\n return { items, canBrowseSkills: useCanBrowseSkills() }\n}\n\n/**\n * @param text The draft.\n * @param builtinSkills The built-in skills (prompt workflows offered as `/slug`).\n */\nexport function useSlashItems(\n text: string,\n builtinSkills: ReadonlyArray<WorkflowDefinition> = NO_SKILLS\n) {\n const { items, canBrowseSkills } = useSlashMenuItems(builtinSkills)\n const slashToken = parseSlashToken(text)\n const filteredItems = useMemo(\n () => (slashToken !== null ? filterSlashItems(items, slashToken) : []),\n [items, slashToken]\n )\n return {\n slashToken,\n filteredItems,\n isOpen: slashToken !== null && filteredItems.length > 0,\n canBrowseSkills,\n }\n}\n\ntype SkillListings = ReturnType<typeof useUsableSkillListings>\n\n/**\n * Built-in skills share the list and the `/slug` path; a same-slug skill of the user's own shadows\n * the built-in, as on the backend.\n */\nfunction skillItems(\n builtinSkills: ReadonlyArray<WorkflowDefinition>,\n listings: SkillListings\n): SlashMenuItem[] {\n const { host, skills } = mergeSkillWorkflows([...builtinSkills], listings)\n const listing = new Map(listings.map((s) => [s.slug, s]))\n return [\n ...host.map((w): SlashMenuItem => ({\n name: w.id,\n description: w.description,\n argHint: w.inputs[0]?.label ?? '',\n visibility: 'global',\n kind: 'skill',\n })),\n ...skills.map((w): SlashMenuItem => {\n const s = listing.get(w.id)\n return {\n name: w.id,\n description: s?.description || (w.title !== w.id ? w.title : ''),\n argHint: s?.arg_hint ?? '',\n visibility: s?.visibility === 'global' ? 'global' : 'mine',\n kind: 'skill',\n }\n }),\n ]\n}\n"]}
@@ -5,10 +5,10 @@ var chunk3YEXZX4H_cjs = require('./chunk-3YEXZX4H.cjs');
5
5
  var chunk4PA6VCCR_cjs = require('./chunk-4PA6VCCR.cjs');
6
6
  var chunkRL2HI6NP_cjs = require('./chunk-RL2HI6NP.cjs');
7
7
  var chunk6UZC4XVV_cjs = require('./chunk-6UZC4XVV.cjs');
8
+ var chunkIPSHAMO2_cjs = require('./chunk-IPSHAMO2.cjs');
8
9
  var chunkE7TE2WVT_cjs = require('./chunk-E7TE2WVT.cjs');
9
10
  var chunkSJSGSHIT_cjs = require('./chunk-SJSGSHIT.cjs');
10
11
  var chunkZW6FPIFC_cjs = require('./chunk-ZW6FPIFC.cjs');
11
- var chunkIPSHAMO2_cjs = require('./chunk-IPSHAMO2.cjs');
12
12
  var chunkPLIF5CUV_cjs = require('./chunk-PLIF5CUV.cjs');
13
13
  var ui = require('@arbidocs/react/ui');
14
14
  var jsxRuntime = require('react/jsx-runtime');
@@ -805,5 +805,5 @@ exports.WORKFLOW_COLUMN_ORDER = WORKFLOW_COLUMN_ORDER;
805
805
  exports.WorkflowCatalogueSections = WorkflowCatalogueSections;
806
806
  exports.WorkflowsTable = WorkflowsTable;
807
807
  exports.createWorkflowColumns = createWorkflowColumns;
808
- //# sourceMappingURL=chunk-R7CJEIA5.cjs.map
809
- //# sourceMappingURL=chunk-R7CJEIA5.cjs.map
808
+ //# sourceMappingURL=chunk-LYTIQQQ2.cjs.map
809
+ //# sourceMappingURL=chunk-LYTIQQQ2.cjs.map