@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.
- package/dist/agents/index.cjs +354 -306
- package/dist/agents/index.js +5 -5
- package/dist/agents/skills/index.d.ts +2 -0
- package/dist/agents/skills/skillFiles.d.ts +65 -0
- package/dist/agents/skills/skillImport.d.ts +36 -0
- package/dist/agents/workflows/index.d.ts +1 -1
- package/dist/agents/workflows/workflow.d.ts +19 -0
- package/dist/calls/index.cjs +3 -3
- package/dist/calls/index.js +2 -2
- package/dist/chat/index.cjs +138 -138
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-26E6PHD2.js → chunk-5BXEYYH6.js} +3 -3
- package/dist/{chunk-26E6PHD2.js.map → chunk-5BXEYYH6.js.map} +1 -1
- package/dist/{chunk-FUTMU4FR.js → chunk-5HFPRI3W.js} +3 -3
- package/dist/{chunk-FUTMU4FR.js.map → chunk-5HFPRI3W.js.map} +1 -1
- package/dist/{chunk-WV4IDVDQ.cjs → chunk-7YLJHTDC.cjs} +11 -11
- package/dist/{chunk-WV4IDVDQ.cjs.map → chunk-7YLJHTDC.cjs.map} +1 -1
- package/dist/{chunk-GZPTWHP5.cjs → chunk-C44D4WFG.cjs} +6 -6
- package/dist/{chunk-GZPTWHP5.cjs.map → chunk-C44D4WFG.cjs.map} +1 -1
- package/dist/{chunk-OPTBQSCV.cjs → chunk-DJM7DLCT.cjs} +3 -3
- package/dist/{chunk-OPTBQSCV.cjs.map → chunk-DJM7DLCT.cjs.map} +1 -1
- package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
- package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
- package/dist/{chunk-OQ7RUNOC.js → chunk-GFYGYME3.js} +3 -3
- package/dist/{chunk-OQ7RUNOC.js.map → chunk-GFYGYME3.js.map} +1 -1
- package/dist/{chunk-HW2J4JMV.cjs → chunk-IE5CUCZK.cjs} +8 -8
- package/dist/{chunk-HW2J4JMV.cjs.map → chunk-IE5CUCZK.cjs.map} +1 -1
- package/dist/{chunk-54ANPPMV.js → chunk-IQU2GI6V.js} +248 -4
- package/dist/chunk-IQU2GI6V.js.map +1 -0
- package/dist/{chunk-CXLVI3SB.js → chunk-JO3EMZ4X.js} +3 -3
- package/dist/{chunk-CXLVI3SB.js.map → chunk-JO3EMZ4X.js.map} +1 -1
- package/dist/{chunk-ARDHLU73.cjs → chunk-KDUGTKVI.cjs} +21 -2
- package/dist/chunk-KDUGTKVI.cjs.map +1 -0
- package/dist/{chunk-4RLCRFZS.js → chunk-L2PAPOZ5.js} +21 -3
- package/dist/chunk-L2PAPOZ5.js.map +1 -0
- package/dist/{chunk-LC2KJSUS.cjs → chunk-LIHRGG4M.cjs} +302 -45
- package/dist/chunk-LIHRGG4M.cjs.map +1 -0
- package/dist/{chunk-BMNNT27D.js → chunk-LT2X5N37.js} +7 -48
- package/dist/chunk-LT2X5N37.js.map +1 -0
- package/dist/{chunk-D4YR56FV.cjs → chunk-N55UIXVT.cjs} +5 -5
- package/dist/{chunk-D4YR56FV.cjs.map → chunk-N55UIXVT.cjs.map} +1 -1
- package/dist/{chunk-BZF55UCE.cjs → chunk-OAL3B2ZU.cjs} +5 -5
- package/dist/{chunk-BZF55UCE.cjs.map → chunk-OAL3B2ZU.cjs.map} +1 -1
- package/dist/{chunk-AAFX64WD.cjs → chunk-OR4CO743.cjs} +3 -3
- package/dist/{chunk-AAFX64WD.cjs.map → chunk-OR4CO743.cjs.map} +1 -1
- package/dist/{chunk-HM23LXUP.cjs → chunk-OWCEQKAR.cjs} +23 -2
- package/dist/chunk-OWCEQKAR.cjs.map +1 -0
- package/dist/{chunk-QUDCNT63.cjs → chunk-OZLWSNUC.cjs} +66 -110
- package/dist/chunk-OZLWSNUC.cjs.map +1 -0
- package/dist/{chunk-VW2C2AZL.js → chunk-RUB62J2X.js} +3 -3
- package/dist/{chunk-VW2C2AZL.js.map → chunk-RUB62J2X.js.map} +1 -1
- package/dist/{chunk-4UMXQPNA.js → chunk-VIU7AMHF.js} +4 -4
- package/dist/{chunk-4UMXQPNA.js.map → chunk-VIU7AMHF.js.map} +1 -1
- package/dist/{chunk-7HAM7Y5U.js → chunk-Y5KTM3V5.js} +22 -3
- package/dist/chunk-Y5KTM3V5.js.map +1 -0
- package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
- package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
- package/dist/{chunk-YIF6SVSO.js → chunk-ZNI4SW2G.js} +4 -4
- package/dist/{chunk-YIF6SVSO.js.map → chunk-ZNI4SW2G.js.map} +1 -1
- package/dist/collaboration/index.cjs +42 -42
- package/dist/collaboration/index.js +2 -2
- package/dist/connect/docx.cjs +6 -6
- package/dist/connect/docx.js +5 -5
- package/dist/connect/index.cjs +220 -131
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -2
- package/dist/connect/index.js +142 -58
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedSkillUpload.d.ts +26 -2
- package/dist/connection/ConnectedWorkflowBuilder.d.ts +23 -11
- package/dist/connection/ConnectionProvider.d.ts +17 -0
- package/dist/facts/index.cjs +3 -3
- package/dist/facts/index.js +3 -3
- package/dist/files/index.cjs +2 -2
- package/dist/files/index.js +2 -2
- package/dist/home/index.cjs +2 -2
- package/dist/home/index.js +2 -2
- package/dist/index.cjs +616 -568
- package/dist/index.js +12 -12
- package/dist/retrieval/index.cjs +1 -1
- package/dist/retrieval/index.js +1 -1
- package/dist/settings/index.cjs +38 -38
- package/dist/settings/index.js +4 -4
- package/dist/shell/index.cjs +2 -2
- package/dist/shell/index.js +2 -2
- package/dist/studio/index.cjs +8 -8
- package/dist/studio/index.js +6 -6
- package/dist/workflow-canvas/index.cjs +109 -85
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.d.ts +1 -1
- package/dist/workflow-canvas/index.js +60 -37
- package/dist/workflow-canvas/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-4RLCRFZS.js.map +0 -1
- package/dist/chunk-54ANPPMV.js.map +0 -1
- package/dist/chunk-7HAM7Y5U.js.map +0 -1
- package/dist/chunk-ARDHLU73.cjs.map +0 -1
- package/dist/chunk-BMNNT27D.js.map +0 -1
- package/dist/chunk-HM23LXUP.cjs.map +0 -1
- package/dist/chunk-LC2KJSUS.cjs.map +0 -1
- 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
|
|
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 =
|
|
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 =
|
|
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(
|
|
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:
|
|
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
|
|
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 &&
|
|
473
|
-
...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 &&
|
|
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" :
|
|
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 =
|
|
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(
|
|
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) =>
|
|
734
|
-
failedUpstreamOf: (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) ?
|
|
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 || !
|
|
755
|
-
return
|
|
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:
|
|
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 } =
|
|
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(
|
|
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
|
-
|
|
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 } =
|
|
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 =
|
|
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}",
|
|
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:
|
|
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}",
|
|
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
|
-
|
|
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 =
|
|
1714
|
-
const KindIcon =
|
|
1755
|
+
const kind = chunkOWCEQKAR_cjs.stepKindOf(s);
|
|
1756
|
+
const KindIcon = chunkOWCEQKAR_cjs.STEP_KIND_ICONS[kind];
|
|
1715
1757
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1716
|
-
|
|
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:
|
|
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" :
|
|
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 =
|
|
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 &&
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
2203
|
-
const pendingNames = pending.flatMap((ref) => nameOfDoc?.(
|
|
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 = !
|
|
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 =
|
|
2411
|
-
return documents ?
|
|
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 =
|
|
2415
|
-
return documents ?
|
|
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
|
-
|
|
2546
|
-
|
|
2800
|
+
exports.workflowFromSkillMarkdown = workflowFromSkillMarkdown;
|
|
2801
|
+
exports.workflowToSkillMarkdown = workflowToSkillMarkdown;
|
|
2802
|
+
//# sourceMappingURL=chunk-LIHRGG4M.cjs.map
|
|
2803
|
+
//# sourceMappingURL=chunk-LIHRGG4M.cjs.map
|