callman-core 1.20.0 → 1.21.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 (57) hide show
  1. package/dist/ai/jsonRepair.d.ts +2 -0
  2. package/dist/ai/jsonRepair.d.ts.map +1 -0
  3. package/dist/ai/jsonRepair.js +61 -0
  4. package/dist/ai/jsonRepair.js.map +1 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/scenario-runner/adapters/ai-executor.d.ts +9 -0
  10. package/dist/scenario-runner/adapters/ai-executor.d.ts.map +1 -0
  11. package/dist/scenario-runner/adapters/ai-executor.js +119 -0
  12. package/dist/scenario-runner/adapters/ai-executor.js.map +1 -0
  13. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts +12 -0
  14. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts.map +1 -0
  15. package/dist/scenario-runner/adapters/helpers/aiExample.js +79 -0
  16. package/dist/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  17. package/dist/scenario-runner/adapters/index.d.ts +3 -1
  18. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  19. package/dist/scenario-runner/adapters/index.js +7 -0
  20. package/dist/scenario-runner/adapters/index.js.map +1 -1
  21. package/dist/scenario-runner/adapters/types.d.ts +14 -0
  22. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  23. package/dist/scenario-runner/condition.d.ts.map +1 -1
  24. package/dist/scenario-runner/condition.js +37 -2
  25. package/dist/scenario-runner/condition.js.map +1 -1
  26. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  27. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  28. package/dist/scenario-runner/graphTraversal.js +7 -0
  29. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  30. package/dist/scenario-runner/nodePolicy.d.ts +2 -2
  31. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  32. package/dist/scenario-runner/nodePolicy.js +2 -0
  33. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  34. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  35. package/dist/scenario-runner/runScenario.js +28 -0
  36. package/dist/scenario-runner/runScenario.js.map +1 -1
  37. package/dist/scenario-runner/types.d.ts +48 -3
  38. package/dist/scenario-runner/types.d.ts.map +1 -1
  39. package/dist-cjs/ai/jsonRepair.js +65 -0
  40. package/dist-cjs/ai/jsonRepair.js.map +1 -0
  41. package/dist-cjs/index.js +5 -1
  42. package/dist-cjs/index.js.map +1 -1
  43. package/dist-cjs/scenario-runner/adapters/ai-executor.js +123 -0
  44. package/dist-cjs/scenario-runner/adapters/ai-executor.js.map +1 -0
  45. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js +85 -0
  46. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  47. package/dist-cjs/scenario-runner/adapters/index.js +12 -1
  48. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  49. package/dist-cjs/scenario-runner/condition.js +37 -2
  50. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  51. package/dist-cjs/scenario-runner/graphTraversal.js +8 -1
  52. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  53. package/dist-cjs/scenario-runner/nodePolicy.js +2 -0
  54. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  55. package/dist-cjs/scenario-runner/runScenario.js +28 -0
  56. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export declare const extractJsonPayload: (raw: string) => string;
2
+ //# sourceMappingURL=jsonRepair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRepair.d.ts","sourceRoot":"","sources":["../../src/ai/jsonRepair.ts"],"names":[],"mappings":"AAqDA,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,KAAG,MAKhD,CAAC"}
@@ -0,0 +1,61 @@
1
+ // Robust extraction of a JSON payload from an LLM's raw reply text. Ported
2
+ // from callman-desktop `src/shared/ai-local/jsonRepair.ts` so scenario AI
3
+ // nodes behave identically on every host (desktop re-exports this copy).
4
+ // Models may wrap JSON in a fenced block, prepend a sentence of prose, or
5
+ // leave a trailing comma — this pulls out the first balanced object/array and
6
+ // lightly repairs it so JSON.parse can succeed.
7
+ //
8
+ // If nothing JSON-shaped is found, the (fence-stripped) text is returned as-is
9
+ // so the caller's JSON.parse throws a plain "malformed JSON" error.
10
+ // Take the contents of the first ```/```json fenced block if one is present,
11
+ // else the text unchanged. Unanchored (a fence may sit after a prose preamble).
12
+ const stripFences = (text) => {
13
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
14
+ return fenced ? fenced[1].trim() : text;
15
+ };
16
+ // Drop commas that immediately precede a closing brace/bracket — a common
17
+ // small-model slip that JSON.parse rejects.
18
+ const stripTrailingCommas = (text) => text.replace(/,(\s*[}\]])/g, "$1");
19
+ // Return the first balanced {...} or [...] block, honouring string literals so
20
+ // braces inside strings don't miscount. Null if no balanced block is found.
21
+ const extractBalanced = (text) => {
22
+ const start = text.search(/[{[]/);
23
+ if (start === -1)
24
+ return null;
25
+ const open = text[start];
26
+ const close = open === "{" ? "}" : "]";
27
+ let depth = 0;
28
+ let inString = false;
29
+ let escaped = false;
30
+ for (let i = start; i < text.length; i += 1) {
31
+ const ch = text[i];
32
+ if (inString) {
33
+ if (escaped)
34
+ escaped = false;
35
+ else if (ch === "\\")
36
+ escaped = true;
37
+ else if (ch === '"')
38
+ inString = false;
39
+ continue;
40
+ }
41
+ if (ch === '"') {
42
+ inString = true;
43
+ }
44
+ else if (ch === open) {
45
+ depth += 1;
46
+ }
47
+ else if (ch === close) {
48
+ depth -= 1;
49
+ if (depth === 0)
50
+ return text.slice(start, i + 1);
51
+ }
52
+ }
53
+ return null; // unbalanced — never closed
54
+ };
55
+ export const extractJsonPayload = (raw) => {
56
+ const trimmed = (raw ?? "").trim();
57
+ const unfenced = stripFences(trimmed).trim();
58
+ const balanced = extractBalanced(unfenced);
59
+ return stripTrailingCommas(balanced ?? unfenced).trim();
60
+ };
61
+ //# sourceMappingURL=jsonRepair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRepair.js","sourceRoot":"","sources":["../../src/ai/jsonRepair.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,+EAA+E;AAC/E,oEAAoE;AAEpE,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC,CAAC;AAEF,0EAA0E;AAC1E,4CAA4C;AAC5C,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAEzF,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,CAAC,IAAY,EAAiB,EAAE;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAC;iBACxB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAC;iBAChC,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,4BAA4B;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAU,EAAE;IACxD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,mBAAmB,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -26,6 +26,7 @@ export { resolveXPathCandidates, type XPathResolution } from "./contract/xpathRe
26
26
  export { applySoapRequestTransforms, type SoapRequestConfig, type SoapRuntimeRequestLike, } from "./soap/transport.js";
27
27
  export { buildWsSecurityHeader, injectWsSecurityHeader, type WsSecurityConfig, type WsSecurityHeaderParts, } from "./soap/wsSecurity.js";
28
28
  export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTemplate, } from "./soap/envelope.js";
29
+ export { extractJsonPayload } from "./ai/jsonRepair.js";
29
30
  export * from "./scenario-runner/index.js";
30
31
  export * from "./host/index.js";
31
32
  export * from "./types/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -25,6 +25,9 @@ export { resolveXPathCandidates } from "./contract/xpathResolver.js";
25
25
  export { applySoapRequestTransforms, } from "./soap/transport.js";
26
26
  export { buildWsSecurityHeader, injectWsSecurityHeader, } from "./soap/wsSecurity.js";
27
27
  export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTemplate, } from "./soap/envelope.js";
28
+ // Tolerant JSON extraction from LLM reply text (AI node; desktop re-exports
29
+ // this so all hosts repair identically).
30
+ export { extractJsonPayload } from "./ai/jsonRepair.js";
28
31
  export * from "./scenario-runner/index.js";
29
32
  export * from "./host/index.js";
30
33
  export * from "./types/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,4EAA4E;AAC5E,yCAAyC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ScenarioAiExecutionInput, ScenarioAiExecutionResult } from "../types.js";
2
+ import type { AiChatTransport } from "./types.js";
3
+ export interface AiExecutorOptions {
4
+ chatTransport?: AiChatTransport;
5
+ /** Upper bound applied on top of the node's own timeoutMs (host budget). */
6
+ nodeTimeoutMs?: number;
7
+ }
8
+ export declare const buildAiExecutor: (options: AiExecutorOptions) => (input: ScenarioAiExecutionInput) => Promise<ScenarioAiExecutionResult>;
9
+ //# sourceMappingURL=ai-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/ai-executor.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD,eAAO,MAAM,eAAe,GAC1B,SAAS,iBAAiB,MAEnB,OAAO,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CA6IzE,CAAC"}
@@ -0,0 +1,119 @@
1
+ // Canonical AI executor — orchestrates an AI scenario node once, identically
2
+ // on every host. Everything provider-agnostic happens here: template-resolve
3
+ // the prompt, parse the response example, assemble the messages, call the
4
+ // host-injected chat transport, tolerantly parse the reply (jsonRepair), and
5
+ // validate it against the schema derived from the example. Hosts differ only
6
+ // in the transport (backend: direct provider call; desktop: backend proxy) —
7
+ // credentials never reach core.
8
+ //
9
+ // Fail-fast rules run BEFORE the transport call so a misconfigured node never
10
+ // burns provider tokens.
11
+ import { extractJsonPayload } from "../../ai/jsonRepair.js";
12
+ import { validateResponseSchema } from "../../contract/schemaValidator.js";
13
+ import { DEFAULT_AI_MAX_TOKENS, DEFAULT_AI_TIMEOUT_MS, MAX_AI_MAX_TOKENS, MAX_AI_PROMPT_LENGTH, MAX_AI_RESPONSE_EXAMPLE_LENGTH, MAX_AI_TIMEOUT_MS, } from "../graphTraversal.js";
14
+ import { buildScenarioTemplateValues, resolveScenarioTemplateString, } from "../templateResolver.js";
15
+ import { withAbortAndTimeout } from "./helpers/abort.js";
16
+ import { buildAiMessages, deriveSchemaFromExample, parseJsonExample } from "./helpers/aiExample.js";
17
+ const failure = (message, details, durationMs = 0) => ({
18
+ outputData: null,
19
+ details,
20
+ durationMs,
21
+ failureMessage: message,
22
+ });
23
+ export const buildAiExecutor = (options) => async (input) => {
24
+ const config = input.node.data.config;
25
+ const details = {
26
+ connectionId: config.connectionId?.trim() || null,
27
+ provider: null,
28
+ model: null,
29
+ tokensUsed: null,
30
+ resolvedPrompt: null,
31
+ rawText: null,
32
+ };
33
+ if (!options.chatTransport) {
34
+ return failure("This host cannot run AI nodes (transport missing).", details);
35
+ }
36
+ if (!details.connectionId) {
37
+ return failure("AI node needs a managed AI connection.", details);
38
+ }
39
+ // --- Fail-fast validation (no provider call, no tokens burned) --------
40
+ const example = parseJsonExample(config.responseExample ?? "");
41
+ if (example.error || !example.value) {
42
+ return failure(example.error ?? "Response example is invalid.", details);
43
+ }
44
+ if ((config.responseExample ?? "").length > MAX_AI_RESPONSE_EXAMPLE_LENGTH) {
45
+ return failure(`Response example is capped at ${MAX_AI_RESPONSE_EXAMPLE_LENGTH} characters.`, details);
46
+ }
47
+ const templateValues = buildScenarioTemplateValues({
48
+ environment: input.context.environment,
49
+ globals: input.context.globals,
50
+ workflowContext: input.context.workflowContext,
51
+ nodeMetaByLabel: input.context.nodeMetaByLabel,
52
+ responseRoot: input.context.responseRoot,
53
+ dbResult: input.context.dbResult,
54
+ kafkaEvent: input.context.kafkaEvent,
55
+ redisResult: input.context.redisResult,
56
+ });
57
+ const resolvedPrompt = resolveScenarioTemplateString(config.prompt ?? "", templateValues).trim();
58
+ details.resolvedPrompt = resolvedPrompt || null;
59
+ if (!resolvedPrompt) {
60
+ return failure("AI prompt is empty.", details);
61
+ }
62
+ if (resolvedPrompt.length > MAX_AI_PROMPT_LENGTH) {
63
+ return failure(`AI prompt is capped at ${MAX_AI_PROMPT_LENGTH} characters after template resolution.`, details);
64
+ }
65
+ const messages = buildAiMessages({
66
+ resolvedPrompt,
67
+ exampleText: config.responseExample,
68
+ });
69
+ const maxTokens = Math.min(MAX_AI_MAX_TOKENS, Math.max(1, Math.round(config.maxTokens ?? DEFAULT_AI_MAX_TOKENS)));
70
+ const timeoutMs = Math.min(options.nodeTimeoutMs ?? MAX_AI_TIMEOUT_MS, Math.min(MAX_AI_TIMEOUT_MS, Math.max(1000, Math.round(config.timeoutMs ?? DEFAULT_AI_TIMEOUT_MS))));
71
+ // --- Provider call ----------------------------------------------------
72
+ const startedAtMs = Date.now();
73
+ let transportResult;
74
+ try {
75
+ transportResult = await withAbortAndTimeout(options.chatTransport({
76
+ connectionId: details.connectionId,
77
+ messages,
78
+ maxTokens,
79
+ signal: input.signal,
80
+ }), timeoutMs, `AI node ${input.stepId}`, input.signal);
81
+ }
82
+ catch (error) {
83
+ return failure(error instanceof Error ? error.message : "AI provider call failed.", details, Date.now() - startedAtMs);
84
+ }
85
+ const durationMs = Date.now() - startedAtMs;
86
+ details.provider = transportResult.provider ?? null;
87
+ details.model = transportResult.model ?? null;
88
+ details.tokensUsed =
89
+ typeof transportResult.tokensUsed === "number" ? transportResult.tokensUsed : null;
90
+ details.rawText = transportResult.text ?? null;
91
+ const rawText = (transportResult.text ?? "").trim();
92
+ if (!rawText) {
93
+ return failure("AI provider returned an empty reply.", details, durationMs);
94
+ }
95
+ // --- Tolerant parse + schema validation -------------------------------
96
+ let parsed;
97
+ try {
98
+ parsed = JSON.parse(extractJsonPayload(rawText));
99
+ }
100
+ catch {
101
+ return failure("AI reply is not valid JSON (even after repair). See the raw reply in the step result.", details, durationMs);
102
+ }
103
+ const schema = deriveSchemaFromExample(example.value);
104
+ const schemaFailures = validateResponseSchema(schema, parsed).filter((entry) => entry.status === "FAIL");
105
+ if (schemaFailures.length > 0) {
106
+ const summary = schemaFailures
107
+ .slice(0, 3)
108
+ .map((entry) => entry.message)
109
+ .join("; ");
110
+ return failure(`AI reply did not match the expected format: ${summary}`, details, durationMs);
111
+ }
112
+ return {
113
+ outputData: parsed,
114
+ details,
115
+ durationMs,
116
+ failureMessage: null,
117
+ };
118
+ };
119
+ //# sourceMappingURL=ai-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/ai-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ScenarioAiChatMessage } from "../../types.js";
2
+ export interface ParsedAiExample {
3
+ value: Record<string, unknown> | null;
4
+ error: string | null;
5
+ }
6
+ export declare const parseJsonExample: (exampleText: string) => ParsedAiExample;
7
+ export declare const deriveSchemaFromExample: (example: Record<string, unknown>) => Record<string, unknown>;
8
+ export declare const buildAiMessages: ({ resolvedPrompt, exampleText, }: {
9
+ resolvedPrompt: string;
10
+ exampleText: string;
11
+ }) => ScenarioAiChatMessage[];
12
+ //# sourceMappingURL=aiExample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiExample.d.ts","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/aiExample.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,eAqBtD,CAAC;AAsBF,eAAO,MAAM,uBAAuB,GAClC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAWxB,CAAC;AAKF,eAAO,MAAM,eAAe,GAAI,kCAG7B;IACD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,KAAG,qBAAqB,EAWxB,CAAC"}
@@ -0,0 +1,79 @@
1
+ // AI-node response-example helpers, shared by the executor, the condition
2
+ // suggestion builder, and host UIs:
3
+ // - parseJsonExample: tolerant parse of the user-authored JSON example
4
+ // - deriveSchemaFromExample: example -> lenient JSON Schema (top-level keys
5
+ // required, extras allowed; numbers never tighten to integers; nested
6
+ // objects recurse WITHOUT nested `required` so only the contract the
7
+ // downstream `{{Label.field}}` references depend on is enforced)
8
+ // - buildAiMessages: the fixed system instruction + resolved user prompt
9
+ import { extractJsonPayload } from "../../../ai/jsonRepair.js";
10
+ export const parseJsonExample = (exampleText) => {
11
+ const trimmed = (exampleText ?? "").trim();
12
+ if (!trimmed) {
13
+ return { value: null, error: "Response example is required." };
14
+ }
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(extractJsonPayload(trimmed));
18
+ }
19
+ catch {
20
+ return { value: null, error: "Response example is not valid JSON." };
21
+ }
22
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
23
+ return {
24
+ value: null,
25
+ error: "Response example must be a JSON object (e.g. {\"sentiment\": \"positive\"}).",
26
+ };
27
+ }
28
+ return { value: parsed, error: null };
29
+ };
30
+ const deriveValueSchema = (value) => {
31
+ if (value === null || value === undefined) {
32
+ return {}; // no constraint — the example gives no type signal
33
+ }
34
+ if (typeof value === "string")
35
+ return { type: "string" };
36
+ if (typeof value === "boolean")
37
+ return { type: "boolean" };
38
+ // Never "integer": an example value of 1 must not reject a reply of 0.9.
39
+ if (typeof value === "number")
40
+ return { type: "number" };
41
+ if (Array.isArray(value)) {
42
+ return value.length > 0
43
+ ? { type: "array", items: deriveValueSchema(value[0]) }
44
+ : { type: "array" };
45
+ }
46
+ const properties = {};
47
+ for (const [key, nested] of Object.entries(value)) {
48
+ properties[key] = deriveValueSchema(nested);
49
+ }
50
+ return { type: "object", properties, additionalProperties: true };
51
+ };
52
+ export const deriveSchemaFromExample = (example) => {
53
+ const properties = {};
54
+ for (const [key, value] of Object.entries(example)) {
55
+ properties[key] = deriveValueSchema(value);
56
+ }
57
+ return {
58
+ type: "object",
59
+ properties,
60
+ required: Object.keys(example),
61
+ additionalProperties: true,
62
+ };
63
+ };
64
+ // The word "JSON" in the system message also satisfies OpenAI's
65
+ // `response_format: json_object` requirement (it rejects prompts that never
66
+ // mention JSON).
67
+ export const buildAiMessages = ({ resolvedPrompt, exampleText, }) => [
68
+ {
69
+ role: "system",
70
+ content: [
71
+ "You are a step inside an automated API-testing scenario.",
72
+ "Reply with ONLY a single JSON object — no markdown, no code fences, no prose.",
73
+ "The reply must use the same top-level keys and value types as this example (values may differ):",
74
+ exampleText.trim(),
75
+ ].join("\n"),
76
+ },
77
+ { role: "user", content: resolvedPrompt },
78
+ ];
79
+ //# sourceMappingURL=aiExample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiExample.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/aiExample.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import type { ScenarioRuntimeAdapters } from "../types.js";
2
2
  import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
3
  export declare const buildScenarioRuntimeAdapters: (options: ScenarioRuntimeAdapterFactoryOptions) => ScenarioRuntimeAdapters;
4
4
  export { buildDbExecutor, extractSqlState, matchDbExpectedError, } from "./db-executor.js";
5
+ export { buildAiExecutor, type AiExecutorOptions } from "./ai-executor.js";
6
+ export { buildAiMessages, deriveSchemaFromExample, parseJsonExample, type ParsedAiExample, } from "./helpers/aiExample.js";
5
7
  export { buildKafkaExecutor } from "./kafka-executor.js";
6
8
  export { buildNotificationExecutor } from "./notification-executor.js";
7
9
  export { buildRedisExecutor } from "./redis-executor.js";
@@ -10,6 +12,6 @@ export { buildScriptExecutor } from "./script-executor.js";
10
12
  export { buildWebsocketExecutor } from "./websocket-executor.js";
11
13
  export { evaluateScenarioExpectedStatus, type ExpectedStatusEvaluation, } from "./helpers/expected-status.js";
12
14
  export { buildRequestFailureMessage, summarizeContractResults, type FailureMessageInput, } from "./helpers/failure-messages.js";
13
- export type { DatabaseExecuteInput, DatabaseExecuteResult, HttpExecuteInput, HttpExecuteResult, KafkaCaptureInput, KafkaCaptureOutcome, RedisCommandOutcome, RedisExecuteInput, RedisExecuteResult, ScenarioConnectionProvider, ScenarioConnectionRuntime, ScenarioConnectionType, ScenarioRuntimeAdapterDrivers, ScenarioRuntimeAdapterFactoryOptions, } from "./types.js";
15
+ export type { AiChatTransport, AiChatTransportInput, AiChatTransportResult, DatabaseExecuteInput, DatabaseExecuteResult, HttpExecuteInput, HttpExecuteResult, KafkaCaptureInput, KafkaCaptureOutcome, RedisCommandOutcome, RedisExecuteInput, RedisExecuteResult, ScenarioConnectionProvider, ScenarioConnectionRuntime, ScenarioConnectionType, ScenarioRuntimeAdapterDrivers, ScenarioRuntimeAdapterFactoryOptions, } from "./types.js";
14
16
  export type { ConnectionRuntimeConfig, DatabaseConnectionConfig, DatabaseConnectionMode, KafkaConnectionConfig, NotificationConnectionConfig, RedisConnectionConfig, } from "./connection-config.js";
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAU3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBAiBD,CAAC;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAW3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBAqBD,CAAC;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  // driver callbacks via `options.drivers` for the I/O-heavy executors
7
7
  // (HTTP, DB, Redis, Kafka). Script + notification executors default to
8
8
  // canonical core implementations but can be overridden.
9
+ import { buildAiExecutor } from "./ai-executor.js";
9
10
  import { buildDbExecutor } from "./db-executor.js";
10
11
  import { buildKafkaExecutor } from "./kafka-executor.js";
11
12
  import { buildNotificationExecutor } from "./notification-executor.js";
@@ -21,6 +22,10 @@ export const buildScenarioRuntimeAdapters = (options) => ({
21
22
  websocketExecutor: buildWebsocketExecutor(options),
22
23
  scriptExecutor: options.scriptExecutor ?? buildScriptExecutor(options),
23
24
  notificationExecutor: options.notificationExecutor ?? buildNotificationExecutor(options),
25
+ aiExecutor: buildAiExecutor({
26
+ chatTransport: options.drivers.aiChatTransport,
27
+ nodeTimeoutMs: options.nodeTimeoutMs,
28
+ }),
24
29
  // Present only when the host driver supports run-scoped DB sessions —
25
30
  // its absence is how the runner detects "sessions unsupported here".
26
31
  ...(options.drivers.databaseSessionRelease
@@ -31,6 +36,8 @@ export const buildScenarioRuntimeAdapters = (options) => ({
31
36
  });
32
37
  // Re-exports so callers don't have to import from sibling files.
33
38
  export { buildDbExecutor, extractSqlState, matchDbExpectedError, } from "./db-executor.js";
39
+ export { buildAiExecutor } from "./ai-executor.js";
40
+ export { buildAiMessages, deriveSchemaFromExample, parseJsonExample, } from "./helpers/aiExample.js";
34
41
  export { buildKafkaExecutor } from "./kafka-executor.js";
35
42
  export { buildNotificationExecutor } from "./notification-executor.js";
36
43
  export { buildRedisExecutor } from "./redis-executor.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACpE,sEAAsE;IACtE,qEAAqE;IACrE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QACxC,CAAC,CAAC;YACE,gBAAgB,EAAE,CAAC,KAAwD,EAAE,EAAE,CAC7E,OAAO,CAAC,OAAO,CAAC,sBAAuB,CAAC,KAAK,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,OAAO,EACL,8BAA8B,GAE/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACpE,UAAU,EAAE,eAAe,CAAC;QAC1B,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe;QAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;IACF,sEAAsE;IACtE,qEAAqE;IACrE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QACxC,CAAC,CAAC;YACE,gBAAgB,EAAE,CAAC,KAAwD,EAAE,EAAE,CAC7E,OAAO,CAAC,OAAO,CAAC,sBAAuB,CAAC,KAAK,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,OAAO,EACL,8BAA8B,GAE/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC"}
@@ -76,6 +76,19 @@ export interface KafkaPublishInput {
76
76
  headers: Record<string, string>;
77
77
  timeoutMs: number;
78
78
  }
79
+ export interface AiChatTransportInput {
80
+ connectionId: string;
81
+ messages: import("../types.js").ScenarioAiChatMessage[];
82
+ maxTokens?: number;
83
+ signal?: import("../types.js").AbortLikeSignal;
84
+ }
85
+ export interface AiChatTransportResult {
86
+ text: string;
87
+ provider?: string | null;
88
+ model?: string | null;
89
+ tokensUsed?: number | null;
90
+ }
91
+ export type AiChatTransport = (input: AiChatTransportInput) => Promise<AiChatTransportResult>;
79
92
  export interface ScenarioRuntimeAdapterDrivers {
80
93
  httpExecutor: (input: HttpExecuteInput) => Promise<HttpExecuteResult>;
81
94
  databaseExecutor: (input: DatabaseExecuteInput) => Promise<DatabaseExecuteResult>;
@@ -83,6 +96,7 @@ export interface ScenarioRuntimeAdapterDrivers {
83
96
  kafkaExecutor: (input: KafkaCaptureInput) => Promise<KafkaCaptureOutcome>;
84
97
  kafkaPublishExecutor?: (input: KafkaPublishInput) => Promise<ScenarioKafkaPublishResult>;
85
98
  websocketExecutor?: (input: import("../types.js").ScenarioWebsocketExecutionInput) => Promise<import("../types.js").ScenarioWebsocketExecutionResult>;
99
+ aiChatTransport?: AiChatTransport;
86
100
  databaseSessionRelease?: (input: {
87
101
  runId: string;
88
102
  outcome: "commit" | "rollback";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EAEjB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAqCjE,UAAU,WAAW;IACnB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACpC;AAmOD,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAyBA,CAAC;AAwHF,eAAO,MAAM,6BAA6B,GAAI,UAAU,iBAAiB,KAAG,OAIvC,CAAC;AA2nDtC,eAAO,MAAM,4BAA4B,GACvC,cAAc,qBAAqB,EACnC,MAAM,MAAM,KACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAGnC,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAChC,MAAM,aAAa,EACnB,cAAc,qBAAqB,KAClC,uBAqIF,CAAC;AAsHF,eAAO,MAAM,qBAAqB,EAAE,kBAAkB,EAMrD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAM,gBAAgB,CAAC,MAAM,CAAa,EAC1C,YAAW,kBAA6D,EACxE,QAAQ,gBAAgB,CAAC,OAAO,CAAC,KAChC,gBAWD,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAC9B,YAAW,OAAO,CAAC,aAAa,CAAM,KACrC,aAgBF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,WAAU,wBAAgC,EAC1C,WAAU,KAAK,CAAC,cAAc,GAAG,aAAa,CAA2B,KACxE,cAKD,CAAC;AAEH,eAAO,MAAM,4BAA4B,QAAO,mBAc/C,CAAC;AAEF,eAAO,MAAM,mCAAmC,GAAI,OAAO,cAAc,KAAG,MACpC,CAAC;AAEzC,eAAO,MAAM,oCAAoC,GAAI,QAAQ,mBAAmB,KAAG,MAGxB,CAAC;AAE5D,eAAO,MAAM,gCAAgC,GAAI,OAAO,cAAc,KAAG,MAClC,CAAC;AAExC,eAAO,MAAM,iCAAiC,GAAI,QAAQ,mBAAmB,KAAG,MAGxB,CAAC;AAEzD,eAAO,MAAM,+BAA+B,GAAI,YAAY,MAAM,KAAG,cAepE,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,YAAY,MAAM,KAAG,WAkBnE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,OAAO,OAAO,KAAG,mBAyC7D,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,mBAAmB,EAC3B,kBAAkB,QAAQ,CAAC,MAAM,CAAC,KACjC,wBAAwB,EAmB1B,CAAC;AAIF,eAAO,MAAM,qBAAqB,GAChC,MAAM,aAAa,EACnB,kBAAkB,QAAQ,CAAC,MAAM,CAAC,KACjC,wBAAwB,EAI1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,cAAc,KAAG,MAC5B,CAAC;AAEnC,eAAO,MAAM,sBAAsB,GAAI,OAAO,cAAc,KAAG,MAC5B,CAAC;AAEpC,eAAO,MAAM,wBAAwB,GAAI,QAAQ,mBAAmB,KAAG,MACpB,CAAC;AAEpD,eAAO,MAAM,oBAAoB,GAAI,QAAQ,mBAAmB,KAAG,MAMlE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,WAAW,kBAAkB,KAAG,MAC7C,CAAC;AAE/B,eAAO,MAAM,2BAA2B,GAAI,QAAQ,mBAAmB,KAAG,cAMzE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,mBAAmB,EAC3B,cAAc,qBAAqB,KAClC,yBASF,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,QAAQ,qBAAqB,KAAG,GAAG,CAAC,MAAM,CACpC,CAAC;AAEnD,eAAO,MAAM,4BAA4B,GACvC,WAAW,cAAc,EACzB,SAAS,MAAM,EACf,UAAU,wBAAwB,KACjC,cAIE,CAAC;AAEN,eAAO,MAAM,0BAA0B,GACrC,WAAW,cAAc,EACzB,SAAS,MAAM,KACd,cACqE,CAAC;AAEzE,eAAO,MAAM,2BAA2B,GACtC,WAAW,cAAc,EACzB,SAAS,MAAM,KACd,cAC2E,CAAC;AAE/E,eAAO,MAAM,oBAAoB,GAC/B,WAAW,cAAc,EACzB,SAAS,MAAM,EACf,SAAS,MAAM,KACd,cACyD,CAAC;AAE7D,eAAO,MAAM,qBAAqB,GAChC,WAAW,cAAc,EACzB,WAAW,cAAc,KACxB,cACsD,CAAC;AAE1D,eAAO,MAAM,kBAAkB,GAC7B,WAAW,cAAc,EACzB,QAAQ,MAAM,EACd,SAAS,CAAC,IAAI,EAAE,aAAa,KAAK,aAAa,KAC9C,cAAiE,CAAC;AAErE,eAAO,MAAM,mBAAmB,GAC9B,WAAW,cAAc,EACzB,SAAS,MAAM,EACf,SAAS,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,KACjD,cAAmE,CAAC;AAEvE,eAAO,MAAM,2BAA2B,GACtC,WAAW,cAAc,EACzB,QAAQ,MAAM,EACd,UAAU,iBAAiB,KAC1B,cAcE,CAAC;AAEN,eAAO,MAAM,8BAA8B,GACzC,WAAW,cAAc,EACzB,QAAQ,MAAM,EACd,SAAS,gBAAgB,KACxB,cAIE,CAAC;AAEN,eAAO,MAAM,+BAA+B,GAC1C,WAAW,cAAc,EACzB,QAAQ,MAAM,EACd,SAAS,gBAAgB,KACxB,cAIE,CAAC;AAEN,eAAO,MAAM,2BAA2B,GACtC,QAAQ,mBAAmB,EAC3B,YAAY,yBAAyB,KACpC;IACD,KAAK,EAAE,wBAAwB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CAOhB,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,UAAU,iBAAiB,KAAG,MACc,CAAC;AAEvF,eAAO,MAAM,wBAAwB,GAAI,UAAU,iBAAiB,KAAG,OAC5C,CAAC;AAE5B,eAAO,MAAM,oCAAoC,GAAI,MAAM,MAAM,EAAE,KAAG,GAAG,CAAC,MAAM,CACjE,CAAC;AAEhB,eAAO,MAAM,qCAAqC,GAChD,OAAO,YAAY,EAAE,KACpB,GAAG,CAAC,MAAM,CAsBZ,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAAI,6BAG9C;IACD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,KAAG,0BAA0B,EAU1B,CAAC;AAEL,eAAO,MAAM,iCAAiC,GAAI,gCAI/C;IACD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,0BAA0B,EAc7B,CAAC;AAEF,eAAO,MAAM,yCAAyC,GACpD,YAAY,MAAM,KACjB,mBAsBF,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,OAAO,MAAM,KAAG,iBAC1B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { applyExtract } from "./extraction.js";
2
+ import { parseJsonExample } from "./adapters/helpers/aiExample.js";
2
3
  const createId = (prefix) => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
3
4
  ? crypto.randomUUID()
4
5
  : `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
@@ -436,7 +437,17 @@ const createSuggestion = (group, path, description, valueType, exampleValue) =>
436
437
  path,
437
438
  valueType,
438
439
  });
439
- const buildNodeSuggestions = (label, type) => {
440
+ // Maps an AI response-example value onto the suggestion value type.
441
+ const aiExampleValueType = (value) => {
442
+ if (typeof value === "number")
443
+ return "number";
444
+ if (typeof value === "boolean")
445
+ return "boolean";
446
+ if (Array.isArray(value))
447
+ return "array";
448
+ return "string";
449
+ };
450
+ const buildNodeSuggestions = (label, type, node) => {
440
451
  const group = label;
441
452
  const metaSuggestions = [
442
453
  createSuggestion(group, `${label}.__meta.status`, "Execution status.", "string", "success"),
@@ -562,6 +573,30 @@ const buildNodeSuggestions = (label, type) => {
562
573
  createSuggestion(group, `${label}.failedSteps`, "How many steps failed.", "number"),
563
574
  ...metaSuggestions,
564
575
  ];
576
+ case "ai": {
577
+ // The AI node's outputData IS the parsed JSON reply, so the example's
578
+ // own keys are the reference surface. Parse tolerantly and fall back to
579
+ // a generic hint when the example is missing/invalid.
580
+ const exampleText = node?.type === "ai" ? node.data.config.responseExample : "";
581
+ const parsedExample = parseJsonExample(exampleText ?? "");
582
+ const exampleSuggestions = parsedExample.value
583
+ ? Object.entries(parsedExample.value).flatMap(([key, value]) => {
584
+ const base = createSuggestion(group, `${label}.${key}`, `AI reply field "${key}" (from the response example).`, aiExampleValueType(value), typeof value === "string" || typeof value === "number" || typeof value === "boolean"
585
+ ? String(value)
586
+ : undefined);
587
+ if (value && typeof value === "object" && !Array.isArray(value)) {
588
+ return [
589
+ base,
590
+ ...Object.entries(value).map(([nestedKey, nested]) => createSuggestion(group, `${label}.${key}.${nestedKey}`, `AI reply field "${key}.${nestedKey}" (from the response example).`, aiExampleValueType(nested))),
591
+ ];
592
+ }
593
+ return [base];
594
+ })
595
+ : [
596
+ createSuggestion(group, `${label}`, "Parsed JSON reply from the AI node.", "string"),
597
+ ];
598
+ return [...exampleSuggestions, ...metaSuggestions];
599
+ }
565
600
  case "end":
566
601
  return metaSuggestions;
567
602
  default:
@@ -1998,7 +2033,7 @@ export const buildConditionRuntimeSuggestions = ({ nodes, environmentKeys = [],
1998
2033
  ...environmentKeys.map((key) => createSuggestion("Environment", `env.${key}`, `Environment variable "${key}".`, "string")),
1999
2034
  ...flattenScenarioNodes(nodes).flatMap((node) => {
2000
2035
  const label = node.data.label.trim();
2001
- return label ? buildNodeSuggestions(label, node.type) : [];
2036
+ return label ? buildNodeSuggestions(label, node.type, node) : [];
2002
2037
  }),
2003
2038
  ]);
2004
2039
  export const filterConditionRuntimeSuggestions = ({ query, suggestions, limit = 40, }) => {