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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlState.d.ts","sourceRoot":"","sources":["../../../src/host/db/sqlState.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAOzD,CAAC"}
@@ -0,0 +1,14 @@
1
+ // SQLSTATE extraction shared by the scenario db-executor, the host query
2
+ // executor, and desktop adapters. Postgres SQLSTATE is 5 alphanumeric chars;
3
+ // `pg` errors expose it as `.code`. `.sqlState` is checked first so hosts
4
+ // can attach it explicitly without colliding with Node's `error.code`
5
+ // values (e.g. ECONNREFUSED).
6
+ export const extractSqlState = (error) => {
7
+ if (!error || typeof error !== "object")
8
+ return undefined;
9
+ const candidate = error.sqlState ?? error.code;
10
+ return typeof candidate === "string" && /^[0-9A-Z]{5}$/.test(candidate)
11
+ ? candidate
12
+ : undefined;
13
+ };
14
+ //# 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;AAC9B,MAAM,CAAC,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"}
@@ -16,6 +16,10 @@ export interface DbConnection {
16
16
  password: string;
17
17
  ssl?: boolean;
18
18
  trustServerCertificate?: boolean;
19
+ sslMode?: "disable" | "require" | "verify-ca" | "verify-full";
20
+ caCert?: string;
21
+ clientCert?: string;
22
+ clientKey?: string;
19
23
  }
20
24
  export interface DbConnectionInput {
21
25
  id?: string;
@@ -32,6 +36,10 @@ export interface DbConnectionInput {
32
36
  password: string;
33
37
  ssl?: boolean;
34
38
  trustServerCertificate?: boolean;
39
+ sslMode?: "disable" | "require" | "verify-ca" | "verify-full";
40
+ caCert?: string;
41
+ clientCert?: string;
42
+ clientKey?: string;
35
43
  }
36
44
  export interface DbTemplateContext {
37
45
  response?: unknown | null;
@@ -45,6 +53,10 @@ export interface ExecuteDbQueryPayload {
45
53
  params?: unknown[];
46
54
  phase: DbQueryPhase;
47
55
  context?: DbTemplateContext;
56
+ session?: {
57
+ runId: string;
58
+ transactionMode: "none" | "rollback" | "commit";
59
+ };
48
60
  }
49
61
  export interface DbQueryExecutionResult {
50
62
  success: boolean;
@@ -59,6 +71,7 @@ export interface DbQueryExecutionResult {
59
71
  durationMs: number;
60
72
  executedAt: string;
61
73
  error?: string;
74
+ sqlState?: string;
62
75
  }
63
76
  export interface DbConnectionTestResult {
64
77
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/host/db/types.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,kBAAkB,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,gBAAgB,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,gBAAgB,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,gBAAgB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/host/db/types.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,14 @@
1
1
  export { buildDbExecuteCapability, runConfiguredDbQuery, runRedisCommandsForPhase, buildRedisValueCache, buildRedisCapability, type ConnectionRuntime, type ConnectionRuntimeMap, type DbConnectionRuntime, type RedisConnectionRuntime, type DbNodeConfig, type RequestDatabaseRuntimeConfig, type RequestRedisRuntimeConfig, type ScriptTemplateContext, } from "./connections.js";
2
2
  export { executeQuery, executeResolvedDbQuery, testDbConnection, } from "./db/queryExecutor.js";
3
+ export { executePostgresQueryInSession, releasePostgresSessionsForRun, closeAllPostgresSessions, __setPgSessionDriverForTests, __getPgSessionCountForTests, type PgSessionExecuteInput, type PgSessionTransactionMode, } from "./db/pgSessionManager.js";
3
4
  export { executeMongoQuery, testMongoConnection, __setMongoDriverForTests, } from "./db/mongoAdapter.js";
4
5
  export { executePostgresQuery, testPostgresConnection, __setPostgresDriverForTests, } from "./db/postgresAdapter.js";
5
6
  export { executeMysqlQuery, testMysqlConnection, __setMysqlDriverForTests, } from "./db/mysqlAdapter.js";
6
7
  export { executeOracleQuery, testOracleConnection, __setOracleDriverForTests, } from "./db/oracleAdapter.js";
7
8
  export { executeMssqlQuery, testMssqlConnection, __setMssqlDriverForTests, } from "./db/mssqlAdapter.js";
8
9
  export { stripTrailingSqlTerminator } from "./db/sqlNormalize.js";
10
+ export { buildPgSslConfig, buildPgClientConfig } from "./db/pgClientConfig.js";
11
+ export { extractSqlState } from "./db/sqlState.js";
9
12
  export { renderDbQueryReference } from "./db/db-query-reference.js";
10
13
  export { normalizeOracleConnectString, OracleConnectStringError, } from "./db/oracleConnectString.js";
11
14
  export { databaseConfigToDbConnection, type CoreDbProvider, type DatabaseConnectionConfigLike, } from "./db/connectionMapping.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,EAC5B,KAAK,cAAc,EACnB,KAAK,4BAA4B,GAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,2BAA2B,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,EAC5B,KAAK,cAAc,EACnB,KAAK,4BAA4B,GAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC"}
@@ -3,6 +3,11 @@
3
3
  // runner execute `pm.db.*` and `pm.redis` without an external host process.
4
4
  export { buildDbExecuteCapability, runConfiguredDbQuery, runRedisCommandsForPhase, buildRedisValueCache, buildRedisCapability, } from "./connections.js";
5
5
  export { executeQuery, executeResolvedDbQuery, testDbConnection, } from "./db/queryExecutor.js";
6
+ // Run-scoped Postgres sessions for `useSession` db nodes (BEGIN…ROLLBACK
7
+ // spanning multiple nodes). Hosts wire `releasePostgresSessionsForRun` into
8
+ // the `databaseSessionRelease` driver and `closeAllPostgresSessions` into
9
+ // process shutdown.
10
+ export { executePostgresQueryInSession, releasePostgresSessionsForRun, closeAllPostgresSessions, __setPgSessionDriverForTests, __getPgSessionCountForTests, } from "./db/pgSessionManager.js";
6
11
  // Individual adapters + connectivity checks, so hosts (Electron, backend) call
7
12
  // the single shared implementation instead of duplicating driver logic.
8
13
  export { executeMongoQuery, testMongoConnection, __setMongoDriverForTests, } from "./db/mongoAdapter.js";
@@ -11,6 +16,8 @@ export { executeMysqlQuery, testMysqlConnection, __setMysqlDriverForTests, } fro
11
16
  export { executeOracleQuery, testOracleConnection, __setOracleDriverForTests, } from "./db/oracleAdapter.js";
12
17
  export { executeMssqlQuery, testMssqlConnection, __setMssqlDriverForTests, } from "./db/mssqlAdapter.js";
13
18
  export { stripTrailingSqlTerminator } from "./db/sqlNormalize.js";
19
+ export { buildPgSslConfig, buildPgClientConfig } from "./db/pgClientConfig.js";
20
+ export { extractSqlState } from "./db/sqlState.js";
14
21
  export { renderDbQueryReference } from "./db/db-query-reference.js";
15
22
  export { normalizeOracleConnectString, OracleConnectStringError, } from "./db/oracleConnectString.js";
16
23
  export { databaseConfigToDbConnection, } from "./db/connectionMapping.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,+EAA+E;AAC/E,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,GAG7B,MAAM,2BAA2B,CAAC;AAanC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GAIzB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,oBAAoB;AACpB,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,2BAA2B,GAG5B,MAAM,0BAA0B,CAAC;AAClC,+EAA+E;AAC/E,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,GAG7B,MAAM,2BAA2B,CAAC;AAanC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GAIzB,MAAM,yBAAyB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -26,6 +26,7 @@ export { resolveXPathCandidates, type XPathResolution } from "./contract/xpathRe
26
26
  export { applySoapRequestTransforms, type SoapRequestConfig, type SoapRuntimeRequestLike, } from "./soap/transport.js";
27
27
  export { buildWsSecurityHeader, injectWsSecurityHeader, type WsSecurityConfig, type WsSecurityHeaderParts, } from "./soap/wsSecurity.js";
28
28
  export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTemplate, } from "./soap/envelope.js";
29
+ export { extractJsonPayload } from "./ai/jsonRepair.js";
29
30
  export * from "./scenario-runner/index.js";
30
31
  export * from "./host/index.js";
31
32
  export * from "./types/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -25,6 +25,9 @@ export { resolveXPathCandidates } from "./contract/xpathResolver.js";
25
25
  export { applySoapRequestTransforms, } from "./soap/transport.js";
26
26
  export { buildWsSecurityHeader, injectWsSecurityHeader, } from "./soap/wsSecurity.js";
27
27
  export { SOAP_11_ENVELOPE_TEMPLATE, SOAP_12_ENVELOPE_TEMPLATE, getSoapEnvelopeTemplate, } from "./soap/envelope.js";
28
+ // Tolerant JSON extraction from LLM reply text (AI node; desktop re-exports
29
+ // this so all hosts repair identically).
30
+ export { extractJsonPayload } from "./ai/jsonRepair.js";
28
31
  export * from "./scenario-runner/index.js";
29
32
  export * from "./host/index.js";
30
33
  export * from "./types/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,GAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AA2BhE,OAAO,EACL,eAAe,GAIhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,6BAA6B,CAAC;AAC3F,kDAAkD;AAClD,OAAO,EACL,0BAA0B,GAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,4EAA4E;AAC5E,yCAAyC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ScenarioAiExecutionInput, ScenarioAiExecutionResult } from "../types.js";
2
+ import type { AiChatTransport } from "./types.js";
3
+ export interface AiExecutorOptions {
4
+ chatTransport?: AiChatTransport;
5
+ /** Upper bound applied on top of the node's own timeoutMs (host budget). */
6
+ nodeTimeoutMs?: number;
7
+ }
8
+ export declare const buildAiExecutor: (options: AiExecutorOptions) => (input: ScenarioAiExecutionInput) => Promise<ScenarioAiExecutionResult>;
9
+ //# sourceMappingURL=ai-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/ai-executor.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD,eAAO,MAAM,eAAe,GAC1B,SAAS,iBAAiB,MAEnB,OAAO,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CA6IzE,CAAC"}
@@ -0,0 +1,119 @@
1
+ // Canonical AI executor — orchestrates an AI scenario node once, identically
2
+ // on every host. Everything provider-agnostic happens here: template-resolve
3
+ // the prompt, parse the response example, assemble the messages, call the
4
+ // host-injected chat transport, tolerantly parse the reply (jsonRepair), and
5
+ // validate it against the schema derived from the example. Hosts differ only
6
+ // in the transport (backend: direct provider call; desktop: backend proxy) —
7
+ // credentials never reach core.
8
+ //
9
+ // Fail-fast rules run BEFORE the transport call so a misconfigured node never
10
+ // burns provider tokens.
11
+ import { extractJsonPayload } from "../../ai/jsonRepair.js";
12
+ import { validateResponseSchema } from "../../contract/schemaValidator.js";
13
+ import { DEFAULT_AI_MAX_TOKENS, DEFAULT_AI_TIMEOUT_MS, MAX_AI_MAX_TOKENS, MAX_AI_PROMPT_LENGTH, MAX_AI_RESPONSE_EXAMPLE_LENGTH, MAX_AI_TIMEOUT_MS, } from "../graphTraversal.js";
14
+ import { buildScenarioTemplateValues, resolveScenarioTemplateString, } from "../templateResolver.js";
15
+ import { withAbortAndTimeout } from "./helpers/abort.js";
16
+ import { buildAiMessages, deriveSchemaFromExample, parseJsonExample } from "./helpers/aiExample.js";
17
+ const failure = (message, details, durationMs = 0) => ({
18
+ outputData: null,
19
+ details,
20
+ durationMs,
21
+ failureMessage: message,
22
+ });
23
+ export const buildAiExecutor = (options) => async (input) => {
24
+ const config = input.node.data.config;
25
+ const details = {
26
+ connectionId: config.connectionId?.trim() || null,
27
+ provider: null,
28
+ model: null,
29
+ tokensUsed: null,
30
+ resolvedPrompt: null,
31
+ rawText: null,
32
+ };
33
+ if (!options.chatTransport) {
34
+ return failure("This host cannot run AI nodes (transport missing).", details);
35
+ }
36
+ if (!details.connectionId) {
37
+ return failure("AI node needs a managed AI connection.", details);
38
+ }
39
+ // --- Fail-fast validation (no provider call, no tokens burned) --------
40
+ const example = parseJsonExample(config.responseExample ?? "");
41
+ if (example.error || !example.value) {
42
+ return failure(example.error ?? "Response example is invalid.", details);
43
+ }
44
+ if ((config.responseExample ?? "").length > MAX_AI_RESPONSE_EXAMPLE_LENGTH) {
45
+ return failure(`Response example is capped at ${MAX_AI_RESPONSE_EXAMPLE_LENGTH} characters.`, details);
46
+ }
47
+ const templateValues = buildScenarioTemplateValues({
48
+ environment: input.context.environment,
49
+ globals: input.context.globals,
50
+ workflowContext: input.context.workflowContext,
51
+ nodeMetaByLabel: input.context.nodeMetaByLabel,
52
+ responseRoot: input.context.responseRoot,
53
+ dbResult: input.context.dbResult,
54
+ kafkaEvent: input.context.kafkaEvent,
55
+ redisResult: input.context.redisResult,
56
+ });
57
+ const resolvedPrompt = resolveScenarioTemplateString(config.prompt ?? "", templateValues).trim();
58
+ details.resolvedPrompt = resolvedPrompt || null;
59
+ if (!resolvedPrompt) {
60
+ return failure("AI prompt is empty.", details);
61
+ }
62
+ if (resolvedPrompt.length > MAX_AI_PROMPT_LENGTH) {
63
+ return failure(`AI prompt is capped at ${MAX_AI_PROMPT_LENGTH} characters after template resolution.`, details);
64
+ }
65
+ const messages = buildAiMessages({
66
+ resolvedPrompt,
67
+ exampleText: config.responseExample,
68
+ });
69
+ const maxTokens = Math.min(MAX_AI_MAX_TOKENS, Math.max(1, Math.round(config.maxTokens ?? DEFAULT_AI_MAX_TOKENS)));
70
+ const timeoutMs = Math.min(options.nodeTimeoutMs ?? MAX_AI_TIMEOUT_MS, Math.min(MAX_AI_TIMEOUT_MS, Math.max(1000, Math.round(config.timeoutMs ?? DEFAULT_AI_TIMEOUT_MS))));
71
+ // --- Provider call ----------------------------------------------------
72
+ const startedAtMs = Date.now();
73
+ let transportResult;
74
+ try {
75
+ transportResult = await withAbortAndTimeout(options.chatTransport({
76
+ connectionId: details.connectionId,
77
+ messages,
78
+ maxTokens,
79
+ signal: input.signal,
80
+ }), timeoutMs, `AI node ${input.stepId}`, input.signal);
81
+ }
82
+ catch (error) {
83
+ return failure(error instanceof Error ? error.message : "AI provider call failed.", details, Date.now() - startedAtMs);
84
+ }
85
+ const durationMs = Date.now() - startedAtMs;
86
+ details.provider = transportResult.provider ?? null;
87
+ details.model = transportResult.model ?? null;
88
+ details.tokensUsed =
89
+ typeof transportResult.tokensUsed === "number" ? transportResult.tokensUsed : null;
90
+ details.rawText = transportResult.text ?? null;
91
+ const rawText = (transportResult.text ?? "").trim();
92
+ if (!rawText) {
93
+ return failure("AI provider returned an empty reply.", details, durationMs);
94
+ }
95
+ // --- Tolerant parse + schema validation -------------------------------
96
+ let parsed;
97
+ try {
98
+ parsed = JSON.parse(extractJsonPayload(rawText));
99
+ }
100
+ catch {
101
+ return failure("AI reply is not valid JSON (even after repair). See the raw reply in the step result.", details, durationMs);
102
+ }
103
+ const schema = deriveSchemaFromExample(example.value);
104
+ const schemaFailures = validateResponseSchema(schema, parsed).filter((entry) => entry.status === "FAIL");
105
+ if (schemaFailures.length > 0) {
106
+ const summary = schemaFailures
107
+ .slice(0, 3)
108
+ .map((entry) => entry.message)
109
+ .join("; ");
110
+ return failure(`AI reply did not match the expected format: ${summary}`, details, durationMs);
111
+ }
112
+ return {
113
+ outputData: parsed,
114
+ details,
115
+ durationMs,
116
+ failureMessage: null,
117
+ };
118
+ };
119
+ //# sourceMappingURL=ai-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/ai-executor.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,10 @@ export interface DatabaseConnectionConfig {
9
9
  username?: string;
10
10
  password?: string;
11
11
  ssl?: boolean;
12
+ sslMode?: "disable" | "require" | "verify-ca" | "verify-full";
13
+ caCert?: string;
14
+ clientCert?: string;
15
+ clientKey?: string;
12
16
  }
13
17
  export interface RedisConnectionConfig {
14
18
  host: string;
@@ -1 +1 @@
1
- {"version":3,"file":"connection-config.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/connection-config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,kBAAkB,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,sBAAsB,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAC/B,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,GACrB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"connection-config.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/connection-config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,kBAAkB,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,sBAAsB,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IAId,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAC/B,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,GACrB,4BAA4B,CAAC"}
@@ -1,4 +1,10 @@
1
- import type { ScenarioDbExecutionInput, ScenarioDbExecutionResult } from "../types.js";
1
+ import type { DbScenarioExpectedError, ScenarioDbExecutionInput, ScenarioDbExecutionResult } from "../types.js";
2
2
  import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
+ import { extractSqlState } from "../../host/db/sqlState.js";
4
+ export { extractSqlState };
5
+ export declare const matchDbExpectedError: (expectation: DbScenarioExpectedError, message: string, sqlState: string | undefined) => {
6
+ matched: boolean;
7
+ mismatchReason: string | null;
8
+ };
3
9
  export declare const buildDbExecutor: (options: ScenarioRuntimeAdapterFactoryOptions) => (input: ScenarioDbExecutionInput) => Promise<ScenarioDbExecutionResult>;
4
10
  //# sourceMappingURL=db-executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,eAAe,GAC1B,SAAS,oCAAoC,MAEtC,OAAO,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CAyCzE,CAAC"}
1
+ {"version":3,"file":"db-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,CAAC;AAI3B,eAAO,MAAM,oBAAoB,GAC/B,aAAa,uBAAuB,EACpC,SAAS,MAAM,EACf,UAAU,MAAM,GAAG,SAAS,KAC3B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAgCnD,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,SAAS,oCAAoC,MAEtC,OAAO,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CA+GzE,CAAC"}
@@ -2,15 +2,87 @@
2
2
  // Resolves the workspace connection, defers the actual query execution
3
3
  // to the host-supplied `databaseExecutor` driver (mongoose / oracledb /
4
4
  // postgres / etc.), wraps the result in the scenario adapter shape.
5
+ //
6
+ // Also owns the two stored-function-testing semantics that must behave
7
+ // identically on every host: session capability detection (a `useSession`
8
+ // node on a host without `databaseSessionRelease` fails fast instead of
9
+ // silently running autocommit) and expected-error evaluation (pgTAP
10
+ // `throws_ok` equivalent — a matching failure PASSES the node).
5
11
  import { withAbortAndTimeout } from "./helpers/abort.js";
12
+ import { extractSqlState } from "../../host/db/sqlState.js";
13
+ export { extractSqlState };
14
+ // Shared with hosts that build their own dbExecutor (desktop's IPC-backed
15
+ // adapter) so expectError semantics never drift between runners.
16
+ export const matchDbExpectedError = (expectation, message, sqlState) => {
17
+ const wantedState = expectation.sqlState?.trim();
18
+ const wantedPattern = expectation.messagePattern?.trim();
19
+ if (wantedState && wantedState.toUpperCase() !== (sqlState ?? "").toUpperCase()) {
20
+ return {
21
+ matched: false,
22
+ mismatchReason: `expected SQLSTATE ${wantedState}, got ${sqlState ?? "none"}`,
23
+ };
24
+ }
25
+ if (wantedPattern) {
26
+ let re;
27
+ try {
28
+ re = new RegExp(wantedPattern);
29
+ }
30
+ catch {
31
+ return {
32
+ matched: false,
33
+ mismatchReason: `invalid expectError.messagePattern regex: ${wantedPattern}`,
34
+ };
35
+ }
36
+ if (!re.test(message)) {
37
+ return {
38
+ matched: false,
39
+ mismatchReason: `error message did not match /${wantedPattern}/`,
40
+ };
41
+ }
42
+ }
43
+ if (!wantedState && !wantedPattern) {
44
+ // An empty expectation still means "this query must fail".
45
+ return { matched: true, mismatchReason: null };
46
+ }
47
+ return { matched: true, mismatchReason: null };
48
+ };
6
49
  export const buildDbExecutor = (options) => async (input) => {
7
50
  const connection = await options.resolveConnection(input.node.data.config.connectionId);
51
+ const expectError = input.node.data.config.expectError;
52
+ const hasExpectation = Boolean(expectError && (expectError.sqlState?.trim() || expectError.messagePattern?.trim()));
53
+ if (input.session && !options.drivers.databaseSessionRelease) {
54
+ return {
55
+ rawResult: { success: false, rows: [], rowCount: 0, error: "sessions unsupported" },
56
+ dbResult: null,
57
+ outputData: null,
58
+ failureMessage: "This node uses a scenario DB session, but the current runner does not support DB sessions. Run it via a host with session support or disable 'Run in scenario transaction'.",
59
+ };
60
+ }
8
61
  try {
9
62
  const result = await withAbortAndTimeout(options.drivers.databaseExecutor({
10
63
  connection,
11
64
  resolvedQuery: input.resolvedQuery,
12
65
  resolvedParams: input.resolvedParams,
66
+ session: input.session,
13
67
  }), options.nodeTimeoutMs, `Database node ${input.stepId}`, input.signal);
68
+ if (hasExpectation) {
69
+ return {
70
+ rawResult: {
71
+ success: false,
72
+ rows: result.rows,
73
+ rowCount: result.rowCount,
74
+ error: "expected an error but the query succeeded",
75
+ },
76
+ dbResult: result.rows,
77
+ outputData: { rows: result.rows, rowCount: result.rowCount },
78
+ failureMessage: `Expected the query to fail (${[
79
+ expectError?.sqlState ? `SQLSTATE ${expectError.sqlState}` : null,
80
+ expectError?.messagePattern ? `message /${expectError.messagePattern}/` : null,
81
+ ]
82
+ .filter(Boolean)
83
+ .join(", ")}), but it succeeded.`,
84
+ };
85
+ }
14
86
  return {
15
87
  rawResult: {
16
88
  success: true,
@@ -27,16 +99,49 @@ export const buildDbExecutor = (options) => async (input) => {
27
99
  }
28
100
  catch (error) {
29
101
  const message = error instanceof Error ? error.message : String(error);
102
+ const sqlState = extractSqlState(error);
103
+ if (hasExpectation && expectError) {
104
+ const { matched, mismatchReason } = matchDbExpectedError(expectError, message, sqlState);
105
+ if (matched) {
106
+ const expectedError = { sqlState: sqlState ?? null, message };
107
+ return {
108
+ rawResult: {
109
+ success: true,
110
+ rows: [],
111
+ rowCount: 0,
112
+ ...(sqlState ? { sqlState } : {}),
113
+ },
114
+ dbResult: null,
115
+ outputData: { expectedError, rows: [], rowCount: 0 },
116
+ failureMessage: null,
117
+ };
118
+ }
119
+ return {
120
+ rawResult: {
121
+ success: false,
122
+ rows: [],
123
+ rowCount: 0,
124
+ error: message,
125
+ ...(sqlState ? { sqlState } : {}),
126
+ },
127
+ dbResult: null,
128
+ outputData: null,
129
+ failureMessage: `Query failed, but not as expected (${mismatchReason}). Actual error: ${message}`,
130
+ };
131
+ }
30
132
  return {
31
133
  rawResult: {
32
134
  success: false,
33
135
  rows: [],
34
136
  rowCount: 0,
35
137
  error: message,
138
+ ...(sqlState ? { sqlState } : {}),
36
139
  },
37
140
  dbResult: null,
38
141
  outputData: null,
39
- failureMessage: message || "Database query failed.",
142
+ failureMessage: sqlState
143
+ ? `${sqlState}: ${message || "Database query failed."}`
144
+ : message || "Database query failed.",
40
145
  };
41
146
  }
42
147
  };
@@ -1 +1 @@
1
- {"version":3,"file":"db-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;AAOpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAA6C,EAC7C,EAAE,CACF,KAAK,EAAE,KAA+B,EAAsC,EAAE;IAC5E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,UAAU;YACV,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC,EACF,OAAO,CAAC,aAAa,EACrB,iBAAiB,KAAK,CAAC,MAAM,EAAE,EAC/B,KAAK,CAAC,MAAM,CACb,CAAC;QACF,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,UAAU,EAAE;gBACV,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,OAAO;aACf;YACD,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,OAAO,IAAI,wBAAwB;SACpD,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"db-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ScenarioAiChatMessage } from "../../types.js";
2
+ export interface ParsedAiExample {
3
+ value: Record<string, unknown> | null;
4
+ error: string | null;
5
+ }
6
+ export declare const parseJsonExample: (exampleText: string) => ParsedAiExample;
7
+ export declare const deriveSchemaFromExample: (example: Record<string, unknown>) => Record<string, unknown>;
8
+ export declare const buildAiMessages: ({ resolvedPrompt, exampleText, }: {
9
+ resolvedPrompt: string;
10
+ exampleText: string;
11
+ }) => ScenarioAiChatMessage[];
12
+ //# sourceMappingURL=aiExample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiExample.d.ts","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/aiExample.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,eAqBtD,CAAC;AAsBF,eAAO,MAAM,uBAAuB,GAClC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAWxB,CAAC;AAKF,eAAO,MAAM,eAAe,GAAI,kCAG7B;IACD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,KAAG,qBAAqB,EAWxB,CAAC"}
@@ -0,0 +1,79 @@
1
+ // AI-node response-example helpers, shared by the executor, the condition
2
+ // suggestion builder, and host UIs:
3
+ // - parseJsonExample: tolerant parse of the user-authored JSON example
4
+ // - deriveSchemaFromExample: example -> lenient JSON Schema (top-level keys
5
+ // required, extras allowed; numbers never tighten to integers; nested
6
+ // objects recurse WITHOUT nested `required` so only the contract the
7
+ // downstream `{{Label.field}}` references depend on is enforced)
8
+ // - buildAiMessages: the fixed system instruction + resolved user prompt
9
+ import { extractJsonPayload } from "../../../ai/jsonRepair.js";
10
+ export const parseJsonExample = (exampleText) => {
11
+ const trimmed = (exampleText ?? "").trim();
12
+ if (!trimmed) {
13
+ return { value: null, error: "Response example is required." };
14
+ }
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(extractJsonPayload(trimmed));
18
+ }
19
+ catch {
20
+ return { value: null, error: "Response example is not valid JSON." };
21
+ }
22
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
23
+ return {
24
+ value: null,
25
+ error: "Response example must be a JSON object (e.g. {\"sentiment\": \"positive\"}).",
26
+ };
27
+ }
28
+ return { value: parsed, error: null };
29
+ };
30
+ const deriveValueSchema = (value) => {
31
+ if (value === null || value === undefined) {
32
+ return {}; // no constraint — the example gives no type signal
33
+ }
34
+ if (typeof value === "string")
35
+ return { type: "string" };
36
+ if (typeof value === "boolean")
37
+ return { type: "boolean" };
38
+ // Never "integer": an example value of 1 must not reject a reply of 0.9.
39
+ if (typeof value === "number")
40
+ return { type: "number" };
41
+ if (Array.isArray(value)) {
42
+ return value.length > 0
43
+ ? { type: "array", items: deriveValueSchema(value[0]) }
44
+ : { type: "array" };
45
+ }
46
+ const properties = {};
47
+ for (const [key, nested] of Object.entries(value)) {
48
+ properties[key] = deriveValueSchema(nested);
49
+ }
50
+ return { type: "object", properties, additionalProperties: true };
51
+ };
52
+ export const deriveSchemaFromExample = (example) => {
53
+ const properties = {};
54
+ for (const [key, value] of Object.entries(example)) {
55
+ properties[key] = deriveValueSchema(value);
56
+ }
57
+ return {
58
+ type: "object",
59
+ properties,
60
+ required: Object.keys(example),
61
+ additionalProperties: true,
62
+ };
63
+ };
64
+ // The word "JSON" in the system message also satisfies OpenAI's
65
+ // `response_format: json_object` requirement (it rejects prompts that never
66
+ // mention JSON).
67
+ export const buildAiMessages = ({ resolvedPrompt, exampleText, }) => [
68
+ {
69
+ role: "system",
70
+ content: [
71
+ "You are a step inside an automated API-testing scenario.",
72
+ "Reply with ONLY a single JSON object — no markdown, no code fences, no prose.",
73
+ "The reply must use the same top-level keys and value types as this example (values may differ):",
74
+ exampleText.trim(),
75
+ ].join("\n"),
76
+ },
77
+ { role: "user", content: resolvedPrompt },
78
+ ];
79
+ //# sourceMappingURL=aiExample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiExample.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/aiExample.ts"],"names":[],"mappings":"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"}