@osolmaz/pi-workflows 0.10.0 → 0.11.1

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 (135) hide show
  1. package/README.md +32 -14
  2. package/dist/builtins/autodoc.workflow.d.ts +58 -0
  3. package/dist/builtins/autodoc.workflow.js +266 -0
  4. package/dist/builtins/autodoc.workflow.js.map +1 -0
  5. package/dist/builtins/autoimplement.workflow.d.ts +212 -11
  6. package/dist/builtins/autoimplement.workflow.js +431 -22
  7. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  8. package/dist/builtins/{autodevise.workflow.d.ts → autoplan.workflow.d.ts} +9 -9
  9. package/dist/builtins/{autodevise.workflow.js → autoplan.workflow.js} +20 -20
  10. package/dist/builtins/autoplan.workflow.js.map +1 -0
  11. package/dist/builtins/catalog.js +8 -4
  12. package/dist/builtins/catalog.js.map +1 -1
  13. package/dist/builtins/index.d.ts +6 -3
  14. package/dist/builtins/index.js +5 -2
  15. package/dist/builtins/index.js.map +1 -1
  16. package/dist/builtins/monitor.workflow.d.ts +4 -0
  17. package/dist/builtins/monitor.workflow.js +134 -9
  18. package/dist/builtins/monitor.workflow.js.map +1 -1
  19. package/dist/builtins/plan-approval.workflow.d.ts +83 -0
  20. package/dist/builtins/plan-approval.workflow.js +148 -0
  21. package/dist/builtins/plan-approval.workflow.js.map +1 -0
  22. package/dist/builtins/plan-presentation.d.ts +7 -0
  23. package/dist/builtins/plan-presentation.js +44 -0
  24. package/dist/builtins/plan-presentation.js.map +1 -0
  25. package/dist/extension/decision-channels.d.ts +132 -0
  26. package/dist/extension/decision-channels.js +1082 -0
  27. package/dist/extension/decision-channels.js.map +1 -0
  28. package/dist/extension/index.d.ts +1 -0
  29. package/dist/extension/index.js +426 -11
  30. package/dist/extension/index.js.map +1 -1
  31. package/dist/extension/widget.js +26 -2
  32. package/dist/extension/widget.js.map +1 -1
  33. package/dist/extension/workflow-tool.d.ts +1 -37
  34. package/dist/extension/workflow-tool.js +1 -42
  35. package/dist/extension/workflow-tool.js.map +1 -1
  36. package/dist/herdr/setup.d.ts +13 -1
  37. package/dist/herdr/setup.js +349 -36
  38. package/dist/herdr/setup.js.map +1 -1
  39. package/dist/host/rpc-bridge.js +4 -21
  40. package/dist/host/rpc-bridge.js.map +1 -1
  41. package/dist/render/graph-render.js +33 -8
  42. package/dist/render/graph-render.js.map +1 -1
  43. package/dist/viewer/cli.d.ts +1 -0
  44. package/dist/viewer/cli.js +21 -10
  45. package/dist/viewer/cli.js.map +1 -1
  46. package/dist/viewer/render.js +36 -2
  47. package/dist/viewer/render.js.map +1 -1
  48. package/dist/workflows/composition.js +15 -1
  49. package/dist/workflows/composition.js.map +1 -1
  50. package/dist/workflows/decision-presentation.d.ts +18 -0
  51. package/dist/workflows/decision-presentation.js +417 -0
  52. package/dist/workflows/decision-presentation.js.map +1 -0
  53. package/dist/workflows/engine.d.ts +2 -1
  54. package/dist/workflows/engine.js +86 -4
  55. package/dist/workflows/engine.js.map +1 -1
  56. package/dist/workflows/human-decision.d.ts +87 -0
  57. package/dist/workflows/human-decision.js +583 -0
  58. package/dist/workflows/human-decision.js.map +1 -0
  59. package/dist/workflows/index.d.ts +3 -1
  60. package/dist/workflows/index.js +2 -0
  61. package/dist/workflows/index.js.map +1 -1
  62. package/dist/workflows/schema.js +15 -0
  63. package/dist/workflows/schema.js.map +1 -1
  64. package/dist/workflows/store.js +7 -0
  65. package/dist/workflows/store.js.map +1 -1
  66. package/dist/workflows/tool-input.d.ts +72 -0
  67. package/dist/workflows/tool-input.js +141 -0
  68. package/dist/workflows/tool-input.js.map +1 -0
  69. package/dist/workflows/types.d.ts +223 -0
  70. package/docs/HUMAN_DECISIONS.md +371 -0
  71. package/docs/HUMAN_DECISION_PRESENTATIONS.md +323 -0
  72. package/docs/MONITOR.md +17 -6
  73. package/docs/WORKFLOW_COMPOSITION.md +13 -6
  74. package/docs/plans/2026-08-19-human-decision-gates-plan.md +296 -0
  75. package/docs/plans/2026-08-19-human-decision-presentations-plan.md +172 -0
  76. package/docs/plans/2026-08-19-provider-compatible-workflow-tool-schema-plan.md +45 -0
  77. package/docs/plans/2026-08-19-workflow-composition-plan.md +25 -17
  78. package/docs/plans/2026-08-20-autoimplement-blocker-challenge-plan.md +138 -0
  79. package/docs/plans/2026-08-20-herdr-plugin-sync-plan.md +104 -0
  80. package/docs/run-bundles.md +23 -2
  81. package/docs/workflows.md +47 -5
  82. package/examples/workflows/approved-plan.workflow.ts +58 -0
  83. package/examples/workflows/autoplan.workflow.ts +1 -0
  84. package/examples/workflows/human-decision.workflow.ts +62 -0
  85. package/herdr-plugin.toml +1 -1
  86. package/package.json +2 -1
  87. package/schemas/decision-presentation-v1.schema.json +83 -0
  88. package/schemas/human-decision-accepted-v1.schema.json +44 -0
  89. package/schemas/human-decision-accepted-v2.schema.json +50 -0
  90. package/schemas/human-decision-answer-attempt-v1.schema.json +37 -0
  91. package/schemas/human-decision-cancellation-v1.schema.json +15 -0
  92. package/schemas/human-decision-continuation-v1.schema.json +16 -0
  93. package/schemas/human-decision-delivery-v1.schema.json +28 -0
  94. package/schemas/human-decision-delivery-v2.schema.json +36 -0
  95. package/schemas/human-decision-receipt-v1.schema.json +33 -0
  96. package/schemas/human-decision-receipt-v2.schema.json +39 -0
  97. package/schemas/human-decision-request-v1.schema.json +59 -0
  98. package/schemas/human-decision-request-v2.schema.json +69 -0
  99. package/schemas/human-decision-resolution-v1.schema.json +27 -0
  100. package/schemas/human-decision-resolution-v2.schema.json +27 -0
  101. package/schemas/human-decision-settlement-v1.schema.json +28 -0
  102. package/skills/autodoc/SKILL.md +43 -0
  103. package/skills/autoimplement/SKILL.md +58 -0
  104. package/skills/autoimplement/agents/openai.yaml +4 -0
  105. package/skills/autoplan/SKILL.md +25 -0
  106. package/skills/monitor/SKILL.md +3 -1
  107. package/skills/pi-workflows/SKILL.md +3 -3
  108. package/src/builtins/autodoc.workflow.ts +325 -0
  109. package/src/builtins/autoimplement.workflow.ts +493 -23
  110. package/src/builtins/{autodevise.workflow.ts → autoplan.workflow.ts} +32 -32
  111. package/src/builtins/catalog.ts +8 -4
  112. package/src/builtins/index.ts +25 -6
  113. package/src/builtins/monitor.workflow.ts +162 -8
  114. package/src/builtins/plan-approval.workflow.ts +190 -0
  115. package/src/builtins/plan-presentation.ts +57 -0
  116. package/src/extension/decision-channels.ts +1533 -0
  117. package/src/extension/index.ts +499 -9
  118. package/src/extension/widget.ts +39 -2
  119. package/src/extension/workflow-tool.ts +5 -81
  120. package/src/herdr/setup.ts +429 -39
  121. package/src/host/rpc-bridge.ts +7 -30
  122. package/src/render/graph-render.ts +40 -3
  123. package/src/viewer/cli.ts +22 -10
  124. package/src/viewer/render.ts +56 -3
  125. package/src/workflows/composition.ts +16 -1
  126. package/src/workflows/decision-presentation.ts +501 -0
  127. package/src/workflows/engine.ts +108 -4
  128. package/src/workflows/human-decision.ts +819 -0
  129. package/src/workflows/index.ts +69 -0
  130. package/src/workflows/schema.ts +17 -0
  131. package/src/workflows/store.ts +8 -0
  132. package/src/workflows/tool-input.ts +202 -0
  133. package/src/workflows/types.ts +265 -0
  134. package/dist/builtins/autodevise.workflow.js.map +0 -1
  135. package/examples/workflows/autodevise.workflow.ts +0 -1
@@ -0,0 +1,417 @@
1
+ import { createHash } from "node:crypto";
2
+ export const MAX_PRESENTATION_CODE_UNITS = 64_000;
3
+ export const MAX_PRESENTATION_BLOCKS = 256;
4
+ export const MAX_PRESENTATION_ITEMS = 256;
5
+ export const MAX_PRESENTATION_STRING_CODE_UNITS = 16_000;
6
+ export const MAX_PRESENTATION_TRANSPORT_PARTS = 20;
7
+ export function normalizeDecisionPresentation(value) {
8
+ const presentation = requireRecord(value, "Decision presentation");
9
+ requireExactKeys(presentation, ["schema", "summary", "blocks"], "Decision presentation");
10
+ if (presentation.schema !== "pi-workflows.decision-presentation.v1") {
11
+ throw new Error("Decision presentation schema must be pi-workflows.decision-presentation.v1");
12
+ }
13
+ const summary = normalizeDisplayString(presentation.summary, "Decision presentation summary");
14
+ if (!Array.isArray(presentation.blocks)) {
15
+ throw new Error("Decision presentation blocks must be an array");
16
+ }
17
+ if (presentation.blocks.length > MAX_PRESENTATION_BLOCKS) {
18
+ throw new Error(`Decision presentation has ${presentation.blocks.length} blocks; limit is ${MAX_PRESENTATION_BLOCKS}`);
19
+ }
20
+ const blocks = presentation.blocks.map((block, index) => normalizeBlock(block, `Decision presentation block ${index + 1}`));
21
+ const normalized = {
22
+ schema: "pi-workflows.decision-presentation.v1",
23
+ summary,
24
+ blocks,
25
+ };
26
+ const codeUnits = presentationCodeUnits(normalized);
27
+ if (codeUnits > MAX_PRESENTATION_CODE_UNITS) {
28
+ throw new Error(`Decision presentation has ${codeUnits} UTF-16 code units; limit is ${MAX_PRESENTATION_CODE_UNITS}`);
29
+ }
30
+ return normalized;
31
+ }
32
+ export function decisionPresentationDigest(presentation) {
33
+ return digestCanonical(normalizeDecisionPresentation(presentation));
34
+ }
35
+ export function validateHumanDecisionRequestIntegrity(request) {
36
+ if (request.schema === "pi-workflows.human-decision-request.v1")
37
+ return request;
38
+ const presentation = normalizeDecisionPresentation(request.presentation);
39
+ const subjectDigest = digestCanonical(request.subject);
40
+ const presentationDigest = digestCanonical(presentation);
41
+ const requestDigest = digestCanonical({
42
+ schema: request.schema,
43
+ runId: request.runId,
44
+ workflowName: request.workflowName,
45
+ nodeId: request.nodeId,
46
+ attemptId: request.attemptId,
47
+ audience: request.audience,
48
+ title: request.title,
49
+ choices: request.choices,
50
+ ...(request.expiresAt !== undefined ? { expiresAt: request.expiresAt } : {}),
51
+ subject: request.subject,
52
+ presentation,
53
+ revision: request.revision,
54
+ });
55
+ if (subjectDigest !== request.subjectDigest) {
56
+ throw new Error("Human decision subject digest does not match its durable request");
57
+ }
58
+ if (presentationDigest !== request.presentationDigest) {
59
+ throw new Error("Human decision presentation digest does not match its durable request");
60
+ }
61
+ if (requestDigest !== request.requestDigest) {
62
+ throw new Error("Human decision request digest does not match its durable request");
63
+ }
64
+ return request;
65
+ }
66
+ export function humanDecisionChannelRequest(request) {
67
+ validateHumanDecisionRequestIntegrity(request);
68
+ const presentation = request.schema === "pi-workflows.human-decision-request.v2"
69
+ ? normalizeDecisionPresentation(request.presentation)
70
+ : legacyDecisionPresentation(request.body);
71
+ const presentationDigest = decisionPresentationDigest(presentation);
72
+ return {
73
+ schema: "pi-workflows.human-decision-channel-request.v1",
74
+ sourceSchema: request.schema,
75
+ decisionId: request.decisionId,
76
+ requestDigest: request.requestDigest,
77
+ runId: request.runId,
78
+ workflowName: request.workflowName,
79
+ nodeId: request.nodeId,
80
+ attemptId: request.attemptId,
81
+ audience: request.audience,
82
+ title: request.title,
83
+ presentation,
84
+ presentationDigest,
85
+ revision: request.schema === "pi-workflows.human-decision-request.v2" ? request.revision : 1,
86
+ choices: request.choices,
87
+ createdAt: request.createdAt,
88
+ ...(request.expiresAt !== undefined ? { expiresAt: request.expiresAt } : {}),
89
+ };
90
+ }
91
+ export function legacyDecisionPresentation(body) {
92
+ const blocks = [];
93
+ if (typeof body === "string") {
94
+ appendLegacyText(blocks, body, "Decision details");
95
+ }
96
+ else {
97
+ appendLegacyValue(blocks, body, undefined);
98
+ }
99
+ const summary = typeof body === "string"
100
+ ? "Review the decision message below."
101
+ : "Review the decision details below.";
102
+ return normalizeDecisionPresentation(boundLegacyPresentation(summary, blocks, body));
103
+ }
104
+ export function decisionDocumentSegments(request) {
105
+ const segments = [
106
+ { kind: "title", text: request.title },
107
+ { kind: "summary", text: request.presentation.summary },
108
+ ];
109
+ for (const block of request.presentation.blocks) {
110
+ if (block.kind === "paragraph")
111
+ segments.push({ kind: block.kind, text: block.text });
112
+ else if (block.kind === "section")
113
+ segments.push({ kind: block.kind, text: block.title });
114
+ else if (block.kind === "bullets") {
115
+ segments.push({ kind: block.kind, text: block.items.map((item) => `• ${item}`).join("\n") });
116
+ }
117
+ else if (block.kind === "fields") {
118
+ segments.push({
119
+ kind: block.kind,
120
+ text: block.items.map(({ label, value }) => `${label}: ${value}`).join("\n"),
121
+ });
122
+ }
123
+ else {
124
+ segments.push({ kind: block.kind, text: block.text });
125
+ }
126
+ }
127
+ const choices = Object.values(request.choices).map((choice) => choice.input === undefined
128
+ ? `• ${choice.label}`
129
+ : `• ${choice.label}\n ${choice.input.prompt}`);
130
+ segments.push({ kind: "choices", text: `Choices\n${choices.join("\n")}` });
131
+ return segments;
132
+ }
133
+ export function decisionPresentationFingerprint(request) {
134
+ return request.presentationDigest.slice("sha256:".length, "sha256:".length + 12);
135
+ }
136
+ export function digestCanonical(value) {
137
+ return `sha256:${createHash("sha256")
138
+ .update(`${canonicalJson(value)}\n`)
139
+ .digest("hex")}`;
140
+ }
141
+ function normalizeBlock(value, label) {
142
+ const block = requireRecord(value, label);
143
+ if (block.kind === "paragraph") {
144
+ requireExactKeys(block, ["kind", "text"], label);
145
+ return { kind: "paragraph", text: normalizeMultilineString(block.text, `${label} text`) };
146
+ }
147
+ if (block.kind === "section") {
148
+ requireExactKeys(block, ["kind", "title"], label);
149
+ return { kind: "section", title: normalizeDisplayString(block.title, `${label} title`) };
150
+ }
151
+ if (block.kind === "bullets") {
152
+ requireExactKeys(block, ["kind", "items"], label);
153
+ return {
154
+ kind: "bullets",
155
+ items: normalizeItems(block.items, `${label} items`, (item, itemLabel) => normalizeDisplayString(item, itemLabel)),
156
+ };
157
+ }
158
+ if (block.kind === "fields") {
159
+ requireExactKeys(block, ["kind", "items"], label);
160
+ return {
161
+ kind: "fields",
162
+ items: normalizeItems(block.items, `${label} items`, (item, itemLabel) => {
163
+ const field = requireRecord(item, itemLabel);
164
+ requireExactKeys(field, ["label", "value"], itemLabel);
165
+ return {
166
+ label: normalizeDisplayString(field.label, `${itemLabel} label`),
167
+ value: normalizeDisplayString(field.value, `${itemLabel} value`),
168
+ };
169
+ }),
170
+ };
171
+ }
172
+ if (block.kind === "preformatted") {
173
+ requireExactKeys(block, ["kind", "text"], label);
174
+ return { kind: "preformatted", text: normalizeMultilineString(block.text, `${label} text`) };
175
+ }
176
+ throw new Error(`${label} kind is not supported`);
177
+ }
178
+ function normalizeItems(value, label, normalize) {
179
+ if (!Array.isArray(value) || value.length === 0) {
180
+ throw new Error(`${label} must be a non-empty array`);
181
+ }
182
+ if (value.length > MAX_PRESENTATION_ITEMS) {
183
+ throw new Error(`${label} has ${value.length} items; limit is ${MAX_PRESENTATION_ITEMS}`);
184
+ }
185
+ return value.map((item, index) => normalize(item, `${label} item ${index + 1}`));
186
+ }
187
+ function normalizeDisplayString(value, label) {
188
+ const text = normalizeString(value, label);
189
+ if (hasControlCharacter(text, false)) {
190
+ throw new Error(`${label} contains a control character`);
191
+ }
192
+ return text;
193
+ }
194
+ function normalizeMultilineString(value, label) {
195
+ const text = normalizeString(value, label);
196
+ if (hasControlCharacter(text, true)) {
197
+ throw new Error(`${label} contains a terminal control character`);
198
+ }
199
+ return text;
200
+ }
201
+ function normalizeString(value, label) {
202
+ if (typeof value !== "string")
203
+ throw new Error(`${label} must be a string`);
204
+ const text = value.replaceAll("\r\n", "\n").replaceAll("\r", "\n").normalize("NFC");
205
+ if (text.trim().length === 0)
206
+ throw new Error(`${label} must not be empty`);
207
+ if (text.length > MAX_PRESENTATION_STRING_CODE_UNITS) {
208
+ throw new Error(`${label} has ${text.length} UTF-16 code units; limit is ${MAX_PRESENTATION_STRING_CODE_UNITS}`);
209
+ }
210
+ return text;
211
+ }
212
+ function boundLegacyPresentation(summary, blocks, body) {
213
+ const candidate = {
214
+ schema: "pi-workflows.decision-presentation.v1",
215
+ summary,
216
+ blocks,
217
+ };
218
+ if (blocks.length <= MAX_PRESENTATION_BLOCKS &&
219
+ blocks.every(legacyBlockFitsSchema) &&
220
+ presentationCodeUnits(candidate) <= MAX_PRESENTATION_CODE_UNITS) {
221
+ return candidate;
222
+ }
223
+ const originalCodeUnits = canonicalJson(body).length;
224
+ const omission = `Some legacy decision content is not shown because it exceeds the readable presentation limit. Inspect the durable v1 request before answering. Body digest: ${digestCanonical(body)}. Original body: ${originalCodeUnits} UTF-16 code units. Generated blocks: ${blocks.length}.`;
225
+ const budget = MAX_PRESENTATION_CODE_UNITS - summary.length - omission.length;
226
+ const kept = [];
227
+ let used = 0;
228
+ let omitted = false;
229
+ for (const block of blocks) {
230
+ const units = presentationBlockCodeUnits(block);
231
+ if (kept.length >= MAX_PRESENTATION_BLOCKS ||
232
+ !legacyBlockFitsSchema(block) ||
233
+ used + units > budget) {
234
+ omitted = true;
235
+ continue;
236
+ }
237
+ kept.push(block);
238
+ used += units;
239
+ }
240
+ if (omitted) {
241
+ if (kept.length >= MAX_PRESENTATION_BLOCKS)
242
+ kept.pop();
243
+ kept.push({ kind: "paragraph", text: omission });
244
+ }
245
+ return {
246
+ schema: "pi-workflows.decision-presentation.v1",
247
+ summary,
248
+ blocks: kept,
249
+ };
250
+ }
251
+ function legacyBlockFitsSchema(block) {
252
+ if (block.kind === "paragraph" || block.kind === "preformatted") {
253
+ return block.text.length <= MAX_PRESENTATION_STRING_CODE_UNITS;
254
+ }
255
+ if (block.kind === "section") {
256
+ return block.title.length <= MAX_PRESENTATION_STRING_CODE_UNITS;
257
+ }
258
+ if (block.kind === "bullets") {
259
+ return block.items.every((item) => item.length <= MAX_PRESENTATION_STRING_CODE_UNITS);
260
+ }
261
+ return block.items.every((item) => item.label.length <= MAX_PRESENTATION_STRING_CODE_UNITS &&
262
+ item.value.length <= MAX_PRESENTATION_STRING_CODE_UNITS);
263
+ }
264
+ function presentationBlockCodeUnits(block) {
265
+ if (block.kind === "paragraph" || block.kind === "preformatted")
266
+ return block.text.length;
267
+ if (block.kind === "section")
268
+ return block.title.length;
269
+ if (block.kind === "bullets") {
270
+ return block.items.reduce((sum, item) => sum + item.length, 0);
271
+ }
272
+ return block.items.reduce((sum, item) => sum + item.label.length + item.value.length, 0);
273
+ }
274
+ function presentationCodeUnits(presentation) {
275
+ let total = presentation.summary.length;
276
+ for (const block of presentation.blocks) {
277
+ total += presentationBlockCodeUnits(block);
278
+ }
279
+ return total;
280
+ }
281
+ function appendLegacyValue(blocks, value, label) {
282
+ if (isScalar(value)) {
283
+ const scalar = legacyScalar(value);
284
+ if (label === undefined || scalar.length > MAX_PRESENTATION_STRING_CODE_UNITS) {
285
+ appendLegacyText(blocks, scalar, label === undefined ? "Decision details" : legacyLabel(label));
286
+ }
287
+ else {
288
+ blocks.push({ kind: "fields", items: [{ label: legacyLabel(label), value: scalar }] });
289
+ }
290
+ return;
291
+ }
292
+ if (Array.isArray(value)) {
293
+ if (label !== undefined)
294
+ blocks.push({ kind: "section", title: legacyLabel(label) });
295
+ if (value.length === 0) {
296
+ blocks.push({ kind: "paragraph", text: "None" });
297
+ return;
298
+ }
299
+ if (value.every(isScalar) &&
300
+ value.every((item) => legacyScalar(item).length <= MAX_PRESENTATION_STRING_CODE_UNITS)) {
301
+ const items = value.map(legacyScalar);
302
+ for (let index = 0; index < items.length; index += MAX_PRESENTATION_ITEMS) {
303
+ blocks.push({ kind: "bullets", items: items.slice(index, index + MAX_PRESENTATION_ITEMS) });
304
+ }
305
+ return;
306
+ }
307
+ value.forEach((item, index) => appendLegacyValue(blocks, item, `Item ${index + 1}`));
308
+ return;
309
+ }
310
+ const entries = Object.entries(value).sort(([left], [right]) => compareKeys(left, right));
311
+ if (label !== undefined)
312
+ blocks.push({ kind: "section", title: legacyLabel(label) });
313
+ if (entries.length === 0) {
314
+ blocks.push({ kind: "paragraph", text: "None" });
315
+ return;
316
+ }
317
+ const fields = entries
318
+ .filter(([, child]) => isScalar(child) && legacyScalar(child).length <= MAX_PRESENTATION_STRING_CODE_UNITS)
319
+ .map(([key, child]) => ({ label: legacyLabel(key), value: legacyScalar(child) }));
320
+ for (let index = 0; index < fields.length; index += MAX_PRESENTATION_ITEMS) {
321
+ blocks.push({ kind: "fields", items: fields.slice(index, index + MAX_PRESENTATION_ITEMS) });
322
+ }
323
+ for (const [key, child] of entries.filter(([, child]) => !isScalar(child) || legacyScalar(child).length > MAX_PRESENTATION_STRING_CODE_UNITS)) {
324
+ appendLegacyValue(blocks, child, key);
325
+ }
326
+ }
327
+ function appendLegacyText(blocks, value, section) {
328
+ const text = sanitizeLegacyText(value);
329
+ blocks.push({ kind: "section", title: section });
330
+ for (const part of splitByCodeUnits(text, MAX_PRESENTATION_STRING_CODE_UNITS)) {
331
+ blocks.push({ kind: "paragraph", text: part.trim().length === 0 ? "None" : part });
332
+ }
333
+ }
334
+ function legacyLabel(value) {
335
+ const sanitized = sanitizeLegacyText(value)
336
+ .replaceAll(/[_-]+/gu, " ")
337
+ .replaceAll(/([a-z0-9])([A-Z])/gu, "$1 $2")
338
+ .replaceAll(/\s+/gu, " ")
339
+ .trim();
340
+ if (sanitized.length === 0)
341
+ return "Value";
342
+ return `${sanitized[0].toUpperCase()}${sanitized.slice(1)}`;
343
+ }
344
+ function legacyScalar(value) {
345
+ if (value === null)
346
+ return "None";
347
+ if (typeof value === "boolean")
348
+ return value ? "Yes" : "No";
349
+ return sanitizeLegacyText(String(value));
350
+ }
351
+ function sanitizeLegacyText(value) {
352
+ return value
353
+ .replaceAll("\r\n", "\n")
354
+ .replaceAll("\r", "\n")
355
+ .normalize("NFC")
356
+ .split("")
357
+ .map((character) => (isControlCode(character.charCodeAt(0), true) ? "�" : character))
358
+ .join("");
359
+ }
360
+ function hasControlCharacter(value, allowLineAndTab) {
361
+ return [...value].some((character) => isControlCode(character.codePointAt(0) ?? 0, allowLineAndTab));
362
+ }
363
+ function isControlCode(code, allowLineAndTab) {
364
+ if (allowLineAndTab && (code === 9 || code === 10))
365
+ return false;
366
+ return code <= 31 || code === 127;
367
+ }
368
+ function splitByCodeUnits(value, limit) {
369
+ if (value.length <= limit)
370
+ return [value];
371
+ const parts = [];
372
+ let remaining = value;
373
+ while (remaining.length > 0) {
374
+ let end = Math.min(limit, remaining.length);
375
+ const last = remaining.charCodeAt(end - 1);
376
+ if (last >= 0xd800 && last <= 0xdbff && end < remaining.length)
377
+ end -= 1;
378
+ parts.push(remaining.slice(0, end));
379
+ remaining = remaining.slice(end);
380
+ }
381
+ return parts;
382
+ }
383
+ function isScalar(value) {
384
+ return value === null || ["string", "number", "boolean"].includes(typeof value);
385
+ }
386
+ function requireRecord(value, label) {
387
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
388
+ throw new Error(`${label} must be an object`);
389
+ }
390
+ return value;
391
+ }
392
+ function requireExactKeys(value, allowed, label) {
393
+ const keys = Object.keys(value);
394
+ const extras = keys.filter((key) => !allowed.includes(key));
395
+ const missing = allowed.filter((key) => !Object.hasOwn(value, key));
396
+ if (missing.length > 0)
397
+ throw new Error(`${label} is missing ${missing.join(", ")}`);
398
+ if (extras.length > 0)
399
+ throw new Error(`${label} has unknown field ${extras.join(", ")}`);
400
+ }
401
+ function canonicalJson(value) {
402
+ return JSON.stringify(sortJson(value));
403
+ }
404
+ function compareKeys(left, right) {
405
+ return left < right ? -1 : left > right ? 1 : 0;
406
+ }
407
+ function sortJson(value) {
408
+ if (Array.isArray(value))
409
+ return value.map(sortJson);
410
+ if (value !== null && typeof value === "object") {
411
+ return Object.fromEntries(Object.entries(value)
412
+ .sort(([left], [right]) => compareKeys(left, right))
413
+ .map(([key, child]) => [key, sortJson(child)]));
414
+ }
415
+ return value;
416
+ }
417
+ //# sourceMappingURL=decision-presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-presentation.js","sourceRoot":"","sources":["../../src/workflows/decision-presentation.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { WorkflowDefinition, WorkflowEngineOptions, WorkflowRunResult, WorkflowSource, WorkflowUpdateInput, WorkflowUpdateReceipt } from "./types.js";
1
+ import type { AcceptedHumanDecision, WorkflowDefinition, WorkflowEngineOptions, WorkflowRunResult, WorkflowSource, WorkflowUpdateInput, WorkflowUpdateReceipt } from "./types.js";
2
2
  /**
3
3
  * Executes a workflow graph step by step. Agent steps are delegated to the
4
4
  * configured executor; compute/action/checkpoint nodes run inline. Every
@@ -65,6 +65,7 @@ export declare class WorkflowEngine {
65
65
  workflowSource?: WorkflowSource;
66
66
  runId?: string;
67
67
  force?: boolean;
68
+ humanDecision?: AcceptedHumanDecision;
68
69
  }): Promise<WorkflowRunResult>;
69
70
  /**
70
71
  * Find where a resumed run continues. An in-flight node reruns; otherwise
@@ -4,6 +4,7 @@ import { resolveArtifacts } from "./artifacts.js";
4
4
  import { compileWorkflowDefinition, compositionMetadata, isCompiledWorkflow, } from "./composition.js";
5
5
  import { CancelledError, errorMessage, isAbortLikeError, isClaimLostError, isRunParkedError, RunParkedError, TimeoutError, WorkflowSourceChangedError, } from "./errors.js";
6
6
  import { resolveNext, resolveNextForOutcome, validateWorkflowDefinition } from "./graph.js";
7
+ import { HumanDecisionStore, createHumanDecisionRequest, validateHumanDecisionResponse, } from "./human-decision.js";
7
8
  import { extractJsonValue } from "./json.js";
8
9
  import { runShellAction, shellResultFromError } from "./shell.js";
9
10
  import { RUN_STATE_SCHEMA, WorkflowRunStore, createDefinitionSnapshot, createRunId, readRunBundle, } from "./store.js";
@@ -257,8 +258,35 @@ export class WorkflowEngine {
257
258
  if (sourceMismatch && options.force !== true) {
258
259
  throw new WorkflowSourceChangedError(parentRunId);
259
260
  }
260
- const suppliedInput = input === undefined ? null : input;
261
- const normalizedInput = workflow.input ? await workflow.input(suppliedInput) : suppliedInput;
261
+ const waitingNodeId = parent.state.waitingOn;
262
+ const waitingNode = workflow.nodes[waitingNodeId];
263
+ const humanContract = waitingNode?.nodeType === "checkpoint" ? waitingNode.humanDecision : undefined;
264
+ let acceptedResponse;
265
+ let acceptedNodeId;
266
+ let normalizedInput;
267
+ if (humanContract !== undefined) {
268
+ if (options.humanDecision === undefined) {
269
+ throw new Error(`Checkpoint ${waitingNodeId} requires an accepted verified human decision`);
270
+ }
271
+ const request = parent.state.finalOutput;
272
+ if ((request?.schema !== "pi-workflows.human-decision-request.v1" &&
273
+ request?.schema !== "pi-workflows.human-decision-request.v2") ||
274
+ request.decisionId !== options.humanDecision.decisionId ||
275
+ request.requestDigest !== options.humanDecision.requestDigest) {
276
+ throw new Error("Accepted human decision does not match the waiting request");
277
+ }
278
+ const durableDecision = await new HumanDecisionStore(this.store.outputRoot).readAccepted(request.decisionId);
279
+ if (durableDecision === null || !isDeepStrictEqual(durableDecision, options.humanDecision)) {
280
+ throw new Error("Accepted human decision does not match the durable decision record");
281
+ }
282
+ acceptedResponse = validateHumanDecisionResponse(request, durableDecision.response);
283
+ acceptedNodeId = request.nodeId;
284
+ normalizedInput = await resolveArtifacts(parent.state.input, parent.runDir);
285
+ }
286
+ else {
287
+ const suppliedInput = input === undefined ? null : input;
288
+ normalizedInput = workflow.input ? await workflow.input(suppliedInput) : suppliedInput;
289
+ }
262
290
  assertJsonSerializable(normalizedInput, "Workflow run input");
263
291
  if (options.runId !== undefined && !/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/.test(options.runId)) {
264
292
  throw new Error(`Invalid workflow run id: ${JSON.stringify(options.runId)}`);
@@ -270,6 +298,39 @@ export class WorkflowEngine {
270
298
  state.outputs = (await resolveArtifacts(parent.state.outputs, parent.runDir));
271
299
  state.results = (await resolveArtifacts(parent.state.results, parent.runDir));
272
300
  state.steps = (await resolveArtifacts(parent.state.steps, parent.runDir));
301
+ if (humanContract !== undefined && options.humanDecision !== undefined) {
302
+ const receipt = {
303
+ decisionId: options.humanDecision.decisionId,
304
+ requestDigest: options.humanDecision.requestDigest,
305
+ nodeId: acceptedNodeId ?? waitingNodeId,
306
+ response: options.humanDecision.response,
307
+ acceptedAt: options.humanDecision.acceptedAt,
308
+ answerDigest: options.humanDecision.answerDigest,
309
+ };
310
+ state.humanDecision =
311
+ options.humanDecision.schema === "pi-workflows.human-decision-accepted.v2"
312
+ ? {
313
+ schema: "pi-workflows.human-decision-receipt.v2",
314
+ ...receipt,
315
+ subjectDigest: options.humanDecision.subjectDigest,
316
+ presentationDigest: options.humanDecision.presentationDigest,
317
+ revision: options.humanDecision.revision,
318
+ }
319
+ : { schema: "pi-workflows.human-decision-receipt.v1", ...receipt };
320
+ state.outputs[waitingNodeId] = acceptedResponse;
321
+ const priorResult = state.results[waitingNodeId];
322
+ if (priorResult === undefined) {
323
+ throw new Error(`Waiting human decision result is missing for ${waitingNodeId}`);
324
+ }
325
+ state.results[waitingNodeId] = { ...priorResult, output: acceptedResponse };
326
+ const stepIndex = state.steps.findLastIndex((step) => step.nodeId === waitingNodeId);
327
+ if (stepIndex < 0)
328
+ throw new Error(`Waiting human decision step is missing for ${waitingNodeId}`);
329
+ const priorStep = state.steps[stepIndex];
330
+ if (priorStep === undefined)
331
+ throw new Error("Waiting human decision step became unavailable");
332
+ state.steps[stepIndex] = { ...priorStep, output: acceptedResponse };
333
+ }
273
334
  state.carriedStepCount = state.steps.length;
274
335
  const runDir = await this.store.initializeRunBundle(workflow, state);
275
336
  await this.persist(runDir, state, {
@@ -754,7 +815,12 @@ export class WorkflowEngine {
754
815
  case "action":
755
816
  return await this.runActionNode(node, context, nodeId, attemptId, signal, meta);
756
817
  case "checkpoint":
757
- return await runCheckpointNode(node, context);
818
+ return await runCheckpointNode(node, context, {
819
+ store: this.store,
820
+ workflowName: workflow.name,
821
+ nodeId,
822
+ attemptId,
823
+ });
758
824
  }
759
825
  }
760
826
  createNodeContext(state, signal) {
@@ -883,7 +949,23 @@ export class WorkflowEngine {
883
949
  });
884
950
  }
885
951
  }
886
- async function runCheckpointNode(node, context) {
952
+ async function runCheckpointNode(node, context, execution) {
953
+ if (node.humanDecision !== undefined) {
954
+ const prompt = await node.humanDecision.request(context);
955
+ const audience = typeof node.humanDecision.audience === "function"
956
+ ? await node.humanDecision.audience(context)
957
+ : node.humanDecision.audience;
958
+ const request = createHumanDecisionRequest({
959
+ runId: context.state.runId,
960
+ workflowName: execution.workflowName,
961
+ nodeId: execution.nodeId,
962
+ attemptId: execution.attemptId,
963
+ contract: { audience, choices: node.humanDecision.choices },
964
+ prompt,
965
+ });
966
+ await new HumanDecisionStore(execution.store.outputRoot).createRequest(request);
967
+ return { output: request, promptText: null };
968
+ }
887
969
  const output = node.run ? await node.run(context) : { summary: node.summary ?? "checkpoint" };
888
970
  return { output, promptText: null };
889
971
  }