@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.
- package/README.md +3 -2
- package/dist/bin/sql.js +57 -32
- package/dist/index.js +793 -498
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +23 -1
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
- package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
- package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.d.ts +6 -13
- package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +244 -51
- package/dist/lib/adapters/bigquery/index.js.map +4 -4
- package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/index.js +133 -44
- package/dist/lib/adapters/clickhouse/index.js.map +4 -4
- package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.d.ts +8 -10
- package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.js +1549 -1412
- package/dist/lib/adapters/duckdb/index.js.map +4 -4
- package/dist/lib/adapters/groundings/index.js.map +1 -1
- package/dist/lib/adapters/groundings/rows.d.ts +32 -0
- package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.d.ts +2 -4
- package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.js +230 -76
- package/dist/lib/adapters/mysql/index.js.map +4 -4
- package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
- package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
- package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.d.ts +2 -4
- package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +266 -487
- package/dist/lib/adapters/postgres/index.js.map +4 -4
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
- package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.d.ts +4 -5
- package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.js +349 -287
- package/dist/lib/adapters/posthog/index.js.map +4 -4
- package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
- package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/types.d.ts +16 -6
- package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +113 -34
- package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/index.js +136 -49
- package/dist/lib/adapters/sqlite/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
- package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +223 -455
- package/dist/lib/adapters/sqlserver/index.js.map +4 -4
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +4 -3
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
- package/dist/lib/checkpoint.d.ts +34 -21
- package/dist/lib/checkpoint.d.ts.map +1 -1
- package/dist/lib/file-cache.d.ts +6 -1
- package/dist/lib/file-cache.d.ts.map +1 -1
- package/dist/lib/fs/columns.d.ts +14 -0
- package/dist/lib/fs/columns.d.ts.map +1 -0
- package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
- package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
- package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
- package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
- package/dist/lib/index-cache.d.ts +4 -3
- package/dist/lib/index-cache.d.ts.map +1 -1
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
- package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
- package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
- package/dist/lib/synthesis/index.js +124 -114
- package/dist/lib/synthesis/index.js.map +4 -4
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
- 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 (!
|
|
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
|
|
738
|
-
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
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
812
|
-
return
|
|
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
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
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
|
-
|
|
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 (
|
|
856
|
-
if (!
|
|
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
|
-
|
|
862
|
-
|
|
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
|
-
|
|
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
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
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 =
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
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
|
-
|
|
1067
|
+
const response = postHogSchemaResponse.safeParse(value);
|
|
1068
|
+
if (!response.success) {
|
|
979
1069
|
throw new Error(
|
|
980
|
-
|
|
1070
|
+
`PostHog DatabaseSchemaQuery response is malformed:
|
|
1071
|
+
${z5.prettifyError(response.error)}`
|
|
981
1072
|
);
|
|
982
1073
|
}
|
|
983
|
-
|
|
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 =
|
|
1045
|
-
const sourceKey =
|
|
1046
|
-
const joiningTable =
|
|
1047
|
-
const joiningKey =
|
|
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
|
|
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
|
|
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 =
|
|
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 (!
|
|
1332
|
+
if (!isRecord2(value)) throw new Error(`${label} must be a JSON object.`);
|
|
1277
1333
|
return value;
|
|
1278
1334
|
}
|
|
1279
|
-
function
|
|
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 (
|
|
1350
|
+
return groundingFor(
|
|
1351
|
+
PostHog,
|
|
1352
|
+
(adapter) => new PostHogSchemaGrounding(adapter, config)
|
|
1353
|
+
);
|
|
1295
1354
|
}
|
|
1296
1355
|
function definitions(config = {}) {
|
|
1297
|
-
return (
|
|
1356
|
+
return groundingFor(
|
|
1357
|
+
PostHog,
|
|
1358
|
+
(adapter) => new PostHogDefinitionsGrounding(adapter, config)
|
|
1359
|
+
);
|
|
1298
1360
|
}
|
|
1299
1361
|
var posthog_default = {
|
|
1300
1362
|
PostHog,
|