callman-core 1.20.0 → 1.22.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 (129) hide show
  1. package/dist/ai/index.d.ts +13 -0
  2. package/dist/ai/index.d.ts.map +1 -0
  3. package/dist/ai/index.js +19 -0
  4. package/dist/ai/index.js.map +1 -0
  5. package/dist/ai/jsonRepair.d.ts +2 -0
  6. package/dist/ai/jsonRepair.d.ts.map +1 -0
  7. package/dist/ai/jsonRepair.js +61 -0
  8. package/dist/ai/jsonRepair.js.map +1 -0
  9. package/dist/ai/outputSchemas.d.ts +43 -0
  10. package/dist/ai/outputSchemas.d.ts.map +1 -0
  11. package/dist/ai/outputSchemas.js +38 -0
  12. package/dist/ai/outputSchemas.js.map +1 -0
  13. package/dist/ai/parse/diagram.d.ts +3 -0
  14. package/dist/ai/parse/diagram.d.ts.map +1 -0
  15. package/dist/ai/parse/diagram.js +24 -0
  16. package/dist/ai/parse/diagram.js.map +1 -0
  17. package/dist/ai/parse/scenario.d.ts +3 -0
  18. package/dist/ai/parse/scenario.d.ts.map +1 -0
  19. package/dist/ai/parse/scenario.js +23 -0
  20. package/dist/ai/parse/scenario.js.map +1 -0
  21. package/dist/ai/parse/shared.d.ts +5 -0
  22. package/dist/ai/parse/shared.d.ts.map +1 -0
  23. package/dist/ai/parse/shared.js +49 -0
  24. package/dist/ai/parse/shared.js.map +1 -0
  25. package/dist/ai/parse/unified.d.ts +10 -0
  26. package/dist/ai/parse/unified.d.ts.map +1 -0
  27. package/dist/ai/parse/unified.js +105 -0
  28. package/dist/ai/parse/unified.js.map +1 -0
  29. package/dist/ai/prompts/diagram.d.ts +4 -0
  30. package/dist/ai/prompts/diagram.d.ts.map +1 -0
  31. package/dist/ai/prompts/diagram.js +132 -0
  32. package/dist/ai/prompts/diagram.js.map +1 -0
  33. package/dist/ai/prompts/fragments.d.ts +5 -0
  34. package/dist/ai/prompts/fragments.d.ts.map +1 -0
  35. package/dist/ai/prompts/fragments.js +27 -0
  36. package/dist/ai/prompts/fragments.js.map +1 -0
  37. package/dist/ai/prompts/scenario.d.ts +12 -0
  38. package/dist/ai/prompts/scenario.d.ts.map +1 -0
  39. package/dist/ai/prompts/scenario.js +204 -0
  40. package/dist/ai/prompts/scenario.js.map +1 -0
  41. package/dist/ai/prompts/scenarioNodeDefaults.d.ts +3 -0
  42. package/dist/ai/prompts/scenarioNodeDefaults.d.ts.map +1 -0
  43. package/dist/ai/prompts/scenarioNodeDefaults.js +166 -0
  44. package/dist/ai/prompts/scenarioNodeDefaults.js.map +1 -0
  45. package/dist/ai/prompts/unified.d.ts +13 -0
  46. package/dist/ai/prompts/unified.d.ts.map +1 -0
  47. package/dist/ai/prompts/unified.js +123 -0
  48. package/dist/ai/prompts/unified.js.map +1 -0
  49. package/dist/ai/types.d.ts +100 -0
  50. package/dist/ai/types.d.ts.map +1 -0
  51. package/dist/ai/types.js +9 -0
  52. package/dist/ai/types.js.map +1 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +4 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/scenario-runner/adapters/ai-executor.d.ts +9 -0
  58. package/dist/scenario-runner/adapters/ai-executor.d.ts.map +1 -0
  59. package/dist/scenario-runner/adapters/ai-executor.js +118 -0
  60. package/dist/scenario-runner/adapters/ai-executor.js.map +1 -0
  61. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts +13 -0
  62. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts.map +1 -0
  63. package/dist/scenario-runner/adapters/helpers/aiExample.js +143 -0
  64. package/dist/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  65. package/dist/scenario-runner/adapters/index.d.ts +3 -1
  66. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  67. package/dist/scenario-runner/adapters/index.js +7 -0
  68. package/dist/scenario-runner/adapters/index.js.map +1 -1
  69. package/dist/scenario-runner/adapters/types.d.ts +14 -0
  70. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  71. package/dist/scenario-runner/condition.d.ts.map +1 -1
  72. package/dist/scenario-runner/condition.js +37 -2
  73. package/dist/scenario-runner/condition.js.map +1 -1
  74. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  75. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  76. package/dist/scenario-runner/graphTraversal.js +7 -0
  77. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  78. package/dist/scenario-runner/nodePolicy.d.ts +2 -2
  79. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  80. package/dist/scenario-runner/nodePolicy.js +2 -0
  81. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  82. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  83. package/dist/scenario-runner/runScenario.js +28 -0
  84. package/dist/scenario-runner/runScenario.js.map +1 -1
  85. package/dist/scenario-runner/types.d.ts +48 -3
  86. package/dist/scenario-runner/types.d.ts.map +1 -1
  87. package/dist-cjs/ai/index.js +58 -0
  88. package/dist-cjs/ai/index.js.map +1 -0
  89. package/dist-cjs/ai/jsonRepair.js +65 -0
  90. package/dist-cjs/ai/jsonRepair.js.map +1 -0
  91. package/dist-cjs/ai/outputSchemas.js +41 -0
  92. package/dist-cjs/ai/outputSchemas.js.map +1 -0
  93. package/dist-cjs/ai/parse/diagram.js +28 -0
  94. package/dist-cjs/ai/parse/diagram.js.map +1 -0
  95. package/dist-cjs/ai/parse/scenario.js +27 -0
  96. package/dist-cjs/ai/parse/scenario.js.map +1 -0
  97. package/dist-cjs/ai/parse/shared.js +56 -0
  98. package/dist-cjs/ai/parse/shared.js.map +1 -0
  99. package/dist-cjs/ai/parse/unified.js +109 -0
  100. package/dist-cjs/ai/parse/unified.js.map +1 -0
  101. package/dist-cjs/ai/prompts/diagram.js +137 -0
  102. package/dist-cjs/ai/prompts/diagram.js.map +1 -0
  103. package/dist-cjs/ai/prompts/fragments.js +31 -0
  104. package/dist-cjs/ai/prompts/fragments.js.map +1 -0
  105. package/dist-cjs/ai/prompts/scenario.js +209 -0
  106. package/dist-cjs/ai/prompts/scenario.js.map +1 -0
  107. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js +170 -0
  108. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js.map +1 -0
  109. package/dist-cjs/ai/prompts/unified.js +128 -0
  110. package/dist-cjs/ai/prompts/unified.js.map +1 -0
  111. package/dist-cjs/ai/types.js +12 -0
  112. package/dist-cjs/ai/types.js.map +1 -0
  113. package/dist-cjs/index.js +4 -0
  114. package/dist-cjs/index.js.map +1 -1
  115. package/dist-cjs/scenario-runner/adapters/ai-executor.js +122 -0
  116. package/dist-cjs/scenario-runner/adapters/ai-executor.js.map +1 -0
  117. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js +150 -0
  118. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  119. package/dist-cjs/scenario-runner/adapters/index.js +13 -1
  120. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  121. package/dist-cjs/scenario-runner/condition.js +37 -2
  122. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  123. package/dist-cjs/scenario-runner/graphTraversal.js +8 -1
  124. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  125. package/dist-cjs/scenario-runner/nodePolicy.js +2 -0
  126. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  127. package/dist-cjs/scenario-runner/runScenario.js +28 -0
  128. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  129. package/package.json +1 -1
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ // Canonical per-type default configs for the scenario-builder assistant's node
3
+ // reference. Mirrors what the desktop's `createScenarioNode` factory produces
4
+ // (with STABLE placeholder ids where the factory generates UUIDs — stable ids
5
+ // read better in a prompt). The desktop passes its real factory into
6
+ // `buildScenarioSystemPrompt({ defaultConfigFor })` so the in-app prompt can
7
+ // never drift; a desktop drift-guard test asserts this map matches the factory
8
+ // (ids normalized). The backend — which has no node factory — uses this map.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.defaultScenarioNodeConfig = exports.SCENARIO_NODE_DEFAULT_CONFIGS = void 0;
11
+ const STRICT_POLICY = {
12
+ onFailure: "stop",
13
+ retry: { enabled: false, maxAttempts: 0, delayMs: 0 },
14
+ };
15
+ const REQUEST_CONFIG = {
16
+ method: "GET",
17
+ url: "",
18
+ headers: [],
19
+ query: [],
20
+ body: { mode: "none", raw: "", formEntries: [] },
21
+ auth: {
22
+ type: "none",
23
+ bearerToken: "",
24
+ basicUsername: "",
25
+ basicPassword: "",
26
+ apiKeyKey: "",
27
+ apiKeyValue: "",
28
+ apiKeyLocation: "header",
29
+ },
30
+ preRequestScript: "",
31
+ postResponseScript: "",
32
+ testsScript: "",
33
+ contractAssertions: [],
34
+ executionPolicy: STRICT_POLICY,
35
+ };
36
+ const DEFAULT_CONDITION_CONFIG = {
37
+ mode: "builder",
38
+ rootGroup: {
39
+ id: "g1",
40
+ type: "group",
41
+ operator: "AND",
42
+ children: [
43
+ {
44
+ id: "r1",
45
+ type: "rule",
46
+ left: { mode: "runtime", valueType: "number", value: "response.status" },
47
+ operator: "equals",
48
+ right: { mode: "literal", valueType: "number", value: 200 },
49
+ },
50
+ ],
51
+ },
52
+ expertExpression: "{{response.status}} == 200",
53
+ };
54
+ exports.SCENARIO_NODE_DEFAULT_CONFIGS = {
55
+ request: REQUEST_CONFIG,
56
+ db: {
57
+ connectionId: "",
58
+ query: "SELECT *\nFROM users\nWHERE id = {{env.userId}}",
59
+ executionPolicy: STRICT_POLICY,
60
+ },
61
+ redis: {
62
+ connectionId: "",
63
+ commands: [],
64
+ executionPolicy: {
65
+ onFailure: "continue",
66
+ retry: { enabled: true, maxAttempts: 2, delayMs: 1000 },
67
+ },
68
+ },
69
+ kafka: {
70
+ connectionId: "",
71
+ topic: "",
72
+ mode: "consume",
73
+ matchMode: "regex",
74
+ rules: [],
75
+ publishValueFormat: "json",
76
+ messageKey: "",
77
+ messageValue: "",
78
+ messageHeaders: [],
79
+ executionPolicy: {
80
+ onFailure: "continue",
81
+ retry: { enabled: true, maxAttempts: 3, delayMs: 2000 },
82
+ },
83
+ },
84
+ condition: DEFAULT_CONDITION_CONFIG,
85
+ assertion: {
86
+ matchMode: "all",
87
+ checks: [
88
+ {
89
+ id: "c1",
90
+ name: "",
91
+ enabled: true,
92
+ rule: {
93
+ id: "cr1",
94
+ type: "rule",
95
+ left: { mode: "runtime", valueType: "string", value: "" },
96
+ operator: "equals",
97
+ right: { mode: "runtime", valueType: "string", value: "" },
98
+ },
99
+ },
100
+ ],
101
+ executionPolicy: STRICT_POLICY,
102
+ },
103
+ script: {
104
+ script: "return {\n ok: true,\n};",
105
+ timeoutMs: 3000,
106
+ executionPolicy: STRICT_POLICY,
107
+ },
108
+ "set-vars": {
109
+ assignments: [{ id: "a1", scope: "environment", key: "", value: "", enabled: true }],
110
+ executionPolicy: STRICT_POLICY,
111
+ },
112
+ poll: {
113
+ actionType: "request",
114
+ request: REQUEST_CONFIG,
115
+ successCondition: DEFAULT_CONDITION_CONFIG,
116
+ intervalMs: 2000,
117
+ maxAttempts: 30,
118
+ onTimeout: "fail",
119
+ executionPolicy: STRICT_POLICY,
120
+ },
121
+ foreach: {
122
+ nodes: [],
123
+ edges: [],
124
+ sourceMode: "path",
125
+ onItemFailure: "stop",
126
+ collectResults: true,
127
+ executionPolicy: STRICT_POLICY,
128
+ },
129
+ websocket: {
130
+ url: "",
131
+ headers: [],
132
+ subprotocols: [],
133
+ steps: [],
134
+ executionPolicy: STRICT_POLICY,
135
+ },
136
+ ai: {
137
+ connectionId: "",
138
+ prompt: "",
139
+ responseExample: "",
140
+ executionPolicy: STRICT_POLICY,
141
+ },
142
+ wait: { durationMs: 5000, executionPolicy: STRICT_POLICY },
143
+ notification: {
144
+ provider: "slack",
145
+ connectionId: "",
146
+ severity: "info",
147
+ messageTemplate: "Scenario {{workflow.name}} finished with status {{workflow.__meta.status}}.",
148
+ channelOverride: "",
149
+ continueOnFailure: true,
150
+ advanced: { useRichBlocks: true },
151
+ executionPolicy: {
152
+ onFailure: "continue",
153
+ retry: { enabled: false, maxAttempts: 0, delayMs: 0 },
154
+ },
155
+ },
156
+ aggregator: {
157
+ template: '{\n "key": "{Label.field}"\n}',
158
+ executionPolicy: STRICT_POLICY,
159
+ },
160
+ end: {
161
+ loop: false,
162
+ loopTargetNodeId: null,
163
+ loopIterations: 1,
164
+ loopDelayMs: 1000,
165
+ executionPolicy: STRICT_POLICY,
166
+ },
167
+ };
168
+ const defaultScenarioNodeConfig = (type) => exports.SCENARIO_NODE_DEFAULT_CONFIGS[type] ?? null;
169
+ exports.defaultScenarioNodeConfig = defaultScenarioNodeConfig;
170
+ //# sourceMappingURL=scenarioNodeDefaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenarioNodeDefaults.js","sourceRoot":"","sources":["../../../src/ai/prompts/scenarioNodeDefaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ // The unified request-chat prompt (contract rules + request scripts + plain
3
+ // replies in ONE assistant). Canonical source — ported from the desktop copy,
4
+ // which was ahead of the backend's (it teaches mssql + @p1..@pN SQL Server
5
+ // binding); backend and desktop both consume this now.
6
+ //
7
+ // The prompt must tolerate being PREPENDED to the user prompt (Codex and
8
+ // Cursor CLIs have no system-prompt flag) — it is self-contained prose with no
9
+ // role assumptions.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.buildUnifiedUserPrompt = exports.buildUnifiedSystemPrompt = void 0;
12
+ const db_query_reference_js_1 = require("../../host/db/db-query-reference.js");
13
+ const pm_api_reference_js_1 = require("../../script/pm-api-reference.js");
14
+ const types_js_1 = require("../types.js");
15
+ const fragments_js_1 = require("./fragments.js");
16
+ // ONE prompt for the whole assistant. The model classifies intent itself — the
17
+ // user never picks "contract vs script" or a target stage — and returns a
18
+ // single JSON object that may carry a reply, contract changes, script changes,
19
+ // or any combination.
20
+ const buildUnifiedSystemPrompt = () => {
21
+ const stageNotes = types_js_1.AI_SCRIPT_STAGES.map((stage) => `- \`${stage}\`: ${fragments_js_1.STAGE_DESCRIPTIONS[stage]}`).join("\n");
22
+ return [
23
+ "You are Callman's AI assistant inside an API client (like Postman). The user is",
24
+ "editing ONE HTTP request. From their message plus the CONTEXT below, YOU decide",
25
+ "what is needed — the user does NOT pick a mode or a target. Respond with ONE JSON",
26
+ "object ONLY (no markdown, no prose outside JSON), shaped:",
27
+ "",
28
+ '{"reply": string, "contract": {"add": [{"path": string, "rules": {…}}], "remove": [string]} | null, "scripts": [{"stage": "pre-request|post-response|tests|kafka", "code": string}]}',
29
+ "",
30
+ "How to decide (classify intent yourself):",
31
+ "- Assertions about the LAST RESPONSE's shape (a field's type/format/required/value/",
32
+ " length/range) → put them in `contract`. This is the response contract-test engine.",
33
+ "- Anything that must RUN around the request — set a header/token/body, read or write",
34
+ " env/globals, query a DB or Redis, send an extra HTTP call, or assert with pm.test —",
35
+ " → write JavaScript in `scripts` for the RIGHT stage(s).",
36
+ "- A plain question or nothing to change → `reply` only, `contract` null, `scripts` [].",
37
+ "- You MAY combine (e.g. save a token in `pre-request` AND assert it in `tests` AND add",
38
+ " a `contract` rule). Only include a stage you actually wrote.",
39
+ "- `reply` is ALWAYS a short, natural message: what you did, or the answer to a question.",
40
+ "",
41
+ "STAGES (pick the right one; you may target several):",
42
+ stageNotes,
43
+ "",
44
+ "CONTRACT rules:",
45
+ "- `add` = new/updated rules; a path in both `add` and the existing list REPLACES it.",
46
+ " `remove` = existing paths to delete. MERGE when updating: keep existing operators and",
47
+ " add the new one; never drop operators unless asked.",
48
+ "- `path` MUST be one of the response SCHEMA paths (verbatim; array elements use `[]`,",
49
+ " e.g. `data.items[]`). Prefer high-signal checks (type/required/format); do not pin",
50
+ " `equals` to volatile ids/tokens/timestamps unless asked.",
51
+ fragments_js_1.CONTRACT_RULES_SPEC,
52
+ "",
53
+ "SCRIPTS: plain JavaScript, top-level await allowed. Each `code` is the FULL new script",
54
+ "for that stage and REPLACES it — when extending, keep the shown CURRENT code and add to",
55
+ 'it. Put every assertion inside pm.test("…", () => { … }). Use ONLY the API below; never',
56
+ "use fetch/require/import/process/Buffer. `await` every pm.db.query / pm.redis.command /",
57
+ "pm.sendRequest. Keep {{template}} tokens verbatim.",
58
+ "",
59
+ "CONNECTIONS: for pm.db.query / pm.redis.command, resolve the connection the user means",
60
+ "to its exact `connectionId` from AVAILABLE CONNECTIONS (match by name, case-insensitive)",
61
+ 'and pass it verbatim, e.g. `pm.db.query({ connectionId: "<id>", query: … })`. Match the',
62
+ "query FORMAT to that connection's provider (mongodb → JSON command object; postgresql/",
63
+ "mysql/oracle/mssql → SQL, with SQL Server params bound as @p1..@pN; redis → GET/SET/…).",
64
+ "If the user names no connection and gives no id,",
65
+ "omit `connectionId` so the request's own configured connection is used. Never invent an id.",
66
+ "",
67
+ "Examples (routing only):",
68
+ '- "assert the id is a uuid and status is 200" → contract on the response fields.',
69
+ '- "save the token from the response into an env var" → scripts: post-response (or tests).',
70
+ '- "check the user exists in mongo by email" → scripts: tests, using pm.db.query.',
71
+ '- "sign the body with hmac-sha256 before sending" → scripts: pre-request.',
72
+ '- "is this response ok?" → reply only.',
73
+ "",
74
+ "=== pm.* SCRIPT API ===",
75
+ (0, pm_api_reference_js_1.renderPmApiReference)(),
76
+ "",
77
+ "=== DATA ACCESS (DB / Redis query formats) ===",
78
+ (0, db_query_reference_js_1.renderDbQueryReference)(),
79
+ ].join("\n");
80
+ };
81
+ exports.buildUnifiedSystemPrompt = buildUnifiedSystemPrompt;
82
+ const buildUnifiedUserPrompt = ({ instruction, fields = [], existingRules = [], currentScripts = [], connections = [], requestMeta, statusCode, contentType, }) => {
83
+ const requestLine = requestMeta && (requestMeta.method || requestMeta.url)
84
+ ? `REQUEST: ${[requestMeta.method, requestMeta.url].filter(Boolean).join(" ")}`
85
+ : null;
86
+ const schemaLines = fields.length
87
+ ? fields
88
+ .map((field) => `${field.path}: ${field.type}${field.sample ? ` e.g. ${(0, fragments_js_1.truncateForPrompt)(field.sample)}` : ""}`)
89
+ .join("\n")
90
+ : "(no response captured)";
91
+ const meta = [
92
+ statusCode ? `HTTP status: ${statusCode}` : null,
93
+ contentType ? `Content-Type: ${contentType}` : null,
94
+ ]
95
+ .filter(Boolean)
96
+ .join("\n");
97
+ const existingLines = existingRules.length
98
+ ? existingRules.map((rule) => `${rule.path}: ${JSON.stringify(rule.rules)}`).join("\n")
99
+ : "(none yet)";
100
+ const currentBlocks = currentScripts
101
+ .filter((script) => script.code.trim().length > 0)
102
+ .map((script) => `--- ${script.stage} (current) ---\n${script.code}`)
103
+ .join("\n\n") || "(all scripts are empty)";
104
+ const connectionLines = connections.length
105
+ ? connections.map((c) => `${c.name} — ${c.provider} — ${c.id}`).join("\n")
106
+ : "(none)";
107
+ return [
108
+ requestLine,
109
+ "RESPONSE SCHEMA:",
110
+ schemaLines,
111
+ meta ? `\n${meta}` : "",
112
+ "",
113
+ "EXISTING CONTRACT RULES (path: operators):",
114
+ existingLines,
115
+ "",
116
+ "AVAILABLE CONNECTIONS (name — provider — connectionId):",
117
+ connectionLines,
118
+ "",
119
+ "CURRENT SCRIPTS:",
120
+ currentBlocks,
121
+ "",
122
+ `INSTRUCTION: ${instruction}`,
123
+ ]
124
+ .filter((line) => line !== null)
125
+ .join("\n");
126
+ };
127
+ exports.buildUnifiedUserPrompt = buildUnifiedUserPrompt;
128
+ //# sourceMappingURL=unified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../../src/ai/prompts/unified.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,2EAA2E;AAC3E,uDAAuD;AACvD,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,oBAAoB;;;AAEpB,+EAA6E;AAC7E,0EAAwE;AAQxE,0CAA+C;AAC/C,iDAA4F;AAE5F,+EAA+E;AAC/E,0EAA0E;AAC1E,+EAA+E;AAC/E,sBAAsB;AACf,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACnD,MAAM,UAAU,GAAG,2BAAgB,CAAC,GAAG,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,OAAO,iCAAkB,CAAC,KAAK,CAAC,EAAE,CAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,iFAAiF;QACjF,iFAAiF;QACjF,mFAAmF;QACnF,2DAA2D;QAC3D,EAAE;QACF,sLAAsL;QACtL,EAAE;QACF,2CAA2C;QAC3C,qFAAqF;QACrF,sFAAsF;QACtF,sFAAsF;QACtF,uFAAuF;QACvF,2DAA2D;QAC3D,wFAAwF;QACxF,wFAAwF;QACxF,gEAAgE;QAChE,0FAA0F;QAC1F,EAAE;QACF,sDAAsD;QACtD,UAAU;QACV,EAAE;QACF,iBAAiB;QACjB,sFAAsF;QACtF,yFAAyF;QACzF,uDAAuD;QACvD,uFAAuF;QACvF,sFAAsF;QACtF,4DAA4D;QAC5D,kCAAmB;QACnB,EAAE;QACF,wFAAwF;QACxF,yFAAyF;QACzF,yFAAyF;QACzF,yFAAyF;QACzF,oDAAoD;QACpD,EAAE;QACF,wFAAwF;QACxF,0FAA0F;QAC1F,yFAAyF;QACzF,wFAAwF;QACxF,yFAAyF;QACzF,kDAAkD;QAClD,6FAA6F;QAC7F,EAAE;QACF,0BAA0B;QAC1B,kFAAkF;QAClF,2FAA2F;QAC3F,kFAAkF;QAClF,2EAA2E;QAC3E,wCAAwC;QACxC,EAAE;QACF,yBAAyB;QACzB,IAAA,0CAAoB,GAAE;QACtB,EAAE;QACF,gDAAgD;QAChD,IAAA,8CAAsB,GAAE;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AA/DW,QAAA,wBAAwB,4BA+DnC;AAEK,MAAM,sBAAsB,GAAG,CAAC,EACrC,WAAW,EACX,MAAM,GAAG,EAAE,EACX,aAAa,GAAG,EAAE,EAClB,cAAc,GAAG,EAAE,EACnB,WAAW,GAAG,EAAE,EAChB,WAAW,EACX,UAAU,EACV,WAAW,GAUZ,EAAU,EAAE;IACX,MAAM,WAAW,GACf,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC;QACpD,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAC/E,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM;QAC/B,CAAC,CAAC,MAAM;aACH,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAA,gCAAiB,EAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClG;aACA,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,wBAAwB,CAAC;IAE7B,MAAM,IAAI,GAAG;QACX,UAAU,CAAC,CAAC,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;QAChD,WAAW,CAAC,CAAC,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;KACpD;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM;QACxC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACvF,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,aAAa,GACjB,cAAc;SACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACjD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC;SACpE,IAAI,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC;IAE/C,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM;QACxC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1E,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO;QACL,WAAW;QACX,kBAAkB;QAClB,WAAW;QACX,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;QACvB,EAAE;QACF,4CAA4C;QAC5C,aAAa;QACb,EAAE;QACF,yDAAyD;QACzD,eAAe;QACf,EAAE;QACF,kBAAkB;QAClB,aAAa;QACb,EAAE;QACF,gBAAgB,WAAW,EAAE;KAC9B;SACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC;AAzEW,QAAA,sBAAsB,0BAyEjC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ // Canonical wire-level types for the product's AI assistants. These are the
3
+ // shapes the prompts request and the parsers return — deliberately loose
4
+ // (Record<string, unknown> payloads) so callman-core needs no domain imports;
5
+ // hosts map to their richer domain types at the boundary (backend response
6
+ // DTOs, desktop DiagramDocument / GeneratedScenario / ContractRuleRules).
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AI_SCRIPT_STAGES = void 0;
9
+ // The four request-script slots. Single source — backend zod enums and the
10
+ // desktop stage tables both derive from this.
11
+ exports.AI_SCRIPT_STAGES = ["pre-request", "post-response", "tests", "kafka"];
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,yEAAyE;AACzE,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;;;AAE1E,2EAA2E;AAC3E,8CAA8C;AACjC,QAAA,gBAAgB,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC"}
package/dist-cjs/index.js CHANGED
@@ -89,6 +89,10 @@ var envelope_js_1 = require("./soap/envelope.js");
89
89
  Object.defineProperty(exports, "SOAP_11_ENVELOPE_TEMPLATE", { enumerable: true, get: function () { return envelope_js_1.SOAP_11_ENVELOPE_TEMPLATE; } });
90
90
  Object.defineProperty(exports, "SOAP_12_ENVELOPE_TEMPLATE", { enumerable: true, get: function () { return envelope_js_1.SOAP_12_ENVELOPE_TEMPLATE; } });
91
91
  Object.defineProperty(exports, "getSoapEnvelopeTemplate", { enumerable: true, get: function () { return envelope_js_1.getSoapEnvelopeTemplate; } });
92
+ // Central AI surface: shared prompts, parsers, output schemas + tolerant JSON
93
+ // extraction (jsonRepair) — one source for backend hosted generation and
94
+ // desktop local-CLI generation.
95
+ __exportStar(require("./ai/index.js"), exports);
92
96
  __exportStar(require("./scenario-runner/index.js"), exports);
93
97
  __exportStar(require("./host/index.js"), exports);
94
98
  __exportStar(require("./types/index.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AA2B1B,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AA2B1B,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ // Canonical AI executor — orchestrates an AI scenario node once, identically
3
+ // on every host. Everything provider-agnostic happens here: template-resolve
4
+ // the prompt, parse the response example, assemble the messages, call the
5
+ // host-injected chat transport, tolerantly parse the reply (jsonRepair), and
6
+ // validate it against the schema derived from the example. Hosts differ only
7
+ // in the transport (backend: direct provider call; desktop: backend proxy) —
8
+ // credentials never reach core.
9
+ //
10
+ // Fail-fast rules run BEFORE the transport call so a misconfigured node never
11
+ // burns provider tokens.
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.buildAiExecutor = void 0;
14
+ const jsonRepair_js_1 = require("../../ai/jsonRepair.js");
15
+ const graphTraversal_js_1 = require("../graphTraversal.js");
16
+ const templateResolver_js_1 = require("../templateResolver.js");
17
+ const abort_js_1 = require("./helpers/abort.js");
18
+ const aiExample_js_1 = require("./helpers/aiExample.js");
19
+ const failure = (message, details, durationMs = 0) => ({
20
+ outputData: null,
21
+ details,
22
+ durationMs,
23
+ failureMessage: message,
24
+ });
25
+ const buildAiExecutor = (options) => async (input) => {
26
+ const config = input.node.data.config;
27
+ const details = {
28
+ connectionId: config.connectionId?.trim() || null,
29
+ provider: null,
30
+ model: null,
31
+ tokensUsed: null,
32
+ resolvedPrompt: null,
33
+ rawText: null,
34
+ };
35
+ if (!options.chatTransport) {
36
+ return failure("This host cannot run AI nodes (transport missing).", details);
37
+ }
38
+ if (!details.connectionId) {
39
+ return failure("AI node needs a managed AI connection.", details);
40
+ }
41
+ // --- Fail-fast validation (no provider call, no tokens burned) --------
42
+ const example = (0, aiExample_js_1.parseJsonExample)(config.responseExample ?? "");
43
+ if (example.error || !example.value) {
44
+ return failure(example.error ?? "Response example is invalid.", details);
45
+ }
46
+ if ((config.responseExample ?? "").length > graphTraversal_js_1.MAX_AI_RESPONSE_EXAMPLE_LENGTH) {
47
+ return failure(`Response example is capped at ${graphTraversal_js_1.MAX_AI_RESPONSE_EXAMPLE_LENGTH} characters.`, details);
48
+ }
49
+ const templateValues = (0, templateResolver_js_1.buildScenarioTemplateValues)({
50
+ environment: input.context.environment,
51
+ globals: input.context.globals,
52
+ workflowContext: input.context.workflowContext,
53
+ nodeMetaByLabel: input.context.nodeMetaByLabel,
54
+ responseRoot: input.context.responseRoot,
55
+ dbResult: input.context.dbResult,
56
+ kafkaEvent: input.context.kafkaEvent,
57
+ redisResult: input.context.redisResult,
58
+ });
59
+ const resolvedPrompt = (0, templateResolver_js_1.resolveScenarioTemplateString)(config.prompt ?? "", templateValues).trim();
60
+ details.resolvedPrompt = resolvedPrompt || null;
61
+ if (!resolvedPrompt) {
62
+ return failure("AI prompt is empty.", details);
63
+ }
64
+ if (resolvedPrompt.length > graphTraversal_js_1.MAX_AI_PROMPT_LENGTH) {
65
+ return failure(`AI prompt is capped at ${graphTraversal_js_1.MAX_AI_PROMPT_LENGTH} characters after template resolution.`, details);
66
+ }
67
+ const messages = (0, aiExample_js_1.buildAiMessages)({
68
+ resolvedPrompt,
69
+ exampleText: config.responseExample,
70
+ });
71
+ const maxTokens = Math.min(graphTraversal_js_1.MAX_AI_MAX_TOKENS, Math.max(1, Math.round(config.maxTokens ?? graphTraversal_js_1.DEFAULT_AI_MAX_TOKENS)));
72
+ const timeoutMs = Math.min(options.nodeTimeoutMs ?? graphTraversal_js_1.MAX_AI_TIMEOUT_MS, Math.min(graphTraversal_js_1.MAX_AI_TIMEOUT_MS, Math.max(1000, Math.round(config.timeoutMs ?? graphTraversal_js_1.DEFAULT_AI_TIMEOUT_MS))));
73
+ // --- Provider call ----------------------------------------------------
74
+ const startedAtMs = Date.now();
75
+ let transportResult;
76
+ try {
77
+ transportResult = await (0, abort_js_1.withAbortAndTimeout)(options.chatTransport({
78
+ connectionId: details.connectionId,
79
+ messages,
80
+ maxTokens,
81
+ signal: input.signal,
82
+ }), timeoutMs, `AI node ${input.stepId}`, input.signal);
83
+ }
84
+ catch (error) {
85
+ return failure(error instanceof Error ? error.message : "AI provider call failed.", details, Date.now() - startedAtMs);
86
+ }
87
+ const durationMs = Date.now() - startedAtMs;
88
+ details.provider = transportResult.provider ?? null;
89
+ details.model = transportResult.model ?? null;
90
+ details.tokensUsed =
91
+ typeof transportResult.tokensUsed === "number" ? transportResult.tokensUsed : null;
92
+ details.rawText = transportResult.text ?? null;
93
+ const rawText = (transportResult.text ?? "").trim();
94
+ if (!rawText) {
95
+ return failure("AI provider returned an empty reply.", details, durationMs);
96
+ }
97
+ // --- Tolerant parse + schema validation -------------------------------
98
+ let parsed;
99
+ try {
100
+ parsed = JSON.parse((0, jsonRepair_js_1.extractJsonPayload)(rawText));
101
+ }
102
+ catch {
103
+ return failure("AI reply is not valid JSON (even after repair). See the raw reply in the step result.", details, durationMs);
104
+ }
105
+ // Structural validation WITHOUT ajv — ajv compiles schemas via the
106
+ // Function constructor, which the Electron renderer's CSP (no
107
+ // 'unsafe-eval') refuses, so desktop-local runs would fail on a
108
+ // perfectly good reply.
109
+ const schemaFailures = (0, aiExample_js_1.validateAgainstExample)(example.value, parsed);
110
+ if (schemaFailures.length > 0) {
111
+ const summary = schemaFailures.slice(0, 3).join("; ");
112
+ return failure(`AI reply did not match the expected format: ${summary}`, details, durationMs);
113
+ }
114
+ return {
115
+ outputData: parsed,
116
+ details,
117
+ durationMs,
118
+ failureMessage: null,
119
+ };
120
+ };
121
+ exports.buildAiExecutor = buildAiExecutor;
122
+ //# 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,150 @@
1
+ "use strict";
2
+ // AI-node response-example helpers, shared by the executor, the condition
3
+ // suggestion builder, and host UIs:
4
+ // - parseJsonExample: tolerant parse of the user-authored JSON example
5
+ // - deriveSchemaFromExample: example -> lenient JSON Schema (top-level keys
6
+ // required, extras allowed; numbers never tighten to integers; nested
7
+ // objects recurse WITHOUT nested `required` so only the contract the
8
+ // downstream `{{Label.field}}` references depend on is enforced)
9
+ // - buildAiMessages: the fixed system instruction + resolved user prompt
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.buildAiMessages = exports.validateAgainstExample = exports.deriveSchemaFromExample = exports.parseJsonExample = void 0;
12
+ const jsonRepair_js_1 = require("../../../ai/jsonRepair.js");
13
+ const parseJsonExample = (exampleText) => {
14
+ const trimmed = (exampleText ?? "").trim();
15
+ if (!trimmed) {
16
+ return { value: null, error: "Response example is required." };
17
+ }
18
+ let parsed;
19
+ try {
20
+ parsed = JSON.parse((0, jsonRepair_js_1.extractJsonPayload)(trimmed));
21
+ }
22
+ catch {
23
+ return { value: null, error: "Response example is not valid JSON." };
24
+ }
25
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
26
+ return {
27
+ value: null,
28
+ error: "Response example must be a JSON object (e.g. {\"sentiment\": \"positive\"}).",
29
+ };
30
+ }
31
+ return { value: parsed, error: null };
32
+ };
33
+ exports.parseJsonExample = parseJsonExample;
34
+ const deriveValueSchema = (value) => {
35
+ if (value === null || value === undefined) {
36
+ return {}; // no constraint — the example gives no type signal
37
+ }
38
+ if (typeof value === "string")
39
+ return { type: "string" };
40
+ if (typeof value === "boolean")
41
+ return { type: "boolean" };
42
+ // Never "integer": an example value of 1 must not reject a reply of 0.9.
43
+ if (typeof value === "number")
44
+ return { type: "number" };
45
+ if (Array.isArray(value)) {
46
+ return value.length > 0
47
+ ? { type: "array", items: deriveValueSchema(value[0]) }
48
+ : { type: "array" };
49
+ }
50
+ const properties = {};
51
+ for (const [key, nested] of Object.entries(value)) {
52
+ properties[key] = deriveValueSchema(nested);
53
+ }
54
+ return { type: "object", properties, additionalProperties: true };
55
+ };
56
+ const deriveSchemaFromExample = (example) => {
57
+ const properties = {};
58
+ for (const [key, value] of Object.entries(example)) {
59
+ properties[key] = deriveValueSchema(value);
60
+ }
61
+ return {
62
+ type: "object",
63
+ properties,
64
+ required: Object.keys(example),
65
+ additionalProperties: true,
66
+ };
67
+ };
68
+ exports.deriveSchemaFromExample = deriveSchemaFromExample;
69
+ // Direct structural validation of a parsed reply against the example — the
70
+ // SAME rules deriveSchemaFromExample encodes, but WITHOUT ajv: Ajv compiles
71
+ // schemas through the Function constructor, which a CSP that bans
72
+ // 'unsafe-eval' (the Electron renderer) refuses. Returns ajv-style failure
73
+ // messages; empty array = valid.
74
+ const validateValueAgainstExample = (path, exampleValue, actual, failures) => {
75
+ if (exampleValue === null || exampleValue === undefined) {
76
+ return; // the example gives no type signal
77
+ }
78
+ if (typeof exampleValue === "string") {
79
+ if (typeof actual !== "string")
80
+ failures.push(`${path} must be string`);
81
+ return;
82
+ }
83
+ if (typeof exampleValue === "boolean") {
84
+ if (typeof actual !== "boolean")
85
+ failures.push(`${path} must be boolean`);
86
+ return;
87
+ }
88
+ // Never integer-strict: an example value of 1 must not reject 0.9.
89
+ if (typeof exampleValue === "number") {
90
+ if (typeof actual !== "number" || !Number.isFinite(actual)) {
91
+ failures.push(`${path} must be number`);
92
+ }
93
+ return;
94
+ }
95
+ if (Array.isArray(exampleValue)) {
96
+ if (!Array.isArray(actual)) {
97
+ failures.push(`${path} must be array`);
98
+ return;
99
+ }
100
+ if (exampleValue.length > 0) {
101
+ actual.forEach((item, index) => validateValueAgainstExample(`${path}/${index}`, exampleValue[0], item, failures));
102
+ }
103
+ return;
104
+ }
105
+ // Nested object: type-check the properties that ARE present; nested keys
106
+ // are never required (mirrors the derived schema's lenient recursion).
107
+ if (typeof actual !== "object" || actual === null || Array.isArray(actual)) {
108
+ failures.push(`${path} must be object`);
109
+ return;
110
+ }
111
+ const record = actual;
112
+ for (const [key, nested] of Object.entries(exampleValue)) {
113
+ if (key in record) {
114
+ validateValueAgainstExample(`${path}/${key}`, nested, record[key], failures);
115
+ }
116
+ }
117
+ };
118
+ const validateAgainstExample = (example, value) => {
119
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
120
+ return ["(root) must be a JSON object"];
121
+ }
122
+ const failures = [];
123
+ const record = value;
124
+ for (const [key, exampleValue] of Object.entries(example)) {
125
+ if (!(key in record)) {
126
+ failures.push(`(root) must have required property '${key}'`);
127
+ continue;
128
+ }
129
+ validateValueAgainstExample(`/${key}`, exampleValue, record[key], failures);
130
+ }
131
+ return failures;
132
+ };
133
+ exports.validateAgainstExample = validateAgainstExample;
134
+ // The word "JSON" in the system message also satisfies OpenAI's
135
+ // `response_format: json_object` requirement (it rejects prompts that never
136
+ // mention JSON).
137
+ const buildAiMessages = ({ resolvedPrompt, exampleText, }) => [
138
+ {
139
+ role: "system",
140
+ content: [
141
+ "You are a step inside an automated API-testing scenario.",
142
+ "Reply with ONLY a single JSON object — no markdown, no code fences, no prose.",
143
+ "The reply must use the same top-level keys and value types as this example (values may differ):",
144
+ exampleText.trim(),
145
+ ].join("\n"),
146
+ },
147
+ { role: "user", content: resolvedPrompt },
148
+ ];
149
+ exports.buildAiMessages = buildAiMessages;
150
+ //# 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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"}