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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ScenarioRuntimeAdapters } from "../types.js";
|
|
2
2
|
import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
|
|
3
3
|
export declare const buildScenarioRuntimeAdapters: (options: ScenarioRuntimeAdapterFactoryOptions) => ScenarioRuntimeAdapters;
|
|
4
|
-
export { buildDbExecutor } from "./db-executor.js";
|
|
4
|
+
export { buildDbExecutor, extractSqlState, matchDbExpectedError, } from "./db-executor.js";
|
|
5
|
+
export { buildAiExecutor, type AiExecutorOptions } from "./ai-executor.js";
|
|
6
|
+
export { buildAiMessages, deriveSchemaFromExample, parseJsonExample, type ParsedAiExample, } from "./helpers/aiExample.js";
|
|
5
7
|
export { buildKafkaExecutor } from "./kafka-executor.js";
|
|
6
8
|
export { buildNotificationExecutor } from "./notification-executor.js";
|
|
7
9
|
export { buildRedisExecutor } from "./redis-executor.js";
|
|
@@ -10,6 +12,6 @@ export { buildScriptExecutor } from "./script-executor.js";
|
|
|
10
12
|
export { buildWebsocketExecutor } from "./websocket-executor.js";
|
|
11
13
|
export { evaluateScenarioExpectedStatus, type ExpectedStatusEvaluation, } from "./helpers/expected-status.js";
|
|
12
14
|
export { buildRequestFailureMessage, summarizeContractResults, type FailureMessageInput, } from "./helpers/failure-messages.js";
|
|
13
|
-
export type { DatabaseExecuteInput, DatabaseExecuteResult, HttpExecuteInput, HttpExecuteResult, KafkaCaptureInput, KafkaCaptureOutcome, RedisCommandOutcome, RedisExecuteInput, RedisExecuteResult, ScenarioConnectionProvider, ScenarioConnectionRuntime, ScenarioConnectionType, ScenarioRuntimeAdapterDrivers, ScenarioRuntimeAdapterFactoryOptions, } from "./types.js";
|
|
15
|
+
export type { AiChatTransport, AiChatTransportInput, AiChatTransportResult, DatabaseExecuteInput, DatabaseExecuteResult, HttpExecuteInput, HttpExecuteResult, KafkaCaptureInput, KafkaCaptureOutcome, RedisCommandOutcome, RedisExecuteInput, RedisExecuteResult, ScenarioConnectionProvider, ScenarioConnectionRuntime, ScenarioConnectionType, ScenarioRuntimeAdapterDrivers, ScenarioRuntimeAdapterFactoryOptions, } from "./types.js";
|
|
14
16
|
export type { ConnectionRuntimeConfig, DatabaseConnectionConfig, DatabaseConnectionMode, KafkaConnectionConfig, NotificationConnectionConfig, RedisConnectionConfig, } from "./connection-config.js";
|
|
15
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAW3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBAqBD,CAAC;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// driver callbacks via `options.drivers` for the I/O-heavy executors
|
|
7
7
|
// (HTTP, DB, Redis, Kafka). Script + notification executors default to
|
|
8
8
|
// canonical core implementations but can be overridden.
|
|
9
|
+
import { buildAiExecutor } from "./ai-executor.js";
|
|
9
10
|
import { buildDbExecutor } from "./db-executor.js";
|
|
10
11
|
import { buildKafkaExecutor } from "./kafka-executor.js";
|
|
11
12
|
import { buildNotificationExecutor } from "./notification-executor.js";
|
|
@@ -21,9 +22,22 @@ export const buildScenarioRuntimeAdapters = (options) => ({
|
|
|
21
22
|
websocketExecutor: buildWebsocketExecutor(options),
|
|
22
23
|
scriptExecutor: options.scriptExecutor ?? buildScriptExecutor(options),
|
|
23
24
|
notificationExecutor: options.notificationExecutor ?? buildNotificationExecutor(options),
|
|
25
|
+
aiExecutor: buildAiExecutor({
|
|
26
|
+
chatTransport: options.drivers.aiChatTransport,
|
|
27
|
+
nodeTimeoutMs: options.nodeTimeoutMs,
|
|
28
|
+
}),
|
|
29
|
+
// Present only when the host driver supports run-scoped DB sessions —
|
|
30
|
+
// its absence is how the runner detects "sessions unsupported here".
|
|
31
|
+
...(options.drivers.databaseSessionRelease
|
|
32
|
+
? {
|
|
33
|
+
dbSessionRelease: (input) => options.drivers.databaseSessionRelease(input),
|
|
34
|
+
}
|
|
35
|
+
: {}),
|
|
24
36
|
});
|
|
25
37
|
// Re-exports so callers don't have to import from sibling files.
|
|
26
|
-
export { buildDbExecutor } from "./db-executor.js";
|
|
38
|
+
export { buildDbExecutor, extractSqlState, matchDbExpectedError, } from "./db-executor.js";
|
|
39
|
+
export { buildAiExecutor } from "./ai-executor.js";
|
|
40
|
+
export { buildAiMessages, deriveSchemaFromExample, parseJsonExample, } from "./helpers/aiExample.js";
|
|
27
41
|
export { buildKafkaExecutor } from "./kafka-executor.js";
|
|
28
42
|
export { buildNotificationExecutor } from "./notification-executor.js";
|
|
29
43
|
export { buildRedisExecutor } from "./redis-executor.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACpE,UAAU,EAAE,eAAe,CAAC;QAC1B,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe;QAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;IACF,sEAAsE;IACtE,qEAAqE;IACrE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QACxC,CAAC,CAAC;YACE,gBAAgB,EAAE,CAAC,KAAwD,EAAE,EAAE,CAC7E,OAAO,CAAC,OAAO,CAAC,sBAAuB,CAAC,KAAK,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,OAAO,EACL,8BAA8B,GAE/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC"}
|
|
@@ -32,6 +32,10 @@ export interface DatabaseExecuteInput {
|
|
|
32
32
|
connection: ScenarioConnectionRuntime;
|
|
33
33
|
resolvedQuery: string;
|
|
34
34
|
resolvedParams?: unknown[];
|
|
35
|
+
session?: {
|
|
36
|
+
runId: string;
|
|
37
|
+
transactionMode: "none" | "rollback" | "commit";
|
|
38
|
+
};
|
|
35
39
|
}
|
|
36
40
|
export interface DatabaseExecuteResult {
|
|
37
41
|
rows: unknown[];
|
|
@@ -72,6 +76,19 @@ export interface KafkaPublishInput {
|
|
|
72
76
|
headers: Record<string, string>;
|
|
73
77
|
timeoutMs: number;
|
|
74
78
|
}
|
|
79
|
+
export interface AiChatTransportInput {
|
|
80
|
+
connectionId: string;
|
|
81
|
+
messages: import("../types.js").ScenarioAiChatMessage[];
|
|
82
|
+
maxTokens?: number;
|
|
83
|
+
signal?: import("../types.js").AbortLikeSignal;
|
|
84
|
+
}
|
|
85
|
+
export interface AiChatTransportResult {
|
|
86
|
+
text: string;
|
|
87
|
+
provider?: string | null;
|
|
88
|
+
model?: string | null;
|
|
89
|
+
tokensUsed?: number | null;
|
|
90
|
+
}
|
|
91
|
+
export type AiChatTransport = (input: AiChatTransportInput) => Promise<AiChatTransportResult>;
|
|
75
92
|
export interface ScenarioRuntimeAdapterDrivers {
|
|
76
93
|
httpExecutor: (input: HttpExecuteInput) => Promise<HttpExecuteResult>;
|
|
77
94
|
databaseExecutor: (input: DatabaseExecuteInput) => Promise<DatabaseExecuteResult>;
|
|
@@ -79,6 +96,11 @@ export interface ScenarioRuntimeAdapterDrivers {
|
|
|
79
96
|
kafkaExecutor: (input: KafkaCaptureInput) => Promise<KafkaCaptureOutcome>;
|
|
80
97
|
kafkaPublishExecutor?: (input: KafkaPublishInput) => Promise<ScenarioKafkaPublishResult>;
|
|
81
98
|
websocketExecutor?: (input: import("../types.js").ScenarioWebsocketExecutionInput) => Promise<import("../types.js").ScenarioWebsocketExecutionResult>;
|
|
99
|
+
aiChatTransport?: AiChatTransport;
|
|
100
|
+
databaseSessionRelease?: (input: {
|
|
101
|
+
runId: string;
|
|
102
|
+
outcome: "commit" | "rollback";
|
|
103
|
+
}) => Promise<void>;
|
|
82
104
|
}
|
|
83
105
|
export interface ScenarioRuntimeAdapterFactoryOptions {
|
|
84
106
|
workspaceId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/types.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAE3B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,CAAC;AAErF,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,QAAQ,EAAE,0BAA0B,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EACF,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,GACrB,4BAA4B,CAAC;CAClC;AAOD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC/C;AAKD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,yBAAyB,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export declare const CONDITION_OPERATOR_META: Array<{
|
|
|
10
10
|
label: string;
|
|
11
11
|
value: ConditionOperator;
|
|
12
12
|
}>;
|
|
13
|
+
export declare const isArrayRightConditionOperator: (operator: ConditionOperator) => boolean;
|
|
13
14
|
export declare const resolveConditionRuntimeValue: (runtimeScope: ConditionRuntimeScope, path: string) => {
|
|
14
15
|
value: unknown;
|
|
15
16
|
exists: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EAEjB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { applyExtract } from "./extraction.js";
|
|
2
|
+
import { parseJsonExample } from "./adapters/helpers/aiExample.js";
|
|
2
3
|
const createId = (prefix) => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
|
|
3
4
|
? crypto.randomUUID()
|
|
4
5
|
: `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
@@ -249,6 +250,8 @@ export const CONDITION_OPERATOR_META = [
|
|
|
249
250
|
{ category: "Existence", isUnary: true, label: "Not Null", value: "not_null" },
|
|
250
251
|
{ category: "Collection", label: "In", value: "in" },
|
|
251
252
|
{ category: "Collection", label: "Not In", value: "not_in" },
|
|
253
|
+
{ category: "Collection", label: "Contains Row", value: "contains_row" },
|
|
254
|
+
{ category: "Collection", label: "Set Equals (unordered)", value: "set_equals_unordered" },
|
|
252
255
|
];
|
|
253
256
|
const OPERATOR_ALIAS_MAP = [
|
|
254
257
|
{ alias: "!==", operator: "strict_not_equals" },
|
|
@@ -261,7 +264,11 @@ const OPERATOR_ALIAS_MAP = [
|
|
|
261
264
|
{ alias: "<", operator: "less_than" },
|
|
262
265
|
{ alias: "not_contains", operator: "not_contains" },
|
|
263
266
|
{ alias: "not contains", operator: "not_contains" },
|
|
267
|
+
{ alias: "contains_row", operator: "contains_row" },
|
|
268
|
+
{ alias: "contains row", operator: "contains_row" },
|
|
264
269
|
{ alias: "contains", operator: "contains" },
|
|
270
|
+
{ alias: "set_equals_unordered", operator: "set_equals_unordered" },
|
|
271
|
+
{ alias: "set equals", operator: "set_equals_unordered" },
|
|
265
272
|
{ alias: "starts_with", operator: "starts_with" },
|
|
266
273
|
{ alias: "starts with", operator: "starts_with" },
|
|
267
274
|
{ alias: "ends_with", operator: "ends_with" },
|
|
@@ -340,6 +347,12 @@ const isNumericOperator = (operator) => operator === "greater_than" ||
|
|
|
340
347
|
operator === "less_or_equal" ||
|
|
341
348
|
operator === "between";
|
|
342
349
|
const isCollectionOperator = (operator) => operator === "in" || operator === "not_in";
|
|
350
|
+
// Operators whose right operand is an array literal (drives the default
|
|
351
|
+
// operand type and the builder UIs' type lock).
|
|
352
|
+
export const isArrayRightConditionOperator = (operator) => operator === "between" ||
|
|
353
|
+
operator === "in" ||
|
|
354
|
+
operator === "not_in" ||
|
|
355
|
+
operator === "set_equals_unordered";
|
|
343
356
|
const getOperatorToken = (operator) => {
|
|
344
357
|
switch (operator) {
|
|
345
358
|
case "equals":
|
|
@@ -386,6 +399,10 @@ const getOperatorToken = (operator) => {
|
|
|
386
399
|
return "in";
|
|
387
400
|
case "not_in":
|
|
388
401
|
return "not in";
|
|
402
|
+
case "contains_row":
|
|
403
|
+
return "contains_row";
|
|
404
|
+
case "set_equals_unordered":
|
|
405
|
+
return "set_equals_unordered";
|
|
389
406
|
default:
|
|
390
407
|
return "==";
|
|
391
408
|
}
|
|
@@ -420,7 +437,17 @@ const createSuggestion = (group, path, description, valueType, exampleValue) =>
|
|
|
420
437
|
path,
|
|
421
438
|
valueType,
|
|
422
439
|
});
|
|
423
|
-
|
|
440
|
+
// Maps an AI response-example value onto the suggestion value type.
|
|
441
|
+
const aiExampleValueType = (value) => {
|
|
442
|
+
if (typeof value === "number")
|
|
443
|
+
return "number";
|
|
444
|
+
if (typeof value === "boolean")
|
|
445
|
+
return "boolean";
|
|
446
|
+
if (Array.isArray(value))
|
|
447
|
+
return "array";
|
|
448
|
+
return "string";
|
|
449
|
+
};
|
|
450
|
+
const buildNodeSuggestions = (label, type, node) => {
|
|
424
451
|
const group = label;
|
|
425
452
|
const metaSuggestions = [
|
|
426
453
|
createSuggestion(group, `${label}.__meta.status`, "Execution status.", "string", "success"),
|
|
@@ -546,6 +573,30 @@ const buildNodeSuggestions = (label, type) => {
|
|
|
546
573
|
createSuggestion(group, `${label}.failedSteps`, "How many steps failed.", "number"),
|
|
547
574
|
...metaSuggestions,
|
|
548
575
|
];
|
|
576
|
+
case "ai": {
|
|
577
|
+
// The AI node's outputData IS the parsed JSON reply, so the example's
|
|
578
|
+
// own keys are the reference surface. Parse tolerantly and fall back to
|
|
579
|
+
// a generic hint when the example is missing/invalid.
|
|
580
|
+
const exampleText = node?.type === "ai" ? node.data.config.responseExample : "";
|
|
581
|
+
const parsedExample = parseJsonExample(exampleText ?? "");
|
|
582
|
+
const exampleSuggestions = parsedExample.value
|
|
583
|
+
? Object.entries(parsedExample.value).flatMap(([key, value]) => {
|
|
584
|
+
const base = createSuggestion(group, `${label}.${key}`, `AI reply field "${key}" (from the response example).`, aiExampleValueType(value), typeof value === "string" || typeof value === "number" || typeof value === "boolean"
|
|
585
|
+
? String(value)
|
|
586
|
+
: undefined);
|
|
587
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
588
|
+
return [
|
|
589
|
+
base,
|
|
590
|
+
...Object.entries(value).map(([nestedKey, nested]) => createSuggestion(group, `${label}.${key}.${nestedKey}`, `AI reply field "${key}.${nestedKey}" (from the response example).`, aiExampleValueType(nested))),
|
|
591
|
+
];
|
|
592
|
+
}
|
|
593
|
+
return [base];
|
|
594
|
+
})
|
|
595
|
+
: [
|
|
596
|
+
createSuggestion(group, `${label}`, "Parsed JSON reply from the AI node.", "string"),
|
|
597
|
+
];
|
|
598
|
+
return [...exampleSuggestions, ...metaSuggestions];
|
|
599
|
+
}
|
|
549
600
|
case "end":
|
|
550
601
|
return metaSuggestions;
|
|
551
602
|
default:
|
|
@@ -580,9 +631,13 @@ const getDefaultRightOperand = (operator) => {
|
|
|
580
631
|
if (isUnaryOperator(operator)) {
|
|
581
632
|
return undefined;
|
|
582
633
|
}
|
|
583
|
-
if (
|
|
634
|
+
if (isArrayRightConditionOperator(operator)) {
|
|
584
635
|
return createConditionOperand("literal", "array", operator === "between" ? [0, 1] : []);
|
|
585
636
|
}
|
|
637
|
+
if (operator === "contains_row") {
|
|
638
|
+
// JSON object literal — "{ column: expected }" row matcher.
|
|
639
|
+
return createConditionOperand("literal", "string", "{}");
|
|
640
|
+
}
|
|
586
641
|
return createConditionOperand("literal", "string", "");
|
|
587
642
|
};
|
|
588
643
|
const parseLegacyConditionOperator = (value) => LEGACY_OPERATOR_MAP[value] ?? "equals";
|
|
@@ -1342,6 +1397,105 @@ const buildConditionRegex = (value) => {
|
|
|
1342
1397
|
}
|
|
1343
1398
|
return new RegExp(trimmed);
|
|
1344
1399
|
};
|
|
1400
|
+
// --- Result-set assertion helpers (DB rows) -----------------------------
|
|
1401
|
+
// Accept an object literal typed as string ('{"tier":"GOLD"}') or an actual
|
|
1402
|
+
// record from a runtime path.
|
|
1403
|
+
const coerceRecordOperand = (value) => {
|
|
1404
|
+
if (isRecord(value))
|
|
1405
|
+
return value;
|
|
1406
|
+
if (typeof value === "string") {
|
|
1407
|
+
try {
|
|
1408
|
+
const parsed = JSON.parse(value);
|
|
1409
|
+
return isRecord(parsed) ? parsed : null;
|
|
1410
|
+
}
|
|
1411
|
+
catch {
|
|
1412
|
+
return null;
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
return null;
|
|
1416
|
+
};
|
|
1417
|
+
const coerceArrayOperand = (value) => {
|
|
1418
|
+
if (Array.isArray(value))
|
|
1419
|
+
return value;
|
|
1420
|
+
if (typeof value === "string") {
|
|
1421
|
+
try {
|
|
1422
|
+
const parsed = JSON.parse(value);
|
|
1423
|
+
return Array.isArray(parsed) ? parsed : null;
|
|
1424
|
+
}
|
|
1425
|
+
catch {
|
|
1426
|
+
return null;
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
return null;
|
|
1430
|
+
};
|
|
1431
|
+
// "Some row matches every expected key" — pgTAP-ish `results_ne`-lite for
|
|
1432
|
+
// side-effect table checks: {{Ledger.rows}} contains_row {"tier":"GOLD",
|
|
1433
|
+
// "cashback": 2.5}. Values compare loosely so pg numeric strings match
|
|
1434
|
+
// number literals.
|
|
1435
|
+
const evaluateContainsRow = (leftValue, rightValue) => {
|
|
1436
|
+
const rows = coerceArrayOperand(leftValue);
|
|
1437
|
+
const expected = coerceRecordOperand(rightValue);
|
|
1438
|
+
if (!rows || !expected)
|
|
1439
|
+
return false;
|
|
1440
|
+
const keys = Object.keys(expected);
|
|
1441
|
+
if (keys.length === 0)
|
|
1442
|
+
return rows.length > 0;
|
|
1443
|
+
return rows.some((row) => isRecord(row) &&
|
|
1444
|
+
keys.every((key) => compareLooseEquality(row[key], expected[key])));
|
|
1445
|
+
};
|
|
1446
|
+
// Multiset equality, order-insensitive (pgTAP `bag_eq` equivalent). Values
|
|
1447
|
+
// are canonicalized first: numeric strings become numbers ("2.50" → 2.5) and
|
|
1448
|
+
// object keys sort, so row order and numeric formatting don't matter.
|
|
1449
|
+
const canonicalizeForSetEquality = (value) => {
|
|
1450
|
+
if (typeof value === "string") {
|
|
1451
|
+
const trimmed = value.trim();
|
|
1452
|
+
if (trimmed !== "" && !Number.isNaN(Number(trimmed))) {
|
|
1453
|
+
const asNumber = Number(trimmed);
|
|
1454
|
+
if (Number.isFinite(asNumber))
|
|
1455
|
+
return asNumber;
|
|
1456
|
+
}
|
|
1457
|
+
return value;
|
|
1458
|
+
}
|
|
1459
|
+
if (Array.isArray(value))
|
|
1460
|
+
return value.map(canonicalizeForSetEquality);
|
|
1461
|
+
if (isRecord(value)) {
|
|
1462
|
+
const record = value;
|
|
1463
|
+
return Object.fromEntries(Object.keys(record)
|
|
1464
|
+
.sort()
|
|
1465
|
+
.map((key) => [key, canonicalizeForSetEquality(record[key])]));
|
|
1466
|
+
}
|
|
1467
|
+
return value;
|
|
1468
|
+
};
|
|
1469
|
+
const evaluateSetEqualsUnordered = (leftValue, rightValue) => {
|
|
1470
|
+
const leftArray = coerceArrayOperand(leftValue);
|
|
1471
|
+
const rightArray = coerceArrayOperand(rightValue);
|
|
1472
|
+
if (!leftArray || !rightArray || leftArray.length !== rightArray.length)
|
|
1473
|
+
return false;
|
|
1474
|
+
const serialize = (entry) => {
|
|
1475
|
+
try {
|
|
1476
|
+
return JSON.stringify(canonicalizeForSetEquality(entry)) ?? "null";
|
|
1477
|
+
}
|
|
1478
|
+
catch {
|
|
1479
|
+
return String(entry);
|
|
1480
|
+
}
|
|
1481
|
+
};
|
|
1482
|
+
const counts = new Map();
|
|
1483
|
+
for (const entry of leftArray) {
|
|
1484
|
+
const key = serialize(entry);
|
|
1485
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
1486
|
+
}
|
|
1487
|
+
for (const entry of rightArray) {
|
|
1488
|
+
const key = serialize(entry);
|
|
1489
|
+
const current = counts.get(key);
|
|
1490
|
+
if (!current)
|
|
1491
|
+
return false;
|
|
1492
|
+
if (current === 1)
|
|
1493
|
+
counts.delete(key);
|
|
1494
|
+
else
|
|
1495
|
+
counts.set(key, current - 1);
|
|
1496
|
+
}
|
|
1497
|
+
return counts.size === 0;
|
|
1498
|
+
};
|
|
1345
1499
|
const compareLooseEquality = (left, right) => {
|
|
1346
1500
|
if (Array.isArray(left) || Array.isArray(right) || isRecord(left) || isRecord(right)) {
|
|
1347
1501
|
try {
|
|
@@ -1551,6 +1705,12 @@ export const evaluateConditionRule = (rule, runtimeScope) => {
|
|
|
1551
1705
|
? !right.value.some((entry) => compareLooseEquality(left.value, entry))
|
|
1552
1706
|
: false;
|
|
1553
1707
|
break;
|
|
1708
|
+
case "contains_row":
|
|
1709
|
+
result = evaluateContainsRow(left.value, right?.value);
|
|
1710
|
+
break;
|
|
1711
|
+
case "set_equals_unordered":
|
|
1712
|
+
result = evaluateSetEqualsUnordered(left.value, right?.value);
|
|
1713
|
+
break;
|
|
1554
1714
|
default:
|
|
1555
1715
|
result = false;
|
|
1556
1716
|
break;
|
|
@@ -1822,7 +1982,7 @@ export const updateConditionRuleOperator = (rootGroup, ruleId, operator) => upda
|
|
|
1822
1982
|
? { right: undefined }
|
|
1823
1983
|
: {
|
|
1824
1984
|
right: rule.right &&
|
|
1825
|
-
((operator
|
|
1985
|
+
(!isArrayRightConditionOperator(operator) ||
|
|
1826
1986
|
rule.right.valueType === "array")
|
|
1827
1987
|
? cloneConditionOperand(rule.right)
|
|
1828
1988
|
: getDefaultRightOperand(operator),
|
|
@@ -1873,7 +2033,7 @@ export const buildConditionRuntimeSuggestions = ({ nodes, environmentKeys = [],
|
|
|
1873
2033
|
...environmentKeys.map((key) => createSuggestion("Environment", `env.${key}`, `Environment variable "${key}".`, "string")),
|
|
1874
2034
|
...flattenScenarioNodes(nodes).flatMap((node) => {
|
|
1875
2035
|
const label = node.data.label.trim();
|
|
1876
|
-
return label ? buildNodeSuggestions(label, node.type) : [];
|
|
2036
|
+
return label ? buildNodeSuggestions(label, node.type, node) : [];
|
|
1877
2037
|
}),
|
|
1878
2038
|
]);
|
|
1879
2039
|
export const filterConditionRuntimeSuggestions = ({ query, suggestions, limit = 40, }) => {
|