@uipath/maestro-builder-sdk 6.23.0 → 6.25.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 (46) hide show
  1. package/dist/api-index.md +121 -121
  2. package/dist/api-members.md +362 -362
  3. package/dist/check.js +1 -444
  4. package/dist/core/actions.d.ts +0 -404
  5. package/dist/core/actions.js +0 -111
  6. package/dist/core/form-field-type.d.ts +16 -0
  7. package/dist/core/form-field-type.js +33 -0
  8. package/dist/core/hitl-routing.d.ts +17 -3
  9. package/dist/core/stable-id.d.ts +9 -0
  10. package/dist/core/stable-id.js +16 -0
  11. package/dist/core/step-ports.d.ts +25 -1
  12. package/dist/core/step-ports.js +6 -47
  13. package/dist/core/typed-raw-node.js +0 -11
  14. package/dist/decompile.js +7 -235
  15. package/dist/flow-node-registry.js +3 -1
  16. package/dist/flow-node-type.d.ts +45 -1
  17. package/dist/flow-sdk.d.ts +2 -0
  18. package/dist/flow-sdk.js +2 -0
  19. package/dist/flow-step-exits.js +1 -1
  20. package/dist/nodes/conversation/flow/check.d.ts +17 -0
  21. package/dist/nodes/conversation/flow/check.js +54 -0
  22. package/dist/nodes/conversation/flow/factories.d.ts +58 -0
  23. package/dist/nodes/conversation/flow/factories.js +63 -0
  24. package/dist/nodes/conversation/flow/family.d.ts +3 -0
  25. package/dist/nodes/conversation/flow/family.js +8 -0
  26. package/dist/nodes/conversation/flow/index.d.ts +3 -0
  27. package/dist/nodes/conversation/flow/index.js +3 -0
  28. package/dist/nodes/conversation/flow/node-type.d.ts +14 -0
  29. package/dist/nodes/conversation/flow/node-type.js +117 -0
  30. package/dist/nodes/conversation/flow/spec.d.ts +60 -0
  31. package/dist/nodes/conversation/flow/spec.js +1 -0
  32. package/dist/nodes/hitl/flow/check.d.ts +38 -0
  33. package/dist/nodes/hitl/flow/check.js +357 -0
  34. package/dist/nodes/hitl/flow/factories.d.ts +58 -0
  35. package/dist/nodes/hitl/flow/factories.js +59 -0
  36. package/dist/nodes/hitl/flow/family.d.ts +3 -0
  37. package/dist/nodes/hitl/flow/family.js +8 -0
  38. package/dist/nodes/hitl/flow/index.d.ts +3 -0
  39. package/dist/nodes/hitl/flow/index.js +3 -0
  40. package/dist/nodes/hitl/flow/node-type.d.ts +7 -0
  41. package/dist/nodes/hitl/flow/node-type.js +601 -0
  42. package/dist/nodes/hitl/flow/spec.d.ts +265 -0
  43. package/dist/nodes/hitl/flow/spec.js +1 -0
  44. package/dist/serialize.d.ts +2 -4
  45. package/dist/serialize.js +35 -392
  46. package/package.json +2 -2
@@ -0,0 +1,54 @@
1
+ import { Expr } from '../../../core/expr.js';
2
+ export const CONVERSATION_DIAGNOSTICS = {
3
+ CONVERSATION_NO_ID: { severity: 'error', summary: 'a conversational step with no conversationId' },
4
+ SEND_MESSAGE_NO_EXCHANGE: { severity: 'error', summary: 'sendMessage with no exchangeId' },
5
+ SEND_MESSAGE_NO_CONTENT: { severity: 'error', summary: 'sendMessage with no content' },
6
+ CONVERSATION_RANGE: { severity: 'error', summary: 'a history limit outside 1–40' },
7
+ };
8
+ /**
9
+ * A conversational step (Phase 5C): send-message, wait-for-message, or
10
+ * get-conversation-context.
11
+ *
12
+ * Everything here is decidable offline and invisible later: the node's own
13
+ * schema requires `conversationId` (and `exchangeId`/`content` on send), and
14
+ * the two numeric limits are range-checked by the designer but silently
15
+ * clamped at run time.
16
+ */
17
+ export function checkConversational(kind, inputs, ctx) {
18
+ const step = ctx.step;
19
+ const at = (code, message, suggestion) => ctx.report(code, message, suggestion);
20
+ const blank = (v) => v === undefined || v === null || (typeof v === 'string' && v.trim() === '');
21
+ const label = kind === 'sendMessage' ? 'sendMessage'
22
+ : kind === 'waitForMessage' ? 'waitForMessage' : 'conversationContext';
23
+ if (blank(inputs?.conversationId)) {
24
+ at('CONVERSATION_NO_ID', `${label} step "${step}" has no \`conversationId\`, which the node's schema requires — every `
25
+ + `conversational step is keyed by the conversation it belongs to. The conversation trigger publishes `
26
+ + `it as out('start', 'conversationId').`, `conversationId: out('start', 'conversationId')`);
27
+ }
28
+ if (kind === 'sendMessage') {
29
+ if (blank(inputs?.exchangeId)) {
30
+ at('SEND_MESSAGE_NO_EXCHANGE', `sendMessage step "${step}" has no \`exchangeId\` — the node's schema requires it, because a message `
31
+ + `belongs to one exchange (a user turn and its answers). A wait step publishes it as `
32
+ + `out('<waitStep>', 'conversationContext.latestExchangeId').`, `exchangeId: out('<waitStep>', 'conversationContext.latestExchangeId')`);
33
+ }
34
+ if (blank(inputs?.content)) {
35
+ at('SEND_MESSAGE_NO_CONTENT', `sendMessage step "${step}" has no \`content\` — the node's schema requires a non-empty message `
36
+ + `(Markdown), and an empty one posts a blank turn into the conversation.`, `content: 'Looking into it.'`);
37
+ }
38
+ }
39
+ const rangeCheck = (field, max) => {
40
+ const raw = inputs?.[field];
41
+ if (raw === undefined || raw instanceof Expr)
42
+ return;
43
+ const n = Number(raw);
44
+ if (!Number.isFinite(n) || !Number.isInteger(n) || n < 1 || n > max) {
45
+ at('CONVERSATION_RANGE', `${label} step "${step}"'s \`${field}\` is ${JSON.stringify(raw)}. The node accepts a whole number from `
46
+ + `1 to ${max} (the platform default is 20); anything else is clamped at run time, so the flow reads `
47
+ + `a different amount of history than it says.`, `${field}: 20`);
48
+ }
49
+ };
50
+ if (kind === 'waitForMessage')
51
+ rangeCheck('numExchanges', 40);
52
+ if (kind === 'conversationContext')
53
+ rangeCheck('exchangeLimit', 40);
54
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The conversation factories, `sendMessage()`, `waitForMessage()` and
3
+ * `conversationContext()`. Moved from core/actions.ts in Phase 4 of
4
+ * docs/NODE_TYPE_ARCHITECTURE_DESIGN.md; the package entry re-exports them.
5
+ */
6
+ import { type ActionSpec } from '../../../core/actions.js';
7
+ import type { ConversationContextInputs, SendMessageInputs, WaitForMessageInputs } from './spec.js';
8
+ /**
9
+ * Post an assistant message into a live conversation
10
+ * (`uipath.conversational.send-message`).
11
+ *
12
+ * ```ts
13
+ * .step('answer', sendMessage({
14
+ * conversationId: out('start', 'conversationId'),
15
+ * exchangeId: out('listen', 'conversationContext.latestExchangeId'),
16
+ * content: 'Your order ships tomorrow.',
17
+ * }))
18
+ * ```
19
+ *
20
+ * The message is Markdown (`text/markdown` is the node's only supported type)
21
+ * and the role is always `assistant` — a flow speaks as the assistant.
22
+ *
23
+ * @param inputs - The conversation, the exchange, and what to say.
24
+ * @returns An action spec to pass to `.step(...)`.
25
+ */
26
+ export declare function sendMessage(inputs: SendMessageInputs): ActionSpec;
27
+ /**
28
+ * PAUSE until the person sends their next message
29
+ * (`uipath.conversational.wait-for-message`) — a catch event, like
30
+ * `waitForEvent`, so the flow suspends rather than polling.
31
+ *
32
+ * ```ts
33
+ * .step('listen', waitForMessage({ conversationId: out('start', 'conversationId') }))
34
+ * ```
35
+ *
36
+ * It resumes with the conversation context:
37
+ * `out('listen', 'conversationContext.messages')` is the transcript and
38
+ * `…conversationContext.latestExchangeId` is the turn to answer.
39
+ *
40
+ * @param inputs - The conversation to wait on, and how much history to return.
41
+ * @returns An action spec to pass to `.step(...)`.
42
+ */
43
+ export declare function waitForMessage(inputs: WaitForMessageInputs): ActionSpec;
44
+ /**
45
+ * READ a conversation's transcript so far without waiting
46
+ * (`uipath.conversational.get-conversation-context`) — the shape a
47
+ * conversational agent takes as its turn context.
48
+ *
49
+ * ```ts
50
+ * .step('history', conversationContext({
51
+ * conversationId: out('start', 'conversationId'), exchangeLimit: 10,
52
+ * }))
53
+ * ```
54
+ *
55
+ * @param inputs - The conversation to read, and how many exchanges to return.
56
+ * @returns An action spec to pass to `.step(...)`.
57
+ */
58
+ export declare function conversationContext(inputs: ConversationContextInputs): ActionSpec;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The conversation factories, `sendMessage()`, `waitForMessage()` and
3
+ * `conversationContext()`. Moved from core/actions.ts in Phase 4 of
4
+ * docs/NODE_TYPE_ARCHITECTURE_DESIGN.md; the package entry re-exports them.
5
+ */
6
+ import { builtinActionSpec } from '../../../core/actions.js';
7
+ /**
8
+ * Post an assistant message into a live conversation
9
+ * (`uipath.conversational.send-message`).
10
+ *
11
+ * ```ts
12
+ * .step('answer', sendMessage({
13
+ * conversationId: out('start', 'conversationId'),
14
+ * exchangeId: out('listen', 'conversationContext.latestExchangeId'),
15
+ * content: 'Your order ships tomorrow.',
16
+ * }))
17
+ * ```
18
+ *
19
+ * The message is Markdown (`text/markdown` is the node's only supported type)
20
+ * and the role is always `assistant` — a flow speaks as the assistant.
21
+ *
22
+ * @param inputs - The conversation, the exchange, and what to say.
23
+ * @returns An action spec to pass to `.step(...)`.
24
+ */
25
+ export function sendMessage(inputs) {
26
+ return builtinActionSpec({ kind: 'sendMessage', inputs });
27
+ }
28
+ /**
29
+ * PAUSE until the person sends their next message
30
+ * (`uipath.conversational.wait-for-message`) — a catch event, like
31
+ * `waitForEvent`, so the flow suspends rather than polling.
32
+ *
33
+ * ```ts
34
+ * .step('listen', waitForMessage({ conversationId: out('start', 'conversationId') }))
35
+ * ```
36
+ *
37
+ * It resumes with the conversation context:
38
+ * `out('listen', 'conversationContext.messages')` is the transcript and
39
+ * `…conversationContext.latestExchangeId` is the turn to answer.
40
+ *
41
+ * @param inputs - The conversation to wait on, and how much history to return.
42
+ * @returns An action spec to pass to `.step(...)`.
43
+ */
44
+ export function waitForMessage(inputs) {
45
+ return builtinActionSpec({ kind: 'waitForMessage', inputs });
46
+ }
47
+ /**
48
+ * READ a conversation's transcript so far without waiting
49
+ * (`uipath.conversational.get-conversation-context`) — the shape a
50
+ * conversational agent takes as its turn context.
51
+ *
52
+ * ```ts
53
+ * .step('history', conversationContext({
54
+ * conversationId: out('start', 'conversationId'), exchangeLimit: 10,
55
+ * }))
56
+ * ```
57
+ *
58
+ * @param inputs - The conversation to read, and how many exchanges to return.
59
+ * @returns An action spec to pass to `.step(...)`.
60
+ */
61
+ export function conversationContext(inputs) {
62
+ return builtinActionSpec({ kind: 'conversationContext', inputs });
63
+ }
@@ -0,0 +1,3 @@
1
+ /** The conversation node family, as flow-node-registry.ts lists it: the three `uipath.conversational.*` steps. */
2
+ import type { FlowNodeFamily } from '../../../flow-node-type.js';
3
+ export declare const conversationFlowFamily: FlowNodeFamily;
@@ -0,0 +1,8 @@
1
+ import { CONVERSATION_DIAGNOSTICS } from './check.js';
2
+ import { conversationNodeTypes } from './node-type.js';
3
+ export const conversationFlowFamily = {
4
+ id: 'conversation',
5
+ title: 'Conversation',
6
+ types: conversationNodeTypes,
7
+ diagnostics: CONVERSATION_DIAGNOSTICS,
8
+ };
@@ -0,0 +1,3 @@
1
+ /** The conversation family's public surface, which the package entry re-exports. */
2
+ export * from './spec.js';
3
+ export * from './factories.js';
@@ -0,0 +1,3 @@
1
+ /** The conversation family's public surface, which the package entry re-exports. */
2
+ export * from './spec.js';
3
+ export * from './factories.js';
@@ -0,0 +1,14 @@
1
+ import type { FlowVersionedNodeType } from '../../../flow-node-type.js';
2
+ import type { ConversationContextInputs, SendMessageInputs, WaitForMessageInputs } from './spec.js';
3
+ type Spec = {
4
+ kind: 'sendMessage';
5
+ inputs: SendMessageInputs;
6
+ } | {
7
+ kind: 'waitForMessage';
8
+ inputs: WaitForMessageInputs;
9
+ } | {
10
+ kind: 'conversationContext';
11
+ inputs: ConversationContextInputs;
12
+ };
13
+ export declare const conversationNodeTypes: FlowVersionedNodeType<Spec>[];
14
+ export {};
@@ -0,0 +1,117 @@
1
+ /**
2
+ * The three conversational node types: `uipath.conversational.send-message`
3
+ * (1.0, 1.1), `.wait-for-message` (1.0, 1.1) and `.get-conversation-context`
4
+ * (1.0). Moved from serialize.ts / check.ts / decompile.ts in Phase 4 of
5
+ * docs/NODE_TYPE_ARCHITECTURE_DESIGN.md; serialized output, printed source,
6
+ * codes and messages unchanged.
7
+ */
8
+ import { Expr, toExpr } from '../../../core/expr.js';
9
+ import { jsonClone } from '../../../core/json-file.js';
10
+ import { checkConversational } from './check.js';
11
+ /**
12
+ * The definition's `inputDefaults`, which supply the fixed fields the platform's
13
+ * schema requires (`role: 'assistant'` and `mimeType: 'text/markdown'` on send,
14
+ * `from: 'User'` on wait) — the author never writes a value the enum only allows
15
+ * one of. Always the 1.0 definition's, whatever version is emitted: that is what
16
+ * the pipeline wrote before the port (its `defByType` holds the first bundled
17
+ * copy), so a 1.1 step still carries 1.0's `endExchange` / `numExchanges` keys.
18
+ */
19
+ function defaults(ctx, typeName) {
20
+ return jsonClone(ctx.definition(typeName, '1.0')?.inputDefaults ?? {});
21
+ }
22
+ /** A value rendered as the file stores it; a bare literal is wrapped first, as the pipeline did. */
23
+ const rendered = (ctx, v) => ctx.render(toExpr(v));
24
+ /**
25
+ * A serialized value as the author wrote it. Decompile's own reading: the text of
26
+ * a string, or of an envelope's `expression`; `=js:` and a bare `$vars.` path are
27
+ * references, anything else a literal string.
28
+ */
29
+ function lifted(x, ctx) {
30
+ const raw = typeof x === 'string' ? x : String(x?.expression ?? x ?? '');
31
+ if (raw.startsWith('=js:'))
32
+ return ctx.expr(raw);
33
+ if (raw.startsWith('$vars.'))
34
+ return ctx.expr(`=js:${raw}`);
35
+ return raw;
36
+ }
37
+ /** A number, or undefined for an absent or non-finite one. */
38
+ function liftedNumber(x) {
39
+ if (x === undefined || x === null)
40
+ return undefined;
41
+ const n = Number(x?.expression ?? x);
42
+ return Number.isFinite(n) ? n : undefined;
43
+ }
44
+ const printed = (v, ctx) => (v instanceof Expr ? ctx.value(v) : ctx.string(String(v)));
45
+ function conversationAt(kind, typeName, version) {
46
+ return {
47
+ kind, typeName, version, factory: kind, definition: 'bundled',
48
+ rawNode: { factory: `${kind}()` },
49
+ serialize: (spec, ctx) => {
50
+ const i = spec.inputs;
51
+ const base = { ...defaults(ctx, typeName), conversationId: rendered(ctx, i.conversationId) };
52
+ const inputs = kind === 'sendMessage'
53
+ ? {
54
+ ...base,
55
+ exchangeId: rendered(ctx, i.exchangeId),
56
+ content: rendered(ctx, i.content),
57
+ ...(i.endExchange !== undefined ? { endExchange: i.endExchange } : {}),
58
+ }
59
+ : kind === 'waitForMessage'
60
+ ? { ...base, ...(i.numExchanges !== undefined ? { numExchanges: i.numExchanges } : {}) }
61
+ : { ...base, ...(i.exchangeLimit !== undefined ? { exchangeLimit: i.exchangeLimit } : {}) };
62
+ // The service model stays on the DEFINITION only: these are
63
+ // `bpmn:ServiceTask` / `bpmn:IntermediateCatchEvent` nodes whose
64
+ // serviceType the platform resolves from `definitions[]`.
65
+ return { model: 'omit', inputs, port: 'output' };
66
+ },
67
+ // The fixed enum fields come from the definition's defaults, so nothing of
68
+ // them is recovered — only what an author could have written.
69
+ deserialize: (node, ctx) => {
70
+ const i = (node.inputs ?? {});
71
+ const conversationId = lifted(i.conversationId, ctx);
72
+ if (kind === 'sendMessage') {
73
+ return {
74
+ kind,
75
+ inputs: {
76
+ conversationId,
77
+ exchangeId: lifted(i.exchangeId, ctx),
78
+ content: lifted(i.content, ctx),
79
+ // The definition defaults `endExchange` to false; only a departure was authored.
80
+ ...(i.endExchange === true ? { endExchange: true } : {}),
81
+ },
82
+ };
83
+ }
84
+ const field = kind === 'waitForMessage' ? 'numExchanges' : 'exchangeLimit';
85
+ const n = liftedNumber(i[field]);
86
+ return { kind, inputs: { conversationId, ...(n !== undefined && n !== 20 ? { [field]: n } : {}) } };
87
+ },
88
+ print: (spec, ctx) => {
89
+ const i = spec.inputs;
90
+ const cid = ['conversationId', printed(i.conversationId, ctx)];
91
+ if (kind === 'sendMessage') {
92
+ return {
93
+ factory: kind,
94
+ options: [cid, ['exchangeId', printed(i.exchangeId, ctx)], ['content', printed(i.content, ctx)],
95
+ ['endExchange', i.endExchange === true ? 'true' : undefined]],
96
+ };
97
+ }
98
+ const field = kind === 'waitForMessage' ? 'numExchanges' : 'exchangeLimit';
99
+ return { factory: kind, options: [cid, [field, i[field] !== undefined ? ctx.json(i[field]) : undefined]] };
100
+ },
101
+ check: (spec, ctx) => checkConversational(kind, spec.inputs, ctx),
102
+ // check collected no expressions for a conversational step before the port; unchanged by it.
103
+ expressions: () => [],
104
+ output: () => ({ kind: 'opaque' }),
105
+ };
106
+ }
107
+ function conversationType(kind, typeName, versions) {
108
+ return {
109
+ kind, typeName, factory: kind, defaultVersion: '1.0',
110
+ versions: Object.fromEntries(versions.map((v) => [v, conversationAt(kind, typeName, v)])),
111
+ };
112
+ }
113
+ export const conversationNodeTypes = [
114
+ conversationType('sendMessage', 'uipath.conversational.send-message', ['1.0', '1.1']),
115
+ conversationType('waitForMessage', 'uipath.conversational.wait-for-message', ['1.0', '1.1']),
116
+ conversationType('conversationContext', 'uipath.conversational.get-conversation-context', ['1.0']),
117
+ ];
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The conversation family's authoring types (`uipath.conversational.send-message`,
3
+ * `.wait-for-message`, `.get-conversation-context`), and their kinds' entries in
4
+ * `FlowActionSpecs`. Moved from core/actions.ts in Phase 4 of
5
+ * docs/NODE_TYPE_ARCHITECTURE_DESIGN.md.
6
+ */
7
+ import type { Expr } from '../../../core/expr.js';
8
+ export interface SendMessageInputs {
9
+ /**
10
+ * The conversation to post into — from the conversation trigger
11
+ * (`out('start', 'conversationId')`) or a context read. Required.
12
+ */
13
+ conversationId: string | Expr;
14
+ /**
15
+ * The exchange (one user turn plus its answers) the message belongs to —
16
+ * `out('<waitStep>', 'conversationContext.latestExchangeId')`, or the
17
+ * trigger's exchange for the first answer. Required by the node's schema.
18
+ */
19
+ exchangeId: string | Expr;
20
+ /** What to say. Markdown — the node's only supported `mimeType`. Required. */
21
+ content: string | Expr;
22
+ /**
23
+ * Whether this message CLOSES the exchange. The platform's legacy default is
24
+ * to end it; pass `false` to keep the exchange open for another message.
25
+ */
26
+ endExchange?: boolean;
27
+ }
28
+ export interface WaitForMessageInputs {
29
+ /** The conversation to wait on. Required. */
30
+ conversationId: string | Expr;
31
+ /**
32
+ * How many past exchanges the returned context carries. 1–40 in the
33
+ * designer; the platform default is 20.
34
+ */
35
+ numExchanges?: number;
36
+ }
37
+ export interface ConversationContextInputs {
38
+ /** The conversation to read. Required. */
39
+ conversationId: string | Expr;
40
+ /**
41
+ * How many exchanges to return, 1–40. The platform default is 20.
42
+ */
43
+ exchangeLimit?: number;
44
+ }
45
+ declare module '../../../core/actions.js' {
46
+ interface FlowActionSpecs {
47
+ /** The spec {@link sendMessage} builds. */
48
+ sendMessage: {
49
+ inputs: SendMessageInputs;
50
+ };
51
+ /** The spec {@link waitForMessage} builds. */
52
+ waitForMessage: {
53
+ inputs: WaitForMessageInputs;
54
+ };
55
+ /** The spec {@link conversationContext} builds. */
56
+ conversationContext: {
57
+ inputs: ConversationContextInputs;
58
+ };
59
+ }
60
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The HITL family's rules: the form, outcomes, variant and delivery of one human
3
+ * task (`checkHitl`), and a read of its result (`checkHitlRead`). Moved from
4
+ * check.ts in Phase 4 of docs/NODE_TYPE_ARCHITECTURE_DESIGN.md; codes and
5
+ * messages unchanged. The rules that need the rest of the flow — an outcome no
6
+ * route takes, an outcome nothing downstream tells apart, a port the task does
7
+ * not draw — stay in check.ts, which walks the flow.
8
+ */
9
+ import type { DiagnosticCatalog } from '../../../core/nodes/family.js';
10
+ import type { OutputPathRead } from '../../../core/nodes/node-type.js';
11
+ import type { FlowCheckContext } from '../../../flow-node-type.js';
12
+ import type { HitlInputs } from './spec.js';
13
+ export declare const HITL_DIAGNOSTICS: DiagnosticCatalog;
14
+ /**
15
+ * A human task's form.
16
+ *
17
+ * Everything here is a mistake no later rung can see, which is the test for
18
+ * earning a place in `check` rather than in the docs: the flow compiles, deploys,
19
+ * and shows a person a form with something quietly missing from it. These catch it
20
+ * at rung 1, in the author's own vocabulary.
21
+ */
22
+ export declare function checkHitl(inputs: HitlInputs, ctx: FlowCheckContext): void;
23
+ /**
24
+ * A read of a human task's output: `out('<step>', '<field>')`.
25
+ *
26
+ * The node publishes an object keyed by the form's ANSWER fields plus `Action`.
27
+ * Two mistakes are silent at run time and both are caught here:
28
+ *
29
+ * - reading a field the form does not answer (a shown field, or a typo) —
30
+ * `undefined`, offline and deployed;
31
+ * - reading `$vars.<step>.status`, the platform's own projection of the chosen
32
+ * outcome. It resolves *deployed*, so the flow works in production and reads
33
+ * `undefined` on this SDK's offline rungs — a divergence, which is why the read
34
+ * is redirected rather than merely flagged. (A runner that derives declared
35
+ * output variables resolves `status` offline as well; the surface still points
36
+ * at one spelling so a flow reads the same everywhere.)
37
+ */
38
+ export declare function checkHitlRead({ node: name, field, rest, reader: step }: OutputPathRead, form: HitlInputs | undefined, report: (code: string, message: string, suggestion?: string) => void): void;