@arbidocs/blocks 0.4.72 → 0.4.73

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 (89) hide show
  1. package/dist/agents/index.cjs +400 -261
  2. package/dist/agents/index.js +6 -3
  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 +70 -0
  7. package/dist/agents/workflows/index.d.ts +7 -1
  8. package/dist/agents/workflows/planSteps.d.ts +28 -0
  9. package/dist/agents/workflows/run.d.ts +97 -0
  10. package/dist/agents/workflows/skillMarkdown.d.ts +15 -0
  11. package/dist/agents/workflows/types.d.ts +109 -0
  12. package/dist/agents/workflows/useWorkflowPreview.d.ts +14 -0
  13. package/dist/agents/workflows/useWorkflowView.d.ts +54 -0
  14. package/dist/agents/workflows/workflow.d.ts +3 -1
  15. package/dist/chunk-2P3T23C7.js +1250 -0
  16. package/dist/chunk-2P3T23C7.js.map +1 -0
  17. package/dist/chunk-7D737FLE.cjs +43 -0
  18. package/dist/chunk-7D737FLE.cjs.map +1 -0
  19. package/dist/{chunk-LFGJAZ5H.js → chunk-DDF5GPIJ.js} +6 -36
  20. package/dist/chunk-DDF5GPIJ.js.map +1 -0
  21. package/dist/chunk-DETZZBG2.cjs +91 -0
  22. package/dist/chunk-DETZZBG2.cjs.map +1 -0
  23. package/dist/chunk-EVUEIBNU.js +89 -0
  24. package/dist/chunk-EVUEIBNU.js.map +1 -0
  25. package/dist/chunk-GTNUQBXI.cjs +1296 -0
  26. package/dist/chunk-GTNUQBXI.cjs.map +1 -0
  27. package/dist/{chunk-DH7C2UJO.cjs → chunk-IUR565UW.cjs} +297 -524
  28. package/dist/chunk-IUR565UW.cjs.map +1 -0
  29. package/dist/{chunk-THO7DZNN.cjs → chunk-MUMH3Z6K.cjs} +20 -15
  30. package/dist/chunk-MUMH3Z6K.cjs.map +1 -0
  31. package/dist/{chunk-KOXUBCLL.js → chunk-ORA2XE7U.js} +3 -3
  32. package/dist/{chunk-KOXUBCLL.js.map → chunk-ORA2XE7U.js.map} +1 -1
  33. package/dist/{chunk-5HOAOKZL.js → chunk-OYMWV45N.js} +21 -16
  34. package/dist/chunk-OYMWV45N.js.map +1 -0
  35. package/dist/{chunk-IMC2Z32C.js → chunk-QDNXEB3T.js} +268 -484
  36. package/dist/chunk-QDNXEB3T.js.map +1 -0
  37. package/dist/{chunk-G5QTGKDJ.cjs → chunk-WOYUXVVQ.cjs} +6 -6
  38. package/dist/{chunk-G5QTGKDJ.cjs.map → chunk-WOYUXVVQ.cjs.map} +1 -1
  39. package/dist/chunk-XD2M6LIG.js +41 -0
  40. package/dist/chunk-XD2M6LIG.js.map +1 -0
  41. package/dist/{chunk-WBDK4PIA.cjs → chunk-Z5VUZ6YD.cjs} +6 -37
  42. package/dist/chunk-Z5VUZ6YD.cjs.map +1 -0
  43. package/dist/connect/docx.cjs +2 -2
  44. package/dist/connect/docx.js +1 -1
  45. package/dist/connect/index.cjs +316 -23
  46. package/dist/connect/index.cjs.map +1 -1
  47. package/dist/connect/index.d.ts +1 -0
  48. package/dist/connect/index.js +300 -8
  49. package/dist/connect/index.js.map +1 -1
  50. package/dist/connection/ConnectedWorkflowBuilder.d.ts +44 -0
  51. package/dist/connection/ConnectedWorkflowRunner.d.ts +27 -0
  52. package/dist/connection/useWorkflowThread.d.ts +34 -0
  53. package/dist/facts/index.cjs +1 -1
  54. package/dist/facts/index.js +1 -1
  55. package/dist/files/index.cjs +9 -83
  56. package/dist/files/index.cjs.map +1 -1
  57. package/dist/files/index.js +6 -83
  58. package/dist/files/index.js.map +1 -1
  59. package/dist/home/index.cjs +22 -21
  60. package/dist/home/index.cjs.map +1 -1
  61. package/dist/home/index.js +4 -3
  62. package/dist/home/index.js.map +1 -1
  63. package/dist/index.cjs +450 -311
  64. package/dist/index.cjs.map +1 -1
  65. package/dist/index.js +7 -4
  66. package/dist/index.js.map +1 -1
  67. package/dist/shell/index.cjs +1 -1
  68. package/dist/shell/index.js +1 -1
  69. package/dist/studio/index.cjs +5 -5
  70. package/dist/studio/index.js +3 -3
  71. package/dist/workflow-canvas/StepInspector.d.ts +46 -0
  72. package/dist/workflow-canvas/TriggerInspector.d.ts +46 -0
  73. package/dist/workflow-canvas/WorkflowBuilder.d.ts +55 -0
  74. package/dist/workflow-canvas/WorkflowCanvas.d.ts +65 -0
  75. package/dist/workflow-canvas/edit.d.ts +54 -0
  76. package/dist/workflow-canvas/index.cjs +1609 -0
  77. package/dist/workflow-canvas/index.cjs.map +1 -0
  78. package/dist/workflow-canvas/index.d.ts +13 -0
  79. package/dist/workflow-canvas/index.js +1579 -0
  80. package/dist/workflow-canvas/index.js.map +1 -0
  81. package/dist/workflow-canvas/trigger.d.ts +51 -0
  82. package/package.json +25 -14
  83. package/src/workflow-canvas/canvas.css +113 -0
  84. package/dist/chunk-5HOAOKZL.js.map +0 -1
  85. package/dist/chunk-DH7C2UJO.cjs.map +0 -1
  86. package/dist/chunk-IMC2Z32C.js.map +0 -1
  87. package/dist/chunk-LFGJAZ5H.js.map +0 -1
  88. package/dist/chunk-THO7DZNN.cjs.map +0 -1
  89. 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-2P3T23C7.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
13
  import { useMentionAutocomplete } from './chunk-3VQYJBOI.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" });
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-QDNXEB3T.js.map
9906
+ //# sourceMappingURL=chunk-QDNXEB3T.js.map