@deepagents/text2sql 6.1.0 → 7.0.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 +16 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +2 -2
- package/dist/lib/adapters/adapter.d.ts +1 -0
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +91 -8
- package/dist/lib/adapters/bigquery/index.js.map +3 -3
- package/dist/lib/adapters/clickhouse/index.js +5 -2
- package/dist/lib/adapters/clickhouse/index.js.map +2 -2
- package/dist/lib/adapters/duckdb/duckdb-identifiers.d.ts +8 -0
- package/dist/lib/adapters/duckdb/duckdb-identifiers.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.d.ts +40 -0
- package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts +58 -0
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.sql-policy.d.ts +8 -0
- package/dist/lib/adapters/duckdb/duckdb.sql-policy.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/index.d.ts +34 -0
- package/dist/lib/adapters/duckdb/index.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/index.js +1933 -0
- package/dist/lib/adapters/duckdb/index.js.map +7 -0
- package/dist/lib/adapters/mysql/index.js +91 -8
- package/dist/lib/adapters/mysql/index.js.map +3 -3
- package/dist/lib/adapters/parser-sql-policy.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +91 -8
- package/dist/lib/adapters/postgres/index.js.map +3 -3
- package/dist/lib/adapters/postgres/postgres-parser-workaround.d.ts +8 -0
- package/dist/lib/adapters/postgres/postgres-parser-workaround.d.ts.map +1 -0
- package/dist/lib/adapters/posthog/index.js +18 -4
- package/dist/lib/adapters/posthog/index.js.map +2 -2
- package/dist/lib/adapters/posthog/posthog.d.ts +2 -1
- package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/types.d.ts +2 -0
- package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +91 -8
- package/dist/lib/adapters/spreadsheet/index.js.map +3 -3
- package/dist/lib/adapters/sqlite/index.js +91 -8
- package/dist/lib/adapters/sqlite/index.js.map +3 -3
- package/dist/lib/adapters/sqlserver/index.js +91 -8
- package/dist/lib/adapters/sqlserver/index.js.map +3 -3
- package/dist/lib/agents/question.agent.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/index.js.map +2 -2
- package/package.json +18 -19
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporary workaround for a node-sql-parser 5.4.0 PostgreSQL grammar
|
|
3
|
+
* shortcoming: it rejects valid typed string constants such as
|
|
4
|
+
* `TIMESTAMPTZ 'epoch'`. Remove this module and its parser retry once
|
|
5
|
+
* node-sql-parser supports PostgreSQL typed string constants natively.
|
|
6
|
+
*/
|
|
7
|
+
export declare function recoverPostgresTypedLiteralParserGap(sql: string, error: unknown): string | null;
|
|
8
|
+
//# sourceMappingURL=postgres-parser-workaround.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-parser-workaround.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/postgres-parser-workaround.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,IAAI,CA6Bf"}
|
|
@@ -584,7 +584,7 @@ var Adapter = class {
|
|
|
584
584
|
}
|
|
585
585
|
}
|
|
586
586
|
#decodeShellEscapes(sql) {
|
|
587
|
-
return sql.replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\([()
|
|
587
|
+
return sql.replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\([().*$])/g, "$1").replace(/\\(?=$)/gm, "");
|
|
588
588
|
}
|
|
589
589
|
#cachedAllowedEntities = null;
|
|
590
590
|
async #resolveScope() {
|
|
@@ -605,6 +605,9 @@ var Adapter = class {
|
|
|
605
605
|
return this.validateImpl(decoded);
|
|
606
606
|
}
|
|
607
607
|
async execute(sql) {
|
|
608
|
+
return this.executeImpl(await this.enforceExecutionPolicy(sql));
|
|
609
|
+
}
|
|
610
|
+
async enforceExecutionPolicy(sql) {
|
|
608
611
|
const decoded = this.#decodeShellEscapes(sql);
|
|
609
612
|
const violation = await this.#analyzePolicy(decoded);
|
|
610
613
|
if (violation?.kind === "read-only") {
|
|
@@ -613,7 +616,7 @@ var Adapter = class {
|
|
|
613
616
|
if (violation?.kind === "scope") {
|
|
614
617
|
throw new SQLScopeError(violation.payload);
|
|
615
618
|
}
|
|
616
|
-
return
|
|
619
|
+
return decoded;
|
|
617
620
|
}
|
|
618
621
|
/**
|
|
619
622
|
* Convert unknown database value to number.
|
|
@@ -792,6 +795,13 @@ var PostHog = class extends Adapter {
|
|
|
792
795
|
this.transport = options.transport;
|
|
793
796
|
this.grounding = options.grounding ?? [];
|
|
794
797
|
}
|
|
798
|
+
async execute(sql, values) {
|
|
799
|
+
return this.#execute(
|
|
800
|
+
await this.enforceExecutionPolicy(sql),
|
|
801
|
+
"deepagents_text2sql_execute",
|
|
802
|
+
values
|
|
803
|
+
);
|
|
804
|
+
}
|
|
795
805
|
async executeImpl(sql) {
|
|
796
806
|
return this.#execute(sql, "deepagents_text2sql_execute");
|
|
797
807
|
}
|
|
@@ -816,9 +826,13 @@ var PostHog = class extends Adapter {
|
|
|
816
826
|
async query(request) {
|
|
817
827
|
return this.transport.query(request);
|
|
818
828
|
}
|
|
819
|
-
async #execute(sql, name) {
|
|
829
|
+
async #execute(sql, name, values) {
|
|
820
830
|
const response = await this.transport.query({
|
|
821
|
-
query: {
|
|
831
|
+
query: {
|
|
832
|
+
kind: "HogQLQuery",
|
|
833
|
+
query: sql,
|
|
834
|
+
...values === void 0 ? {} : { values }
|
|
835
|
+
},
|
|
822
836
|
name
|
|
823
837
|
});
|
|
824
838
|
return rowsFromResponse(response);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/adapters/groundings/abstract.grounding.ts", "../../../../src/lib/adapters/posthog/definitions.posthog.grounding.ts", "../../../../src/lib/adapters/posthog/info.posthog.grounding.ts", "../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/agents/exceptions.ts", "../../../../src/lib/fragments/schema.ts", "../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/sql-scope-error.ts", "../../../../src/lib/adapters/posthog/posthog.sql-policy.ts", "../../../../src/lib/adapters/posthog/posthog.ts", "../../../../src/lib/adapters/posthog/schema.posthog.grounding.ts", "../../../../src/lib/adapters/posthog/transport.ts", "../../../../src/lib/adapters/posthog/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Filter, IntrospectionPhase } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\nexport type { AdapterInfo, AdapterInfoProvider, Filter } from '../adapter.ts';\n\n/**\n * Per-entity column filter.\n * Maps entity name (table or view) to a Filter that selects which columns to keep.\n * Entities not listed in the record keep all their columns.\n */\nexport type ColumnsFilter = Record<string, Filter>;\n\n/**\n * Filter a columns array using a Filter.\n * Keeps columns whose name matches the filter.\n */\nexport function filterColumns<T extends { name: string }>(\n columns: T[],\n filter: Filter,\n): T[] {\n if (Array.isArray(filter)) {\n return columns.filter((col) => filter.includes(col.name));\n }\n if (filter instanceof RegExp) {\n return columns.filter((col) => filter.test(col.name));\n }\n return columns.filter((col) => filter(col.name));\n}\n\n/**\n * Apply per-entity column filtering.\n * Returns the entity unchanged if no filter matches its name.\n */\nexport function applyColumnFilter<\n T extends { name: string; columns: { name: string }[] },\n>(entity: T, columnsConfig?: ColumnsFilter): T {\n if (!columnsConfig) return entity;\n const filter = columnsConfig[entity.name];\n if (!filter) return entity;\n return { ...entity, columns: filterColumns(entity.columns, filter) } as T;\n}\n\n/**\n * Abstract base class for database schema groundings.\n *\n * Groundings collect schema metadata into the shared GroundingContext.\n * Fragment generation is centralized in Adapter.introspect().\n */\nexport abstract class AbstractGrounding {\n /**\n * Grounding identifier for debugging/logging.\n */\n name: string;\n phase?: IntrospectionPhase;\n\n constructor(name: string, phase?: IntrospectionPhase) {\n this.name = name;\n this.phase = phase;\n }\n\n /**\n * Execute grounding to populate the shared context.\n * Groundings mutate ctx to add their collected data (tables, views, indexes, etc).\n * Fragment generation happens centrally in Adapter after all groundings complete.\n *\n * @param ctx - Shared context for accumulating schema data\n */\n abstract execute(ctx: GroundingContext): Promise<void>;\n\n /**\n * Populate ctx with the tables/views this grounding makes available for scope\n * resolution. Annotators decorate entities other groundings produced and add\n * no membership, so the default is a no-op; entity-producing groundings\n * override it. This lets scope resolution skip the annotators' metadata scans.\n *\n * @param _ctx - Shared context for accumulating entity membership\n */\n async contributeEntities(_ctx: GroundingContext): Promise<void> {}\n}\n", "import type { ContextFragment, FragmentData } from '@deepagents/context';\n\nimport type { Filter } from '../adapter.ts';\nimport { AbstractGrounding } from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\nimport type { PostHog } from './posthog.ts';\nimport type {\n PostHogEventDefinition,\n PostHogPropertyDefinition,\n PostHogPropertyDefinitionType,\n} from './types.ts';\n\ntype StandardPropertyType = Exclude<PostHogPropertyDefinitionType, 'group'>;\n\nexport interface PostHogDefinitionsGroundingConfig {\n events?: Filter;\n properties?: Filter;\n propertyTypes?: StandardPropertyType[];\n groupTypeIndexes?: number[];\n}\n\nexport class PostHogDefinitionsGrounding extends AbstractGrounding {\n readonly #adapter: PostHog;\n readonly #config: PostHogDefinitionsGroundingConfig;\n\n constructor(\n adapter: PostHog,\n config: PostHogDefinitionsGroundingConfig = {},\n ) {\n super('definitions', 'definitions');\n this.#adapter = adapter;\n this.#config = config;\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n const fragments = (ctx.fragments ??= []);\n const configuredPropertyTypes: StandardPropertyType[] = this.#config\n .propertyTypes ?? ['event', 'person', 'session'];\n const propertyTypes = [\n ...new Set<StandardPropertyType>(configuredPropertyTypes),\n ];\n validatePropertyTypes(propertyTypes);\n const groupTypeIndexes = [...new Set(this.#config.groupTypeIndexes ?? [])];\n if (\n groupTypeIndexes.some((index) => !Number.isInteger(index) || index < 0)\n ) {\n throw new Error(\n 'PostHog groupTypeIndexes must contain non-negative integers.',\n );\n }\n\n const propertyRequests = [\n ...propertyTypes.map(async (type) => ({\n type,\n definitions: await this.#adapter.transport.listPropertyDefinitions({\n type,\n }),\n })),\n ...groupTypeIndexes.map(async (groupTypeIndex) => ({\n type: `group:${groupTypeIndex}`,\n definitions: await this.#adapter.transport.listPropertyDefinitions({\n type: 'group',\n groupTypeIndex,\n }),\n })),\n ];\n const [events, properties] = await Promise.all([\n this.#adapter.transport.listEventDefinitions(),\n Promise.all(propertyRequests),\n ]);\n\n const eventData = readEvents(events, this.#config.events);\n if (eventData.length > 0) {\n fragments.push({ name: 'posthogEvents', data: eventData });\n }\n\n const propertyData: Record<string, FragmentData> = {};\n for (const group of properties) {\n const definitions = readProperties(\n group.definitions,\n this.#config.properties,\n );\n if (definitions.length > 0) propertyData[group.type] = definitions;\n }\n if (Object.keys(propertyData).length > 0) {\n fragments.push({\n name: 'posthogProperties',\n data: propertyData,\n } satisfies ContextFragment);\n }\n }\n}\n\nfunction readEvents(\n values: PostHogEventDefinition[],\n filter?: Filter,\n): FragmentData[] {\n return values\n .map(validateEvent)\n .filter((event) => matchesFilter(event.name, filter))\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((event) =>\n compact({\n name: event.name,\n description: event.description ?? undefined,\n tags: event.tags?.length ? event.tags : undefined,\n verified: event.verified ?? undefined,\n }),\n );\n}\n\nfunction readProperties(\n values: PostHogPropertyDefinition[],\n filter?: Filter,\n): FragmentData[] {\n return values\n .map(validateProperty)\n .filter((property) => matchesFilter(property.name, filter))\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((property) =>\n compact({\n name: property.name,\n description: property.description ?? undefined,\n propertyType: property.property_type ?? undefined,\n numerical: property.is_numerical ?? undefined,\n verified: property.verified ?? undefined,\n }),\n );\n}\n\nfunction validateEvent(value: PostHogEventDefinition): PostHogEventDefinition {\n if (\n !isRecord(value) ||\n !readNonEmptyString(value.name) ||\n !isOptionalString(value.description) ||\n !isOptionalBoolean(value.verified) ||\n !isOptionalStringArray(value.tags)\n ) {\n throw new Error('PostHog returned a malformed event definition.');\n }\n return value;\n}\n\nfunction validateProperty(\n value: PostHogPropertyDefinition,\n): PostHogPropertyDefinition {\n if (\n !isRecord(value) ||\n !readNonEmptyString(value.name) ||\n !isOptionalString(value.description) ||\n !isOptionalString(value.property_type) ||\n !isOptionalBoolean(value.is_numerical) ||\n !isOptionalBoolean(value.verified)\n ) {\n throw new Error('PostHog returned a malformed property definition.');\n }\n return value;\n}\n\nfunction validatePropertyTypes(values: StandardPropertyType[]): void {\n const allowed = new Set<StandardPropertyType>(['event', 'person', 'session']);\n if (values.some((value) => !allowed.has(value))) {\n throw new Error('PostHog propertyTypes contains an unsupported type.');\n }\n}\n\nfunction matchesFilter(name: string, filter?: Filter): boolean {\n if (!filter) return true;\n if (Array.isArray(filter)) return filter.includes(name);\n if (filter instanceof RegExp) {\n filter.lastIndex = 0;\n return filter.test(name);\n }\n return filter(name);\n}\n\nfunction compact(\n value: Record<string, FragmentData | undefined>,\n): Record<string, FragmentData> {\n return Object.fromEntries(\n Object.entries(value).filter((entry) => entry[1] !== undefined),\n ) as Record<string, FragmentData>;\n}\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || value === null || typeof value === 'string';\n}\n\nfunction isOptionalBoolean(value: unknown): boolean {\n return value === undefined || value === null || typeof value === 'boolean';\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n );\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { AbstractGrounding } from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\n\nexport class PostHogInfoGrounding extends AbstractGrounding {\n constructor() {\n super('info', 'info');\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n ctx.info = {\n dialect: 'HogQL',\n details: {\n identifierQuoting:\n 'Use backticks for identifiers that require quoting.',\n propertyAccess:\n 'Use PostHog HogQL property access and the grounded event/person/session property definitions. Do not guess property names.',\n performance:\n 'Prefer bounded time ranges and LIMIT for non-aggregate event queries. OFFSET is not supported by the Query API.',\n execution:\n 'Queries run through PostHog as read-only HogQLQuery nodes, not through a PostgreSQL connection.',\n },\n };\n }\n}\n", "import { type SqlLanguage, format as formatSql } from 'sql-formatter';\n\nimport type { ContextFragment, FragmentObject } from '@deepagents/context';\n\nimport { SQLReadOnlyError, SQLScopeError } from '../agents/exceptions.ts';\nimport {\n column,\n constraint,\n dialectInfo,\n index,\n relationship,\n table,\n view,\n} from '../fragments/schema.ts';\nimport type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport {\n type GroundingContext,\n createGroundingContext,\n} from './groundings/context.ts';\nimport type { View } from './groundings/view.grounding.ts';\nimport {\n type SqlPolicyAnalyzer,\n type SqlPolicyViolation,\n} from './sql-policy.ts';\n\nexport {\n type SqlPolicyAnalyzer,\n type SqlPolicyContext,\n type SqlPolicyViolation,\n} from './sql-policy.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n 'CHECK' | 'UNIQUE' | 'NOT_NULL' | 'DEFAULT' | 'PRIMARY_KEY' | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n}\n\nexport type Relationship = {\n table: string;\n from: string[];\n referenced_table: string;\n to: string[];\n};\n\nexport type TablesFilter = string[] | RegExp;\n\nexport interface Introspection {\n tables: Table[];\n relationships: Relationship[];\n}\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: FragmentObject;\n}\n\nexport type AdapterInfoProvider =\n AdapterInfo | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'info'\n | 'tables'\n | 'views'\n | 'row_counts'\n | 'constraints'\n | 'indexes'\n | 'column_stats'\n | 'column_values'\n | 'low_cardinality'\n | 'relationships'\n | 'definitions';\n\nexport type IntrospectionProgressType =\n 'phase:start' | 'phase:progress' | 'phase:end';\n\nexport interface IntrospectionProgress {\n type: IntrospectionProgressType;\n phase: IntrospectionPhase;\n message: string;\n table?: string;\n current?: number;\n total?: number;\n timestampMs?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport type GroundingFn = (adapter: Adapter) => AbstractGrounding;\n\nexport type ExecuteFunction = (sql: string) => Promise<any> | any;\nexport type ValidateFunction = (\n sql: string,\n) => Promise<string | void> | string | void;\n\nexport abstract class Adapter {\n readonly #policyAnalyzer: SqlPolicyAnalyzer;\n\n /**\n * Injects the strategy that guards validate() and execute().\n */\n protected constructor(policyAnalyzer: SqlPolicyAnalyzer) {\n this.#policyAnalyzer = policyAnalyzer;\n }\n\n abstract grounding: GroundingFn[];\n\n abstract readonly formatterLanguage: SqlLanguage;\n\n /**\n * Default schema name for this database.\n * PostgreSQL: 'public', SQL Server: 'dbo', SQLite: undefined\n */\n abstract readonly defaultSchema: string | undefined;\n\n /**\n * System schemas to exclude from introspection by default.\n */\n abstract readonly systemSchemas: string[];\n\n /**\n * Introspect the database schema and return context fragments.\n *\n * Executes all configured groundings to populate the context, then\n * generates fragments from the complete context data.\n *\n * @param ctx - Optional grounding context for sharing state between groundings\n * @returns Array of context fragments representing the database schema\n */\n async introspect(ctx = createGroundingContext()): Promise<ContextFragment[]> {\n // Phase 1: All groundings populate ctx\n for (const fn of this.grounding) {\n const grounding = fn(this);\n if (grounding.phase) {\n ctx.onProgress({\n type: 'phase:start',\n phase: grounding.phase,\n message: `Starting ${grounding.name} introspection...`,\n });\n }\n try {\n await grounding.execute(ctx);\n } finally {\n if (grounding.phase) {\n ctx.onProgress({\n type: 'phase:end',\n phase: grounding.phase,\n message: `Finished ${grounding.name} introspection.`,\n });\n }\n }\n }\n\n // Phase 2: Generate fragments from complete ctx\n return this.#toSchemaFragments(ctx);\n }\n\n /**\n * Resolve the allowed entity names (tables + views) from grounding config.\n * Asks each grounding to contribute its entities; annotators contribute\n * nothing, so their metadata scans are skipped.\n * Results are NOT cached \u2014 call once and store the result.\n */\n async resolveAllowedEntities(): Promise<string[]> {\n const ctx = createGroundingContext();\n for (const fn of this.grounding) {\n await fn(this).contributeEntities(ctx);\n }\n return [...ctx.tables.map((t) => t.name), ...ctx.views.map((v) => v.name)];\n }\n\n /**\n * Convert complete grounding context to schema fragments.\n * Called after all groundings have populated ctx with data.\n */\n #toSchemaFragments(ctx: GroundingContext): ContextFragment[] {\n const fragments: ContextFragment[] = [];\n\n // Dialect info\n if (ctx.info) {\n fragments.push(\n dialectInfo({\n dialect: ctx.info.dialect,\n version: ctx.info.version,\n database: ctx.info.database,\n details: ctx.info.details,\n }),\n );\n }\n\n // Tables (with all annotations now included)\n for (const t of ctx.tables) {\n fragments.push(this.#tableToFragment(t));\n }\n\n // Views\n for (const v of ctx.views) {\n fragments.push(this.#viewToFragment(v));\n }\n\n // Relationships \u2014 filter out FK columns that were removed by column restriction\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n const tableColumnSets = new Map(\n ctx.tables.map((t) => [t.name, new Set(t.columns.map((c) => c.name))]),\n );\n for (const rel of ctx.relationships) {\n const sourceColumns = tableColumnSets.get(rel.table);\n const targetColumns = tableColumnSets.get(rel.referenced_table);\n if (\n sourceColumns &&\n rel.from.some((column) => !sourceColumns.has(column))\n ) {\n continue;\n }\n if (\n targetColumns &&\n rel.to.some((column) => !targetColumns.has(column))\n ) {\n continue;\n }\n\n const sourceTable = tableMap.get(rel.table);\n const targetTable = tableMap.get(rel.referenced_table);\n fragments.push(\n this.#relationshipToFragment(rel, sourceTable, targetTable),\n );\n }\n\n fragments.push(...(ctx.fragments ?? []));\n\n return fragments;\n }\n\n /**\n * Convert a Table to a table fragment with nested column, index, and constraint fragments.\n */\n #tableToFragment(t: Table): ContextFragment {\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = t.constraints?.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'DEFAULT') ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'FOREIGN_KEY') ??\n []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n // Build column fragments\n const columnFragments = t.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n pk: pkColumns.has(col.name) || undefined,\n fk: fkByColumn.get(col.name),\n unique: uniqueColumns.has(col.name) || undefined,\n notNull: notNullColumns.has(col.name) || undefined,\n default: defaultByColumn.get(col.name),\n indexed: col.isIndexed || undefined,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n // Set of present column names for cascade-cleaning indexes/constraints\n const presentColumns = new Set(t.columns.map((c) => c.name));\n\n // Build index fragments\n const indexFragments = (t.indexes ?? [])\n .filter((idx) =>\n idx.columns.every((column) => presentColumns.has(column)),\n )\n .map((idx) =>\n index({\n name: idx.name,\n columns: idx.columns,\n unique: idx.unique,\n type: idx.type,\n }),\n );\n\n // Build constraint fragments for multi-column UNIQUE and CHECK constraints\n const constraintFragments = (t.constraints ?? [])\n .filter(\n (c) =>\n c.type === 'CHECK' ||\n (c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1),\n )\n .filter(\n (c) =>\n !c.columns?.length ||\n c.columns.every((column) => presentColumns.has(column)),\n )\n .map((c) =>\n constraint({\n name: c.name,\n type: c.type,\n columns: c.columns,\n definition: c.definition,\n }),\n );\n\n return table({\n name: t.name,\n schema: t.schema,\n rowCount: t.rowCount,\n sizeHint: t.sizeHint,\n columns: columnFragments,\n indexes: indexFragments.length > 0 ? indexFragments : undefined,\n constraints:\n constraintFragments.length > 0 ? constraintFragments : undefined,\n });\n }\n\n /**\n * Convert a View to a view fragment with nested column fragments.\n */\n #viewToFragment(v: View): ContextFragment {\n const columnFragments = v.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n return view({\n name: v.name,\n schema: v.schema,\n columns: columnFragments,\n definition: v.definition,\n });\n }\n\n /**\n * Convert a Relationship to a relationship fragment.\n * Infers cardinality from row counts if available.\n */\n #relationshipToFragment(\n rel: Relationship,\n sourceTable?: Table,\n targetTable?: Table,\n ): ContextFragment {\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n\n let cardinality:\n 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many' | undefined;\n\n if (sourceCount != null && targetCount != null && targetCount > 0) {\n const ratio = sourceCount / targetCount;\n if (ratio > 5) {\n cardinality = 'many-to-one';\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = 'one-to-one';\n } else if (ratio < 0.2) {\n cardinality = 'one-to-many';\n }\n }\n\n return relationship({\n from: { table: rel.table, columns: rel.from },\n to: { table: rel.referenced_table, columns: rel.to },\n cardinality,\n });\n }\n format(sql: string): string {\n const decoded = this.#decodeShellEscapes(sql);\n try {\n return formatSql(decoded, { language: this.formatterLanguage });\n } catch {\n return decoded;\n }\n }\n\n #decodeShellEscapes(sql: string): string {\n return sql\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\([().*])/g, '$1')\n .replace(/\\\\(?=$)/gm, '');\n }\n\n #cachedAllowedEntities: string[] | null = null;\n\n async #resolveScope(): Promise<string[]> {\n if (this.#cachedAllowedEntities) return this.#cachedAllowedEntities;\n this.#cachedAllowedEntities = await this.resolveAllowedEntities();\n return this.#cachedAllowedEntities;\n }\n\n async #analyzePolicy(sql: string): Promise<SqlPolicyViolation | null> {\n return this.#policyAnalyzer.analyze(sql, {\n resolveAllowedEntities: () => this.#resolveScope(),\n });\n }\n\n async validate(sql: string): Promise<string | void> {\n const decoded = this.#decodeShellEscapes(sql);\n const violation = await this.#analyzePolicy(decoded);\n if (violation?.kind === 'read-only') return violation.message;\n if (violation?.kind === 'scope') return JSON.stringify(violation.payload);\n return this.validateImpl(decoded);\n }\n\n async execute(sql: string): Promise<any[]> {\n const decoded = this.#decodeShellEscapes(sql);\n const violation = await this.#analyzePolicy(decoded);\n if (violation?.kind === 'read-only') {\n throw new SQLReadOnlyError(violation.message);\n }\n if (violation?.kind === 'scope') {\n throw new SQLScopeError(violation.payload);\n }\n return this.executeImpl(decoded);\n }\n\n abstract executeImpl(sql: string): Promise<any[]> | any[];\n abstract validateImpl(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "const sqlValidationMarker = Symbol('SQLValidationError');\nconst unanswerableSqlMarker = Symbol('UnanswerableSQLError');\nconst sqlScopeMarker = Symbol('SQLScopeError');\nconst sqlReadOnlyMarker = Symbol('SQLReadOnlyError');\n\nexport type SQLScopeErrorType = 'OUT_OF_SCOPE' | 'SQL_SCOPE_PARSE_ERROR';\n\nexport interface SQLScopeErrorPayload {\n error: string;\n error_type: SQLScopeErrorType;\n suggestion: string;\n sql_attempted: string;\n referenced_entities?: string[];\n allowed_entities?: string[];\n parser_dialect?: string;\n parser_error?: string;\n}\n\n/**\n * Error thrown when SQL validation fails.\n */\nexport class SQLValidationError extends Error {\n [sqlValidationMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'SQLValidationError';\n this[sqlValidationMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLValidationError {\n return (\n error instanceof SQLValidationError && error[sqlValidationMarker] === true\n );\n }\n}\n\n/**\n * Error thrown when the question cannot be answered with the given schema.\n */\nexport class UnanswerableSQLError extends Error {\n [unanswerableSqlMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'UnanswerableSQLError';\n this[unanswerableSqlMarker] = true;\n }\n\n static isInstance(error: unknown): error is UnanswerableSQLError {\n return (\n error instanceof UnanswerableSQLError &&\n error[unanswerableSqlMarker] === true\n );\n }\n}\n\n/**\n * Error thrown when a query falls outside the grounded SQL scope.\n */\nexport class SQLScopeError extends Error {\n [sqlScopeMarker]: true;\n readonly payload: SQLScopeErrorPayload;\n readonly errorType: SQLScopeErrorType;\n\n constructor(payload: SQLScopeErrorPayload) {\n super(JSON.stringify(payload));\n this.name = 'SQLScopeError';\n this.payload = payload;\n this.errorType = payload.error_type;\n this[sqlScopeMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLScopeError {\n return error instanceof SQLScopeError && error[sqlScopeMarker] === true;\n }\n}\n\n/**\n * Error thrown when a query is not read-only (does not start with SELECT or WITH).\n */\nexport class SQLReadOnlyError extends Error {\n [sqlReadOnlyMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'SQLReadOnlyError';\n this[sqlReadOnlyMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLReadOnlyError {\n return (\n error instanceof SQLReadOnlyError && error[sqlReadOnlyMarker] === true\n );\n }\n}\n", "import type { ContextFragment, FragmentObject } from '@deepagents/context';\n\n/**\n * Schema fragment builders.\n *\n * These fragments represent database schema metadata that can be injected\n * into AI prompts. Use with renderers (XML, Markdown, TOML, TOON) to format.\n *\n * @example\n * ```ts\n * import { dialectInfo, table, column, relationship } from '@deepagents/text2sql';\n *\n * const schemaFragments = [\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5' }),\n * table({\n * name: 'users',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true }),\n * ],\n * }),\n * ];\n * ```\n */\n\n/**\n * Database dialect and version information.\n *\n * @param input.dialect - Database type (PostgreSQL, SQLite, SQL Server, etc.)\n * @param input.version - Database version string\n * @param input.database - Database name\n *\n * @example\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5', database: 'myapp' })\n */\nexport function dialectInfo(input: {\n dialect: string;\n version?: string;\n database?: string;\n details?: FragmentObject;\n}): ContextFragment {\n return {\n name: 'dialectInfo',\n data: {\n dialect: input.dialect,\n ...(input.version && { version: input.version }),\n ...(input.database && { database: input.database }),\n ...(input.details && { details: input.details }),\n },\n };\n}\n\n/**\n * Database table with columns and optional metadata.\n *\n * @param input.name - Table name\n * @param input.schema - Schema name (e.g., 'public' for PostgreSQL)\n * @param input.rowCount - Approximate row count\n * @param input.sizeHint - Size category for query optimization hints\n * @param input.columns - Array of column() fragments\n * @param input.indexes - Array of index() fragments\n * @param input.constraints - Array of constraint() fragments\n *\n * @example\n * table({\n * name: 'users',\n * rowCount: 1500,\n * sizeHint: 'medium',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true, indexed: true }),\n * ],\n * indexes: [\n * index({ name: 'idx_email', columns: ['email'], unique: true }),\n * ],\n * })\n */\nexport function table(input: {\n name: string;\n schema?: string;\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n columns: ContextFragment[];\n indexes?: ContextFragment[];\n constraints?: ContextFragment[];\n}): ContextFragment {\n return {\n name: 'table',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n ...(input.rowCount != null && { rowCount: input.rowCount }),\n ...(input.sizeHint && { sizeHint: input.sizeHint }),\n columns: input.columns,\n ...(input.indexes?.length && { indexes: input.indexes }),\n ...(input.constraints?.length && { constraints: input.constraints }),\n },\n };\n}\n\n/**\n * Table column with type and annotations.\n *\n * @param input.name - Column name\n * @param input.type - Column data type (e.g., 'integer', 'varchar(255)')\n * @param input.pk - Is primary key\n * @param input.fk - Foreign key reference in \"table.column\" format\n * @param input.unique - Has unique constraint\n * @param input.notNull - Has NOT NULL constraint\n * @param input.default - Default value expression\n * @param input.indexed - Has index on this column\n * @param input.values - Enum or low cardinality values\n * @param input.stats - Column statistics (min, max, null fraction)\n *\n * @example\n * column({\n * name: 'status',\n * type: 'varchar',\n * notNull: true,\n * indexed: true,\n * values: ['active', 'inactive', 'suspended'],\n * })\n */\nexport function column(input: {\n name: string;\n type: string;\n pk?: boolean;\n fk?: string;\n unique?: boolean;\n notNull?: boolean;\n default?: string;\n indexed?: boolean;\n values?: string[];\n stats?: {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n };\n}): ContextFragment {\n return {\n name: 'column',\n data: {\n name: input.name,\n type: input.type,\n ...(input.pk && { pk: true }),\n ...(input.fk && { fk: input.fk }),\n ...(input.unique && { unique: true }),\n ...(input.notNull && { notNull: true }),\n ...(input.default && { default: input.default }),\n ...(input.indexed && { indexed: true }),\n ...(input.values?.length && { values: input.values }),\n ...(input.stats && { stats: input.stats }),\n },\n };\n}\n\n/**\n * Table index.\n *\n * @param input.name - Index name\n * @param input.columns - Columns included in the index\n * @param input.unique - Is unique index\n * @param input.type - Index type (BTREE, HASH, GIN, etc.)\n *\n * @example\n * index({ name: 'idx_user_email', columns: ['email'], unique: true, type: 'BTREE' })\n */\nexport function index(input: {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}): ContextFragment {\n return {\n name: 'index',\n data: {\n name: input.name,\n columns: input.columns,\n ...(input.unique && { unique: true }),\n ...(input.type && { type: input.type }),\n },\n };\n}\n\n/**\n * Table constraint (CHECK, UNIQUE, PRIMARY_KEY, FOREIGN_KEY, etc).\n *\n * @param input.name - Constraint name\n * @param input.type - Constraint type\n * @param input.columns - Columns involved in the constraint\n * @param input.definition - CHECK constraint SQL definition\n * @param input.defaultValue - DEFAULT constraint value\n * @param input.referencedTable - For FK: referenced table name\n * @param input.referencedColumns - For FK: referenced column names\n *\n * @example\n * constraint({\n * name: 'chk_amount_positive',\n * type: 'CHECK',\n * definition: 'amount > 0',\n * })\n *\n * @example\n * constraint({\n * name: 'fk_order_user',\n * type: 'FOREIGN_KEY',\n * columns: ['user_id'],\n * referencedTable: 'users',\n * referencedColumns: ['id'],\n * })\n */\nexport function constraint(input: {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}): ContextFragment {\n return {\n name: 'constraint',\n data: {\n name: input.name,\n type: input.type,\n ...(input.columns?.length && { columns: input.columns }),\n ...(input.definition && { definition: input.definition }),\n ...(input.defaultValue && { defaultValue: input.defaultValue }),\n ...(input.referencedTable && { referencedTable: input.referencedTable }),\n ...(input.referencedColumns?.length && {\n referencedColumns: input.referencedColumns,\n }),\n },\n };\n}\n\n/**\n * Database view.\n *\n * @param input.name - View name\n * @param input.schema - Schema name\n * @param input.columns - Array of column() fragments\n * @param input.definition - View SQL definition\n *\n * @example\n * view({\n * name: 'active_users',\n * columns: [\n * column({ name: 'id', type: 'integer' }),\n * column({ name: 'email', type: 'varchar' }),\n * ],\n * definition: \"SELECT id, email FROM users WHERE status = 'active'\",\n * })\n */\nexport function view(input: {\n name: string;\n schema?: string;\n columns: ContextFragment[];\n definition?: string;\n}): ContextFragment {\n return {\n name: 'view',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n columns: input.columns,\n ...(input.definition && { definition: input.definition }),\n },\n };\n}\n\n/**\n * Relationship between tables (foreign key connection).\n *\n * @param input.from - Source table and columns\n * @param input.to - Referenced table and columns\n * @param input.cardinality - Relationship cardinality\n *\n * @example\n * relationship({\n * from: { table: 'orders', columns: ['user_id'] },\n * to: { table: 'users', columns: ['id'] },\n * cardinality: 'many-to-one',\n * })\n */\nexport function relationship(input: {\n from: { table: string; columns: string[] };\n to: { table: string; columns: string[] };\n cardinality?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';\n}): ContextFragment {\n return {\n name: 'relationship',\n data: {\n from: input.from,\n to: input.to,\n ...(input.cardinality && { cardinality: input.cardinality }),\n },\n };\n}\n", "import type { ContextFragment } from '@deepagents/context';\n\nimport type {\n AdapterInfo,\n ColumnStats,\n OnProgress,\n Relationship,\n Table,\n} from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Adapter-specific fragments contributed during grounding. */\n fragments?: ContextFragment[];\n\n /** Shared cache for cross-grounding deduplication. Keyed by `type:key`. */\n cache: Map<string, unknown>;\n\n /** Progress sink for long-running introspection work. */\n onProgress: OnProgress;\n}\n\nconst noopProgress: OnProgress = () => {};\n\nfunction timestampProgress(onProgress?: OnProgress): OnProgress {\n if (!onProgress) return noopProgress;\n return (progress) => {\n onProgress({\n ...progress,\n timestampMs: progress.timestampMs ?? Date.now(),\n });\n };\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(\n options: { onProgress?: OnProgress } = {},\n): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n fragments: [],\n cache: new Map(),\n onProgress: timestampProgress(options.onProgress),\n };\n}\n", "import type { SQLScopeErrorPayload } from './agents/exceptions.ts';\n\nexport function buildScopeParseErrorPayload(\n sql: string,\n parserDialect: string,\n error: unknown,\n): SQLScopeErrorPayload {\n const parserError =\n error instanceof Error ? error.message : String(error ?? 'Unknown error');\n\n return {\n error: `SQL scope analysis failed before validation/execution: ${parserError}`,\n error_type: 'SQL_SCOPE_PARSE_ERROR',\n suggestion:\n 'Rewrite the query into simpler SQL that can be analyzed safely, or extend parser coverage for this dialect feature.',\n sql_attempted: sql,\n parser_dialect: parserDialect,\n parser_error: parserError,\n };\n}\n", "import type { SQLScopeErrorPayload } from '../../agents/exceptions.ts';\nimport { buildScopeParseErrorPayload } from '../../sql-scope-error.ts';\nimport type {\n SqlPolicyAnalyzer,\n SqlPolicyContext,\n SqlPolicyViolation,\n} from '../sql-policy.ts';\nimport type {\n PostHogMetadataResponse,\n PostHogNotice,\n PostHogTransport,\n} from './types.ts';\n\nexport class PostHogSqlPolicyAnalyzer implements SqlPolicyAnalyzer {\n readonly #transport: PostHogTransport;\n\n constructor(transport: PostHogTransport) {\n this.#transport = transport;\n }\n\n async analyze(\n sql: string,\n context: SqlPolicyContext,\n ): Promise<SqlPolicyViolation | null> {\n const response = await this.#transport.query<PostHogMetadataResponse>({\n query: { kind: 'HogQLMetadata', language: 'hogQL', query: sql },\n name: 'deepagents_text2sql_validate',\n });\n let metadata: PostHogMetadataResponse;\n try {\n metadata = validateMetadataResponse(response);\n } catch (error) {\n return {\n kind: 'scope',\n payload: buildScopeParseErrorPayload(sql, 'hogql', error),\n };\n }\n\n const allowedEntities = await context.resolveAllowedEntities();\n const allowed = new Set(allowedEntities.map(caseFold));\n const rejected = metadata.table_names.filter(\n (entity) => !allowed.has(caseFold(entity)),\n );\n\n return rejected.length > 0\n ? {\n kind: 'scope',\n payload: buildOutOfScopePayload(sql, rejected, [...allowedEntities]),\n }\n : null;\n }\n}\n\nfunction validateMetadataResponse(value: unknown): PostHogMetadataResponse {\n if (!isRecord(value)) {\n throw new Error('PostHog HogQLMetadata response must be a JSON object.');\n }\n if (typeof value.isValid !== 'boolean') {\n throw new Error('PostHog HogQLMetadata response has no isValid boolean.');\n }\n\n const errors = validateNotices(value.errors, 'errors');\n validateNotices(value.warnings, 'warnings');\n validateNotices(value.notices, 'notices');\n const tableNames = validateTableNames(value.table_names);\n\n if (!value.isValid || errors.length > 0) {\n const reason = errors.map((notice) => notice.message).join('; ');\n throw new Error(\n reason\n ? `PostHog rejected the HogQL query: ${reason}`\n : 'PostHog rejected the HogQL query as invalid.',\n );\n }\n\n return {\n isValid: true,\n errors,\n warnings: value.warnings as PostHogNotice[],\n notices: value.notices as PostHogNotice[],\n table_names: tableNames,\n };\n}\n\nfunction validateNotices(value: unknown, name: string): PostHogNotice[] {\n if (!Array.isArray(value)) {\n throw new Error(`PostHog HogQLMetadata response has no ${name} array.`);\n }\n for (const notice of value) {\n if (!isRecord(notice) || typeof notice.message !== 'string') {\n throw new Error(\n `PostHog HogQLMetadata response has an invalid ${name} notice.`,\n );\n }\n }\n return value as PostHogNotice[];\n}\n\nfunction validateTableNames(value: unknown): string[] {\n if (\n !Array.isArray(value) ||\n value.some((name) => typeof name !== 'string' || name.length === 0)\n ) {\n throw new Error('PostHog HogQLMetadata response has invalid table_names.');\n }\n return [...new Set(value)];\n}\n\nfunction buildOutOfScopePayload(\n sql: string,\n referencedEntities: string[],\n allowedEntities: string[],\n): SQLScopeErrorPayload {\n return {\n error: `Query references entities outside grounded scope: ${referencedEntities.join(', ')}`,\n error_type: 'OUT_OF_SCOPE',\n suggestion:\n 'Restrict the query to grounded tables/views or expand grounding to include the referenced entities.',\n sql_attempted: sql,\n referenced_entities: referencedEntities,\n allowed_entities: allowedEntities,\n };\n}\n\nfunction caseFold(value: string): string {\n return value.toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { Adapter, type GroundingFn } from '../adapter.ts';\nimport { PostHogSqlPolicyAnalyzer } from './posthog.sql-policy.ts';\nimport type {\n PostHogQueryRequest,\n PostHogQueryResponse,\n PostHogTransport,\n} from './types.ts';\n\nexport interface PostHogAdapterOptions {\n transport: PostHogTransport;\n grounding?: GroundingFn[];\n}\n\nexport class PostHog extends Adapter {\n readonly transport: PostHogTransport;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema = undefined;\n override readonly systemSchemas = ['system'];\n override readonly formatterLanguage = 'clickhouse';\n\n constructor(options: PostHogAdapterOptions) {\n if (!options?.transport || typeof options.transport.query !== 'function') {\n throw new Error('PostHog adapter requires a transport.');\n }\n if (\n typeof options.transport.listEventDefinitions !== 'function' ||\n typeof options.transport.listPropertyDefinitions !== 'function'\n ) {\n throw new Error(\n 'PostHog transport must provide event and property definition methods.',\n );\n }\n\n super(new PostHogSqlPolicyAnalyzer(options.transport));\n this.transport = options.transport;\n this.grounding = options.grounding ?? [];\n }\n\n override async executeImpl(sql: string): Promise<Record<string, unknown>[]> {\n return this.#execute(sql, 'deepagents_text2sql_execute');\n }\n\n override validateImpl(): undefined {\n return undefined;\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n return (await this.#execute(sql, 'deepagents_text2sql_grounding')) as Row[];\n }\n\n override quoteIdentifier(name: string): string {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const { schema, table } = this.parseTableName(tableName);\n const relation = schema\n ? `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`\n : this.quoteIdentifier(table);\n const projection = columns?.length\n ? columns.map((column) => this.quoteIdentifier(column)).join(', ')\n : '*';\n return `SELECT ${projection} FROM ${relation} LIMIT ${limit}`;\n }\n\n async query<T>(request: PostHogQueryRequest): Promise<T> {\n return this.transport.query<T>(request);\n }\n\n async #execute(\n sql: string,\n name: string,\n ): Promise<Record<string, unknown>[]> {\n const response = await this.transport.query<PostHogQueryResponse>({\n query: { kind: 'HogQLQuery', query: sql },\n name,\n });\n return rowsFromResponse(response);\n }\n}\n\nfunction rowsFromResponse(value: unknown): Record<string, unknown>[] {\n if (!isRecord(value) || !Array.isArray(value.results)) {\n throw new Error('PostHog HogQLQuery response has no results array.');\n }\n if (\n value.columns !== undefined &&\n (!Array.isArray(value.columns) ||\n value.columns.some(\n (column) => typeof column !== 'string' || column.length === 0,\n ))\n ) {\n throw new Error('PostHog HogQLQuery response has invalid columns.');\n }\n if (\n Array.isArray(value.columns) &&\n new Set(value.columns).size !== value.columns.length\n ) {\n throw new Error(\n 'PostHog HogQLQuery response contains duplicate column names; alias every selected expression uniquely.',\n );\n }\n if (value.results.length === 0) return [];\n if (!Array.isArray(value.columns)) {\n throw new Error(\n 'PostHog HogQLQuery response requires columns for non-empty results.',\n );\n }\n\n const columns = value.columns as string[];\n return value.results.map((row, index) => {\n if (!Array.isArray(row) || row.length !== columns.length) {\n throw new Error(\n `PostHog HogQLQuery result row ${index} does not match the column count.`,\n );\n }\n return Object.fromEntries(\n columns.map((column, columnIndex) => [column, row[columnIndex]]),\n );\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type { Filter, Relationship, Table } from '../adapter.ts';\nimport {\n AbstractGrounding,\n type ColumnsFilter,\n applyColumnFilter,\n} from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\nimport type { View } from '../groundings/view.grounding.ts';\nimport type { PostHog } from './posthog.ts';\nimport type {\n PostHogDatabaseFieldType,\n PostHogDatabaseTable,\n PostHogDatabaseTableType,\n PostHogSchemaJoin,\n PostHogSchemaResponse,\n} from './types.ts';\n\nconst SCALAR_FIELD_TYPES = new Set<PostHogDatabaseFieldType>([\n 'integer',\n 'float',\n 'decimal',\n 'string',\n 'datetime',\n 'date',\n 'boolean',\n 'array',\n 'json',\n]);\n\nconst FIELD_TYPES = new Set<PostHogDatabaseFieldType>([\n ...SCALAR_FIELD_TYPES,\n 'lazy_table',\n 'virtual_table',\n 'field_traverser',\n 'expression',\n 'view',\n 'materialized_view',\n 'unknown',\n]);\n\nconst TABLE_TYPES = new Set<PostHogDatabaseTableType>([\n 'posthog',\n 'system',\n 'data_warehouse',\n 'view',\n 'batch_export',\n 'materialized_view',\n 'managed_view',\n 'endpoint',\n]);\n\nconst VIEW_TYPES = new Set<PostHogDatabaseTableType>([\n 'view',\n 'materialized_view',\n 'managed_view',\n 'endpoint',\n]);\n\nexport interface PostHogSchemaGroundingConfig {\n filter?: Filter;\n columns?: ColumnsFilter;\n includeSystem?: boolean;\n}\n\nexport class PostHogSchemaGrounding extends AbstractGrounding {\n readonly #adapter: PostHog;\n readonly #config: PostHogSchemaGroundingConfig;\n\n constructor(adapter: PostHog, config: PostHogSchemaGroundingConfig = {}) {\n super('schema', 'tables');\n this.#adapter = adapter;\n this.#config = config;\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n const response = validateSchemaResponse(\n await this.#adapter.query<PostHogSchemaResponse>({\n query: { kind: 'DatabaseSchemaQuery' },\n name: 'deepagents_text2sql_schema',\n }),\n );\n const entities = Object.entries(response.tables).filter(\n ([name, table]) =>\n (this.#config.includeSystem || table.type !== 'system') &&\n matchesFilter(name, this.#config.filter),\n );\n\n const tables: Table[] = [];\n const views: View[] = [];\n for (const [index, [name, table]] of entities.entries()) {\n ctx.onProgress({\n type: 'phase:progress',\n phase: 'tables',\n table: name,\n message: `Loading PostHog schema entity ${name}...`,\n current: index + 1,\n total: entities.length,\n });\n const columns = readColumns(name, table);\n if (VIEW_TYPES.has(table.type)) {\n views.push(\n applyColumnFilter(\n {\n name,\n columns,\n ...(table.query?.query ? { definition: table.query.query } : {}),\n },\n this.#config.columns,\n ),\n );\n } else {\n tables.push(\n applyColumnFilter(\n {\n name,\n columns,\n ...(typeof table.row_count === 'number'\n ? { rowCount: table.row_count }\n : {}),\n },\n this.#config.columns,\n ),\n );\n }\n }\n\n ctx.tables.push(...tables);\n ctx.views.push(...views);\n ctx.relationships.push(...readRelationships(response.joins, tables, views));\n }\n\n override async contributeEntities(ctx: GroundingContext): Promise<void> {\n await this.execute(ctx);\n }\n}\n\nfunction validateSchemaResponse(value: unknown): PostHogSchemaResponse {\n if (\n !isRecord(value) ||\n !isRecord(value.tables) ||\n !Array.isArray(value.joins)\n ) {\n throw new Error(\n 'PostHog DatabaseSchemaQuery response must contain tables and joins.',\n );\n }\n\n for (const [name, valueTable] of Object.entries(value.tables)) {\n if (!isRecord(valueTable)) {\n throw new Error(`PostHog schema table ${name} must be an object.`);\n }\n if (!TABLE_TYPES.has(valueTable.type as PostHogDatabaseTableType)) {\n throw new Error(`PostHog schema table ${name} has an unknown type.`);\n }\n if (\n typeof valueTable.id !== 'string' ||\n typeof valueTable.name !== 'string' ||\n !isRecord(valueTable.fields)\n ) {\n throw new Error(`PostHog schema table ${name} is malformed.`);\n }\n if (\n valueTable.row_count !== undefined &&\n valueTable.row_count !== null &&\n (typeof valueTable.row_count !== 'number' ||\n !Number.isFinite(valueTable.row_count) ||\n valueTable.row_count < 0)\n ) {\n throw new Error(`PostHog schema table ${name} has an invalid row_count.`);\n }\n if (\n VIEW_TYPES.has(valueTable.type as PostHogDatabaseTableType) &&\n (!isRecord(valueTable.query) ||\n typeof valueTable.query.query !== 'string')\n ) {\n throw new Error(`PostHog schema view ${name} has an invalid query.`);\n }\n validateFields(name, valueTable.fields);\n }\n for (const join of value.joins) {\n if (!isRecord(join)) {\n throw new Error('PostHog schema contains a malformed join.');\n }\n }\n\n return value as unknown as PostHogSchemaResponse;\n}\n\nfunction validateFields(\n tableName: string,\n fields: Record<string, unknown>,\n): void {\n for (const [name, value] of Object.entries(fields)) {\n if (\n !isRecord(value) ||\n typeof value.name !== 'string' ||\n typeof value.hogql_value !== 'string' ||\n typeof value.schema_valid !== 'boolean' ||\n !FIELD_TYPES.has(value.type as PostHogDatabaseFieldType)\n ) {\n throw new Error(\n `PostHog schema field ${tableName}.${name} is malformed or has an unknown type.`,\n );\n }\n }\n}\n\nfunction readColumns(\n tableName: string,\n table: PostHogDatabaseTable,\n): Array<{ name: string; type: string }> {\n const columns: Array<{ name: string; type: string }> = [];\n const names = new Set<string>();\n for (const field of Object.values(table.fields)) {\n if (!field.schema_valid || !SCALAR_FIELD_TYPES.has(field.type)) continue;\n const name = field.hogql_value.trim();\n if (!name) {\n throw new Error(`PostHog schema table ${tableName} has an empty field.`);\n }\n if (names.has(name)) {\n throw new Error(\n `PostHog schema table ${tableName} has duplicate HogQL field ${name}.`,\n );\n }\n names.add(name);\n columns.push({ name, type: field.type });\n }\n return columns;\n}\n\nfunction readRelationships(\n joins: PostHogSchemaJoin[],\n tables: Table[],\n views: View[],\n): Relationship[] {\n const entityColumns = new Map(\n [...tables, ...views].map((entity) => [\n entity.name,\n new Set(entity.columns.map((column) => column.name)),\n ]),\n );\n return joins.flatMap((join) => {\n const sourceTable = readNonEmptyString(join.source_table_name);\n const sourceKey = readNonEmptyString(join.source_table_key);\n const joiningTable = readNonEmptyString(join.joining_table_name);\n const joiningKey = readNonEmptyString(join.joining_table_key);\n if (\n !sourceTable ||\n !sourceKey ||\n !joiningTable ||\n !joiningKey ||\n !entityColumns.get(sourceTable)?.has(sourceKey) ||\n !entityColumns.get(joiningTable)?.has(joiningKey)\n ) {\n return [];\n }\n return [\n {\n table: sourceTable,\n from: [sourceKey],\n referenced_table: joiningTable,\n to: [joiningKey],\n },\n ];\n });\n}\n\nfunction matchesFilter(name: string, filter?: Filter): boolean {\n if (!filter) return true;\n if (Array.isArray(filter)) return filter.includes(name);\n if (filter instanceof RegExp) {\n filter.lastIndex = 0;\n return filter.test(name);\n }\n return filter(name);\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type {\n CreatePostHogTransportOptions,\n PostHogEventDefinition,\n PostHogPropertyDefinition,\n PostHogPropertyDefinitionType,\n PostHogQueryRequest,\n PostHogTransport,\n} from './types.ts';\n\nconst DEFAULT_TIMEOUT_MS = 45_000;\nconst PAGE_SIZE = 100;\n\nexport class PostHogApiError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly detail?: string;\n readonly retryAfterMs?: number;\n\n constructor(options: {\n status: number;\n message: string;\n code?: string;\n detail?: string;\n retryAfterMs?: number;\n }) {\n super(options.message);\n this.name = 'PostHogApiError';\n this.status = options.status;\n this.code = options.code;\n this.detail = options.detail;\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\nexport function createPostHogTransport(\n options: CreatePostHogTransportOptions,\n): PostHogTransport {\n const origin = parseOrigin(options.host);\n const projectId = String(options.projectId ?? '').trim();\n if (!projectId) throw new Error('PostHog transport requires a projectId.');\n if (typeof options.getAccessToken !== 'function') {\n throw new Error('PostHog transport requires getAccessToken().');\n }\n\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new Error('PostHog transport requires a fetch implementation.');\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error('PostHog transport timeoutMs must be a positive integer.');\n }\n\n const projectPath = `/api/projects/${encodeURIComponent(projectId)}`;\n\n const requestJson = async (\n path: string,\n init: Omit<RequestInit, 'headers' | 'redirect' | 'signal'> = {},\n ): Promise<unknown> => {\n const token = String(await options.getAccessToken()).trim();\n if (!token) throw new Error('PostHog getAccessToken() returned no token.');\n\n const signal = AbortSignal.timeout(timeoutMs);\n let response: Response;\n try {\n response = await fetchImpl(new URL(path, origin), {\n ...init,\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n ...(init.body === undefined\n ? {}\n : { 'Content-Type': 'application/json' }),\n },\n redirect: 'error',\n signal,\n });\n } catch {\n if (signal.aborted) {\n throw new Error(`PostHog request timed out after ${timeoutMs}ms.`);\n }\n throw new Error('PostHog request failed before receiving a response.');\n }\n\n let body: string;\n try {\n body = await response.text();\n } catch {\n if (signal.aborted) {\n throw new Error(`PostHog request timed out after ${timeoutMs}ms.`);\n }\n throw new Error('PostHog response body could not be read.');\n }\n const parsed = parseJson(body);\n if (!response.ok) {\n throw apiError(response, parsed, token);\n }\n if (parsed === undefined) {\n throw new Error('PostHog returned an empty or non-JSON response.');\n }\n return parsed;\n };\n\n const listDefinitions = async <T>(\n resource: 'event_definitions' | 'property_definitions',\n parameters: URLSearchParams,\n ): Promise<T[]> => {\n const definitions: T[] = [];\n let offset = 0;\n\n for (;;) {\n const pageParameters = new URLSearchParams(parameters);\n pageParameters.set('limit', String(PAGE_SIZE));\n pageParameters.set('offset', String(offset));\n const page = asRecord(\n await requestJson(\n `${projectPath}/${resource}/?${pageParameters.toString()}`,\n ),\n `PostHog ${resource} response`,\n );\n if (!Array.isArray(page.results)) {\n throw new Error(`PostHog ${resource} response has no results array.`);\n }\n if (page.next !== null && typeof page.next !== 'string') {\n throw new Error(\n `PostHog ${resource} response has an invalid next page.`,\n );\n }\n\n definitions.push(...(page.results as T[]));\n if (page.next === null) return definitions;\n if (page.results.length === 0) {\n throw new Error(\n `PostHog ${resource} returned an empty non-final page.`,\n );\n }\n offset += page.results.length;\n }\n };\n\n return {\n async query<T>(request: PostHogQueryRequest): Promise<T> {\n return (await requestJson(`${projectPath}/query/`, {\n method: 'POST',\n body: JSON.stringify(request),\n })) as T;\n },\n\n listEventDefinitions(): Promise<PostHogEventDefinition[]> {\n return listDefinitions(\n 'event_definitions',\n new URLSearchParams({\n exclude_hidden: 'true',\n exclude_stale: 'true',\n }),\n );\n },\n\n listPropertyDefinitions({\n type,\n groupTypeIndex,\n }: {\n type: PostHogPropertyDefinitionType;\n groupTypeIndex?: number;\n }): Promise<PostHogPropertyDefinition[]> {\n if (\n type === 'group' &&\n (groupTypeIndex === undefined ||\n !Number.isInteger(groupTypeIndex) ||\n groupTypeIndex < 0)\n ) {\n throw new Error(\n 'PostHog group property definitions require a non-negative integer groupTypeIndex.',\n );\n }\n const parameters = new URLSearchParams({\n type,\n exclude_hidden: 'true',\n exclude_restricted: 'true',\n });\n if (type === 'group') {\n parameters.set('group_type_index', String(groupTypeIndex));\n }\n return listDefinitions('property_definitions', parameters);\n },\n };\n}\n\nfunction parseOrigin(host: string): URL {\n let url: URL;\n try {\n url = new URL(host);\n } catch {\n throw new Error('PostHog host must be an absolute URL.');\n }\n\n const isLoopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && isLoopback)) {\n throw new Error(\n 'PostHog host must use HTTPS except for loopback development hosts.',\n );\n }\n if (url.username || url.password || url.search || url.hash) {\n throw new Error(\n 'PostHog host must be an origin without credentials or query data.',\n );\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('PostHog host must not include a path.');\n }\n url.pathname = '/';\n return url;\n}\n\nfunction parseJson(body: string): unknown | undefined {\n if (!body.trim()) return undefined;\n try {\n return JSON.parse(body);\n } catch {\n return undefined;\n }\n}\n\nfunction apiError(\n response: Response,\n body: unknown,\n accessToken: string,\n): PostHogApiError {\n const record = isRecord(body) ? body : undefined;\n const detail = redact(\n readString(record?.detail) ?? readString(record?.error),\n accessToken,\n );\n const code = redact(readString(record?.code), accessToken);\n const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'));\n return new PostHogApiError({\n status: response.status,\n message: detail\n ? `PostHog API returned ${response.status}: ${detail}`\n : `PostHog API returned HTTP ${response.status}.`,\n code,\n detail,\n retryAfterMs,\n });\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) {\n return seconds >= 0 ? seconds * 1_000 : undefined;\n }\n const date = Date.parse(value);\n return Number.isFinite(date) ? Math.max(0, date - Date.now()) : undefined;\n}\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be a JSON object.`);\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction redact(value: string | undefined, secret: string): string | undefined {\n return value?.replaceAll(secret, '[REDACTED]');\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n PostHogDefinitionsGrounding,\n type PostHogDefinitionsGroundingConfig,\n} from './definitions.posthog.grounding.ts';\nimport { PostHogInfoGrounding } from './info.posthog.grounding.ts';\nimport { PostHog } from './posthog.ts';\nimport {\n PostHogSchemaGrounding,\n type PostHogSchemaGroundingConfig,\n} from './schema.posthog.grounding.ts';\n\nexport * from './definitions.posthog.grounding.ts';\nexport * from './posthog.sql-policy.ts';\nexport * from './posthog.ts';\nexport * from './schema.posthog.grounding.ts';\nexport * from './transport.ts';\nexport * from './types.ts';\n\nexport function info() {\n return () => new PostHogInfoGrounding();\n}\n\nexport function schema(config: PostHogSchemaGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new PostHogSchemaGrounding(adapter as PostHog, config);\n}\n\nexport function definitions(config: PostHogDefinitionsGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new PostHogDefinitionsGrounding(adapter as PostHog, config);\n}\n\nexport default {\n PostHog,\n definitions,\n info,\n schema,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Filter, IntrospectionPhase } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\nexport type { AdapterInfo, AdapterInfoProvider, Filter } from '../adapter.ts';\n\n/**\n * Per-entity column filter.\n * Maps entity name (table or view) to a Filter that selects which columns to keep.\n * Entities not listed in the record keep all their columns.\n */\nexport type ColumnsFilter = Record<string, Filter>;\n\n/**\n * Filter a columns array using a Filter.\n * Keeps columns whose name matches the filter.\n */\nexport function filterColumns<T extends { name: string }>(\n columns: T[],\n filter: Filter,\n): T[] {\n if (Array.isArray(filter)) {\n return columns.filter((col) => filter.includes(col.name));\n }\n if (filter instanceof RegExp) {\n return columns.filter((col) => filter.test(col.name));\n }\n return columns.filter((col) => filter(col.name));\n}\n\n/**\n * Apply per-entity column filtering.\n * Returns the entity unchanged if no filter matches its name.\n */\nexport function applyColumnFilter<\n T extends { name: string; columns: { name: string }[] },\n>(entity: T, columnsConfig?: ColumnsFilter): T {\n if (!columnsConfig) return entity;\n const filter = columnsConfig[entity.name];\n if (!filter) return entity;\n return { ...entity, columns: filterColumns(entity.columns, filter) } as T;\n}\n\n/**\n * Abstract base class for database schema groundings.\n *\n * Groundings collect schema metadata into the shared GroundingContext.\n * Fragment generation is centralized in Adapter.introspect().\n */\nexport abstract class AbstractGrounding {\n /**\n * Grounding identifier for debugging/logging.\n */\n name: string;\n phase?: IntrospectionPhase;\n\n constructor(name: string, phase?: IntrospectionPhase) {\n this.name = name;\n this.phase = phase;\n }\n\n /**\n * Execute grounding to populate the shared context.\n * Groundings mutate ctx to add their collected data (tables, views, indexes, etc).\n * Fragment generation happens centrally in Adapter after all groundings complete.\n *\n * @param ctx - Shared context for accumulating schema data\n */\n abstract execute(ctx: GroundingContext): Promise<void>;\n\n /**\n * Populate ctx with the tables/views this grounding makes available for scope\n * resolution. Annotators decorate entities other groundings produced and add\n * no membership, so the default is a no-op; entity-producing groundings\n * override it. This lets scope resolution skip the annotators' metadata scans.\n *\n * @param _ctx - Shared context for accumulating entity membership\n */\n async contributeEntities(_ctx: GroundingContext): Promise<void> {}\n}\n", "import type { ContextFragment, FragmentData } from '@deepagents/context';\n\nimport type { Filter } from '../adapter.ts';\nimport { AbstractGrounding } from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\nimport type { PostHog } from './posthog.ts';\nimport type {\n PostHogEventDefinition,\n PostHogPropertyDefinition,\n PostHogPropertyDefinitionType,\n} from './types.ts';\n\ntype StandardPropertyType = Exclude<PostHogPropertyDefinitionType, 'group'>;\n\nexport interface PostHogDefinitionsGroundingConfig {\n events?: Filter;\n properties?: Filter;\n propertyTypes?: StandardPropertyType[];\n groupTypeIndexes?: number[];\n}\n\nexport class PostHogDefinitionsGrounding extends AbstractGrounding {\n readonly #adapter: PostHog;\n readonly #config: PostHogDefinitionsGroundingConfig;\n\n constructor(\n adapter: PostHog,\n config: PostHogDefinitionsGroundingConfig = {},\n ) {\n super('definitions', 'definitions');\n this.#adapter = adapter;\n this.#config = config;\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n const fragments = (ctx.fragments ??= []);\n const configuredPropertyTypes: StandardPropertyType[] = this.#config\n .propertyTypes ?? ['event', 'person', 'session'];\n const propertyTypes = [\n ...new Set<StandardPropertyType>(configuredPropertyTypes),\n ];\n validatePropertyTypes(propertyTypes);\n const groupTypeIndexes = [...new Set(this.#config.groupTypeIndexes ?? [])];\n if (\n groupTypeIndexes.some((index) => !Number.isInteger(index) || index < 0)\n ) {\n throw new Error(\n 'PostHog groupTypeIndexes must contain non-negative integers.',\n );\n }\n\n const propertyRequests = [\n ...propertyTypes.map(async (type) => ({\n type,\n definitions: await this.#adapter.transport.listPropertyDefinitions({\n type,\n }),\n })),\n ...groupTypeIndexes.map(async (groupTypeIndex) => ({\n type: `group:${groupTypeIndex}`,\n definitions: await this.#adapter.transport.listPropertyDefinitions({\n type: 'group',\n groupTypeIndex,\n }),\n })),\n ];\n const [events, properties] = await Promise.all([\n this.#adapter.transport.listEventDefinitions(),\n Promise.all(propertyRequests),\n ]);\n\n const eventData = readEvents(events, this.#config.events);\n if (eventData.length > 0) {\n fragments.push({ name: 'posthogEvents', data: eventData });\n }\n\n const propertyData: Record<string, FragmentData> = {};\n for (const group of properties) {\n const definitions = readProperties(\n group.definitions,\n this.#config.properties,\n );\n if (definitions.length > 0) propertyData[group.type] = definitions;\n }\n if (Object.keys(propertyData).length > 0) {\n fragments.push({\n name: 'posthogProperties',\n data: propertyData,\n } satisfies ContextFragment);\n }\n }\n}\n\nfunction readEvents(\n values: PostHogEventDefinition[],\n filter?: Filter,\n): FragmentData[] {\n return values\n .map(validateEvent)\n .filter((event) => matchesFilter(event.name, filter))\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((event) =>\n compact({\n name: event.name,\n description: event.description ?? undefined,\n tags: event.tags?.length ? event.tags : undefined,\n verified: event.verified ?? undefined,\n }),\n );\n}\n\nfunction readProperties(\n values: PostHogPropertyDefinition[],\n filter?: Filter,\n): FragmentData[] {\n return values\n .map(validateProperty)\n .filter((property) => matchesFilter(property.name, filter))\n .toSorted((left, right) => left.name.localeCompare(right.name))\n .map((property) =>\n compact({\n name: property.name,\n description: property.description ?? undefined,\n propertyType: property.property_type ?? undefined,\n numerical: property.is_numerical ?? undefined,\n verified: property.verified ?? undefined,\n }),\n );\n}\n\nfunction validateEvent(value: PostHogEventDefinition): PostHogEventDefinition {\n if (\n !isRecord(value) ||\n !readNonEmptyString(value.name) ||\n !isOptionalString(value.description) ||\n !isOptionalBoolean(value.verified) ||\n !isOptionalStringArray(value.tags)\n ) {\n throw new Error('PostHog returned a malformed event definition.');\n }\n return value;\n}\n\nfunction validateProperty(\n value: PostHogPropertyDefinition,\n): PostHogPropertyDefinition {\n if (\n !isRecord(value) ||\n !readNonEmptyString(value.name) ||\n !isOptionalString(value.description) ||\n !isOptionalString(value.property_type) ||\n !isOptionalBoolean(value.is_numerical) ||\n !isOptionalBoolean(value.verified)\n ) {\n throw new Error('PostHog returned a malformed property definition.');\n }\n return value;\n}\n\nfunction validatePropertyTypes(values: StandardPropertyType[]): void {\n const allowed = new Set<StandardPropertyType>(['event', 'person', 'session']);\n if (values.some((value) => !allowed.has(value))) {\n throw new Error('PostHog propertyTypes contains an unsupported type.');\n }\n}\n\nfunction matchesFilter(name: string, filter?: Filter): boolean {\n if (!filter) return true;\n if (Array.isArray(filter)) return filter.includes(name);\n if (filter instanceof RegExp) {\n filter.lastIndex = 0;\n return filter.test(name);\n }\n return filter(name);\n}\n\nfunction compact(\n value: Record<string, FragmentData | undefined>,\n): Record<string, FragmentData> {\n return Object.fromEntries(\n Object.entries(value).filter((entry) => entry[1] !== undefined),\n ) as Record<string, FragmentData>;\n}\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || value === null || typeof value === 'string';\n}\n\nfunction isOptionalBoolean(value: unknown): boolean {\n return value === undefined || value === null || typeof value === 'boolean';\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n );\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { AbstractGrounding } from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\n\nexport class PostHogInfoGrounding extends AbstractGrounding {\n constructor() {\n super('info', 'info');\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n ctx.info = {\n dialect: 'HogQL',\n details: {\n identifierQuoting:\n 'Use backticks for identifiers that require quoting.',\n propertyAccess:\n 'Use PostHog HogQL property access and the grounded event/person/session property definitions. Do not guess property names.',\n performance:\n 'Prefer bounded time ranges and LIMIT for non-aggregate event queries. OFFSET is not supported by the Query API.',\n execution:\n 'Queries run through PostHog as read-only HogQLQuery nodes, not through a PostgreSQL connection.',\n },\n };\n }\n}\n", "import { type SqlLanguage, format as formatSql } from 'sql-formatter';\n\nimport type { ContextFragment, FragmentObject } from '@deepagents/context';\n\nimport { SQLReadOnlyError, SQLScopeError } from '../agents/exceptions.ts';\nimport {\n column,\n constraint,\n dialectInfo,\n index,\n relationship,\n table,\n view,\n} from '../fragments/schema.ts';\nimport type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport {\n type GroundingContext,\n createGroundingContext,\n} from './groundings/context.ts';\nimport type { View } from './groundings/view.grounding.ts';\nimport {\n type SqlPolicyAnalyzer,\n type SqlPolicyViolation,\n} from './sql-policy.ts';\n\nexport {\n type SqlPolicyAnalyzer,\n type SqlPolicyContext,\n type SqlPolicyViolation,\n} from './sql-policy.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n 'CHECK' | 'UNIQUE' | 'NOT_NULL' | 'DEFAULT' | 'PRIMARY_KEY' | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n}\n\nexport type Relationship = {\n table: string;\n from: string[];\n referenced_table: string;\n to: string[];\n};\n\nexport type TablesFilter = string[] | RegExp;\n\nexport interface Introspection {\n tables: Table[];\n relationships: Relationship[];\n}\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: FragmentObject;\n}\n\nexport type AdapterInfoProvider =\n AdapterInfo | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'info'\n | 'tables'\n | 'views'\n | 'row_counts'\n | 'constraints'\n | 'indexes'\n | 'column_stats'\n | 'column_values'\n | 'low_cardinality'\n | 'relationships'\n | 'definitions';\n\nexport type IntrospectionProgressType =\n 'phase:start' | 'phase:progress' | 'phase:end';\n\nexport interface IntrospectionProgress {\n type: IntrospectionProgressType;\n phase: IntrospectionPhase;\n message: string;\n table?: string;\n current?: number;\n total?: number;\n timestampMs?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport type GroundingFn = (adapter: Adapter) => AbstractGrounding;\n\nexport type ExecuteFunction = (sql: string) => Promise<any> | any;\nexport type ValidateFunction = (\n sql: string,\n) => Promise<string | void> | string | void;\n\nexport abstract class Adapter {\n readonly #policyAnalyzer: SqlPolicyAnalyzer;\n\n /**\n * Injects the strategy that guards validate() and execute().\n */\n protected constructor(policyAnalyzer: SqlPolicyAnalyzer) {\n this.#policyAnalyzer = policyAnalyzer;\n }\n\n abstract grounding: GroundingFn[];\n\n abstract readonly formatterLanguage: SqlLanguage;\n\n /**\n * Default schema name for this database.\n * PostgreSQL: 'public', SQL Server: 'dbo', SQLite: undefined\n */\n abstract readonly defaultSchema: string | undefined;\n\n /**\n * System schemas to exclude from introspection by default.\n */\n abstract readonly systemSchemas: string[];\n\n /**\n * Introspect the database schema and return context fragments.\n *\n * Executes all configured groundings to populate the context, then\n * generates fragments from the complete context data.\n *\n * @param ctx - Optional grounding context for sharing state between groundings\n * @returns Array of context fragments representing the database schema\n */\n async introspect(ctx = createGroundingContext()): Promise<ContextFragment[]> {\n // Phase 1: All groundings populate ctx\n for (const fn of this.grounding) {\n const grounding = fn(this);\n if (grounding.phase) {\n ctx.onProgress({\n type: 'phase:start',\n phase: grounding.phase,\n message: `Starting ${grounding.name} introspection...`,\n });\n }\n try {\n await grounding.execute(ctx);\n } finally {\n if (grounding.phase) {\n ctx.onProgress({\n type: 'phase:end',\n phase: grounding.phase,\n message: `Finished ${grounding.name} introspection.`,\n });\n }\n }\n }\n\n // Phase 2: Generate fragments from complete ctx\n return this.#toSchemaFragments(ctx);\n }\n\n /**\n * Resolve the allowed entity names (tables + views) from grounding config.\n * Asks each grounding to contribute its entities; annotators contribute\n * nothing, so their metadata scans are skipped.\n * Results are NOT cached \u2014 call once and store the result.\n */\n async resolveAllowedEntities(): Promise<string[]> {\n const ctx = createGroundingContext();\n for (const fn of this.grounding) {\n await fn(this).contributeEntities(ctx);\n }\n return [...ctx.tables.map((t) => t.name), ...ctx.views.map((v) => v.name)];\n }\n\n /**\n * Convert complete grounding context to schema fragments.\n * Called after all groundings have populated ctx with data.\n */\n #toSchemaFragments(ctx: GroundingContext): ContextFragment[] {\n const fragments: ContextFragment[] = [];\n\n // Dialect info\n if (ctx.info) {\n fragments.push(\n dialectInfo({\n dialect: ctx.info.dialect,\n version: ctx.info.version,\n database: ctx.info.database,\n details: ctx.info.details,\n }),\n );\n }\n\n // Tables (with all annotations now included)\n for (const t of ctx.tables) {\n fragments.push(this.#tableToFragment(t));\n }\n\n // Views\n for (const v of ctx.views) {\n fragments.push(this.#viewToFragment(v));\n }\n\n // Relationships \u2014 filter out FK columns that were removed by column restriction\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n const tableColumnSets = new Map(\n ctx.tables.map((t) => [t.name, new Set(t.columns.map((c) => c.name))]),\n );\n for (const rel of ctx.relationships) {\n const sourceColumns = tableColumnSets.get(rel.table);\n const targetColumns = tableColumnSets.get(rel.referenced_table);\n if (\n sourceColumns &&\n rel.from.some((column) => !sourceColumns.has(column))\n ) {\n continue;\n }\n if (\n targetColumns &&\n rel.to.some((column) => !targetColumns.has(column))\n ) {\n continue;\n }\n\n const sourceTable = tableMap.get(rel.table);\n const targetTable = tableMap.get(rel.referenced_table);\n fragments.push(\n this.#relationshipToFragment(rel, sourceTable, targetTable),\n );\n }\n\n fragments.push(...(ctx.fragments ?? []));\n\n return fragments;\n }\n\n /**\n * Convert a Table to a table fragment with nested column, index, and constraint fragments.\n */\n #tableToFragment(t: Table): ContextFragment {\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = t.constraints?.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'DEFAULT') ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'FOREIGN_KEY') ??\n []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n // Build column fragments\n const columnFragments = t.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n pk: pkColumns.has(col.name) || undefined,\n fk: fkByColumn.get(col.name),\n unique: uniqueColumns.has(col.name) || undefined,\n notNull: notNullColumns.has(col.name) || undefined,\n default: defaultByColumn.get(col.name),\n indexed: col.isIndexed || undefined,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n // Set of present column names for cascade-cleaning indexes/constraints\n const presentColumns = new Set(t.columns.map((c) => c.name));\n\n // Build index fragments\n const indexFragments = (t.indexes ?? [])\n .filter((idx) =>\n idx.columns.every((column) => presentColumns.has(column)),\n )\n .map((idx) =>\n index({\n name: idx.name,\n columns: idx.columns,\n unique: idx.unique,\n type: idx.type,\n }),\n );\n\n // Build constraint fragments for multi-column UNIQUE and CHECK constraints\n const constraintFragments = (t.constraints ?? [])\n .filter(\n (c) =>\n c.type === 'CHECK' ||\n (c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1),\n )\n .filter(\n (c) =>\n !c.columns?.length ||\n c.columns.every((column) => presentColumns.has(column)),\n )\n .map((c) =>\n constraint({\n name: c.name,\n type: c.type,\n columns: c.columns,\n definition: c.definition,\n }),\n );\n\n return table({\n name: t.name,\n schema: t.schema,\n rowCount: t.rowCount,\n sizeHint: t.sizeHint,\n columns: columnFragments,\n indexes: indexFragments.length > 0 ? indexFragments : undefined,\n constraints:\n constraintFragments.length > 0 ? constraintFragments : undefined,\n });\n }\n\n /**\n * Convert a View to a view fragment with nested column fragments.\n */\n #viewToFragment(v: View): ContextFragment {\n const columnFragments = v.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n return view({\n name: v.name,\n schema: v.schema,\n columns: columnFragments,\n definition: v.definition,\n });\n }\n\n /**\n * Convert a Relationship to a relationship fragment.\n * Infers cardinality from row counts if available.\n */\n #relationshipToFragment(\n rel: Relationship,\n sourceTable?: Table,\n targetTable?: Table,\n ): ContextFragment {\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n\n let cardinality:\n 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many' | undefined;\n\n if (sourceCount != null && targetCount != null && targetCount > 0) {\n const ratio = sourceCount / targetCount;\n if (ratio > 5) {\n cardinality = 'many-to-one';\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = 'one-to-one';\n } else if (ratio < 0.2) {\n cardinality = 'one-to-many';\n }\n }\n\n return relationship({\n from: { table: rel.table, columns: rel.from },\n to: { table: rel.referenced_table, columns: rel.to },\n cardinality,\n });\n }\n format(sql: string): string {\n const decoded = this.#decodeShellEscapes(sql);\n try {\n return formatSql(decoded, { language: this.formatterLanguage });\n } catch {\n return decoded;\n }\n }\n\n #decodeShellEscapes(sql: string): string {\n return sql\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\([().*$])/g, '$1')\n .replace(/\\\\(?=$)/gm, '');\n }\n\n #cachedAllowedEntities: string[] | null = null;\n\n async #resolveScope(): Promise<string[]> {\n if (this.#cachedAllowedEntities) return this.#cachedAllowedEntities;\n this.#cachedAllowedEntities = await this.resolveAllowedEntities();\n return this.#cachedAllowedEntities;\n }\n\n async #analyzePolicy(sql: string): Promise<SqlPolicyViolation | null> {\n return this.#policyAnalyzer.analyze(sql, {\n resolveAllowedEntities: () => this.#resolveScope(),\n });\n }\n\n async validate(sql: string): Promise<string | void> {\n const decoded = this.#decodeShellEscapes(sql);\n const violation = await this.#analyzePolicy(decoded);\n if (violation?.kind === 'read-only') return violation.message;\n if (violation?.kind === 'scope') return JSON.stringify(violation.payload);\n return this.validateImpl(decoded);\n }\n\n async execute(sql: string): Promise<any[]> {\n return this.executeImpl(await this.enforceExecutionPolicy(sql));\n }\n\n protected async enforceExecutionPolicy(sql: string): Promise<string> {\n const decoded = this.#decodeShellEscapes(sql);\n const violation = await this.#analyzePolicy(decoded);\n if (violation?.kind === 'read-only') {\n throw new SQLReadOnlyError(violation.message);\n }\n if (violation?.kind === 'scope') {\n throw new SQLScopeError(violation.payload);\n }\n return decoded;\n }\n\n abstract executeImpl(sql: string): Promise<any[]> | any[];\n abstract validateImpl(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "const sqlValidationMarker = Symbol('SQLValidationError');\nconst unanswerableSqlMarker = Symbol('UnanswerableSQLError');\nconst sqlScopeMarker = Symbol('SQLScopeError');\nconst sqlReadOnlyMarker = Symbol('SQLReadOnlyError');\n\nexport type SQLScopeErrorType = 'OUT_OF_SCOPE' | 'SQL_SCOPE_PARSE_ERROR';\n\nexport interface SQLScopeErrorPayload {\n error: string;\n error_type: SQLScopeErrorType;\n suggestion: string;\n sql_attempted: string;\n referenced_entities?: string[];\n allowed_entities?: string[];\n parser_dialect?: string;\n parser_error?: string;\n}\n\n/**\n * Error thrown when SQL validation fails.\n */\nexport class SQLValidationError extends Error {\n [sqlValidationMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'SQLValidationError';\n this[sqlValidationMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLValidationError {\n return (\n error instanceof SQLValidationError && error[sqlValidationMarker] === true\n );\n }\n}\n\n/**\n * Error thrown when the question cannot be answered with the given schema.\n */\nexport class UnanswerableSQLError extends Error {\n [unanswerableSqlMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'UnanswerableSQLError';\n this[unanswerableSqlMarker] = true;\n }\n\n static isInstance(error: unknown): error is UnanswerableSQLError {\n return (\n error instanceof UnanswerableSQLError &&\n error[unanswerableSqlMarker] === true\n );\n }\n}\n\n/**\n * Error thrown when a query falls outside the grounded SQL scope.\n */\nexport class SQLScopeError extends Error {\n [sqlScopeMarker]: true;\n readonly payload: SQLScopeErrorPayload;\n readonly errorType: SQLScopeErrorType;\n\n constructor(payload: SQLScopeErrorPayload) {\n super(JSON.stringify(payload));\n this.name = 'SQLScopeError';\n this.payload = payload;\n this.errorType = payload.error_type;\n this[sqlScopeMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLScopeError {\n return error instanceof SQLScopeError && error[sqlScopeMarker] === true;\n }\n}\n\n/**\n * Error thrown when a query is not read-only (does not start with SELECT or WITH).\n */\nexport class SQLReadOnlyError extends Error {\n [sqlReadOnlyMarker]: true;\n\n constructor(message: string) {\n super(message);\n this.name = 'SQLReadOnlyError';\n this[sqlReadOnlyMarker] = true;\n }\n\n static isInstance(error: unknown): error is SQLReadOnlyError {\n return (\n error instanceof SQLReadOnlyError && error[sqlReadOnlyMarker] === true\n );\n }\n}\n", "import type { ContextFragment, FragmentObject } from '@deepagents/context';\n\n/**\n * Schema fragment builders.\n *\n * These fragments represent database schema metadata that can be injected\n * into AI prompts. Use with renderers (XML, Markdown, TOML, TOON) to format.\n *\n * @example\n * ```ts\n * import { dialectInfo, table, column, relationship } from '@deepagents/text2sql';\n *\n * const schemaFragments = [\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5' }),\n * table({\n * name: 'users',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true }),\n * ],\n * }),\n * ];\n * ```\n */\n\n/**\n * Database dialect and version information.\n *\n * @param input.dialect - Database type (PostgreSQL, SQLite, SQL Server, etc.)\n * @param input.version - Database version string\n * @param input.database - Database name\n *\n * @example\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5', database: 'myapp' })\n */\nexport function dialectInfo(input: {\n dialect: string;\n version?: string;\n database?: string;\n details?: FragmentObject;\n}): ContextFragment {\n return {\n name: 'dialectInfo',\n data: {\n dialect: input.dialect,\n ...(input.version && { version: input.version }),\n ...(input.database && { database: input.database }),\n ...(input.details && { details: input.details }),\n },\n };\n}\n\n/**\n * Database table with columns and optional metadata.\n *\n * @param input.name - Table name\n * @param input.schema - Schema name (e.g., 'public' for PostgreSQL)\n * @param input.rowCount - Approximate row count\n * @param input.sizeHint - Size category for query optimization hints\n * @param input.columns - Array of column() fragments\n * @param input.indexes - Array of index() fragments\n * @param input.constraints - Array of constraint() fragments\n *\n * @example\n * table({\n * name: 'users',\n * rowCount: 1500,\n * sizeHint: 'medium',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true, indexed: true }),\n * ],\n * indexes: [\n * index({ name: 'idx_email', columns: ['email'], unique: true }),\n * ],\n * })\n */\nexport function table(input: {\n name: string;\n schema?: string;\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n columns: ContextFragment[];\n indexes?: ContextFragment[];\n constraints?: ContextFragment[];\n}): ContextFragment {\n return {\n name: 'table',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n ...(input.rowCount != null && { rowCount: input.rowCount }),\n ...(input.sizeHint && { sizeHint: input.sizeHint }),\n columns: input.columns,\n ...(input.indexes?.length && { indexes: input.indexes }),\n ...(input.constraints?.length && { constraints: input.constraints }),\n },\n };\n}\n\n/**\n * Table column with type and annotations.\n *\n * @param input.name - Column name\n * @param input.type - Column data type (e.g., 'integer', 'varchar(255)')\n * @param input.pk - Is primary key\n * @param input.fk - Foreign key reference in \"table.column\" format\n * @param input.unique - Has unique constraint\n * @param input.notNull - Has NOT NULL constraint\n * @param input.default - Default value expression\n * @param input.indexed - Has index on this column\n * @param input.values - Enum or low cardinality values\n * @param input.stats - Column statistics (min, max, null fraction)\n *\n * @example\n * column({\n * name: 'status',\n * type: 'varchar',\n * notNull: true,\n * indexed: true,\n * values: ['active', 'inactive', 'suspended'],\n * })\n */\nexport function column(input: {\n name: string;\n type: string;\n pk?: boolean;\n fk?: string;\n unique?: boolean;\n notNull?: boolean;\n default?: string;\n indexed?: boolean;\n values?: string[];\n stats?: {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n };\n}): ContextFragment {\n return {\n name: 'column',\n data: {\n name: input.name,\n type: input.type,\n ...(input.pk && { pk: true }),\n ...(input.fk && { fk: input.fk }),\n ...(input.unique && { unique: true }),\n ...(input.notNull && { notNull: true }),\n ...(input.default && { default: input.default }),\n ...(input.indexed && { indexed: true }),\n ...(input.values?.length && { values: input.values }),\n ...(input.stats && { stats: input.stats }),\n },\n };\n}\n\n/**\n * Table index.\n *\n * @param input.name - Index name\n * @param input.columns - Columns included in the index\n * @param input.unique - Is unique index\n * @param input.type - Index type (BTREE, HASH, GIN, etc.)\n *\n * @example\n * index({ name: 'idx_user_email', columns: ['email'], unique: true, type: 'BTREE' })\n */\nexport function index(input: {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}): ContextFragment {\n return {\n name: 'index',\n data: {\n name: input.name,\n columns: input.columns,\n ...(input.unique && { unique: true }),\n ...(input.type && { type: input.type }),\n },\n };\n}\n\n/**\n * Table constraint (CHECK, UNIQUE, PRIMARY_KEY, FOREIGN_KEY, etc).\n *\n * @param input.name - Constraint name\n * @param input.type - Constraint type\n * @param input.columns - Columns involved in the constraint\n * @param input.definition - CHECK constraint SQL definition\n * @param input.defaultValue - DEFAULT constraint value\n * @param input.referencedTable - For FK: referenced table name\n * @param input.referencedColumns - For FK: referenced column names\n *\n * @example\n * constraint({\n * name: 'chk_amount_positive',\n * type: 'CHECK',\n * definition: 'amount > 0',\n * })\n *\n * @example\n * constraint({\n * name: 'fk_order_user',\n * type: 'FOREIGN_KEY',\n * columns: ['user_id'],\n * referencedTable: 'users',\n * referencedColumns: ['id'],\n * })\n */\nexport function constraint(input: {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}): ContextFragment {\n return {\n name: 'constraint',\n data: {\n name: input.name,\n type: input.type,\n ...(input.columns?.length && { columns: input.columns }),\n ...(input.definition && { definition: input.definition }),\n ...(input.defaultValue && { defaultValue: input.defaultValue }),\n ...(input.referencedTable && { referencedTable: input.referencedTable }),\n ...(input.referencedColumns?.length && {\n referencedColumns: input.referencedColumns,\n }),\n },\n };\n}\n\n/**\n * Database view.\n *\n * @param input.name - View name\n * @param input.schema - Schema name\n * @param input.columns - Array of column() fragments\n * @param input.definition - View SQL definition\n *\n * @example\n * view({\n * name: 'active_users',\n * columns: [\n * column({ name: 'id', type: 'integer' }),\n * column({ name: 'email', type: 'varchar' }),\n * ],\n * definition: \"SELECT id, email FROM users WHERE status = 'active'\",\n * })\n */\nexport function view(input: {\n name: string;\n schema?: string;\n columns: ContextFragment[];\n definition?: string;\n}): ContextFragment {\n return {\n name: 'view',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n columns: input.columns,\n ...(input.definition && { definition: input.definition }),\n },\n };\n}\n\n/**\n * Relationship between tables (foreign key connection).\n *\n * @param input.from - Source table and columns\n * @param input.to - Referenced table and columns\n * @param input.cardinality - Relationship cardinality\n *\n * @example\n * relationship({\n * from: { table: 'orders', columns: ['user_id'] },\n * to: { table: 'users', columns: ['id'] },\n * cardinality: 'many-to-one',\n * })\n */\nexport function relationship(input: {\n from: { table: string; columns: string[] };\n to: { table: string; columns: string[] };\n cardinality?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';\n}): ContextFragment {\n return {\n name: 'relationship',\n data: {\n from: input.from,\n to: input.to,\n ...(input.cardinality && { cardinality: input.cardinality }),\n },\n };\n}\n", "import type { ContextFragment } from '@deepagents/context';\n\nimport type {\n AdapterInfo,\n ColumnStats,\n OnProgress,\n Relationship,\n Table,\n} from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Adapter-specific fragments contributed during grounding. */\n fragments?: ContextFragment[];\n\n /** Shared cache for cross-grounding deduplication. Keyed by `type:key`. */\n cache: Map<string, unknown>;\n\n /** Progress sink for long-running introspection work. */\n onProgress: OnProgress;\n}\n\nconst noopProgress: OnProgress = () => {};\n\nfunction timestampProgress(onProgress?: OnProgress): OnProgress {\n if (!onProgress) return noopProgress;\n return (progress) => {\n onProgress({\n ...progress,\n timestampMs: progress.timestampMs ?? Date.now(),\n });\n };\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(\n options: { onProgress?: OnProgress } = {},\n): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n fragments: [],\n cache: new Map(),\n onProgress: timestampProgress(options.onProgress),\n };\n}\n", "import type { SQLScopeErrorPayload } from './agents/exceptions.ts';\n\nexport function buildScopeParseErrorPayload(\n sql: string,\n parserDialect: string,\n error: unknown,\n): SQLScopeErrorPayload {\n const parserError =\n error instanceof Error ? error.message : String(error ?? 'Unknown error');\n\n return {\n error: `SQL scope analysis failed before validation/execution: ${parserError}`,\n error_type: 'SQL_SCOPE_PARSE_ERROR',\n suggestion:\n 'Rewrite the query into simpler SQL that can be analyzed safely, or extend parser coverage for this dialect feature.',\n sql_attempted: sql,\n parser_dialect: parserDialect,\n parser_error: parserError,\n };\n}\n", "import type { SQLScopeErrorPayload } from '../../agents/exceptions.ts';\nimport { buildScopeParseErrorPayload } from '../../sql-scope-error.ts';\nimport type {\n SqlPolicyAnalyzer,\n SqlPolicyContext,\n SqlPolicyViolation,\n} from '../sql-policy.ts';\nimport type {\n PostHogMetadataResponse,\n PostHogNotice,\n PostHogTransport,\n} from './types.ts';\n\nexport class PostHogSqlPolicyAnalyzer implements SqlPolicyAnalyzer {\n readonly #transport: PostHogTransport;\n\n constructor(transport: PostHogTransport) {\n this.#transport = transport;\n }\n\n async analyze(\n sql: string,\n context: SqlPolicyContext,\n ): Promise<SqlPolicyViolation | null> {\n const response = await this.#transport.query<PostHogMetadataResponse>({\n query: { kind: 'HogQLMetadata', language: 'hogQL', query: sql },\n name: 'deepagents_text2sql_validate',\n });\n let metadata: PostHogMetadataResponse;\n try {\n metadata = validateMetadataResponse(response);\n } catch (error) {\n return {\n kind: 'scope',\n payload: buildScopeParseErrorPayload(sql, 'hogql', error),\n };\n }\n\n const allowedEntities = await context.resolveAllowedEntities();\n const allowed = new Set(allowedEntities.map(caseFold));\n const rejected = metadata.table_names.filter(\n (entity) => !allowed.has(caseFold(entity)),\n );\n\n return rejected.length > 0\n ? {\n kind: 'scope',\n payload: buildOutOfScopePayload(sql, rejected, [...allowedEntities]),\n }\n : null;\n }\n}\n\nfunction validateMetadataResponse(value: unknown): PostHogMetadataResponse {\n if (!isRecord(value)) {\n throw new Error('PostHog HogQLMetadata response must be a JSON object.');\n }\n if (typeof value.isValid !== 'boolean') {\n throw new Error('PostHog HogQLMetadata response has no isValid boolean.');\n }\n\n const errors = validateNotices(value.errors, 'errors');\n validateNotices(value.warnings, 'warnings');\n validateNotices(value.notices, 'notices');\n const tableNames = validateTableNames(value.table_names);\n\n if (!value.isValid || errors.length > 0) {\n const reason = errors.map((notice) => notice.message).join('; ');\n throw new Error(\n reason\n ? `PostHog rejected the HogQL query: ${reason}`\n : 'PostHog rejected the HogQL query as invalid.',\n );\n }\n\n return {\n isValid: true,\n errors,\n warnings: value.warnings as PostHogNotice[],\n notices: value.notices as PostHogNotice[],\n table_names: tableNames,\n };\n}\n\nfunction validateNotices(value: unknown, name: string): PostHogNotice[] {\n if (!Array.isArray(value)) {\n throw new Error(`PostHog HogQLMetadata response has no ${name} array.`);\n }\n for (const notice of value) {\n if (!isRecord(notice) || typeof notice.message !== 'string') {\n throw new Error(\n `PostHog HogQLMetadata response has an invalid ${name} notice.`,\n );\n }\n }\n return value as PostHogNotice[];\n}\n\nfunction validateTableNames(value: unknown): string[] {\n if (\n !Array.isArray(value) ||\n value.some((name) => typeof name !== 'string' || name.length === 0)\n ) {\n throw new Error('PostHog HogQLMetadata response has invalid table_names.');\n }\n return [...new Set(value)];\n}\n\nfunction buildOutOfScopePayload(\n sql: string,\n referencedEntities: string[],\n allowedEntities: string[],\n): SQLScopeErrorPayload {\n return {\n error: `Query references entities outside grounded scope: ${referencedEntities.join(', ')}`,\n error_type: 'OUT_OF_SCOPE',\n suggestion:\n 'Restrict the query to grounded tables/views or expand grounding to include the referenced entities.',\n sql_attempted: sql,\n referenced_entities: referencedEntities,\n allowed_entities: allowedEntities,\n };\n}\n\nfunction caseFold(value: string): string {\n return value.toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { Adapter, type GroundingFn } from '../adapter.ts';\nimport { PostHogSqlPolicyAnalyzer } from './posthog.sql-policy.ts';\nimport type {\n PostHogQueryRequest,\n PostHogQueryResponse,\n PostHogQueryValues,\n PostHogTransport,\n} from './types.ts';\n\nexport interface PostHogAdapterOptions {\n transport: PostHogTransport;\n grounding?: GroundingFn[];\n}\n\nexport class PostHog extends Adapter {\n readonly transport: PostHogTransport;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema = undefined;\n override readonly systemSchemas = ['system'];\n override readonly formatterLanguage = 'clickhouse';\n\n constructor(options: PostHogAdapterOptions) {\n if (!options?.transport || typeof options.transport.query !== 'function') {\n throw new Error('PostHog adapter requires a transport.');\n }\n if (\n typeof options.transport.listEventDefinitions !== 'function' ||\n typeof options.transport.listPropertyDefinitions !== 'function'\n ) {\n throw new Error(\n 'PostHog transport must provide event and property definition methods.',\n );\n }\n\n super(new PostHogSqlPolicyAnalyzer(options.transport));\n this.transport = options.transport;\n this.grounding = options.grounding ?? [];\n }\n\n override async execute(\n sql: string,\n values?: PostHogQueryValues,\n ): Promise<Record<string, unknown>[]> {\n return this.#execute(\n await this.enforceExecutionPolicy(sql),\n 'deepagents_text2sql_execute',\n values,\n );\n }\n\n override async executeImpl(sql: string): Promise<Record<string, unknown>[]> {\n return this.#execute(sql, 'deepagents_text2sql_execute');\n }\n\n override validateImpl(): undefined {\n return undefined;\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n return (await this.#execute(sql, 'deepagents_text2sql_grounding')) as Row[];\n }\n\n override quoteIdentifier(name: string): string {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const { schema, table } = this.parseTableName(tableName);\n const relation = schema\n ? `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`\n : this.quoteIdentifier(table);\n const projection = columns?.length\n ? columns.map((column) => this.quoteIdentifier(column)).join(', ')\n : '*';\n return `SELECT ${projection} FROM ${relation} LIMIT ${limit}`;\n }\n\n async query<T>(request: PostHogQueryRequest): Promise<T> {\n return this.transport.query<T>(request);\n }\n\n async #execute(\n sql: string,\n name: string,\n values?: PostHogQueryValues,\n ): Promise<Record<string, unknown>[]> {\n const response = await this.transport.query<PostHogQueryResponse>({\n query: {\n kind: 'HogQLQuery',\n query: sql,\n ...(values === undefined ? {} : { values }),\n },\n name,\n });\n return rowsFromResponse(response);\n }\n}\n\nfunction rowsFromResponse(value: unknown): Record<string, unknown>[] {\n if (!isRecord(value) || !Array.isArray(value.results)) {\n throw new Error('PostHog HogQLQuery response has no results array.');\n }\n if (\n value.columns !== undefined &&\n (!Array.isArray(value.columns) ||\n value.columns.some(\n (column) => typeof column !== 'string' || column.length === 0,\n ))\n ) {\n throw new Error('PostHog HogQLQuery response has invalid columns.');\n }\n if (\n Array.isArray(value.columns) &&\n new Set(value.columns).size !== value.columns.length\n ) {\n throw new Error(\n 'PostHog HogQLQuery response contains duplicate column names; alias every selected expression uniquely.',\n );\n }\n if (value.results.length === 0) return [];\n if (!Array.isArray(value.columns)) {\n throw new Error(\n 'PostHog HogQLQuery response requires columns for non-empty results.',\n );\n }\n\n const columns = value.columns as string[];\n return value.results.map((row, index) => {\n if (!Array.isArray(row) || row.length !== columns.length) {\n throw new Error(\n `PostHog HogQLQuery result row ${index} does not match the column count.`,\n );\n }\n return Object.fromEntries(\n columns.map((column, columnIndex) => [column, row[columnIndex]]),\n );\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type { Filter, Relationship, Table } from '../adapter.ts';\nimport {\n AbstractGrounding,\n type ColumnsFilter,\n applyColumnFilter,\n} from '../groundings/abstract.grounding.ts';\nimport type { GroundingContext } from '../groundings/context.ts';\nimport type { View } from '../groundings/view.grounding.ts';\nimport type { PostHog } from './posthog.ts';\nimport type {\n PostHogDatabaseFieldType,\n PostHogDatabaseTable,\n PostHogDatabaseTableType,\n PostHogSchemaJoin,\n PostHogSchemaResponse,\n} from './types.ts';\n\nconst SCALAR_FIELD_TYPES = new Set<PostHogDatabaseFieldType>([\n 'integer',\n 'float',\n 'decimal',\n 'string',\n 'datetime',\n 'date',\n 'boolean',\n 'array',\n 'json',\n]);\n\nconst FIELD_TYPES = new Set<PostHogDatabaseFieldType>([\n ...SCALAR_FIELD_TYPES,\n 'lazy_table',\n 'virtual_table',\n 'field_traverser',\n 'expression',\n 'view',\n 'materialized_view',\n 'unknown',\n]);\n\nconst TABLE_TYPES = new Set<PostHogDatabaseTableType>([\n 'posthog',\n 'system',\n 'data_warehouse',\n 'view',\n 'batch_export',\n 'materialized_view',\n 'managed_view',\n 'endpoint',\n]);\n\nconst VIEW_TYPES = new Set<PostHogDatabaseTableType>([\n 'view',\n 'materialized_view',\n 'managed_view',\n 'endpoint',\n]);\n\nexport interface PostHogSchemaGroundingConfig {\n filter?: Filter;\n columns?: ColumnsFilter;\n includeSystem?: boolean;\n}\n\nexport class PostHogSchemaGrounding extends AbstractGrounding {\n readonly #adapter: PostHog;\n readonly #config: PostHogSchemaGroundingConfig;\n\n constructor(adapter: PostHog, config: PostHogSchemaGroundingConfig = {}) {\n super('schema', 'tables');\n this.#adapter = adapter;\n this.#config = config;\n }\n\n override async execute(ctx: GroundingContext): Promise<void> {\n const response = validateSchemaResponse(\n await this.#adapter.query<PostHogSchemaResponse>({\n query: { kind: 'DatabaseSchemaQuery' },\n name: 'deepagents_text2sql_schema',\n }),\n );\n const entities = Object.entries(response.tables).filter(\n ([name, table]) =>\n (this.#config.includeSystem || table.type !== 'system') &&\n matchesFilter(name, this.#config.filter),\n );\n\n const tables: Table[] = [];\n const views: View[] = [];\n for (const [index, [name, table]] of entities.entries()) {\n ctx.onProgress({\n type: 'phase:progress',\n phase: 'tables',\n table: name,\n message: `Loading PostHog schema entity ${name}...`,\n current: index + 1,\n total: entities.length,\n });\n const columns = readColumns(name, table);\n if (VIEW_TYPES.has(table.type)) {\n views.push(\n applyColumnFilter(\n {\n name,\n columns,\n ...(table.query?.query ? { definition: table.query.query } : {}),\n },\n this.#config.columns,\n ),\n );\n } else {\n tables.push(\n applyColumnFilter(\n {\n name,\n columns,\n ...(typeof table.row_count === 'number'\n ? { rowCount: table.row_count }\n : {}),\n },\n this.#config.columns,\n ),\n );\n }\n }\n\n ctx.tables.push(...tables);\n ctx.views.push(...views);\n ctx.relationships.push(...readRelationships(response.joins, tables, views));\n }\n\n override async contributeEntities(ctx: GroundingContext): Promise<void> {\n await this.execute(ctx);\n }\n}\n\nfunction validateSchemaResponse(value: unknown): PostHogSchemaResponse {\n if (\n !isRecord(value) ||\n !isRecord(value.tables) ||\n !Array.isArray(value.joins)\n ) {\n throw new Error(\n 'PostHog DatabaseSchemaQuery response must contain tables and joins.',\n );\n }\n\n for (const [name, valueTable] of Object.entries(value.tables)) {\n if (!isRecord(valueTable)) {\n throw new Error(`PostHog schema table ${name} must be an object.`);\n }\n if (!TABLE_TYPES.has(valueTable.type as PostHogDatabaseTableType)) {\n throw new Error(`PostHog schema table ${name} has an unknown type.`);\n }\n if (\n typeof valueTable.id !== 'string' ||\n typeof valueTable.name !== 'string' ||\n !isRecord(valueTable.fields)\n ) {\n throw new Error(`PostHog schema table ${name} is malformed.`);\n }\n if (\n valueTable.row_count !== undefined &&\n valueTable.row_count !== null &&\n (typeof valueTable.row_count !== 'number' ||\n !Number.isFinite(valueTable.row_count) ||\n valueTable.row_count < 0)\n ) {\n throw new Error(`PostHog schema table ${name} has an invalid row_count.`);\n }\n if (\n VIEW_TYPES.has(valueTable.type as PostHogDatabaseTableType) &&\n (!isRecord(valueTable.query) ||\n typeof valueTable.query.query !== 'string')\n ) {\n throw new Error(`PostHog schema view ${name} has an invalid query.`);\n }\n validateFields(name, valueTable.fields);\n }\n for (const join of value.joins) {\n if (!isRecord(join)) {\n throw new Error('PostHog schema contains a malformed join.');\n }\n }\n\n return value as unknown as PostHogSchemaResponse;\n}\n\nfunction validateFields(\n tableName: string,\n fields: Record<string, unknown>,\n): void {\n for (const [name, value] of Object.entries(fields)) {\n if (\n !isRecord(value) ||\n typeof value.name !== 'string' ||\n typeof value.hogql_value !== 'string' ||\n typeof value.schema_valid !== 'boolean' ||\n !FIELD_TYPES.has(value.type as PostHogDatabaseFieldType)\n ) {\n throw new Error(\n `PostHog schema field ${tableName}.${name} is malformed or has an unknown type.`,\n );\n }\n }\n}\n\nfunction readColumns(\n tableName: string,\n table: PostHogDatabaseTable,\n): Array<{ name: string; type: string }> {\n const columns: Array<{ name: string; type: string }> = [];\n const names = new Set<string>();\n for (const field of Object.values(table.fields)) {\n if (!field.schema_valid || !SCALAR_FIELD_TYPES.has(field.type)) continue;\n const name = field.hogql_value.trim();\n if (!name) {\n throw new Error(`PostHog schema table ${tableName} has an empty field.`);\n }\n if (names.has(name)) {\n throw new Error(\n `PostHog schema table ${tableName} has duplicate HogQL field ${name}.`,\n );\n }\n names.add(name);\n columns.push({ name, type: field.type });\n }\n return columns;\n}\n\nfunction readRelationships(\n joins: PostHogSchemaJoin[],\n tables: Table[],\n views: View[],\n): Relationship[] {\n const entityColumns = new Map(\n [...tables, ...views].map((entity) => [\n entity.name,\n new Set(entity.columns.map((column) => column.name)),\n ]),\n );\n return joins.flatMap((join) => {\n const sourceTable = readNonEmptyString(join.source_table_name);\n const sourceKey = readNonEmptyString(join.source_table_key);\n const joiningTable = readNonEmptyString(join.joining_table_name);\n const joiningKey = readNonEmptyString(join.joining_table_key);\n if (\n !sourceTable ||\n !sourceKey ||\n !joiningTable ||\n !joiningKey ||\n !entityColumns.get(sourceTable)?.has(sourceKey) ||\n !entityColumns.get(joiningTable)?.has(joiningKey)\n ) {\n return [];\n }\n return [\n {\n table: sourceTable,\n from: [sourceKey],\n referenced_table: joiningTable,\n to: [joiningKey],\n },\n ];\n });\n}\n\nfunction matchesFilter(name: string, filter?: Filter): boolean {\n if (!filter) return true;\n if (Array.isArray(filter)) return filter.includes(name);\n if (filter instanceof RegExp) {\n filter.lastIndex = 0;\n return filter.test(name);\n }\n return filter(name);\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import type {\n CreatePostHogTransportOptions,\n PostHogEventDefinition,\n PostHogPropertyDefinition,\n PostHogPropertyDefinitionType,\n PostHogQueryRequest,\n PostHogTransport,\n} from './types.ts';\n\nconst DEFAULT_TIMEOUT_MS = 45_000;\nconst PAGE_SIZE = 100;\n\nexport class PostHogApiError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly detail?: string;\n readonly retryAfterMs?: number;\n\n constructor(options: {\n status: number;\n message: string;\n code?: string;\n detail?: string;\n retryAfterMs?: number;\n }) {\n super(options.message);\n this.name = 'PostHogApiError';\n this.status = options.status;\n this.code = options.code;\n this.detail = options.detail;\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\nexport function createPostHogTransport(\n options: CreatePostHogTransportOptions,\n): PostHogTransport {\n const origin = parseOrigin(options.host);\n const projectId = String(options.projectId ?? '').trim();\n if (!projectId) throw new Error('PostHog transport requires a projectId.');\n if (typeof options.getAccessToken !== 'function') {\n throw new Error('PostHog transport requires getAccessToken().');\n }\n\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new Error('PostHog transport requires a fetch implementation.');\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error('PostHog transport timeoutMs must be a positive integer.');\n }\n\n const projectPath = `/api/projects/${encodeURIComponent(projectId)}`;\n\n const requestJson = async (\n path: string,\n init: Omit<RequestInit, 'headers' | 'redirect' | 'signal'> = {},\n ): Promise<unknown> => {\n const token = String(await options.getAccessToken()).trim();\n if (!token) throw new Error('PostHog getAccessToken() returned no token.');\n\n const signal = AbortSignal.timeout(timeoutMs);\n let response: Response;\n try {\n response = await fetchImpl(new URL(path, origin), {\n ...init,\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n ...(init.body === undefined\n ? {}\n : { 'Content-Type': 'application/json' }),\n },\n redirect: 'error',\n signal,\n });\n } catch {\n if (signal.aborted) {\n throw new Error(`PostHog request timed out after ${timeoutMs}ms.`);\n }\n throw new Error('PostHog request failed before receiving a response.');\n }\n\n let body: string;\n try {\n body = await response.text();\n } catch {\n if (signal.aborted) {\n throw new Error(`PostHog request timed out after ${timeoutMs}ms.`);\n }\n throw new Error('PostHog response body could not be read.');\n }\n const parsed = parseJson(body);\n if (!response.ok) {\n throw apiError(response, parsed, token);\n }\n if (parsed === undefined) {\n throw new Error('PostHog returned an empty or non-JSON response.');\n }\n return parsed;\n };\n\n const listDefinitions = async <T>(\n resource: 'event_definitions' | 'property_definitions',\n parameters: URLSearchParams,\n ): Promise<T[]> => {\n const definitions: T[] = [];\n let offset = 0;\n\n for (;;) {\n const pageParameters = new URLSearchParams(parameters);\n pageParameters.set('limit', String(PAGE_SIZE));\n pageParameters.set('offset', String(offset));\n const page = asRecord(\n await requestJson(\n `${projectPath}/${resource}/?${pageParameters.toString()}`,\n ),\n `PostHog ${resource} response`,\n );\n if (!Array.isArray(page.results)) {\n throw new Error(`PostHog ${resource} response has no results array.`);\n }\n if (page.next !== null && typeof page.next !== 'string') {\n throw new Error(\n `PostHog ${resource} response has an invalid next page.`,\n );\n }\n\n definitions.push(...(page.results as T[]));\n if (page.next === null) return definitions;\n if (page.results.length === 0) {\n throw new Error(\n `PostHog ${resource} returned an empty non-final page.`,\n );\n }\n offset += page.results.length;\n }\n };\n\n return {\n async query<T>(request: PostHogQueryRequest): Promise<T> {\n return (await requestJson(`${projectPath}/query/`, {\n method: 'POST',\n body: JSON.stringify(request),\n })) as T;\n },\n\n listEventDefinitions(): Promise<PostHogEventDefinition[]> {\n return listDefinitions(\n 'event_definitions',\n new URLSearchParams({\n exclude_hidden: 'true',\n exclude_stale: 'true',\n }),\n );\n },\n\n listPropertyDefinitions({\n type,\n groupTypeIndex,\n }: {\n type: PostHogPropertyDefinitionType;\n groupTypeIndex?: number;\n }): Promise<PostHogPropertyDefinition[]> {\n if (\n type === 'group' &&\n (groupTypeIndex === undefined ||\n !Number.isInteger(groupTypeIndex) ||\n groupTypeIndex < 0)\n ) {\n throw new Error(\n 'PostHog group property definitions require a non-negative integer groupTypeIndex.',\n );\n }\n const parameters = new URLSearchParams({\n type,\n exclude_hidden: 'true',\n exclude_restricted: 'true',\n });\n if (type === 'group') {\n parameters.set('group_type_index', String(groupTypeIndex));\n }\n return listDefinitions('property_definitions', parameters);\n },\n };\n}\n\nfunction parseOrigin(host: string): URL {\n let url: URL;\n try {\n url = new URL(host);\n } catch {\n throw new Error('PostHog host must be an absolute URL.');\n }\n\n const isLoopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && isLoopback)) {\n throw new Error(\n 'PostHog host must use HTTPS except for loopback development hosts.',\n );\n }\n if (url.username || url.password || url.search || url.hash) {\n throw new Error(\n 'PostHog host must be an origin without credentials or query data.',\n );\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('PostHog host must not include a path.');\n }\n url.pathname = '/';\n return url;\n}\n\nfunction parseJson(body: string): unknown | undefined {\n if (!body.trim()) return undefined;\n try {\n return JSON.parse(body);\n } catch {\n return undefined;\n }\n}\n\nfunction apiError(\n response: Response,\n body: unknown,\n accessToken: string,\n): PostHogApiError {\n const record = isRecord(body) ? body : undefined;\n const detail = redact(\n readString(record?.detail) ?? readString(record?.error),\n accessToken,\n );\n const code = redact(readString(record?.code), accessToken);\n const retryAfterMs = parseRetryAfter(response.headers.get('retry-after'));\n return new PostHogApiError({\n status: response.status,\n message: detail\n ? `PostHog API returned ${response.status}: ${detail}`\n : `PostHog API returned HTTP ${response.status}.`,\n code,\n detail,\n retryAfterMs,\n });\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (value === null) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) {\n return seconds >= 0 ? seconds * 1_000 : undefined;\n }\n const date = Date.parse(value);\n return Number.isFinite(date) ? Math.max(0, date - Date.now()) : undefined;\n}\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be a JSON object.`);\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction redact(value: string | undefined, secret: string): string | undefined {\n return value?.replaceAll(secret, '[REDACTED]');\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n PostHogDefinitionsGrounding,\n type PostHogDefinitionsGroundingConfig,\n} from './definitions.posthog.grounding.ts';\nimport { PostHogInfoGrounding } from './info.posthog.grounding.ts';\nimport { PostHog } from './posthog.ts';\nimport {\n PostHogSchemaGrounding,\n type PostHogSchemaGroundingConfig,\n} from './schema.posthog.grounding.ts';\n\nexport * from './definitions.posthog.grounding.ts';\nexport * from './posthog.sql-policy.ts';\nexport * from './posthog.ts';\nexport * from './schema.posthog.grounding.ts';\nexport * from './transport.ts';\nexport * from './types.ts';\n\nexport function info() {\n return () => new PostHogInfoGrounding();\n}\n\nexport function schema(config: PostHogSchemaGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new PostHogSchemaGrounding(adapter as PostHog, config);\n}\n\nexport function definitions(config: PostHogDefinitionsGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new PostHogDefinitionsGrounding(adapter as PostHog, config);\n}\n\nexport default {\n PostHog,\n definitions,\n info,\n schema,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["index", "definitions", "column", "c", "schema", "isRecord", "schema", "table", "column", "isRecord", "index", "table", "matchesFilter", "index", "isRecord", "column", "readNonEmptyString", "definitions", "isRecord"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Adapter, type GroundingFn } from '../adapter.ts';
|
|
2
|
-
import type { PostHogQueryRequest, PostHogTransport } from './types.ts';
|
|
2
|
+
import type { PostHogQueryRequest, PostHogQueryValues, PostHogTransport } from './types.ts';
|
|
3
3
|
export interface PostHogAdapterOptions {
|
|
4
4
|
transport: PostHogTransport;
|
|
5
5
|
grounding?: GroundingFn[];
|
|
@@ -12,6 +12,7 @@ export declare class PostHog extends Adapter {
|
|
|
12
12
|
readonly systemSchemas: string[];
|
|
13
13
|
readonly formatterLanguage = "clickhouse";
|
|
14
14
|
constructor(options: PostHogAdapterOptions);
|
|
15
|
+
execute(sql: string, values?: PostHogQueryValues): Promise<Record<string, unknown>[]>;
|
|
15
16
|
executeImpl(sql: string): Promise<Record<string, unknown>[]>;
|
|
16
17
|
validateImpl(): undefined;
|
|
17
18
|
runQuery<Row>(sql: string): Promise<Row[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/posthog/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EACV,mBAAmB,EAEnB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,qBAAa,OAAQ,SAAQ,OAAO;;IAClC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,SAAkB,SAAS,EAAE,WAAW,EAAE,CAAC;IAC3C,SAAkB,aAAa,YAAa;IAC5C,SAAkB,aAAa,WAAc;IAC7C,SAAkB,iBAAiB,gBAAgB;gBAEvC,OAAO,EAAE,qBAAqB;IAkB3B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAIlE,YAAY,IAAI,SAAS;IAInB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIhD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI7B,oBAAoB,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM;IAWH,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/posthog/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EACV,mBAAmB,EAEnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,qBAAa,OAAQ,SAAQ,OAAO;;IAClC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,SAAkB,SAAS,EAAE,WAAW,EAAE,CAAC;IAC3C,SAAkB,aAAa,YAAa;IAC5C,SAAkB,aAAa,WAAc;IAC7C,SAAkB,iBAAiB,gBAAgB;gBAEvC,OAAO,EAAE,qBAAqB;IAkB3B,OAAO,CACpB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAQtB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAIlE,YAAY,IAAI,SAAS;IAInB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIhD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI7B,oBAAoB,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM;IAWH,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;CAmBzD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export type PostHogPropertyDefinitionType = 'event' | 'person' | 'session' | 'group';
|
|
2
|
+
export type PostHogQueryValues = Record<string, unknown>;
|
|
2
3
|
export type PostHogQueryNode = {
|
|
3
4
|
kind: 'HogQLQuery';
|
|
4
5
|
query: string;
|
|
6
|
+
values?: PostHogQueryValues;
|
|
5
7
|
} | {
|
|
6
8
|
kind: 'HogQLMetadata';
|
|
7
9
|
language: 'hogQL';
|