@pasko70/pibo 1.7.3 → 1.7.5
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/README.md +0 -0
- package/context/codex-base-prompt.md +0 -0
- package/context/compute-worker.md +0 -0
- package/context/pibo-compaction-prompt.md +0 -0
- package/context/pibo-native-tooling.md +0 -0
- package/context/pibo-system-prompt.md +0 -0
- package/dist/apps/chat/chat-api-routes.js +14 -0
- package/dist/apps/chat/data/session-query-service.js +66 -3
- package/dist/apps/chat/data/timeline-query-service.js +8 -2
- package/dist/apps/chat/trace.js +63 -4
- package/dist/apps/chat/web-app.js +130 -5
- package/dist/apps/chat/workflow-manual-trigger-runtime.js +223 -0
- package/dist/apps/chat-ui/assets/{dist-CQt6ULIj.js → dist-9reC6CRy.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CESPWSQ-.js → dist-B3s0osfY.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-0VZenZBV.js → dist-BFDieA29.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DnhVsXHZ.js → dist-CD2PBsXa.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BMjRcU4S.js → dist-CKfKOLLy.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BxwcyegP.js → dist-CrBAoz7q.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Ih0wkIep.js → dist-DY6s8EGj.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CjbsWko8.js → dist-Jx6fE2Hb.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DYqe5Zvc.js → dist-TfPabg6A.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DSDqYG1O.js → dist-b5e4NjPA.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Bbb6cmLt.js → dist-kiXdn9N3.js} +1 -1
- package/dist/apps/chat-ui/assets/index-BLY-pTWm.css +1 -0
- package/dist/apps/chat-ui/assets/{index-j2BTjmvp.js → index-DN6wYo-Z.js} +20 -20
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/index.html +2 -2
- package/dist/apps/chat-ui/manifest.webmanifest +0 -0
- package/dist/apps/chat-ui/sw.js +0 -0
- package/dist/apps/chat-vscode-web/assets/index-B4Jk2P5o.js +41 -0
- package/dist/apps/chat-vscode-web/index.html +1 -1
- package/dist/apps/vscode-artifacts/latest.vsix +0 -0
- package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.7.5.vsix +0 -0
- package/dist/bin/pibo.js +0 -0
- package/dist/bin/rg.js +0 -0
- package/dist/data/schema.js +2 -0
- package/dist/plugins/builtin.js +2 -0
- package/dist/ralph/cli.js +2 -1
- package/dist/web/http.js +7 -1
- package/docs/README.md +0 -0
- package/docs/ops/install-developer-host.md +0 -0
- package/docs/ops/install-user-host.md +0 -0
- package/docs/ops/upgrade-user-to-developer-host.md +0 -0
- package/docs/ops/vscode-extension-release.md +0 -0
- package/package.json +1 -1
- package/skills/builtin/graphify/SKILL.md +0 -0
- package/skills/builtin/pi-agent-harness/SKILL.md +0 -0
- package/skills/builtin/pi-agent-harness/agents/openai.yaml +0 -0
- package/skills/builtin/pibo-docker-system/SKILL.md +0 -0
- package/skills/builtin/pibo-spec-writing/SKILL.md +0 -0
- package/skills/builtin/prd/SKILL.md +0 -0
- package/skills/builtin/ralph-loop/SKILL.md +0 -0
- package/skills/builtin/ralph-prd-json/SKILL.md +0 -0
- package/skills/builtin/skill-creator/LICENSE.txt +0 -0
- package/skills/builtin/skill-creator/SKILL.md +0 -0
- package/skills/builtin/skill-creator/agents/analyzer.md +0 -0
- package/skills/builtin/skill-creator/agents/comparator.md +0 -0
- package/skills/builtin/skill-creator/agents/grader.md +0 -0
- package/skills/builtin/skill-creator/assets/eval_review.html +0 -0
- package/skills/builtin/skill-creator/eval-viewer/generate_review.py +0 -0
- package/skills/builtin/skill-creator/eval-viewer/viewer.html +0 -0
- package/skills/builtin/skill-creator/references/schemas.md +0 -0
- package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
- package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +0 -0
- package/skills/builtin/skill-creator/scripts/generate_report.py +0 -0
- package/skills/builtin/skill-creator/scripts/improve_description.py +0 -0
- package/skills/builtin/skill-creator/scripts/package_skill.py +0 -0
- package/skills/builtin/skill-creator/scripts/quick_validate.py +0 -0
- package/skills/builtin/skill-creator/scripts/run_eval.py +0 -0
- package/skills/builtin/skill-creator/scripts/run_loop.py +0 -0
- package/skills/builtin/skill-creator/scripts/utils.py +0 -0
- package/skills/builtin/web-annotations/SKILL.md +0 -0
- package/src/mcp/LICENSE.mcp-cli +0 -0
- package/dist/apps/chat-ui/assets/index-Dz6asKNQ.css +0 -1
- package/dist/apps/chat-vscode-web/assets/index-BHL2ZJCu.js +0 -41
- package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.7.3.vsix +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
export async function runWorkflowManualTextTrigger(options) {
|
|
3
|
+
const diagnostics = validateWorkflowManualTextTrigger(options.definition, options.triggerNodeId, options.input, options.resolveProfile);
|
|
4
|
+
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
|
|
5
|
+
return { ok: false, nodeAttempts: [], edgeTransfers: [], diagnostics, error: { code: "WorkflowRuntimeError.manualTriggerRunBlocked", message: "Manual trigger run was blocked by validation errors." } };
|
|
6
|
+
}
|
|
7
|
+
const now = new Date().toISOString();
|
|
8
|
+
const workflowId = stringValue(options.definition.id) || "workflow";
|
|
9
|
+
const workflowVersion = stringValue(options.definition.version) || "draft";
|
|
10
|
+
const run = {
|
|
11
|
+
id: `wfr_${randomUUID()}`,
|
|
12
|
+
workflowId,
|
|
13
|
+
workflowVersion,
|
|
14
|
+
status: "completed",
|
|
15
|
+
triggerNodeId: options.triggerNodeId,
|
|
16
|
+
input: options.input,
|
|
17
|
+
createdAt: now,
|
|
18
|
+
updatedAt: now,
|
|
19
|
+
};
|
|
20
|
+
const nodeAttempts = [];
|
|
21
|
+
const edgeTransfers = [];
|
|
22
|
+
const triggerAttempt = {
|
|
23
|
+
id: `wna_${randomUUID()}`,
|
|
24
|
+
workflowRunId: run.id,
|
|
25
|
+
nodeId: options.triggerNodeId,
|
|
26
|
+
kind: "trigger",
|
|
27
|
+
status: "completed",
|
|
28
|
+
input: options.input,
|
|
29
|
+
output: options.input,
|
|
30
|
+
startedAt: now,
|
|
31
|
+
completedAt: now,
|
|
32
|
+
};
|
|
33
|
+
nodeAttempts.push(triggerAttempt);
|
|
34
|
+
const queue = [];
|
|
35
|
+
enqueueOutgoingEdges(options.definition, run.id, triggerAttempt, queue, edgeTransfers);
|
|
36
|
+
const executedNodes = new Set();
|
|
37
|
+
let lastOutput = options.input;
|
|
38
|
+
while (queue.length) {
|
|
39
|
+
const pending = queue.shift();
|
|
40
|
+
if (executedNodes.has(pending.nodeId)) {
|
|
41
|
+
const failedAt = new Date().toISOString();
|
|
42
|
+
run.status = "failed";
|
|
43
|
+
run.failedAt = failedAt;
|
|
44
|
+
run.updatedAt = failedAt;
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
run,
|
|
48
|
+
nodeAttempts,
|
|
49
|
+
edgeTransfers,
|
|
50
|
+
diagnostics: [{
|
|
51
|
+
code: "WorkflowRuntimeError.joinUnsupported",
|
|
52
|
+
message: `Workflow node '${pending.nodeId}' received more than one input, but manual trigger V1 does not support joins yet.`,
|
|
53
|
+
severity: "error",
|
|
54
|
+
nodeId: pending.nodeId,
|
|
55
|
+
edgeId: pending.viaEdgeId,
|
|
56
|
+
path: `$.edges.${pending.viaEdgeId}`,
|
|
57
|
+
}],
|
|
58
|
+
error: { code: "WorkflowRuntimeError.joinUnsupported", message: "Manual trigger run failed because a join node was reached." },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
executedNodes.add(pending.nodeId);
|
|
62
|
+
const result = await runAgentNode({ ...options, runId: run.id, nodeId: pending.nodeId, input: pending.input });
|
|
63
|
+
nodeAttempts.push(result.attempt);
|
|
64
|
+
if (!result.ok) {
|
|
65
|
+
const failedAt = new Date().toISOString();
|
|
66
|
+
run.status = "failed";
|
|
67
|
+
run.failedAt = failedAt;
|
|
68
|
+
run.updatedAt = failedAt;
|
|
69
|
+
return { ok: false, run, nodeAttempts, edgeTransfers, diagnostics: result.diagnostics, error: result.attempt.error };
|
|
70
|
+
}
|
|
71
|
+
lastOutput = result.output;
|
|
72
|
+
enqueueOutgoingEdges(options.definition, run.id, result.attempt, queue, edgeTransfers);
|
|
73
|
+
}
|
|
74
|
+
const completedAt = new Date().toISOString();
|
|
75
|
+
run.output = lastOutput;
|
|
76
|
+
run.completedAt = completedAt;
|
|
77
|
+
run.updatedAt = completedAt;
|
|
78
|
+
return { ok: true, run, nodeAttempts, edgeTransfers, diagnostics, output: lastOutput };
|
|
79
|
+
}
|
|
80
|
+
export function validateWorkflowManualTextTrigger(definition, triggerNodeId, input, resolveProfile) {
|
|
81
|
+
const diagnostics = [];
|
|
82
|
+
const nodes = objectValue(definition.nodes);
|
|
83
|
+
const edges = objectValue(definition.edges);
|
|
84
|
+
const trigger = objectValue(nodes?.[triggerNodeId]);
|
|
85
|
+
if (!trigger) {
|
|
86
|
+
diagnostics.push({ code: "WorkflowRuntimeError.unknownTriggerNode", message: `Manual trigger node '${triggerNodeId}' does not exist.`, severity: "error", nodeId: triggerNodeId, path: `$.nodes.${triggerNodeId}` });
|
|
87
|
+
return diagnostics;
|
|
88
|
+
}
|
|
89
|
+
if (trigger.kind !== "trigger")
|
|
90
|
+
diagnostics.push({ code: "WorkflowRuntimeError.triggerNodeRequired", message: `Workflow node '${triggerNodeId}' is not a trigger node.`, severity: "error", nodeId: triggerNodeId, path: `$.nodes.${triggerNodeId}.kind` });
|
|
91
|
+
const triggerConfig = objectValue(trigger.trigger);
|
|
92
|
+
if (triggerConfig?.kind !== "manual")
|
|
93
|
+
diagnostics.push({ code: "WorkflowRuntimeError.manualTriggerRequired", message: `Workflow trigger node '${triggerNodeId}' must use manual trigger kind.`, severity: "error", nodeId: triggerNodeId, path: `$.nodes.${triggerNodeId}.trigger.kind` });
|
|
94
|
+
if (objectValue(trigger.output)?.kind !== "text")
|
|
95
|
+
diagnostics.push({ code: "WorkflowRuntimeError.textTriggerOutputRequired", message: `Workflow trigger node '${triggerNodeId}' must declare a text output port.`, severity: "error", nodeId: triggerNodeId, path: `$.nodes.${triggerNodeId}.output` });
|
|
96
|
+
if (typeof input !== "string")
|
|
97
|
+
diagnostics.push({ code: "WorkflowInterfaceError.textValueExpected", message: "Manual trigger input must be text.", severity: "error", path: "$.input" });
|
|
98
|
+
for (const [edgeId, rawEdge] of Object.entries(edges ?? {})) {
|
|
99
|
+
const edge = objectValue(rawEdge);
|
|
100
|
+
if (!edge)
|
|
101
|
+
continue;
|
|
102
|
+
if (edge.guard)
|
|
103
|
+
diagnostics.push({ code: "WorkflowRuntimeError.edgeGuardUnsupported", message: `Workflow edge '${edgeId}' uses a guard, which manual trigger V1 does not execute yet.`, severity: "error", edgeId, path: `$.edges.${edgeId}.guard` });
|
|
104
|
+
if (edge.adapter)
|
|
105
|
+
diagnostics.push({ code: "WorkflowRuntimeError.edgeAdapterUnsupported", message: `Workflow edge '${edgeId}' uses an adapter, which manual trigger V1 does not execute yet.`, severity: "error", edgeId, path: `$.edges.${edgeId}.adapter` });
|
|
106
|
+
const from = objectValue(edge.from);
|
|
107
|
+
const to = objectValue(edge.to);
|
|
108
|
+
const source = typeof from?.nodeId === "string" ? objectValue(nodes?.[from.nodeId]) : undefined;
|
|
109
|
+
const targetNodeId = typeof to?.nodeId === "string" ? to.nodeId : "";
|
|
110
|
+
const target = targetNodeId ? objectValue(nodes?.[targetNodeId]) : undefined;
|
|
111
|
+
if (!source || !target)
|
|
112
|
+
continue;
|
|
113
|
+
if (source.kind !== "trigger" && source.kind !== "agent")
|
|
114
|
+
continue;
|
|
115
|
+
if (target.kind !== "agent")
|
|
116
|
+
diagnostics.push({ code: "WorkflowRuntimeError.agentTargetRequired", message: `Workflow edge '${edgeId}' targets a non-agent node, which manual trigger V1 does not execute yet.`, severity: "error", edgeId, nodeId: targetNodeId, path: `$.edges.${edgeId}.to.nodeId` });
|
|
117
|
+
const sourceOutput = objectValue(source.output);
|
|
118
|
+
const targetInput = objectValue(target.input);
|
|
119
|
+
if (sourceOutput?.kind && targetInput?.kind && (sourceOutput.kind !== "text" || targetInput.kind !== "text")) {
|
|
120
|
+
diagnostics.push({ code: "WorkflowGraphError.incompatibleEdgePorts", message: `Workflow edge '${edgeId}' must connect text output to text input for manual trigger V1.`, severity: "error", edgeId, path: `$.edges.${edgeId}` });
|
|
121
|
+
}
|
|
122
|
+
if (target.kind === "agent") {
|
|
123
|
+
const profile = objectValue(target.profile);
|
|
124
|
+
const profileId = typeof profile?.id === "string" ? profile.id : "";
|
|
125
|
+
if (!profileId || !resolveProfile(profileId))
|
|
126
|
+
diagnostics.push({ code: "WorkflowRuntimeError.unknownAgentProfile", message: `Agent node '${targetNodeId}' references unavailable profile '${profileId || "<missing>"}'.`, severity: "error", nodeId: targetNodeId, path: `$.nodes.${targetNodeId}.profile.id` });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return diagnostics;
|
|
130
|
+
}
|
|
131
|
+
function enqueueOutgoingEdges(definition, runId, sourceAttempt, queue, transfers) {
|
|
132
|
+
const edges = objectValue(definition.edges) ?? {};
|
|
133
|
+
for (const [edgeId, rawEdge] of Object.entries(edges).sort(([left], [right]) => left.localeCompare(right))) {
|
|
134
|
+
const edge = objectValue(rawEdge);
|
|
135
|
+
const from = objectValue(edge?.from);
|
|
136
|
+
const to = objectValue(edge?.to);
|
|
137
|
+
if (from?.nodeId !== sourceAttempt.nodeId || typeof to?.nodeId !== "string")
|
|
138
|
+
continue;
|
|
139
|
+
const payload = sourceAttempt.output ?? "";
|
|
140
|
+
transfers.push({ id: `wet_${randomUUID()}`, workflowRunId: runId, edgeId, sourceNodeAttemptId: sourceAttempt.id, targetNodeId: to.nodeId, status: "transferred", payload, createdAt: new Date().toISOString() });
|
|
141
|
+
queue.push({ nodeId: to.nodeId, input: payload, viaEdgeId: edgeId, sourceAttemptId: sourceAttempt.id });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function runAgentNode(options) {
|
|
145
|
+
const startedAt = new Date().toISOString();
|
|
146
|
+
const node = objectValue(objectValue(options.definition.nodes)?.[options.nodeId]) ?? {};
|
|
147
|
+
const profileId = stringValue(objectValue(node.profile)?.id) || "base";
|
|
148
|
+
const resolvedProfile = options.resolveProfile(profileId) ?? profileId;
|
|
149
|
+
const attempt = { id: `wna_${randomUUID()}`, workflowRunId: options.runId, nodeId: options.nodeId, kind: "agent", status: "completed", input: options.input, startedAt };
|
|
150
|
+
try {
|
|
151
|
+
const session = options.channelContext.createSession({
|
|
152
|
+
channel: options.channel,
|
|
153
|
+
kind: "workflow-agent",
|
|
154
|
+
profile: resolvedProfile,
|
|
155
|
+
workspace: options.defaultWorkspace,
|
|
156
|
+
title: `${stringValue(options.definition.id) || "Workflow"} · ${stringValue(node.label) || options.nodeId}`,
|
|
157
|
+
metadata: {
|
|
158
|
+
workflowRunId: options.runId,
|
|
159
|
+
workflowRunSource: "manual.editor",
|
|
160
|
+
...(options.draftId ? { workflowDraftId: options.draftId } : {}),
|
|
161
|
+
workflowTriggerNodeId: options.triggerNodeId,
|
|
162
|
+
workflowNodeId: options.nodeId,
|
|
163
|
+
workflowNodeAttemptId: attempt.id,
|
|
164
|
+
workflowNodeLabel: stringValue(node.label) || options.nodeId,
|
|
165
|
+
...(options.actorId ? { actorId: options.actorId } : {}),
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
options.onSessionCreated?.(session);
|
|
169
|
+
attempt.piboSessionId = session.id;
|
|
170
|
+
const prompt = renderPromptTemplate(stringValue(node.promptTemplate) || "{{input}}", options.input);
|
|
171
|
+
const output = await emitMessageAndWaitForAssistant(options.channelContext, session.id, prompt);
|
|
172
|
+
attempt.output = output;
|
|
173
|
+
attempt.completedAt = new Date().toISOString();
|
|
174
|
+
return { ok: true, attempt, output };
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
attempt.status = "failed";
|
|
178
|
+
attempt.failedAt = new Date().toISOString();
|
|
179
|
+
attempt.error = { code: "WorkflowRuntimeError.agentNodeFailed", message: error instanceof Error ? error.message : "Agent node failed with a non-Error value." };
|
|
180
|
+
return { ok: false, attempt, diagnostics: [{ code: attempt.error.code, message: attempt.error.message, severity: "error", nodeId: options.nodeId, path: `$.nodes.${options.nodeId}` }] };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function emitMessageAndWaitForAssistant(channelContext, piboSessionId, text, timeoutMs = 120000) {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
const eventId = `wfm_${randomUUID()}`;
|
|
186
|
+
let settled = false;
|
|
187
|
+
let timeout;
|
|
188
|
+
let unsubscribe = () => { };
|
|
189
|
+
const finish = (value) => {
|
|
190
|
+
if (settled)
|
|
191
|
+
return;
|
|
192
|
+
settled = true;
|
|
193
|
+
clearTimeout(timeout);
|
|
194
|
+
unsubscribe();
|
|
195
|
+
if (value instanceof Error)
|
|
196
|
+
reject(value);
|
|
197
|
+
else
|
|
198
|
+
resolve(value);
|
|
199
|
+
};
|
|
200
|
+
timeout = setTimeout(() => finish(new Error(`Timed out waiting for assistant reply from workflow agent session '${piboSessionId}'.`)), timeoutMs);
|
|
201
|
+
unsubscribe = channelContext.subscribe((event) => {
|
|
202
|
+
if (event.piboSessionId !== piboSessionId)
|
|
203
|
+
return;
|
|
204
|
+
if (event.type === "assistant_message") {
|
|
205
|
+
if (event.eventId === eventId)
|
|
206
|
+
finish(event.text);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (event.type === "session_error" && event.eventId === eventId)
|
|
210
|
+
finish(new Error(event.error));
|
|
211
|
+
});
|
|
212
|
+
channelContext.emit({ type: "message", piboSessionId, id: eventId, text, source: "actor" }).catch(finish);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function renderPromptTemplate(template, input) {
|
|
216
|
+
return template.replace(/{{\s*input\s*}}/g, input);
|
|
217
|
+
}
|
|
218
|
+
function objectValue(value) {
|
|
219
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
|
|
220
|
+
}
|
|
221
|
+
function stringValue(value) {
|
|
222
|
+
return typeof value === "string" ? value : undefined;
|
|
223
|
+
}
|