@deepagents/text2sql 7.0.1 → 7.1.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 (162) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/sql.js +57 -32
  3. package/dist/index.js +793 -498
  4. package/dist/index.js.map +4 -4
  5. package/dist/lib/adapters/adapter.d.ts +23 -1
  6. package/dist/lib/adapters/adapter.d.ts.map +1 -1
  7. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
  8. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
  9. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
  10. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
  11. package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
  12. package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
  13. package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
  14. package/dist/lib/adapters/bigquery/index.d.ts +6 -13
  15. package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
  16. package/dist/lib/adapters/bigquery/index.js +244 -51
  17. package/dist/lib/adapters/bigquery/index.js.map +4 -4
  18. package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
  19. package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
  20. package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
  21. package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
  22. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
  23. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
  24. package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
  25. package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
  26. package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
  27. package/dist/lib/adapters/clickhouse/index.js +133 -44
  28. package/dist/lib/adapters/clickhouse/index.js.map +4 -4
  29. package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
  30. package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
  31. package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
  32. package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
  33. package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
  34. package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
  35. package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
  36. package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
  37. package/dist/lib/adapters/duckdb/index.d.ts +8 -10
  38. package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
  39. package/dist/lib/adapters/duckdb/index.js +1549 -1412
  40. package/dist/lib/adapters/duckdb/index.js.map +4 -4
  41. package/dist/lib/adapters/groundings/index.js.map +1 -1
  42. package/dist/lib/adapters/groundings/rows.d.ts +32 -0
  43. package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
  44. package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
  45. package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
  46. package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
  47. package/dist/lib/adapters/mysql/index.d.ts +2 -4
  48. package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
  49. package/dist/lib/adapters/mysql/index.js +230 -76
  50. package/dist/lib/adapters/mysql/index.js.map +4 -4
  51. package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
  52. package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
  53. package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
  54. package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
  55. package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
  56. package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
  57. package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
  58. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
  59. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
  60. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
  61. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
  62. package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
  63. package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -1
  64. package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
  65. package/dist/lib/adapters/postgres/index.d.ts +2 -4
  66. package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
  67. package/dist/lib/adapters/postgres/index.js +266 -487
  68. package/dist/lib/adapters/postgres/index.js.map +4 -4
  69. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
  70. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
  71. package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
  72. package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
  73. package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
  74. package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
  75. package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
  76. package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
  77. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
  78. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
  79. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
  80. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
  81. package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
  82. package/dist/lib/adapters/posthog/index.d.ts +4 -5
  83. package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
  84. package/dist/lib/adapters/posthog/index.js +349 -287
  85. package/dist/lib/adapters/posthog/index.js.map +4 -4
  86. package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
  87. package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
  88. package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
  89. package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
  90. package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
  91. package/dist/lib/adapters/posthog/types.d.ts +16 -6
  92. package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
  93. package/dist/lib/adapters/spreadsheet/index.js +113 -34
  94. package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
  95. package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
  96. package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
  97. package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
  98. package/dist/lib/adapters/sqlite/index.js +136 -49
  99. package/dist/lib/adapters/sqlite/index.js.map +4 -4
  100. package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
  101. package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
  102. package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
  103. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
  104. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
  105. package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
  106. package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
  107. package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
  108. package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
  109. package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
  110. package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
  111. package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
  112. package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
  113. package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
  114. package/dist/lib/adapters/sqlserver/index.js +223 -455
  115. package/dist/lib/adapters/sqlserver/index.js.map +4 -4
  116. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
  117. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
  118. package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
  119. package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
  120. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
  121. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
  122. package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
  123. package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
  124. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +4 -3
  125. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
  126. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
  127. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
  128. package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
  129. package/dist/lib/checkpoint.d.ts +34 -21
  130. package/dist/lib/checkpoint.d.ts.map +1 -1
  131. package/dist/lib/file-cache.d.ts +6 -1
  132. package/dist/lib/file-cache.d.ts.map +1 -1
  133. package/dist/lib/fs/columns.d.ts +14 -0
  134. package/dist/lib/fs/columns.d.ts.map +1 -0
  135. package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
  136. package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
  137. package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
  138. package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
  139. package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
  140. package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
  141. package/dist/lib/index-cache.d.ts +4 -3
  142. package/dist/lib/index-cache.d.ts.map +1 -1
  143. package/dist/lib/sql.d.ts.map +1 -1
  144. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
  145. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
  146. package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
  147. package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
  148. package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
  149. package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
  150. package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
  151. package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
  152. package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
  153. package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
  154. package/dist/lib/synthesis/index.js +124 -114
  155. package/dist/lib/synthesis/index.js.map +4 -4
  156. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
  157. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
  158. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
  159. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
  160. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
  161. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
  162. package/package.json +8 -8
@@ -1,191 +1,6 @@
1
- // packages/text2sql/src/lib/adapters/groundings/abstract.grounding.ts
2
- function filterColumns(columns, filter) {
3
- if (Array.isArray(filter)) {
4
- return columns.filter((col) => filter.includes(col.name));
5
- }
6
- if (filter instanceof RegExp) {
7
- return columns.filter((col) => filter.test(col.name));
8
- }
9
- return columns.filter((col) => filter(col.name));
10
- }
11
- function applyColumnFilter(entity, columnsConfig) {
12
- if (!columnsConfig) return entity;
13
- const filter = columnsConfig[entity.name];
14
- if (!filter) return entity;
15
- return { ...entity, columns: filterColumns(entity.columns, filter) };
16
- }
17
- var AbstractGrounding = class {
18
- /**
19
- * Grounding identifier for debugging/logging.
20
- */
21
- name;
22
- phase;
23
- constructor(name, phase) {
24
- this.name = name;
25
- this.phase = phase;
26
- }
27
- /**
28
- * Populate ctx with the tables/views this grounding makes available for scope
29
- * resolution. Annotators decorate entities other groundings produced and add
30
- * no membership, so the default is a no-op; entity-producing groundings
31
- * override it. This lets scope resolution skip the annotators' metadata scans.
32
- *
33
- * @param _ctx - Shared context for accumulating entity membership
34
- */
35
- async contributeEntities(_ctx) {
36
- }
37
- };
38
-
39
- // packages/text2sql/src/lib/adapters/posthog/definitions.posthog.grounding.ts
40
- var PostHogDefinitionsGrounding = class extends AbstractGrounding {
41
- #adapter;
42
- #config;
43
- constructor(adapter, config = {}) {
44
- super("definitions", "definitions");
45
- this.#adapter = adapter;
46
- this.#config = config;
47
- }
48
- async execute(ctx) {
49
- const fragments = ctx.fragments ??= [];
50
- const configuredPropertyTypes = this.#config.propertyTypes ?? ["event", "person", "session"];
51
- const propertyTypes = [
52
- ...new Set(configuredPropertyTypes)
53
- ];
54
- validatePropertyTypes(propertyTypes);
55
- const groupTypeIndexes = [...new Set(this.#config.groupTypeIndexes ?? [])];
56
- if (groupTypeIndexes.some((index2) => !Number.isInteger(index2) || index2 < 0)) {
57
- throw new Error(
58
- "PostHog groupTypeIndexes must contain non-negative integers."
59
- );
60
- }
61
- const propertyRequests = [
62
- ...propertyTypes.map(async (type) => ({
63
- type,
64
- definitions: await this.#adapter.transport.listPropertyDefinitions({
65
- type
66
- })
67
- })),
68
- ...groupTypeIndexes.map(async (groupTypeIndex) => ({
69
- type: `group:${groupTypeIndex}`,
70
- definitions: await this.#adapter.transport.listPropertyDefinitions({
71
- type: "group",
72
- groupTypeIndex
73
- })
74
- }))
75
- ];
76
- const [events, properties] = await Promise.all([
77
- this.#adapter.transport.listEventDefinitions(),
78
- Promise.all(propertyRequests)
79
- ]);
80
- const eventData = readEvents(events, this.#config.events);
81
- if (eventData.length > 0) {
82
- fragments.push({ name: "posthogEvents", data: eventData });
83
- }
84
- const propertyData = {};
85
- for (const group of properties) {
86
- const definitions2 = readProperties(
87
- group.definitions,
88
- this.#config.properties
89
- );
90
- if (definitions2.length > 0) propertyData[group.type] = definitions2;
91
- }
92
- if (Object.keys(propertyData).length > 0) {
93
- fragments.push({
94
- name: "posthogProperties",
95
- data: propertyData
96
- });
97
- }
98
- }
99
- };
100
- function readEvents(values, filter) {
101
- return values.map(validateEvent).filter((event) => matchesFilter(event.name, filter)).toSorted((left, right) => left.name.localeCompare(right.name)).map(
102
- (event) => compact({
103
- name: event.name,
104
- description: event.description ?? void 0,
105
- tags: event.tags?.length ? event.tags : void 0,
106
- verified: event.verified ?? void 0
107
- })
108
- );
109
- }
110
- function readProperties(values, filter) {
111
- return values.map(validateProperty).filter((property) => matchesFilter(property.name, filter)).toSorted((left, right) => left.name.localeCompare(right.name)).map(
112
- (property) => compact({
113
- name: property.name,
114
- description: property.description ?? void 0,
115
- propertyType: property.property_type ?? void 0,
116
- numerical: property.is_numerical ?? void 0,
117
- verified: property.verified ?? void 0
118
- })
119
- );
120
- }
121
- function validateEvent(value) {
122
- if (!isRecord(value) || !readNonEmptyString(value.name) || !isOptionalString(value.description) || !isOptionalBoolean(value.verified) || !isOptionalStringArray(value.tags)) {
123
- throw new Error("PostHog returned a malformed event definition.");
124
- }
125
- return value;
126
- }
127
- function validateProperty(value) {
128
- if (!isRecord(value) || !readNonEmptyString(value.name) || !isOptionalString(value.description) || !isOptionalString(value.property_type) || !isOptionalBoolean(value.is_numerical) || !isOptionalBoolean(value.verified)) {
129
- throw new Error("PostHog returned a malformed property definition.");
130
- }
131
- return value;
132
- }
133
- function validatePropertyTypes(values) {
134
- const allowed = /* @__PURE__ */ new Set(["event", "person", "session"]);
135
- if (values.some((value) => !allowed.has(value))) {
136
- throw new Error("PostHog propertyTypes contains an unsupported type.");
137
- }
138
- }
139
- function matchesFilter(name, filter) {
140
- if (!filter) return true;
141
- if (Array.isArray(filter)) return filter.includes(name);
142
- if (filter instanceof RegExp) {
143
- filter.lastIndex = 0;
144
- return filter.test(name);
145
- }
146
- return filter(name);
147
- }
148
- function compact(value) {
149
- return Object.fromEntries(
150
- Object.entries(value).filter((entry) => entry[1] !== void 0)
151
- );
152
- }
153
- function isOptionalString(value) {
154
- return value === void 0 || value === null || typeof value === "string";
155
- }
156
- function isOptionalBoolean(value) {
157
- return value === void 0 || value === null || typeof value === "boolean";
158
- }
159
- function isOptionalStringArray(value) {
160
- return value === void 0 || value === null || Array.isArray(value) && value.every((item) => typeof item === "string");
161
- }
162
- function readNonEmptyString(value) {
163
- return typeof value === "string" && value.length > 0 ? value : void 0;
164
- }
165
- function isRecord(value) {
166
- return typeof value === "object" && value !== null && !Array.isArray(value);
167
- }
168
-
169
- // packages/text2sql/src/lib/adapters/posthog/info.posthog.grounding.ts
170
- var PostHogInfoGrounding = class extends AbstractGrounding {
171
- constructor() {
172
- super("info", "info");
173
- }
174
- async execute(ctx) {
175
- ctx.info = {
176
- dialect: "HogQL",
177
- details: {
178
- identifierQuoting: "Use backticks for identifiers that require quoting.",
179
- propertyAccess: "Use PostHog HogQL property access and the grounded event/person/session property definitions. Do not guess property names.",
180
- performance: "Prefer bounded time ranges and LIMIT for non-aggregate event queries. OFFSET is not supported by the Query API.",
181
- execution: "Queries run through PostHog as read-only HogQLQuery nodes, not through a PostgreSQL connection."
182
- }
183
- };
184
- }
185
- };
186
-
187
1
  // packages/text2sql/src/lib/adapters/adapter.ts
188
2
  import { format as formatSql } from "sql-formatter";
3
+ import { z } from "zod";
189
4
 
190
5
  // packages/text2sql/src/lib/agents/exceptions.ts
191
6
  var sqlValidationMarker = /* @__PURE__ */ Symbol("SQLValidationError");
@@ -358,6 +173,16 @@ function createGroundingContext(options = {}) {
358
173
  }
359
174
 
360
175
  // packages/text2sql/src/lib/adapters/adapter.ts
176
+ function groundingFor(adapterType, create) {
177
+ return (adapter) => {
178
+ if (!(adapter instanceof adapterType)) {
179
+ throw new Error(
180
+ `A ${adapterType.name} grounding needs a ${adapterType.name} adapter, not ${adapter.constructor.name}.`
181
+ );
182
+ }
183
+ return create(adapter);
184
+ };
185
+ }
361
186
  var Adapter = class {
362
187
  #policyAnalyzer;
363
188
  /**
@@ -618,6 +443,40 @@ var Adapter = class {
618
443
  }
619
444
  return decoded;
620
445
  }
446
+ /**
447
+ * Run an introspection query and check every row against `row`, the shape
448
+ * the driver returns for that query. A row of any other shape throws.
449
+ */
450
+ async runQuery(sql, row) {
451
+ const rows = z.array(row).safeParse(await this.queryRows(sql));
452
+ if (!rows.success) {
453
+ throw new Error(
454
+ `${this.constructor.name} introspection query returned rows of an unexpected shape:
455
+ ${z.prettifyError(rows.error)}
456
+ SQL: ${sql.trim()}`,
457
+ { cause: rows.error }
458
+ );
459
+ }
460
+ return rows.data;
461
+ }
462
+ /**
463
+ * The rows in a driver's execute() result: the result itself when it is an
464
+ * array, otherwise the first array found at one of `paths` (dot-separated,
465
+ * so `recordsets.0` reads `result.recordsets[0]`).
466
+ */
467
+ rowsFrom(result, paths) {
468
+ if (Array.isArray(result)) return result;
469
+ for (const path of paths) {
470
+ const rows = path.split(".").reduce(
471
+ (value, key) => typeof value === "object" && value !== null ? Reflect.get(value, key) : void 0,
472
+ result
473
+ );
474
+ if (Array.isArray(rows)) return rows;
475
+ }
476
+ throw new Error(
477
+ `${this.constructor.name} execute() must return an array of rows or an object holding one at ${paths.map((path) => `result.${path}`).join(", ")}.`
478
+ );
479
+ }
621
480
  /**
622
481
  * Convert unknown database value to number.
623
482
  * Handles number, bigint, and string types.
@@ -670,6 +529,203 @@ var Adapter = class {
670
529
  }
671
530
  };
672
531
 
532
+ // packages/text2sql/src/lib/adapters/posthog/definitions.posthog.grounding.ts
533
+ import { z as z2 } from "zod";
534
+
535
+ // packages/text2sql/src/lib/adapters/groundings/abstract.grounding.ts
536
+ function filterColumns(columns, filter) {
537
+ if (Array.isArray(filter)) {
538
+ return columns.filter((col) => filter.includes(col.name));
539
+ }
540
+ if (filter instanceof RegExp) {
541
+ return columns.filter((col) => filter.test(col.name));
542
+ }
543
+ return columns.filter((col) => filter(col.name));
544
+ }
545
+ function applyColumnFilter(entity, columnsConfig) {
546
+ if (!columnsConfig) return entity;
547
+ const filter = columnsConfig[entity.name];
548
+ if (!filter) return entity;
549
+ return { ...entity, columns: filterColumns(entity.columns, filter) };
550
+ }
551
+ var AbstractGrounding = class {
552
+ /**
553
+ * Grounding identifier for debugging/logging.
554
+ */
555
+ name;
556
+ phase;
557
+ constructor(name, phase) {
558
+ this.name = name;
559
+ this.phase = phase;
560
+ }
561
+ /**
562
+ * Populate ctx with the tables/views this grounding makes available for scope
563
+ * resolution. Annotators decorate entities other groundings produced and add
564
+ * no membership, so the default is a no-op; entity-producing groundings
565
+ * override it. This lets scope resolution skip the annotators' metadata scans.
566
+ *
567
+ * @param _ctx - Shared context for accumulating entity membership
568
+ */
569
+ async contributeEntities(_ctx) {
570
+ }
571
+ };
572
+
573
+ // packages/text2sql/src/lib/adapters/posthog/definitions.posthog.grounding.ts
574
+ var postHogEventDefinition = z2.object({
575
+ name: z2.string().min(1),
576
+ description: z2.string().nullish(),
577
+ tags: z2.array(z2.string()).nullish(),
578
+ verified: z2.boolean().nullish()
579
+ });
580
+ var postHogPropertyDefinition = z2.object({
581
+ name: z2.string().min(1),
582
+ description: z2.string().nullish(),
583
+ property_type: z2.string().nullish(),
584
+ is_numerical: z2.boolean().nullish(),
585
+ verified: z2.boolean().nullish()
586
+ });
587
+ var PostHogDefinitionsGrounding = class extends AbstractGrounding {
588
+ #adapter;
589
+ #config;
590
+ constructor(adapter, config = {}) {
591
+ super("definitions", "definitions");
592
+ this.#adapter = adapter;
593
+ this.#config = config;
594
+ }
595
+ async execute(ctx) {
596
+ const fragments = ctx.fragments ??= [];
597
+ const configuredPropertyTypes = this.#config.propertyTypes ?? ["event", "person", "session"];
598
+ const propertyTypes = [
599
+ ...new Set(configuredPropertyTypes)
600
+ ];
601
+ validatePropertyTypes(propertyTypes);
602
+ const groupTypeIndexes = [...new Set(this.#config.groupTypeIndexes ?? [])];
603
+ if (groupTypeIndexes.some((index2) => !Number.isInteger(index2) || index2 < 0)) {
604
+ throw new Error(
605
+ "PostHog groupTypeIndexes must contain non-negative integers."
606
+ );
607
+ }
608
+ const propertyRequests = [
609
+ ...propertyTypes.map(async (type) => ({
610
+ type,
611
+ definitions: await this.#adapter.transport.listPropertyDefinitions({
612
+ type
613
+ })
614
+ })),
615
+ ...groupTypeIndexes.map(async (groupTypeIndex) => ({
616
+ type: `group:${groupTypeIndex}`,
617
+ definitions: await this.#adapter.transport.listPropertyDefinitions({
618
+ type: "group",
619
+ groupTypeIndex
620
+ })
621
+ }))
622
+ ];
623
+ const [events, properties] = await Promise.all([
624
+ this.#adapter.transport.listEventDefinitions(),
625
+ Promise.all(propertyRequests)
626
+ ]);
627
+ const eventData = readEvents(events, this.#config.events);
628
+ if (eventData.length > 0) {
629
+ fragments.push({ name: "posthogEvents", data: eventData });
630
+ }
631
+ const propertyData = {};
632
+ for (const group of properties) {
633
+ const definitions2 = readProperties(
634
+ group.definitions,
635
+ this.#config.properties
636
+ );
637
+ if (definitions2.length > 0) propertyData[group.type] = definitions2;
638
+ }
639
+ if (Object.keys(propertyData).length > 0) {
640
+ fragments.push({
641
+ name: "posthogProperties",
642
+ data: propertyData
643
+ });
644
+ }
645
+ }
646
+ };
647
+ function readEvents(values, filter) {
648
+ return values.map(validateEvent).filter((event) => matchesFilter(event.name, filter)).toSorted((left, right) => left.name.localeCompare(right.name)).map(
649
+ (event) => compact({
650
+ name: event.name,
651
+ description: event.description ?? void 0,
652
+ tags: event.tags?.length ? event.tags : void 0,
653
+ verified: event.verified ?? void 0
654
+ })
655
+ );
656
+ }
657
+ function readProperties(values, filter) {
658
+ return values.map(validateProperty).filter((property) => matchesFilter(property.name, filter)).toSorted((left, right) => left.name.localeCompare(right.name)).map(
659
+ (property) => compact({
660
+ name: property.name,
661
+ description: property.description ?? void 0,
662
+ propertyType: property.property_type ?? void 0,
663
+ numerical: property.is_numerical ?? void 0,
664
+ verified: property.verified ?? void 0
665
+ })
666
+ );
667
+ }
668
+ function validateEvent(value) {
669
+ const event = postHogEventDefinition.safeParse(value);
670
+ if (!event.success) {
671
+ throw new Error("PostHog returned a malformed event definition.");
672
+ }
673
+ return event.data;
674
+ }
675
+ function validateProperty(value) {
676
+ const property = postHogPropertyDefinition.safeParse(value);
677
+ if (!property.success) {
678
+ throw new Error("PostHog returned a malformed property definition.");
679
+ }
680
+ return property.data;
681
+ }
682
+ function validatePropertyTypes(values) {
683
+ const allowed = /* @__PURE__ */ new Set(["event", "person", "session"]);
684
+ if (values.some((value) => !allowed.has(value))) {
685
+ throw new Error("PostHog propertyTypes contains an unsupported type.");
686
+ }
687
+ }
688
+ function matchesFilter(name, filter) {
689
+ if (!filter) return true;
690
+ if (Array.isArray(filter)) return filter.includes(name);
691
+ if (filter instanceof RegExp) {
692
+ filter.lastIndex = 0;
693
+ return filter.test(name);
694
+ }
695
+ return filter(name);
696
+ }
697
+ function compact(value) {
698
+ return Object.fromEntries(
699
+ Object.entries(value).filter(
700
+ (entry) => entry[1] !== void 0
701
+ )
702
+ );
703
+ }
704
+
705
+ // packages/text2sql/src/lib/adapters/posthog/info.posthog.grounding.ts
706
+ var PostHogInfoGrounding = class extends AbstractGrounding {
707
+ constructor() {
708
+ super("info", "info");
709
+ }
710
+ async execute(ctx) {
711
+ ctx.info = {
712
+ dialect: "HogQL",
713
+ details: {
714
+ identifierQuoting: "Use backticks for identifiers that require quoting.",
715
+ propertyAccess: "Use PostHog HogQL property access and the grounded event/person/session property definitions. Do not guess property names.",
716
+ performance: "Prefer bounded time ranges and LIMIT for non-aggregate event queries. OFFSET is not supported by the Query API.",
717
+ execution: "Queries run through PostHog as read-only HogQLQuery nodes, not through a PostgreSQL connection."
718
+ }
719
+ };
720
+ }
721
+ };
722
+
723
+ // packages/text2sql/src/lib/adapters/posthog/posthog.ts
724
+ import { z as z4 } from "zod";
725
+
726
+ // packages/text2sql/src/lib/adapters/posthog/posthog.sql-policy.ts
727
+ import { z as z3 } from "zod";
728
+
673
729
  // packages/text2sql/src/lib/sql-scope-error.ts
674
730
  function buildScopeParseErrorPayload(sql, parserDialect, error) {
675
731
  const parserError = error instanceof Error ? error.message : String(error ?? "Unknown error");
@@ -684,6 +740,12 @@ function buildScopeParseErrorPayload(sql, parserDialect, error) {
684
740
  }
685
741
 
686
742
  // packages/text2sql/src/lib/adapters/posthog/posthog.sql-policy.ts
743
+ var postHogNotice = z3.object({
744
+ start: z3.number().nullish(),
745
+ end: z3.number().nullish(),
746
+ message: z3.string(),
747
+ fix: z3.string().nullish()
748
+ });
687
749
  var PostHogSqlPolicyAnalyzer = class {
688
750
  #transport;
689
751
  constructor(transport) {
@@ -715,15 +777,15 @@ var PostHogSqlPolicyAnalyzer = class {
715
777
  }
716
778
  };
717
779
  function validateMetadataResponse(value) {
718
- if (!isRecord2(value)) {
780
+ if (!isRecord(value)) {
719
781
  throw new Error("PostHog HogQLMetadata response must be a JSON object.");
720
782
  }
721
783
  if (typeof value.isValid !== "boolean") {
722
784
  throw new Error("PostHog HogQLMetadata response has no isValid boolean.");
723
785
  }
724
786
  const errors = validateNotices(value.errors, "errors");
725
- validateNotices(value.warnings, "warnings");
726
- validateNotices(value.notices, "notices");
787
+ const warnings = validateNotices(value.warnings, "warnings");
788
+ const notices = validateNotices(value.notices, "notices");
727
789
  const tableNames = validateTableNames(value.table_names);
728
790
  if (!value.isValid || errors.length > 0) {
729
791
  const reason = errors.map((notice) => notice.message).join("; ");
@@ -734,8 +796,8 @@ function validateMetadataResponse(value) {
734
796
  return {
735
797
  isValid: true,
736
798
  errors,
737
- warnings: value.warnings,
738
- notices: value.notices,
799
+ warnings,
800
+ notices,
739
801
  table_names: tableNames
740
802
  };
741
803
  }
@@ -743,14 +805,13 @@ function validateNotices(value, name) {
743
805
  if (!Array.isArray(value)) {
744
806
  throw new Error(`PostHog HogQLMetadata response has no ${name} array.`);
745
807
  }
746
- for (const notice of value) {
747
- if (!isRecord2(notice) || typeof notice.message !== "string") {
748
- throw new Error(
749
- `PostHog HogQLMetadata response has an invalid ${name} notice.`
750
- );
751
- }
808
+ const notices = z3.array(postHogNotice).safeParse(value);
809
+ if (!notices.success) {
810
+ throw new Error(
811
+ `PostHog HogQLMetadata response has an invalid ${name} notice.`
812
+ );
752
813
  }
753
- return value;
814
+ return notices.data;
754
815
  }
755
816
  function validateTableNames(value) {
756
817
  if (!Array.isArray(value) || value.some((name) => typeof name !== "string" || name.length === 0)) {
@@ -771,11 +832,15 @@ function buildOutOfScopePayload(sql, referencedEntities, allowedEntities) {
771
832
  function caseFold(value) {
772
833
  return value.toLowerCase();
773
834
  }
774
- function isRecord2(value) {
835
+ function isRecord(value) {
775
836
  return typeof value === "object" && value !== null && !Array.isArray(value);
776
837
  }
777
838
 
778
839
  // packages/text2sql/src/lib/adapters/posthog/posthog.ts
840
+ var hogQLQueryResponse = z4.object({
841
+ results: z4.array(z4.array(z4.unknown())),
842
+ columns: z4.array(z4.string().min(1)).optional()
843
+ });
779
844
  var PostHog = class extends Adapter {
780
845
  transport;
781
846
  grounding;
@@ -808,8 +873,8 @@ var PostHog = class extends Adapter {
808
873
  validateImpl() {
809
874
  return void 0;
810
875
  }
811
- async runQuery(sql) {
812
- return await this.#execute(sql, "deepagents_text2sql_grounding");
876
+ queryRows(sql) {
877
+ return this.#execute(sql, "deepagents_text2sql_grounding");
813
878
  }
814
879
  quoteIdentifier(name) {
815
880
  return `\`${name.replace(/`/g, "``")}\``;
@@ -839,28 +904,27 @@ var PostHog = class extends Adapter {
839
904
  }
840
905
  };
841
906
  function rowsFromResponse(value) {
842
- if (!isRecord3(value) || !Array.isArray(value.results)) {
843
- throw new Error("PostHog HogQLQuery response has no results array.");
844
- }
845
- if (value.columns !== void 0 && (!Array.isArray(value.columns) || value.columns.some(
846
- (column2) => typeof column2 !== "string" || column2.length === 0
847
- ))) {
848
- throw new Error("PostHog HogQLQuery response has invalid columns.");
907
+ const response = hogQLQueryResponse.safeParse(value);
908
+ if (!response.success) {
909
+ throw new Error(
910
+ `PostHog HogQLQuery response is malformed:
911
+ ${z4.prettifyError(response.error)}`
912
+ );
849
913
  }
850
- if (Array.isArray(value.columns) && new Set(value.columns).size !== value.columns.length) {
914
+ const { columns, results } = response.data;
915
+ if (columns && new Set(columns).size !== columns.length) {
851
916
  throw new Error(
852
917
  "PostHog HogQLQuery response contains duplicate column names; alias every selected expression uniquely."
853
918
  );
854
919
  }
855
- if (value.results.length === 0) return [];
856
- if (!Array.isArray(value.columns)) {
920
+ if (results.length === 0) return [];
921
+ if (!columns) {
857
922
  throw new Error(
858
923
  "PostHog HogQLQuery response requires columns for non-empty results."
859
924
  );
860
925
  }
861
- const columns = value.columns;
862
- return value.results.map((row, index2) => {
863
- if (!Array.isArray(row) || row.length !== columns.length) {
926
+ return results.map((row, index2) => {
927
+ if (row.length !== columns.length) {
864
928
  throw new Error(
865
929
  `PostHog HogQLQuery result row ${index2} does not match the column count.`
866
930
  );
@@ -870,12 +934,10 @@ function rowsFromResponse(value) {
870
934
  );
871
935
  });
872
936
  }
873
- function isRecord3(value) {
874
- return typeof value === "object" && value !== null && !Array.isArray(value);
875
- }
876
937
 
877
938
  // packages/text2sql/src/lib/adapters/posthog/schema.posthog.grounding.ts
878
- var SCALAR_FIELD_TYPES = /* @__PURE__ */ new Set([
939
+ import { z as z5 } from "zod";
940
+ var scalarFieldType = z5.enum([
879
941
  "integer",
880
942
  "float",
881
943
  "decimal",
@@ -886,32 +948,59 @@ var SCALAR_FIELD_TYPES = /* @__PURE__ */ new Set([
886
948
  "array",
887
949
  "json"
888
950
  ]);
889
- var FIELD_TYPES = /* @__PURE__ */ new Set([
890
- ...SCALAR_FIELD_TYPES,
891
- "lazy_table",
892
- "virtual_table",
893
- "field_traverser",
894
- "expression",
895
- "view",
896
- "materialized_view",
897
- "unknown"
898
- ]);
899
- var TABLE_TYPES = /* @__PURE__ */ new Set([
900
- "posthog",
901
- "system",
902
- "data_warehouse",
951
+ var SCALAR_FIELD_TYPES = new Set(
952
+ scalarFieldType.options
953
+ );
954
+ var viewTableType = z5.enum([
903
955
  "view",
904
- "batch_export",
905
956
  "materialized_view",
906
957
  "managed_view",
907
958
  "endpoint"
908
959
  ]);
909
- var VIEW_TYPES = /* @__PURE__ */ new Set([
910
- "view",
911
- "materialized_view",
912
- "managed_view",
913
- "endpoint"
960
+ var VIEW_TYPES = new Set(viewTableType.options);
961
+ var postHogDatabaseField = z5.object({
962
+ name: z5.string(),
963
+ hogql_value: z5.string(),
964
+ type: z5.enum([
965
+ ...scalarFieldType.options,
966
+ "lazy_table",
967
+ "virtual_table",
968
+ "field_traverser",
969
+ "expression",
970
+ "view",
971
+ "materialized_view",
972
+ "unknown"
973
+ ]),
974
+ schema_valid: z5.boolean()
975
+ });
976
+ var tableMembers = {
977
+ id: z5.string(),
978
+ name: z5.string(),
979
+ fields: z5.record(z5.string(), postHogDatabaseField),
980
+ row_count: z5.number().nonnegative().nullish()
981
+ };
982
+ var postHogDatabaseTable = z5.discriminatedUnion("type", [
983
+ z5.object({
984
+ ...tableMembers,
985
+ type: z5.enum(["posthog", "system", "data_warehouse", "batch_export"])
986
+ }),
987
+ z5.object({
988
+ ...tableMembers,
989
+ type: viewTableType,
990
+ query: z5.object({ query: z5.string() })
991
+ })
914
992
  ]);
993
+ var postHogSchemaJoin = z5.object({
994
+ source_table_name: z5.string().nullish(),
995
+ source_table_key: z5.string().nullish(),
996
+ joining_table_name: z5.string().nullish(),
997
+ joining_table_key: z5.string().nullish(),
998
+ field_name: z5.string().nullish()
999
+ });
1000
+ var postHogSchemaResponse = z5.object({
1001
+ tables: z5.record(z5.string(), postHogDatabaseTable),
1002
+ joins: z5.array(postHogSchemaJoin)
1003
+ });
915
1004
  var PostHogSchemaGrounding = class extends AbstractGrounding {
916
1005
  #adapter;
917
1006
  #config;
@@ -975,44 +1064,14 @@ var PostHogSchemaGrounding = class extends AbstractGrounding {
975
1064
  }
976
1065
  };
977
1066
  function validateSchemaResponse(value) {
978
- if (!isRecord4(value) || !isRecord4(value.tables) || !Array.isArray(value.joins)) {
1067
+ const response = postHogSchemaResponse.safeParse(value);
1068
+ if (!response.success) {
979
1069
  throw new Error(
980
- "PostHog DatabaseSchemaQuery response must contain tables and joins."
1070
+ `PostHog DatabaseSchemaQuery response is malformed:
1071
+ ${z5.prettifyError(response.error)}`
981
1072
  );
982
1073
  }
983
- for (const [name, valueTable] of Object.entries(value.tables)) {
984
- if (!isRecord4(valueTable)) {
985
- throw new Error(`PostHog schema table ${name} must be an object.`);
986
- }
987
- if (!TABLE_TYPES.has(valueTable.type)) {
988
- throw new Error(`PostHog schema table ${name} has an unknown type.`);
989
- }
990
- if (typeof valueTable.id !== "string" || typeof valueTable.name !== "string" || !isRecord4(valueTable.fields)) {
991
- throw new Error(`PostHog schema table ${name} is malformed.`);
992
- }
993
- if (valueTable.row_count !== void 0 && valueTable.row_count !== null && (typeof valueTable.row_count !== "number" || !Number.isFinite(valueTable.row_count) || valueTable.row_count < 0)) {
994
- throw new Error(`PostHog schema table ${name} has an invalid row_count.`);
995
- }
996
- if (VIEW_TYPES.has(valueTable.type) && (!isRecord4(valueTable.query) || typeof valueTable.query.query !== "string")) {
997
- throw new Error(`PostHog schema view ${name} has an invalid query.`);
998
- }
999
- validateFields(name, valueTable.fields);
1000
- }
1001
- for (const join of value.joins) {
1002
- if (!isRecord4(join)) {
1003
- throw new Error("PostHog schema contains a malformed join.");
1004
- }
1005
- }
1006
- return value;
1007
- }
1008
- function validateFields(tableName, fields) {
1009
- for (const [name, value] of Object.entries(fields)) {
1010
- if (!isRecord4(value) || typeof value.name !== "string" || typeof value.hogql_value !== "string" || typeof value.schema_valid !== "boolean" || !FIELD_TYPES.has(value.type)) {
1011
- throw new Error(
1012
- `PostHog schema field ${tableName}.${name} is malformed or has an unknown type.`
1013
- );
1014
- }
1015
- }
1074
+ return response.data;
1016
1075
  }
1017
1076
  function readColumns(tableName, table2) {
1018
1077
  const columns = [];
@@ -1041,10 +1100,10 @@ function readRelationships(joins, tables, views) {
1041
1100
  ])
1042
1101
  );
1043
1102
  return joins.flatMap((join) => {
1044
- const sourceTable = readNonEmptyString2(join.source_table_name);
1045
- const sourceKey = readNonEmptyString2(join.source_table_key);
1046
- const joiningTable = readNonEmptyString2(join.joining_table_name);
1047
- const joiningKey = readNonEmptyString2(join.joining_table_key);
1103
+ const sourceTable = readNonEmptyString(join.source_table_name);
1104
+ const sourceKey = readNonEmptyString(join.source_table_key);
1105
+ const joiningTable = readNonEmptyString(join.joining_table_name);
1106
+ const joiningKey = readNonEmptyString(join.joining_table_key);
1048
1107
  if (!sourceTable || !sourceKey || !joiningTable || !joiningKey || !entityColumns.get(sourceTable)?.has(sourceKey) || !entityColumns.get(joiningTable)?.has(joiningKey)) {
1049
1108
  return [];
1050
1109
  }
@@ -1067,12 +1126,9 @@ function matchesFilter2(name, filter) {
1067
1126
  }
1068
1127
  return filter(name);
1069
1128
  }
1070
- function readNonEmptyString2(value) {
1129
+ function readNonEmptyString(value) {
1071
1130
  return typeof value === "string" && value.length > 0 ? value : void 0;
1072
1131
  }
1073
- function isRecord4(value) {
1074
- return typeof value === "object" && value !== null && !Array.isArray(value);
1075
- }
1076
1132
 
1077
1133
  // packages/text2sql/src/lib/adapters/posthog/transport.ts
1078
1134
  var DEFAULT_TIMEOUT_MS = 45e3;
@@ -1180,7 +1236,7 @@ function createPostHogTransport(options) {
1180
1236
  };
1181
1237
  return {
1182
1238
  async query(request) {
1183
- return await requestJson(`${projectPath}/query/`, {
1239
+ return requestJson(`${projectPath}/query/`, {
1184
1240
  method: "POST",
1185
1241
  body: JSON.stringify(request)
1186
1242
  });
@@ -1248,7 +1304,7 @@ function parseJson(body) {
1248
1304
  }
1249
1305
  }
1250
1306
  function apiError(response, body, accessToken) {
1251
- const record = isRecord5(body) ? body : void 0;
1307
+ const record = isRecord2(body) ? body : void 0;
1252
1308
  const detail = redact(
1253
1309
  readString(record?.detail) ?? readString(record?.error),
1254
1310
  accessToken
@@ -1273,10 +1329,10 @@ function parseRetryAfter(value) {
1273
1329
  return Number.isFinite(date) ? Math.max(0, date - Date.now()) : void 0;
1274
1330
  }
1275
1331
  function asRecord(value, label) {
1276
- if (!isRecord5(value)) throw new Error(`${label} must be a JSON object.`);
1332
+ if (!isRecord2(value)) throw new Error(`${label} must be a JSON object.`);
1277
1333
  return value;
1278
1334
  }
1279
- function isRecord5(value) {
1335
+ function isRecord2(value) {
1280
1336
  return typeof value === "object" && value !== null && !Array.isArray(value);
1281
1337
  }
1282
1338
  function readString(value) {
@@ -1291,10 +1347,16 @@ function info() {
1291
1347
  return () => new PostHogInfoGrounding();
1292
1348
  }
1293
1349
  function schema(config = {}) {
1294
- return (adapter) => new PostHogSchemaGrounding(adapter, config);
1350
+ return groundingFor(
1351
+ PostHog,
1352
+ (adapter) => new PostHogSchemaGrounding(adapter, config)
1353
+ );
1295
1354
  }
1296
1355
  function definitions(config = {}) {
1297
- return (adapter) => new PostHogDefinitionsGrounding(adapter, config);
1356
+ return groundingFor(
1357
+ PostHog,
1358
+ (adapter) => new PostHogDefinitionsGrounding(adapter, config)
1359
+ );
1298
1360
  }
1299
1361
  var posthog_default = {
1300
1362
  PostHog,