callman-core 1.19.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.
- package/dist/ai/jsonRepair.d.ts +2 -0
- package/dist/ai/jsonRepair.d.ts.map +1 -0
- package/dist/ai/jsonRepair.js +61 -0
- package/dist/ai/jsonRepair.js.map +1 -0
- package/dist/host/db/connectionMapping.d.ts +4 -0
- package/dist/host/db/connectionMapping.d.ts.map +1 -1
- package/dist/host/db/connectionMapping.js +4 -0
- package/dist/host/db/connectionMapping.js.map +1 -1
- package/dist/host/db/pgClientConfig.d.ts +11 -0
- package/dist/host/db/pgClientConfig.d.ts.map +1 -0
- package/dist/host/db/pgClientConfig.js +83 -0
- package/dist/host/db/pgClientConfig.js.map +1 -0
- package/dist/host/db/pgSessionManager.d.ts +18 -0
- package/dist/host/db/pgSessionManager.d.ts.map +1 -0
- package/dist/host/db/pgSessionManager.js +162 -0
- package/dist/host/db/pgSessionManager.js.map +1 -0
- package/dist/host/db/postgresAdapter.d.ts.map +1 -1
- package/dist/host/db/postgresAdapter.js +7 -36
- package/dist/host/db/postgresAdapter.js.map +1 -1
- package/dist/host/db/queryExecutor.d.ts +4 -0
- package/dist/host/db/queryExecutor.d.ts.map +1 -1
- package/dist/host/db/queryExecutor.js +40 -2
- package/dist/host/db/queryExecutor.js.map +1 -1
- package/dist/host/db/sqlState.d.ts +2 -0
- package/dist/host/db/sqlState.d.ts.map +1 -0
- package/dist/host/db/sqlState.js +14 -0
- package/dist/host/db/sqlState.js.map +1 -0
- package/dist/host/db/types.d.ts +13 -0
- package/dist/host/db/types.d.ts.map +1 -1
- package/dist/host/index.d.ts +3 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +7 -0
- package/dist/host/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/scenario-runner/adapters/ai-executor.d.ts +9 -0
- package/dist/scenario-runner/adapters/ai-executor.d.ts.map +1 -0
- package/dist/scenario-runner/adapters/ai-executor.js +119 -0
- package/dist/scenario-runner/adapters/ai-executor.js.map +1 -0
- package/dist/scenario-runner/adapters/connection-config.d.ts +4 -0
- package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/db-executor.d.ts +7 -1
- package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/db-executor.js +106 -1
- package/dist/scenario-runner/adapters/db-executor.js.map +1 -1
- package/dist/scenario-runner/adapters/helpers/aiExample.d.ts +12 -0
- package/dist/scenario-runner/adapters/helpers/aiExample.d.ts.map +1 -0
- package/dist/scenario-runner/adapters/helpers/aiExample.js +79 -0
- package/dist/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
- package/dist/scenario-runner/adapters/index.d.ts +4 -2
- package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/index.js +15 -1
- package/dist/scenario-runner/adapters/index.js.map +1 -1
- package/dist/scenario-runner/adapters/types.d.ts +22 -0
- package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
- package/dist/scenario-runner/condition.d.ts +1 -0
- package/dist/scenario-runner/condition.d.ts.map +1 -1
- package/dist/scenario-runner/condition.js +164 -4
- package/dist/scenario-runner/condition.js.map +1 -1
- package/dist/scenario-runner/conditionTypes.d.ts +1 -1
- package/dist/scenario-runner/conditionTypes.d.ts.map +1 -1
- package/dist/scenario-runner/graphTraversal.d.ts +6 -0
- package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
- package/dist/scenario-runner/graphTraversal.js +7 -0
- package/dist/scenario-runner/graphTraversal.js.map +1 -1
- package/dist/scenario-runner/nodePolicy.d.ts +2 -2
- package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
- package/dist/scenario-runner/nodePolicy.js +2 -0
- package/dist/scenario-runner/nodePolicy.js.map +1 -1
- package/dist/scenario-runner/runScenario.d.ts.map +1 -1
- package/dist/scenario-runner/runScenario.js +70 -1
- package/dist/scenario-runner/runScenario.js.map +1 -1
- package/dist/scenario-runner/types.d.ts +75 -3
- package/dist/scenario-runner/types.d.ts.map +1 -1
- package/dist-cjs/ai/jsonRepair.js +65 -0
- package/dist-cjs/ai/jsonRepair.js.map +1 -0
- package/dist-cjs/host/db/connectionMapping.js +4 -0
- package/dist-cjs/host/db/connectionMapping.js.map +1 -1
- package/dist-cjs/host/db/pgClientConfig.js +90 -0
- package/dist-cjs/host/db/pgClientConfig.js.map +1 -0
- package/dist-cjs/host/db/pgSessionManager.js +170 -0
- package/dist-cjs/host/db/pgSessionManager.js.map +1 -0
- package/dist-cjs/host/db/postgresAdapter.js +7 -36
- package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
- package/dist-cjs/host/db/queryExecutor.js +40 -2
- package/dist-cjs/host/db/queryExecutor.js.map +1 -1
- package/dist-cjs/host/db/sqlState.js +18 -0
- package/dist-cjs/host/db/sqlState.js.map +1 -0
- package/dist-cjs/host/index.js +16 -1
- package/dist-cjs/host/index.js.map +1 -1
- package/dist-cjs/index.js +5 -1
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/ai-executor.js +123 -0
- package/dist-cjs/scenario-runner/adapters/ai-executor.js.map +1 -0
- package/dist-cjs/scenario-runner/adapters/db-executor.js +108 -2
- package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js +85 -0
- package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
- package/dist-cjs/scenario-runner/adapters/index.js +21 -1
- package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
- package/dist-cjs/scenario-runner/condition.js +166 -5
- package/dist-cjs/scenario-runner/condition.js.map +1 -1
- package/dist-cjs/scenario-runner/graphTraversal.js +8 -1
- package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
- package/dist-cjs/scenario-runner/nodePolicy.js +2 -0
- package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenario.js +70 -1
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Run-scoped PostgreSQL sessions for scenario db nodes (`useSession`).
|
|
3
|
+
//
|
|
4
|
+
// One live `pg` Client per (runId, connection identity). All session-joined
|
|
5
|
+
// nodes of a run share that client, so `BEGIN`, temp tables, GUCs and
|
|
6
|
+
// advisory locks survive between nodes — the foundation of the
|
|
7
|
+
// seed → call function → assert → ROLLBACK stored-function testing pattern.
|
|
8
|
+
//
|
|
9
|
+
// Modeled on callman-backend's kafka-client-pool: lazy open, per-session
|
|
10
|
+
// serialization, idle sweeper, explicit shutdown hook. Postgres-only by
|
|
11
|
+
// design — other providers reject `useSession` at the host driver.
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.__getPgSessionCountForTests = exports.closeAllPostgresSessions = exports.releasePostgresSessionsForRun = exports.executePostgresQueryInSession = exports.__setPgSessionDriverForTests = void 0;
|
|
14
|
+
const lazy_js_1 = require("../lazy.js");
|
|
15
|
+
const pgClientConfig_js_1 = require("./pgClientConfig.js");
|
|
16
|
+
const IDLE_SWEEP_INTERVAL_MS = 60_000;
|
|
17
|
+
const IDLE_SESSION_TTL_MS = 5 * 60_000;
|
|
18
|
+
const sessions = new Map();
|
|
19
|
+
let sweeper = null;
|
|
20
|
+
const unwrap = (mod) => (mod && mod.default && !mod.Client ? mod.default : mod);
|
|
21
|
+
// Test seam mirroring postgresAdapter's — lets unit tests inject a fake
|
|
22
|
+
// driver without a live server.
|
|
23
|
+
let pgDriverOverride = null;
|
|
24
|
+
const __setPgSessionDriverForTests = (driver) => {
|
|
25
|
+
pgDriverOverride = driver;
|
|
26
|
+
};
|
|
27
|
+
exports.__setPgSessionDriverForTests = __setPgSessionDriverForTests;
|
|
28
|
+
const loadPgDriver = async () => {
|
|
29
|
+
if (pgDriverOverride)
|
|
30
|
+
return pgDriverOverride;
|
|
31
|
+
try {
|
|
32
|
+
return unwrap(await (0, lazy_js_1.loadOptionalModule)("pg"));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new Error("PostgreSQL driver (`pg`) is not installed. Install `pg` to use PostgreSQL sessions.");
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
// Connection identity participates in the key so two different connections
|
|
39
|
+
// in one run never share a client, even if their `id`s degenerate to the
|
|
40
|
+
// same normalized placeholder.
|
|
41
|
+
const sessionKey = (runId, connection) => [
|
|
42
|
+
runId,
|
|
43
|
+
connection.id,
|
|
44
|
+
connection.connectionString ?? "",
|
|
45
|
+
connection.host,
|
|
46
|
+
String(connection.port),
|
|
47
|
+
connection.database ?? "",
|
|
48
|
+
connection.username,
|
|
49
|
+
].join("::");
|
|
50
|
+
const ensureSweeper = () => {
|
|
51
|
+
if (sweeper)
|
|
52
|
+
return;
|
|
53
|
+
sweeper = setInterval(() => {
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
for (const [key, entry] of sessions) {
|
|
56
|
+
if (now - entry.lastUsedAtMs > IDLE_SESSION_TTL_MS) {
|
|
57
|
+
sessions.delete(key);
|
|
58
|
+
void destroyEntry(entry, "rollback");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (sessions.size === 0 && sweeper) {
|
|
62
|
+
clearInterval(sweeper);
|
|
63
|
+
sweeper = null;
|
|
64
|
+
}
|
|
65
|
+
}, IDLE_SWEEP_INTERVAL_MS);
|
|
66
|
+
// Never keep the host process alive just for the sweeper.
|
|
67
|
+
sweeper.unref?.();
|
|
68
|
+
};
|
|
69
|
+
const destroyEntry = async (entry, outcome) => {
|
|
70
|
+
try {
|
|
71
|
+
const client = await entry.clientPromise;
|
|
72
|
+
if (entry.transactionOpen && !entry.poisoned) {
|
|
73
|
+
try {
|
|
74
|
+
await client.query(outcome === "commit" ? "COMMIT" : "ROLLBACK");
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// The transaction dies with the connection either way.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await client.end();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Best-effort teardown.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Client never connected — nothing to tear down.
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const openEntry = (runId, connection) => {
|
|
92
|
+
const entry = {
|
|
93
|
+
clientPromise: (async () => {
|
|
94
|
+
const { Client } = await loadPgDriver();
|
|
95
|
+
const client = new Client((0, pgClientConfig_js_1.buildPgClientConfig)(connection));
|
|
96
|
+
await client.connect();
|
|
97
|
+
// Socket-level errors surface here (killed backend, network drop);
|
|
98
|
+
// mark the session so the next query fails fast with the cause.
|
|
99
|
+
client.on?.("error", (error) => {
|
|
100
|
+
entry.poisoned =
|
|
101
|
+
error instanceof Error ? error.message : "PostgreSQL session connection lost";
|
|
102
|
+
});
|
|
103
|
+
return client;
|
|
104
|
+
})(),
|
|
105
|
+
chain: Promise.resolve(),
|
|
106
|
+
transactionOpen: false,
|
|
107
|
+
poisoned: null,
|
|
108
|
+
lastUsedAtMs: Date.now(),
|
|
109
|
+
runId,
|
|
110
|
+
};
|
|
111
|
+
return entry;
|
|
112
|
+
};
|
|
113
|
+
const executePostgresQueryInSession = async (input) => {
|
|
114
|
+
const key = sessionKey(input.runId, input.connection);
|
|
115
|
+
let entry = sessions.get(key);
|
|
116
|
+
if (!entry) {
|
|
117
|
+
entry = openEntry(input.runId, input.connection);
|
|
118
|
+
sessions.set(key, entry);
|
|
119
|
+
ensureSweeper();
|
|
120
|
+
}
|
|
121
|
+
const run = entry.chain.then(async () => {
|
|
122
|
+
if (entry.poisoned) {
|
|
123
|
+
throw new Error(`PostgreSQL session is unusable: ${entry.poisoned}`);
|
|
124
|
+
}
|
|
125
|
+
const client = await entry.clientPromise;
|
|
126
|
+
if (input.transactionMode !== "none" && !entry.transactionOpen) {
|
|
127
|
+
await client.query("BEGIN");
|
|
128
|
+
entry.transactionOpen = true;
|
|
129
|
+
}
|
|
130
|
+
return (0, pgClientConfig_js_1.runPgQuery)(client, input.query, input.params ?? []);
|
|
131
|
+
});
|
|
132
|
+
// The chain must survive a failed query (SQL errors are normal in
|
|
133
|
+
// expectError flows) — swallow for chaining purposes only.
|
|
134
|
+
entry.chain = run.then(() => undefined, () => undefined).then(() => {
|
|
135
|
+
entry.lastUsedAtMs = Date.now();
|
|
136
|
+
});
|
|
137
|
+
return run;
|
|
138
|
+
};
|
|
139
|
+
exports.executePostgresQueryInSession = executePostgresQueryInSession;
|
|
140
|
+
// Close every session belonging to `runId` — COMMIT/ROLLBACK per the run
|
|
141
|
+
// outcome, then end the client. Queued statements finish (or fail) first
|
|
142
|
+
// thanks to the serialization chain.
|
|
143
|
+
const releasePostgresSessionsForRun = async (runId, outcome) => {
|
|
144
|
+
const owned = [];
|
|
145
|
+
for (const [key, entry] of sessions) {
|
|
146
|
+
if (entry.runId === runId)
|
|
147
|
+
owned.push([key, entry]);
|
|
148
|
+
}
|
|
149
|
+
await Promise.all(owned.map(async ([key, entry]) => {
|
|
150
|
+
sessions.delete(key);
|
|
151
|
+
await entry.chain;
|
|
152
|
+
await destroyEntry(entry, outcome);
|
|
153
|
+
}));
|
|
154
|
+
};
|
|
155
|
+
exports.releasePostgresSessionsForRun = releasePostgresSessionsForRun;
|
|
156
|
+
// Shutdown hook for hosts (backend process exit, CLI end, electron quit).
|
|
157
|
+
const closeAllPostgresSessions = async () => {
|
|
158
|
+
const all = Array.from(sessions.values());
|
|
159
|
+
sessions.clear();
|
|
160
|
+
if (sweeper) {
|
|
161
|
+
clearInterval(sweeper);
|
|
162
|
+
sweeper = null;
|
|
163
|
+
}
|
|
164
|
+
await Promise.all(all.map((entry) => destroyEntry(entry, "rollback")));
|
|
165
|
+
};
|
|
166
|
+
exports.closeAllPostgresSessions = closeAllPostgresSessions;
|
|
167
|
+
// Introspection for tests.
|
|
168
|
+
const __getPgSessionCountForTests = () => sessions.size;
|
|
169
|
+
exports.__getPgSessionCountForTests = __getPgSessionCountForTests;
|
|
170
|
+
//# sourceMappingURL=pgSessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgSessionManager.js","sourceRoot":"","sources":["../../../src/host/db/pgSessionManager.ts"],"names":[],"mappings":";AAAA,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,sEAAsE;AACtE,+DAA+D;AAC/D,4EAA4E;AAC5E,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,mEAAmE;;;AAEnE,wCAAgD;AAEhD,2DAAsE;AAiBtE,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC;AAEvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AACnD,IAAI,OAAO,GAA0C,IAAI,CAAC;AAE1D,MAAM,MAAM,GAAG,CAAC,GAAQ,EAAO,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE1F,wEAAwE;AACxE,gCAAgC;AAChC,IAAI,gBAAgB,GAAQ,IAAI,CAAC;AAC1B,MAAM,4BAA4B,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACvE,gBAAgB,GAAG,MAAM,CAAC;AAC5B,CAAC,CAAC;AAFW,QAAA,4BAA4B,gCAEvC;AAEF,MAAM,YAAY,GAAG,KAAK,IAAkB,EAAE;IAC5C,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,2EAA2E;AAC3E,yEAAyE;AACzE,+BAA+B;AAC/B,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,UAAwB,EAAU,EAAE,CACrE;IACE,KAAK;IACL,UAAU,CAAC,EAAE;IACb,UAAU,CAAC,gBAAgB,IAAI,EAAE;IACjC,UAAU,CAAC,IAAI;IACf,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IACvB,UAAU,CAAC,QAAQ,IAAI,EAAE;IACzB,UAAU,CAAC,QAAQ;CACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf,MAAM,aAAa,GAAG,GAAS,EAAE;IAC/B,IAAI,OAAO;QAAE,OAAO;IACpB,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpC,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,EAAE,CAAC;gBACnD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,KAAK,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC3B,0DAA0D;IACzD,OAAkC,CAAC,KAAK,EAAE,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EACxB,KAAqB,EACrB,OAA8B,EACf,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,UAAwB,EAAkB,EAAE;IAC5E,MAAM,KAAK,GAAmB;QAC5B,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAA,uCAAmB,EAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,mEAAmE;YACnE,gEAAgE;YAChE,MAAM,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;gBACtC,KAAK,CAAC,QAAQ;oBACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC;YAClF,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,EAAE;QACJ,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE;QACxB,eAAe,EAAE,KAAK;QACtB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;QACxB,KAAK;KACN,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAUK,MAAM,6BAA6B,GAAG,KAAK,EAChD,KAA4B,EACoB,EAAE;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,KAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAAM,CAAC,aAAa,CAAC;QAC1C,IAAI,KAAK,CAAC,eAAe,KAAK,MAAM,IAAI,CAAC,KAAM,CAAC,eAAe,EAAE,CAAC;YAChE,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAM,CAAC,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,OAAO,IAAA,8BAAU,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,2DAA2D;IAC3D,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CACpB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC,IAAI,CAAC,GAAG,EAAE;QACV,KAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAjCW,QAAA,6BAA6B,iCAiCxC;AAEF,yEAAyE;AACzE,yEAAyE;AACzE,qCAAqC;AAC9B,MAAM,6BAA6B,GAAG,KAAK,EAChD,KAAa,EACb,OAA8B,EACf,EAAE;IACjB,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC,KAAK,CAAC;QAClB,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAfW,QAAA,6BAA6B,iCAexC;AAEF,0EAA0E;AACnE,MAAM,wBAAwB,GAAG,KAAK,IAAmB,EAAE;IAChE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC;AARW,QAAA,wBAAwB,4BAQnC;AAEF,2BAA2B;AACpB,MAAM,2BAA2B,GAAG,GAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAA1D,QAAA,2BAA2B,+BAA+B"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// PostgreSQL adapter. Ported from `pmanfrontend/electron/db/postgresAdapter.ts`
|
|
3
|
-
// with lazy `pg` loading via `loadOptionalModule`.
|
|
3
|
+
// with lazy `pg` loading via `loadOptionalModule`. Client config (incl. TLS
|
|
4
|
+
// modes) and query execution are shared with the session manager through
|
|
5
|
+
// pgClientConfig.ts.
|
|
4
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
7
|
exports.executePostgresQuery = exports.testPostgresConnection = exports.__setPostgresDriverForTests = void 0;
|
|
6
8
|
const lazy_js_1 = require("../lazy.js");
|
|
7
|
-
const
|
|
9
|
+
const pgClientConfig_js_1 = require("./pgClientConfig.js");
|
|
8
10
|
const unwrap = (mod) => (mod && mod.default && !mod.Client ? mod.default : mod);
|
|
9
11
|
// Test-only seam (see mongoAdapter).
|
|
10
12
|
let pgDriverOverride = null;
|
|
@@ -23,34 +25,9 @@ const loadPgDriver = async () => {
|
|
|
23
25
|
throw new Error("PostgreSQL driver (`pg`) is not installed. Install `pg` to use PostgreSQL connections.");
|
|
24
26
|
}
|
|
25
27
|
};
|
|
26
|
-
const buildClientConfig = (connection) => {
|
|
27
|
-
const ssl = connection.ssl ? { rejectUnauthorized: false } : undefined;
|
|
28
|
-
if (connection.connectionString?.trim()) {
|
|
29
|
-
return { connectionString: connection.connectionString.trim(), ssl, connectionTimeoutMillis: 8000 };
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
host: connection.host,
|
|
33
|
-
port: connection.port,
|
|
34
|
-
database: connection.database,
|
|
35
|
-
user: connection.username,
|
|
36
|
-
password: connection.password,
|
|
37
|
-
ssl,
|
|
38
|
-
connectionTimeoutMillis: 8000,
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
const normalizePgValue = (value) => JSON.parse(JSON.stringify(value, (_key, entry) => {
|
|
42
|
-
if (typeof entry === "bigint")
|
|
43
|
-
return entry.toString();
|
|
44
|
-
if (entry instanceof Date)
|
|
45
|
-
return entry.toISOString();
|
|
46
|
-
if (Buffer.isBuffer(entry) || entry instanceof Uint8Array) {
|
|
47
|
-
return Buffer.from(entry).toString("hex");
|
|
48
|
-
}
|
|
49
|
-
return entry;
|
|
50
|
-
}));
|
|
51
28
|
const testPostgresConnection = async (connection) => {
|
|
52
29
|
const { Client } = await loadPgDriver();
|
|
53
|
-
const client = new Client(
|
|
30
|
+
const client = new Client((0, pgClientConfig_js_1.buildPgClientConfig)(connection));
|
|
54
31
|
await client.connect();
|
|
55
32
|
try {
|
|
56
33
|
await client.query("SELECT 1");
|
|
@@ -62,16 +39,10 @@ const testPostgresConnection = async (connection) => {
|
|
|
62
39
|
exports.testPostgresConnection = testPostgresConnection;
|
|
63
40
|
const executePostgresQuery = async (connection, query, params = []) => {
|
|
64
41
|
const { Client } = await loadPgDriver();
|
|
65
|
-
const client = new Client(
|
|
42
|
+
const client = new Client((0, pgClientConfig_js_1.buildPgClientConfig)(connection));
|
|
66
43
|
await client.connect();
|
|
67
44
|
try {
|
|
68
|
-
|
|
69
|
-
const result = await client.query(finalQuery, params);
|
|
70
|
-
const rows = Array.isArray(result.rows) ? result.rows.map(normalizePgValue) : [];
|
|
71
|
-
return {
|
|
72
|
-
rows,
|
|
73
|
-
rowCount: typeof result.rowCount === "number" ? result.rowCount : rows.length,
|
|
74
|
-
};
|
|
45
|
+
return await (0, pgClientConfig_js_1.runPgQuery)(client, query, params);
|
|
75
46
|
}
|
|
76
47
|
finally {
|
|
77
48
|
await client.end();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,yEAAyE;AACzE,qBAAqB;;;AAErB,wCAAgD;AAEhD,2DAAsE;AAEtE,MAAM,MAAM,GAAG,CAAC,GAAQ,EAAO,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE1F,qCAAqC;AACrC,IAAI,gBAAgB,GAAQ,IAAI,CAAC;AAC1B,MAAM,2BAA2B,GAAG,CAAC,MAAkB,EAAQ,EAAE;IACtE,gBAAgB,GAAG,MAAM,CAAC;AAC5B,CAAC,CAAC;AAFW,QAAA,2BAA2B,+BAEtC;AAEF,MAAM,YAAY,GAAG,KAAK,IAAkB,EAAE;IAC5C,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,IAAA,4BAAkB,EAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEK,MAAM,sBAAsB,GAAG,KAAK,EAAE,UAAwB,EAAiB,EAAE;IACtF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAA,uCAAmB,EAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AATW,QAAA,sBAAsB,0BASjC;AAEK,MAAM,oBAAoB,GAAG,KAAK,EACvC,UAAwB,EACxB,KAAa,EACb,SAAoB,EAAE,EAC0B,EAAE;IAClD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAA,uCAAmB,EAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,8BAAU,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAbW,QAAA,oBAAoB,wBAa/B"}
|
|
@@ -10,6 +10,8 @@ const mongoAdapter_js_1 = require("./mongoAdapter.js");
|
|
|
10
10
|
const mysqlAdapter_js_1 = require("./mysqlAdapter.js");
|
|
11
11
|
const oracleAdapter_js_1 = require("./oracleAdapter.js");
|
|
12
12
|
const postgresAdapter_js_1 = require("./postgresAdapter.js");
|
|
13
|
+
const pgSessionManager_js_1 = require("./pgSessionManager.js");
|
|
14
|
+
const sqlState_js_1 = require("./sqlState.js");
|
|
13
15
|
const templateResolver_js_1 = require("./templateResolver.js");
|
|
14
16
|
const mssqlAdapter_js_1 = require("./mssqlAdapter.js");
|
|
15
17
|
const executeAgainstConnection = async (connection, resolvedQuery, params = []) => {
|
|
@@ -30,7 +32,27 @@ const executeAgainstConnection = async (connection, resolvedQuery, params = [])
|
|
|
30
32
|
// right driver, WITHOUT re-resolving templates. This is the canonical entry for
|
|
31
33
|
// the scenario / `databaseExecutor` path (core's scenario runner resolves the
|
|
32
34
|
// template before calling the host), so hosts must not duplicate adapter logic.
|
|
33
|
-
|
|
35
|
+
//
|
|
36
|
+
// `session` (additive) routes the query through the run-scoped Postgres
|
|
37
|
+
// session instead of a one-shot client — see pgSessionManager. Only Postgres
|
|
38
|
+
// supports sessions; other providers fail with an actionable message so a
|
|
39
|
+
// `useSession` node never silently runs autocommit.
|
|
40
|
+
const executeResolvedDbQuery = (input) => {
|
|
41
|
+
const connection = normalizeConnectionInput(input.connection);
|
|
42
|
+
if (input.session) {
|
|
43
|
+
if (connection.type !== "postgres") {
|
|
44
|
+
return Promise.reject(new Error(`Scenario DB sessions are only supported for PostgreSQL connections (got "${connection.type}"). Disable 'Run in scenario transaction' on this node.`));
|
|
45
|
+
}
|
|
46
|
+
return (0, pgSessionManager_js_1.executePostgresQueryInSession)({
|
|
47
|
+
connection,
|
|
48
|
+
runId: input.session.runId,
|
|
49
|
+
transactionMode: input.session.transactionMode,
|
|
50
|
+
query: input.resolvedQuery,
|
|
51
|
+
params: input.params ?? [],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return executeAgainstConnection(connection, input.resolvedQuery, input.params ?? []);
|
|
55
|
+
};
|
|
34
56
|
exports.executeResolvedDbQuery = executeResolvedDbQuery;
|
|
35
57
|
const normalizeConnectionInput = (connectionInput) => ({
|
|
36
58
|
id: connectionInput.id?.trim() || "runtime-connection",
|
|
@@ -50,6 +72,10 @@ const normalizeConnectionInput = (connectionInput) => ({
|
|
|
50
72
|
password: connectionInput.password,
|
|
51
73
|
ssl: connectionInput.ssl,
|
|
52
74
|
trustServerCertificate: connectionInput.trustServerCertificate,
|
|
75
|
+
sslMode: connectionInput.sslMode,
|
|
76
|
+
caCert: connectionInput.caCert,
|
|
77
|
+
clientCert: connectionInput.clientCert,
|
|
78
|
+
clientKey: connectionInput.clientKey,
|
|
53
79
|
});
|
|
54
80
|
// Connectivity check for a draft/saved connection. Ported from the desktop
|
|
55
81
|
// host so consumers (Electron `db:test-connection`) don't reimplement it.
|
|
@@ -109,7 +135,18 @@ const executeQuery = async (payload) => {
|
|
|
109
135
|
}
|
|
110
136
|
try {
|
|
111
137
|
const resolvedQuery = (0, templateResolver_js_1.resolveTemplate)(payload.query, payload.context ?? {});
|
|
112
|
-
|
|
138
|
+
if (payload.session && connection.type !== "postgres") {
|
|
139
|
+
throw new Error(`Scenario DB sessions are only supported for PostgreSQL connections (got "${connection.type}"). Disable 'Run in scenario transaction' on this node.`);
|
|
140
|
+
}
|
|
141
|
+
const result = payload.session
|
|
142
|
+
? await (0, pgSessionManager_js_1.executePostgresQueryInSession)({
|
|
143
|
+
connection,
|
|
144
|
+
runId: payload.session.runId,
|
|
145
|
+
transactionMode: payload.session.transactionMode,
|
|
146
|
+
query: resolvedQuery,
|
|
147
|
+
params: payload.params ?? [],
|
|
148
|
+
})
|
|
149
|
+
: await executeAgainstConnection(connection, resolvedQuery, payload.params ?? []);
|
|
113
150
|
return {
|
|
114
151
|
success: true,
|
|
115
152
|
phase: payload.phase,
|
|
@@ -140,6 +177,7 @@ const executeQuery = async (payload) => {
|
|
|
140
177
|
durationMs: Math.round(node_perf_hooks_1.performance.now() - startedAt),
|
|
141
178
|
executedAt: new Date().toISOString(),
|
|
142
179
|
error: error instanceof Error ? error.message : String(error),
|
|
180
|
+
...((0, sqlState_js_1.extractSqlState)(error) ? { sqlState: (0, sqlState_js_1.extractSqlState)(error) } : {}),
|
|
143
181
|
};
|
|
144
182
|
}
|
|
145
183
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,+EAA+E;AAC/E,gFAAgF;AAChF,wEAAwE;;;AAExE,qDAA8C;AAE9C,uDAA2E;AAC3E,uDAA2E;AAC3E,yDAA8E;AAC9E,6DAAoF;AACpF,+DAAwD;AACxD,uDAA2E;AAS3E,MAAM,wBAAwB,GAAG,KAAK,EACpC,UAAwB,EACxB,aAAqB,EACrB,SAAoB,EAAE,EAC0B,EAAE;IAClD,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAA,mCAAiB,EAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,KAAK,UAAU;YACb,OAAO,IAAA,yCAAoB,EAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QACjE,KAAK,OAAO;YACV,OAAO,IAAA,mCAAiB,EAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAC9D,KAAK,OAAO;YACV,OAAO,IAAA,mCAAiB,EAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAC9D;YACE,OAAO,IAAA,qCAAkB,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;AACH,CAAC,CAAC;AAEF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;
|
|
1
|
+
{"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractSqlState = void 0;
|
|
4
|
+
// SQLSTATE extraction shared by the scenario db-executor, the host query
|
|
5
|
+
// executor, and desktop adapters. Postgres SQLSTATE is 5 alphanumeric chars;
|
|
6
|
+
// `pg` errors expose it as `.code`. `.sqlState` is checked first so hosts
|
|
7
|
+
// can attach it explicitly without colliding with Node's `error.code`
|
|
8
|
+
// values (e.g. ECONNREFUSED).
|
|
9
|
+
const extractSqlState = (error) => {
|
|
10
|
+
if (!error || typeof error !== "object")
|
|
11
|
+
return undefined;
|
|
12
|
+
const candidate = error.sqlState ?? error.code;
|
|
13
|
+
return typeof candidate === "string" && /^[0-9A-Z]{5}$/.test(candidate)
|
|
14
|
+
? candidate
|
|
15
|
+
: undefined;
|
|
16
|
+
};
|
|
17
|
+
exports.extractSqlState = extractSqlState;
|
|
18
|
+
//# sourceMappingURL=sqlState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlState.js","sourceRoot":"","sources":["../../../src/host/db/sqlState.ts"],"names":[],"mappings":";;;AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,0EAA0E;AAC1E,sEAAsE;AACtE,8BAA8B;AACvB,MAAM,eAAe,GAAG,CAAC,KAAc,EAAsB,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,SAAS,GACZ,KAAgC,CAAC,QAAQ,IAAK,KAA4B,CAAC,IAAI,CAAC;IACnF,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QACrE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B"}
|
package/dist-cjs/host/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// resolved connection runtimes into script capabilities. Lets the collection
|
|
4
4
|
// runner execute `pm.db.*` and `pm.redis` without an external host process.
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.__setRedisDriverForTests = exports.REDIS_COMMAND_SPECS = exports.parseRedisCommand = exports.executeRedisCommands = exports.databaseConfigToDbConnection = exports.OracleConnectStringError = exports.normalizeOracleConnectString = exports.renderDbQueryReference = exports.stripTrailingSqlTerminator = exports.__setMssqlDriverForTests = exports.testMssqlConnection = exports.executeMssqlQuery = exports.__setOracleDriverForTests = exports.testOracleConnection = exports.executeOracleQuery = exports.__setMysqlDriverForTests = exports.testMysqlConnection = exports.executeMysqlQuery = exports.__setPostgresDriverForTests = exports.testPostgresConnection = exports.executePostgresQuery = exports.__setMongoDriverForTests = exports.testMongoConnection = exports.executeMongoQuery = exports.testDbConnection = exports.executeResolvedDbQuery = exports.executeQuery = exports.buildRedisCapability = exports.buildRedisValueCache = exports.runRedisCommandsForPhase = exports.runConfiguredDbQuery = exports.buildDbExecuteCapability = void 0;
|
|
6
|
+
exports.__setRedisDriverForTests = exports.REDIS_COMMAND_SPECS = exports.parseRedisCommand = exports.executeRedisCommands = exports.databaseConfigToDbConnection = exports.OracleConnectStringError = exports.normalizeOracleConnectString = exports.renderDbQueryReference = exports.extractSqlState = exports.buildPgClientConfig = exports.buildPgSslConfig = exports.stripTrailingSqlTerminator = exports.__setMssqlDriverForTests = exports.testMssqlConnection = exports.executeMssqlQuery = exports.__setOracleDriverForTests = exports.testOracleConnection = exports.executeOracleQuery = exports.__setMysqlDriverForTests = exports.testMysqlConnection = exports.executeMysqlQuery = exports.__setPostgresDriverForTests = exports.testPostgresConnection = exports.executePostgresQuery = exports.__setMongoDriverForTests = exports.testMongoConnection = exports.executeMongoQuery = exports.__getPgSessionCountForTests = exports.__setPgSessionDriverForTests = exports.closeAllPostgresSessions = exports.releasePostgresSessionsForRun = exports.executePostgresQueryInSession = exports.testDbConnection = exports.executeResolvedDbQuery = exports.executeQuery = exports.buildRedisCapability = exports.buildRedisValueCache = exports.runRedisCommandsForPhase = exports.runConfiguredDbQuery = exports.buildDbExecuteCapability = void 0;
|
|
7
7
|
var connections_js_1 = require("./connections.js");
|
|
8
8
|
Object.defineProperty(exports, "buildDbExecuteCapability", { enumerable: true, get: function () { return connections_js_1.buildDbExecuteCapability; } });
|
|
9
9
|
Object.defineProperty(exports, "runConfiguredDbQuery", { enumerable: true, get: function () { return connections_js_1.runConfiguredDbQuery; } });
|
|
@@ -14,6 +14,16 @@ var queryExecutor_js_1 = require("./db/queryExecutor.js");
|
|
|
14
14
|
Object.defineProperty(exports, "executeQuery", { enumerable: true, get: function () { return queryExecutor_js_1.executeQuery; } });
|
|
15
15
|
Object.defineProperty(exports, "executeResolvedDbQuery", { enumerable: true, get: function () { return queryExecutor_js_1.executeResolvedDbQuery; } });
|
|
16
16
|
Object.defineProperty(exports, "testDbConnection", { enumerable: true, get: function () { return queryExecutor_js_1.testDbConnection; } });
|
|
17
|
+
// Run-scoped Postgres sessions for `useSession` db nodes (BEGIN…ROLLBACK
|
|
18
|
+
// spanning multiple nodes). Hosts wire `releasePostgresSessionsForRun` into
|
|
19
|
+
// the `databaseSessionRelease` driver and `closeAllPostgresSessions` into
|
|
20
|
+
// process shutdown.
|
|
21
|
+
var pgSessionManager_js_1 = require("./db/pgSessionManager.js");
|
|
22
|
+
Object.defineProperty(exports, "executePostgresQueryInSession", { enumerable: true, get: function () { return pgSessionManager_js_1.executePostgresQueryInSession; } });
|
|
23
|
+
Object.defineProperty(exports, "releasePostgresSessionsForRun", { enumerable: true, get: function () { return pgSessionManager_js_1.releasePostgresSessionsForRun; } });
|
|
24
|
+
Object.defineProperty(exports, "closeAllPostgresSessions", { enumerable: true, get: function () { return pgSessionManager_js_1.closeAllPostgresSessions; } });
|
|
25
|
+
Object.defineProperty(exports, "__setPgSessionDriverForTests", { enumerable: true, get: function () { return pgSessionManager_js_1.__setPgSessionDriverForTests; } });
|
|
26
|
+
Object.defineProperty(exports, "__getPgSessionCountForTests", { enumerable: true, get: function () { return pgSessionManager_js_1.__getPgSessionCountForTests; } });
|
|
17
27
|
// Individual adapters + connectivity checks, so hosts (Electron, backend) call
|
|
18
28
|
// the single shared implementation instead of duplicating driver logic.
|
|
19
29
|
var mongoAdapter_js_1 = require("./db/mongoAdapter.js");
|
|
@@ -38,6 +48,11 @@ Object.defineProperty(exports, "testMssqlConnection", { enumerable: true, get: f
|
|
|
38
48
|
Object.defineProperty(exports, "__setMssqlDriverForTests", { enumerable: true, get: function () { return mssqlAdapter_js_1.__setMssqlDriverForTests; } });
|
|
39
49
|
var sqlNormalize_js_1 = require("./db/sqlNormalize.js");
|
|
40
50
|
Object.defineProperty(exports, "stripTrailingSqlTerminator", { enumerable: true, get: function () { return sqlNormalize_js_1.stripTrailingSqlTerminator; } });
|
|
51
|
+
var pgClientConfig_js_1 = require("./db/pgClientConfig.js");
|
|
52
|
+
Object.defineProperty(exports, "buildPgSslConfig", { enumerable: true, get: function () { return pgClientConfig_js_1.buildPgSslConfig; } });
|
|
53
|
+
Object.defineProperty(exports, "buildPgClientConfig", { enumerable: true, get: function () { return pgClientConfig_js_1.buildPgClientConfig; } });
|
|
54
|
+
var sqlState_js_1 = require("./db/sqlState.js");
|
|
55
|
+
Object.defineProperty(exports, "extractSqlState", { enumerable: true, get: function () { return sqlState_js_1.extractSqlState; } });
|
|
41
56
|
var db_query_reference_js_1 = require("./db/db-query-reference.js");
|
|
42
57
|
Object.defineProperty(exports, "renderDbQueryReference", { enumerable: true, get: function () { return db_query_reference_js_1.renderDbQueryReference; } });
|
|
43
58
|
var oracleConnectString_js_1 = require("./db/oracleConnectString.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;;;AAE5E,mDAc0B;AAbxB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,sHAAA,oBAAoB,OAAA;AAWtB,0DAI+B;AAH7B,gHAAA,YAAY,OAAA;AACZ,0HAAA,sBAAsB,OAAA;AACtB,oHAAA,gBAAgB,OAAA;AAElB,+EAA+E;AAC/E,wEAAwE;AACxE,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,8DAIiC;AAH/B,0HAAA,oBAAoB,OAAA;AACpB,4HAAA,sBAAsB,OAAA;AACtB,iIAAA,2BAA2B,OAAA;AAE7B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,0DAI+B;AAH7B,sHAAA,kBAAkB,OAAA;AAClB,wHAAA,oBAAoB,OAAA;AACpB,6HAAA,yBAAyB,OAAA;AAE3B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,wDAAkE;AAAzD,6HAAA,0BAA0B,OAAA;AACnC,oEAAoE;AAA3D,+HAAA,sBAAsB,OAAA;AAC/B,sEAGqC;AAFnC,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,kEAImC;AAHjC,oIAAA,4BAA4B,OAAA;AAgB9B,2DAQiC;AAP/B,uHAAA,oBAAoB,OAAA;AACpB,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;;;AAE5E,mDAc0B;AAbxB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,0HAAA,wBAAwB,OAAA;AACxB,sHAAA,oBAAoB,OAAA;AACpB,sHAAA,oBAAoB,OAAA;AAWtB,0DAI+B;AAH7B,gHAAA,YAAY,OAAA;AACZ,0HAAA,sBAAsB,OAAA;AACtB,oHAAA,gBAAgB,OAAA;AAElB,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,oBAAoB;AACpB,gEAQkC;AAPhC,oIAAA,6BAA6B,OAAA;AAC7B,oIAAA,6BAA6B,OAAA;AAC7B,+HAAA,wBAAwB,OAAA;AACxB,mIAAA,4BAA4B,OAAA;AAC5B,kIAAA,2BAA2B,OAAA;AAI7B,+EAA+E;AAC/E,wEAAwE;AACxE,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,8DAIiC;AAH/B,0HAAA,oBAAoB,OAAA;AACpB,4HAAA,sBAAsB,OAAA;AACtB,iIAAA,2BAA2B,OAAA;AAE7B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,0DAI+B;AAH7B,sHAAA,kBAAkB,OAAA;AAClB,wHAAA,oBAAoB,OAAA;AACpB,6HAAA,yBAAyB,OAAA;AAE3B,wDAI8B;AAH5B,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA;AAE1B,wDAAkE;AAAzD,6HAAA,0BAA0B,OAAA;AACnC,4DAA+E;AAAtE,qHAAA,gBAAgB,OAAA;AAAE,wHAAA,mBAAmB,OAAA;AAC9C,gDAAmD;AAA1C,8GAAA,eAAe,OAAA;AACxB,oEAAoE;AAA3D,+HAAA,sBAAsB,OAAA;AAC/B,sEAGqC;AAFnC,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,kEAImC;AAHjC,oIAAA,4BAA4B,OAAA;AAgB9B,2DAQiC;AAP/B,uHAAA,oBAAoB,OAAA;AACpB,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,2HAAA,wBAAwB,OAAA"}
|
package/dist-cjs/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getSoapEnvelopeTemplate = exports.SOAP_12_ENVELOPE_TEMPLATE = exports.SOAP_11_ENVELOPE_TEMPLATE = exports.injectWsSecurityHeader = exports.buildWsSecurityHeader = exports.applySoapRequestTransforms = exports.resolveXPathCandidates = exports.isContractFormat = exports.FORMAT_VALIDATORS = exports.SCENARIO_CONTRACT_FORMATS = exports.normalizeContractPathKey = exports.generalizeContractPath = exports.resolveContractPath = exports.normalizeContractRule = exports.evaluateContractCandidate = exports.validateContracts = exports.isDisabledFeatureValue = exports.DisabledFeatureDependencyError = exports.isPendingKafkaValue = exports.PendingKafkaDependencyError = exports.createExpectApi = exports.PmAssertion = exports.RESERVED_LABEL_NAMES = exports.BLOCKED_GLOBAL_NAMES = exports.ALLOWED_GLOBAL_NAMES = exports.renderPmApiReference = exports.PM_API_METADATA = exports.runScriptIsolated = exports.validateScript = exports.executeScript = exports.runScript = exports.EnvStore = exports.decodeUrlQueryComponent = exports.extractUrlQueryPairs = exports.stripUrlQuery = exports.sanitizeJsonBody = exports.XML_PARSER_OPTIONS = exports.looksLikeXml = exports.parseXml = exports.isXmlContentType = exports.OAuth2Error = exports.buildOAuth2TokenRequest = exports.resolveOAuth2Token = exports.executeRequest = exports.runRequestWithDataset = exports.runRequest = exports.runCollection = void 0;
|
|
17
|
+
exports.extractJsonPayload = exports.getSoapEnvelopeTemplate = exports.SOAP_12_ENVELOPE_TEMPLATE = exports.SOAP_11_ENVELOPE_TEMPLATE = exports.injectWsSecurityHeader = exports.buildWsSecurityHeader = exports.applySoapRequestTransforms = exports.resolveXPathCandidates = exports.isContractFormat = exports.FORMAT_VALIDATORS = exports.SCENARIO_CONTRACT_FORMATS = exports.normalizeContractPathKey = exports.generalizeContractPath = exports.resolveContractPath = exports.normalizeContractRule = exports.evaluateContractCandidate = exports.validateContracts = exports.isDisabledFeatureValue = exports.DisabledFeatureDependencyError = exports.isPendingKafkaValue = exports.PendingKafkaDependencyError = exports.createExpectApi = exports.PmAssertion = exports.RESERVED_LABEL_NAMES = exports.BLOCKED_GLOBAL_NAMES = exports.ALLOWED_GLOBAL_NAMES = exports.renderPmApiReference = exports.PM_API_METADATA = exports.runScriptIsolated = exports.validateScript = exports.executeScript = exports.runScript = exports.EnvStore = exports.decodeUrlQueryComponent = exports.extractUrlQueryPairs = exports.stripUrlQuery = exports.sanitizeJsonBody = exports.XML_PARSER_OPTIONS = exports.looksLikeXml = exports.parseXml = exports.isXmlContentType = exports.OAuth2Error = exports.buildOAuth2TokenRequest = exports.resolveOAuth2Token = exports.executeRequest = exports.runRequestWithDataset = exports.runRequest = exports.runCollection = void 0;
|
|
18
18
|
var runCollection_js_1 = require("./runner/runCollection.js");
|
|
19
19
|
Object.defineProperty(exports, "runCollection", { enumerable: true, get: function () { return runCollection_js_1.runCollection; } });
|
|
20
20
|
var requestRunner_js_1 = require("./runner/requestRunner.js");
|
|
@@ -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
|
+
// Tolerant JSON extraction from LLM reply text (AI node; desktop re-exports
|
|
93
|
+
// this so all hosts repair identically).
|
|
94
|
+
var jsonRepair_js_1 = require("./ai/jsonRepair.js");
|
|
95
|
+
Object.defineProperty(exports, "extractJsonPayload", { enumerable: true, get: function () { return jsonRepair_js_1.extractJsonPayload; } });
|
|
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);
|
package/dist-cjs/index.js.map
CHANGED
|
@@ -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,4EAA4E;AAC5E,yCAAyC;AACzC,oDAAwD;AAA/C,mHAAA,kBAAkB,OAAA;AAC3B,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
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 schemaValidator_js_1 = require("../../contract/schemaValidator.js");
|
|
16
|
+
const graphTraversal_js_1 = require("../graphTraversal.js");
|
|
17
|
+
const templateResolver_js_1 = require("../templateResolver.js");
|
|
18
|
+
const abort_js_1 = require("./helpers/abort.js");
|
|
19
|
+
const aiExample_js_1 = require("./helpers/aiExample.js");
|
|
20
|
+
const failure = (message, details, durationMs = 0) => ({
|
|
21
|
+
outputData: null,
|
|
22
|
+
details,
|
|
23
|
+
durationMs,
|
|
24
|
+
failureMessage: message,
|
|
25
|
+
});
|
|
26
|
+
const buildAiExecutor = (options) => async (input) => {
|
|
27
|
+
const config = input.node.data.config;
|
|
28
|
+
const details = {
|
|
29
|
+
connectionId: config.connectionId?.trim() || null,
|
|
30
|
+
provider: null,
|
|
31
|
+
model: null,
|
|
32
|
+
tokensUsed: null,
|
|
33
|
+
resolvedPrompt: null,
|
|
34
|
+
rawText: null,
|
|
35
|
+
};
|
|
36
|
+
if (!options.chatTransport) {
|
|
37
|
+
return failure("This host cannot run AI nodes (transport missing).", details);
|
|
38
|
+
}
|
|
39
|
+
if (!details.connectionId) {
|
|
40
|
+
return failure("AI node needs a managed AI connection.", details);
|
|
41
|
+
}
|
|
42
|
+
// --- Fail-fast validation (no provider call, no tokens burned) --------
|
|
43
|
+
const example = (0, aiExample_js_1.parseJsonExample)(config.responseExample ?? "");
|
|
44
|
+
if (example.error || !example.value) {
|
|
45
|
+
return failure(example.error ?? "Response example is invalid.", details);
|
|
46
|
+
}
|
|
47
|
+
if ((config.responseExample ?? "").length > graphTraversal_js_1.MAX_AI_RESPONSE_EXAMPLE_LENGTH) {
|
|
48
|
+
return failure(`Response example is capped at ${graphTraversal_js_1.MAX_AI_RESPONSE_EXAMPLE_LENGTH} characters.`, details);
|
|
49
|
+
}
|
|
50
|
+
const templateValues = (0, templateResolver_js_1.buildScenarioTemplateValues)({
|
|
51
|
+
environment: input.context.environment,
|
|
52
|
+
globals: input.context.globals,
|
|
53
|
+
workflowContext: input.context.workflowContext,
|
|
54
|
+
nodeMetaByLabel: input.context.nodeMetaByLabel,
|
|
55
|
+
responseRoot: input.context.responseRoot,
|
|
56
|
+
dbResult: input.context.dbResult,
|
|
57
|
+
kafkaEvent: input.context.kafkaEvent,
|
|
58
|
+
redisResult: input.context.redisResult,
|
|
59
|
+
});
|
|
60
|
+
const resolvedPrompt = (0, templateResolver_js_1.resolveScenarioTemplateString)(config.prompt ?? "", templateValues).trim();
|
|
61
|
+
details.resolvedPrompt = resolvedPrompt || null;
|
|
62
|
+
if (!resolvedPrompt) {
|
|
63
|
+
return failure("AI prompt is empty.", details);
|
|
64
|
+
}
|
|
65
|
+
if (resolvedPrompt.length > graphTraversal_js_1.MAX_AI_PROMPT_LENGTH) {
|
|
66
|
+
return failure(`AI prompt is capped at ${graphTraversal_js_1.MAX_AI_PROMPT_LENGTH} characters after template resolution.`, details);
|
|
67
|
+
}
|
|
68
|
+
const messages = (0, aiExample_js_1.buildAiMessages)({
|
|
69
|
+
resolvedPrompt,
|
|
70
|
+
exampleText: config.responseExample,
|
|
71
|
+
});
|
|
72
|
+
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)));
|
|
73
|
+
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))));
|
|
74
|
+
// --- Provider call ----------------------------------------------------
|
|
75
|
+
const startedAtMs = Date.now();
|
|
76
|
+
let transportResult;
|
|
77
|
+
try {
|
|
78
|
+
transportResult = await (0, abort_js_1.withAbortAndTimeout)(options.chatTransport({
|
|
79
|
+
connectionId: details.connectionId,
|
|
80
|
+
messages,
|
|
81
|
+
maxTokens,
|
|
82
|
+
signal: input.signal,
|
|
83
|
+
}), timeoutMs, `AI node ${input.stepId}`, input.signal);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return failure(error instanceof Error ? error.message : "AI provider call failed.", details, Date.now() - startedAtMs);
|
|
87
|
+
}
|
|
88
|
+
const durationMs = Date.now() - startedAtMs;
|
|
89
|
+
details.provider = transportResult.provider ?? null;
|
|
90
|
+
details.model = transportResult.model ?? null;
|
|
91
|
+
details.tokensUsed =
|
|
92
|
+
typeof transportResult.tokensUsed === "number" ? transportResult.tokensUsed : null;
|
|
93
|
+
details.rawText = transportResult.text ?? null;
|
|
94
|
+
const rawText = (transportResult.text ?? "").trim();
|
|
95
|
+
if (!rawText) {
|
|
96
|
+
return failure("AI provider returned an empty reply.", details, durationMs);
|
|
97
|
+
}
|
|
98
|
+
// --- Tolerant parse + schema validation -------------------------------
|
|
99
|
+
let parsed;
|
|
100
|
+
try {
|
|
101
|
+
parsed = JSON.parse((0, jsonRepair_js_1.extractJsonPayload)(rawText));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return failure("AI reply is not valid JSON (even after repair). See the raw reply in the step result.", details, durationMs);
|
|
105
|
+
}
|
|
106
|
+
const schema = (0, aiExample_js_1.deriveSchemaFromExample)(example.value);
|
|
107
|
+
const schemaFailures = (0, schemaValidator_js_1.validateResponseSchema)(schema, parsed).filter((entry) => entry.status === "FAIL");
|
|
108
|
+
if (schemaFailures.length > 0) {
|
|
109
|
+
const summary = schemaFailures
|
|
110
|
+
.slice(0, 3)
|
|
111
|
+
.map((entry) => entry.message)
|
|
112
|
+
.join("; ");
|
|
113
|
+
return failure(`AI reply did not match the expected format: ${summary}`, details, durationMs);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
outputData: parsed,
|
|
117
|
+
details,
|
|
118
|
+
durationMs,
|
|
119
|
+
failureMessage: null,
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
exports.buildAiExecutor = buildAiExecutor;
|
|
123
|
+
//# 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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"}
|