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.
Files changed (111) hide show
  1. package/dist/ai/jsonRepair.d.ts +2 -0
  2. package/dist/ai/jsonRepair.d.ts.map +1 -0
  3. package/dist/ai/jsonRepair.js +61 -0
  4. package/dist/ai/jsonRepair.js.map +1 -0
  5. package/dist/host/db/connectionMapping.d.ts +4 -0
  6. package/dist/host/db/connectionMapping.d.ts.map +1 -1
  7. package/dist/host/db/connectionMapping.js +4 -0
  8. package/dist/host/db/connectionMapping.js.map +1 -1
  9. package/dist/host/db/pgClientConfig.d.ts +11 -0
  10. package/dist/host/db/pgClientConfig.d.ts.map +1 -0
  11. package/dist/host/db/pgClientConfig.js +83 -0
  12. package/dist/host/db/pgClientConfig.js.map +1 -0
  13. package/dist/host/db/pgSessionManager.d.ts +18 -0
  14. package/dist/host/db/pgSessionManager.d.ts.map +1 -0
  15. package/dist/host/db/pgSessionManager.js +162 -0
  16. package/dist/host/db/pgSessionManager.js.map +1 -0
  17. package/dist/host/db/postgresAdapter.d.ts.map +1 -1
  18. package/dist/host/db/postgresAdapter.js +7 -36
  19. package/dist/host/db/postgresAdapter.js.map +1 -1
  20. package/dist/host/db/queryExecutor.d.ts +4 -0
  21. package/dist/host/db/queryExecutor.d.ts.map +1 -1
  22. package/dist/host/db/queryExecutor.js +40 -2
  23. package/dist/host/db/queryExecutor.js.map +1 -1
  24. package/dist/host/db/sqlState.d.ts +2 -0
  25. package/dist/host/db/sqlState.d.ts.map +1 -0
  26. package/dist/host/db/sqlState.js +14 -0
  27. package/dist/host/db/sqlState.js.map +1 -0
  28. package/dist/host/db/types.d.ts +13 -0
  29. package/dist/host/db/types.d.ts.map +1 -1
  30. package/dist/host/index.d.ts +3 -0
  31. package/dist/host/index.d.ts.map +1 -1
  32. package/dist/host/index.js +7 -0
  33. package/dist/host/index.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/scenario-runner/adapters/ai-executor.d.ts +9 -0
  39. package/dist/scenario-runner/adapters/ai-executor.d.ts.map +1 -0
  40. package/dist/scenario-runner/adapters/ai-executor.js +119 -0
  41. package/dist/scenario-runner/adapters/ai-executor.js.map +1 -0
  42. package/dist/scenario-runner/adapters/connection-config.d.ts +4 -0
  43. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
  44. package/dist/scenario-runner/adapters/db-executor.d.ts +7 -1
  45. package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -1
  46. package/dist/scenario-runner/adapters/db-executor.js +106 -1
  47. package/dist/scenario-runner/adapters/db-executor.js.map +1 -1
  48. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts +12 -0
  49. package/dist/scenario-runner/adapters/helpers/aiExample.d.ts.map +1 -0
  50. package/dist/scenario-runner/adapters/helpers/aiExample.js +79 -0
  51. package/dist/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  52. package/dist/scenario-runner/adapters/index.d.ts +4 -2
  53. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  54. package/dist/scenario-runner/adapters/index.js +15 -1
  55. package/dist/scenario-runner/adapters/index.js.map +1 -1
  56. package/dist/scenario-runner/adapters/types.d.ts +22 -0
  57. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  58. package/dist/scenario-runner/condition.d.ts +1 -0
  59. package/dist/scenario-runner/condition.d.ts.map +1 -1
  60. package/dist/scenario-runner/condition.js +164 -4
  61. package/dist/scenario-runner/condition.js.map +1 -1
  62. package/dist/scenario-runner/conditionTypes.d.ts +1 -1
  63. package/dist/scenario-runner/conditionTypes.d.ts.map +1 -1
  64. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  65. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  66. package/dist/scenario-runner/graphTraversal.js +7 -0
  67. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  68. package/dist/scenario-runner/nodePolicy.d.ts +2 -2
  69. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  70. package/dist/scenario-runner/nodePolicy.js +2 -0
  71. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  72. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  73. package/dist/scenario-runner/runScenario.js +70 -1
  74. package/dist/scenario-runner/runScenario.js.map +1 -1
  75. package/dist/scenario-runner/types.d.ts +75 -3
  76. package/dist/scenario-runner/types.d.ts.map +1 -1
  77. package/dist-cjs/ai/jsonRepair.js +65 -0
  78. package/dist-cjs/ai/jsonRepair.js.map +1 -0
  79. package/dist-cjs/host/db/connectionMapping.js +4 -0
  80. package/dist-cjs/host/db/connectionMapping.js.map +1 -1
  81. package/dist-cjs/host/db/pgClientConfig.js +90 -0
  82. package/dist-cjs/host/db/pgClientConfig.js.map +1 -0
  83. package/dist-cjs/host/db/pgSessionManager.js +170 -0
  84. package/dist-cjs/host/db/pgSessionManager.js.map +1 -0
  85. package/dist-cjs/host/db/postgresAdapter.js +7 -36
  86. package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
  87. package/dist-cjs/host/db/queryExecutor.js +40 -2
  88. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  89. package/dist-cjs/host/db/sqlState.js +18 -0
  90. package/dist-cjs/host/db/sqlState.js.map +1 -0
  91. package/dist-cjs/host/index.js +16 -1
  92. package/dist-cjs/host/index.js.map +1 -1
  93. package/dist-cjs/index.js +5 -1
  94. package/dist-cjs/index.js.map +1 -1
  95. package/dist-cjs/scenario-runner/adapters/ai-executor.js +123 -0
  96. package/dist-cjs/scenario-runner/adapters/ai-executor.js.map +1 -0
  97. package/dist-cjs/scenario-runner/adapters/db-executor.js +108 -2
  98. package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -1
  99. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js +85 -0
  100. package/dist-cjs/scenario-runner/adapters/helpers/aiExample.js.map +1 -0
  101. package/dist-cjs/scenario-runner/adapters/index.js +21 -1
  102. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  103. package/dist-cjs/scenario-runner/condition.js +166 -5
  104. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  105. package/dist-cjs/scenario-runner/graphTraversal.js +8 -1
  106. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  107. package/dist-cjs/scenario-runner/nodePolicy.js +2 -0
  108. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  109. package/dist-cjs/scenario-runner/runScenario.js +70 -1
  110. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  111. 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;AAU3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBASD,CAAC;AAGH,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,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAW3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBAqBD,CAAC;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  // driver callbacks via `options.drivers` for the I/O-heavy executors
7
7
  // (HTTP, DB, Redis, Kafka). Script + notification executors default to
8
8
  // canonical core implementations but can be overridden.
9
+ import { buildAiExecutor } from "./ai-executor.js";
9
10
  import { buildDbExecutor } from "./db-executor.js";
10
11
  import { buildKafkaExecutor } from "./kafka-executor.js";
11
12
  import { buildNotificationExecutor } from "./notification-executor.js";
@@ -21,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;CACrE,CAAC,CAAC;AAEH,iEAAiE;AACjE,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;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,OAAO,EACL,8BAA8B,GAE/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;AAIxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACpE,UAAU,EAAE,eAAe,CAAC;QAC1B,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe;QAC9C,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;IACF,sEAAsE;IACtE,qEAAqE;IACrE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QACxC,CAAC,CAAC;YACE,gBAAgB,EAAE,CAAC,KAAwD,EAAE,EAAE,CAC7E,OAAO,CAAC,OAAO,CAAC,sBAAuB,CAAC,KAAK,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,OAAO,EACL,8BAA8B,GAE/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC"}
@@ -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":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/types.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
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
- const buildNodeSuggestions = (label, type) => {
440
+ // Maps an AI response-example value onto the suggestion value type.
441
+ const aiExampleValueType = (value) => {
442
+ if (typeof value === "number")
443
+ return "number";
444
+ if (typeof value === "boolean")
445
+ return "boolean";
446
+ if (Array.isArray(value))
447
+ return "array";
448
+ return "string";
449
+ };
450
+ const buildNodeSuggestions = (label, type, node) => {
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 (operator === "between" || isCollectionOperator(operator)) {
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 !== "between" && operator !== "in" && operator !== "not_in") ||
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, }) => {