@uipath/maestro-builder-sdk 6.42.0 → 6.44.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 (61) hide show
  1. package/dist/api-index.md +104 -103
  2. package/dist/api-members.md +319 -317
  3. package/dist/check.d.ts +0 -19
  4. package/dist/check.js +140 -1042
  5. package/dist/compile-cli.js +2 -1
  6. package/dist/core/actions.d.ts +10 -713
  7. package/dist/core/actions.js +0 -193
  8. package/dist/core/agent-sidecar.d.ts +186 -0
  9. package/dist/core/agent-sidecar.js +409 -0
  10. package/dist/core/agent-tool-resources.d.ts +62 -0
  11. package/dist/core/agent-tool-resources.js +81 -0
  12. package/dist/{config.js → core/connector-configuration.js} +2 -2
  13. package/dist/core/form-field-type.d.ts +7 -0
  14. package/dist/core/form-field-type.js +12 -2
  15. package/dist/core/node-id-placeholder.d.ts +8 -0
  16. package/dist/core/node-id-placeholder.js +10 -0
  17. package/dist/core/ts-literal.d.ts +6 -0
  18. package/dist/core/ts-literal.js +15 -0
  19. package/dist/core/typed-raw-node.js +0 -5
  20. package/dist/decompile.js +239 -857
  21. package/dist/flow-expr-check.js +5 -0
  22. package/dist/flow-node-registry.js +2 -1
  23. package/dist/flow-node-type.d.ts +139 -6
  24. package/dist/flow-sdk.d.ts +41 -5
  25. package/dist/flow-sdk.js +15 -1
  26. package/dist/flow-step-variables.d.ts +4 -0
  27. package/dist/flow-step-variables.js +22 -0
  28. package/dist/loop-version.d.ts +23 -6
  29. package/dist/loop-version.js +37 -15
  30. package/dist/nodes/agent/flow/check.d.ts +88 -0
  31. package/dist/nodes/agent/flow/check.js +873 -0
  32. package/dist/nodes/agent/flow/factories.d.ts +134 -0
  33. package/dist/nodes/agent/flow/factories.js +143 -0
  34. package/dist/nodes/agent/flow/family.d.ts +3 -0
  35. package/dist/nodes/agent/flow/family.js +8 -0
  36. package/dist/nodes/agent/flow/index.d.ts +3 -0
  37. package/dist/nodes/agent/flow/index.js +3 -0
  38. package/dist/nodes/agent/flow/inline-agent-lift.d.ts +44 -0
  39. package/dist/nodes/agent/flow/inline-agent-lift.js +572 -0
  40. package/dist/nodes/agent/flow/inline-agent.d.ts +15 -0
  41. package/dist/nodes/agent/flow/inline-agent.js +526 -0
  42. package/dist/nodes/agent/flow/node-type.d.ts +20 -0
  43. package/dist/nodes/agent/flow/node-type.js +422 -0
  44. package/dist/nodes/agent/flow/resources.d.ts +502 -0
  45. package/dist/nodes/agent/flow/resources.js +1409 -0
  46. package/dist/nodes/agent/flow/spec.d.ts +448 -0
  47. package/dist/nodes/agent/flow/spec.js +1 -0
  48. package/dist/nodes/hitl/flow/check.js +15 -0
  49. package/dist/nodes/hitl/flow/node-type.js +18 -3
  50. package/dist/nodes/process/flow/check.d.ts +40 -2
  51. package/dist/nodes/process/flow/check.js +156 -0
  52. package/dist/nodes/process/flow/factories.d.ts +58 -3
  53. package/dist/nodes/process/flow/factories.js +59 -2
  54. package/dist/nodes/process/flow/node-type.d.ts +4 -1
  55. package/dist/nodes/process/flow/node-type.js +198 -12
  56. package/dist/nodes/process/flow/spec.d.ts +112 -5
  57. package/dist/serialize.d.ts +9 -54
  58. package/dist/serialize.js +102 -2777
  59. package/package.json +2 -2
  60. /package/dist/{config.d.ts → core/connector-configuration.d.ts} +0 -0
  61. /package/dist/{ixp-definition.json → core/ixp-definition.json} +0 -0
@@ -228,6 +228,15 @@ export interface AskedField extends FormFieldSettings {
228
228
  direction: 'output';
229
229
  /** Reviewer must fill it in before the task can be completed. */
230
230
  required?: boolean;
231
+ /**
232
+ * The flow variable the answer lands in, read downstream as `$vars.<variable>`
233
+ * (`v('<variable>')`) — the name only, without the `vars.` prefix. Defaults to
234
+ * the field id. Studio Web names it `<Step>_<field>` (`P_comments`) and later
235
+ * steps read `$vars.P_comments` or bind `vars.P_comments`; declaring it here is
236
+ * what makes those reads resolve, so a designer-saved approval flow round-trips
237
+ * through the SDK. The answer is also always `out('<step>', '<id>')`.
238
+ */
239
+ variable?: string;
231
240
  }
232
241
  /**
233
242
  * A value the reviewer READS **and can correct**: pre-filled from the flow,
@@ -248,151 +257,6 @@ export interface InOutField extends FormFieldSettings {
248
257
  required?: boolean;
249
258
  }
250
259
  export type FormField = ShownField | AskedField | InOutField;
251
- /**
252
- * How a conversational agent gets its turn — the node's own
253
- * `conversationalAgentSettings` sub-object.
254
- *
255
- * @remarks
256
- * `'simple'` (the default) derives everything from ONE conversation-context
257
- * binding: `context` is the whole context object, and the platform reads
258
- * `conversationId` / `latestExchangeId` / `messages` / `userSettings` out of
259
- * it. `'custom'` binds each field yourself — for a flow that assembles a turn
260
- * from more than one source.
261
- */
262
- export interface ConversationalAgentSettings {
263
- mode?: 'simple' | 'custom';
264
- /** The whole conversation context — `'simple'` mode's single binding. */
265
- context?: Expr | string;
266
- /** `'custom'` mode: the conversation id. */
267
- conversationId?: Expr | string;
268
- /** `'custom'` mode: the exchange id. */
269
- exchangeId?: Expr | string;
270
- /** `'custom'` mode: the chat history array. */
271
- messages?: Expr | string;
272
- /** `'custom'` mode: the caller's per-user settings object. */
273
- userSettings?: Expr | string;
274
- }
275
- export interface ConversationalAgentInputs {
276
- /**
277
- * The agent's standing instructions for the conversation. Plain text — a
278
- * conversational agent's turn comes from the transcript, not from flow
279
- * arguments, so there is no `{{input.…}}` templating.
280
- */
281
- systemPrompt: string;
282
- /** The MODEL to run, e.g. `'gpt-5.4'`. Required by the node's definition. */
283
- model: string;
284
- /**
285
- * How the agent gets its turn. The common case is
286
- * `{ context: out('<waitStep>', 'conversationContext') }` — one binding the
287
- * platform reads conversation id, exchange id, history and user settings out
288
- * of. See {@link ConversationalAgentSettings}.
289
- */
290
- settings: ConversationalAgentSettings;
291
- /**
292
- * Whether the agent's reply CLOSES the exchange.
293
- *
294
- * @deprecated Has no effect and is not emitted. The platform retired the input:
295
- * the conversational agent's v1.7 node migration removes it, and the converter
296
- * always sends `conversationalService.endExchange = ''`. Wait-for-message and
297
- * the end of the conversation close open exchanges.
298
- */
299
- endExchange?: boolean;
300
- /** Sampling temperature, 0–1. */
301
- temperature?: number;
302
- /** Max tokens in one response. */
303
- maxTokenPerResponse?: number;
304
- /**
305
- * The model's own context ceiling.
306
- *
307
- * @deprecated Has no effect and is not emitted. Studio Web derives it from the
308
- * selected model.
309
- */
310
- modelMaxTokens?: number;
311
- /** How many tool-calling rounds one turn may take, 1–100. */
312
- maxIterations?: number;
313
- /** Safety rails, the same array `inlineAgent` takes. */
314
- guardrails?: AgentGuardrail[];
315
- /**
316
- * The agent's own directory name (a UUID) — the node carries it as `source`
317
- * and the compiler writes `<source>/agent.json` beside the flow. Derived from
318
- * the flow id + step name when omitted.
319
- */
320
- source?: string;
321
- }
322
- export interface CreateOutgoingCallInputs {
323
- /**
324
- * The number to call FROM — a provisioned number on the tenant's telephony
325
- * provider, in E.164 (`'+15551234567'`). Required.
326
- */
327
- from: string | Expr;
328
- /** The number to call, in E.164. Required. */
329
- to: string | Expr;
330
- }
331
- export interface EndCallInputs {
332
- /**
333
- * The call to hang up — bind the `callContext` published by the incoming-call
334
- * trigger (`out('start', 'callContext')`) or by `createOutgoingCall`
335
- * (`out('<step>', 'callContext')`). Required.
336
- */
337
- callContext: Expr | string;
338
- }
339
- /**
340
- * The audio settings a voice agent speaks with.
341
- *
342
- * @remarks
343
- * `model` is a VOICE model (a live/realtime one — not the text models
344
- * `inlineAgent` takes), and `persona` is one of that model's own voices, so the
345
- * two travel together. The platform's catalog today is
346
- * `'gemini-3.1-flash-live-preview'` (personas Aoede, Charon, Fenrir, Kore,
347
- * Leda, Orus, Puck, Zephyr) and `'gpt-realtime-2'` (alloy, ash, ballad, coral,
348
- * echo, sage, shimmer, verse); omit both for the platform default.
349
- */
350
- export interface VoiceSettings {
351
- /** The voice model, e.g. `'gemini-3.1-flash-live-preview'`. */
352
- model?: string;
353
- /** One of that model's personas, e.g. `'Kore'`. */
354
- persona?: string;
355
- /** Sampling temperature, 0–1. */
356
- temperature?: number;
357
- /** Max tokens per response. */
358
- maxTokens?: number;
359
- /** The model's own context ceiling — informational. */
360
- modelMaxTokens?: number;
361
- }
362
- export interface VoiceAgentInputs {
363
- /**
364
- * The agent's standing instructions — who it is on the call and what it must
365
- * do. Use `{{input.<name>}}` placeholders for values declared in `inputs`;
366
- * the caller's audio remains the conversational turn.
367
- */
368
- systemPrompt: string;
369
- /**
370
- * Flow values made available to `systemPrompt` placeholders. Each key must
371
- * be referenced as `{{input.<key>}}`; the compiler emits the node's runtime
372
- * argument binding and the matching agent.json input contract together.
373
- */
374
- inputs?: Record<string, unknown>;
375
- /**
376
- * The call to attach the agent to — the `callContext` from the incoming-call
377
- * trigger or `createOutgoingCall`. Required: without it the agent has no
378
- * audio channel to join.
379
- */
380
- callContext: Expr | string;
381
- /** How the agent sounds. Omit for the platform default voice. */
382
- voice?: VoiceSettings;
383
- /**
384
- * How many tool-calling rounds the agent may take in one turn. The node's
385
- * schema allows **1–8** — a tighter ceiling than a text agent's, because a
386
- * caller is waiting.
387
- */
388
- maxIterations?: number;
389
- /**
390
- * The agent's own directory name (a UUID) — the node carries it as `source`
391
- * and the compiler writes `<source>/agent.json` beside the flow. Omit and one
392
- * is derived from the flow id + step name, so a recompile is not a diff.
393
- */
394
- source?: string;
395
- }
396
260
  /**
397
261
  * Split an extractor's node type into the two GUIDs its tail packs.
398
262
  *
@@ -491,107 +355,6 @@ export interface IxpExtractInputs {
491
355
  * (`'in-solution'`). Shared by `rpaWorkflow`, `agenticProcess` and `agent`.
492
356
  */
493
357
  export type ProcessLocation = 'published' | 'in-solution';
494
- /**
495
- * Which KIND of agent project was published behind a `uipath.core.agent.<key>`
496
- * resource. Display-only — see {@link AgentInputs.flavour}.
497
- */
498
- export type AgentFlavour = 'coded' | 'lowcode';
499
- export type AgentLocation = ProcessLocation;
500
- export interface AgentInputs {
501
- /**
502
- * The agent resource key (a GUID). It becomes the node's TYPE,
503
- * `uipath.core.agent.<key>`. For a published agent this is the Orchestrator
504
- * release key; for an in-solution sibling it is `resource.key` from
505
- * `resources/solution_folder/process/agent/<project>.json`.
506
- *
507
- * Find it with `uip or processes list --all-folders --process-type Agent` (an agent's
508
- * `ProcessKey` reads `<project>.agent.<name>`; the GUID you want is the row's
509
- * **`Key`**) or `uip maestro flow registry search uipath.core.agent`.
510
- *
511
- * Pass `--limit`: `--all-folders` returns 50 rows and reports the truncation
512
- * only in `Pagination.HasMore`, so an agent that exists can look absent.
513
- */
514
- key: string;
515
- /** The agent project name. */
516
- name: string;
517
- /**
518
- * Where the referenced agent lives. Published is the backward-compatible
519
- * default. Use `in-solution` only after registering a sibling agent project
520
- * with `uip solution projects add`.
521
- */
522
- location?: AgentLocation;
523
- /**
524
- * The Orchestrator folder holding it — e.g.
525
- * `'Shared/uipath-maestro-flow/CountLetters LowCode'`.
526
- *
527
- * **Not optional, and not cosmetic.** Agent names are unique per FOLDER, not per
528
- * tenant: `codereval/DefaultTenant` carries two agents called `CountLetters`,
529
- * one in `Shared` and one in `Shared/uipath-maestro-flow/CountLetters CodedAgent`,
530
- * with different release keys. The release is resolved by listing THIS
531
- * folder, so the folder is what picks the agent you meant. Required for a
532
- * published agent; omit it for an in-solution sibling.
533
- */
534
- folderPath?: string;
535
- /**
536
- * The sibling agent project's `resource.projectKey`, read from
537
- * `resources/solution_folder/process/agent/<project>.json`. Required only
538
- * when `location` is `in-solution`.
539
- */
540
- projectId?: string;
541
- /**
542
- * The AGENT's own input arguments, by its own argument names (e.g.
543
- * `{ inputString: 'arrow' }`). Every agent declares its own — read them from
544
- * `uip maestro flow registry get uipath.core.agent.<agent>` under
545
- * `inputDefinition.properties`.
546
- *
547
- * **Required, unlike the other job families' `inputs`.** An agent node with
548
- * nothing bound is one the platform REWRITES behind your back: flow-v1's
549
- * `applyEmptyInputFloor` seeds `JobArguments: { input: <empty-for-declared-type> }`
550
- * — a key named `input`, which is not in the agent's own schema unless the agent
551
- * happens to declare one — because the Python agent runner validates the body
552
- * against a schema with a required `input` field and rejects a bare `{}` with
553
- * *"Field required: input"* (the pod then exits `0x33`). Locally the envelope
554
- * passes straight through and the run is green, so nothing but a checker can see
555
- * it. Pass `{}` explicitly if you really mean "no arguments" and `check` will
556
- * tell you what the platform will do with it.
557
- */
558
- inputs: Record<string, unknown>;
559
- /**
560
- * The agent's OUTPUT fields and their types (e.g.
561
- * `{ count: 'integer', inputString: 'string' }`). Required if anything reads the
562
- * step's output, for the same reason as `rpaWorkflow`'s: the schema lives on the
563
- * tenant and authoring happens offline, so an undeclared read is rejected —
564
- * rightly, since nothing offline could tell a real field from a typo.
565
- *
566
- * `uip maestro flow registry get uipath.core.agent.<agent>` shows what the
567
- * platform declares, under `outputDefinition.output.schema.properties`.
568
- *
569
- * **Case matters.** The agent answers with the field names its own definition
570
- * declares (`count`, not `Count`). It used to be a live-only trap: a poller that
571
- * read the job through `uip agent run status` got a PascalCased envelope, so a
572
- * read of `count` was right offline and `undefined` live (flow-builder-sdk #122).
573
- * Declare the names the definition declares.
574
- *
575
- * @enforcedBy AGENT_READ_WITHOUT_RETURNS Reading a field off the result requires
576
- * declaring it here.
577
- */
578
- returns?: Record<string, ReturnFieldType>;
579
- /**
580
- * Whether the published resource is a CODED agent project (LangGraph /
581
- * LlamaIndex / OpenAI Agents) or a low-code one built in Agent Builder.
582
- *
583
- * **Display-only, and it is the only thing that differs.** `registry get` on a
584
- * coded and a low-code agent returns the same node type, the same
585
- * `Orchestrator.StartAgentJob` service type, the same `sortOrder` and the
586
- * same bindings shape; the single difference is `display.icon` —
587
- * `coded-agent` vs `autonomous-agent`. Which one a given resource is cannot be
588
- * known offline, so it is stated here rather than guessed. Check with
589
- * `uip maestro flow registry get uipath.core.agent.<agent>` → `display.icon`.
590
- *
591
- * Defaults to `'lowcode'`. Nothing in the runtime keys on it.
592
- */
593
- flavour?: AgentFlavour;
594
- }
595
358
  /** A JSON-schema-ish type for one field of an inline agent's input/output schema. */
596
359
  export type InlineAgentFieldType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array';
597
360
  /**
@@ -607,7 +370,7 @@ export type InlineAgentFieldType = 'string' | 'number' | 'integer' | 'boolean' |
607
370
  * This type exists so that stays true. It was previously spelled inline at
608
371
  * seven sites, `'integer'` was added to three of them, and the four left behind
609
372
  * were not distinguishable by any contract — `rpaWorkflow` in particular is
610
- * decompiled by the SAME line of `emitPublishedResource` as `apiWorkflow`, so a
373
+ * decompiled by the SAME lift (`liftProcess`) as `apiWorkflow`, so a
611
374
  * deployed process with an integer output round-tripped to source that would
612
375
  * not compile.
613
376
  */
@@ -720,267 +483,6 @@ export interface BuiltInValidatorGuardrail {
720
483
  }>;
721
484
  }
722
485
  export type AgentGuardrail = CustomGuardrail | BuiltInValidatorGuardrail;
723
- export interface InlineAgentInputs {
724
- /**
725
- * The MODEL to run, e.g. `'gpt-5.4'`. Required by the node's definition, and
726
- * worth a thought rather than a default: the platform's own scaffold ships
727
- * `gpt-4o-2024-11-20`, which is stale, and v1's own smoke check for this node
728
- * type FAILS a flow that keeps it. List what the tenant has with
729
- * `uip agent model list`.
730
- */
731
- model: string;
732
- /**
733
- * The agent's standing instructions — who it is, and what each `returns` field
734
- * should hold. Required by the definition (`minLength: 1`).
735
- *
736
- * **Write it as plain text, and reference a value as `{{input.<name>}}`** — the
737
- * agent's own template syntax, and the same names `inputs` declares:
738
- *
739
- * ```ts
740
- * systemPrompt: 'You classify support email. Return a result conforming to the output '
741
- * + 'schema. category: billing | technical | account. priority: low | normal | high.',
742
- * userPrompt: 'Classify this email:\n{{input.body}}',
743
- * inputs: { body: input('body') },
744
- * returns: { category: 'string', priority: 'string' },
745
- * ```
746
- *
747
- * Why a placeholder rather than an interpolated expression: an inline agent is two
748
- * artifacts, and its prompt exists in TWO dialects. You write one; the compiler
749
- * emits the other into the `agent.json` sidecar. The `.flow` node carries no copy
750
- * of the prompt: it is a shell, so Studio Web reads the sidecar.
751
- *
752
- * 1. yours `{{input.claim}}`
753
- * 2. the AGENT.JSON `{{input.prepare__output__claimRef}}` ← what the runtime SENDS
754
- *
755
- * The second exists because the platform does not send an agent the names you
756
- * declared: it names each argument after the bound reference PATH, `__`-joined.
757
- * For a flow input the two coincide (`$vars.notes` → `notes`); for a step output
758
- * they do not, and a sidecar still saying `{{input.claim}}` templates against a key
759
- * that is not there — the literal text reaches the model. See the inline-agent
760
- * node reference (`website/reference/inline-agent.md`) §"The prompt dialects".
761
- *
762
- * **The answer's shape is `returns`, not the prompt.** `returns` becomes the node's
763
- * `agentOutputVariables` and the `agent.json` `outputSchema` — what Studio Web's
764
- * Outputs editor writes — and the platform's agent runtime ends each run with a
765
- * built-in structured call (`end_execution`) that fills exactly those fields. So
766
- * `out('<step>', '<field>')` reads a typed value, not text to parse. Describe what
767
- * each field holds, in the product's own wording, as the example above does:
768
- * `Return a result conforming to the output schema. <field>: <how to fill it>.`
769
- *
770
- * Never ask for JSON TEXT as well ("Return ONLY a JSON object with keys …"). The
771
- * model then packs its whole answer, serialized, into ONE string field: a writer
772
- * declaring `{ subject, body }` came back on 2026-09-23 with
773
- * `body: '{"subject":"…","body":"Dear …"}'` in 3 of 3 debug runs, and the flow sent
774
- * that text on. A field that should carry structure is declared `'object'` or
775
- * `'array'` instead.
776
- *
777
- * @enforcedBy INLINE_AGENT_PROMPT_JSON_TEXT A prompt that asks for JSON text while
778
- * `returns` declares fields is refused; the platform accepts it and the run returns
779
- * the packed value.
780
- */
781
- systemPrompt: string;
782
- /**
783
- * The per-run request. Required by the definition (`minLength: 1`). Same
784
- * `{{input.<name>}}` placeholders as `systemPrompt`.
785
- */
786
- userPrompt: string;
787
- /**
788
- * The values the agent gets, by YOUR name for each one — e.g.
789
- * `{ body: input('body') }`. These become the node's `agentInputVariables`
790
- * descriptor array (`{ id, type, binding }`, the shape 48 of 53 deployed instances
791
- * carry) and the `agent.json`'s `inputSchema`.
792
- *
793
- * **The name is yours only in this file.** Both emitted artifacts carry the
794
- * PLATFORM's name — the bound reference's path, `__`-joined
795
- * (`out('prepare','claimRef')` → `prepare__output__claimRef`) — because that is what
796
- * the runtime keys the agent's JobArguments by, and an `agent.json` speaking any
797
- * other name templates against nothing. You never write the long form.
798
- *
799
- * **Reference each one in a prompt as `{{input.<name>}}`.** Not decoration: the
800
- * platform's deployed input list is not necessarily this array. flow-v1's
801
- * `preDeriveAgentInputDefinitions` pre-pass scans the node's PROMPTS for `$vars.*`
802
- * references, merges what it finds with this list, and — when its caller asks for
803
- * pruning — DROPS an entry no prompt reference points at. A referenced entry
804
- * survives every one of those paths; an unreferenced one survives only some.
805
- * `check` warns when none of them is referenced, which is the case where the agent
806
- * would arrive with no arguments at all.
807
- *
808
- * Two shapes have no platform name and are handled rather than renamed:
809
- *
810
- * - a **literal** (`{ tier: 'Enterprise' }`) is INLINED into both prompts — there
811
- * is no argument for one, so a token could never substitute;
812
- * - a **computed expression** is refused by `check`
813
- * (`INLINE_AGENT_COMPOSITE_INPUT`): the platform names one argument per
814
- * reference, so an expression spanning several has none. Compute it in a
815
- * `script` step first and bind that step's output.
816
- */
817
- inputs?: Record<string, unknown>;
818
- /**
819
- * The fields the agent must return, and their types — e.g.
820
- * `{ category: 'string', priority: 'string' }`. These become the node's
821
- * `agentOutputVariables` descriptor array AND the emitted `agent.json`'s
822
- * `outputSchema`, and they are what makes `out('<step>', 'category')` a checkable
823
- * read.
824
- *
825
- * Defaults to the definition's own default, `{ content: 'string' }` — which is
826
- * the toy scaffold shape, so declare something real if the flow reads fields.
827
- *
828
- * @enforcedBy INLINE_AGENT_READ_UNKNOWN_FIELD A read outside the declared set is
829
- * undefined on every rung and on the platform.
830
- */
831
- returns?: Record<string, InlineAgentFieldType>;
832
- /**
833
- * The agent's own directory name — a UUID. The node carries it as `source`, and
834
- * the platform resolves the agent's configuration at `<source>/agent.json`
835
- * relative to the project (flow-v1 emits `entryPoint: <source>/agent.json`), so
836
- * the compiler writes that file next to the `.flow`.
837
- *
838
- * Omit it and one is derived from the flow id + step name, so a given flow emits
839
- * the same uuid every time (a random one would make every compile a diff).
840
- */
841
- source?: string;
842
- /** Sampling temperature, 0–1. The definition's range; omit for the model's default. */
843
- temperature?: number;
844
- /** Max tokens in one response, 0–16384. */
845
- maxTokenPerResponse?: number;
846
- /**
847
- * The model's own context ceiling, e.g. `128000`.
848
- *
849
- * @deprecated Has no effect and is not emitted. Studio Web derives it from the
850
- * selected model each time the agent is opened, and the sidecar has no field
851
- * for it.
852
- */
853
- modelMaxTokens?: number;
854
- /** How many tool-calling rounds the agent may take, 1–100. */
855
- maxIterations?: number;
856
- /**
857
- * The harness the agent runs on — `'standard'` (the default) or
858
- * `'advanced'`, written to the `agent.json`'s `settings.mode`. It does not
859
- * change the node's version: every inline agent emits the bundle's newest
860
- * `uipath.agent.autonomous` definition (1.4).
861
- */
862
- mode?: 'standard' | 'advanced';
863
- /**
864
- * Safety rails over the agent's inputs, outputs, LLM calls and tools — the
865
- * platform's own array shape ({@link AgentGuardrail}), carried in the
866
- * `agent.json` (every bundled definition declares the input).
867
- *
868
- * ```ts
869
- * guardrails: [{
870
- * id: 'no-pii', $guardrailType: 'custom', name: 'Block PII',
871
- * selector: { scopes: ['Agent'] },
872
- * action: { $actionType: 'block', reason: 'PII detected' },
873
- * enabledForEvals: true,
874
- * rules: [{ $ruleType: 'word', fieldSelector: { $selectorType: 'all' },
875
- * operator: 'matchesRegex', value: '\\d{3}-\\d{2}-\\d{4}' }],
876
- * }]
877
- * ```
878
- */
879
- guardrails?: AgentGuardrail[];
880
- /**
881
- * Attach an episodic memory so the agent learns from past runs — one
882
- * {@link AgentMemoryRef}, wired to the agent's `memory` handle (declared by
883
- * the bundled 1.4 definition, which every inline agent uses).
884
- */
885
- memory?: AgentMemoryRef;
886
- /**
887
- * GROUND the agent on tenant knowledge — one or more Context Grounding
888
- * (semantic) indexes, wired to the agent's own `context` handle.
889
- *
890
- * ```ts
891
- * inlineAgent({
892
- * model: 'gpt-5.4',
893
- * systemPrompt: 'You decide billing disputes from the SOPs. Return a result conforming to the output '
894
- * + 'schema. determination: valid | invalid | needs_review. rationale: the SOP rule that decided it.',
895
- * userPrompt: 'Dispute: {{input.description}}',
896
- * inputs: { description: input('disputeDescription') },
897
- * returns: { determination: 'string', rationale: 'string' },
898
- * context: [{
899
- * name: 'Billing Dispute SOP Index',
900
- * id: 'cc45b9b4-dbf6-47b3-40ac-08debc0cec5b',
901
- * folderPath: 'Shared/uipath-maestro-flow/BillingDispute',
902
- * query: 'billing dispute resolution policy',
903
- * }],
904
- * })
905
- * ```
906
- *
907
- * Each entry becomes its own NODE —
908
- * `uipath.agent.resource.context.index.<slug>.<id>` — joined to the agent by an
909
- * edge out of the agent's `context` port. That is the platform's own shape: the
910
- * agent definition declares the handle with
911
- * `allowedTargets: [{ nodeType: 'uipath.agent.resource.context.*' }]`, and the
912
- * index's definition declares the mirror
913
- * (`allowedSources: [{ nodeType: 'uipath.agent.autonomous', handleId: 'context' }]`,
914
- * `maxConnections: 1`). Nothing is a binding: the index's identity is IN the node
915
- * type, exactly as a published agent's release key is.
916
- *
917
- * **Both identifiers are needed and neither is derivable.** The node type carries
918
- * a slug of the name AND the index's uuid; the node's inputs carry `indexName` +
919
- * `indexId` again, because the designer reads one and the runtime the other. Find
920
- * them together — the uuid is the tail of the registry node type:
921
- *
922
- * ```bash
923
- * uip maestro flow registry search "<index name>" --output json
924
- * ```
925
- *
926
- * **Grounding is a CLOUD-side capability.** An offline run has no retrieval
927
- * service to reach, so its answer is ungrounded
928
- * however this is configured — which is why an offline rung can only assert the
929
- * WIRING and a live rung only that the agent answered. Say so in a task rather
930
- * than letting a green rung imply retrieval happened.
931
- */
932
- context?: ContextIndexRef | ContextIndexRef[];
933
- /**
934
- * Give the agent TOOLS — capabilities it may call while reasoning, wired to
935
- * the agent's own `tool` handle. Each entry becomes its own resource NODE
936
- * (`uipath.agent.resource.tool.<kind>…`), joined to the agent by an edge out
937
- * of its `tool` port — the same artifact shape as `context`.
938
- *
939
- * ```ts
940
- * tools: [
941
- * { kind: 'builtin', tool: 'summarize' },
942
- * { kind: 'connector', connector: 'uipath-atlassian-jira', operation: 'create-issue',
943
- * connection: 'jira', folder: 'shared' }, // bindings.json labels, both required
944
- * { kind: 'process', key: '6235d64e-b190-4b7a-8918-723df964c068',
945
- * name: 'Create TestCase', folderPath: 'Shared',
946
- * inputs: { title: 'string' }, returns: { id: 'string' } },
947
- * ]
948
- * ```
949
- *
950
- * WHEN a tool runs is the model's decision at run time — nothing in the flow
951
- * calls it. Locally that means tool nodes are never stepped through (they are
952
- * artifacts, not steps), so no local rung proves a tool was USED — only that
953
- * the wiring and shapes are right. Say so in any task that scores this.
954
- */
955
- tools?: ToolRef | ToolRef[];
956
- /**
957
- * Let the agent ESCALATE to a human mid-run — an Action Center app task,
958
- * wired to the agent's own `escalation` handle (its TOP port).
959
- *
960
- * ```ts
961
- * escalation: {
962
- * name: 'ContentReview',
963
- * description: 'Escalate uncertain content to a human reviewer',
964
- * app: {
965
- * key: '454921d6-137f-4897-943a-1ebf29b15f80',
966
- * name: 'ContentReviewApp',
967
- * folderPath: 'Shared',
968
- * inputs: { ContentText: 'string' },
969
- * outputs: { ReviewDecision: 'string' },
970
- * },
971
- * recipients: ['reviewer@example.com'],
972
- * outcomes: ['approve', 'reject'],
973
- * }
974
- * ```
975
- *
976
- * The emitted node type is `uipath.agent.resource.escalation.coded-action-app`
977
- * — the registry's CURRENT spelling (the bare `….escalation` is the pre-split
978
- * era; the agent's handle accepts both, and `registry get` resolves only the
979
- * suffixed one). The other variant, `escalation.quick-form`, is feature-gated
980
- * off on this tenant and not authorable.
981
- */
982
- escalation?: EscalationRef | EscalationRef[];
983
- }
984
486
  /** The three platform-shipped built-in tools (fixed registry types). */
985
487
  export type BuiltinToolName = 'analyzefiles' | 'summarize' | 'batchtransform';
986
488
  /**
@@ -1412,30 +914,6 @@ export interface ContextIndexRef extends AgentResourcePlacement {
1412
914
  * whole body rather than an inputs payload.
1413
915
  */
1414
916
  export interface FlowActionSpecs {
1415
- /** The spec {@link createOutgoingCall} builds. */
1416
- createOutgoingCall: {
1417
- inputs: CreateOutgoingCallInputs;
1418
- };
1419
- /** The spec {@link endCall} builds. */
1420
- endCall: {
1421
- inputs: EndCallInputs;
1422
- };
1423
- /** The spec {@link voiceAgent} builds. */
1424
- voiceAgent: {
1425
- inputs: VoiceAgentInputs;
1426
- };
1427
- /** The spec {@link conversationalAgent} builds. */
1428
- conversationalAgent: {
1429
- inputs: ConversationalAgentInputs;
1430
- };
1431
- /** The spec {@link agent} builds. */
1432
- agent: {
1433
- inputs: AgentInputs;
1434
- };
1435
- /** The spec {@link inlineAgent} builds. */
1436
- inlineAgent: {
1437
- inputs: InlineAgentInputs;
1438
- };
1439
917
  /** The spec {@link ixpExtract} builds. */
1440
918
  ixpExtract: {
1441
919
  inputs: IxpExtractInputs;
@@ -1554,187 +1032,6 @@ export declare function builtinTriggerSpec<S extends object>(spec: S): S;
1554
1032
  * @returns An action spec to pass to `.step(name, …)`.
1555
1033
  */
1556
1034
  export declare function ixpExtract(inputs: IxpExtractInputs): ActionSpec;
1557
- /**
1558
- * Place an outgoing phone call
1559
- * (`uipath.conversational.voice.create-outgoing-call`) and get back the
1560
- * `callContext` every other voice step is keyed by.
1561
- *
1562
- * ```ts
1563
- * .step('dial', createOutgoingCall({ from: '+15550001111', to: input('customerPhone') }))
1564
- * .step('talk', voiceAgent({
1565
- * systemPrompt: 'Confirm the delivery window, then thank them.',
1566
- * callContext: out('dial', 'callContext'),
1567
- * }))
1568
- * ```
1569
- *
1570
- * @param inputs - The provisioned `from` number and the `to` number to dial.
1571
- * @returns An action spec to pass to `.step(...)`.
1572
- */
1573
- export declare function createOutgoingCall(inputs: CreateOutgoingCallInputs): ActionSpec;
1574
- /**
1575
- * Hang up (`uipath.conversational.voice.end-call`). Reads
1576
- * `out('<step>', 'ended')`.
1577
- *
1578
- * @param inputs - The `callContext` of the call to end.
1579
- * @returns An action spec to pass to `.step(...)`.
1580
- */
1581
- export declare function endCall(inputs: EndCallInputs): ActionSpec;
1582
- /**
1583
- * Put a VOICE agent on a live call (`uipath.agent.voice`) — it speaks and
1584
- * listens for one turn, then the flow continues.
1585
- *
1586
- * ```ts
1587
- * .trigger(voiceTrigger())
1588
- * .step('greet', voiceAgent({
1589
- * systemPrompt: 'Greet {{input.customerName}} and find out why they called.',
1590
- * inputs: { customerName: input('customerName') },
1591
- * callContext: out('start', 'callContext'),
1592
- * voice: { model: 'gemini-3.1-flash-live-preview', persona: 'Kore' },
1593
- * }))
1594
- * ```
1595
- *
1596
- * Like `inlineAgent`, compile emits the node PLUS a stable
1597
- * `<source>/agent.json` sidecar. Unlike it, the turn's content comes from the
1598
- * call rather than from a user-prompt argument. Flow context can still be
1599
- * supplied through `inputs` and referenced from the system prompt. There are no
1600
- * declared `returns`: read the turn back as
1601
- * `out('<step>', 'uipath__agent_response_messages')`.
1602
- *
1603
- * @param inputs - The instructions, the call to join, and how the agent sounds.
1604
- * @returns An action spec to pass to `.step(...)`.
1605
- */
1606
- export declare function voiceAgent(inputs: VoiceAgentInputs): ActionSpec;
1607
- /**
1608
- * A CONVERSATIONAL agent (`uipath.agent.conversational`) — it answers one turn
1609
- * of a live chat, reading the transcript rather than flow arguments.
1610
- *
1611
- * ```ts
1612
- * .trigger(conversationTrigger())
1613
- * .step('listen', waitForMessage({ conversationId: out('start', 'conversationId') }))
1614
- * .step('reply', conversationalAgent({
1615
- * model: 'gpt-5.4',
1616
- * systemPrompt: 'You are a support agent. Be brief.',
1617
- * settings: { context: out('listen', 'conversationContext') },
1618
- * }))
1619
- * ```
1620
- *
1621
- * The reply is `out('<step>', 'uipath__agent_response_messages')` — the
1622
- * platform's own field name. Like `inlineAgent`, compile emits the node plus a
1623
- * stable `<source>/agent.json` sidecar.
1624
- *
1625
- * `sendMessage` is the alternative when the flow (not a model) decides what to
1626
- * say; this factory is for when the model does.
1627
- *
1628
- * @param inputs - The model, the instructions, and how the turn is bound.
1629
- * @returns An action spec to pass to `.step(...)`.
1630
- */
1631
- export declare function conversationalAgent(inputs: ConversationalAgentInputs): ActionSpec;
1632
- /**
1633
- * Invoke an AGENT resource — either one published to Orchestrator or a sibling
1634
- * agent project registered in the same solution. Both start through
1635
- * `Orchestrator.StartAgentJob`.
1636
- *
1637
- * @remarks
1638
- * **Coded and low-code agents are the same node.** This one factory authors both.
1639
- * `registry get` on a coded agent and on a low-code one returns the same node type,
1640
- * the same service type, the same `sortOrder` and the same bindings shape; the
1641
- * only difference is the icon, which is what `flavour` sets. Which kind a resource
1642
- * is a property of what somebody published, not of the flow — so if a task asks for
1643
- * "a coded agent", what it is asking you to get right is the RESOURCE you point at.
1644
- *
1645
- * **What this factory cannot do, said plainly:** it does not create an agent. A
1646
- * published resource must already be deployed. An in-solution resource must first
1647
- * be scaffolded and registered with `uip solution projects add`; this factory then
1648
- * authors the local reference from the registered resource key and project id.
1649
- *
1650
- * The three identifiers are separate for `rpaWorkflow`'s reason: `agent` is the key
1651
- * the node's TYPE carries (`uipath.core.agent.<agent>`), while `name` +
1652
- * `folderPath` are what the runtime resolves the job by and together are the
1653
- * `resourceKey`, `"<folderPath>.<name>"`. `folderPath` earns its keep twice here —
1654
- * see {@link AgentInputs.folderPath} for the two-agents-called-CountLetters case.
1655
- *
1656
- * The step WAITS for the job and publishes its output arguments under `output`, so
1657
- * `out('<step>', '<field>')` reads a field `returns` declares — using the names the
1658
- * agent's own definition declares, case included.
1659
- *
1660
- * ── the live bar, stated ─────────────────────────────────────────────────────────
1661
- * A green live rung here means **a model responded with the declared output shape**,
1662
- * not that the answer was right. A real Orchestrator job runs, the flow's input
1663
- * reaches it, and its answer reaches the flow's output — all four independently
1664
- * checkable (`ladder.sh job`). Whether the number it returned is the correct number
1665
- * is the model's business, and no rung asserts it. What CAN be asserted is that the
1666
- * flow did not fake it: the offline seeds assert the exact UNFIXTURED value, which a
1667
- * hardcoded answer cannot produce.
1668
- *
1669
- * @example
1670
- * **Start a published agent and read one declared output**
1671
- * ```ts
1672
- * .step('countLetters', agent({
1673
- * key: '6a47dc5b-5fd4-461f-b97d-6c1817abcaaa',
1674
- * name: 'CountLetters LowCode Agent',
1675
- * folderPath: 'Shared/uipath-maestro-flow/CountLetters LowCode',
1676
- * inputs: { inputString: input('word') },
1677
- * returns: { count: 'integer', inputString: 'string' },
1678
- * }))
1679
- * .return({ rs: out('countLetters', 'count') })
1680
- * ```
1681
- *
1682
- * @param inputs - The agent to start (`name`, `folderPath`, and `key` or
1683
- * `projectId`), its `inputs`, and the fields you read back via `returns`.
1684
- * @returns An action spec to pass to `.step(name, …)`.
1685
- */
1686
- export declare function agent(inputs: AgentInputs): ActionSpec;
1687
- /**
1688
- * Declare an INLINE AUTONOMOUS AGENT — an agent defined inside this flow's own
1689
- * project rather than published to Orchestrator (`uipath.agent.autonomous`,
1690
- * `Orchestrator.StartInlineAgentJob`).
1691
- *
1692
- * @remarks
1693
- * **Two artifacts, not one.** The node carries the prompts and the variable
1694
- * descriptors, and it points at a directory — `source` — where the platform expects
1695
- * the agent's own configuration (flow-v1 emits `entryPoint: <source>/agent.json`).
1696
- * So `compile` writes `<source>/agent.json` beside the `.flow`, built from the same
1697
- * fields. Nothing to assemble by hand; `source` defaults to a uuid derived from the
1698
- * flow id and step name so a recompile is not a diff.
1699
- *
1700
- * **How this differs from `agent()`.** That one references something already
1701
- * published and started as an Orchestrator job; this one IS the definition, and the
1702
- * platform runs it inside the flow's own debug/publish context. The practical
1703
- * consequences: there is no folder, no release key and no binding pair here — and
1704
- * no `uip` verb that starts one headlessly either.
1705
- *
1706
- * ── the live bar, stated ─────────────────────────────────────────────────────────
1707
- * Weaker than `agent()`'s, and in a specific way. `Orchestrator.StartInlineAgentJob`
1708
- * is Studio-Web-debug-only, so there is no Orchestrator job to point at and no
1709
- * headless verb that starts one. No local runner currently calls a model for this
1710
- * node either — an offline run asserts the WIRING and the declared `returns` shape,
1711
- * never that a model answered. Two differences would remain for any runner that did
1712
- * call one: knowledge grounding (a context handle) is a cloud-side index an offline
1713
- * path does not have, so the call would be ungrounded; and the node's `model` would
1714
- * have to be substituted for one reachable headlessly. Answer quality stays on the
1715
- * offline `expect` seeds; real behaviour needs a Studio Web debug run.
1716
- *
1717
- * @example
1718
- * **Classify an email with an agent defined inline**
1719
- * ```ts
1720
- * .step('triage', inlineAgent({
1721
- * model: 'gpt-5.4',
1722
- * systemPrompt:
1723
- * 'You are a support triage assistant. Classify the email into exactly one ' +
1724
- * 'category and one priority. Return a result conforming to the output schema. ' +
1725
- * 'category: billing | technical | account. priority: low | normal | high.',
1726
- * userPrompt: 'Classify this email:\n{{input.body}}',
1727
- * inputs: { body: input('body') },
1728
- * returns: { category: 'string', priority: 'string' },
1729
- * }))
1730
- * .return({ category: out('triage', 'category') })
1731
- * ```
1732
- *
1733
- * @param inputs - The agent defined in this project: its `model`,
1734
- * `systemPrompt`, `userPrompt`, and the `returns` fields it must produce.
1735
- * @returns An action spec to pass to `.step(name, …)`.
1736
- */
1737
- export declare function inlineAgent(inputs: InlineAgentInputs): ActionSpec;
1738
1035
  /**
1739
1036
  * Declare an Integration Service connector action — the typed form, where a
1740
1037
  * generated descriptor supplies the nodeType and statically-checked input types: