@arbidocs/blocks 0.4.72 → 0.4.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/agents/index.cjs +401 -262
  2. package/dist/agents/index.js +7 -4
  3. package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
  4. package/dist/agents/tasks/WorkflowThreadStrip.d.ts +58 -0
  5. package/dist/agents/tasks/index.d.ts +1 -0
  6. package/dist/agents/workflows/WorkflowRunner.d.ts +86 -0
  7. package/dist/agents/workflows/WorkflowStepBar.d.ts +23 -0
  8. package/dist/agents/workflows/index.d.ts +7 -1
  9. package/dist/agents/workflows/planSteps.d.ts +28 -0
  10. package/dist/agents/workflows/run.d.ts +98 -0
  11. package/dist/agents/workflows/skillMarkdown.d.ts +15 -0
  12. package/dist/agents/workflows/types.d.ts +111 -0
  13. package/dist/agents/workflows/useWorkflowPreview.d.ts +14 -0
  14. package/dist/agents/workflows/useWorkflowView.d.ts +54 -0
  15. package/dist/agents/workflows/workflow.d.ts +3 -1
  16. package/dist/chat/index.cjs +124 -124
  17. package/dist/chat/index.js +3 -3
  18. package/dist/{chunk-DH7C2UJO.cjs → chunk-5LP54CWR.cjs} +299 -526
  19. package/dist/chunk-5LP54CWR.cjs.map +1 -0
  20. package/dist/{chunk-3SFFTSOI.cjs → chunk-7CVF3DK2.cjs} +5 -5
  21. package/dist/{chunk-3SFFTSOI.cjs.map → chunk-7CVF3DK2.cjs.map} +1 -1
  22. package/dist/chunk-7D737FLE.cjs +43 -0
  23. package/dist/chunk-7D737FLE.cjs.map +1 -0
  24. package/dist/{chunk-V3L5DONY.cjs → chunk-B4SRYJLM.cjs} +31 -2
  25. package/dist/chunk-B4SRYJLM.cjs.map +1 -0
  26. package/dist/{chunk-LFGJAZ5H.js → chunk-DDF5GPIJ.js} +6 -36
  27. package/dist/chunk-DDF5GPIJ.js.map +1 -0
  28. package/dist/chunk-DETZZBG2.cjs +91 -0
  29. package/dist/chunk-DETZZBG2.cjs.map +1 -0
  30. package/dist/chunk-EVUEIBNU.js +89 -0
  31. package/dist/chunk-EVUEIBNU.js.map +1 -0
  32. package/dist/{chunk-G5QTGKDJ.cjs → chunk-HITAN7JF.cjs} +8 -8
  33. package/dist/{chunk-G5QTGKDJ.cjs.map → chunk-HITAN7JF.cjs.map} +1 -1
  34. package/dist/{chunk-3VQYJBOI.js → chunk-HOXKR26S.js} +31 -4
  35. package/dist/chunk-HOXKR26S.js.map +1 -0
  36. package/dist/{chunk-KJ3QEKOJ.cjs → chunk-IPGKTUF7.cjs} +7 -33
  37. package/dist/chunk-IPGKTUF7.cjs.map +1 -0
  38. package/dist/{chunk-IMC2Z32C.js → chunk-KOSGX3UK.js} +269 -485
  39. package/dist/chunk-KOSGX3UK.js.map +1 -0
  40. package/dist/{chunk-KOXUBCLL.js → chunk-MK6NJQGF.js} +4 -4
  41. package/dist/{chunk-KOXUBCLL.js.map → chunk-MK6NJQGF.js.map} +1 -1
  42. package/dist/{chunk-THO7DZNN.cjs → chunk-MUMH3Z6K.cjs} +20 -15
  43. package/dist/chunk-MUMH3Z6K.cjs.map +1 -0
  44. package/dist/{chunk-5HOAOKZL.js → chunk-OYMWV45N.js} +21 -16
  45. package/dist/chunk-OYMWV45N.js.map +1 -0
  46. package/dist/chunk-P2RBE3FD.cjs +1448 -0
  47. package/dist/chunk-P2RBE3FD.cjs.map +1 -0
  48. package/dist/{chunk-G5DP27DU.js → chunk-UIWLDSTF.js} +3 -29
  49. package/dist/chunk-UIWLDSTF.js.map +1 -0
  50. package/dist/{chunk-VRPRAU3J.js → chunk-WJEKRSPH.js} +3 -3
  51. package/dist/{chunk-VRPRAU3J.js.map → chunk-WJEKRSPH.js.map} +1 -1
  52. package/dist/chunk-XD2M6LIG.js +41 -0
  53. package/dist/chunk-XD2M6LIG.js.map +1 -0
  54. package/dist/chunk-YWYVIQ7T.js +1402 -0
  55. package/dist/chunk-YWYVIQ7T.js.map +1 -0
  56. package/dist/{chunk-WBDK4PIA.cjs → chunk-Z5VUZ6YD.cjs} +6 -37
  57. package/dist/chunk-Z5VUZ6YD.cjs.map +1 -0
  58. package/dist/connect/docx.cjs +2 -2
  59. package/dist/connect/docx.js +1 -1
  60. package/dist/connect/index.cjs +379 -27
  61. package/dist/connect/index.cjs.map +1 -1
  62. package/dist/connect/index.d.ts +1 -0
  63. package/dist/connect/index.js +362 -11
  64. package/dist/connect/index.js.map +1 -1
  65. package/dist/connection/ConnectedWorkflowBuilder.d.ts +44 -0
  66. package/dist/connection/ConnectedWorkflowRunner.d.ts +31 -0
  67. package/dist/connection/useWorkflowThread.d.ts +38 -0
  68. package/dist/facts/index.cjs +1 -1
  69. package/dist/facts/index.js +1 -1
  70. package/dist/files/index.cjs +9 -83
  71. package/dist/files/index.cjs.map +1 -1
  72. package/dist/files/index.js +6 -83
  73. package/dist/files/index.js.map +1 -1
  74. package/dist/home/index.cjs +22 -21
  75. package/dist/home/index.cjs.map +1 -1
  76. package/dist/home/index.js +4 -3
  77. package/dist/home/index.js.map +1 -1
  78. package/dist/index.cjs +579 -440
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.js +11 -8
  81. package/dist/index.js.map +1 -1
  82. package/dist/shell/index.cjs +1 -1
  83. package/dist/shell/index.js +1 -1
  84. package/dist/studio/index.cjs +7 -7
  85. package/dist/studio/index.js +5 -5
  86. package/dist/workflow-canvas/StepInspector.d.ts +57 -0
  87. package/dist/workflow-canvas/TriggerInspector.d.ts +46 -0
  88. package/dist/workflow-canvas/WorkflowBuilder.d.ts +55 -0
  89. package/dist/workflow-canvas/WorkflowCanvas.d.ts +69 -0
  90. package/dist/workflow-canvas/edit.d.ts +54 -0
  91. package/dist/workflow-canvas/index.cjs +1719 -0
  92. package/dist/workflow-canvas/index.cjs.map +1 -0
  93. package/dist/workflow-canvas/index.d.ts +13 -0
  94. package/dist/workflow-canvas/index.js +1689 -0
  95. package/dist/workflow-canvas/index.js.map +1 -0
  96. package/dist/workflow-canvas/trigger.d.ts +51 -0
  97. package/dist/workflow-canvas/viewport.d.ts +47 -0
  98. package/package.json +25 -14
  99. package/src/workflow-canvas/canvas.css +113 -0
  100. package/dist/chunk-3VQYJBOI.js.map +0 -1
  101. package/dist/chunk-5HOAOKZL.js.map +0 -1
  102. package/dist/chunk-DH7C2UJO.cjs.map +0 -1
  103. package/dist/chunk-G5DP27DU.js.map +0 -1
  104. package/dist/chunk-IMC2Z32C.js.map +0 -1
  105. package/dist/chunk-KJ3QEKOJ.cjs.map +0 -1
  106. package/dist/chunk-LFGJAZ5H.js.map +0 -1
  107. package/dist/chunk-THO7DZNN.cjs.map +0 -1
  108. package/dist/chunk-V3L5DONY.cjs.map +0 -1
  109. package/dist/chunk-WBDK4PIA.cjs.map +0 -1
@@ -1,502 +1,27 @@
1
1
  "use client";
2
2
  import { DocumentPicker, TriStateFilterMenu, MultiSelect } from './chunk-CKB64Z4R.js';
3
3
  import { EmptyState } from './chunk-P6GHJSLR.js';
4
+ import { defaultInputs, validateInputs, SchemaForm, isWorkflowScope, fieldToFrontmatter, workflowFromFrontmatter, workflowSteps, initialRunInputs, stepPhase, composeStepPrompt, useWorkflowView, composeWorkflowPrompt, isRunFinished, buildLaunch } from './chunk-YWYVIQ7T.js';
4
5
  import { TabHeader } from './chunk-4WWM3GQ5.js';
5
6
  import { CellHoverIcon } from './chunk-RFXJYIDV.js';
6
7
  import { ToneBadge } from './chunk-DPLRHEJZ.js';
7
8
  import { GridView, SelectionBar, SelectionBarAction } from './chunk-BUHKUKKB.js';
8
9
  import { FilterInput } from './chunk-YU2KUMGE.js';
9
- import { FoldSection, QuickActionDialogHeader, AddFilesFirst, ScopePicker, StartTiles } from './chunk-LFGJAZ5H.js';
10
+ import { QuickActionDialogHeader, AddFilesFirst, ScopePicker, StartTiles } from './chunk-DDF5GPIJ.js';
11
+ import { FoldSection } from './chunk-XD2M6LIG.js';
10
12
  import { ActionLink } from './chunk-S7PSMMRG.js';
11
- import { useBlocksEnvironment } from './chunk-76JDDMSP.js';
12
- import { useMentionAutocomplete } from './chunk-3VQYJBOI.js';
13
+ import { useMentionAutocomplete } from './chunk-HOXKR26S.js';
13
14
  import { toMessageMentions, extractMentions, MentionMenu } from './chunk-AA3PT6KR.js';
14
15
  import { useIsPhone } from './chunk-SLSBJRWW.js';
16
+ import { useBlocksEnvironment } from './chunk-76JDDMSP.js';
15
17
  import { formatCount, initials } from './chunk-OXF2IFXG.js';
16
18
  import { ModalHeader } from './chunk-TX2ZICS7.js';
17
19
  import { testIdOr, prefixedTestId } from './chunk-7F6CBP3Z.js';
18
20
  import { memo, forwardRef, useState, useMemo, useId, useEffect, useRef, useCallback, useLayoutEffect } from 'react';
19
21
  import { cn, Label, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Textarea, Input, Switch, Button, Collapsible, CollapsibleTrigger, CollapsibleContent, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Tooltip, TooltipTrigger, TooltipContent, Badge, Slider, UserEntity, getEntityColorStyles, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, VisibilityToggle, EntityPill, ThreadVisibilityIcon, DialogClose, Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandItem, DropdownMenuSeparator, badgeVariants, Checkbox } from '@arbidocs/react/ui';
20
22
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
21
- import { ChevronDown, ChevronRight, Plus, Trash2, Loader2, Play, MessageSquare, Eye, ClipboardList, Pencil, Copy, Bot, Sparkles, Wand2, X, Globe, Download, Lock, ListChecks, AlertTriangle, FileX, SkipForward, Check, FileText, CornerDownRight, AlertCircle, KeyRound, Workflow, ChevronsUpDown, ChevronsDownUp, ListTodo, CheckCheck, MoreHorizontal, CalendarClock, History, ChevronUp, Pause, Activity, Hourglass, MoreVertical, TriangleAlert, CheckSquare, Square, CheckCircle2, SquareArrowOutUpRight, ArrowLeft, LayoutGrid, List, CircleDashed, RotateCcw, ListPlus, Link2, Clock, Bell, MousePointerClick, UserRoundCog, MessageSquareReply, Zap } from 'lucide-react';
23
+ import { ChevronDown, ChevronRight, Plus, Trash2, Loader2, Play, MessageSquare, Eye, ClipboardList, Pencil, Copy, Bot, Sparkles, Wand2, X, Globe, Download, Lock, ListChecks, AlertTriangle, FileX, SkipForward, Check, FileText, CornerDownRight, AlertCircle, KeyRound, Workflow, ChevronsUpDown, ChevronsDownUp, ListTodo, CheckCheck, MoreHorizontal, CalendarClock, History, ChevronUp, Pause, Activity, Hourglass, MoreVertical, TriangleAlert, CheckSquare, Square, CheckCircle2, SquareArrowOutUpRight, ArrowLeft, LayoutGrid, List, CircleDashed, RotateCcw, ListPlus, Link2, Clock, Bell, MousePointerClick, UserRoundCog, MessageSquareReply, MinusCircle, Zap } from 'lucide-react';
22
24
 
23
- // src/agents/workflows/types.ts
24
- var EMPTY_WORKFLOW_SCOPE = { folders: [], labels: [] };
25
-
26
- // src/agents/workflows/workflow.ts
27
- var isWorkflowScope = (value) => typeof value === "object" && value !== null && Array.isArray(value.folders) && Array.isArray(value.labels);
28
- var isEmptyWorkflowScope = (scope) => scope.folders.length === 0 && scope.labels.length === 0 && !scope.documents?.length;
29
- var isFileField = (field) => field.type === "scope" || field.type === "documents";
30
- function emptyValue(field) {
31
- switch (field.type) {
32
- case "boolean":
33
- return false;
34
- case "scope":
35
- return { folders: [], labels: [] };
36
- case "documents":
37
- return { folders: [], labels: [], documents: [] };
38
- default:
39
- return "";
40
- }
41
- }
42
- function defaultInputs(workflow) {
43
- const inputs = {};
44
- for (const field of workflow.inputs) {
45
- const d = field.default;
46
- inputs[field.name] = d === void 0 ? emptyValue(field) : isWorkflowScope(d) ? { ...d } : d;
47
- }
48
- return inputs;
49
- }
50
- function validateInputs(workflow, inputs) {
51
- const errors = {};
52
- for (const field of workflow.inputs) {
53
- const value = inputs[field.name];
54
- if (field.type === "number") {
55
- const blank = value === "" || value === void 0;
56
- if (blank) {
57
- if (field.required) errors[field.name] = "required";
58
- continue;
59
- }
60
- const n = Number(value);
61
- if (Number.isNaN(n)) errors[field.name] = "number";
62
- else if (field.min !== void 0 && n < field.min) errors[field.name] = "min";
63
- else if (field.max !== void 0 && n > field.max) errors[field.name] = "max";
64
- continue;
65
- }
66
- if (!field.required) continue;
67
- if (field.type === "documents") {
68
- if (!isWorkflowScope(value) || !value.documents?.length) errors[field.name] = "required";
69
- continue;
70
- }
71
- if (field.type === "boolean" || field.type === "scope") continue;
72
- if (typeof value !== "string" || value.trim() === "") errors[field.name] = "required";
73
- }
74
- return errors;
75
- }
76
- function promptFieldName(workflow) {
77
- return workflow.inputs.find((f) => !f.advanced && (f.type === "text" || f.type === "longtext"))?.name;
78
- }
79
- var quoteList = (names) => {
80
- const quoted = names.map((n) => `"${n}"`);
81
- return quoted.length <= 1 ? quoted[0] ?? "" : `${quoted.slice(0, -1).join(", ")} and ${quoted[quoted.length - 1]}`;
82
- };
83
- function fragment(field, value, ctx) {
84
- switch (field.type) {
85
- case "documents": {
86
- const ids = isWorkflowScope(value) ? value.documents ?? [] : [];
87
- const names = ids.flatMap((id) => {
88
- const title = ctx?.documentTitles?.[id];
89
- return title ? [title] : [];
90
- });
91
- return quoteList(names);
92
- }
93
- case "boolean":
94
- return value ? field.trueText ?? "yes" : field.falseText ?? "no";
95
- case "select": {
96
- const option = field.options?.find((o) => o.value === value);
97
- return option ? option.text ?? option.label : String(value ?? "");
98
- }
99
- case "scope":
100
- return "";
101
- default:
102
- return typeof value === "string" ? value.trim() : String(value ?? "");
103
- }
104
- }
105
- function composeWorkflowPrompt(workflow, inputs, ctx) {
106
- if (workflow.run.kind !== "prompt") return "";
107
- const byName = new Map(workflow.inputs.map((f) => [f.name, f]));
108
- const template = workflow.run.promptTemplate;
109
- let out = "";
110
- let last = 0;
111
- const append = (text, isValue) => {
112
- let t = text;
113
- if (!isValue) {
114
- t = t.replace(/[ \t]{2,}/g, " ");
115
- if (/[ \t]$/.test(out)) t = t.replace(/^[ \t]+/, "");
116
- }
117
- out += t;
118
- };
119
- for (const m of template.matchAll(/\{\{\s*([a-z][a-z0-9_]*)\s*\}\}/gi)) {
120
- append(template.slice(last, m.index), false);
121
- const field = byName.get(m[1]);
122
- append(field ? fragment(field, inputs[m[1]], ctx) : "", true);
123
- last = m.index + m[0].length;
124
- }
125
- append(template.slice(last), false);
126
- return out.trim();
127
- }
128
- function buildLaunch(workflow, inputs, agentId) {
129
- const scopeField = workflow.inputs.find(isFileField);
130
- const raw = scopeField ? inputs[scopeField.name] : void 0;
131
- const scope = isWorkflowScope(raw) ? raw : { ...EMPTY_WORKFLOW_SCOPE };
132
- return { workflow, inputs, scope, agentId: agentId || workflow.defaultAgentId || void 0 };
133
- }
134
- function workflowAccepts(workflow) {
135
- const kinds = /* @__PURE__ */ new Set();
136
- for (const field of workflow.inputs) if (field.context) kinds.add(field.context);
137
- return [...kinds];
138
- }
139
- function workflowsAccepting(workflows, supplied) {
140
- return workflows.filter((w) => workflowAccepts(w).some((k) => supplied.includes(k)));
141
- }
142
- function workflowsForHost(workflows, host) {
143
- return workflows.filter((w) => !w.host || w.host === host);
144
- }
145
- function inputsFromContext(workflow, context) {
146
- const inputs = {};
147
- for (const field of workflow.inputs) {
148
- if (!field.context) continue;
149
- if (field.context === "selection") {
150
- if (context.selection) inputs[field.name] = context.selection;
151
- continue;
152
- }
153
- const ids = field.context === "image" ? context.image ? [context.image] : [] : context.documents;
154
- if (ids?.length && isFileField(field)) {
155
- inputs[field.name] = { folders: [], labels: [], documents: ids.slice(0, field.max ?? 1) };
156
- }
157
- }
158
- return inputs;
159
- }
160
- var SKILL_PROMPT_LABEL = "What should it work on?";
161
- var SKILL_PROMPT_FALLBACK_PLACEHOLDER = "Describe what you want";
162
- var plainHint = (hint) => hint.replace(/^[<[]\s*|\s*[>\]]$/g, "").trim();
163
- function skillToWorkflow(skill) {
164
- const hint = plainHint((skill.arg_hint ?? "").trim());
165
- const inputs = [
166
- {
167
- name: "args",
168
- type: "longtext",
169
- label: SKILL_PROMPT_LABEL,
170
- placeholder: hint || SKILL_PROMPT_FALLBACK_PLACEHOLDER,
171
- required: true
172
- }
173
- ];
174
- return {
175
- id: skill.slug,
176
- skill: skill.slug,
177
- title: skill.name || skill.slug,
178
- description: skill.description ?? "",
179
- inputs,
180
- run: { kind: "prompt", promptTemplate: `/${skill.slug} {{args}}` },
181
- landing: "chat",
182
- schedulable: true
183
- };
184
- }
185
- var FIELD_TYPES = [
186
- "text",
187
- "longtext",
188
- "boolean",
189
- "select",
190
- "number",
191
- "date",
192
- "scope",
193
- "documents"
194
- ];
195
- var str = (v) => typeof v === "string" ? v : void 0;
196
- var num = (v) => typeof v === "number" ? v : void 0;
197
- var bool = (v) => typeof v === "boolean" ? v : void 0;
198
- function fieldFromFrontmatter(raw) {
199
- if (typeof raw !== "object" || raw === null) return null;
200
- const r = raw;
201
- const name = str(r.name);
202
- const type = FIELD_TYPES.find((t) => t === r.type);
203
- if (!name || !/^[a-z][a-z0-9_]*$/.test(name) || !type) return null;
204
- const options = Array.isArray(r.options) ? r.options.flatMap((o) => {
205
- const ro = o;
206
- const value = str(ro?.value);
207
- const label = str(ro?.label);
208
- return value && label ? [
209
- {
210
- value,
211
- label,
212
- description: str(ro.description),
213
- text: str(ro.text),
214
- icon: str(ro.icon)
215
- }
216
- ] : [];
217
- }) : void 0;
218
- return {
219
- name,
220
- type,
221
- label: str(r.label) ?? name,
222
- description: str(r.description),
223
- placeholder: str(r.placeholder),
224
- required: bool(r.required),
225
- default: r.default,
226
- options,
227
- min: num(r.min),
228
- max: num(r.max),
229
- trueText: str(r.true_text),
230
- falseText: str(r.false_text),
231
- advanced: bool(r.advanced),
232
- accept: r.accept === "image" ? "image" : void 0,
233
- context: r.context === "documents" || r.context === "selection" || r.context === "image" ? r.context : void 0,
234
- by: Array.isArray(r.by) ? r.by.filter((b) => b === "folders" || b === "labels") : void 0
235
- };
236
- }
237
- function workflowFromFrontmatter(id, frontmatter, body) {
238
- const inputs = Array.isArray(frontmatter.inputs) ? frontmatter.inputs.flatMap((f) => {
239
- const field = fieldFromFrontmatter(f);
240
- return field ? [field] : [];
241
- }) : [];
242
- return {
243
- id,
244
- title: str(frontmatter.name) ?? id,
245
- description: str(frontmatter.description) ?? "",
246
- icon: str(frontmatter.icon),
247
- inputs,
248
- run: { kind: "prompt", promptTemplate: body.trim() },
249
- landing: frontmatter.landing === "files" ? "files" : "chat",
250
- requiresFiles: bool(frontmatter.requires_files),
251
- schedulable: bool(frontmatter.schedulable) ?? true
252
- };
253
- }
254
- var DEFAULT_SCHEMA_FORM_LABELS = {
255
- optional: "(optional)",
256
- advanced: "More options",
257
- errors: {
258
- required: "This is needed to continue",
259
- min: "Too small",
260
- max: "Too large",
261
- number: "Enter a number"
262
- }
263
- };
264
- var TILE_MAX = 4;
265
- function FieldControl({
266
- field,
267
- value,
268
- error,
269
- onChange,
270
- l,
271
- idFor,
272
- renderScope,
273
- renderDocuments,
274
- renderIcon,
275
- onEnterSubmit
276
- }) {
277
- const id = `${idFor()}-control`;
278
- const testId = idFor();
279
- switch (field.type) {
280
- case "text":
281
- return /* @__PURE__ */ jsx(
282
- Input,
283
- {
284
- id,
285
- "data-testid": testId,
286
- value: String(value ?? ""),
287
- placeholder: field.placeholder,
288
- "aria-required": field.required || void 0,
289
- "aria-invalid": error ? true : void 0,
290
- "aria-describedby": error ? idFor("error") : void 0,
291
- onChange: (e) => onChange(e.target.value)
292
- }
293
- );
294
- case "longtext":
295
- return /* @__PURE__ */ jsx(
296
- Textarea,
297
- {
298
- id,
299
- "data-testid": testId,
300
- value: String(value ?? ""),
301
- placeholder: field.placeholder,
302
- "aria-required": field.required || void 0,
303
- "aria-invalid": error ? true : void 0,
304
- "aria-describedby": error ? idFor("error") : void 0,
305
- className: "min-h-[96px]",
306
- onChange: (e) => onChange(e.target.value),
307
- onKeyDown: (e) => {
308
- if (onEnterSubmit && e.key === "Enter" && !e.shiftKey && !e.nativeEvent.isComposing) {
309
- e.preventDefault();
310
- onEnterSubmit();
311
- }
312
- }
313
- }
314
- );
315
- case "number":
316
- return /* @__PURE__ */ jsx(
317
- Input,
318
- {
319
- id,
320
- "data-testid": testId,
321
- type: "number",
322
- inputMode: "decimal",
323
- min: field.min,
324
- max: field.max,
325
- value: value === void 0 ? "" : String(value),
326
- placeholder: field.placeholder,
327
- "aria-invalid": error ? true : void 0,
328
- "aria-describedby": error ? idFor("error") : void 0,
329
- onChange: (e) => onChange(e.target.value === "" ? "" : Number(e.target.value))
330
- }
331
- );
332
- case "date":
333
- return /* @__PURE__ */ jsx(
334
- Input,
335
- {
336
- id,
337
- "data-testid": testId,
338
- type: "date",
339
- value: String(value ?? ""),
340
- "aria-invalid": error ? true : void 0,
341
- "aria-describedby": error ? idFor("error") : void 0,
342
- onChange: (e) => onChange(e.target.value)
343
- }
344
- );
345
- case "boolean":
346
- return /* @__PURE__ */ jsx(
347
- Switch,
348
- {
349
- id,
350
- "data-testid": testId,
351
- checked: Boolean(value),
352
- onCheckedChange: (checked) => onChange(checked)
353
- }
354
- );
355
- case "select": {
356
- const options = field.options ?? [];
357
- if (options.length > 0 && options.length <= TILE_MAX) {
358
- return /* @__PURE__ */ jsx(
359
- "div",
360
- {
361
- role: "radiogroup",
362
- "aria-label": field.label,
363
- className: "grid grid-cols-2 gap-2 sm:grid-cols-4",
364
- "data-testid": testId,
365
- children: options.map((option) => {
366
- const selected = value === option.value;
367
- return /* @__PURE__ */ jsxs(
368
- "button",
369
- {
370
- type: "button",
371
- role: "radio",
372
- "aria-checked": selected,
373
- "data-testid": prefixedTestId(testId, option.value, {
374
- testId: `workflow-field-${field.name}-${option.value}`
375
- }),
376
- onClick: () => {
377
- onChange(option.value);
378
- },
379
- className: cn(
380
- "flex min-h-24 flex-col items-center justify-center gap-1.5 rounded-lg border p-3 text-center transition-colors pointer-coarse:min-h-28 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
381
- selected ? "border-primary bg-primary/10" : "border-border bg-card [&:hover]:border-primary [&:hover]:bg-muted"
382
- ),
383
- children: [
384
- option.icon && renderIcon && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: renderIcon(option.icon) }),
385
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-foreground", children: option.label }),
386
- option.description && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: option.description })
387
- ]
388
- },
389
- option.value
390
- );
391
- })
392
- }
393
- );
394
- }
395
- return /* @__PURE__ */ jsxs(Select, { value: String(value ?? ""), onValueChange: (v) => onChange(v), children: [
396
- /* @__PURE__ */ jsx(SelectTrigger, { id, "data-testid": testId, className: "pointer-coarse:min-h-11", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: field.placeholder }) }),
397
- /* @__PURE__ */ jsx(SelectContent, { children: options.map((o) => /* @__PURE__ */ jsx(SelectItem, { value: o.value, children: o.label }, o.value)) })
398
- ] });
399
- }
400
- case "scope": {
401
- const scope = isWorkflowScope(value) ? value : { folders: [], labels: [] };
402
- return /* @__PURE__ */ jsx("div", { "data-testid": testId, children: renderScope?.(field, scope, onChange) });
403
- }
404
- case "documents": {
405
- const picked = isWorkflowScope(value) ? value : { folders: [], labels: [], documents: [] };
406
- return /* @__PURE__ */ jsx("div", { "data-testid": testId, children: renderDocuments?.(field, picked, onChange) });
407
- }
408
- }
409
- }
410
- function FormField(props) {
411
- const { field, error, l, idFor } = props;
412
- const isBoolean = field.type === "boolean";
413
- const showOptional = !field.required && field.type !== "boolean" && field.type !== "scope";
414
- const label = /* @__PURE__ */ jsxs(
415
- Label,
416
- {
417
- htmlFor: `${idFor()}-control`,
418
- className: isBoolean ? "cursor-pointer font-normal" : void 0,
419
- children: [
420
- field.label,
421
- showOptional && /* @__PURE__ */ jsxs(Fragment, { children: [
422
- " ",
423
- /* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: l.optional })
424
- ] })
425
- ]
426
- }
427
- );
428
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", "data-slot": "schema-field", "data-field": field.name, children: [
429
- isBoolean ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5 pointer-coarse:min-h-11", children: [
430
- /* @__PURE__ */ jsx(FieldControl, { ...props }),
431
- label
432
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
433
- field.type !== "scope" && label,
434
- /* @__PURE__ */ jsx(FieldControl, { ...props })
435
- ] }),
436
- field.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: field.description }),
437
- error && /* @__PURE__ */ jsx(
438
- "p",
439
- {
440
- id: idFor("error"),
441
- role: "alert",
442
- className: "text-xs text-destructive",
443
- "data-testid": idFor("error"),
444
- children: l.errors[error]
445
- }
446
- )
447
- ] });
448
- }
449
- function SchemaForm({
450
- fields,
451
- values,
452
- onChange,
453
- errors,
454
- renderScope,
455
- renderDocuments,
456
- renderIcon,
457
- onEnterSubmit,
458
- testIdPrefix,
459
- labels,
460
- className
461
- }) {
462
- const l = {
463
- ...DEFAULT_SCHEMA_FORM_LABELS,
464
- ...labels,
465
- errors: { ...DEFAULT_SCHEMA_FORM_LABELS.errors, ...labels?.errors }
466
- };
467
- const [advancedOpen, setAdvancedOpen] = useState(false);
468
- const common = fields.filter((f) => !f.advanced);
469
- const advanced = fields.filter((f) => f.advanced);
470
- const render = (field) => /* @__PURE__ */ jsx(
471
- FormField,
472
- {
473
- field,
474
- value: values[field.name],
475
- error: errors?.[field.name],
476
- onChange: (v) => onChange(field.name, v),
477
- l,
478
- idFor: (suffix) => suffix ? `${testIdOr(testIdPrefix, { testId: "workflow-field" })}-${field.name}-${suffix}` : `${testIdOr(testIdPrefix, { testId: "workflow-field" })}-${field.name}`,
479
- renderScope,
480
- renderDocuments,
481
- renderIcon,
482
- onEnterSubmit
483
- },
484
- field.name
485
- );
486
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", className), "data-slot": "schema-form", children: [
487
- common.map(render),
488
- advanced.length > 0 && /* @__PURE__ */ jsx(
489
- FoldSection,
490
- {
491
- label: l.advanced,
492
- open: advancedOpen,
493
- onOpenChange: setAdvancedOpen,
494
- testId: `${testIdOr(testIdPrefix, { testId: "workflow-field" })}-advanced-toggle`,
495
- children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4", children: advanced.map(render) })
496
- }
497
- )
498
- ] });
499
- }
500
25
  function useControllableState(value, defaultValue, onChange) {
501
26
  const [inner, setInner] = useState(defaultValue);
502
27
  const isControlled = value !== void 0;
@@ -975,6 +500,93 @@ function WorkflowDocumentsField({
975
500
  addFilesAction
976
501
  ] });
977
502
  }
503
+
504
+ // src/agents/workflows/skillMarkdown.ts
505
+ var JSON_KEYS = /* @__PURE__ */ new Set(["inputs"]);
506
+ var oneLine = (text) => text.replace(/\s*\n\s*/g, " ").trim();
507
+ var skillSlug = (raw) => raw.toLowerCase().replace(/[^a-z0-9-]/g, "");
508
+ function workflowToSkillMarkdown(workflow) {
509
+ const { run } = workflow;
510
+ if (run.kind !== "prompt") throw new Error("Only skills that start a chat can be copied");
511
+ const lines = [
512
+ "---",
513
+ `name: ${skillSlug(workflow.id)}`,
514
+ `description: ${oneLine(workflow.description)}`
515
+ ];
516
+ if (workflow.icon) lines.push(`icon: ${workflow.icon}`);
517
+ if (workflow.landing !== "chat") lines.push(`landing: ${workflow.landing}`);
518
+ if (workflow.requiresFiles) lines.push("requires_files: true");
519
+ if (workflow.inputs.length > 0) {
520
+ lines.push(`inputs: ${JSON.stringify(workflow.inputs.map(fieldToFrontmatter))}`);
521
+ }
522
+ lines.push("---", "", run.promptTemplate.trim(), "");
523
+ return lines.join("\n");
524
+ }
525
+ function workflowFromSkillMarkdown(id, text) {
526
+ const match = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(text);
527
+ const frontmatter = {};
528
+ const body = match ? match[2] : text;
529
+ for (const line of (match ? match[1] : "").split("\n")) {
530
+ const i = line.indexOf(":");
531
+ if (i < 1) continue;
532
+ const key = line.slice(0, i).trim();
533
+ const value = line.slice(i + 1).trim();
534
+ if (JSON_KEYS.has(key)) {
535
+ try {
536
+ frontmatter[key] = JSON.parse(value);
537
+ } catch {
538
+ }
539
+ } else if (value === "true" || value === "false") frontmatter[key] = value === "true";
540
+ else frontmatter[key] = value;
541
+ }
542
+ return workflowFromFrontmatter(id, frontmatter, body);
543
+ }
544
+ function useWorkflowPreview(workflow, { answer = "{prompt}", delayMs = 400, resolveWorkflow, compose } = {}) {
545
+ const steps = workflowSteps(workflow);
546
+ const [inputs, setInputs] = useState(() => initialRunInputs(workflow));
547
+ const [states, setStates] = useState({});
548
+ const set = (id, state) => setStates((s) => ({ ...s, [id]: state }));
549
+ const timers = useRef(/* @__PURE__ */ new Map());
550
+ useEffect(() => {
551
+ const pending = timers.current;
552
+ return () => {
553
+ for (const t of pending.values()) clearTimeout(t);
554
+ pending.clear();
555
+ setStates(
556
+ (s) => Object.fromEntries(
557
+ Object.entries(s).map(([id, v]) => [
558
+ id,
559
+ v.status === "running" ? { status: "pending" } : v
560
+ ])
561
+ )
562
+ );
563
+ };
564
+ }, []);
565
+ useEffect(() => {
566
+ if (Object.values(states).some((s) => s.status === "running")) return;
567
+ const next = steps.find((s) => s.kind === "agent" && stepPhase(steps, states, s.id) === "ready");
568
+ if (!next || next.kind !== "agent") return;
569
+ const prompt = composeStepPrompt(workflow, next, inputs, { resolveWorkflow, compose });
570
+ set(next.id, { status: "running", startedAt: (/* @__PURE__ */ new Date()).toISOString() });
571
+ timers.current.set(
572
+ next.id,
573
+ setTimeout(() => {
574
+ timers.current.delete(next.id);
575
+ set(next.id, { status: "done", text: answer.replace("{prompt}", prompt) });
576
+ }, delayMs)
577
+ );
578
+ }, [states, steps, workflow]);
579
+ return useWorkflowView({
580
+ steps,
581
+ states,
582
+ inputs,
583
+ setInput: (name, value) => setInputs((i) => ({ ...i, [name]: value })),
584
+ complete: async (step) => set(step.id, { status: "done" }),
585
+ skip: async (id) => set(id, { status: "skipped" }),
586
+ retry: async (id) => set(id, { status: "pending" }),
587
+ isLocked: (id) => states[id]?.status === "done"
588
+ });
589
+ }
978
590
  var DEFAULT_AGENT_CARD_LABELS = {
979
591
  running: "Running",
980
592
  runningIndicator: "Running",
@@ -6593,7 +6205,11 @@ var ICONS = {
6593
6205
  artifact_edited: /* @__PURE__ */ jsx(MessageSquareReply, { className: "size-3.5", "aria-hidden": true }),
6594
6206
  document_added: /* @__PURE__ */ jsx(Sparkles, { className: "size-3.5", "aria-hidden": true }),
6595
6207
  document_removed: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3.5", "aria-hidden": true }),
6596
- notified: /* @__PURE__ */ jsx(UserRoundCog, { className: "size-3.5", "aria-hidden": true })
6208
+ notified: /* @__PURE__ */ jsx(UserRoundCog, { className: "size-3.5", "aria-hidden": true }),
6209
+ step_started: /* @__PURE__ */ jsx(Play, { className: "size-3.5", "aria-hidden": true }),
6210
+ step_done: /* @__PURE__ */ jsx(CheckCircle2, { className: "size-3.5", "aria-hidden": true }),
6211
+ step_skipped: /* @__PURE__ */ jsx(RotateCcw, { className: "size-3.5", "aria-hidden": true }),
6212
+ step_failed: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3.5", "aria-hidden": true })
6597
6213
  };
6598
6214
  var asString = (v) => typeof v === "string" && v.trim() ? v : null;
6599
6215
  function summarizeError(error) {
@@ -6632,6 +6248,17 @@ function TaskActivityTimeline({
6632
6248
  return { headline: "Removed a document" };
6633
6249
  case "notified":
6634
6250
  return { headline: "Sent a notification" };
6251
+ case "step_started":
6252
+ return { headline: "Step started" };
6253
+ case "step_done":
6254
+ return { headline: "Step done" };
6255
+ case "step_skipped":
6256
+ return { headline: "Step skipped" };
6257
+ case "step_failed":
6258
+ return {
6259
+ headline: "Step failed",
6260
+ extra: asString(detail.error) ? l.failureLine(summarizeError(String(detail.error))) : void 0
6261
+ };
6635
6262
  case "created":
6636
6263
  return { headline: detail.from_workflow ? l.createdFromWorkflow : l.created };
6637
6264
  case "run_started":
@@ -6831,8 +6458,163 @@ function ThreadActivity({ item, children }) {
6831
6458
  }
6832
6459
  ) });
6833
6460
  }
6461
+ var STEP_KINDS = /* @__PURE__ */ new Set(["step_started", "step_done", "step_skipped", "step_failed"]);
6462
+ function groupThreadActivity(steps, items) {
6463
+ const out = { before: [], byStep: {}, after: [] };
6464
+ const states = {};
6465
+ let current;
6466
+ for (const item of items) {
6467
+ if (item.kind && STEP_KINDS.has(item.kind) && item.step) {
6468
+ current = item.step;
6469
+ states[item.step] = {
6470
+ status: item.kind === "step_started" ? "running" : item.kind === "step_done" ? "done" : item.kind === "step_skipped" ? "skipped" : "failed"
6471
+ };
6472
+ continue;
6473
+ }
6474
+ if (current === void 0) out.before.push(item);
6475
+ else if (isRunFinished(steps, states)) out.after.push(item);
6476
+ else {
6477
+ const status = states[current]?.status;
6478
+ const at = status === "done" || status === "skipped" ? steps.find((s) => !["done", "skipped"].includes(states[s.id]?.status ?? ""))?.id ?? current : current;
6479
+ (out.byStep[at] ??= []).push(item);
6480
+ }
6481
+ }
6482
+ return out;
6483
+ }
6484
+ var DEFAULT_WORKFLOW_THREAD_STRIP_LABELS = {
6485
+ happened: "{count} in this step",
6486
+ nothingYet: "Nothing here yet.",
6487
+ skip: "Skip this step"
6488
+ };
6489
+ function Mark({ phase, icon }) {
6490
+ if (phase === "done") return /* @__PURE__ */ jsx(Check, { className: "size-3.5" });
6491
+ if (phase === "running") return /* @__PURE__ */ jsx(Loader2, { className: "size-3.5 animate-spin" });
6492
+ if (phase === "failed") return /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3.5" });
6493
+ if (phase === "skipped") return /* @__PURE__ */ jsx(MinusCircle, { className: "size-3.5" });
6494
+ return icon ? /* @__PURE__ */ jsx("span", { className: "flex size-3.5 items-center justify-center [&_svg]:size-3.5", children: icon }) : /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-current" });
6495
+ }
6496
+ function Entry({ item }) {
6497
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
6498
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", children: item.avatar }),
6499
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 text-left", children: [
6500
+ /* @__PURE__ */ jsx("span", { className: "block max-w-40 truncate text-[11px] font-medium leading-tight", children: item.label }),
6501
+ /* @__PURE__ */ jsx(
6502
+ "span",
6503
+ {
6504
+ className: "block text-[10px] leading-tight text-muted-foreground",
6505
+ title: item.exactTime,
6506
+ children: item.time
6507
+ }
6508
+ )
6509
+ ] })
6510
+ ] });
6511
+ return item.onSelect ? /* @__PURE__ */ jsx(
6512
+ "button",
6513
+ {
6514
+ type: "button",
6515
+ onClick: item.onSelect,
6516
+ className: "flex w-full items-center gap-1.5 rounded-md px-1 py-0.5 hover:bg-accent",
6517
+ "data-testid": `thread-flow-${item.id}`,
6518
+ children: content
6519
+ }
6520
+ ) : /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1.5 px-1 py-0.5", "data-testid": `thread-flow-${item.id}`, children: content });
6521
+ }
6522
+ function WorkflowThreadStrip({
6523
+ steps,
6524
+ states,
6525
+ items,
6526
+ renderIcon,
6527
+ onSkip,
6528
+ renderStepAction,
6529
+ labels,
6530
+ className
6531
+ }) {
6532
+ const l = { ...DEFAULT_WORKFLOW_THREAD_STRIP_LABELS, ...labels };
6533
+ const grouped = groupThreadActivity(steps, items);
6534
+ const chevron = /* @__PURE__ */ jsx(ChevronRight, { className: "size-3 shrink-0 text-muted-foreground" });
6535
+ return /* @__PURE__ */ jsx(
6536
+ "div",
6537
+ {
6538
+ className: cn("min-w-0 flex-1 overflow-x-auto overscroll-x-contain", className),
6539
+ role: "region",
6540
+ "aria-label": "Workflow steps",
6541
+ "data-testid": "workflow-thread-strip",
6542
+ children: /* @__PURE__ */ jsxs("ol", { className: "flex w-max min-w-full items-center gap-1", children: [
6543
+ grouped.before.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex shrink-0 items-center gap-1", children: [
6544
+ /* @__PURE__ */ jsx(Entry, { item }),
6545
+ chevron
6546
+ ] }, item.id)),
6547
+ steps.map((step, i) => {
6548
+ const phase = stepPhase(steps, states, step.id);
6549
+ const happened = grouped.byStep[step.id] ?? [];
6550
+ const chip = /* @__PURE__ */ jsxs(
6551
+ "span",
6552
+ {
6553
+ className: cn(
6554
+ "flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2 py-0.5 text-xs font-medium",
6555
+ phase === "running" || phase === "ready" ? "border-primary bg-primary/10 text-primary" : phase === "done" || phase === "skipped" ? "border-primary/30 text-primary" : phase === "failed" ? "border-destructive/40 text-destructive" : "border-dashed border-border text-muted-foreground"
6556
+ ),
6557
+ "data-phase": phase,
6558
+ "data-testid": `workflow-thread-step-${step.id}`,
6559
+ children: [
6560
+ /* @__PURE__ */ jsx(
6561
+ Mark,
6562
+ {
6563
+ phase,
6564
+ icon: step.icon && renderIcon ? renderIcon(step.icon) : void 0
6565
+ }
6566
+ ),
6567
+ step.title,
6568
+ happened.length > 0 && /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5 text-[10px] text-muted-foreground", children: happened.length })
6569
+ ]
6570
+ }
6571
+ );
6572
+ return /* @__PURE__ */ jsxs("li", { className: "flex shrink-0 items-center gap-1", children: [
6573
+ /* @__PURE__ */ jsxs(Popover, { children: [
6574
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx("button", { type: "button", className: "rounded-full", children: chip }) }),
6575
+ /* @__PURE__ */ jsxs(
6576
+ PopoverContent,
6577
+ {
6578
+ align: "start",
6579
+ className: "w-72 space-y-1 p-2",
6580
+ "data-testid": `workflow-thread-step-${step.id}-menu`,
6581
+ children: [
6582
+ /* @__PURE__ */ jsx("p", { className: "px-1 text-xs font-medium text-muted-foreground", children: happened.length ? l.happened.replace("{count}", String(happened.length)) : l.nothingYet }),
6583
+ happened.map((item) => /* @__PURE__ */ jsx(Entry, { item }, item.id)),
6584
+ renderStepAction?.(step, phase),
6585
+ onSkip && ["ready", "blocked", "failed"].includes(phase) && /* @__PURE__ */ jsx(
6586
+ "button",
6587
+ {
6588
+ type: "button",
6589
+ onClick: () => onSkip(step.id),
6590
+ className: "w-full rounded-md px-1 py-1 text-left text-xs text-muted-foreground hover:bg-accent",
6591
+ "data-testid": `workflow-thread-step-${step.id}-skip`,
6592
+ children: l.skip
6593
+ }
6594
+ )
6595
+ ]
6596
+ }
6597
+ )
6598
+ ] }),
6599
+ (i < steps.length - 1 || grouped.after.length > 0) && chevron
6600
+ ] }, step.id);
6601
+ }),
6602
+ grouped.after.map((item, i) => /* @__PURE__ */ jsxs("li", { className: "flex shrink-0 items-center gap-1", children: [
6603
+ /* @__PURE__ */ jsx(Entry, { item }),
6604
+ i < grouped.after.length - 1 && chevron
6605
+ ] }, item.id))
6606
+ ] })
6607
+ }
6608
+ );
6609
+ }
6834
6610
 
6835
6611
  // src/agents/tasks/compact-thread-activity.ts
6612
+ var STEP_LABELS = {
6613
+ step_started: "Step started",
6614
+ step_done: "Step done",
6615
+ step_skipped: "Step skipped",
6616
+ step_failed: "Step failed"
6617
+ };
6836
6618
  function compactThreadActivity(events) {
6837
6619
  const result = [];
6838
6620
  const batches = /* @__PURE__ */ new Map();
@@ -6854,6 +6636,8 @@ function compactThreadActivity(events) {
6854
6636
  entry.recipients.push(event.to_ext_id);
6855
6637
  const count = Math.max(1, entry.recipients.length);
6856
6638
  entry.label = `Notified ${count} ${count === 1 ? "user" : "users"}`;
6639
+ } else if (STEP_LABELS[event.kind]) {
6640
+ result.push({ event, label: STEP_LABELS[event.kind], recipients: [] });
6857
6641
  } else if (["artifact_created", "artifact_edited", "document_added", "document_removed"].includes(
6858
6642
  event.kind
6859
6643
  )) {
@@ -10117,6 +9901,6 @@ function AgentCreateView({
10117
9901
  ] });
10118
9902
  }
10119
9903
 
10120
- export { AgentAvatarField, AgentBar, AgentBarIconButton, AgentBarMenu, AgentBarNotes, AgentBarProbeAnswer, AgentBarQueuedNote, AgentBarStatus, AgentCard, AgentCreateView, AgentCreatedView, AgentCreator, AgentEditView, AgentGallery, AgentMainView, AgentSelect, AgentTypeSelector, CapabilityGrid, CapabilityTile, ConfigField, ConfigForm, ConsentActions, ConsentBulletList, ConsentCard, ConsentFootnote, ConsentHeader, ConsentMessage, ConsentNotice, ConsentPage, ConsentPermissionList, ConsentSection, ConsentStrong, ConsentText, ConversationListView, ConversationTurnSpeaker, CopyableUrl, DEFAULT_AGENT_AVATAR_FIELD_LABELS, DEFAULT_AGENT_BAR_LABELS, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_CREATOR_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_AGENT_SELECT_LABELS, DEFAULT_AGENT_STEPS_LABELS, DEFAULT_AGENT_TYPE_SELECTOR_LABELS, DEFAULT_AUTHORIZE_AGENT_LABELS, DEFAULT_CONFIG_FIELD_LABELS, DEFAULT_CONFIG_FORM_LABELS, DEFAULT_CONSENT_ACTIONS_LABELS, DEFAULT_COPYABLE_URL_LABELS, DEFAULT_NEW_THREAD_DIALOG_LABELS, DEFAULT_PILL_SELECT_LABELS, DEFAULT_RECURRENCE, DEFAULT_RECURRENCE_BUILDER_LABELS, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_SKILL_CARD_LABELS, DEFAULT_SKILL_EDIT_FORM_LABELS, DEFAULT_SKILL_GENERATE_FORM_LABELS, DEFAULT_SKILL_GLOBAL_BADGE_LABELS, DEFAULT_SKILL_ROW_LABELS, DEFAULT_SKILL_VIEW_TOGGLE_LABELS, DEFAULT_SUBAGENT_ROSTER_LABELS, DEFAULT_TASKS_CHROME_LABELS, DEFAULT_TASK_ACTIVITY_LABELS, DEFAULT_TASK_COMPOSER_LABELS, DEFAULT_TASK_LIST_LABELS, DEFAULT_TASK_OUTPUTS_CELL_LABELS, DEFAULT_TASK_PLAN_LABELS, DEFAULT_TASK_RUNS_DIALOG_LABELS, DEFAULT_TASK_STATUS_PILL_LABELS, DEFAULT_TASK_THREAD_CHIP_LABELS, DEFAULT_TASK_TRIGGER_CHIP_LABELS, DEFAULT_TUPLE_ARRAY_FIELD_LABELS, DEFAULT_UPLOAD_TASK_ITEM_LABELS, DEFAULT_UPLOAD_TASK_LIST_LABELS, DEFAULT_WORKFLOWS_CHROME_LABELS, DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, DEFAULT_WORKFLOW_LIST_LABELS, DERIVED_NAME_WORDS, EMPTY_NEW_THREAD, EMPTY_WORKFLOW_SCOPE, EntityChip, GoalCriteria, MAX_TASK_DEPTH, NewThreadDialog, PersonPill, PillSelect, RecurrenceBuilder, SKILL_PROMPT_FALLBACK_PLACEHOLDER, SKILL_PROMPT_LABEL, STATUS_LABELS, STATUS_ORDER, STATUS_TONE, SchemaForm, SkillActionButton, SkillCard, SkillDetail, SkillDetailSection, SkillEditForm, SkillFilterChips, SkillGenerateForm, SkillGlobalBadge, SkillRow, SkillTile, SkillTypeBadge, SkillViewToggle, StepDetail, StepNarration, StepOutcome, StepParams, StepRow, StepSummary, StepTrace, StepTraceSummary, SubAgentLane, SubStepGroup, SubagentRoster, TASK_COLUMN_ORDER, TRIGGER_LABELS, TaskActivityDialog, TaskActivityTimeline, TaskComposer, TaskFlow, TaskInbox, TaskMoveDialog, TaskOutputsCell, TaskPlan, TaskRunsDialog, TaskStartDialog, TaskStatusPill, TaskTable, TaskThreadChip, TaskTriggerChip, TasksToolbar, ThreadActivity, ThreadNotifyDialog, TupleArrayField, UploadTaskItem, UploadTaskList, WEEKDAYS, WORKFLOW_COLUMN_ORDER, WorkflowConfigDialog, WorkflowDocumentsField, WorkflowLauncher, WorkflowsTable, WorkflowsToolbar, agentConfigSectionToValues, agentCreatorToConfigSection, asTaskStatus, authModeFor, buildLaunch, buildRRule, buildTaskRows, buildWorkflowScopeSource, compactThreadActivity, composePersona, composeWorkflowPrompt, composerToTaskQuery, composerToWorkRequest, composerToWorkflowRequest, composerToWorkflowUpdate, createTaskColumns, createWorkflowColumns, createsWork, defaultInputs, defaultScopeRenderer, defaultTaskComposerValues, deriveAgentName, deriveWorkflowName, descendantIds, describeRRule, filterConversationRows, firstWords, formatElapsed, goalProgress, hasTaskFields, hasTrigger, humanizeSection, indexTasks, inferType, inputDocumentIds, inputsFromContext, isAgenticWorkflow, isEmptyWorkflowScope, isOutOfBounds, isPlainTodo, isSkillRow, isValidAgentName, isWorkflowScope, isoToLocalInput, localInputToIso, matchWorkflowScope, moveTargets, newThreadToRequest, nextCriterionId, ownerExtId, parseRRule, prettifyKey, promptFieldName, resolveScopeInputs, skillToWorkflow, stripPersonaPreamble, summarizeAgent, summarizeCapabilities, taskComposerToCreateRequest, taskComposerToUpdateRequest, taskNeedsAccess, taskToComposerValues, validateInputs, workflowAccepts, workflowFromFrontmatter, workflowStatus, workflowTaskFields, workflowToComposerValues, workflowTriggerType, workflowWhen, workflowsAccepting, workflowsForHost };
10121
- //# sourceMappingURL=chunk-IMC2Z32C.js.map
10122
- //# sourceMappingURL=chunk-IMC2Z32C.js.map
9904
+ export { AgentAvatarField, AgentBar, AgentBarIconButton, AgentBarMenu, AgentBarNotes, AgentBarProbeAnswer, AgentBarQueuedNote, AgentBarStatus, AgentCard, AgentCreateView, AgentCreatedView, AgentCreator, AgentEditView, AgentGallery, AgentMainView, AgentSelect, AgentTypeSelector, CapabilityGrid, CapabilityTile, ConfigField, ConfigForm, ConsentActions, ConsentBulletList, ConsentCard, ConsentFootnote, ConsentHeader, ConsentMessage, ConsentNotice, ConsentPage, ConsentPermissionList, ConsentSection, ConsentStrong, ConsentText, ConversationListView, ConversationTurnSpeaker, CopyableUrl, DEFAULT_AGENT_AVATAR_FIELD_LABELS, DEFAULT_AGENT_BAR_LABELS, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_CREATOR_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_AGENT_SELECT_LABELS, DEFAULT_AGENT_STEPS_LABELS, DEFAULT_AGENT_TYPE_SELECTOR_LABELS, DEFAULT_AUTHORIZE_AGENT_LABELS, DEFAULT_CONFIG_FIELD_LABELS, DEFAULT_CONFIG_FORM_LABELS, DEFAULT_CONSENT_ACTIONS_LABELS, DEFAULT_COPYABLE_URL_LABELS, DEFAULT_NEW_THREAD_DIALOG_LABELS, DEFAULT_PILL_SELECT_LABELS, DEFAULT_RECURRENCE, DEFAULT_RECURRENCE_BUILDER_LABELS, DEFAULT_SKILL_CARD_LABELS, DEFAULT_SKILL_EDIT_FORM_LABELS, DEFAULT_SKILL_GENERATE_FORM_LABELS, DEFAULT_SKILL_GLOBAL_BADGE_LABELS, DEFAULT_SKILL_ROW_LABELS, DEFAULT_SKILL_VIEW_TOGGLE_LABELS, DEFAULT_SUBAGENT_ROSTER_LABELS, DEFAULT_TASKS_CHROME_LABELS, DEFAULT_TASK_ACTIVITY_LABELS, DEFAULT_TASK_COMPOSER_LABELS, DEFAULT_TASK_LIST_LABELS, DEFAULT_TASK_OUTPUTS_CELL_LABELS, DEFAULT_TASK_PLAN_LABELS, DEFAULT_TASK_RUNS_DIALOG_LABELS, DEFAULT_TASK_STATUS_PILL_LABELS, DEFAULT_TASK_THREAD_CHIP_LABELS, DEFAULT_TASK_TRIGGER_CHIP_LABELS, DEFAULT_TUPLE_ARRAY_FIELD_LABELS, DEFAULT_UPLOAD_TASK_ITEM_LABELS, DEFAULT_UPLOAD_TASK_LIST_LABELS, DEFAULT_WORKFLOWS_CHROME_LABELS, DEFAULT_WORKFLOW_CONFIG_DIALOG_LABELS, DEFAULT_WORKFLOW_LIST_LABELS, DEFAULT_WORKFLOW_THREAD_STRIP_LABELS, DERIVED_NAME_WORDS, EMPTY_NEW_THREAD, EntityChip, GoalCriteria, MAX_TASK_DEPTH, NewThreadDialog, PersonPill, PillSelect, RecurrenceBuilder, STATUS_LABELS, STATUS_ORDER, STATUS_TONE, SkillActionButton, SkillCard, SkillDetail, SkillDetailSection, SkillEditForm, SkillFilterChips, SkillGenerateForm, SkillGlobalBadge, SkillRow, SkillTile, SkillTypeBadge, SkillViewToggle, StepDetail, StepNarration, StepOutcome, StepParams, StepRow, StepSummary, StepTrace, StepTraceSummary, SubAgentLane, SubStepGroup, SubagentRoster, TASK_COLUMN_ORDER, TRIGGER_LABELS, TaskActivityDialog, TaskActivityTimeline, TaskComposer, TaskFlow, TaskInbox, TaskMoveDialog, TaskOutputsCell, TaskPlan, TaskRunsDialog, TaskStartDialog, TaskStatusPill, TaskTable, TaskThreadChip, TaskTriggerChip, TasksToolbar, ThreadActivity, ThreadNotifyDialog, TupleArrayField, UploadTaskItem, UploadTaskList, WEEKDAYS, WORKFLOW_COLUMN_ORDER, WorkflowConfigDialog, WorkflowDocumentsField, WorkflowLauncher, WorkflowThreadStrip, WorkflowsTable, WorkflowsToolbar, agentConfigSectionToValues, agentCreatorToConfigSection, asTaskStatus, authModeFor, buildRRule, buildTaskRows, buildWorkflowScopeSource, compactThreadActivity, composePersona, composerToTaskQuery, composerToWorkRequest, composerToWorkflowRequest, composerToWorkflowUpdate, createTaskColumns, createWorkflowColumns, createsWork, defaultScopeRenderer, defaultTaskComposerValues, deriveAgentName, deriveWorkflowName, descendantIds, describeRRule, filterConversationRows, firstWords, formatElapsed, goalProgress, groupThreadActivity, hasTaskFields, hasTrigger, humanizeSection, indexTasks, inferType, inputDocumentIds, isAgenticWorkflow, isOutOfBounds, isPlainTodo, isSkillRow, isValidAgentName, isoToLocalInput, localInputToIso, matchWorkflowScope, moveTargets, newThreadToRequest, nextCriterionId, ownerExtId, parseRRule, prettifyKey, resolveScopeInputs, skillSlug, stripPersonaPreamble, summarizeAgent, summarizeCapabilities, taskComposerToCreateRequest, taskComposerToUpdateRequest, taskNeedsAccess, taskToComposerValues, useWorkflowPreview, workflowFromSkillMarkdown, workflowStatus, workflowTaskFields, workflowToComposerValues, workflowToSkillMarkdown, workflowTriggerType, workflowWhen };
9905
+ //# sourceMappingURL=chunk-KOSGX3UK.js.map
9906
+ //# sourceMappingURL=chunk-KOSGX3UK.js.map