@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.
Files changed (187) hide show
  1. package/README.md +0 -0
  2. package/context/codex-base-prompt.md +0 -0
  3. package/context/compute-worker.md +0 -0
  4. package/context/pibo-compaction-prompt.md +0 -0
  5. package/context/pibo-native-tooling.md +0 -0
  6. package/context/pibo-system-prompt.md +0 -0
  7. package/dist/apps/chat/chat-api-routes.js +14 -0
  8. package/dist/apps/chat/data/session-query-service.js +66 -3
  9. package/dist/apps/chat/data/timeline-query-service.js +8 -2
  10. package/dist/apps/chat/trace.js +63 -4
  11. package/dist/apps/chat/web-app.js +130 -5
  12. package/dist/apps/chat/workflow-manual-trigger-runtime.js +223 -0
  13. package/dist/apps/chat-ui/assets/{dist-CQt6ULIj.js → dist-9reC6CRy.js} +1 -1
  14. package/dist/apps/chat-ui/assets/{dist-CESPWSQ-.js → dist-B3s0osfY.js} +1 -1
  15. package/dist/apps/chat-ui/assets/{dist-0VZenZBV.js → dist-BFDieA29.js} +1 -1
  16. package/dist/apps/chat-ui/assets/{dist-DnhVsXHZ.js → dist-CD2PBsXa.js} +1 -1
  17. package/dist/apps/chat-ui/assets/{dist-BMjRcU4S.js → dist-CKfKOLLy.js} +1 -1
  18. package/dist/apps/chat-ui/assets/{dist-BxwcyegP.js → dist-CrBAoz7q.js} +1 -1
  19. package/dist/apps/chat-ui/assets/{dist-Ih0wkIep.js → dist-DY6s8EGj.js} +1 -1
  20. package/dist/apps/chat-ui/assets/{dist-CjbsWko8.js → dist-Jx6fE2Hb.js} +1 -1
  21. package/dist/apps/chat-ui/assets/{dist-DYqe5Zvc.js → dist-TfPabg6A.js} +1 -1
  22. package/dist/apps/chat-ui/assets/{dist-DSDqYG1O.js → dist-b5e4NjPA.js} +1 -1
  23. package/dist/apps/chat-ui/assets/{dist-Bbb6cmLt.js → dist-kiXdn9N3.js} +1 -1
  24. package/dist/apps/chat-ui/assets/index-BLY-pTWm.css +1 -0
  25. package/dist/apps/chat-ui/assets/{index-j2BTjmvp.js → index-DN6wYo-Z.js} +20 -20
  26. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
  27. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
  28. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
  29. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
  30. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
  31. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
  32. package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
  33. package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
  34. package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
  35. package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
  36. package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
  37. package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
  38. package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
  39. package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
  40. package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
  41. package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
  42. package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
  43. package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
  44. package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
  45. package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
  46. package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
  47. package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
  48. package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
  49. package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
  50. package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
  51. package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
  52. package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
  53. package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
  54. package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
  55. package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
  56. package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
  57. package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
  58. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
  59. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
  60. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
  61. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
  62. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
  63. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
  64. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
  65. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
  66. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
  67. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
  68. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
  69. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
  70. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
  71. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
  72. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
  73. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
  74. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
  75. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
  76. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
  77. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
  78. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
  79. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
  80. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
  81. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
  82. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
  83. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
  84. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
  85. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
  86. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
  87. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
  88. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
  89. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
  90. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
  91. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
  92. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
  93. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
  94. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
  95. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
  96. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
  97. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
  98. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
  99. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
  100. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
  101. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
  102. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
  103. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
  104. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
  105. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
  106. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
  107. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
  108. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
  109. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
  110. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
  111. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
  112. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
  113. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
  114. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
  115. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
  116. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
  117. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
  118. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
  119. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
  120. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
  121. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
  122. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
  123. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
  124. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
  125. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
  126. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
  127. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
  128. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
  129. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
  130. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
  131. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
  132. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
  133. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
  134. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
  135. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
  136. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
  137. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
  138. package/dist/apps/chat-ui/index.html +2 -2
  139. package/dist/apps/chat-ui/manifest.webmanifest +0 -0
  140. package/dist/apps/chat-ui/sw.js +0 -0
  141. package/dist/apps/chat-vscode-web/assets/index-B4Jk2P5o.js +41 -0
  142. package/dist/apps/chat-vscode-web/index.html +1 -1
  143. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  144. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.7.5.vsix +0 -0
  145. package/dist/bin/pibo.js +0 -0
  146. package/dist/bin/rg.js +0 -0
  147. package/dist/data/schema.js +2 -0
  148. package/dist/plugins/builtin.js +2 -0
  149. package/dist/ralph/cli.js +2 -1
  150. package/dist/web/http.js +7 -1
  151. package/docs/README.md +0 -0
  152. package/docs/ops/install-developer-host.md +0 -0
  153. package/docs/ops/install-user-host.md +0 -0
  154. package/docs/ops/upgrade-user-to-developer-host.md +0 -0
  155. package/docs/ops/vscode-extension-release.md +0 -0
  156. package/package.json +1 -1
  157. package/skills/builtin/graphify/SKILL.md +0 -0
  158. package/skills/builtin/pi-agent-harness/SKILL.md +0 -0
  159. package/skills/builtin/pi-agent-harness/agents/openai.yaml +0 -0
  160. package/skills/builtin/pibo-docker-system/SKILL.md +0 -0
  161. package/skills/builtin/pibo-spec-writing/SKILL.md +0 -0
  162. package/skills/builtin/prd/SKILL.md +0 -0
  163. package/skills/builtin/ralph-loop/SKILL.md +0 -0
  164. package/skills/builtin/ralph-prd-json/SKILL.md +0 -0
  165. package/skills/builtin/skill-creator/LICENSE.txt +0 -0
  166. package/skills/builtin/skill-creator/SKILL.md +0 -0
  167. package/skills/builtin/skill-creator/agents/analyzer.md +0 -0
  168. package/skills/builtin/skill-creator/agents/comparator.md +0 -0
  169. package/skills/builtin/skill-creator/agents/grader.md +0 -0
  170. package/skills/builtin/skill-creator/assets/eval_review.html +0 -0
  171. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +0 -0
  172. package/skills/builtin/skill-creator/eval-viewer/viewer.html +0 -0
  173. package/skills/builtin/skill-creator/references/schemas.md +0 -0
  174. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  175. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +0 -0
  176. package/skills/builtin/skill-creator/scripts/generate_report.py +0 -0
  177. package/skills/builtin/skill-creator/scripts/improve_description.py +0 -0
  178. package/skills/builtin/skill-creator/scripts/package_skill.py +0 -0
  179. package/skills/builtin/skill-creator/scripts/quick_validate.py +0 -0
  180. package/skills/builtin/skill-creator/scripts/run_eval.py +0 -0
  181. package/skills/builtin/skill-creator/scripts/run_loop.py +0 -0
  182. package/skills/builtin/skill-creator/scripts/utils.py +0 -0
  183. package/skills/builtin/web-annotations/SKILL.md +0 -0
  184. package/src/mcp/LICENSE.mcp-cli +0 -0
  185. package/dist/apps/chat-ui/assets/index-Dz6asKNQ.css +0 -1
  186. package/dist/apps/chat-vscode-web/assets/index-BHL2ZJCu.js +0 -41
  187. 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
+ }