@intutic/gate 1.10.1 → 2.1.0

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 (49) hide show
  1. package/README.md +18 -10
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +2 -0
  4. package/dist/actions.js.map +1 -1
  5. package/dist/dsh.d.ts +27 -2
  6. package/dist/dsh.d.ts.map +1 -1
  7. package/dist/dsh.js +23 -1
  8. package/dist/dsh.js.map +1 -1
  9. package/dist/eve.d.ts +81 -14
  10. package/dist/eve.d.ts.map +1 -1
  11. package/dist/eve.js +93 -10
  12. package/dist/eve.js.map +1 -1
  13. package/dist/gate.d.ts +1 -3
  14. package/dist/gate.d.ts.map +1 -1
  15. package/dist/gate.js +3 -9
  16. package/dist/gate.js.map +1 -1
  17. package/dist/harness.d.ts +86 -31
  18. package/dist/harness.d.ts.map +1 -1
  19. package/dist/harness.js +103 -28
  20. package/dist/harness.js.map +1 -1
  21. package/dist/managedAgents.d.ts +35 -6
  22. package/dist/managedAgents.d.ts.map +1 -1
  23. package/dist/managedAgents.js +26 -6
  24. package/dist/managedAgents.js.map +1 -1
  25. package/dist/mastra.d.ts +5 -2
  26. package/dist/mastra.d.ts.map +1 -1
  27. package/dist/mastra.js +3 -1
  28. package/dist/mastra.js.map +1 -1
  29. package/dist/openai.d.ts +5 -3
  30. package/dist/openai.d.ts.map +1 -1
  31. package/dist/openai.js +5 -3
  32. package/dist/openai.js.map +1 -1
  33. package/dist/registry.d.ts +18 -0
  34. package/dist/registry.d.ts.map +1 -0
  35. package/dist/registry.js +24 -0
  36. package/dist/registry.js.map +1 -0
  37. package/dist/vercel.d.ts +3 -3
  38. package/dist/vercel.d.ts.map +1 -1
  39. package/dist/vercel.js +1 -1
  40. package/dist/vercel.js.map +1 -1
  41. package/dist/workflow.d.ts +153 -39
  42. package/dist/workflow.d.ts.map +1 -1
  43. package/dist/workflow.js +162 -49
  44. package/dist/workflow.js.map +1 -1
  45. package/dist/wrapTools.d.ts +1 -1
  46. package/dist/wrapTools.d.ts.map +1 -1
  47. package/dist/wrapTools.js +1 -1
  48. package/dist/wrapTools.js.map +1 -1
  49. package/package.json +11 -10
@@ -1,6 +1,7 @@
1
1
  /**
2
- * `@ai-sdk/workflow` adapter: `intuticNeedsApproval()`, `withIntuticApproval()`,
3
- * `wrapWorkflowTools()`, and the FatalError-compatible `IntuticWorkflowRefusal`.
2
+ * `@ai-sdk/workflow` adapter: `withIntuticApproval()`, `intuticNeedsApproval()`,
3
+ * `intuticApprovalStep()`, `wrapWorkflowTools()`, and the FatalError-compatible
4
+ * `IntuticWorkflowRefusal`.
4
5
  *
5
6
  * `@intutic/gate/workflow` — the same idea `vercel.ts` implements for the base
6
7
  * `ai` package (wrap the framework's own veto point around this package's
@@ -9,10 +10,11 @@
9
10
  *
10
11
  * ## 1. The veto surface is per-tool `needsApproval`, not an agent option
11
12
  *
12
- * Confirmed against a real install (`@ai-sdk/workflow@1.0.69`):
13
- * `WorkflowAgent`/`WorkflowAgentOptions` carry ZERO approval fields — the
14
- * string `toolApproval` does not appear anywhere in the package's shipped
15
- * `.d.ts`. The veto surface is `needsApproval` (boolean | function) on the
13
+ * Confirmed against a real install (`@ai-sdk/workflow@1.0.69`, re-read on
14
+ * 2.0.58): `WorkflowAgent`/`WorkflowAgentOptions` carry NO approval-policy
15
+ * field — 1.x's shipped `.d.ts` never mentions `toolApproval`, and 2.x adds
16
+ * only `experimental_toolApprovalSecret`, an HMAC secret that signs approval
17
+ * requests so a replayed approval can be verified, not a veto. The veto surface is `needsApproval` (boolean | function) on the
16
18
  * TOOL definition, exactly as the framework's own workflow-agent docs
17
19
  * describe under "Tool Approval". The compiled agent loop confirms the
18
20
  * semantics (dist/index.js): `needsApproval == null` → no approval; a
@@ -22,9 +24,9 @@
22
24
  * later — so this framework, uniquely in this package, has a real
23
25
  * human-in-the-loop lane for the gate to route into.
24
26
  *
25
- * (`ai@7.0.68` marks tool-level `needsApproval` `@deprecated` in favour of
26
- * generateText-level `toolApproval` — but `@ai-sdk/workflow`'s OWN agent loop
27
- * reads the tool-level field and exposes no other veto surface, so it is the
27
+ * (`ai@7` — still in 7.0.127 — marks tool-level `needsApproval` `@deprecated`
28
+ * in favour of generateText-level `toolApproval` — but `@ai-sdk/workflow`'s
29
+ * OWN agent loop (1.x and 2.0.58 alike) reads the tool-level field and exposes no other veto surface, so it is the
28
30
  * correct — indeed the only — integration point here. Noted in the TD entry
29
31
  * this phase filed, so a future @ai-sdk/workflow release moving to the
30
32
  * generateText-shaped surface gets caught rather than silently ungated.)
@@ -33,11 +35,13 @@
33
35
  *
34
36
  * A durable workflow retries failed steps. Confirmed against real installs
35
37
  * (`workflow@4.8.3` re-exporting `@workflow/errors@4.2.1` via
36
- * `@workflow/core`): the runtime's retry/abort decision consults
37
- * `FatalError.is(err)` (`@workflow/core`'s `runtime/step-handler.js` — a
38
- * fatal error "bubbl[es] up to parent workflow"; anything else is retried
39
- * toward `maxAttempts`), and `FatalError.is()` DUCK-TYPES: it checks
40
- * `err.name === 'FatalError'` on any Error-shaped object, precisely because
38
+ * `@workflow/core`; re-read on `workflow@5.0.1` / `@workflow/errors@5.0.1`):
39
+ * the runtime's retry/abort decision consults `FatalError.is(err)`
40
+ * (`@workflow/core`'s `runtime/step-handler.js` in 4.x,
41
+ * `runtime/step-executor.js` in 5.x — a fatal error "bubbl[es] up to parent
42
+ * workflow"; anything else is retried toward `maxAttempts`), and
43
+ * `FatalError.is()` DUCK-TYPES: it checks `err.name === 'FatalError'` (5.x
44
+ * also accepts `err.fatal === true`) on any Error-shaped object, precisely because
41
45
  * workflows execute in a separate `vm` realm where `instanceof` fails across
42
46
  * the boundary. A plain `IntuticGateRefusal` thrown from `needsApproval` or a
43
47
  * tool body would therefore be RETRIED — a governance denial replayed on a
@@ -56,9 +60,44 @@
56
60
  * "no gate configured" case, which is deterministic and would fail every
57
61
  * retry identically) is made fatal.
58
62
  *
63
+ * ## 3. `needsApproval` runs in the workflow VM — the gate must run in a step
64
+ *
65
+ * Observed in a live run on the Workflow DevKit's local world (TD-498):
66
+ * `WorkflowAgent`'s loop runs inside the `"use workflow"` function, so it
67
+ * calls `needsApproval` in the workflow VM, which has no Node.js modules.
68
+ * `Gate` reads its policy snapshot with `node:fs`, so evaluating it there
69
+ * fails with `require is not defined` — and when the workflow bundle pulls
70
+ * `node:fs` in at module level, EVERY workflow sharing that bundle fails at
71
+ * load (observed with `workflow/nitro`).
72
+ *
73
+ * So the gate runs in a STEP, which has full Node.js and is durable. The
74
+ * caller declares one `"use step"` function in their own module — the
75
+ * directive must sit in a module the workflow bundler transforms, and the
76
+ * step's body must build/receive the `Gate` itself, because step arguments
77
+ * are serialized and a `Gate` instance is not serializable — whose body is
78
+ * {@link intuticApprovalStep}, and passes it as `{ step }`:
79
+ *
80
+ * ```ts
81
+ * export async function intuticGate(toolName: string, input: unknown) {
82
+ * 'use step'
83
+ * return intuticApprovalStep(toolName, input, { gate: new Gate({ ... }) })
84
+ * }
85
+ * // in the workflow: tools: withIntuticApproval(tools, { step: intuticGate })
86
+ * ```
87
+ *
88
+ * With `{ step }`, the `needsApproval` this module builds only calls the step
89
+ * (a durable step invocation from the VM's point of view) and maps its
90
+ * boolean; nothing Node-only runs in the VM. This module itself is safe to
91
+ * import into workflow code: it imports nothing that touches Node.js
92
+ * (`errors.ts`, `registry.ts`, `wrapTools.ts`; `Gate` is a type-only
93
+ * import). Without `{ step }`, the gate is evaluated in-process, which still
94
+ * works wherever Node.js is available (inside a step, or any plain `ai`
95
+ * loop); called in the workflow VM it throws an {@link IntuticWorkflowRefusal}
96
+ * naming this fix instead of failing with `require is not defined`.
97
+ *
59
98
  * @module
60
99
  */
61
- import { type Gate } from './gate.js';
100
+ import type { Gate } from './gate.js';
62
101
  import { IntuticGateRefusal } from './errors.js';
63
102
  import { type AnyFn, type ExecutableTool } from './wrapTools.js';
64
103
  /**
@@ -99,9 +138,15 @@ export interface WorkflowNeedsApprovalOptions {
99
138
  * `ai`'s tool-level `needsApproval` (the surface `@ai-sdk/workflow`'s agent
100
139
  * loop actually consults). */
101
140
  export type WorkflowNeedsApproval = (input: unknown, options: WorkflowNeedsApprovalOptions) => Promise<boolean>;
102
- export interface IntuticNeedsApprovalOptions {
103
- /** Overrides the process-wide installed gate (`install(new Gate(...))`). */
104
- gate?: Gate;
141
+ /**
142
+ * The `"use step"` function the caller declares to run the gate (see module
143
+ * doc, section 3): called with the tool name and the call's input — both
144
+ * serializable — it resolves `true` when a human should approve the call and
145
+ * throws {@link IntuticWorkflowRefusal} when the gate blocks it. Its body is
146
+ * {@link intuticApprovalStep}.
147
+ */
148
+ export type IntuticGateStep = (toolName: string, input: unknown) => Promise<boolean>;
149
+ interface OnAllowOption {
105
150
  /**
106
151
  * What an ALLOWED call maps to. `needsApproval` answers "does a human need
107
152
  * to approve this?", which is a different question from "may this run?" —
@@ -119,30 +164,74 @@ export interface IntuticNeedsApprovalOptions {
119
164
  * the decision to a human approver as though the gate had no verdict, and
120
165
  * returning `false` would RUN the tool — the one thing a block must never
121
166
  * do.
167
+ *
168
+ * With `{ step }`, `'human'` here and the step's own answer are OR-ed:
169
+ * either one asking for a human is enough.
122
170
  */
123
171
  onAllow?: 'auto' | 'human';
124
172
  }
173
+ export type IntuticNeedsApprovalOptions = (OnAllowOption & {
174
+ /**
175
+ * Evaluate the gate in this `"use step"` function — required when the
176
+ * `needsApproval` runs in the workflow VM, i.e. on a `WorkflowAgent`
177
+ * (see module doc, section 3). The step builds or receives its own
178
+ * `Gate`; a `gate` cannot be passed here, since the VM cannot hold one.
179
+ */
180
+ step: IntuticGateStep;
181
+ gate?: never;
182
+ }) | (OnAllowOption & {
183
+ /** Evaluate in-process, Node.js only. Overrides the process-wide
184
+ * installed gate (`install(new Gate(...))`). */
185
+ gate?: Gate;
186
+ step?: undefined;
187
+ });
188
+ /** Options for {@link intuticApprovalStep} — the in-process evaluation, so no
189
+ * `step`. */
190
+ export type IntuticApprovalStepOptions = OnAllowOption & {
191
+ gate?: Gate;
192
+ };
125
193
  /**
126
- * Build an async `needsApproval` function for ONE workflow tool:
194
+ * The gate evaluation for ONE call, written to be the body of the caller's
195
+ * `"use step"` function (see module doc, section 3):
127
196
  *
128
197
  * ```ts
129
- * import { WorkflowAgent } from '@ai-sdk/workflow'
130
- * import { Gate, install } from '@intutic/gate'
131
- * import { intuticNeedsApproval } from '@intutic/gate/workflow'
132
- *
133
- * install(new Gate({ workspaceId: process.env.INTUTIC_WORKSPACE_ID }))
134
- *
135
- * const agent = new WorkflowAgent({
136
- * model,
137
- * tools: {
138
- * deployService: {
139
- * description: '...',
140
- * inputSchema,
141
- * execute: deployStep,
142
- * needsApproval: intuticNeedsApproval('deployService'),
143
- * },
144
- * },
145
- * })
198
+ * // workflows/intutic-gate.ts
199
+ * import { Gate } from '@intutic/gate'
200
+ * import { intuticApprovalStep } from '@intutic/gate/workflow'
201
+ *
202
+ * export async function intuticGate(toolName: string, input: unknown): Promise<boolean> {
203
+ * 'use step'
204
+ * return intuticApprovalStep(toolName, input, {
205
+ * gate: new Gate({ workspaceId: process.env.INTUTIC_WORKSPACE_ID }),
206
+ * })
207
+ * }
208
+ * ```
209
+ *
210
+ * Reference `@intutic/gate` only inside step bodies in that module: the
211
+ * workflow bundler also bundles it into the VM with the step bodies
212
+ * replaced, and a module-level use would keep the Node-only gate there.
213
+ *
214
+ * Verdict mapping: BLOCK → throws {@link IntuticWorkflowRefusal} (fatal — the
215
+ * step runs once and the run fails instead of retry-looping; see module doc);
216
+ * ALLOW → `false`, or `true` with `onAllow: 'human'`. A non-refusal crash in
217
+ * the gate is re-thrown untouched (the step retries — correct for
218
+ * transients). Requires a gate (`{ gate }` or `install()` in the process
219
+ * that runs steps); called in the workflow VM itself, it throws naming the
220
+ * fix.
221
+ */
222
+ export declare function intuticApprovalStep(toolName: string, input: unknown, opts?: IntuticApprovalStepOptions): Promise<boolean>;
223
+ /**
224
+ * Build an async `needsApproval` function for ONE workflow tool. On a
225
+ * `WorkflowAgent`, pass the caller's gate step (see
226
+ * {@link intuticApprovalStep}):
227
+ *
228
+ * ```ts
229
+ * deployService: {
230
+ * description: '...',
231
+ * inputSchema,
232
+ * execute: deployStep,
233
+ * needsApproval: intuticNeedsApproval('deployService', { step: intuticGate }),
234
+ * },
146
235
  * ```
147
236
  *
148
237
  * The tool name is a parameter because the framework's `needsApproval`
@@ -151,6 +240,12 @@ export interface IntuticNeedsApprovalOptions {
151
240
  * {@link withIntuticApproval} to attach this to a whole tools record without
152
241
  * hand-repeating each name.
153
242
  *
243
+ * With `{ step }`, the returned function only calls the step and maps its
244
+ * answer — safe in the workflow VM. Without it, the gate is evaluated
245
+ * in-process (`{ gate }` or the installed gate), which needs Node.js: fine in
246
+ * a plain `ai` loop or inside a step, and in the workflow VM it throws an
247
+ * {@link IntuticWorkflowRefusal} naming the `{ step }` fix.
248
+ *
154
249
  * Verdict mapping: BLOCK → throws {@link IntuticWorkflowRefusal} (fatal —
155
250
  * aborts instead of retry-looping; see module doc); ALLOW → `false` or `true`
156
251
  * per `onAllow`. A non-refusal crash in the gate is re-thrown untouched
@@ -169,13 +264,29 @@ export interface WorkflowToolLike {
169
264
  * `needsApproval` the tool already declares:
170
265
  *
171
266
  * ```ts
172
- * const agent = new WorkflowAgent({ model, tools: withIntuticApproval(tools) })
267
+ * import { WorkflowAgent } from '@ai-sdk/workflow'
268
+ * import { withIntuticApproval } from '@intutic/gate/workflow'
269
+ * import { intuticGate } from './intutic-gate' // the "use step" function
270
+ *
271
+ * export async function deployAgent(messages: ModelMessage[]) {
272
+ * 'use workflow'
273
+ * const agent = new WorkflowAgent({
274
+ * model,
275
+ * tools: withIntuticApproval(tools, { step: intuticGate }),
276
+ * })
277
+ * // ...
278
+ * }
173
279
  * ```
174
280
  *
281
+ * (`{ step }` is what makes this work on a `WorkflowAgent`, whose
282
+ * `needsApproval` runs in the workflow VM — see {@link intuticApprovalStep}
283
+ * and the module doc, section 3. Without it the gate is evaluated
284
+ * in-process, which needs Node.js.)
285
+ *
175
286
  * For each tool (the record KEY is the tool name reported to the gate — the
176
287
  * same identity the framework itself dispatches on):
177
288
  *
178
- * 1. `Gate.guard()` runs first. BLOCK throws {@link IntuticWorkflowRefusal}.
289
+ * 1. The gate runs first. BLOCK throws {@link IntuticWorkflowRefusal}.
179
290
  * 2. On allow, the tool's OWN prior `needsApproval` still applies: a
180
291
  * boolean is returned as-is; a function is awaited with the original
181
292
  * arguments; a tool with none falls back to `onAllow` ('auto' → false).
@@ -198,7 +309,9 @@ export declare function withIntuticApproval<T extends Record<string, WorkflowToo
198
309
  * "no gate configured" handling and the record-key-is-tool-name convention —
199
310
  * is `wrapTools`'s own behaviour, reused rather than reimplemented.
200
311
  *
201
- * Prefer {@link withIntuticApproval} as the primary integration: it uses the
312
+ * Call it inside the tool's `"use step"` body (it evaluates the gate
313
+ * in-process, so it needs Node.js). Prefer {@link withIntuticApproval} as the
314
+ * primary integration: it uses the
202
315
  * framework's own pre-execution veto surface, refuses BEFORE the durable
203
316
  * step ever starts, and keeps the human-approval lane available. This
204
317
  * execute-level wrapper is defense in depth (or the option for callers whose
@@ -206,4 +319,5 @@ export declare function withIntuticApproval<T extends Record<string, WorkflowToo
206
319
  * the call, which is harmless but emits duplicate gate telemetry.
207
320
  */
208
321
  export declare function wrapWorkflowTools<T extends AnyFn | ExecutableTool>(tools: Record<string, T>, gate?: Gate): Record<string, T>;
322
+ export {};
209
323
  //# sourceMappingURL=workflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,EAAwB,KAAK,IAAI,EAAkB,MAAM,WAAW,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAa,KAAK,KAAK,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE3E;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,SAAgB,KAAK,EAAG,IAAI,CAAS;gBACzB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAK7D,uEAAuE;IACvE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,sBAAsB;IAIhE;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CASnC;AAED;;;;qEAIqE;AACrE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;+BAE+B;AAC/B,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,4BAA4B,KAClC,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB,MAAM,WAAW,2BAA2B;IAC1C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,IAAI,CAAA;IACX;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,2BAAgC,GACrC,qBAAqB,CAcvB;AAED;;mDAEmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,OAAO,CAAC,CAAA;IACrE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC5E,KAAK,EAAE,CAAC,EACR,IAAI,GAAE,2BAAgC,GACrC,CAAC,CAiBH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,KAAK,GAAG,cAAc,EAChE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,IAAI,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAWnB"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
package/dist/workflow.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
- * `@ai-sdk/workflow` adapter: `intuticNeedsApproval()`, `withIntuticApproval()`,
3
- * `wrapWorkflowTools()`, and the FatalError-compatible `IntuticWorkflowRefusal`.
2
+ * `@ai-sdk/workflow` adapter: `withIntuticApproval()`, `intuticNeedsApproval()`,
3
+ * `intuticApprovalStep()`, `wrapWorkflowTools()`, and the FatalError-compatible
4
+ * `IntuticWorkflowRefusal`.
4
5
  *
5
6
  * `@intutic/gate/workflow` — the same idea `vercel.ts` implements for the base
6
7
  * `ai` package (wrap the framework's own veto point around this package's
@@ -9,10 +10,11 @@
9
10
  *
10
11
  * ## 1. The veto surface is per-tool `needsApproval`, not an agent option
11
12
  *
12
- * Confirmed against a real install (`@ai-sdk/workflow@1.0.69`):
13
- * `WorkflowAgent`/`WorkflowAgentOptions` carry ZERO approval fields — the
14
- * string `toolApproval` does not appear anywhere in the package's shipped
15
- * `.d.ts`. The veto surface is `needsApproval` (boolean | function) on the
13
+ * Confirmed against a real install (`@ai-sdk/workflow@1.0.69`, re-read on
14
+ * 2.0.58): `WorkflowAgent`/`WorkflowAgentOptions` carry NO approval-policy
15
+ * field — 1.x's shipped `.d.ts` never mentions `toolApproval`, and 2.x adds
16
+ * only `experimental_toolApprovalSecret`, an HMAC secret that signs approval
17
+ * requests so a replayed approval can be verified, not a veto. The veto surface is `needsApproval` (boolean | function) on the
16
18
  * TOOL definition, exactly as the framework's own workflow-agent docs
17
19
  * describe under "Tool Approval". The compiled agent loop confirms the
18
20
  * semantics (dist/index.js): `needsApproval == null` → no approval; a
@@ -22,9 +24,9 @@
22
24
  * later — so this framework, uniquely in this package, has a real
23
25
  * human-in-the-loop lane for the gate to route into.
24
26
  *
25
- * (`ai@7.0.68` marks tool-level `needsApproval` `@deprecated` in favour of
26
- * generateText-level `toolApproval` — but `@ai-sdk/workflow`'s OWN agent loop
27
- * reads the tool-level field and exposes no other veto surface, so it is the
27
+ * (`ai@7` — still in 7.0.127 — marks tool-level `needsApproval` `@deprecated`
28
+ * in favour of generateText-level `toolApproval` — but `@ai-sdk/workflow`'s
29
+ * OWN agent loop (1.x and 2.0.58 alike) reads the tool-level field and exposes no other veto surface, so it is the
28
30
  * correct — indeed the only — integration point here. Noted in the TD entry
29
31
  * this phase filed, so a future @ai-sdk/workflow release moving to the
30
32
  * generateText-shaped surface gets caught rather than silently ungated.)
@@ -33,11 +35,13 @@
33
35
  *
34
36
  * A durable workflow retries failed steps. Confirmed against real installs
35
37
  * (`workflow@4.8.3` re-exporting `@workflow/errors@4.2.1` via
36
- * `@workflow/core`): the runtime's retry/abort decision consults
37
- * `FatalError.is(err)` (`@workflow/core`'s `runtime/step-handler.js` — a
38
- * fatal error "bubbl[es] up to parent workflow"; anything else is retried
39
- * toward `maxAttempts`), and `FatalError.is()` DUCK-TYPES: it checks
40
- * `err.name === 'FatalError'` on any Error-shaped object, precisely because
38
+ * `@workflow/core`; re-read on `workflow@5.0.1` / `@workflow/errors@5.0.1`):
39
+ * the runtime's retry/abort decision consults `FatalError.is(err)`
40
+ * (`@workflow/core`'s `runtime/step-handler.js` in 4.x,
41
+ * `runtime/step-executor.js` in 5.x — a fatal error "bubbl[es] up to parent
42
+ * workflow"; anything else is retried toward `maxAttempts`), and
43
+ * `FatalError.is()` DUCK-TYPES: it checks `err.name === 'FatalError'` (5.x
44
+ * also accepts `err.fatal === true`) on any Error-shaped object, precisely because
41
45
  * workflows execute in a separate `vm` realm where `instanceof` fails across
42
46
  * the boundary. A plain `IntuticGateRefusal` thrown from `needsApproval` or a
43
47
  * tool body would therefore be RETRIED — a governance denial replayed on a
@@ -56,10 +60,45 @@
56
60
  * "no gate configured" case, which is deterministic and would fail every
57
61
  * retry identically) is made fatal.
58
62
  *
63
+ * ## 3. `needsApproval` runs in the workflow VM — the gate must run in a step
64
+ *
65
+ * Observed in a live run on the Workflow DevKit's local world (TD-498):
66
+ * `WorkflowAgent`'s loop runs inside the `"use workflow"` function, so it
67
+ * calls `needsApproval` in the workflow VM, which has no Node.js modules.
68
+ * `Gate` reads its policy snapshot with `node:fs`, so evaluating it there
69
+ * fails with `require is not defined` — and when the workflow bundle pulls
70
+ * `node:fs` in at module level, EVERY workflow sharing that bundle fails at
71
+ * load (observed with `workflow/nitro`).
72
+ *
73
+ * So the gate runs in a STEP, which has full Node.js and is durable. The
74
+ * caller declares one `"use step"` function in their own module — the
75
+ * directive must sit in a module the workflow bundler transforms, and the
76
+ * step's body must build/receive the `Gate` itself, because step arguments
77
+ * are serialized and a `Gate` instance is not serializable — whose body is
78
+ * {@link intuticApprovalStep}, and passes it as `{ step }`:
79
+ *
80
+ * ```ts
81
+ * export async function intuticGate(toolName: string, input: unknown) {
82
+ * 'use step'
83
+ * return intuticApprovalStep(toolName, input, { gate: new Gate({ ... }) })
84
+ * }
85
+ * // in the workflow: tools: withIntuticApproval(tools, { step: intuticGate })
86
+ * ```
87
+ *
88
+ * With `{ step }`, the `needsApproval` this module builds only calls the step
89
+ * (a durable step invocation from the VM's point of view) and maps its
90
+ * boolean; nothing Node-only runs in the VM. This module itself is safe to
91
+ * import into workflow code: it imports nothing that touches Node.js
92
+ * (`errors.ts`, `registry.ts`, `wrapTools.ts`; `Gate` is a type-only
93
+ * import). Without `{ step }`, the gate is evaluated in-process, which still
94
+ * works wherever Node.js is available (inside a step, or any plain `ai`
95
+ * loop); called in the workflow VM it throws an {@link IntuticWorkflowRefusal}
96
+ * naming this fix instead of failing with `require is not defined`.
97
+ *
59
98
  * @module
60
99
  */
61
- import { active as activeGate } from './gate.js';
62
100
  import { IntuticGateRefusal } from './errors.js';
101
+ import { active as activeGate } from './registry.js';
63
102
  import { wrapTools } from './wrapTools.js';
64
103
  /**
65
104
  * A refused call inside a durable workflow.
@@ -97,6 +136,25 @@ export class IntuticWorkflowRefusal extends IntuticGateRefusal {
97
136
  (value.message.startsWith('[Intutic Governance] BLOCKED:')));
98
137
  }
99
138
  }
139
+ // Set on the workflow VM's global object by the Workflow DevKit runtime
140
+ // (`@workflow/core`'s `workflow.js`: `vmGlobalThis[WORKFLOW_USE_STEP] =
141
+ // useStep`); never set in the Node.js realm where steps execute.
142
+ const WORKFLOW_USE_STEP = Symbol.for('WORKFLOW_USE_STEP');
143
+ function inWorkflowSandbox() {
144
+ return typeof globalThis[WORKFLOW_USE_STEP] === 'function';
145
+ }
146
+ function refuseInWorkflowSandbox(helper) {
147
+ if (!inWorkflowSandbox())
148
+ return;
149
+ // Fail closed, FatalError-shaped, and NAME THE FIX: the gate needs
150
+ // Node.js, which the workflow VM does not have, and retrying cannot
151
+ // change that.
152
+ throw new IntuticWorkflowRefusal(`${helper} ran inside the workflow sandbox, which has no Node.js, so the gate cannot evaluate ` +
153
+ 'the call there. Run it in a "use step" function: declare ' +
154
+ "`async function intuticGate(toolName, input) { 'use step'; return intuticApprovalStep(toolName, input, { gate }) }` " +
155
+ 'and pass { step: intuticGate } to withIntuticApproval()/intuticNeedsApproval(). ' +
156
+ 'Refusing to run the tool unguarded.', 'WORKFLOW_SANDBOX');
157
+ }
100
158
  function requireGate(gate, helper) {
101
159
  const g = gate ?? activeGate();
102
160
  if (g === null) {
@@ -116,26 +174,60 @@ function renderWorkflowToolInput(input) {
116
174
  return { args: [input] };
117
175
  }
118
176
  /**
119
- * Build an async `needsApproval` function for ONE workflow tool:
177
+ * The gate evaluation for ONE call, written to be the body of the caller's
178
+ * `"use step"` function (see module doc, section 3):
120
179
  *
121
180
  * ```ts
122
- * import { WorkflowAgent } from '@ai-sdk/workflow'
123
- * import { Gate, install } from '@intutic/gate'
124
- * import { intuticNeedsApproval } from '@intutic/gate/workflow'
125
- *
126
- * install(new Gate({ workspaceId: process.env.INTUTIC_WORKSPACE_ID }))
127
- *
128
- * const agent = new WorkflowAgent({
129
- * model,
130
- * tools: {
131
- * deployService: {
132
- * description: '...',
133
- * inputSchema,
134
- * execute: deployStep,
135
- * needsApproval: intuticNeedsApproval('deployService'),
136
- * },
137
- * },
138
- * })
181
+ * // workflows/intutic-gate.ts
182
+ * import { Gate } from '@intutic/gate'
183
+ * import { intuticApprovalStep } from '@intutic/gate/workflow'
184
+ *
185
+ * export async function intuticGate(toolName: string, input: unknown): Promise<boolean> {
186
+ * 'use step'
187
+ * return intuticApprovalStep(toolName, input, {
188
+ * gate: new Gate({ workspaceId: process.env.INTUTIC_WORKSPACE_ID }),
189
+ * })
190
+ * }
191
+ * ```
192
+ *
193
+ * Reference `@intutic/gate` only inside step bodies in that module: the
194
+ * workflow bundler also bundles it into the VM with the step bodies
195
+ * replaced, and a module-level use would keep the Node-only gate there.
196
+ *
197
+ * Verdict mapping: BLOCK → throws {@link IntuticWorkflowRefusal} (fatal — the
198
+ * step runs once and the run fails instead of retry-looping; see module doc);
199
+ * ALLOW → `false`, or `true` with `onAllow: 'human'`. A non-refusal crash in
200
+ * the gate is re-thrown untouched (the step retries — correct for
201
+ * transients). Requires a gate (`{ gate }` or `install()` in the process
202
+ * that runs steps); called in the workflow VM itself, it throws naming the
203
+ * fix.
204
+ */
205
+ export async function intuticApprovalStep(toolName, input, opts = {}) {
206
+ refuseInWorkflowSandbox('intuticApprovalStep()');
207
+ const g = requireGate(opts.gate, 'intuticApprovalStep()');
208
+ try {
209
+ await g.guard(toolName, renderWorkflowToolInput(input));
210
+ }
211
+ catch (exc) {
212
+ if (exc instanceof IntuticGateRefusal && !(exc instanceof IntuticWorkflowRefusal)) {
213
+ throw IntuticWorkflowRefusal.from(exc);
214
+ }
215
+ throw exc;
216
+ }
217
+ return opts.onAllow === 'human';
218
+ }
219
+ /**
220
+ * Build an async `needsApproval` function for ONE workflow tool. On a
221
+ * `WorkflowAgent`, pass the caller's gate step (see
222
+ * {@link intuticApprovalStep}):
223
+ *
224
+ * ```ts
225
+ * deployService: {
226
+ * description: '...',
227
+ * inputSchema,
228
+ * execute: deployStep,
229
+ * needsApproval: intuticNeedsApproval('deployService', { step: intuticGate }),
230
+ * },
139
231
  * ```
140
232
  *
141
233
  * The tool name is a parameter because the framework's `needsApproval`
@@ -144,25 +236,28 @@ function renderWorkflowToolInput(input) {
144
236
  * {@link withIntuticApproval} to attach this to a whole tools record without
145
237
  * hand-repeating each name.
146
238
  *
239
+ * With `{ step }`, the returned function only calls the step and maps its
240
+ * answer — safe in the workflow VM. Without it, the gate is evaluated
241
+ * in-process (`{ gate }` or the installed gate), which needs Node.js: fine in
242
+ * a plain `ai` loop or inside a step, and in the workflow VM it throws an
243
+ * {@link IntuticWorkflowRefusal} naming the `{ step }` fix.
244
+ *
147
245
  * Verdict mapping: BLOCK → throws {@link IntuticWorkflowRefusal} (fatal —
148
246
  * aborts instead of retry-looping; see module doc); ALLOW → `false` or `true`
149
247
  * per `onAllow`. A non-refusal crash in the gate is re-thrown untouched
150
248
  * (retryable — correct for transients).
151
249
  */
152
250
  export function intuticNeedsApproval(toolName, opts = {}) {
153
- const onAllow = opts.onAllow ?? 'auto';
154
- return async (input, _options) => {
155
- const g = requireGate(opts.gate, 'intuticNeedsApproval()');
156
- try {
157
- await g.guard(toolName, renderWorkflowToolInput(input));
158
- }
159
- catch (exc) {
160
- if (exc instanceof IntuticGateRefusal && !(exc instanceof IntuticWorkflowRefusal)) {
161
- throw IntuticWorkflowRefusal.from(exc);
162
- }
163
- throw exc;
164
- }
165
- return onAllow === 'human';
251
+ const human = (opts.onAllow ?? 'auto') === 'human';
252
+ const step = opts.step;
253
+ if (step !== undefined) {
254
+ // A refusal thrown by the step reaches here already FatalError-shaped
255
+ // (it crossed the step boundary as one) and is rethrown untouched.
256
+ return async (input) => (await step(toolName, input)) || human;
257
+ }
258
+ return async (input) => {
259
+ refuseInWorkflowSandbox('intuticNeedsApproval()');
260
+ return intuticApprovalStep(toolName, input, { gate: opts.gate, onAllow: opts.onAllow });
166
261
  };
167
262
  }
168
263
  /**
@@ -170,13 +265,29 @@ export function intuticNeedsApproval(toolName, opts = {}) {
170
265
  * `needsApproval` the tool already declares:
171
266
  *
172
267
  * ```ts
173
- * const agent = new WorkflowAgent({ model, tools: withIntuticApproval(tools) })
268
+ * import { WorkflowAgent } from '@ai-sdk/workflow'
269
+ * import { withIntuticApproval } from '@intutic/gate/workflow'
270
+ * import { intuticGate } from './intutic-gate' // the "use step" function
271
+ *
272
+ * export async function deployAgent(messages: ModelMessage[]) {
273
+ * 'use workflow'
274
+ * const agent = new WorkflowAgent({
275
+ * model,
276
+ * tools: withIntuticApproval(tools, { step: intuticGate }),
277
+ * })
278
+ * // ...
279
+ * }
174
280
  * ```
175
281
  *
282
+ * (`{ step }` is what makes this work on a `WorkflowAgent`, whose
283
+ * `needsApproval` runs in the workflow VM — see {@link intuticApprovalStep}
284
+ * and the module doc, section 3. Without it the gate is evaluated
285
+ * in-process, which needs Node.js.)
286
+ *
176
287
  * For each tool (the record KEY is the tool name reported to the gate — the
177
288
  * same identity the framework itself dispatches on):
178
289
  *
179
- * 1. `Gate.guard()` runs first. BLOCK throws {@link IntuticWorkflowRefusal}.
290
+ * 1. The gate runs first. BLOCK throws {@link IntuticWorkflowRefusal}.
180
291
  * 2. On allow, the tool's OWN prior `needsApproval` still applies: a
181
292
  * boolean is returned as-is; a function is awaited with the original
182
293
  * arguments; a tool with none falls back to `onAllow` ('auto' → false).
@@ -217,7 +328,9 @@ export function withIntuticApproval(tools, opts = {}) {
217
328
  * "no gate configured" handling and the record-key-is-tool-name convention —
218
329
  * is `wrapTools`'s own behaviour, reused rather than reimplemented.
219
330
  *
220
- * Prefer {@link withIntuticApproval} as the primary integration: it uses the
331
+ * Call it inside the tool's `"use step"` body (it evaluates the gate
332
+ * in-process, so it needs Node.js). Prefer {@link withIntuticApproval} as the
333
+ * primary integration: it uses the
221
334
  * framework's own pre-execution veto surface, refuses BEFORE the durable
222
335
  * step ever starts, and keeps the human-approval lane available. This
223
336
  * execute-level wrapper is defense in depth (or the option for callers whose
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@
28
28
  * wrapped tool with neither throws, refusing to run the tool unguarded
29
29
  * rather than silently skipping enforcement.
30
30
  */
31
- import { type Gate } from './gate.js';
31
+ import type { Gate } from './gate.js';
32
32
  export type AnyFn = (...args: any[]) => any;
33
33
  export interface ExecutableTool {
34
34
  execute: AnyFn;
@@ -1 +1 @@
1
- {"version":3,"file":"wrapTools.d.ts","sourceRoot":"","sources":["../src/wrapTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAwB,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAG3D,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAE3C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B;uEACmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;AAC3E,wBAAgB,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;AAgBtF;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAA;AAClG,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,cAAc,EACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,IAAI,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"wrapTools.d.ts","sourceRoot":"","sources":["../src/wrapTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIrC,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAE3C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B;uEACmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;AAC3E,wBAAgB,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;AAgBtF;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAA;AAClG,wBAAgB,SAAS,CAAC,CAAC,SAAS,KAAK,GAAG,cAAc,EACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE,IAAI,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA"}
package/dist/wrapTools.js CHANGED
@@ -28,7 +28,7 @@
28
28
  * wrapped tool with neither throws, refusing to run the tool unguarded
29
29
  * rather than silently skipping enforcement.
30
30
  */
31
- import { active as activeGate } from './gate.js';
31
+ import { active as activeGate } from './registry.js';
32
32
  const GUARDED = Symbol.for('intutic.gate.guarded');
33
33
  function isGuarded(fn) {
34
34
  return fn[GUARDED] === true;