@stigmer/runner 3.1.10 → 3.1.11

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 (33) hide show
  1. package/dist/.build-fingerprint +1 -1
  2. package/dist/activities/promote-task-output.d.ts +6 -1
  3. package/dist/activities/promote-task-output.js +10 -5
  4. package/dist/activities/promote-task-output.js.map +1 -1
  5. package/dist/activities/workflow-event-activities.js +10 -1
  6. package/dist/activities/workflow-event-activities.js.map +1 -1
  7. package/dist/workflow-engine/loader.js +4 -0
  8. package/dist/workflow-engine/loader.js.map +1 -1
  9. package/dist/workflow-engine/resolve.js +9 -2
  10. package/dist/workflow-engine/resolve.js.map +1 -1
  11. package/dist/workflow-engine/task-status-accumulator.d.ts +8 -1
  12. package/dist/workflow-engine/task-status-accumulator.js +2 -1
  13. package/dist/workflow-engine/task-status-accumulator.js.map +1 -1
  14. package/dist/workflow-engine/tasks/human-input.d.ts +7 -0
  15. package/dist/workflow-engine/tasks/human-input.js +70 -4
  16. package/dist/workflow-engine/tasks/human-input.js.map +1 -1
  17. package/dist/workflow-engine/types.d.ts +19 -1
  18. package/dist/workflow-engine/types.js.map +1 -1
  19. package/dist/workflows/engine-core.js +1 -1
  20. package/dist/workflows/engine-core.js.map +1 -1
  21. package/package.json +2 -2
  22. package/src/activities/promote-task-output.ts +10 -4
  23. package/src/activities/workflow-event-activities.ts +11 -2
  24. package/src/workflow-engine/__tests__/loader.test.ts +93 -0
  25. package/src/workflow-engine/__tests__/resolve.test.ts +50 -0
  26. package/src/workflow-engine/__tests__/task-status-accumulator.test.ts +35 -0
  27. package/src/workflow-engine/__tests__/tasks/human-input.test.ts +248 -2
  28. package/src/workflow-engine/loader.ts +4 -0
  29. package/src/workflow-engine/resolve.ts +9 -1
  30. package/src/workflow-engine/task-status-accumulator.ts +9 -1
  31. package/src/workflow-engine/tasks/human-input.ts +111 -15
  32. package/src/workflow-engine/types.ts +18 -0
  33. package/src/workflows/engine-core.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"engine-core.js","sourceRoot":"","sources":["../../src/workflows/engine-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine-core.js","sourceRoot":"","sources":["../../src/workflows/engine-core.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stigmer/runner",
3
- "version": "3.1.10",
3
+ "version": "3.1.11",
4
4
  "description": "Embeddable Temporal worker for the Stigmer AI agent platform — handles agent execution, workflow orchestration, and MCP server management",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -85,7 +85,7 @@
85
85
  "@opentelemetry/sdk-metrics": "^2.0.0",
86
86
  "@opentelemetry/sdk-trace-base": "^2.0.0",
87
87
  "@opentelemetry/sdk-trace-node": "^2.0.0",
88
- "@stigmer/protos": "3.1.10",
88
+ "@stigmer/protos": "3.1.11",
89
89
  "@temporalio/activity": "^1.11.0",
90
90
  "@temporalio/client": "^1.11.0",
91
91
  "@temporalio/common": "^1.11.0",
@@ -63,11 +63,17 @@ export function createPromoteTaskOutputActivities() {
63
63
  * Check if a task output should be promoted to an artifact. If the
64
64
  * serialized JSON exceeds the threshold, create an artifact via gRPC
65
65
  * and return a reference.
66
+ *
67
+ * @param displayName - Optional artifact display name. Defaults to
68
+ * "<taskName> — output.json"; callers promoting something other
69
+ * than a task output (e.g. a human_input review payload) pass a
70
+ * name that describes what the artifact actually holds.
66
71
  */
67
72
  async PromoteTaskOutput(
68
73
  taskOutput: unknown,
69
74
  workflowExecutionId: string,
70
75
  taskName: string,
76
+ displayName?: string,
71
77
  ): Promise<PromoteTaskOutputResult> {
72
78
  if (taskOutput === undefined || taskOutput === null) {
73
79
  return { output: taskOutput, artifactIds: [], artifactCreatedEvents: [] };
@@ -85,14 +91,14 @@ export function createPromoteTaskOutputActivities() {
85
91
  return { output: taskOutput, artifactIds: [], artifactCreatedEvents: [] };
86
92
  }
87
93
 
88
- const displayName = `${taskName} — output.json`;
94
+ const effectiveDisplayName = displayName ?? `${taskName} — output.json`;
89
95
  const contentType = "application/json";
90
96
  const contentBytes = Buffer.from(serialized, "utf-8");
91
97
 
92
98
  const input = create(CreateArtifactInputSchema, {
93
99
  spec: create(ArtifactSpecSchema, {
94
100
  contentType,
95
- displayName,
101
+ displayName: effectiveDisplayName,
96
102
  source: create(ArtifactSourceSchema, {
97
103
  workflowExecutionId,
98
104
  taskName,
@@ -107,7 +113,7 @@ export function createPromoteTaskOutputActivities() {
107
113
  return {
108
114
  output: {
109
115
  _artifact_ref: artifactId,
110
- display_name: displayName,
116
+ display_name: effectiveDisplayName,
111
117
  content_type: contentType,
112
118
  size_bytes: byteLength,
113
119
  },
@@ -115,7 +121,7 @@ export function createPromoteTaskOutputActivities() {
115
121
  artifactCreatedEvents: [{
116
122
  type: "artifact_created" as const,
117
123
  artifactId,
118
- displayName,
124
+ displayName: effectiveDisplayName,
119
125
  contentType,
120
126
  sizeBytes: byteLength,
121
127
  occurredAt: new Date().toISOString(),
@@ -12,7 +12,8 @@
12
12
 
13
13
  import { StigmerClient } from "../client/stigmer-client.js";
14
14
  import { loadConfig } from "../config.js";
15
- import { create } from "@bufbuild/protobuf";
15
+ import { create, fromJson } from "@bufbuild/protobuf";
16
+ import { ValueSchema } from "@bufbuild/protobuf/wkt";
16
17
  import {
17
18
  WorkflowExecutionEventSchema,
18
19
  type WorkflowExecutionEvent,
@@ -40,7 +41,7 @@ import {
40
41
  import { ExecutionPhase, WorkflowTaskStatus, WorkflowTaskType } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
41
42
  import { ExecutionPhase as AgentExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
42
43
  import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
43
- import type { JsonObject } from "@bufbuild/protobuf";
44
+ import type { JsonObject, JsonValue } from "@bufbuild/protobuf";
44
45
  import type { WorkflowEventDescriptor } from "../workflow-engine/types.js";
45
46
  import type { TaskStatusEntry } from "../workflow-engine/task-status-accumulator.js";
46
47
  import type { RecoveryTaskData } from "../workflow-engine/recovery.js";
@@ -289,6 +290,13 @@ export function toProtoEvent(desc: WorkflowEventDescriptor): WorkflowExecutionEv
289
290
  formSchema: desc.formSchema
290
291
  ? (desc.formSchema as JsonObject)
291
292
  : undefined,
293
+ // The resolved review payload is arbitrary JSON; fromJson builds
294
+ // the google.protobuf.Value wrapper the proto field expects.
295
+ payload: desc.payload !== undefined
296
+ ? fromJson(ValueSchema, desc.payload as JsonValue)
297
+ : undefined,
298
+ uiHint: desc.uiHint ?? "",
299
+ payloadArtifactId: desc.payloadArtifactId ?? "",
292
300
  }),
293
301
  };
294
302
  break;
@@ -389,6 +397,7 @@ export async function emitWorkflowEvents(
389
397
  costMicros: BigInt(ts.costMicros ?? 0),
390
398
  inputTokens: BigInt(ts.inputTokens ?? 0),
391
399
  outputTokens: BigInt(ts.outputTokens ?? 0),
400
+ uiHint: ts.uiHint ?? "",
392
401
  }),
393
402
  );
394
403
 
@@ -1343,6 +1343,99 @@ do:
1343
1343
  }
1344
1344
  });
1345
1345
 
1346
+ it("call: human_input with payload and ui_hint", () => {
1347
+ const yaml = `
1348
+ document:
1349
+ dsl: '1.0.0'
1350
+ name: test
1351
+ do:
1352
+ - reviewGate:
1353
+ call: human_input
1354
+ with:
1355
+ prompt: "Review the proposal"
1356
+ payload: \${ $context.proposal }
1357
+ ui_hint: infra-proposal
1358
+ `;
1359
+ const model = loadWorkflowFromYaml(yaml);
1360
+ const task = model.do[0].task;
1361
+ expect(task.kind).toBe("human_input");
1362
+ if (task.kind === "human_input") {
1363
+ expect(task.humanInput.payload).toBe("${ $context.proposal }");
1364
+ expect(task.humanInput.uiHint).toBe("infra-proposal");
1365
+ }
1366
+ });
1367
+
1368
+ it("call: human_input with an inline object payload", () => {
1369
+ const yaml = `
1370
+ document:
1371
+ dsl: '1.0.0'
1372
+ name: test
1373
+ do:
1374
+ - reviewGate:
1375
+ call: human_input
1376
+ with:
1377
+ prompt: "Review the summary"
1378
+ payload:
1379
+ summary: "Severity: \${ $context.triage.severity }"
1380
+ static: true
1381
+ `;
1382
+ const model = loadWorkflowFromYaml(yaml);
1383
+ const task = model.do[0].task;
1384
+ expect(task.kind).toBe("human_input");
1385
+ if (task.kind === "human_input") {
1386
+ expect(task.humanInput.payload).toEqual({
1387
+ summary: "Severity: ${ $context.triage.severity }",
1388
+ static: true,
1389
+ });
1390
+ }
1391
+ });
1392
+
1393
+ it("call: human_input without payload/ui_hint leaves both undefined", () => {
1394
+ const yaml = `
1395
+ document:
1396
+ dsl: '1.0.0'
1397
+ name: test
1398
+ do:
1399
+ - plainGate:
1400
+ call: human_input
1401
+ with:
1402
+ prompt: "Just approve"
1403
+ `;
1404
+ const model = loadWorkflowFromYaml(yaml);
1405
+ const task = model.do[0].task;
1406
+ expect(task.kind).toBe("human_input");
1407
+ if (task.kind === "human_input") {
1408
+ expect(task.humanInput.payload).toBeUndefined();
1409
+ expect(task.humanInput.uiHint).toBeUndefined();
1410
+ }
1411
+ });
1412
+
1413
+ it("call: human_input drops a non-string or empty ui_hint", () => {
1414
+ const yaml = `
1415
+ document:
1416
+ dsl: '1.0.0'
1417
+ name: test
1418
+ do:
1419
+ - badHint:
1420
+ call: human_input
1421
+ with:
1422
+ prompt: "Approve"
1423
+ ui_hint: 42
1424
+ - emptyHint:
1425
+ call: human_input
1426
+ with:
1427
+ prompt: "Approve"
1428
+ ui_hint: ""
1429
+ `;
1430
+ const model = loadWorkflowFromYaml(yaml);
1431
+ for (const entry of model.do) {
1432
+ expect(entry.task.kind).toBe("human_input");
1433
+ if (entry.task.kind === "human_input") {
1434
+ expect(entry.task.humanInput.uiHint).toBeUndefined();
1435
+ }
1436
+ }
1437
+ });
1438
+
1346
1439
  it("call: human_input missing prompt throws", () => {
1347
1440
  const yaml = `
1348
1441
  document:
@@ -136,6 +136,56 @@ describe("resolveConfigExpressions", () => {
136
136
  expect(result.value).toBe(3);
137
137
  expect(frozen.value).toBe("${ 1 + 2 }");
138
138
  });
139
+
140
+ it("never re-interprets literal ${ } text nested inside a Phase-1 object result (injection safety)", async () => {
141
+ // A strict expression resolving to external data (webhook body, API
142
+ // response, document under review) may contain literal `${ ... }`
143
+ // text at any depth. Phase 2 must skip the entire resolved subtree —
144
+ // not just a string at the exact resolved path.
145
+ const config = { payload: "${ $context.article }" };
146
+
147
+ const state = createState();
148
+ state.context = {
149
+ article: {
150
+ body: "Use ${ .secrets.KEY } to authenticate",
151
+ steps: ["run ${ $env.HOME }/setup.sh"],
152
+ },
153
+ };
154
+
155
+ const result = await resolveConfigExpressions(
156
+ config,
157
+ null,
158
+ state,
159
+ evaluateExpressionBatch,
160
+ );
161
+
162
+ expect(result.payload).toEqual({
163
+ body: "Use ${ .secrets.KEY } to authenticate",
164
+ steps: ["run ${ $env.HOME }/setup.sh"],
165
+ });
166
+ });
167
+
168
+ it("still interpolates embedded expressions in sibling fields alongside a Phase-1 object result", async () => {
169
+ // The subtree skip is scoped to the resolved path only — template
170
+ // strings elsewhere in the config keep working.
171
+ const config = {
172
+ payload: "${ $context.doc }",
173
+ note: "Reviewing ${ $context.doc.title }",
174
+ };
175
+
176
+ const state = createState();
177
+ state.context = { doc: { title: "Q3 plan", raw: "keep ${ .this } intact" } };
178
+
179
+ const result = await resolveConfigExpressions(
180
+ config,
181
+ null,
182
+ state,
183
+ evaluateExpressionBatch,
184
+ );
185
+
186
+ expect(result.payload).toEqual({ title: "Q3 plan", raw: "keep ${ .this } intact" });
187
+ expect(result.note).toBe("Reviewing Q3 plan");
188
+ });
139
189
  });
140
190
 
141
191
  describe("isRuntimePlaceholder", () => {
@@ -221,6 +221,41 @@ describe("TaskStatusAccumulator", () => {
221
221
  expect(entry.status).toBe("waiting_approval");
222
222
  expect(entry.input).toEqual({ prompt: "Approve?" });
223
223
  });
224
+
225
+ it("records the review-surface uiHint", () => {
226
+ const acc = new TaskStatusAccumulator();
227
+ acc.taskStarted("gate", "human_input");
228
+ acc.taskWaitingApproval("gate", "article-diff");
229
+ const [entry] = acc.toArray();
230
+ expect(entry.uiHint).toBe("article-diff");
231
+ });
232
+
233
+ it("leaves uiHint undefined when the gate declares no hint", () => {
234
+ const acc = new TaskStatusAccumulator();
235
+ acc.taskStarted("gate", "human_input");
236
+ acc.taskWaitingApproval("gate");
237
+ const [entry] = acc.toArray();
238
+ expect(entry.uiHint).toBeUndefined();
239
+ });
240
+
241
+ it("retains uiHint after the gate resolves to completed", () => {
242
+ const acc = new TaskStatusAccumulator();
243
+ acc.taskStarted("gate", "human_input");
244
+ acc.taskWaitingApproval("gate", "article-diff");
245
+ acc.taskCompleted("gate", 500);
246
+ const [entry] = acc.toArray();
247
+ expect(entry.status).toBe("completed");
248
+ expect(entry.uiHint).toBe("article-diff");
249
+ });
250
+
251
+ it("preserves a previously recorded uiHint when re-entering without one", () => {
252
+ const acc = new TaskStatusAccumulator();
253
+ acc.taskStarted("gate", "human_input");
254
+ acc.taskWaitingApproval("gate", "article-diff");
255
+ acc.taskWaitingApproval("gate");
256
+ const [entry] = acc.toArray();
257
+ expect(entry.uiHint).toBe("article-diff");
258
+ });
224
259
  });
225
260
 
226
261
  describe("taskSkipped", () => {
@@ -1,6 +1,8 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
2
  import { executeHumanInputTask } from "../../tasks/human-input.js";
3
3
  import { createState } from "../../state.js";
4
+ import { evaluateExpressionBatch } from "../../expression.js";
5
+ import { TaskStatusAccumulator } from "../../task-status-accumulator.js";
4
6
  import type {
5
7
  HumanInputTaskDef,
6
8
  TaskExecutionContext,
@@ -8,14 +10,28 @@ import type {
8
10
  HumanInputResult,
9
11
  AwaitHumanInputFn,
10
12
  EmitEventsFn,
13
+ ExpressionEvaluator,
14
+ PromoteTaskOutputFn,
11
15
  WorkflowEventDescriptor,
12
16
  } from "../../types.js";
13
17
 
14
18
  const notAvailable = () => { throw new Error("not available in test"); };
15
19
 
16
- function makeCtx(awaitFn?: AwaitHumanInputFn, emitFn?: EmitEventsFn): TaskExecutionContext {
20
+ interface CtxOptions {
21
+ readonly awaitFn?: AwaitHumanInputFn;
22
+ readonly emitFn?: EmitEventsFn;
23
+ readonly evaluateExpressions?: ExpressionEvaluator;
24
+ readonly promoteTaskOutput?: PromoteTaskOutputFn;
25
+ readonly taskStatusAccumulator?: TaskStatusAccumulator;
26
+ }
27
+
28
+ function makeCtx(
29
+ awaitFn?: AwaitHumanInputFn,
30
+ emitFn?: EmitEventsFn,
31
+ options?: CtxOptions,
32
+ ): TaskExecutionContext {
17
33
  return {
18
- evaluateExpressions: async () => ({}),
34
+ evaluateExpressions: options?.evaluateExpressions ?? (async () => ({})),
19
35
  doc: { document: { dsl: "1.0.0", name: "test" }, do: [] },
20
36
  sleep: notAvailable,
21
37
  listen: notAvailable,
@@ -27,6 +43,8 @@ function makeCtx(awaitFn?: AwaitHumanInputFn, emitFn?: EmitEventsFn): TaskExecut
27
43
  callFunction: notAvailable,
28
44
  callAgent: notAvailable,
29
45
  emitEvents: emitFn,
46
+ promoteTaskOutput: options?.promoteTaskOutput,
47
+ taskStatusAccumulator: options?.taskStatusAccumulator,
30
48
  };
31
49
  }
32
50
 
@@ -413,4 +431,232 @@ describe("executeHumanInputTask", () => {
413
431
  expect(resolved.outcome).toBe("approve");
414
432
  });
415
433
  });
434
+
435
+ describe("review payload", () => {
436
+ const awaitApprove: AwaitHumanInputFn = async () => ({ outcome: "approve" });
437
+
438
+ function gateWith(payload: unknown, uiHint?: string): HumanInputTaskDef {
439
+ return {
440
+ kind: "human_input",
441
+ humanInput: { prompt: "Review the material", payload, uiHint },
442
+ };
443
+ }
444
+
445
+ /** Captures emitted batches and returns the approval_requested event. */
446
+ function captureRequested(emitted: WorkflowEventDescriptor[][]) {
447
+ const requested = emitted[0].find((e) => e.type === "approval_requested");
448
+ if (!requested || requested.type !== "approval_requested") {
449
+ throw new Error("approval_requested not emitted");
450
+ }
451
+ return requested;
452
+ }
453
+
454
+ it("resolves a whole-value expression payload against workflow state", async () => {
455
+ const emitted: WorkflowEventDescriptor[][] = [];
456
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
457
+
458
+ const state = createState();
459
+ state.context = { draft: { title: "Q3 plan", items: [1, 2, 3] } };
460
+
461
+ await executeHumanInputTask(
462
+ gateWith("${ $context.draft }", "plan-review"),
463
+ "gate", state,
464
+ makeCtx(awaitApprove, emitFn, { evaluateExpressions: evaluateExpressionBatch }),
465
+ );
466
+
467
+ const requested = captureRequested(emitted);
468
+ expect(requested.payload).toEqual({ title: "Q3 plan", items: [1, 2, 3] });
469
+ expect(requested.uiHint).toBe("plan-review");
470
+ expect(requested.payloadArtifactId).toBeUndefined();
471
+ });
472
+
473
+ it("records the uiHint on the task status entry so listPendingApprovals can badge by review type", async () => {
474
+ const accumulator = new TaskStatusAccumulator();
475
+ accumulator.taskStarted("gate", "human_input");
476
+
477
+ await executeHumanInputTask(
478
+ gateWith({ text: "inline" }, "plan-review"),
479
+ "gate", createState(),
480
+ makeCtx(awaitApprove, undefined, {
481
+ evaluateExpressions: evaluateExpressionBatch,
482
+ taskStatusAccumulator: accumulator,
483
+ }),
484
+ );
485
+
486
+ const entry = accumulator.toArray().find((e) => e.taskName === "gate");
487
+ expect(entry?.uiHint).toBe("plan-review");
488
+ });
489
+
490
+ it("resolves embedded expressions inside an inline object payload", async () => {
491
+ const emitted: WorkflowEventDescriptor[][] = [];
492
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
493
+
494
+ const state = createState();
495
+ state.context = { triage: { severity: "P1" } };
496
+
497
+ await executeHumanInputTask(
498
+ gateWith({ summary: "Severity: ${ $context.triage.severity }", static: true }),
499
+ "gate", state,
500
+ makeCtx(awaitApprove, emitFn, { evaluateExpressions: evaluateExpressionBatch }),
501
+ );
502
+
503
+ const requested = captureRequested(emitted);
504
+ expect(requested.payload).toEqual({ summary: "Severity: P1", static: true });
505
+ expect(requested.uiHint).toBeUndefined();
506
+ });
507
+
508
+ it("does not re-evaluate literal ${ } text inside resolved payload data (injection safety)", async () => {
509
+ const emitted: WorkflowEventDescriptor[][] = [];
510
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
511
+
512
+ // External data (e.g. a webhook body) containing literal expression
513
+ // syntax must survive resolution verbatim.
514
+ const state = createState();
515
+ state.context = { article: { body: "Use ${ .secrets.KEY } to authenticate" } };
516
+
517
+ await executeHumanInputTask(
518
+ gateWith("${ $context.article }"),
519
+ "gate", state,
520
+ makeCtx(awaitApprove, emitFn, { evaluateExpressions: evaluateExpressionBatch }),
521
+ );
522
+
523
+ const requested = captureRequested(emitted);
524
+ expect(requested.payload).toEqual({ body: "Use ${ .secrets.KEY } to authenticate" });
525
+ });
526
+
527
+ it("fails the task when payload resolution errors", async () => {
528
+ const failingEvaluator: ExpressionEvaluator = async () => {
529
+ throw new Error("jq: compile error");
530
+ };
531
+
532
+ await expect(
533
+ executeHumanInputTask(
534
+ gateWith("${ $context.draft | invalid_filter }"),
535
+ "gate", createState(),
536
+ makeCtx(awaitApprove, undefined, { evaluateExpressions: failingEvaluator }),
537
+ ),
538
+ ).rejects.toThrow("failed to resolve 'payload' expressions");
539
+ });
540
+
541
+ it("fails the task when payload resolves to null (missing context path)", async () => {
542
+ await expect(
543
+ executeHumanInputTask(
544
+ gateWith("${ $context.does_not_exist }"),
545
+ "gate", createState(),
546
+ makeCtx(awaitApprove, undefined, { evaluateExpressions: evaluateExpressionBatch }),
547
+ ),
548
+ ).rejects.toThrow("'payload' resolved to null");
549
+ });
550
+
551
+ it("promotes the payload and emits an artifact reference instead of inline data", async () => {
552
+ const emitted: WorkflowEventDescriptor[][] = [];
553
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
554
+
555
+ const promoteFn: PromoteTaskOutputFn = vi.fn(async () => ({
556
+ output: { _artifact_ref: "art_review123" },
557
+ artifactIds: ["art_review123"],
558
+ artifactCreatedEvents: [{
559
+ type: "artifact_created" as const,
560
+ artifactId: "art_review123",
561
+ displayName: "gate — review-payload.json",
562
+ contentType: "application/json",
563
+ sizeBytes: 300_000,
564
+ occurredAt: new Date().toISOString(),
565
+ }],
566
+ }));
567
+
568
+ const state = createState();
569
+ state.context = { proposal: { records: ["huge"] } };
570
+
571
+ await executeHumanInputTask(
572
+ gateWith("${ $context.proposal }", "infra-proposal"),
573
+ "gate", state,
574
+ makeCtx(awaitApprove, emitFn, {
575
+ evaluateExpressions: evaluateExpressionBatch,
576
+ promoteTaskOutput: promoteFn,
577
+ }),
578
+ );
579
+
580
+ expect(promoteFn).toHaveBeenCalledWith(
581
+ { records: ["huge"] }, "", "gate", "gate — review-payload.json",
582
+ );
583
+
584
+ const requested = captureRequested(emitted);
585
+ expect(requested.payload).toBeUndefined();
586
+ expect(requested.payloadArtifactId).toBe("art_review123");
587
+ expect(requested.uiHint).toBe("infra-proposal");
588
+
589
+ const artifactEvent = emitted[0].find((e) => e.type === "artifact_created");
590
+ expect(artifactEvent).toBeDefined();
591
+ if (artifactEvent?.type !== "artifact_created") throw new Error("unexpected");
592
+ expect(artifactEvent.artifactId).toBe("art_review123");
593
+ });
594
+
595
+ it("delivers inline when the promotion activity returns no artifacts (below threshold)", async () => {
596
+ const emitted: WorkflowEventDescriptor[][] = [];
597
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
598
+
599
+ const promoteFn: PromoteTaskOutputFn = async (taskOutput) => ({
600
+ output: taskOutput, artifactIds: [], artifactCreatedEvents: [],
601
+ });
602
+
603
+ const state = createState();
604
+ state.context = { note: "small" };
605
+
606
+ await executeHumanInputTask(
607
+ gateWith("${ $context.note }"),
608
+ "gate", state,
609
+ makeCtx(awaitApprove, emitFn, {
610
+ evaluateExpressions: evaluateExpressionBatch,
611
+ promoteTaskOutput: promoteFn,
612
+ }),
613
+ );
614
+
615
+ const requested = captureRequested(emitted);
616
+ expect(requested.payload).toBe("small");
617
+ expect(requested.payloadArtifactId).toBeUndefined();
618
+ });
619
+
620
+ it("falls back to inline delivery when promotion fails (best-effort policy)", async () => {
621
+ const emitted: WorkflowEventDescriptor[][] = [];
622
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
623
+
624
+ const promoteFn: PromoteTaskOutputFn = async () => {
625
+ throw new Error("artifact store unavailable");
626
+ };
627
+
628
+ const state = createState();
629
+ state.context = { doc: { text: "content" } };
630
+
631
+ await executeHumanInputTask(
632
+ gateWith("${ $context.doc }"),
633
+ "gate", state,
634
+ makeCtx(awaitApprove, emitFn, {
635
+ evaluateExpressions: evaluateExpressionBatch,
636
+ promoteTaskOutput: promoteFn,
637
+ }),
638
+ );
639
+
640
+ const requested = captureRequested(emitted);
641
+ expect(requested.payload).toEqual({ text: "content" });
642
+ expect(requested.payloadArtifactId).toBeUndefined();
643
+ });
644
+
645
+ it("omits payload fields entirely when the task config has no payload", async () => {
646
+ const emitted: WorkflowEventDescriptor[][] = [];
647
+ const emitFn: EmitEventsFn = async (events) => { emitted.push(events); };
648
+
649
+ const taskDef: HumanInputTaskDef = {
650
+ kind: "human_input",
651
+ humanInput: { prompt: "Simple gate" },
652
+ };
653
+
654
+ await executeHumanInputTask(taskDef, "gate", createState(), makeCtx(awaitApprove, emitFn));
655
+
656
+ const requested = captureRequested(emitted);
657
+ expect(requested.payload).toBeUndefined();
658
+ expect(requested.uiHint).toBeUndefined();
659
+ expect(requested.payloadArtifactId).toBeUndefined();
660
+ });
661
+ });
416
662
  });
@@ -520,5 +520,9 @@ function parseHumanInputConfig(taskName: string, raw: unknown): import("./types.
520
520
  : undefined,
521
521
  timeout: typeof obj.timeout === "number" ? obj.timeout : undefined,
522
522
  onTimeout: (obj.on_timeout as "fail" | "approve" | "deny") ?? undefined,
523
+ // Any JSON shape is a valid payload (expression string, object, array),
524
+ // so only null/undefined mean "no payload" here.
525
+ payload: obj.payload ?? undefined,
526
+ uiHint: typeof obj.ui_hint === "string" && obj.ui_hint ? obj.ui_hint : undefined,
523
527
  };
524
528
  }
@@ -301,8 +301,16 @@ function collectEmbeddedFromValue(
301
301
  batchExprs: Record<string, string>,
302
302
  skipPaths: Set<string>,
303
303
  ): void {
304
+ // A Phase-1-resolved path holds data, not template text: skip its
305
+ // entire subtree, whatever shape it resolved to. A strict expression
306
+ // can resolve to an object or array whose nested strings carry literal
307
+ // `${ ... }` text from external sources (webhook payloads, API
308
+ // responses, documents under review) that must never be re-interpreted
309
+ // as expressions. Checking only string values at the exact path — the
310
+ // previous behavior — left those nested strings exposed.
311
+ if (skipPaths.has(path)) return;
312
+
304
313
  if (typeof value === "string") {
305
- if (skipPaths.has(path)) return;
306
314
  if (isStrictExpr(value)) return;
307
315
  const expressions = extractEmbeddedExpressions(value);
308
316
  if (expressions.length === 0) return;