@arbidocs/blocks 0.5.55 → 0.5.57

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 (162) hide show
  1. package/dist/{ConnectedCallDock-SPG5XOPH.cjs → ConnectedCallDock-PXETJN7A.cjs} +8 -8
  2. package/dist/{ConnectedCallDock-SPG5XOPH.cjs.map → ConnectedCallDock-PXETJN7A.cjs.map} +1 -1
  3. package/dist/{ConnectedCallDock-7SQ5MX6C.js → ConnectedCallDock-Q52GHY6G.js} +7 -7
  4. package/dist/{ConnectedCallDock-7SQ5MX6C.js.map → ConnectedCallDock-Q52GHY6G.js.map} +1 -1
  5. package/dist/{ConnectedCallRoom-K6QLTTZM.js → ConnectedCallRoom-TUTRI4Y2.js} +7 -7
  6. package/dist/{ConnectedCallRoom-K6QLTTZM.js.map → ConnectedCallRoom-TUTRI4Y2.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-GFZLXFRF.cjs → ConnectedCallRoom-XCD5R4ES.cjs} +8 -8
  8. package/dist/{ConnectedCallRoom-GFZLXFRF.cjs.map → ConnectedCallRoom-XCD5R4ES.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-FRWPDSCF.cjs → ConnectedNativeDocxComparison-5PZ6WSQZ.cjs} +17 -17
  10. package/dist/{ConnectedNativeDocxComparison-FRWPDSCF.cjs.map → ConnectedNativeDocxComparison-5PZ6WSQZ.cjs.map} +1 -1
  11. package/dist/{ConnectedStreamedWordArtifact-RBYGJJRG.js → ConnectedNativeDocxComparison-XDXJY7BE.js} +16 -16
  12. package/dist/{ConnectedNativeDocxComparison-KF66UDAF.js.map → ConnectedNativeDocxComparison-XDXJY7BE.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-56H656VV.js → ConnectedNativeDocxEditor-LCG54CN6.js} +14 -14
  14. package/dist/{ConnectedNativeDocxEditor-56H656VV.js.map → ConnectedNativeDocxEditor-LCG54CN6.js.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-SFBUJLCE.cjs → ConnectedNativeDocxEditor-QPIT6V7X.cjs} +16 -16
  16. package/dist/{ConnectedNativeDocxEditor-SFBUJLCE.cjs.map → ConnectedNativeDocxEditor-QPIT6V7X.cjs.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-SC5P4I6K.cjs → ConnectedStreamedWordArtifact-27HU7JG2.cjs} +17 -17
  18. package/dist/ConnectedStreamedWordArtifact-27HU7JG2.cjs.map +1 -0
  19. package/dist/{ConnectedNativeDocxComparison-KF66UDAF.js → ConnectedStreamedWordArtifact-DJ2S2U5U.js} +16 -16
  20. package/dist/ConnectedStreamedWordArtifact-DJ2S2U5U.js.map +1 -0
  21. package/dist/{DocumentReviewCard-YMBLUCOJ.js → DocumentReviewCard-IOM476M4.js} +9 -9
  22. package/dist/{DocumentReviewCard-YMBLUCOJ.js.map → DocumentReviewCard-IOM476M4.js.map} +1 -1
  23. package/dist/{DocumentReviewCard-ZD76R6VW.cjs → DocumentReviewCard-S3ULXYVN.cjs} +14 -14
  24. package/dist/{DocumentReviewCard-ZD76R6VW.cjs.map → DocumentReviewCard-S3ULXYVN.cjs.map} +1 -1
  25. package/dist/{NativeDocxEditor-HJTKCPX2.js → NativeDocxEditor-D6Z7BXTA.js} +4 -4
  26. package/dist/{NativeDocxEditor-HJTKCPX2.js.map → NativeDocxEditor-D6Z7BXTA.js.map} +1 -1
  27. package/dist/{NativeDocxEditor-TVZ6O6YS.cjs → NativeDocxEditor-HE4PQV5F.cjs} +8 -8
  28. package/dist/{NativeDocxEditor-TVZ6O6YS.cjs.map → NativeDocxEditor-HE4PQV5F.cjs.map} +1 -1
  29. package/dist/{WorkspaceTableView-4DZ4YODA.js → WorkspaceTableView-F4PZMXN5.js} +4 -4
  30. package/dist/{WorkspaceTableView-4DZ4YODA.js.map → WorkspaceTableView-F4PZMXN5.js.map} +1 -1
  31. package/dist/{WorkspaceTableView-XHEVFCRP.cjs → WorkspaceTableView-OUPRGWRJ.cjs} +4 -4
  32. package/dist/{WorkspaceTableView-XHEVFCRP.cjs.map → WorkspaceTableView-OUPRGWRJ.cjs.map} +1 -1
  33. package/dist/agents/index.cjs +340 -340
  34. package/dist/agents/index.js +10 -10
  35. package/dist/calls/index.cjs +3 -3
  36. package/dist/calls/index.js +3 -3
  37. package/dist/chat/index.cjs +81 -81
  38. package/dist/chat/index.js +4 -4
  39. package/dist/{chunk-UF7YJ2N6.js → chunk-32SVMYRM.js} +4 -4
  40. package/dist/{chunk-UF7YJ2N6.js.map → chunk-32SVMYRM.js.map} +1 -1
  41. package/dist/{chunk-VFSHI7IX.js → chunk-5TFI4YW2.js} +3 -3
  42. package/dist/{chunk-VFSHI7IX.js.map → chunk-5TFI4YW2.js.map} +1 -1
  43. package/dist/{chunk-VM6UCMII.cjs → chunk-77U3DP44.cjs} +5 -5
  44. package/dist/{chunk-VM6UCMII.cjs.map → chunk-77U3DP44.cjs.map} +1 -1
  45. package/dist/{chunk-K7ZDC5A2.js → chunk-B2GL46SB.js} +3 -3
  46. package/dist/{chunk-K7ZDC5A2.js.map → chunk-B2GL46SB.js.map} +1 -1
  47. package/dist/chunk-BJT4TWWX.cjs +18 -0
  48. package/dist/{chunk-MVMQWERS.cjs.map → chunk-BJT4TWWX.cjs.map} +1 -1
  49. package/dist/{chunk-YTB6DLAD.cjs → chunk-BRYHW3OL.cjs} +4 -4
  50. package/dist/{chunk-YTB6DLAD.cjs.map → chunk-BRYHW3OL.cjs.map} +1 -1
  51. package/dist/{chunk-PSRMPGQU.js → chunk-C2J6FBLB.js} +3 -3
  52. package/dist/{chunk-PSRMPGQU.js.map → chunk-C2J6FBLB.js.map} +1 -1
  53. package/dist/{chunk-QXOB5BV3.cjs → chunk-CPQRQEJL.cjs} +3 -3
  54. package/dist/{chunk-QXOB5BV3.cjs.map → chunk-CPQRQEJL.cjs.map} +1 -1
  55. package/dist/{chunk-YXDHJC4P.js → chunk-DK4NN46N.js} +3 -3
  56. package/dist/{chunk-YXDHJC4P.js.map → chunk-DK4NN46N.js.map} +1 -1
  57. package/dist/{chunk-GPQDC2DG.js → chunk-FKWQAXG6.js} +4 -4
  58. package/dist/{chunk-GPQDC2DG.js.map → chunk-FKWQAXG6.js.map} +1 -1
  59. package/dist/{chunk-MLR3FOS7.js → chunk-GRMMUVQG.js} +4 -4
  60. package/dist/{chunk-MLR3FOS7.js.map → chunk-GRMMUVQG.js.map} +1 -1
  61. package/dist/{chunk-Y4B4BJGA.cjs → chunk-I3ITXJRO.cjs} +21 -21
  62. package/dist/{chunk-Y4B4BJGA.cjs.map → chunk-I3ITXJRO.cjs.map} +1 -1
  63. package/dist/{chunk-WM4JKQTL.cjs → chunk-I6CGE7RZ.cjs} +10 -10
  64. package/dist/{chunk-WM4JKQTL.cjs.map → chunk-I6CGE7RZ.cjs.map} +1 -1
  65. package/dist/{chunk-RXOEQQLW.js → chunk-JIXJR6L2.js} +4 -4
  66. package/dist/{chunk-RXOEQQLW.js.map → chunk-JIXJR6L2.js.map} +1 -1
  67. package/dist/{chunk-K4ZKREVK.js → chunk-JV2CJGHV.js} +3 -3
  68. package/dist/{chunk-K4ZKREVK.js.map → chunk-JV2CJGHV.js.map} +1 -1
  69. package/dist/{chunk-IVGOB4RW.cjs → chunk-KD6ECCAN.cjs} +3 -3
  70. package/dist/{chunk-IVGOB4RW.cjs.map → chunk-KD6ECCAN.cjs.map} +1 -1
  71. package/dist/chunk-KHUWQL2Q.cjs +18 -0
  72. package/dist/{chunk-NOQ3NSBD.cjs.map → chunk-KHUWQL2Q.cjs.map} +1 -1
  73. package/dist/{chunk-N4ARBAL6.cjs → chunk-KO3CME7Z.cjs} +9 -9
  74. package/dist/{chunk-N4ARBAL6.cjs.map → chunk-KO3CME7Z.cjs.map} +1 -1
  75. package/dist/{chunk-75Z5AUMM.js → chunk-KTC6OVQD.js} +3 -3
  76. package/dist/{chunk-75Z5AUMM.js.map → chunk-KTC6OVQD.js.map} +1 -1
  77. package/dist/{chunk-L7KXNEBC.cjs → chunk-L6KTANY2.cjs} +37 -37
  78. package/dist/{chunk-L7KXNEBC.cjs.map → chunk-L6KTANY2.cjs.map} +1 -1
  79. package/dist/{chunk-4NI6CVBC.cjs → chunk-L7ROIPS7.cjs} +27 -27
  80. package/dist/{chunk-4NI6CVBC.cjs.map → chunk-L7ROIPS7.cjs.map} +1 -1
  81. package/dist/{chunk-R42KJSBH.js → chunk-M24OG3RP.js} +6 -6
  82. package/dist/{chunk-R42KJSBH.js.map → chunk-M24OG3RP.js.map} +1 -1
  83. package/dist/{chunk-BTTUZZN3.js → chunk-NIA4H7QN.js} +3 -3
  84. package/dist/{chunk-BTTUZZN3.js.map → chunk-NIA4H7QN.js.map} +1 -1
  85. package/dist/{chunk-YQYA2XP3.cjs → chunk-NT2PELCF.cjs} +18 -18
  86. package/dist/{chunk-YQYA2XP3.cjs.map → chunk-NT2PELCF.cjs.map} +1 -1
  87. package/dist/{chunk-AEXFUPO7.js → chunk-ORFP3QJQ.js} +3 -3
  88. package/dist/{chunk-AEXFUPO7.js.map → chunk-ORFP3QJQ.js.map} +1 -1
  89. package/dist/{chunk-J25HZUGJ.js → chunk-PJJZEDR3.js} +3 -3
  90. package/dist/{chunk-J25HZUGJ.js.map → chunk-PJJZEDR3.js.map} +1 -1
  91. package/dist/{chunk-DV725PNE.cjs → chunk-Q6N56ZBF.cjs} +10 -10
  92. package/dist/{chunk-DV725PNE.cjs.map → chunk-Q6N56ZBF.cjs.map} +1 -1
  93. package/dist/{chunk-YTLDM4S5.js → chunk-QE7VE7HV.js} +9 -9
  94. package/dist/{chunk-YTLDM4S5.js.map → chunk-QE7VE7HV.js.map} +1 -1
  95. package/dist/{chunk-C5Y5AQ5B.js → chunk-QWVZTX2P.js} +3 -3
  96. package/dist/{chunk-C5Y5AQ5B.js.map → chunk-QWVZTX2P.js.map} +1 -1
  97. package/dist/{chunk-UIKLUVKV.js → chunk-RAK4EBNU.js} +3 -3
  98. package/dist/{chunk-UIKLUVKV.js.map → chunk-RAK4EBNU.js.map} +1 -1
  99. package/dist/{chunk-TTSSW6CH.js → chunk-RK2T6RFL.js} +3 -3
  100. package/dist/{chunk-TTSSW6CH.js.map → chunk-RK2T6RFL.js.map} +1 -1
  101. package/dist/{chunk-LMD5WNZB.js → chunk-RLTTVBCT.js} +6 -6
  102. package/dist/{chunk-LMD5WNZB.js.map → chunk-RLTTVBCT.js.map} +1 -1
  103. package/dist/{chunk-JBQ4NYDD.cjs → chunk-RZUZBHIH.cjs} +3 -3
  104. package/dist/{chunk-JBQ4NYDD.cjs.map → chunk-RZUZBHIH.cjs.map} +1 -1
  105. package/dist/{chunk-43KLNPR5.cjs → chunk-SRD5YJJI.cjs} +3 -3
  106. package/dist/{chunk-43KLNPR5.cjs.map → chunk-SRD5YJJI.cjs.map} +1 -1
  107. package/dist/{chunk-2XOTUCZ5.js → chunk-TM6YSWH5.js} +3 -3
  108. package/dist/{chunk-2XOTUCZ5.js.map → chunk-TM6YSWH5.js.map} +1 -1
  109. package/dist/{chunk-RXREIA7W.cjs → chunk-TX3JM4EI.cjs} +11 -11
  110. package/dist/{chunk-RXREIA7W.cjs.map → chunk-TX3JM4EI.cjs.map} +1 -1
  111. package/dist/{chunk-YD3RN2FY.cjs → chunk-UZCHVJ6L.cjs} +3 -3
  112. package/dist/{chunk-YD3RN2FY.cjs.map → chunk-UZCHVJ6L.cjs.map} +1 -1
  113. package/dist/{chunk-IEMN3P5Q.cjs → chunk-VY3JLGRZ.cjs} +7 -7
  114. package/dist/{chunk-IEMN3P5Q.cjs.map → chunk-VY3JLGRZ.cjs.map} +1 -1
  115. package/dist/{chunk-H7FV7YSG.js → chunk-WDJRMPRI.js} +3 -3
  116. package/dist/{chunk-H7FV7YSG.js.map → chunk-WDJRMPRI.js.map} +1 -1
  117. package/dist/{chunk-GKHIRR5A.cjs → chunk-WDR6FO22.cjs} +5 -5
  118. package/dist/{chunk-GKHIRR5A.cjs.map → chunk-WDR6FO22.cjs.map} +1 -1
  119. package/dist/{chunk-WVRAMYDQ.js → chunk-X5QOPSXT.js} +3 -3
  120. package/dist/{chunk-WVRAMYDQ.js.map → chunk-X5QOPSXT.js.map} +1 -1
  121. package/dist/{chunk-4ASLRHJC.cjs → chunk-XZVAKOE2.cjs} +4 -4
  122. package/dist/{chunk-4ASLRHJC.cjs.map → chunk-XZVAKOE2.cjs.map} +1 -1
  123. package/dist/{chunk-EP4K4YQG.cjs → chunk-YMZAHBFL.cjs} +6 -6
  124. package/dist/{chunk-EP4K4YQG.cjs.map → chunk-YMZAHBFL.cjs.map} +1 -1
  125. package/dist/{chunk-KYNWO6EC.js → chunk-YS7MLS4U.js} +4 -4
  126. package/dist/{chunk-KYNWO6EC.js.map → chunk-YS7MLS4U.js.map} +1 -1
  127. package/dist/{chunk-PICGTGEB.cjs → chunk-Z6DNYFVM.cjs} +3 -3
  128. package/dist/{chunk-PICGTGEB.cjs.map → chunk-Z6DNYFVM.cjs.map} +1 -1
  129. package/dist/{chunk-XTRV2JHZ.cjs → chunk-ZDX7X7R5.cjs} +35 -35
  130. package/dist/{chunk-XTRV2JHZ.cjs.map → chunk-ZDX7X7R5.cjs.map} +1 -1
  131. package/dist/connect/docx.cjs +20 -20
  132. package/dist/connect/docx.js +16 -16
  133. package/dist/connect/index.cjs +663 -663
  134. package/dist/connect/index.js +40 -40
  135. package/dist/connect/viewer.cjs +60 -60
  136. package/dist/connect/viewer.js +13 -13
  137. package/dist/docx/index.cjs +51 -51
  138. package/dist/docx/index.js +4 -4
  139. package/dist/facts/index.cjs +57 -57
  140. package/dist/facts/index.js +5 -5
  141. package/dist/files/index.cjs +236 -236
  142. package/dist/files/index.js +4 -4
  143. package/dist/home/index.cjs +29 -29
  144. package/dist/home/index.js +4 -4
  145. package/dist/index.cjs +658 -658
  146. package/dist/index.js +18 -18
  147. package/dist/settings/index.cjs +2 -2
  148. package/dist/settings/index.js +2 -2
  149. package/dist/shell/index.cjs +1 -1
  150. package/dist/shell/index.js +1 -1
  151. package/dist/site/index.cjs +21 -21
  152. package/dist/site/index.js +1 -1
  153. package/dist/studio/index.cjs +6 -6
  154. package/dist/studio/index.js +5 -5
  155. package/dist/workflow-canvas/index.cjs +41 -41
  156. package/dist/workflow-canvas/index.js +16 -16
  157. package/node_modules/@arbidocs/coedit/package.json +1 -1
  158. package/package.json +5 -5
  159. package/dist/ConnectedStreamedWordArtifact-RBYGJJRG.js.map +0 -1
  160. package/dist/ConnectedStreamedWordArtifact-SC5P4I6K.cjs.map +0 -1
  161. package/dist/chunk-MVMQWERS.cjs +0 -18
  162. package/dist/chunk-NOQ3NSBD.cjs +0 -18
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkXTRV2JHZ_cjs = require('./chunk-XTRV2JHZ.cjs');
5
- var chunkDV725PNE_cjs = require('./chunk-DV725PNE.cjs');
6
- var chunkY4B4BJGA_cjs = require('./chunk-Y4B4BJGA.cjs');
7
- var chunkRXREIA7W_cjs = require('./chunk-RXREIA7W.cjs');
4
+ var chunkZDX7X7R5_cjs = require('./chunk-ZDX7X7R5.cjs');
5
+ var chunkQ6N56ZBF_cjs = require('./chunk-Q6N56ZBF.cjs');
8
6
  var chunkQUMUAJ2P_cjs = require('./chunk-QUMUAJ2P.cjs');
7
+ var chunkI3ITXJRO_cjs = require('./chunk-I3ITXJRO.cjs');
8
+ var chunkTX3JM4EI_cjs = require('./chunk-TX3JM4EI.cjs');
9
9
  var chunkN7RRXCEZ_cjs = require('./chunk-N7RRXCEZ.cjs');
10
10
  var chunkSMQIYEOL_cjs = require('./chunk-SMQIYEOL.cjs');
11
11
  var chunkUFEXJIEY_cjs = require('./chunk-UFEXJIEY.cjs');
@@ -22,25 +22,25 @@ function useSkillsEnabled() {
22
22
  }
23
23
  function useWorkflowDefinitions() {
24
24
  const { data: listings } = react.useSkills();
25
- const usage = chunkY4B4BJGA_cjs.useWorkflowUsage();
25
+ const usage = chunkI3ITXJRO_cjs.useWorkflowUsage();
26
26
  const skillsEnabled = useSkillsEnabled();
27
27
  return react$1.useMemo(() => {
28
28
  const { host: builtins, skills: fromServer } = chunkSMQIYEOL_cjs.mergeSkillWorkflows(
29
- chunkY4B4BJGA_cjs.WEB_WORKFLOWS,
29
+ chunkI3ITXJRO_cjs.WEB_WORKFLOWS,
30
30
  listings ?? []
31
31
  );
32
32
  const all = [...builtins, ...fromServer];
33
33
  const byId = new Map(all.map((w) => [w.id, w]));
34
- const pinned = chunkY4B4BJGA_cjs.DASHBOARD_PINNED.flatMap((id) => {
34
+ const pinned = chunkI3ITXJRO_cjs.DASHBOARD_PINNED.flatMap((id) => {
35
35
  const w = byId.get(id);
36
36
  return w ? [w] : [];
37
37
  });
38
38
  return {
39
39
  skills: all,
40
40
  skillsEnabled,
41
- start: skillsEnabled ? [...builtins, ...chunkY4B4BJGA_cjs.sortByRecentUse(fromServer, usage)] : [],
42
- dashboard: [...pinned, ...chunkY4B4BJGA_cjs.DASHBOARD_OPERATIONS],
43
- forTasks: [chunkY4B4BJGA_cjs.CUSTOM_TASK, ...all.filter((w) => w.schedulable), chunkY4B4BJGA_cjs.REMIND_TASK]
41
+ start: skillsEnabled ? [...builtins, ...chunkI3ITXJRO_cjs.sortByRecentUse(fromServer, usage)] : [],
42
+ dashboard: [...pinned, ...chunkI3ITXJRO_cjs.DASHBOARD_OPERATIONS],
43
+ forTasks: [chunkI3ITXJRO_cjs.CUSTOM_TASK, ...all.filter((w) => w.schedulable), chunkI3ITXJRO_cjs.REMIND_TASK]
44
44
  };
45
45
  }, [listings, usage, skillsEnabled]);
46
46
  }
@@ -68,7 +68,7 @@ function useWorkflowTasks() {
68
68
  );
69
69
  const create = react$1.useCallback(
70
70
  async (ctx, forceWorkflow = false) => {
71
- const request = chunkY4B4BJGA_cjs.taskComposerToCreateRequest(
71
+ const request = chunkI3ITXJRO_cjs.taskComposerToCreateRequest(
72
72
  { ...ctx, documentTitles, plan: ctx.plan ?? null },
73
73
  activeWorkspaceId ?? void 0,
74
74
  forceWorkflow
@@ -110,7 +110,7 @@ function useWorkflowTasks() {
110
110
  );
111
111
  const update = react$1.useCallback(
112
112
  async (task, ctx) => {
113
- const patch = chunkY4B4BJGA_cjs.taskComposerToUpdateRequest({ ...ctx, plan: ctx.plan ?? null });
113
+ const patch = chunkI3ITXJRO_cjs.taskComposerToUpdateRequest({ ...ctx, plan: ctx.plan ?? null });
114
114
  if (task.is_owner === false) delete patch.shared;
115
115
  await updateConversation.mutateAsync({ conversationId: task.external_id, patch });
116
116
  },
@@ -118,7 +118,7 @@ function useWorkflowTasks() {
118
118
  );
119
119
  const updateWorkflow = react$1.useCallback(
120
120
  async (workflow, ctx) => {
121
- const patch = chunkY4B4BJGA_cjs.composerToWorkflowUpdate({ ...ctx, documentTitles, plan: ctx.plan ?? null });
121
+ const patch = chunkI3ITXJRO_cjs.composerToWorkflowUpdate({ ...ctx, documentTitles, plan: ctx.plan ?? null });
122
122
  if (workflow.is_owner === false) delete patch.shared;
123
123
  const workspaceId = workflow.workspace_ext_id ?? activeWorkspaceId;
124
124
  const updated = await updateWorkflowMutation.mutateAsync({
@@ -167,7 +167,7 @@ function ConnectedTaskComposer({
167
167
  initialParentTaskExtId
168
168
  }) {
169
169
  const { notify, openConversation, openUpload } = chunk6K3VOHHL_cjs.useBlocksEnvironment();
170
- const openWorkflow = chunkDV725PNE_cjs.useOpenWorkflow();
170
+ const openWorkflow = chunkQ6N56ZBF_cjs.useOpenWorkflow();
171
171
  const automationsEnabled = openWorkflow !== void 0;
172
172
  const startLater = startLaterProp && automationsEnabled;
173
173
  const isWorkflow = kind === "workflow";
@@ -233,7 +233,7 @@ function ConnectedTaskComposer({
233
233
  const { tasks: allTasks } = react.useWorkItems();
234
234
  const { data: documents = [] } = react.useDocuments();
235
235
  const { create, update, updateWorkflow, isPending } = useWorkflowTasks();
236
- const scopeSource = chunkDV725PNE_cjs.useConnectedWorkflowScopeSource();
236
+ const scopeSource = chunkQ6N56ZBF_cjs.useConnectedWorkflowScopeSource();
237
237
  const activeWorkspaceId = react.useArbiSessionState((s) => s.workspaceId);
238
238
  const activeWorkspace = react$1.useMemo(
239
239
  () => workspaces.find((w) => w.external_id === activeWorkspaceId) ?? null,
@@ -250,7 +250,7 @@ function ConnectedTaskComposer({
250
250
  const label = (t) => t.title?.trim() || "Untitled task";
251
251
  if (isWorkflow) return allTasks.map((t) => ({ id: t.external_id, name: label(t) }));
252
252
  const subject = task ?? { external_id: "__new__" };
253
- return chunkY4B4BJGA_cjs.moveTargets(
253
+ return chunkI3ITXJRO_cjs.moveTargets(
254
254
  [...allTasks.filter((t) => t.external_id !== subject.external_id), subject],
255
255
  subject
256
256
  ).map((t) => ({ id: t.external_id, name: label(t) }));
@@ -265,33 +265,33 @@ function ConnectedTaskComposer({
265
265
  );
266
266
  const initialValues = react$1.useMemo(() => {
267
267
  const ids = {
268
- customWorkflowId: chunkY4B4BJGA_cjs.CUSTOM_TASK_ID,
269
- reminderWorkflowId: chunkY4B4BJGA_cjs.REMIND_TASK_ID,
268
+ customWorkflowId: chunkI3ITXJRO_cjs.CUSTOM_TASK_ID,
269
+ reminderWorkflowId: chunkI3ITXJRO_cjs.REMIND_TASK_ID,
270
270
  definitions: forTasks
271
271
  };
272
272
  const base = launchWorkflow ? {
273
- ...chunkY4B4BJGA_cjs.workflowToComposerValues(launchWorkflow, ids),
273
+ ...chunkI3ITXJRO_cjs.workflowToComposerValues(launchWorkflow, ids),
274
274
  when: "once",
275
275
  runAt: "",
276
276
  rrule: "",
277
277
  eventKind: "",
278
278
  afterTaskId: "",
279
279
  name: ""
280
- } : editingWorkflow ? chunkY4B4BJGA_cjs.workflowToComposerValues(editingWorkflow, ids) : task ? chunkY4B4BJGA_cjs.taskToComposerValues(task, ids) : isWorkflow ? {
280
+ } : editingWorkflow ? chunkI3ITXJRO_cjs.workflowToComposerValues(editingWorkflow, ids) : task ? chunkI3ITXJRO_cjs.taskToComposerValues(task, ids) : isWorkflow ? {
281
281
  // Run now is the default start; scheduling is the fallback in the same field.
282
282
  assignee: "agent",
283
- workflowId: initialWorkflowId ?? chunkY4B4BJGA_cjs.CUSTOM_TASK_ID,
283
+ workflowId: initialWorkflowId ?? chunkI3ITXJRO_cjs.CUSTOM_TASK_ID,
284
284
  when: startLater ? "once" : "now",
285
285
  ...initialPrompt ? {
286
286
  inputs: {
287
- [initialWorkflowId === chunkY4B4BJGA_cjs.REMIND_TASK_ID ? "message" : "instruction"]: initialPrompt
287
+ [initialWorkflowId === chunkI3ITXJRO_cjs.REMIND_TASK_ID ? "message" : "instruction"]: initialPrompt
288
288
  }
289
289
  } : {},
290
290
  // A scheduled run needs an agent: the owner's Assistant unless another is picked.
291
291
  ...startLater && defaultAgentId ? { agentId: defaultAgentId } : {}
292
292
  } : initialAgentExtId ? (
293
293
  // Assigning an agent means agentic work: the free instruction, and tell me when done.
294
- { agentId: initialAgentExtId, workflowId: chunkY4B4BJGA_cjs.CUSTOM_TASK_ID, notifyOnComplete: true }
294
+ { agentId: initialAgentExtId, workflowId: chunkI3ITXJRO_cjs.CUSTOM_TASK_ID, notifyOnComplete: true }
295
295
  ) : {};
296
296
  return {
297
297
  timezone: chunkQUMUAJ2P_cjs.detectTimeZone(),
@@ -352,7 +352,7 @@ function ConnectedTaskComposer({
352
352
  const ctx = {
353
353
  workflow: chosen,
354
354
  values: submitted,
355
- plan: chosen.id === chunkY4B4BJGA_cjs.CUSTOM_TASK_ID ? plan : null
355
+ plan: chosen.id === chunkI3ITXJRO_cjs.CUSTOM_TASK_ID ? plan : null
356
356
  };
357
357
  try {
358
358
  if (isWorkflow && editingWorkflow && !options?.runOnce) {
@@ -388,7 +388,7 @@ function ConnectedTaskComposer({
388
388
  }
389
389
  };
390
390
  return /* @__PURE__ */ jsxRuntime.jsx(
391
- chunkY4B4BJGA_cjs.TaskComposer,
391
+ chunkI3ITXJRO_cjs.TaskComposer,
392
392
  {
393
393
  open,
394
394
  onOpenChange,
@@ -402,15 +402,15 @@ function ConnectedTaskComposer({
402
402
  tasks: taskOptions,
403
403
  initialValues,
404
404
  timezones,
405
- eventOptions: chunkY4B4BJGA_cjs.AUTOMATION_EVENTS,
405
+ eventOptions: chunkI3ITXJRO_cjs.AUTOMATION_EVENTS,
406
406
  eventWorkflowOptions: workspaceAutomations.filter((item) => item.external_id !== editingWorkflow?.external_id).map((item) => ({ id: item.external_id, label: item.name })),
407
407
  isPending,
408
408
  planDrafting: planWork.isPending,
409
409
  hasPlan: plan !== null,
410
- renderIcon: chunkY4B4BJGA_cjs.renderWorkflowIcon,
410
+ renderIcon: chunkI3ITXJRO_cjs.renderWorkflowIcon,
411
411
  scopeSource,
412
412
  renderDocuments: (field, value, onChange) => /* @__PURE__ */ jsxRuntime.jsx(
413
- chunkDV725PNE_cjs.ConnectedWorkflowDocumentsField,
413
+ chunkQ6N56ZBF_cjs.ConnectedWorkflowDocumentsField,
414
414
  {
415
415
  field,
416
416
  value,
@@ -441,8 +441,8 @@ function ConnectedTaskComposer({
441
441
  ...plan ? { addAndStart: "Approve plan and start", addAndSchedule: "Approve plan and schedule" } : {}
442
442
  },
443
443
  onSubmit: submit,
444
- goal: (values) => values.workflowId === chunkY4B4BJGA_cjs.CUSTOM_TASK_ID ? /* @__PURE__ */ jsxRuntime.jsx(
445
- chunkY4B4BJGA_cjs.TaskPlan,
444
+ goal: (values) => values.workflowId === chunkI3ITXJRO_cjs.CUSTOM_TASK_ID ? /* @__PURE__ */ jsxRuntime.jsx(
445
+ chunkI3ITXJRO_cjs.TaskPlan,
446
446
  {
447
447
  plan,
448
448
  onChange: setPlan,
@@ -488,7 +488,7 @@ function ConnectedWorkflowHistory({
488
488
  const { openConversation } = chunk6K3VOHHL_cjs.useBlocksEnvironment();
489
489
  const { data: runs = [], isLoading } = react.useWorkflowRuns(workflow?.external_id);
490
490
  return /* @__PURE__ */ jsxRuntime.jsx(
491
- chunkY4B4BJGA_cjs.TaskRunsDialog,
491
+ chunkI3ITXJRO_cjs.TaskRunsDialog,
492
492
  {
493
493
  inline,
494
494
  hideHeader,
@@ -524,14 +524,14 @@ function ConnectedTaskActivityDialog({
524
524
  const activity = react.useConversationActivity(conversationId, { live });
525
525
  const { data: agents = [] } = react.useAgents();
526
526
  const { userId } = chunkN7RRXCEZ_cjs.useConnectedWorkspace();
527
- const { members } = chunkDV725PNE_cjs.useConnectedWorkspaceRole();
527
+ const { members } = chunkQ6N56ZBF_cjs.useConnectedWorkspaceRole();
528
528
  const renderPerson = react$1.useCallback(
529
529
  (id) => {
530
530
  const isMe = !!id && id === userId;
531
531
  const member = members.find((m) => m.user.external_id === id)?.user;
532
532
  const name = member && [member.given_name, member.family_name].filter(Boolean).join(" ") || member?.email;
533
533
  const person = { id, label: isMe ? "You" : name || "Someone", isMe };
534
- return renderTaskPerson ? renderTaskPerson(person) : /* @__PURE__ */ jsxRuntime.jsx(chunkRXREIA7W_cjs.PersonPill, { person });
534
+ return renderTaskPerson ? renderTaskPerson(person) : /* @__PURE__ */ jsxRuntime.jsx(chunkTX3JM4EI_cjs.PersonPill, { person });
535
535
  },
536
536
  [renderTaskPerson, userId, members]
537
537
  );
@@ -540,7 +540,7 @@ function ConnectedTaskActivityDialog({
540
540
  [agents]
541
541
  );
542
542
  return /* @__PURE__ */ jsxRuntime.jsx(
543
- chunkY4B4BJGA_cjs.TaskActivityDialog,
543
+ chunkI3ITXJRO_cjs.TaskActivityDialog,
544
544
  {
545
545
  open: true,
546
546
  onOpenChange: (open) => !open && onClose(),
@@ -577,7 +577,7 @@ function useRenderTaskPerson() {
577
577
  return react$1.useCallback(
578
578
  (person) => {
579
579
  const user = person.id ? byId.get(person.id) : void 0;
580
- return user ? /* @__PURE__ */ jsxRuntime.jsx(chunkXTRV2JHZ_cjs.DocumentUser, { user, variant: "pill" }) : /* @__PURE__ */ jsxRuntime.jsx(chunkRXREIA7W_cjs.PersonPill, { person });
580
+ return user ? /* @__PURE__ */ jsxRuntime.jsx(chunkZDX7X7R5_cjs.DocumentUser, { user, variant: "pill" }) : /* @__PURE__ */ jsxRuntime.jsx(chunkTX3JM4EI_cjs.PersonPill, { person });
581
581
  },
582
582
  [byId]
583
583
  );
@@ -642,5 +642,5 @@ exports.useWorkflowDefinitions = useWorkflowDefinitions;
642
642
  exports.useWorkflowTasks = useWorkflowTasks;
643
643
  exports.useWorkflowsPageState = useWorkflowsPageState;
644
644
  exports.workflowRunView = workflowRunView;
645
- //# sourceMappingURL=chunk-L7KXNEBC.cjs.map
646
- //# sourceMappingURL=chunk-L7KXNEBC.cjs.map
645
+ //# sourceMappingURL=chunk-L6KTANY2.cjs.map
646
+ //# sourceMappingURL=chunk-L6KTANY2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/workflows/useSkillsEnabled.ts","../src/connection/workflows/useWorkflowDefinitions.ts","../src/connection/workflows/useWorkflowTasks.ts","../src/connection/tasks/ConnectedTaskComposer.tsx","../src/connection/ConnectedWorkflowHistory.tsx","../src/connection/tasks/useTaskPeople.tsx","../src/connection/workflows/useWorkflowsPageState.ts"],"names":["useUserSettings","useSkills","useWorkflowUsage","useMemo","mergeSkillWorkflows","WEB_WORKFLOWS","DASHBOARD_PINNED","sortByRecentUse","DASHBOARD_OPERATIONS","CUSTOM_TASK","REMIND_TASK","useCreateWork","useRunWorkflow","useStartTaskQuery","useCreateWorkflow","useUpdateConversation","useUpdateWorkflow","useArbiSessionState","useBlocksEnvironment","useGrantAgentAccess","useCallback","useDocuments","getDocumentTitle","taskComposerToCreateRequest","taskComposerToUpdateRequest","composerToWorkflowUpdate","useAgentWorkspaces","jsxs","jsx","useOpenWorkflow","useTags","useWorkflows","useAgents","useWorkspaces","usePlanWork","useWorkItems","useConnectedWorkflowScopeSource","listTimeZones","moveTargets","CUSTOM_TASK_ID","REMIND_TASK_ID","workflowToComposerValues","taskToComposerValues","detectTimeZone","useState","useEffect","ArbiApiError","TaskComposer","AUTOMATION_EVENTS","renderWorkflowIcon","ConnectedWorkflowDocumentsField","Button","TaskPlan","fmtDate","useWorkflowRuns","TaskRunsDialog","formatRelativeTime","useConversationActivity","useConnectedWorkspace","useConnectedWorkspaceRole","PersonPill","TaskActivityDialog","useWorkspaceUsers","useArbiSession","isAgent","getUserDisplayName","DocumentUser"],"mappings":"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","file":"chunk-L7KXNEBC.cjs","sourcesContent":["/**\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'\n\nexport function useSkillsEnabled(): boolean {\n const { data: userSettings } = useUserSettings()\n return userSettings?.show_skills ?? false\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 { sortByRecentUse, useWorkflowUsage } from '../../agents/workflows/catalogue/workflow-usage'\nimport { WEB_WORKFLOWS } from '../../agents/workflows/catalogue/registry'\n\nexport interface UseWorkflowDefinitionsResult {\n /** Every skill workflow of this host: built-ins plus the user's and the marketplace's (one list). */\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\nexport function useWorkflowDefinitions(): UseWorkflowDefinitionsResult {\n const { data: listings } = useSkills()\n const usage = useWorkflowUsage()\n const skillsEnabled = useSkillsEnabled()\n return useMemo(() => {\n // An uploaded skill of a built-in's slug is used instead of it.\n const { host: builtins, skills: fromServer } = mergeSkillWorkflows(\n WEB_WORKFLOWS,\n listings ?? []\n )\n const all = [...builtins, ...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, ...DASHBOARD_OPERATIONS],\n forTasks: [CUSTOM_TASK, ...all.filter((w) => w.schedulable), REMIND_TASK],\n }\n }, [listings, usage, skillsEnabled])\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 createWork = useCreateWork()\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 { 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","/**\n * Create / edit a task, or create / edit a workflow: the `TaskComposer` block, connected.\n *\n * A task is a conversation with a status. \"Now\" (or a plain to-do) creates it; any other start (at a\n * time, on an event, after another task) saves a workflow that creates it when it fires. Pick the\n * workflow definition (or write your own instruction), fill its form, choose when, and who does it.\n * Everything the backend needs beyond that (authorization tier, name, notification, goal checklist)\n * is derived or folded under \"More options\". The API mapping lives in `useWorkflowTasks`, shared with\n * \"launch as another agent\". With `kind=\"workflow\"` it is the workflow dialog the Workflows page uses.\n */\n\nimport {\n useAgents,\n useAgentWorkspaces,\n useArbiSessionState,\n useDocuments,\n usePlanWork,\n useTags,\n useWorkflows,\n useWorkItems,\n useWorkspaces,\n} from '@arbidocs/react'\nimport type { components } from '@arbidocs/client'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TaskComposer } from '../../agents/tasks/TaskComposer'\nimport { TaskPlan as TaskPlanForm } from '../../agents/tasks/TaskPlan'\nimport type { TaskPlan } from '../../agents/workflows/planSteps'\nimport { moveTargets, type TaskListRow } from '../../agents/tasks/taskRows'\nimport { taskToComposerValues, workflowToComposerValues } from '../../agents/tasks/taskRequest'\nimport { type AgentOption } from '../../agents/workflows/AgentSelect'\nimport { type TaskComposerValues } from '../../agents/tasks/taskComposerTypes'\nimport { ArbiApiError } from '@arbidocs/sdk/browser'\nimport { detectTimeZone, listTimeZones } from '../../calendar/zone'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useOpenWorkflow } from '../workflows/useOpenWorkflow'\n\ntype Task = components['schemas']['ConversationResponse']\ntype Workflow = components['schemas']['WorkflowResponse']\nimport {\n CUSTOM_TASK_ID,\n REMIND_TASK_ID,\n renderWorkflowIcon,\n} from '../../agents/workflows/catalogue/seed'\nimport { useWorkflowDefinitions } from '../workflows/useWorkflowDefinitions'\nimport { useWorkflowTasks } from '../workflows/useWorkflowTasks'\nimport { AUTOMATION_EVENTS } from '../../agents/tasks/taskHelpers'\nimport {\n ConnectedWorkflowDocumentsField,\n useConnectedWorkflowScopeSource,\n} from '../ConnectedWorkflowLauncher'\n\nexport interface ConnectedTaskComposerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** `workflow` is the workflow dialog (new, or `workflow` to edit); the default adds a task. */\n kind?: 'work' | 'workflow'\n /** Save an on-demand recipe instead of running immediately. */\n saveOnly?: boolean\n /** Present -> edit this task; absent -> create. */\n task?: Task | null\n /** `kind=\"workflow\"` only: present -> edit this workflow. */\n workflow?: Workflow | null\n /** Create-mode default assignee (the Agents page's \"Assign task\"). */\n initialAgentExtId?: string\n /** `kind=\"workflow\"` create-mode template: opens with this workflow definition (a skill's) selected. */\n initialWorkflowId?: string\n /** `kind=\"workflow\"` create-mode: open on the Run later view (when, which agent, access). */\n startLater?: boolean\n /** A prompt carried from the quick task launcher into scheduling. */\n initialShared?: boolean\n initialPrompt?: string\n /** A saved recipe copied into a new schedule; the original is not edited. */\n launchWorkflow?: Workflow\n /** Create-mode parent: opens as \"Add sub-task\" under this task. */\n initialParentTaskExtId?: string\n}\n\n/** What \"always allowed\" means: the workspaces the agent will hold standing access to. */\nfunction StandingAccessNote({\n agentId,\n activeWorkspaceName,\n}: {\n agentId: string\n activeWorkspaceName: string | null\n}) {\n const { data: held = [] } = useAgentWorkspaces(agentId, { enabled: agentId !== '' })\n const names = new Set(held.map((w) => w.name))\n if (activeWorkspaceName) names.add(activeWorkspaceName)\n return (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"task-standing-access\">\n {agentId === '' ? 'Your own assistant needs no grant.' : 'It will hold standing access to: '}\n {agentId !== '' && (\n <span className=\"font-medium text-foreground\">\n {[...names].join(', ') || 'no workspace yet'}\n </span>\n )}\n </p>\n )\n}\n\nexport function ConnectedTaskComposer({\n open,\n onOpenChange,\n kind = 'work',\n saveOnly = false,\n task,\n workflow: editingWorkflow,\n initialWorkflowId,\n startLater: startLaterProp,\n initialPrompt,\n initialShared,\n launchWorkflow,\n initialAgentExtId,\n initialParentTaskExtId,\n}: ConnectedTaskComposerProps) {\n const { notify, openConversation, openUpload } = useBlocksEnvironment()\n // Scheduling (\"Run later\") belongs to Workflows: offered while the host has its page.\n const openWorkflow = useOpenWorkflow()\n const automationsEnabled = openWorkflow !== undefined\n const startLater = startLaterProp && automationsEnabled\n const isWorkflow = kind === 'workflow'\n const isEdit = isWorkflow ? !!editingWorkflow : !!task\n const { forTasks: baseSkills, skills } = useWorkflowDefinitions()\n const { data: reviewFields = [] } = useTags()\n const scheduledSkills = useMemo(\n () => [\n ...baseSkills,\n {\n id: '__document_review__',\n title: 'AI Review',\n description: 'Write answers and citations into document fields.',\n documentAction: 'annotate_documents' as const,\n run: { kind: 'operation' as const },\n landing: 'files' as const,\n inputs: [\n { name: 'scope', type: 'scope' as const, label: 'Documents', by: ['labels' as const] },\n {\n name: 'output',\n type: 'select' as const,\n label: 'Review field',\n required: true,\n description:\n 'Choose a field with saved AI instructions. Create one using AI Review in Files.',\n options: reviewFields\n .filter((field) => field.instruction)\n .map((field) => ({ value: field.external_id, label: field.name })),\n },\n {\n name: 'overwrite',\n type: 'boolean' as const,\n label: 'Regenerate existing answers',\n default: false,\n },\n ],\n },\n {\n id: '__document_email__',\n title: 'Email latest documents',\n description: 'Email me links to documents added since the previous successful digest.',\n documentAction: 'email_documents' as const,\n run: { kind: 'operation' as const },\n landing: 'files' as const,\n inputs: [\n { name: 'scope', type: 'scope' as const, label: 'Documents', by: ['labels' as const] },\n {\n name: 'latest',\n type: 'boolean' as const,\n label: 'Only documents added since the last digest',\n default: true,\n },\n ],\n },\n ],\n [baseSkills, reviewFields]\n )\n // A skill opened from the library runs now even if it cannot be scheduled: offer it as a template too.\n const forTasks = useMemo(() => {\n const picked = initialWorkflowId ? skills.find((w) => w.id === initialWorkflowId) : undefined\n return picked &&\n !scheduledSkills.some((w) => w.id === picked.id) &&\n picked.run.kind === 'prompt'\n ? [...scheduledSkills, picked]\n : scheduledSkills\n }, [scheduledSkills, skills, initialWorkflowId])\n const { data: workspaceAutomations = [] } = useWorkflows()\n const { data: agents = [] } = useAgents()\n const { data: workspaces = [] } = useWorkspaces()\n const planWork = usePlanWork()\n const { tasks: allTasks } = useWorkItems()\n const { data: documents = [] } = useDocuments()\n const { create, update, updateWorkflow, isPending } = useWorkflowTasks()\n // The files behind a template's file fields: the same pieces the skill launcher wires.\n const scopeSource = useConnectedWorkflowScopeSource()\n const activeWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const activeWorkspace = useMemo(\n () => workspaces.find((w) => w.external_id === activeWorkspaceId) ?? null,\n [workspaces, activeWorkspaceId]\n )\n const timezones = useMemo(() => listTimeZones(), [])\n // The plan lists documents by id; show their names.\n const documentNames = useMemo(\n () =>\n Object.fromEntries(\n documents.flatMap((d) => (d.file_name ? [[d.external_id, d.file_name]] : []))\n ),\n [documents]\n )\n // Tasks a new task can be part of: any other task that keeps the sub-task tree within its maximum\n // depth and (when editing) is not the task itself or one of its descendants. A workflow can wait on\n // any task, finished ones included (they re-open and finish again).\n const taskOptions = useMemo(() => {\n const label = (t: TaskListRow) => t.title?.trim() || 'Untitled task'\n if (isWorkflow) return allTasks.map((t) => ({ id: t.external_id, name: label(t) }))\n const subject: TaskListRow = task ?? { external_id: '__new__' }\n return moveTargets<TaskListRow>(\n [...allTasks.filter((t) => t.external_id !== subject.external_id), subject],\n subject\n ).map((t) => ({ id: t.external_id, name: label(t) }))\n }, [allTasks, task, isWorkflow])\n // The owner's main agent: what a scheduled workflow runs as unless another is picked.\n const defaultAgentId = useMemo(\n () => (agents.find((a) => a.given_name === 'Assistant') ?? agents[0])?.external_id,\n [agents]\n )\n const agentOptions = useMemo<AgentOption[]>(\n () => agents.map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n\n // What the composer opens with: the edit target, or (create) the preset assignee.\n const initialValues = useMemo(() => {\n const ids = {\n customWorkflowId: CUSTOM_TASK_ID,\n reminderWorkflowId: REMIND_TASK_ID,\n definitions: forTasks,\n }\n const base = launchWorkflow\n ? {\n ...workflowToComposerValues(launchWorkflow, ids),\n when: 'once' as const,\n runAt: '',\n rrule: '',\n eventKind: '',\n afterTaskId: '',\n name: '',\n }\n : editingWorkflow\n ? workflowToComposerValues(editingWorkflow, ids)\n : task\n ? taskToComposerValues(task, ids)\n : isWorkflow\n ? {\n // Run now is the default start; scheduling is the fallback in the same field.\n assignee: 'agent' as const,\n workflowId: initialWorkflowId ?? CUSTOM_TASK_ID,\n when: startLater ? ('once' as const) : ('now' as const),\n ...(initialPrompt\n ? {\n inputs: {\n [initialWorkflowId === REMIND_TASK_ID ? 'message' : 'instruction']:\n initialPrompt,\n },\n }\n : {}),\n // A scheduled run needs an agent: the owner's Assistant unless another is picked.\n ...(startLater && defaultAgentId ? { agentId: defaultAgentId } : {}),\n }\n : initialAgentExtId\n ? // Assigning an agent means agentic work: the free instruction, and tell me when done.\n { agentId: initialAgentExtId, workflowId: CUSTOM_TASK_ID, notifyOnComplete: true }\n : {}\n return {\n timezone: detectTimeZone(),\n ...base,\n ...(initialShared !== undefined && !task && !editingWorkflow\n ? { shared: initialShared }\n : {}),\n ...(!task && !isWorkflow && initialParentTaskExtId\n ? { parentTaskId: initialParentTaskExtId }\n : {}),\n }\n }, [\n forTasks,\n task,\n editingWorkflow,\n isWorkflow,\n initialWorkflowId,\n startLater,\n initialPrompt,\n initialShared,\n launchWorkflow,\n defaultAgentId,\n initialAgentExtId,\n initialParentTaskExtId,\n ])\n\n const [plan, setPlan] = useState<TaskPlan | null>(null)\n useEffect(() => {\n if (open) setPlan(task?.plan ?? editingWorkflow?.plan ?? launchWorkflow?.plan ?? null) // the stored plan when editing agent work\n }, [open, task, editingWorkflow, launchWorkflow])\n\n const handleGeneratePlan = async (values: TaskComposerValues) => {\n if (!activeWorkspace) {\n notify('Open a workspace first — the plan is scoped to it', 'warning')\n return\n }\n const objective = String(values.inputs.instruction ?? '').trim()\n if (!objective) {\n notify('Write the instruction first — it’s the planner’s objective', 'warning')\n return\n }\n try {\n const drafted = await planWork.mutateAsync({\n objective,\n max_passes: plan?.max_passes ?? 3,\n })\n setPlan(drafted)\n notify('Drafted a plan — review the checklist', 'success')\n } catch {\n notify('Could not draft a plan', 'error')\n }\n }\n\n const submit = async (submitted: TaskComposerValues, options?: { runOnce?: boolean }) => {\n // A task for me is a plain to-do and runs no workflow.\n const chosen =\n forTasks.find((w) => w.id === submitted.workflowId) ??\n (submitted.assignee === 'me' ? forTasks[0] : undefined)\n if (!chosen) return\n if (plan && !plan.goal.trim()) {\n notify('The plan needs a goal', 'warning')\n return\n }\n if (plan && plan.criteria.some((c) => !c.text.trim())) {\n notify('Every checklist criterion needs text (or remove it)', 'warning')\n return\n }\n const ctx = {\n workflow: chosen,\n values: submitted,\n plan: chosen.id === CUSTOM_TASK_ID ? plan : null,\n }\n try {\n if (isWorkflow && editingWorkflow && !options?.runOnce) {\n await updateWorkflow(editingWorkflow, ctx)\n notify(`Updated “${editingWorkflow.name}”`, 'success')\n } else if (isEdit && task) {\n await update(task, ctx)\n notify(`Updated “${task.title ?? 'task'}”`, 'success')\n } else {\n const created = await create(ctx, saveOnly && !options?.runOnce)\n if (created.kind === 'workflow') {\n notify(`Saved “${created.workflow.name}”.`, 'success')\n // The saved workflow, on the Workflows page.\n openWorkflow?.()\n } else {\n const name = created.task.title ?? 'task'\n if ((created.ran || options?.runOnce) && created.task.external_id) {\n // The run is a thread: go and watch it, rather than leave a toast to say it started.\n openConversation(created.task.external_id)\n } else {\n notify(\n created.ran === null\n ? `Added “${name}”`\n : 'Task created, but the run could not start',\n created.ran === false ? 'warning' : 'success'\n )\n }\n }\n }\n onOpenChange(false)\n } catch (error) {\n const what = `Failed to ${isEdit ? 'update' : 'create'} the ${isWorkflow ? 'workflow' : 'task'}`\n notify(\n error instanceof Error && error.message.startsWith('Open a workspace')\n ? error.message\n : error instanceof ArbiApiError && error.detail\n ? `${what}: ${error.detail}`\n : what,\n 'error'\n )\n }\n }\n\n return (\n <TaskComposer\n key={editingWorkflow?.external_id ?? task?.external_id ?? 'new'}\n open={open}\n onOpenChange={onOpenChange}\n kind={kind}\n saveOnly={saveOnly}\n hideRunLater={!automationsEnabled}\n defaultAgentId={defaultAgentId}\n isEdit={isEdit}\n workflows={forTasks}\n agents={agentOptions}\n tasks={taskOptions}\n initialValues={initialValues}\n timezones={timezones}\n eventOptions={AUTOMATION_EVENTS}\n eventWorkflowOptions={workspaceAutomations\n .filter((item) => item.external_id !== editingWorkflow?.external_id)\n .map((item) => ({ id: item.external_id, label: item.name }))}\n isPending={isPending}\n planDrafting={planWork.isPending}\n hasPlan={plan !== null}\n renderIcon={renderWorkflowIcon}\n scopeSource={scopeSource}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={openUpload}\n />\n )}\n addFilesAction={\n openUpload && (\n <Button size=\"sm\" onClick={() => openUpload()} data-testid=\"workflow-add-files-first\">\n Add files\n </Button>\n )\n }\n onDropFiles={openUpload && ((files) => openUpload(files))}\n standingAccess={(values) => (\n <StandingAccessNote\n agentId={values.agentId}\n activeWorkspaceName={activeWorkspace?.name ?? null}\n />\n )}\n labels={{\n ...(isWorkflow\n ? {\n titleNewWorkflow: 'New workflow',\n titleEditWorkflow: 'Edit workflow',\n workflowNamePlaceholder: 'Name this workflow',\n createWorkflow: 'Create workflow',\n saveWorkflow: 'Save workflow',\n descriptionWorkflow: 'Choose what happens and when this workflow starts.',\n eventHint: 'Choose the workspace event that starts this workflow.',\n runAsAgentHint: 'Scheduled AI work runs as your chosen assistant when you are away.',\n }\n : {}),\n ...(plan\n ? { addAndStart: 'Approve plan and start', addAndSchedule: 'Approve plan and schedule' }\n : {}),\n }}\n onSubmit={submit}\n goal={(values) =>\n values.workflowId === CUSTOM_TASK_ID ? (\n <TaskPlanForm\n plan={plan}\n onChange={setPlan}\n onGenerate={() => handleGeneratePlan(values)}\n isGenerating={planWork.isPending}\n workspaceName={activeWorkspace?.name ?? null}\n documentNames={documentNames}\n objective={String(values.inputs.instruction ?? '')}\n />\n ) : null\n }\n />\n )\n}\n","/**\n * A saved workflow's history and a task's activity, bound to the connection.\n *\n * - `ConnectedWorkflowHistory`: every run of a workflow (re-read while shown), each with when, what\n * it was (a thread, an email, an AI review, a reminder) and how it went; a run's thread opens\n * through the environment's `openConversation`, a document action's result through the host.\n * - `ConnectedTaskActivityDialog`: a task's timeline (re-read while it runs), with who did what.\n */\n\nimport { useCallback, type ReactNode } from 'react'\nimport { useAgents, useConversationActivity, useWorkflowRuns } from '@arbidocs/react'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport {\n TaskRunsDialog,\n type TaskRunView,\n type TaskRunsDialogLabels,\n} from '../agents/tasks/TaskRunsDialog'\nimport { TaskActivityDialog } from '../agents/tasks/TaskActivityDialog'\nimport type { TaskActivityEvent } from '../agents/tasks/TaskActivityTimeline'\nimport { PersonPill, type TaskPerson } from '../agents/tasks/PersonPill'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedWorkspaceRole } from './ConnectedWorkflowsTable'\n\ntype WorkflowRun = NonNullable<ReturnType<typeof useWorkflowRuns>['data']>[number]\n\n/** What a run was, in a word. */\nconst RUN_KIND: Record<string, string> = {\n email_documents: 'Email',\n annotate_documents: 'AI Review',\n reminder: 'Reminder',\n}\nconst DOCUMENT_ACTIONS = new Set(['email_documents', 'annotate_documents'])\n\n/** A run as the history lists it: when, what, on how many documents. */\nexport function workflowRunView(\n run: WorkflowRun,\n formatDate: (iso: string) => string\n): TaskRunView {\n const documents = DOCUMENT_ACTIONS.has(run.action_type)\n ? ` · ${run.document_ext_ids.length} documents`\n : ''\n return {\n id: `execution-${run.id}`,\n // An AI review that finished has a result to open (its fields over its documents).\n resultId:\n run.action_type === 'annotate_documents' && run.status === 'completed'\n ? String(run.id)\n : undefined,\n status: run.status,\n when: `${formatDate(run.created_at)} · ${RUN_KIND[run.action_type] ?? 'Thread'}${documents}`,\n error: run.error,\n conversationId: run.conversation_ext_id ?? undefined,\n }\n}\n\nexport interface ConnectedWorkflowHistoryProps {\n /** The workflow (`null`: closed). */\n workflow: { external_id: string; name: string } | null\n onOpenChange: (open: boolean) => void\n /** In the page rather than a dialog. */\n inline?: boolean\n hideHeader?: boolean\n formatDate?: (iso: string) => string\n /** Open a document action's result (an AI review's fields): the host's. Absent: no Open. */\n onOpenResult?: (run: WorkflowRun) => void\n /** Under a failed run: e.g. a way to report it. */\n renderErrorReport?: (run: TaskRunView) => ReactNode\n labels?: Partial<TaskRunsDialogLabels>\n}\n\nexport function ConnectedWorkflowHistory({\n workflow,\n onOpenChange,\n inline,\n hideHeader,\n formatDate = fmtDate,\n onOpenResult,\n renderErrorReport,\n labels,\n}: ConnectedWorkflowHistoryProps) {\n const { openConversation } = useBlocksEnvironment()\n const { data: runs = [], isLoading } = useWorkflowRuns(workflow?.external_id)\n return (\n <TaskRunsDialog\n inline={inline}\n hideHeader={hideHeader}\n open={!!workflow}\n onOpenChange={onOpenChange}\n taskName={workflow?.name}\n renderErrorReport={renderErrorReport}\n isLoading={isLoading}\n labels={{\n title: (name) => `History — ${name}`,\n description: 'Executions and results of this workflow.',\n empty: 'This workflow hasn’t run yet.',\n ...labels,\n }}\n runs={runs.map((run) => workflowRunView(run, formatDate))}\n onOpenResult={\n onOpenResult &&\n ((id) => {\n const run = runs.find((r) => String(r.id) === id)\n if (run) onOpenResult(run)\n })\n }\n onOpenRun={(conversationId) => openConversation(conversationId)}\n />\n )\n}\n\n/** Relative time, compact for list rows. */\nconst relativeTime = (iso: string) => formatRelativeTime(iso, { style: 'short' })\n\nexport interface ConnectedTaskActivityDialogProps {\n conversationId: string\n taskName: string\n /** The run is generating right now: the timeline then re-reads itself every few seconds. */\n live?: boolean\n onClose: () => void\n /** How a person shows (the host's own pill). Default: the shared pill with their name. */\n renderPerson?: (person: TaskPerson) => ReactNode\n formatExact?: (iso: string) => string\n}\n\nexport function ConnectedTaskActivityDialog({\n conversationId,\n taskName,\n live,\n onClose,\n renderPerson: renderTaskPerson,\n formatExact = fmtDate,\n}: ConnectedTaskActivityDialogProps) {\n const activity = useConversationActivity(conversationId, { live })\n const { data: agents = [] } = useAgents()\n const { userId } = useConnectedWorkspace()\n const { members } = useConnectedWorkspaceRole()\n const renderPerson = useCallback(\n (id: string | null | undefined) => {\n const isMe = !!id && id === userId\n const member = members.find((m) => m.user.external_id === id)?.user\n const name =\n (member && [member.given_name, member.family_name].filter(Boolean).join(' ')) ||\n member?.email\n const person = { id, label: isMe ? 'You' : name || 'Someone', isMe }\n return renderTaskPerson ? renderTaskPerson(person) : <PersonPill person={person} />\n },\n [renderTaskPerson, userId, members]\n )\n const agentName = useCallback(\n (agentId: string) => agents.find((a) => a.external_id === agentId)?.given_name ?? undefined,\n [agents]\n )\n return (\n <TaskActivityDialog\n open\n onOpenChange={(open) => !open && onClose()}\n taskName={taskName}\n events={activity.data as TaskActivityEvent[] | undefined}\n isLoading={activity.isLoading}\n isError={activity.isError}\n renderPerson={renderPerson}\n agentName={agentName}\n formatRelative={relativeTime}\n formatExact={formatExact}\n />\n )\n}\n","import { useCallback, useMemo, type ReactNode } from 'react'\nimport { useAgents, useArbiSession, useWorkspaceUsers } from '@arbidocs/react'\nimport { getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport { PersonPill, type TaskPerson } from '../../agents/tasks/PersonPill'\nimport { DocumentUser } from '../files/fields/DocumentUser'\n\n/** The workspace roles that can edit it. */\nconst EDITOR_ROLES: readonly string[] = ['owner', 'collaborator']\n\n/**\n * People who can own tasks here: humans (never agents) who can edit the workspace, other than me\n * (the task list shows me as \"Me\"). They name each task's owner.\n */\nexport function useTaskPeople(): { id: string; label: string }[] {\n const { data: members = [] } = useWorkspaceUsers()\n const currentUserExtId = useArbiSession().user?.external_id\n return useMemo(\n () =>\n members\n .filter(\n (m) =>\n !isAgent(m.user) &&\n m.user.external_id !== currentUserExtId &&\n EDITOR_ROLES.includes(m.role)\n )\n .map((m) => ({ id: m.user.external_id, label: getUserDisplayName(m.user) })),\n [members, currentUserExtId]\n )\n}\n\n/**\n * How the Tasks table draws a person: the host's own user pill (presence, a click to message, the\n * rich tooltip) when the person is a member or agent we know, else the plain shared pill.\n */\nexport function useRenderTaskPerson(): (person: TaskPerson) => ReactNode {\n const { data: members = [] } = useWorkspaceUsers()\n const { data: agents = [] } = useAgents()\n const byId = useMemo(() => {\n const map = new Map(members.map((m) => [m.user.external_id, m.user]))\n for (const agent of agents) if (!map.has(agent.external_id)) map.set(agent.external_id, agent)\n return map\n }, [members, agents])\n return useCallback(\n (person: TaskPerson) => {\n const user = person.id ? byId.get(person.id) : undefined\n return user ? <DocumentUser user={user} variant=\"pill\" /> : <PersonPill person={person} />\n },\n [byId]\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useWorkflows, type WorkflowResponse } from '@arbidocs/react'\n\n/** A saved workflow, a new one, or a host catalogue entry opened as a template. */\nexport type WorkflowBuilderSelection =\n { kind: 'saved'; id: string } | { kind: 'new' } | { kind: 'template'; id: string }\n\nexport interface WorkflowsPageStateOptions {\n initialBuilder?: WorkflowBuilderSelection\n /** A host deep link to consume once the saved workflow has loaded. */\n historyWorkflowId?: string | null\n onHistoryWorkflowConsumed?: () => void\n}\n\n/** Shared selection lifecycle for workflow tables, builders and history views. No routing or layout. */\nexport function useWorkflowsPageState({\n initialBuilder,\n historyWorkflowId,\n onHistoryWorkflowConsumed,\n}: WorkflowsPageStateOptions = {}) {\n const { data: workflows = [] } = useWorkflows({ live: true })\n const [builder, setBuilder] = useState<WorkflowBuilderSelection | null>(initialBuilder ?? null)\n const [builderKey, setBuilderKey] = useState(0)\n const [historyIds, setHistoryIds] = useState<string[]>([])\n const [activeHistoryId, setActiveHistoryId] = useState<string | null>(null)\n // Resolve against current query data: renaming/deleting a workflow cannot leave a stale dialog.\n const historyFor = workflows.find((workflow) => workflow.external_id === activeHistoryId) ?? null\n const historyTabs = historyIds.flatMap((id) => {\n const workflow = workflows.find((item) => item.external_id === id)\n return workflow ? [workflow] : []\n })\n\n const openHistory = useCallback((workflow: WorkflowResponse | null) => {\n const id = workflow?.external_id ?? null\n if (id) setHistoryIds((ids) => (ids.includes(id) ? ids : [...ids, id]))\n setActiveHistoryId(id)\n }, [])\n const closeHistoryTab = useCallback((id: string) => {\n setHistoryIds((ids) => ids.filter((item) => item !== id))\n setActiveHistoryId((active) => (active === id ? null : active))\n }, [])\n const openBuilder = useCallback((selection: WorkflowBuilderSelection) => {\n setBuilder(selection)\n // Reopening a template/new/saved selection resets its unsaved canvas; saving does not.\n setBuilderKey((key) => key + 1)\n }, [])\n\n useEffect(() => {\n const workflow = workflows.find((item) => item.external_id === historyWorkflowId)\n if (!workflow) return\n openHistory(workflow)\n onHistoryWorkflowConsumed?.()\n }, [historyWorkflowId, onHistoryWorkflowConsumed, openHistory, workflows])\n\n return {\n workflows,\n builder,\n builderKey,\n openBuilder,\n closeBuilder: () => setBuilder(null),\n builderSaved: (id: string) => setBuilder({ kind: 'saved', id }),\n historyFor,\n historyTabs,\n activeHistoryId,\n openHistory,\n closeHistoryTab,\n selectHistoryTab: setActiveHistoryId,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/workflows/useSkillsEnabled.ts","../src/connection/workflows/useWorkflowDefinitions.ts","../src/connection/workflows/useWorkflowTasks.ts","../src/connection/tasks/ConnectedTaskComposer.tsx","../src/connection/ConnectedWorkflowHistory.tsx","../src/connection/tasks/useTaskPeople.tsx","../src/connection/workflows/useWorkflowsPageState.ts"],"names":["useUserSettings","useSkills","useWorkflowUsage","useMemo","mergeSkillWorkflows","WEB_WORKFLOWS","DASHBOARD_PINNED","sortByRecentUse","DASHBOARD_OPERATIONS","CUSTOM_TASK","REMIND_TASK","useCreateWork","useRunWorkflow","useStartTaskQuery","useCreateWorkflow","useUpdateConversation","useUpdateWorkflow","useArbiSessionState","useBlocksEnvironment","useGrantAgentAccess","useCallback","useDocuments","getDocumentTitle","taskComposerToCreateRequest","taskComposerToUpdateRequest","composerToWorkflowUpdate","useAgentWorkspaces","jsxs","jsx","useOpenWorkflow","useTags","useWorkflows","useAgents","useWorkspaces","usePlanWork","useWorkItems","useConnectedWorkflowScopeSource","listTimeZones","moveTargets","CUSTOM_TASK_ID","REMIND_TASK_ID","workflowToComposerValues","taskToComposerValues","detectTimeZone","useState","useEffect","ArbiApiError","TaskComposer","AUTOMATION_EVENTS","renderWorkflowIcon","ConnectedWorkflowDocumentsField","Button","TaskPlan","fmtDate","useWorkflowRuns","TaskRunsDialog","formatRelativeTime","useConversationActivity","useConnectedWorkspace","useConnectedWorkspaceRole","PersonPill","TaskActivityDialog","useWorkspaceUsers","useArbiSession","isAgent","getUserDisplayName","DocumentUser"],"mappings":"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","file":"chunk-L6KTANY2.cjs","sourcesContent":["/**\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'\n\nexport function useSkillsEnabled(): boolean {\n const { data: userSettings } = useUserSettings()\n return userSettings?.show_skills ?? false\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 { sortByRecentUse, useWorkflowUsage } from '../../agents/workflows/catalogue/workflow-usage'\nimport { WEB_WORKFLOWS } from '../../agents/workflows/catalogue/registry'\n\nexport interface UseWorkflowDefinitionsResult {\n /** Every skill workflow of this host: built-ins plus the user's and the marketplace's (one list). */\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\nexport function useWorkflowDefinitions(): UseWorkflowDefinitionsResult {\n const { data: listings } = useSkills()\n const usage = useWorkflowUsage()\n const skillsEnabled = useSkillsEnabled()\n return useMemo(() => {\n // An uploaded skill of a built-in's slug is used instead of it.\n const { host: builtins, skills: fromServer } = mergeSkillWorkflows(\n WEB_WORKFLOWS,\n listings ?? []\n )\n const all = [...builtins, ...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, ...DASHBOARD_OPERATIONS],\n forTasks: [CUSTOM_TASK, ...all.filter((w) => w.schedulable), REMIND_TASK],\n }\n }, [listings, usage, skillsEnabled])\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 createWork = useCreateWork()\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 { 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","/**\n * Create / edit a task, or create / edit a workflow: the `TaskComposer` block, connected.\n *\n * A task is a conversation with a status. \"Now\" (or a plain to-do) creates it; any other start (at a\n * time, on an event, after another task) saves a workflow that creates it when it fires. Pick the\n * workflow definition (or write your own instruction), fill its form, choose when, and who does it.\n * Everything the backend needs beyond that (authorization tier, name, notification, goal checklist)\n * is derived or folded under \"More options\". The API mapping lives in `useWorkflowTasks`, shared with\n * \"launch as another agent\". With `kind=\"workflow\"` it is the workflow dialog the Workflows page uses.\n */\n\nimport {\n useAgents,\n useAgentWorkspaces,\n useArbiSessionState,\n useDocuments,\n usePlanWork,\n useTags,\n useWorkflows,\n useWorkItems,\n useWorkspaces,\n} from '@arbidocs/react'\nimport type { components } from '@arbidocs/client'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TaskComposer } from '../../agents/tasks/TaskComposer'\nimport { TaskPlan as TaskPlanForm } from '../../agents/tasks/TaskPlan'\nimport type { TaskPlan } from '../../agents/workflows/planSteps'\nimport { moveTargets, type TaskListRow } from '../../agents/tasks/taskRows'\nimport { taskToComposerValues, workflowToComposerValues } from '../../agents/tasks/taskRequest'\nimport { type AgentOption } from '../../agents/workflows/AgentSelect'\nimport { type TaskComposerValues } from '../../agents/tasks/taskComposerTypes'\nimport { ArbiApiError } from '@arbidocs/sdk/browser'\nimport { detectTimeZone, listTimeZones } from '../../calendar/zone'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useOpenWorkflow } from '../workflows/useOpenWorkflow'\n\ntype Task = components['schemas']['ConversationResponse']\ntype Workflow = components['schemas']['WorkflowResponse']\nimport {\n CUSTOM_TASK_ID,\n REMIND_TASK_ID,\n renderWorkflowIcon,\n} from '../../agents/workflows/catalogue/seed'\nimport { useWorkflowDefinitions } from '../workflows/useWorkflowDefinitions'\nimport { useWorkflowTasks } from '../workflows/useWorkflowTasks'\nimport { AUTOMATION_EVENTS } from '../../agents/tasks/taskHelpers'\nimport {\n ConnectedWorkflowDocumentsField,\n useConnectedWorkflowScopeSource,\n} from '../ConnectedWorkflowLauncher'\n\nexport interface ConnectedTaskComposerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** `workflow` is the workflow dialog (new, or `workflow` to edit); the default adds a task. */\n kind?: 'work' | 'workflow'\n /** Save an on-demand recipe instead of running immediately. */\n saveOnly?: boolean\n /** Present -> edit this task; absent -> create. */\n task?: Task | null\n /** `kind=\"workflow\"` only: present -> edit this workflow. */\n workflow?: Workflow | null\n /** Create-mode default assignee (the Agents page's \"Assign task\"). */\n initialAgentExtId?: string\n /** `kind=\"workflow\"` create-mode template: opens with this workflow definition (a skill's) selected. */\n initialWorkflowId?: string\n /** `kind=\"workflow\"` create-mode: open on the Run later view (when, which agent, access). */\n startLater?: boolean\n /** A prompt carried from the quick task launcher into scheduling. */\n initialShared?: boolean\n initialPrompt?: string\n /** A saved recipe copied into a new schedule; the original is not edited. */\n launchWorkflow?: Workflow\n /** Create-mode parent: opens as \"Add sub-task\" under this task. */\n initialParentTaskExtId?: string\n}\n\n/** What \"always allowed\" means: the workspaces the agent will hold standing access to. */\nfunction StandingAccessNote({\n agentId,\n activeWorkspaceName,\n}: {\n agentId: string\n activeWorkspaceName: string | null\n}) {\n const { data: held = [] } = useAgentWorkspaces(agentId, { enabled: agentId !== '' })\n const names = new Set(held.map((w) => w.name))\n if (activeWorkspaceName) names.add(activeWorkspaceName)\n return (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"task-standing-access\">\n {agentId === '' ? 'Your own assistant needs no grant.' : 'It will hold standing access to: '}\n {agentId !== '' && (\n <span className=\"font-medium text-foreground\">\n {[...names].join(', ') || 'no workspace yet'}\n </span>\n )}\n </p>\n )\n}\n\nexport function ConnectedTaskComposer({\n open,\n onOpenChange,\n kind = 'work',\n saveOnly = false,\n task,\n workflow: editingWorkflow,\n initialWorkflowId,\n startLater: startLaterProp,\n initialPrompt,\n initialShared,\n launchWorkflow,\n initialAgentExtId,\n initialParentTaskExtId,\n}: ConnectedTaskComposerProps) {\n const { notify, openConversation, openUpload } = useBlocksEnvironment()\n // Scheduling (\"Run later\") belongs to Workflows: offered while the host has its page.\n const openWorkflow = useOpenWorkflow()\n const automationsEnabled = openWorkflow !== undefined\n const startLater = startLaterProp && automationsEnabled\n const isWorkflow = kind === 'workflow'\n const isEdit = isWorkflow ? !!editingWorkflow : !!task\n const { forTasks: baseSkills, skills } = useWorkflowDefinitions()\n const { data: reviewFields = [] } = useTags()\n const scheduledSkills = useMemo(\n () => [\n ...baseSkills,\n {\n id: '__document_review__',\n title: 'AI Review',\n description: 'Write answers and citations into document fields.',\n documentAction: 'annotate_documents' as const,\n run: { kind: 'operation' as const },\n landing: 'files' as const,\n inputs: [\n { name: 'scope', type: 'scope' as const, label: 'Documents', by: ['labels' as const] },\n {\n name: 'output',\n type: 'select' as const,\n label: 'Review field',\n required: true,\n description:\n 'Choose a field with saved AI instructions. Create one using AI Review in Files.',\n options: reviewFields\n .filter((field) => field.instruction)\n .map((field) => ({ value: field.external_id, label: field.name })),\n },\n {\n name: 'overwrite',\n type: 'boolean' as const,\n label: 'Regenerate existing answers',\n default: false,\n },\n ],\n },\n {\n id: '__document_email__',\n title: 'Email latest documents',\n description: 'Email me links to documents added since the previous successful digest.',\n documentAction: 'email_documents' as const,\n run: { kind: 'operation' as const },\n landing: 'files' as const,\n inputs: [\n { name: 'scope', type: 'scope' as const, label: 'Documents', by: ['labels' as const] },\n {\n name: 'latest',\n type: 'boolean' as const,\n label: 'Only documents added since the last digest',\n default: true,\n },\n ],\n },\n ],\n [baseSkills, reviewFields]\n )\n // A skill opened from the library runs now even if it cannot be scheduled: offer it as a template too.\n const forTasks = useMemo(() => {\n const picked = initialWorkflowId ? skills.find((w) => w.id === initialWorkflowId) : undefined\n return picked &&\n !scheduledSkills.some((w) => w.id === picked.id) &&\n picked.run.kind === 'prompt'\n ? [...scheduledSkills, picked]\n : scheduledSkills\n }, [scheduledSkills, skills, initialWorkflowId])\n const { data: workspaceAutomations = [] } = useWorkflows()\n const { data: agents = [] } = useAgents()\n const { data: workspaces = [] } = useWorkspaces()\n const planWork = usePlanWork()\n const { tasks: allTasks } = useWorkItems()\n const { data: documents = [] } = useDocuments()\n const { create, update, updateWorkflow, isPending } = useWorkflowTasks()\n // The files behind a template's file fields: the same pieces the skill launcher wires.\n const scopeSource = useConnectedWorkflowScopeSource()\n const activeWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const activeWorkspace = useMemo(\n () => workspaces.find((w) => w.external_id === activeWorkspaceId) ?? null,\n [workspaces, activeWorkspaceId]\n )\n const timezones = useMemo(() => listTimeZones(), [])\n // The plan lists documents by id; show their names.\n const documentNames = useMemo(\n () =>\n Object.fromEntries(\n documents.flatMap((d) => (d.file_name ? [[d.external_id, d.file_name]] : []))\n ),\n [documents]\n )\n // Tasks a new task can be part of: any other task that keeps the sub-task tree within its maximum\n // depth and (when editing) is not the task itself or one of its descendants. A workflow can wait on\n // any task, finished ones included (they re-open and finish again).\n const taskOptions = useMemo(() => {\n const label = (t: TaskListRow) => t.title?.trim() || 'Untitled task'\n if (isWorkflow) return allTasks.map((t) => ({ id: t.external_id, name: label(t) }))\n const subject: TaskListRow = task ?? { external_id: '__new__' }\n return moveTargets<TaskListRow>(\n [...allTasks.filter((t) => t.external_id !== subject.external_id), subject],\n subject\n ).map((t) => ({ id: t.external_id, name: label(t) }))\n }, [allTasks, task, isWorkflow])\n // The owner's main agent: what a scheduled workflow runs as unless another is picked.\n const defaultAgentId = useMemo(\n () => (agents.find((a) => a.given_name === 'Assistant') ?? agents[0])?.external_id,\n [agents]\n )\n const agentOptions = useMemo<AgentOption[]>(\n () => agents.map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n\n // What the composer opens with: the edit target, or (create) the preset assignee.\n const initialValues = useMemo(() => {\n const ids = {\n customWorkflowId: CUSTOM_TASK_ID,\n reminderWorkflowId: REMIND_TASK_ID,\n definitions: forTasks,\n }\n const base = launchWorkflow\n ? {\n ...workflowToComposerValues(launchWorkflow, ids),\n when: 'once' as const,\n runAt: '',\n rrule: '',\n eventKind: '',\n afterTaskId: '',\n name: '',\n }\n : editingWorkflow\n ? workflowToComposerValues(editingWorkflow, ids)\n : task\n ? taskToComposerValues(task, ids)\n : isWorkflow\n ? {\n // Run now is the default start; scheduling is the fallback in the same field.\n assignee: 'agent' as const,\n workflowId: initialWorkflowId ?? CUSTOM_TASK_ID,\n when: startLater ? ('once' as const) : ('now' as const),\n ...(initialPrompt\n ? {\n inputs: {\n [initialWorkflowId === REMIND_TASK_ID ? 'message' : 'instruction']:\n initialPrompt,\n },\n }\n : {}),\n // A scheduled run needs an agent: the owner's Assistant unless another is picked.\n ...(startLater && defaultAgentId ? { agentId: defaultAgentId } : {}),\n }\n : initialAgentExtId\n ? // Assigning an agent means agentic work: the free instruction, and tell me when done.\n { agentId: initialAgentExtId, workflowId: CUSTOM_TASK_ID, notifyOnComplete: true }\n : {}\n return {\n timezone: detectTimeZone(),\n ...base,\n ...(initialShared !== undefined && !task && !editingWorkflow\n ? { shared: initialShared }\n : {}),\n ...(!task && !isWorkflow && initialParentTaskExtId\n ? { parentTaskId: initialParentTaskExtId }\n : {}),\n }\n }, [\n forTasks,\n task,\n editingWorkflow,\n isWorkflow,\n initialWorkflowId,\n startLater,\n initialPrompt,\n initialShared,\n launchWorkflow,\n defaultAgentId,\n initialAgentExtId,\n initialParentTaskExtId,\n ])\n\n const [plan, setPlan] = useState<TaskPlan | null>(null)\n useEffect(() => {\n if (open) setPlan(task?.plan ?? editingWorkflow?.plan ?? launchWorkflow?.plan ?? null) // the stored plan when editing agent work\n }, [open, task, editingWorkflow, launchWorkflow])\n\n const handleGeneratePlan = async (values: TaskComposerValues) => {\n if (!activeWorkspace) {\n notify('Open a workspace first — the plan is scoped to it', 'warning')\n return\n }\n const objective = String(values.inputs.instruction ?? '').trim()\n if (!objective) {\n notify('Write the instruction first — it’s the planner’s objective', 'warning')\n return\n }\n try {\n const drafted = await planWork.mutateAsync({\n objective,\n max_passes: plan?.max_passes ?? 3,\n })\n setPlan(drafted)\n notify('Drafted a plan — review the checklist', 'success')\n } catch {\n notify('Could not draft a plan', 'error')\n }\n }\n\n const submit = async (submitted: TaskComposerValues, options?: { runOnce?: boolean }) => {\n // A task for me is a plain to-do and runs no workflow.\n const chosen =\n forTasks.find((w) => w.id === submitted.workflowId) ??\n (submitted.assignee === 'me' ? forTasks[0] : undefined)\n if (!chosen) return\n if (plan && !plan.goal.trim()) {\n notify('The plan needs a goal', 'warning')\n return\n }\n if (plan && plan.criteria.some((c) => !c.text.trim())) {\n notify('Every checklist criterion needs text (or remove it)', 'warning')\n return\n }\n const ctx = {\n workflow: chosen,\n values: submitted,\n plan: chosen.id === CUSTOM_TASK_ID ? plan : null,\n }\n try {\n if (isWorkflow && editingWorkflow && !options?.runOnce) {\n await updateWorkflow(editingWorkflow, ctx)\n notify(`Updated “${editingWorkflow.name}”`, 'success')\n } else if (isEdit && task) {\n await update(task, ctx)\n notify(`Updated “${task.title ?? 'task'}”`, 'success')\n } else {\n const created = await create(ctx, saveOnly && !options?.runOnce)\n if (created.kind === 'workflow') {\n notify(`Saved “${created.workflow.name}”.`, 'success')\n // The saved workflow, on the Workflows page.\n openWorkflow?.()\n } else {\n const name = created.task.title ?? 'task'\n if ((created.ran || options?.runOnce) && created.task.external_id) {\n // The run is a thread: go and watch it, rather than leave a toast to say it started.\n openConversation(created.task.external_id)\n } else {\n notify(\n created.ran === null\n ? `Added “${name}”`\n : 'Task created, but the run could not start',\n created.ran === false ? 'warning' : 'success'\n )\n }\n }\n }\n onOpenChange(false)\n } catch (error) {\n const what = `Failed to ${isEdit ? 'update' : 'create'} the ${isWorkflow ? 'workflow' : 'task'}`\n notify(\n error instanceof Error && error.message.startsWith('Open a workspace')\n ? error.message\n : error instanceof ArbiApiError && error.detail\n ? `${what}: ${error.detail}`\n : what,\n 'error'\n )\n }\n }\n\n return (\n <TaskComposer\n key={editingWorkflow?.external_id ?? task?.external_id ?? 'new'}\n open={open}\n onOpenChange={onOpenChange}\n kind={kind}\n saveOnly={saveOnly}\n hideRunLater={!automationsEnabled}\n defaultAgentId={defaultAgentId}\n isEdit={isEdit}\n workflows={forTasks}\n agents={agentOptions}\n tasks={taskOptions}\n initialValues={initialValues}\n timezones={timezones}\n eventOptions={AUTOMATION_EVENTS}\n eventWorkflowOptions={workspaceAutomations\n .filter((item) => item.external_id !== editingWorkflow?.external_id)\n .map((item) => ({ id: item.external_id, label: item.name }))}\n isPending={isPending}\n planDrafting={planWork.isPending}\n hasPlan={plan !== null}\n renderIcon={renderWorkflowIcon}\n scopeSource={scopeSource}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={openUpload}\n />\n )}\n addFilesAction={\n openUpload && (\n <Button size=\"sm\" onClick={() => openUpload()} data-testid=\"workflow-add-files-first\">\n Add files\n </Button>\n )\n }\n onDropFiles={openUpload && ((files) => openUpload(files))}\n standingAccess={(values) => (\n <StandingAccessNote\n agentId={values.agentId}\n activeWorkspaceName={activeWorkspace?.name ?? null}\n />\n )}\n labels={{\n ...(isWorkflow\n ? {\n titleNewWorkflow: 'New workflow',\n titleEditWorkflow: 'Edit workflow',\n workflowNamePlaceholder: 'Name this workflow',\n createWorkflow: 'Create workflow',\n saveWorkflow: 'Save workflow',\n descriptionWorkflow: 'Choose what happens and when this workflow starts.',\n eventHint: 'Choose the workspace event that starts this workflow.',\n runAsAgentHint: 'Scheduled AI work runs as your chosen assistant when you are away.',\n }\n : {}),\n ...(plan\n ? { addAndStart: 'Approve plan and start', addAndSchedule: 'Approve plan and schedule' }\n : {}),\n }}\n onSubmit={submit}\n goal={(values) =>\n values.workflowId === CUSTOM_TASK_ID ? (\n <TaskPlanForm\n plan={plan}\n onChange={setPlan}\n onGenerate={() => handleGeneratePlan(values)}\n isGenerating={planWork.isPending}\n workspaceName={activeWorkspace?.name ?? null}\n documentNames={documentNames}\n objective={String(values.inputs.instruction ?? '')}\n />\n ) : null\n }\n />\n )\n}\n","/**\n * A saved workflow's history and a task's activity, bound to the connection.\n *\n * - `ConnectedWorkflowHistory`: every run of a workflow (re-read while shown), each with when, what\n * it was (a thread, an email, an AI review, a reminder) and how it went; a run's thread opens\n * through the environment's `openConversation`, a document action's result through the host.\n * - `ConnectedTaskActivityDialog`: a task's timeline (re-read while it runs), with who did what.\n */\n\nimport { useCallback, type ReactNode } from 'react'\nimport { useAgents, useConversationActivity, useWorkflowRuns } from '@arbidocs/react'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport {\n TaskRunsDialog,\n type TaskRunView,\n type TaskRunsDialogLabels,\n} from '../agents/tasks/TaskRunsDialog'\nimport { TaskActivityDialog } from '../agents/tasks/TaskActivityDialog'\nimport type { TaskActivityEvent } from '../agents/tasks/TaskActivityTimeline'\nimport { PersonPill, type TaskPerson } from '../agents/tasks/PersonPill'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedWorkspaceRole } from './ConnectedWorkflowsTable'\n\ntype WorkflowRun = NonNullable<ReturnType<typeof useWorkflowRuns>['data']>[number]\n\n/** What a run was, in a word. */\nconst RUN_KIND: Record<string, string> = {\n email_documents: 'Email',\n annotate_documents: 'AI Review',\n reminder: 'Reminder',\n}\nconst DOCUMENT_ACTIONS = new Set(['email_documents', 'annotate_documents'])\n\n/** A run as the history lists it: when, what, on how many documents. */\nexport function workflowRunView(\n run: WorkflowRun,\n formatDate: (iso: string) => string\n): TaskRunView {\n const documents = DOCUMENT_ACTIONS.has(run.action_type)\n ? ` · ${run.document_ext_ids.length} documents`\n : ''\n return {\n id: `execution-${run.id}`,\n // An AI review that finished has a result to open (its fields over its documents).\n resultId:\n run.action_type === 'annotate_documents' && run.status === 'completed'\n ? String(run.id)\n : undefined,\n status: run.status,\n when: `${formatDate(run.created_at)} · ${RUN_KIND[run.action_type] ?? 'Thread'}${documents}`,\n error: run.error,\n conversationId: run.conversation_ext_id ?? undefined,\n }\n}\n\nexport interface ConnectedWorkflowHistoryProps {\n /** The workflow (`null`: closed). */\n workflow: { external_id: string; name: string } | null\n onOpenChange: (open: boolean) => void\n /** In the page rather than a dialog. */\n inline?: boolean\n hideHeader?: boolean\n formatDate?: (iso: string) => string\n /** Open a document action's result (an AI review's fields): the host's. Absent: no Open. */\n onOpenResult?: (run: WorkflowRun) => void\n /** Under a failed run: e.g. a way to report it. */\n renderErrorReport?: (run: TaskRunView) => ReactNode\n labels?: Partial<TaskRunsDialogLabels>\n}\n\nexport function ConnectedWorkflowHistory({\n workflow,\n onOpenChange,\n inline,\n hideHeader,\n formatDate = fmtDate,\n onOpenResult,\n renderErrorReport,\n labels,\n}: ConnectedWorkflowHistoryProps) {\n const { openConversation } = useBlocksEnvironment()\n const { data: runs = [], isLoading } = useWorkflowRuns(workflow?.external_id)\n return (\n <TaskRunsDialog\n inline={inline}\n hideHeader={hideHeader}\n open={!!workflow}\n onOpenChange={onOpenChange}\n taskName={workflow?.name}\n renderErrorReport={renderErrorReport}\n isLoading={isLoading}\n labels={{\n title: (name) => `History — ${name}`,\n description: 'Executions and results of this workflow.',\n empty: 'This workflow hasn’t run yet.',\n ...labels,\n }}\n runs={runs.map((run) => workflowRunView(run, formatDate))}\n onOpenResult={\n onOpenResult &&\n ((id) => {\n const run = runs.find((r) => String(r.id) === id)\n if (run) onOpenResult(run)\n })\n }\n onOpenRun={(conversationId) => openConversation(conversationId)}\n />\n )\n}\n\n/** Relative time, compact for list rows. */\nconst relativeTime = (iso: string) => formatRelativeTime(iso, { style: 'short' })\n\nexport interface ConnectedTaskActivityDialogProps {\n conversationId: string\n taskName: string\n /** The run is generating right now: the timeline then re-reads itself every few seconds. */\n live?: boolean\n onClose: () => void\n /** How a person shows (the host's own pill). Default: the shared pill with their name. */\n renderPerson?: (person: TaskPerson) => ReactNode\n formatExact?: (iso: string) => string\n}\n\nexport function ConnectedTaskActivityDialog({\n conversationId,\n taskName,\n live,\n onClose,\n renderPerson: renderTaskPerson,\n formatExact = fmtDate,\n}: ConnectedTaskActivityDialogProps) {\n const activity = useConversationActivity(conversationId, { live })\n const { data: agents = [] } = useAgents()\n const { userId } = useConnectedWorkspace()\n const { members } = useConnectedWorkspaceRole()\n const renderPerson = useCallback(\n (id: string | null | undefined) => {\n const isMe = !!id && id === userId\n const member = members.find((m) => m.user.external_id === id)?.user\n const name =\n (member && [member.given_name, member.family_name].filter(Boolean).join(' ')) ||\n member?.email\n const person = { id, label: isMe ? 'You' : name || 'Someone', isMe }\n return renderTaskPerson ? renderTaskPerson(person) : <PersonPill person={person} />\n },\n [renderTaskPerson, userId, members]\n )\n const agentName = useCallback(\n (agentId: string) => agents.find((a) => a.external_id === agentId)?.given_name ?? undefined,\n [agents]\n )\n return (\n <TaskActivityDialog\n open\n onOpenChange={(open) => !open && onClose()}\n taskName={taskName}\n events={activity.data as TaskActivityEvent[] | undefined}\n isLoading={activity.isLoading}\n isError={activity.isError}\n renderPerson={renderPerson}\n agentName={agentName}\n formatRelative={relativeTime}\n formatExact={formatExact}\n />\n )\n}\n","import { useCallback, useMemo, type ReactNode } from 'react'\nimport { useAgents, useArbiSession, useWorkspaceUsers } from '@arbidocs/react'\nimport { getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport { PersonPill, type TaskPerson } from '../../agents/tasks/PersonPill'\nimport { DocumentUser } from '../files/fields/DocumentUser'\n\n/** The workspace roles that can edit it. */\nconst EDITOR_ROLES: readonly string[] = ['owner', 'collaborator']\n\n/**\n * People who can own tasks here: humans (never agents) who can edit the workspace, other than me\n * (the task list shows me as \"Me\"). They name each task's owner.\n */\nexport function useTaskPeople(): { id: string; label: string }[] {\n const { data: members = [] } = useWorkspaceUsers()\n const currentUserExtId = useArbiSession().user?.external_id\n return useMemo(\n () =>\n members\n .filter(\n (m) =>\n !isAgent(m.user) &&\n m.user.external_id !== currentUserExtId &&\n EDITOR_ROLES.includes(m.role)\n )\n .map((m) => ({ id: m.user.external_id, label: getUserDisplayName(m.user) })),\n [members, currentUserExtId]\n )\n}\n\n/**\n * How the Tasks table draws a person: the host's own user pill (presence, a click to message, the\n * rich tooltip) when the person is a member or agent we know, else the plain shared pill.\n */\nexport function useRenderTaskPerson(): (person: TaskPerson) => ReactNode {\n const { data: members = [] } = useWorkspaceUsers()\n const { data: agents = [] } = useAgents()\n const byId = useMemo(() => {\n const map = new Map(members.map((m) => [m.user.external_id, m.user]))\n for (const agent of agents) if (!map.has(agent.external_id)) map.set(agent.external_id, agent)\n return map\n }, [members, agents])\n return useCallback(\n (person: TaskPerson) => {\n const user = person.id ? byId.get(person.id) : undefined\n return user ? <DocumentUser user={user} variant=\"pill\" /> : <PersonPill person={person} />\n },\n [byId]\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useWorkflows, type WorkflowResponse } from '@arbidocs/react'\n\n/** A saved workflow, a new one, or a host catalogue entry opened as a template. */\nexport type WorkflowBuilderSelection =\n { kind: 'saved'; id: string } | { kind: 'new' } | { kind: 'template'; id: string }\n\nexport interface WorkflowsPageStateOptions {\n initialBuilder?: WorkflowBuilderSelection\n /** A host deep link to consume once the saved workflow has loaded. */\n historyWorkflowId?: string | null\n onHistoryWorkflowConsumed?: () => void\n}\n\n/** Shared selection lifecycle for workflow tables, builders and history views. No routing or layout. */\nexport function useWorkflowsPageState({\n initialBuilder,\n historyWorkflowId,\n onHistoryWorkflowConsumed,\n}: WorkflowsPageStateOptions = {}) {\n const { data: workflows = [] } = useWorkflows({ live: true })\n const [builder, setBuilder] = useState<WorkflowBuilderSelection | null>(initialBuilder ?? null)\n const [builderKey, setBuilderKey] = useState(0)\n const [historyIds, setHistoryIds] = useState<string[]>([])\n const [activeHistoryId, setActiveHistoryId] = useState<string | null>(null)\n // Resolve against current query data: renaming/deleting a workflow cannot leave a stale dialog.\n const historyFor = workflows.find((workflow) => workflow.external_id === activeHistoryId) ?? null\n const historyTabs = historyIds.flatMap((id) => {\n const workflow = workflows.find((item) => item.external_id === id)\n return workflow ? [workflow] : []\n })\n\n const openHistory = useCallback((workflow: WorkflowResponse | null) => {\n const id = workflow?.external_id ?? null\n if (id) setHistoryIds((ids) => (ids.includes(id) ? ids : [...ids, id]))\n setActiveHistoryId(id)\n }, [])\n const closeHistoryTab = useCallback((id: string) => {\n setHistoryIds((ids) => ids.filter((item) => item !== id))\n setActiveHistoryId((active) => (active === id ? null : active))\n }, [])\n const openBuilder = useCallback((selection: WorkflowBuilderSelection) => {\n setBuilder(selection)\n // Reopening a template/new/saved selection resets its unsaved canvas; saving does not.\n setBuilderKey((key) => key + 1)\n }, [])\n\n useEffect(() => {\n const workflow = workflows.find((item) => item.external_id === historyWorkflowId)\n if (!workflow) return\n openHistory(workflow)\n onHistoryWorkflowConsumed?.()\n }, [historyWorkflowId, onHistoryWorkflowConsumed, openHistory, workflows])\n\n return {\n workflows,\n builder,\n builderKey,\n openBuilder,\n closeBuilder: () => setBuilder(null),\n builderSaved: (id: string) => setBuilder({ kind: 'saved', id }),\n historyFor,\n historyTabs,\n activeHistoryId,\n openHistory,\n closeHistoryTab,\n selectHistoryTab: setActiveHistoryId,\n }\n}\n"]}