@arbidocs/blocks 0.4.134 → 0.4.136

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 (102) hide show
  1. package/dist/agents/index.cjs +354 -306
  2. package/dist/agents/index.js +5 -5
  3. package/dist/agents/skills/index.d.ts +2 -0
  4. package/dist/agents/skills/skillFiles.d.ts +65 -0
  5. package/dist/agents/skills/skillImport.d.ts +36 -0
  6. package/dist/agents/workflows/index.d.ts +1 -1
  7. package/dist/agents/workflows/workflow.d.ts +19 -0
  8. package/dist/calls/index.cjs +3 -3
  9. package/dist/calls/index.js +2 -2
  10. package/dist/chat/index.cjs +138 -138
  11. package/dist/chat/index.js +3 -3
  12. package/dist/{chunk-26E6PHD2.js → chunk-5BXEYYH6.js} +3 -3
  13. package/dist/{chunk-26E6PHD2.js.map → chunk-5BXEYYH6.js.map} +1 -1
  14. package/dist/{chunk-FUTMU4FR.js → chunk-5HFPRI3W.js} +3 -3
  15. package/dist/{chunk-FUTMU4FR.js.map → chunk-5HFPRI3W.js.map} +1 -1
  16. package/dist/{chunk-WV4IDVDQ.cjs → chunk-7YLJHTDC.cjs} +11 -11
  17. package/dist/{chunk-WV4IDVDQ.cjs.map → chunk-7YLJHTDC.cjs.map} +1 -1
  18. package/dist/{chunk-GZPTWHP5.cjs → chunk-C44D4WFG.cjs} +6 -6
  19. package/dist/{chunk-GZPTWHP5.cjs.map → chunk-C44D4WFG.cjs.map} +1 -1
  20. package/dist/{chunk-OPTBQSCV.cjs → chunk-DJM7DLCT.cjs} +3 -3
  21. package/dist/{chunk-OPTBQSCV.cjs.map → chunk-DJM7DLCT.cjs.map} +1 -1
  22. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  23. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  24. package/dist/{chunk-OQ7RUNOC.js → chunk-GFYGYME3.js} +3 -3
  25. package/dist/{chunk-OQ7RUNOC.js.map → chunk-GFYGYME3.js.map} +1 -1
  26. package/dist/{chunk-HW2J4JMV.cjs → chunk-IE5CUCZK.cjs} +8 -8
  27. package/dist/{chunk-HW2J4JMV.cjs.map → chunk-IE5CUCZK.cjs.map} +1 -1
  28. package/dist/{chunk-54ANPPMV.js → chunk-IQU2GI6V.js} +248 -4
  29. package/dist/chunk-IQU2GI6V.js.map +1 -0
  30. package/dist/{chunk-CXLVI3SB.js → chunk-JO3EMZ4X.js} +3 -3
  31. package/dist/{chunk-CXLVI3SB.js.map → chunk-JO3EMZ4X.js.map} +1 -1
  32. package/dist/{chunk-ARDHLU73.cjs → chunk-KDUGTKVI.cjs} +21 -2
  33. package/dist/chunk-KDUGTKVI.cjs.map +1 -0
  34. package/dist/{chunk-4RLCRFZS.js → chunk-L2PAPOZ5.js} +21 -3
  35. package/dist/chunk-L2PAPOZ5.js.map +1 -0
  36. package/dist/{chunk-LC2KJSUS.cjs → chunk-LIHRGG4M.cjs} +302 -45
  37. package/dist/chunk-LIHRGG4M.cjs.map +1 -0
  38. package/dist/{chunk-BMNNT27D.js → chunk-LT2X5N37.js} +7 -48
  39. package/dist/chunk-LT2X5N37.js.map +1 -0
  40. package/dist/{chunk-D4YR56FV.cjs → chunk-N55UIXVT.cjs} +5 -5
  41. package/dist/{chunk-D4YR56FV.cjs.map → chunk-N55UIXVT.cjs.map} +1 -1
  42. package/dist/{chunk-BZF55UCE.cjs → chunk-OAL3B2ZU.cjs} +5 -5
  43. package/dist/{chunk-BZF55UCE.cjs.map → chunk-OAL3B2ZU.cjs.map} +1 -1
  44. package/dist/{chunk-AAFX64WD.cjs → chunk-OR4CO743.cjs} +3 -3
  45. package/dist/{chunk-AAFX64WD.cjs.map → chunk-OR4CO743.cjs.map} +1 -1
  46. package/dist/{chunk-HM23LXUP.cjs → chunk-OWCEQKAR.cjs} +23 -2
  47. package/dist/chunk-OWCEQKAR.cjs.map +1 -0
  48. package/dist/{chunk-QUDCNT63.cjs → chunk-OZLWSNUC.cjs} +66 -110
  49. package/dist/chunk-OZLWSNUC.cjs.map +1 -0
  50. package/dist/{chunk-VW2C2AZL.js → chunk-RUB62J2X.js} +3 -3
  51. package/dist/{chunk-VW2C2AZL.js.map → chunk-RUB62J2X.js.map} +1 -1
  52. package/dist/{chunk-4UMXQPNA.js → chunk-VIU7AMHF.js} +4 -4
  53. package/dist/{chunk-4UMXQPNA.js.map → chunk-VIU7AMHF.js.map} +1 -1
  54. package/dist/{chunk-7HAM7Y5U.js → chunk-Y5KTM3V5.js} +22 -3
  55. package/dist/chunk-Y5KTM3V5.js.map +1 -0
  56. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  57. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  58. package/dist/{chunk-YIF6SVSO.js → chunk-ZNI4SW2G.js} +4 -4
  59. package/dist/{chunk-YIF6SVSO.js.map → chunk-ZNI4SW2G.js.map} +1 -1
  60. package/dist/collaboration/index.cjs +42 -42
  61. package/dist/collaboration/index.js +2 -2
  62. package/dist/connect/docx.cjs +6 -6
  63. package/dist/connect/docx.js +5 -5
  64. package/dist/connect/index.cjs +220 -131
  65. package/dist/connect/index.cjs.map +1 -1
  66. package/dist/connect/index.d.ts +2 -2
  67. package/dist/connect/index.js +142 -58
  68. package/dist/connect/index.js.map +1 -1
  69. package/dist/connection/ConnectedSkillUpload.d.ts +26 -2
  70. package/dist/connection/ConnectedWorkflowBuilder.d.ts +23 -11
  71. package/dist/connection/ConnectionProvider.d.ts +17 -0
  72. package/dist/facts/index.cjs +3 -3
  73. package/dist/facts/index.js +3 -3
  74. package/dist/files/index.cjs +2 -2
  75. package/dist/files/index.js +2 -2
  76. package/dist/home/index.cjs +2 -2
  77. package/dist/home/index.js +2 -2
  78. package/dist/index.cjs +616 -568
  79. package/dist/index.js +12 -12
  80. package/dist/retrieval/index.cjs +1 -1
  81. package/dist/retrieval/index.js +1 -1
  82. package/dist/settings/index.cjs +38 -38
  83. package/dist/settings/index.js +4 -4
  84. package/dist/shell/index.cjs +2 -2
  85. package/dist/shell/index.js +2 -2
  86. package/dist/studio/index.cjs +8 -8
  87. package/dist/studio/index.js +6 -6
  88. package/dist/workflow-canvas/index.cjs +109 -85
  89. package/dist/workflow-canvas/index.cjs.map +1 -1
  90. package/dist/workflow-canvas/index.d.ts +1 -1
  91. package/dist/workflow-canvas/index.js +60 -37
  92. package/dist/workflow-canvas/index.js.map +1 -1
  93. package/node_modules/@arbidocs/coedit/package.json +1 -1
  94. package/package.json +4 -4
  95. package/dist/chunk-4RLCRFZS.js.map +0 -1
  96. package/dist/chunk-54ANPPMV.js.map +0 -1
  97. package/dist/chunk-7HAM7Y5U.js.map +0 -1
  98. package/dist/chunk-ARDHLU73.cjs.map +0 -1
  99. package/dist/chunk-BMNNT27D.js.map +0 -1
  100. package/dist/chunk-HM23LXUP.cjs.map +0 -1
  101. package/dist/chunk-LC2KJSUS.cjs.map +0 -1
  102. package/dist/chunk-QUDCNT63.cjs.map +0 -1
@@ -3,13 +3,14 @@
3
3
 
4
4
  var chunk7D737FLE_cjs = require('./chunk-7D737FLE.cjs');
5
5
  var chunkDETZZBG2_cjs = require('./chunk-DETZZBG2.cjs');
6
- var chunkHM23LXUP_cjs = require('./chunk-HM23LXUP.cjs');
6
+ var chunkOWCEQKAR_cjs = require('./chunk-OWCEQKAR.cjs');
7
7
  var chunk32HW2Q33_cjs = require('./chunk-32HW2Q33.cjs');
8
8
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
9
9
  var react = require('react');
10
10
  var lucideReact = require('lucide-react');
11
11
  var ui = require('@arbidocs/react/ui');
12
12
  var jsxRuntime = require('react/jsx-runtime');
13
+ var fflate = require('fflate');
13
14
 
14
15
  var DEFAULT_SCHEMA_FORM_LABELS = {
15
16
  optional: "(optional)",
@@ -147,11 +148,11 @@ function FieldControl({
147
148
  ] });
148
149
  }
149
150
  case "scope": {
150
- const scope = chunkHM23LXUP_cjs.isWorkflowScope(value) ? value : { folders: [], labels: [] };
151
+ const scope = chunkOWCEQKAR_cjs.isWorkflowScope(value) ? value : { folders: [], labels: [] };
151
152
  return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": testId, children: renderScope?.(field, scope, onChange) });
152
153
  }
153
154
  case "documents": {
154
- const picked = chunkHM23LXUP_cjs.isWorkflowScope(value) ? value : { folders: [], labels: [], documents: [] };
155
+ const picked = chunkOWCEQKAR_cjs.isWorkflowScope(value) ? value : { folders: [], labels: [], documents: [] };
155
156
  return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": testId, children: renderDocuments?.(field, picked, onChange) });
156
157
  }
157
158
  case "person":
@@ -429,7 +430,7 @@ function toStepField(f) {
429
430
  }
430
431
  var compact = (o) => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== void 0 && v !== ""));
431
432
  function placeholders(workflow) {
432
- return Object.fromEntries(chunkHM23LXUP_cjs.runFields(workflow).map((f) => [f.name, `{{${f.name}}}`]));
433
+ return Object.fromEntries(chunkOWCEQKAR_cjs.runFields(workflow).map((f) => [f.name, `{{${f.name}}}`]));
433
434
  }
434
435
  function agentStep(workflow, step, options) {
435
436
  const target = step.workflow ? options.resolveWorkflow?.(step.workflow) : void 0;
@@ -438,11 +439,11 @@ function agentStep(workflow, step, options) {
438
439
  ([, v]) => v !== void 0 && v !== null && v !== ""
439
440
  );
440
441
  const inputs = { ...placeholders(workflow), ...Object.fromEntries(given) };
441
- return { skill: null, inputs: null, prompt: chunkHM23LXUP_cjs.composeStepPrompt(workflow, step, inputs, options) };
442
+ return { skill: null, inputs: null, prompt: chunkOWCEQKAR_cjs.composeStepPrompt(workflow, step, inputs, options) };
442
443
  }
443
444
  function toPlanSteps(workflow, options = {}) {
444
445
  const layout = workflow.run.kind === "steps" ? workflow.run.layout : void 0;
445
- return chunkHM23LXUP_cjs.workflowSteps(workflow).map((step) => {
446
+ return chunkOWCEQKAR_cjs.workflowSteps(workflow).map((step) => {
446
447
  const ui = compact({
447
448
  description: step.description,
448
449
  icon: step.icon,
@@ -469,8 +470,8 @@ function toPlanSteps(workflow, options = {}) {
469
470
  ui,
470
471
  // An unfinished signal (still being typed) is not saved: the server would refuse it.
471
472
  ...step.signals?.some((s) => !isIncompleteSignal(s)) ? { signals: step.signals.filter((s) => !isIncompleteSignal(s)).map(toPlanSignal) } : {},
472
- ...step.assignee && chunkHM23LXUP_cjs.canAssign(step) ? { assignee: toPlanAssignee(step.assignee) } : {},
473
- ...step.remindAfterHours && chunkHM23LXUP_cjs.canAssign(step) ? { remind_after_hours: step.remindAfterHours } : {},
473
+ ...step.assignee && chunkOWCEQKAR_cjs.canAssign(step) ? { assignee: toPlanAssignee(step.assignee) } : {},
474
+ ...step.remindAfterHours && chunkOWCEQKAR_cjs.canAssign(step) ? { remind_after_hours: step.remindAfterHours } : {},
474
475
  // A review's fields are what approving it is checked against (the server's `fields`).
475
476
  ...step.kind === "review" && step.fields?.length ? { fields: step.fields.map(toStepField) } : {},
476
477
  ...step.kind === "action" ? { action: toPlanAction(step.action) } : {},
@@ -571,10 +572,51 @@ function fromStepField(f) {
571
572
  ...f.max != null ? { max: f.max } : {}
572
573
  };
573
574
  }
575
+
576
+ // src/agents/workflows/skillMarkdown.ts
577
+ var JSON_KEYS = /* @__PURE__ */ new Set(["inputs"]);
578
+ var oneLine = (text) => text.replace(/\s*\n\s*/g, " ").trim();
579
+ var skillSlug = (raw) => raw.toLowerCase().replace(/[^a-z0-9-]/g, "");
580
+ function workflowToSkillMarkdown(workflow) {
581
+ const { run } = workflow;
582
+ if (run.kind !== "prompt") throw new Error("Only skills that start a chat can be copied");
583
+ const lines = [
584
+ "---",
585
+ `name: ${skillSlug(workflow.id)}`,
586
+ `description: ${oneLine(workflow.description)}`
587
+ ];
588
+ if (workflow.icon) lines.push(`icon: ${workflow.icon}`);
589
+ if (workflow.landing !== "chat") lines.push(`landing: ${workflow.landing}`);
590
+ if (workflow.requiresFiles) lines.push("requires_files: true");
591
+ if (workflow.inputs.length > 0) {
592
+ lines.push(`inputs: ${JSON.stringify(workflow.inputs.map(chunkOWCEQKAR_cjs.fieldToFrontmatter))}`);
593
+ }
594
+ lines.push("---", "", run.promptTemplate.trim(), "");
595
+ return lines.join("\n");
596
+ }
597
+ function workflowFromSkillMarkdown(id, text) {
598
+ const match = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(text);
599
+ const frontmatter = {};
600
+ const body = match ? match[2] : text;
601
+ for (const line of (match ? match[1] : "").split("\n")) {
602
+ const i = line.indexOf(":");
603
+ if (i < 1) continue;
604
+ const key = line.slice(0, i).trim();
605
+ const value = line.slice(i + 1).trim();
606
+ if (JSON_KEYS.has(key)) {
607
+ try {
608
+ frontmatter[key] = JSON.parse(value);
609
+ } catch {
610
+ }
611
+ } else if (value === "true" || value === "false") frontmatter[key] = value === "true";
612
+ else frontmatter[key] = value;
613
+ }
614
+ return chunkOWCEQKAR_cjs.workflowFromFrontmatter(id, frontmatter, body);
615
+ }
574
616
  var errorMessage = (e) => e instanceof Error ? e.message : typeof e === "string" ? e : "Something went wrong.";
575
617
  function firstOpen(steps, states) {
576
618
  const open = steps.find((s) => !["done", "skipped"].includes(states[s.id]?.status ?? "pending"));
577
- return open?.id ?? (steps.length && chunkHM23LXUP_cjs.isRunFinished(steps, states) ? null : steps[0]?.id ?? null);
619
+ return open?.id ?? (steps.length && chunkOWCEQKAR_cjs.isRunFinished(steps, states) ? null : steps[0]?.id ?? null);
578
620
  }
579
621
  function useWorkflowView(options) {
580
622
  const { steps, states, inputs, setInput, loaded = true } = options;
@@ -614,11 +656,11 @@ function useWorkflowView(options) {
614
656
  }),
615
657
  []
616
658
  );
617
- const action = busy ? "wait" : chunkHM23LXUP_cjs.nextAction(steps, states, current, actionOptions(options));
659
+ const action = busy ? "wait" : chunkOWCEQKAR_cjs.nextAction(steps, states, current, actionOptions(options));
618
660
  const next = react.useCallback(async () => {
619
661
  const { steps: s, states: st, inputs: values } = optionsRef.current;
620
662
  const at = s.find((x) => x.id === current);
621
- const act2 = chunkHM23LXUP_cjs.nextAction(s, st, current, actionOptions(optionsRef.current));
663
+ const act2 = chunkOWCEQKAR_cjs.nextAction(s, st, current, actionOptions(optionsRef.current));
622
664
  if (!at || act2 === "wait" || busy) return;
623
665
  setActionError(null);
624
666
  if (act2 === "finish") return setCurrent(null);
@@ -629,7 +671,7 @@ function useWorkflowView(options) {
629
671
  await (act2 === "start" ? optionsRef.current.start?.() : optionsRef.current.retry?.(at.id));
630
672
  return;
631
673
  }
632
- if (Object.keys(chunkHM23LXUP_cjs.validateStep(at, values)).length > 0) {
674
+ if (Object.keys(chunkOWCEQKAR_cjs.validateStep(at, values)).length > 0) {
633
675
  setShowErrors(true);
634
676
  return;
635
677
  }
@@ -730,10 +772,10 @@ function useWorkflowView(options) {
730
772
  inputs,
731
773
  setInput,
732
774
  stateOf: (id) => states[id],
733
- phaseOf: (id) => chunkHM23LXUP_cjs.stepPhase(steps, states, id),
734
- failedUpstreamOf: (id) => chunkHM23LXUP_cjs.failedUpstream(steps, states, id),
775
+ phaseOf: (id) => chunkOWCEQKAR_cjs.stepPhase(steps, states, id),
776
+ failedUpstreamOf: (id) => chunkOWCEQKAR_cjs.failedUpstream(steps, states, id),
735
777
  isLocked,
736
- errors: showErrors && step && !isLocked(step.id) ? chunkHM23LXUP_cjs.validateStep(step, inputs) : {},
778
+ errors: showErrors && step && !isLocked(step.id) ? chunkOWCEQKAR_cjs.validateStep(step, inputs) : {},
737
779
  busy,
738
780
  actionError,
739
781
  isRunning: Object.values(states).some((s) => s.status === "running"),
@@ -751,11 +793,11 @@ function useWorkflowView(options) {
751
793
  nameOf: options.nameOf,
752
794
  assigneeOf: (id) => {
753
795
  const s = steps.find((x) => x.id === id);
754
- if (!s || !chunkHM23LXUP_cjs.canAssign(s)) return void 0;
755
- return chunkHM23LXUP_cjs.assigneeName(s.assignee, {
796
+ if (!s || !chunkOWCEQKAR_cjs.canAssign(s)) return void 0;
797
+ return chunkOWCEQKAR_cjs.assigneeName(s.assignee, {
756
798
  nameOf: options.nameOf,
757
799
  inputs,
758
- fields: chunkHM23LXUP_cjs.runFieldsOf(steps),
800
+ fields: chunkOWCEQKAR_cjs.runFieldsOf(steps),
759
801
  announcedTo: states[id]?.announcedTo
760
802
  });
761
803
  },
@@ -889,7 +931,7 @@ function StepBarFrame({
889
931
  }) {
890
932
  const l = { ...DEFAULT_STEP_BAR_LABELS, ...labels };
891
933
  const box = react.useRef(null);
892
- const { width } = chunkHM23LXUP_cjs.useElementSize(box);
934
+ const { width } = chunkOWCEQKAR_cjs.useElementSize(box);
893
935
  const narrow = width > 0 && width < NARROW_PX;
894
936
  const [start, setStart] = react.useState(null);
895
937
  react.useEffect(() => setStart(null), [current]);
@@ -956,7 +998,7 @@ function StepBarFrame({
956
998
  phase === "blocked" && "opacity-60"
957
999
  ),
958
1000
  "aria-hidden": true,
959
- children: /* @__PURE__ */ jsxRuntime.jsx(chunkHM23LXUP_cjs.StepBadgeMark, { phase, icon: icon?.(s) })
1001
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkOWCEQKAR_cjs.StepBadgeMark, { phase, icon: icon?.(s) })
960
1002
  }
961
1003
  ),
962
1004
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", title: s.title, children: s.title }),
@@ -1064,7 +1106,7 @@ function StepBarFrame({
1064
1106
  };
1065
1107
  const running = win.runningHidden;
1066
1108
  const outOfViewChip = (s, kind) => /* @__PURE__ */ jsxRuntime.jsx(
1067
- chunkHM23LXUP_cjs.StepChip,
1109
+ chunkOWCEQKAR_cjs.StepChip,
1068
1110
  {
1069
1111
  kind: kindOf(s),
1070
1112
  phase: kind === "working" ? "running" : "failed",
@@ -1237,7 +1279,7 @@ var DEFAULT_WORKFLOW_STEP_PARTS_LABELS = {
1237
1279
  someone: "someone"
1238
1280
  };
1239
1281
  var docName = (ref, nameOfDoc) => {
1240
- const { id, version } = chunkHM23LXUP_cjs.splitDocRef(ref);
1282
+ const { id, version } = chunkOWCEQKAR_cjs.splitDocRef(ref);
1241
1283
  const name = nameOfDoc?.(id) ?? id;
1242
1284
  return version ? `${name} \xB7 v${version}` : name;
1243
1285
  };
@@ -1319,7 +1361,7 @@ function SendBackControl({
1319
1361
  const states = Object.fromEntries(
1320
1362
  run.steps.map((s) => [s.id, run.stateOf(s.id) ?? { status: "pending" }])
1321
1363
  );
1322
- const targets = chunkHM23LXUP_cjs.sendBackTargets(run.steps, states, step.id);
1364
+ const targets = chunkOWCEQKAR_cjs.sendBackTargets(run.steps, states, step.id);
1323
1365
  const [open, setOpen] = react.useState(false);
1324
1366
  const [to, setTo] = react.useState(targets[0]?.id ?? "");
1325
1367
  const [note, setNote] = react.useState("");
@@ -1409,7 +1451,7 @@ function ApprovalEvidence({
1409
1451
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex flex-wrap items-center gap-1.5 text-sm font-medium", children: [
1410
1452
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ShieldCheck, { className: "size-4 text-primary" }),
1411
1453
  approver ? l.approvedBy.replace("{name}", approver) : null,
1412
- state.at && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: l.approvedAt.replace("{date}", chunkHM23LXUP_cjs.formatDate(state.at)) })
1454
+ state.at && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: l.approvedAt.replace("{date}", chunkOWCEQKAR_cjs.formatDate(state.at)) })
1413
1455
  ] }),
1414
1456
  evidence.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1415
1457
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: l.approvedWhat }),
@@ -1442,7 +1484,7 @@ function ApprovalEvidence({
1442
1484
  ] }),
1443
1485
  (step.fields ?? []).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs", children: (step.fields ?? []).map((f) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "contents", children: [
1444
1486
  /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "text-muted-foreground", children: f.label }),
1445
- /* @__PURE__ */ jsxRuntime.jsx("dd", { "data-testid": `${testId}-evidence-field-${f.name}`, children: chunkHM23LXUP_cjs.shownValue(run.inputs[f.name], f, run.nameOf) })
1487
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { "data-testid": `${testId}-evidence-field-${f.name}`, children: chunkOWCEQKAR_cjs.shownValue(run.inputs[f.name], f, run.nameOf) })
1446
1488
  ] }, f.name)) })
1447
1489
  ] });
1448
1490
  }
@@ -1538,7 +1580,7 @@ function ActionStepBody({
1538
1580
  waiting?.expires_at && phase === "waiting" && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
1539
1581
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "size-3.5" }),
1540
1582
  " ",
1541
- l.expires.replace("{date}", chunkHM23LXUP_cjs.formatDate(waiting.expires_at))
1583
+ l.expires.replace("{date}", chunkOWCEQKAR_cjs.formatDate(waiting.expires_at))
1542
1584
  ] }),
1543
1585
  phase === "waiting" && mine && !declining && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
1544
1586
  actions?.sign && state && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1696,7 +1738,7 @@ function WorkflowStepBar({
1696
1738
  const name = `${title} (${l.phases[phase]})`;
1697
1739
  if (s.id === DONE)
1698
1740
  return /* @__PURE__ */ jsxRuntime.jsx(
1699
- chunkHM23LXUP_cjs.StepChip,
1741
+ chunkOWCEQKAR_cjs.StepChip,
1700
1742
  {
1701
1743
  inert: true,
1702
1744
  kind: "start",
@@ -1710,17 +1752,17 @@ function WorkflowStepBar({
1710
1752
  "data-testid": tid("step-done")
1711
1753
  }
1712
1754
  );
1713
- const kind = chunkHM23LXUP_cjs.stepKindOf(s);
1714
- const KindIcon = chunkHM23LXUP_cjs.STEP_KIND_ICONS[kind];
1755
+ const kind = chunkOWCEQKAR_cjs.stepKindOf(s);
1756
+ const KindIcon = chunkOWCEQKAR_cjs.STEP_KIND_ICONS[kind];
1715
1757
  return /* @__PURE__ */ jsxRuntime.jsx(
1716
- chunkHM23LXUP_cjs.StepChip,
1758
+ chunkOWCEQKAR_cjs.StepChip,
1717
1759
  {
1718
1760
  kind,
1719
1761
  phase,
1720
1762
  icon: icon(s.icon) ?? /* @__PURE__ */ jsxRuntime.jsx(KindIcon, {}),
1721
1763
  label: s.title,
1722
1764
  current: isCurrent,
1723
- heading: chunkHM23LXUP_cjs.DEFAULT_STEP_KIND_LABELS[kind],
1765
+ heading: chunkOWCEQKAR_cjs.DEFAULT_STEP_KIND_LABELS[kind],
1724
1766
  labelClassName: isCurrent ? STEP_LABEL_CURRENT : ui.cn(STEP_LABEL, STEP_LABEL_MAX),
1725
1767
  labelTestId: tid(`step-${s.id}-label`),
1726
1768
  onClick: () => run.goTo(s.id),
@@ -1753,7 +1795,7 @@ function WorkflowStepBar({
1753
1795
  isSelectable: (id) => id !== DONE,
1754
1796
  renderStep: (s) => pill(s),
1755
1797
  icon: (s) => s.id === DONE ? doneIcon : icon(s.icon),
1756
- kindOf: (s) => s.id === DONE ? "start" : chunkHM23LXUP_cjs.stepKindOf(s),
1798
+ kindOf: (s) => s.id === DONE ? "start" : chunkOWCEQKAR_cjs.stepKindOf(s),
1757
1799
  disabled: run.busy,
1758
1800
  labels,
1759
1801
  tid,
@@ -1836,7 +1878,7 @@ function WorkflowRunner({
1836
1878
  const { steps, step, isComplete, action } = run;
1837
1879
  const completion = workflow.run.kind === "steps" ? workflow.run.completion : void 0;
1838
1880
  const tid = (suffix) => `${testIdPrefix}-${suffix}`;
1839
- const levels = chunkHM23LXUP_cjs.stepLevels(steps);
1881
+ const levels = chunkOWCEQKAR_cjs.stepLevels(steps);
1840
1882
  const icon = (key) => key && renderIcon ? renderIcon(key) : void 0;
1841
1883
  const added = step?.kind === "upload" ? (files ?? []).filter((f) => f.addedFor === step.id) : [];
1842
1884
  const unread = added.filter((f) => f.status === "processing").length;
@@ -1844,7 +1886,7 @@ function WorkflowRunner({
1844
1886
  const sending = added.filter((f) => f.status === "uploading").length;
1845
1887
  const unsent = added.filter((f) => f.status === "upload-failed").length;
1846
1888
  const uploadHold = step?.kind === "upload" && (sending > 0 || uploading || unsent > 0);
1847
- const docsWait = !!step && chunkHM23LXUP_cjs.waitingDocuments(run.stateOf(step.id)).length > 0;
1889
+ const docsWait = !!step && chunkOWCEQKAR_cjs.waitingDocuments(run.stateOf(step.id)).length > 0;
1848
1890
  const nextLabel = sending ? sending === 1 ? l.uploadingFile : l.uploadingFiles.replace("{count}", String(sending)) : uploadHold && uploading ? l.uploadingAny : uploadHold ? unsent === 1 ? l.uploadFailed : l.uploadsFailed.replace("{count}", String(unsent)) : reading ? l.readingFiles.replace("{current}", String(Math.min(added.length - unread + 1, added.length))).replace("{count}", String(added.length)) : action === "start" ? l.start : action === "retry" ? l.retry : action === "finish" ? l.finish : action === "complete" && step?.kind === "review" ? l.approve : action === "complete" && step?.kind === "action" ? l.markSent : action === "wait" && (run.isRunning || run.busy || docsWait) ? l.working : (step && !run.isLocked(step.id) ? step.nextLabel : void 0) ?? l.next;
1849
1891
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn(compact2 ? "space-y-3" : "space-y-6", className), "data-testid": testIdPrefix, children: [
1850
1892
  !hideStepBar && /* @__PURE__ */ jsxRuntime.jsx(
@@ -1876,7 +1918,7 @@ function WorkflowRunner({
1876
1918
  /* @__PURE__ */ jsxRuntime.jsx(StepNotices, { run, step, l, tid }),
1877
1919
  run.phaseOf(step.id) === "blocked" ? /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { className: ui.cn(box, "p-6"), "data-testid": tid(step.id), children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", "data-testid": tid(`${step.id}-blocked`), children: l.blocked.replace(
1878
1920
  "{steps}",
1879
- chunkHM23LXUP_cjs.stepDependencies(steps, step.id).map((d) => steps.find((s) => s.id === d)?.title ?? d).join(", ")
1921
+ chunkOWCEQKAR_cjs.stepDependencies(steps, step.id).map((d) => steps.find((s) => s.id === d)?.title ?? d).join(", ")
1880
1922
  ) }) }) : step.kind === "form" ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Card, { className: ui.cn(box, "space-y-4"), "data-testid": tid(step.id), children: [
1881
1923
  /* @__PURE__ */ jsxRuntime.jsx(StepHeading, { step, icon: icon(step.icon), testId: tid(`${step.id}-title`) }),
1882
1924
  /* @__PURE__ */ jsxRuntime.jsx(SentBackNote, { state: run.stateOf(step.id), l: pl, testId: tid(step.id) }),
@@ -1932,7 +1974,7 @@ function WorkflowRunner({
1932
1974
  ] }) : step.kind === "review" ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Card, { className: ui.cn(box, "space-y-4"), "data-testid": tid(step.id), children: [
1933
1975
  /* @__PURE__ */ jsxRuntime.jsx(StepHeading, { step, icon: icon(step.icon) }),
1934
1976
  /* @__PURE__ */ jsxRuntime.jsx(SentBackNote, { state: run.stateOf(step.id), l: pl, testId: tid(step.id) }),
1935
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "whitespace-pre-line text-sm text-muted-foreground", children: chunkHM23LXUP_cjs.reviewInstructions(step, run.inputs) }),
1977
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "whitespace-pre-line text-sm text-muted-foreground", children: chunkOWCEQKAR_cjs.reviewInstructions(step, run.inputs) }),
1936
1978
  /* @__PURE__ */ jsxRuntime.jsx(AssigneeLine, { run, stepId: step.id, l: pl, testId: tid(step.id) }),
1937
1979
  !(run.phaseOf(step.id) === "done" && run.stateOf(step.id)?.by) && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", "data-testid": tid(`${step.id}-status`), children: run.phaseOf(step.id) === "done" ? l.approved : run.phaseOf(step.id) === "skipped" ? l.skipped : l.awaitingReview }),
1938
1980
  (step.fields ?? []).length > 0 && run.phaseOf(step.id) === "ready" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -2199,8 +2241,8 @@ function AgentStepBody({
2199
2241
  }) {
2200
2242
  const state = run.stateOf(step.id);
2201
2243
  const phase = run.phaseOf(step.id);
2202
- const pending = chunkHM23LXUP_cjs.waitingDocuments(state);
2203
- const pendingNames = pending.flatMap((ref) => nameOfDoc?.(chunkHM23LXUP_cjs.splitDocRef(ref).id) ?? []);
2244
+ const pending = chunkOWCEQKAR_cjs.waitingDocuments(state);
2245
+ const pendingNames = pending.flatMap((ref) => nameOfDoc?.(chunkOWCEQKAR_cjs.splitDocRef(ref).id) ?? []);
2204
2246
  const header = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
2205
2247
  /* @__PURE__ */ jsxRuntime.jsx(StepHeading, { step, icon }),
2206
2248
  phase === "failed" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-2", children: run.retry && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2285,7 +2327,7 @@ function StepNotices({
2285
2327
  l,
2286
2328
  tid
2287
2329
  }) {
2288
- const notStarted = !chunkHM23LXUP_cjs.isPersonStep(step) && run.needsStart && run.phaseOf(step.id) === "ready";
2330
+ const notStarted = !chunkOWCEQKAR_cjs.isPersonStep(step) && run.needsStart && run.phaseOf(step.id) === "ready";
2289
2331
  const failed = run.failedUpstreamOf(step.id);
2290
2332
  if (!notStarted && failed.length === 0) return null;
2291
2333
  const why = (error) => error ? `: ${error}` : "";
@@ -2321,6 +2363,208 @@ function StepNotices({
2321
2363
  ))
2322
2364
  ] });
2323
2365
  }
2366
+
2367
+ // src/agents/skills/skillFiles.ts
2368
+ var SKILL_TYPES = ["markdown", "python", "shell", "javascript", "typescript"];
2369
+ var SKILL_MAIN_FILENAME = "SKILL.md";
2370
+ var MAIN_NAMES = /* @__PURE__ */ new Set(["skill.md", "skill.py", "skill.sh", "skill.js", "skill.ts"]);
2371
+ function isMainSkillFile(filename, skillName) {
2372
+ const lower = filename.toLowerCase();
2373
+ if (MAIN_NAMES.has(lower)) return true;
2374
+ const stem = lower.includes(".") ? lower.slice(0, lower.lastIndexOf(".")) : lower;
2375
+ return stem === skillName;
2376
+ }
2377
+ function detectTypeFromContent(content, filename) {
2378
+ if (filename) {
2379
+ const lower = filename.toLowerCase();
2380
+ if (lower.endsWith(".py")) return "python";
2381
+ if (lower.endsWith(".sh")) return "shell";
2382
+ if (lower.endsWith(".js")) return "javascript";
2383
+ if (lower.endsWith(".ts")) return "typescript";
2384
+ }
2385
+ if (content) {
2386
+ const firstLine = content.split("\n", 1)[0].trim();
2387
+ if (firstLine.startsWith("#!")) {
2388
+ if (firstLine.includes("python")) return "python";
2389
+ if (firstLine.includes("bash") || firstLine.includes("/sh")) return "shell";
2390
+ if (firstLine.includes("ts-node")) return "typescript";
2391
+ if (firstLine.includes("node")) return "javascript";
2392
+ }
2393
+ }
2394
+ return "markdown";
2395
+ }
2396
+ function parseSkillFrontmatter(raw, filename = "") {
2397
+ const config = {};
2398
+ let name = "";
2399
+ let description = "";
2400
+ let skillType = "markdown";
2401
+ if (!raw.startsWith("---")) {
2402
+ return {
2403
+ content: raw,
2404
+ name,
2405
+ description,
2406
+ config,
2407
+ skillType: detectTypeFromContent(raw, filename)
2408
+ };
2409
+ }
2410
+ const end = raw.indexOf("---", 3);
2411
+ if (end === -1) {
2412
+ return {
2413
+ content: raw,
2414
+ name,
2415
+ description,
2416
+ config,
2417
+ skillType: detectTypeFromContent(raw, filename)
2418
+ };
2419
+ }
2420
+ const frontmatter = raw.slice(3, end).trim();
2421
+ const body = raw.slice(end + 3).trim();
2422
+ for (const rawLine of frontmatter.split("\n")) {
2423
+ const line = rawLine.trim();
2424
+ if (!line || !line.includes(":")) continue;
2425
+ const idx = line.indexOf(":");
2426
+ const key = line.slice(0, idx).trim().toLowerCase();
2427
+ const value = line.slice(idx + 1).trim();
2428
+ if (key === "name" && value) {
2429
+ name = value;
2430
+ } else if (key === "description" && value) {
2431
+ description = value;
2432
+ } else if (key === "model" && value) {
2433
+ config.model = value;
2434
+ } else if (key === "temperature") {
2435
+ const t = Number.parseFloat(value);
2436
+ if (!Number.isNaN(t) && t >= 0 && t <= 2) config.temperature = t;
2437
+ } else if (key === "agent") {
2438
+ config.agent = ["true", "yes", "1"].includes(value.toLowerCase());
2439
+ } else if (key === "tools" && value) {
2440
+ config.tools = value.split(",").map((t) => t.trim()).filter(Boolean);
2441
+ } else if (key === "type" && value) {
2442
+ const v = value.toLowerCase();
2443
+ if (v === "python" || v === "py") skillType = "python";
2444
+ else if (v === "shell" || v === "sh" || v === "bash") skillType = "shell";
2445
+ else if (v === "javascript" || v === "js" || v === "node") skillType = "javascript";
2446
+ else if (v === "typescript" || v === "ts") skillType = "typescript";
2447
+ }
2448
+ }
2449
+ if (skillType === "markdown") {
2450
+ skillType = detectTypeFromContent(body, filename);
2451
+ }
2452
+ return { content: body, name, description, config, skillType };
2453
+ }
2454
+ function serializeSkill(input) {
2455
+ const lines = ["---", `name: ${input.name}`, `description: ${input.description}`];
2456
+ if (input.type && input.type !== "markdown") {
2457
+ lines.push(`type: ${input.type}`);
2458
+ }
2459
+ lines.push("---", "", input.body.trim(), "");
2460
+ return lines.join("\n");
2461
+ }
2462
+ var SKILL_FOLDER_PREFIX = "skills/";
2463
+ function stripExt(name) {
2464
+ const i = name.lastIndexOf(".");
2465
+ return i > 0 ? name.slice(0, i) : name;
2466
+ }
2467
+ function isJunkPath(path) {
2468
+ if (path.endsWith("/")) return true;
2469
+ const parts = path.split("/");
2470
+ if (parts.some((p) => p === "__MACOSX")) return true;
2471
+ return parts[parts.length - 1].startsWith(".");
2472
+ }
2473
+ function folderFor(slug, relDir) {
2474
+ const root = `${SKILL_FOLDER_PREFIX}${slug}`;
2475
+ return relDir ? `${root}/${relDir}` : root;
2476
+ }
2477
+ function importMarkdownSkill(fileName, text) {
2478
+ const parsed = parseSkillFrontmatter(text, fileName);
2479
+ const slug = skillSlug(parsed.name) || skillSlug(stripExt(fileName));
2480
+ if (!slug) {
2481
+ throw new Error(
2482
+ "Could not derive a skill name. Add a `name:` to the frontmatter or rename the file."
2483
+ );
2484
+ }
2485
+ return {
2486
+ slug,
2487
+ entries: [{ folder: folderFor(slug, ""), fileName: SKILL_MAIN_FILENAME, content: text }]
2488
+ };
2489
+ }
2490
+ function commonTopDir(paths) {
2491
+ const tops = /* @__PURE__ */ new Set();
2492
+ for (const p of paths) {
2493
+ const idx = p.indexOf("/");
2494
+ if (idx === -1) return null;
2495
+ tops.add(p.slice(0, idx));
2496
+ }
2497
+ return tops.size === 1 ? [...tops][0] : null;
2498
+ }
2499
+ function buildZipSkillImport(archiveName, rawEntries) {
2500
+ const entries = rawEntries.filter((e) => e.path && !isJunkPath(e.path));
2501
+ if (entries.length === 0) throw new Error("The archive contains no importable skill files.");
2502
+ const top = commonTopDir(entries.map((e) => e.path));
2503
+ const rel = (p) => top ? p.slice(top.length + 1) : p;
2504
+ let slug = top ? skillSlug(top) : "";
2505
+ if (!slug) {
2506
+ const mainGuess = entries.find((e) => {
2507
+ const r = rel(e.path);
2508
+ return !r.includes("/") && isMainSkillFile(r, "__never__");
2509
+ }) ?? entries.find((e) => !rel(e.path).includes("/"));
2510
+ if (mainGuess) slug = skillSlug(parseSkillFrontmatter(mainGuess.text, rel(mainGuess.path)).name);
2511
+ }
2512
+ if (!slug) slug = skillSlug(stripExt(archiveName));
2513
+ if (!slug) throw new Error("Could not derive a skill name from the archive.");
2514
+ const rootFiles = entries.filter((e) => !rel(e.path).includes("/"));
2515
+ const mainEntry = rootFiles.find((e) => isMainSkillFile(rel(e.path), slug)) ?? (rootFiles.length === 1 ? rootFiles[0] : void 0);
2516
+ return {
2517
+ slug,
2518
+ entries: entries.map((e) => {
2519
+ const r = rel(e.path);
2520
+ const lastSlash = r.lastIndexOf("/");
2521
+ return {
2522
+ folder: folderFor(slug, lastSlash === -1 ? "" : r.slice(0, lastSlash)),
2523
+ fileName: mainEntry && e.path === mainEntry.path ? SKILL_MAIN_FILENAME : lastSlash === -1 ? r : r.slice(lastSlash + 1),
2524
+ content: e.text
2525
+ };
2526
+ })
2527
+ };
2528
+ }
2529
+ async function readSkillArchive(file) {
2530
+ const data = new Uint8Array(await file.arrayBuffer());
2531
+ let files;
2532
+ try {
2533
+ files = await new Promise(
2534
+ (resolve, reject) => fflate.unzip(
2535
+ data,
2536
+ { filter: (f) => !isJunkPath(f.name) },
2537
+ (err, out) => err ? reject(err) : resolve(out)
2538
+ )
2539
+ );
2540
+ } catch {
2541
+ throw new Error("The archive is empty or could not be read.");
2542
+ }
2543
+ const entries = Object.entries(files).map(([path, bytes]) => ({ path, text: fflate.strFromU8(bytes) }));
2544
+ if (entries.length === 0) throw new Error("The archive is empty or could not be read.");
2545
+ return entries;
2546
+ }
2547
+ async function importSkillFile(file) {
2548
+ const lower = file.name.toLowerCase();
2549
+ if (lower.endsWith(".zip")) return buildZipSkillImport(file.name, await readSkillArchive(file));
2550
+ if (lower.endsWith(".md") || lower.endsWith(".markdown")) {
2551
+ return importMarkdownSkill(file.name, await file.text());
2552
+ }
2553
+ throw new Error("Unsupported file type. Choose a .md skill or a .zip archive.");
2554
+ }
2555
+ async function importSkillFromUrl(url) {
2556
+ let parsed;
2557
+ try {
2558
+ parsed = new URL(url.trim());
2559
+ } catch {
2560
+ throw new Error("That does not look like a link.");
2561
+ }
2562
+ const response = await fetch(parsed.toString());
2563
+ if (!response.ok) throw new Error(`Could not open the link (${response.status}).`);
2564
+ const text = await response.text();
2565
+ const last = parsed.pathname.split("/").filter(Boolean).pop() ?? "skill";
2566
+ return importMarkdownSkill(last.includes(".") ? last : `${last}.md`, text);
2567
+ }
2324
2568
  var DEFAULT_TASK_ACTIVITY_LABELS = {
2325
2569
  title: "Activity",
2326
2570
  empty: "Nothing has happened yet.",
@@ -2407,12 +2651,12 @@ function taskActivityHeadline(e, labels = DEFAULT_TASK_ACTIVITY_LABELS, agentNam
2407
2651
  case "step_skipped":
2408
2652
  return "Step skipped";
2409
2653
  case "step_waiting": {
2410
- const documents = chunkHM23LXUP_cjs.eventWaitingDocuments(detail);
2411
- return documents ? chunkHM23LXUP_cjs.waitingForDocumentsText(documents.length) : "Waiting on people";
2654
+ const documents = chunkOWCEQKAR_cjs.eventWaitingDocuments(detail);
2655
+ return documents ? chunkOWCEQKAR_cjs.waitingForDocumentsText(documents.length) : "Waiting on people";
2412
2656
  }
2413
2657
  case "step_progress": {
2414
- const documents = chunkHM23LXUP_cjs.eventWaitingDocuments(detail);
2415
- return documents ? chunkHM23LXUP_cjs.waitingForDocumentsText(documents.length) : detail.signed ? "Signed" : "Step moved on";
2658
+ const documents = chunkOWCEQKAR_cjs.eventWaitingDocuments(detail);
2659
+ return documents ? chunkOWCEQKAR_cjs.waitingForDocumentsText(documents.length) : detail.signed ? "Signed" : "Step moved on";
2416
2660
  }
2417
2661
  case "step_sent_back":
2418
2662
  return "Sent the work back";
@@ -2521,6 +2765,8 @@ exports.DEFAULT_STEP_BAR_LABELS = DEFAULT_STEP_BAR_LABELS;
2521
2765
  exports.DEFAULT_TASK_ACTIVITY_LABELS = DEFAULT_TASK_ACTIVITY_LABELS;
2522
2766
  exports.DEFAULT_WORKFLOW_RUNNER_LABELS = DEFAULT_WORKFLOW_RUNNER_LABELS;
2523
2767
  exports.DEFAULT_WORKFLOW_STEP_PARTS_LABELS = DEFAULT_WORKFLOW_STEP_PARTS_LABELS;
2768
+ exports.SKILL_MAIN_FILENAME = SKILL_MAIN_FILENAME;
2769
+ exports.SKILL_TYPES = SKILL_TYPES;
2524
2770
  exports.STEP_LABEL = STEP_LABEL;
2525
2771
  exports.STEP_LABEL_CURRENT = STEP_LABEL_CURRENT;
2526
2772
  exports.STEP_LABEL_MAX = STEP_LABEL_MAX;
@@ -2531,16 +2777,27 @@ exports.TaskActivityTimeline = TaskActivityTimeline;
2531
2777
  exports.WorkflowRunner = WorkflowRunner;
2532
2778
  exports.WorkflowStepBar = WorkflowStepBar;
2533
2779
  exports.activeStepId = activeStepId;
2780
+ exports.buildZipSkillImport = buildZipSkillImport;
2534
2781
  exports.fromPlanAssignee = fromPlanAssignee;
2535
2782
  exports.fromPlanDocumentRef = fromPlanDocumentRef;
2536
2783
  exports.fromPlanSteps = fromPlanSteps;
2784
+ exports.importMarkdownSkill = importMarkdownSkill;
2785
+ exports.importSkillFile = importSkillFile;
2786
+ exports.importSkillFromUrl = importSkillFromUrl;
2537
2787
  exports.isIncompleteSignal = isIncompleteSignal;
2788
+ exports.isMainSkillFile = isMainSkillFile;
2538
2789
  exports.layoutFromPlanSteps = layoutFromPlanSteps;
2790
+ exports.parseSkillFrontmatter = parseSkillFrontmatter;
2791
+ exports.readSkillArchive = readSkillArchive;
2792
+ exports.serializeSkill = serializeSkill;
2793
+ exports.skillSlug = skillSlug;
2539
2794
  exports.stepWindow = stepWindow;
2540
2795
  exports.taskActivityHeadline = taskActivityHeadline;
2541
2796
  exports.toPlanAssignee = toPlanAssignee;
2542
2797
  exports.toPlanDocumentRef = toPlanDocumentRef;
2543
2798
  exports.toPlanSteps = toPlanSteps;
2544
2799
  exports.useWorkflowView = useWorkflowView;
2545
- //# sourceMappingURL=chunk-LC2KJSUS.cjs.map
2546
- //# sourceMappingURL=chunk-LC2KJSUS.cjs.map
2800
+ exports.workflowFromSkillMarkdown = workflowFromSkillMarkdown;
2801
+ exports.workflowToSkillMarkdown = workflowToSkillMarkdown;
2802
+ //# sourceMappingURL=chunk-LIHRGG4M.cjs.map
2803
+ //# sourceMappingURL=chunk-LIHRGG4M.cjs.map