@deepagents/text2sql 0.24.0 → 0.26.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/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -241
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +6 -0
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +30 -8
- package/dist/lib/adapters/bigquery/index.js.map +2 -2
- package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/index.js +2 -0
- package/dist/lib/adapters/groundings/index.js.map +2 -2
- package/dist/lib/adapters/groundings/view.grounding.d.ts +3 -0
- package/dist/lib/adapters/groundings/view.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.js +29 -7
- package/dist/lib/adapters/mysql/index.js.map +2 -2
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +29 -7
- package/dist/lib/adapters/postgres/index.js.map +2 -2
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +16 -0
- package/dist/lib/adapters/spreadsheet/index.js.map +2 -2
- package/dist/lib/adapters/sqlite/index.js +26 -4
- package/dist/lib/adapters/sqlite/index.js.map +2 -2
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts +2 -4
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts +0 -9
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +107 -11
- package/dist/lib/adapters/sqlserver/index.js.map +3 -3
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/agents/result-tools.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/lib/agents/developer.agent.d.ts +0 -41
- package/dist/lib/agents/developer.agent.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/adapters/adapter.ts", "../src/lib/fragments/schema.ts", "../src/lib/adapters/groundings/context.ts", "../src/lib/agents/
|
|
4
|
-
"sourcesContent": ["import { type SqlLanguage, format as formatSql } from 'sql-formatter';\n\nimport type { ContextFragment } from '@deepagents/context';\n\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';\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'\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}\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?: Record<string, unknown>;\n}\n\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'tables'\n | 'row_counts'\n | 'primary_keys'\n | 'indexes'\n | 'column_stats'\n | 'low_cardinality'\n | 'relationships';\n\nexport interface IntrospectionProgress {\n phase: IntrospectionPhase;\n message: string;\n current?: number;\n total?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport interface IntrospectOptions {\n onProgress?: OnProgress;\n}\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 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 await grounding.execute(ctx);\n }\n\n // Phase 2: Generate fragments from complete ctx\n return this.#toSchemaFragments(ctx);\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 }),\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\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n for (const rel of ctx.relationships) {\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 // Business context\n if (ctx.report) {\n fragments.push({ name: 'businessContext', data: ctx.report });\n }\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 // Build index fragments\n const indexFragments = (t.indexes ?? []).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 .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'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many'\n | 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 try {\n return formatSql(sql, { language: this.formatterLanguage });\n } catch {\n return sql;\n }\n }\n\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(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", "import type { ContextFragment } 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}): 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 },\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 {\n AdapterInfo,\n ColumnStats,\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 /** Business context report generated by ReportGrounding */\n report?: string;\n\n /** Shared cache for cross-grounding deduplication. Keyed by `type:key`. */\n cache: Map<string, unknown>;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n cache: new Map(),\n };\n}\n", "import { tool } from 'ai';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport { toState } from '@deepagents/agent';\nimport { type ContextFragment, hint, persona } from '@deepagents/context';\n\nimport type { Adapter } from '../adapters/adapter.ts';\nimport { explainSql } from './explainer.agent.ts';\n\n/**\n * Context variables passed to the developer agent tools via stream().\n */\nexport type DeveloperContextVariables = {\n /** Database adapter for validation and execution */\n adapter: Adapter;\n};\n\n/**\n * Tools for the developer agent.\n * Following the text2sql.agent.ts pattern - LLM writes SQL directly.\n */\nconst tools = {\n /**\n * Validate SQL query syntax before execution.\n */\n validate_query: tool({\n description: `Validate SQL query syntax before execution. Use this to check if your SQL is valid before running db_query. This helps catch errors early and allows you to correct the query if needed.`,\n inputSchema: z.object({\n sql: z.string().describe('The SQL query to validate.'),\n }),\n execute: async ({ sql }, options) => {\n const state = toState<DeveloperContextVariables>(options);\n const result = await state.adapter.validate(sql);\n if (typeof result === 'string') {\n return `Validation Error: ${result}`;\n }\n return 'Query is valid.';\n },\n }),\n\n /**\n * Execute SQL query against the database.\n */\n db_query: tool({\n description: `Internal tool to fetch data from the store's database. Write a SQL query to retrieve the information needed to answer the user's question. The results will be returned as data that you can then present to the user in natural language.`,\n inputSchema: z.object({\n reasoning: z\n .string()\n .describe(\n 'Your reasoning for why this SQL query is relevant to the user request.',\n ),\n sql: z\n .string()\n .min(1, { message: 'SQL query cannot be empty.' })\n .refine(\n (sql) =>\n sql.trim().toUpperCase().startsWith('SELECT') ||\n sql.trim().toUpperCase().startsWith('WITH'),\n {\n message: 'Only read-only SELECT or WITH queries are allowed.',\n },\n )\n .describe('The SQL query to execute against the database.'),\n }),\n execute: ({ sql }, options) => {\n const state = toState<DeveloperContextVariables>(options);\n return state.adapter.execute(sql);\n },\n }),\n\n /**\n * Get plain-English explanation of a SQL query.\n */\n explain_sql: tool({\n description: dedent`\n Get a plain-English explanation of a SQL query.\n Use this to help the user understand what a query does.\n\n The explanation focuses on intent and logic, not syntax.\n `,\n inputSchema: z.object({\n sql: z.string().min(1).describe('The SQL query to explain'),\n }),\n execute: async ({ sql }) => {\n return explainSql(sql);\n },\n }),\n};\n\n/**\n * Context fragments defining the developer agent's persona and behavior.\n */\nconst fragments: ContextFragment[] = [\n persona({\n name: 'developer_assistant',\n role: 'You are an expert SQL developer assistant helping power users build and refine queries.',\n objective:\n 'Help power users build and refine SQL queries with precision and clarity',\n }),\n hint('Be transparent: show the SQL you generate before explaining it'),\n hint('Be precise: provide exact column names and table references'),\n hint('Suggest refinements and alternatives when appropriate'),\n hint('Support both natural language questions AND raw SQL input'),\n hint('When validating user SQL, explain any errors clearly'),\n];\n\n/**\n * Developer agent exports - tools and context fragments.\n * The agent is constructed dynamically in sql.ts developer() method.\n */\nexport default { tools, fragments };\n", "import { groq } from '@ai-sdk/groq';\nimport z from 'zod';\n\nimport {\n ContextEngine,\n InMemoryContextStore,\n fragment,\n persona,\n structuredOutput,\n user,\n} from '@deepagents/context';\n\nconst outputSchema = z.object({\n explanation: z.string().describe('The explanation of the SQL query.'),\n});\n\n/**\n * Generates a plain English explanation for a SQL query.\n */\nexport async function explainSql(\n sql: string,\n): Promise<{ explanation: string }> {\n const context = new ContextEngine({\n store: new InMemoryContextStore(),\n chatId: `explainer-${crypto.randomUUID()}`,\n userId: 'system',\n });\n\n context.set(\n persona({\n name: 'explainer',\n role: 'You are an expert SQL tutor.',\n objective:\n 'Explain SQL queries in plain English that non-technical users understand',\n }),\n fragment('sql', sql),\n fragment('task', 'Focus on the intent and logic, not the syntax.'),\n user('Explain this SQL query in plain English to a non-technical user.'),\n );\n\n const explainerOutput = structuredOutput({\n model: groq('openai/gpt-oss-20b'),\n context,\n schema: outputSchema,\n });\n\n return explainerOutput.generate();\n}\n", "const sqlValidationMarker = Symbol('SQLValidationError');\nconst unanswerableSqlMarker = Symbol('UnanswerableSQLError');\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", "import { tool } from 'ai';\nimport { createBashTool } from 'bash-tool';\nimport chalk from 'chalk';\nimport {\n Bash,\n type CommandContext,\n type CommandNode,\n type IFileSystem,\n MountableFs,\n OverlayFs,\n type ScriptNode,\n type WordNode,\n defineCommand,\n parse,\n} from 'just-bash';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport * as path from 'node:path';\nimport { v7 } from 'uuid';\nimport z from 'zod';\n\nimport type { SkillPathMapping } from '@deepagents/context';\n\nimport type { Adapter } from '../adapters/adapter.ts';\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\ninterface SubcommandDefinition {\n usage: string;\n description: string;\n handler: (\n args: string[],\n ctx: CommandContext,\n ) => CommandResult | Promise<CommandResult>;\n}\n\n/**\n * Creates a command with subcommands using a declarative API.\n *\n * @example\n * const cmd = createCommand('sql', {\n * run: {\n * usage: 'run \"SELECT ...\"',\n * description: 'Execute query',\n * handler: async (args, ctx) => ({ stdout: '...', stderr: '', exitCode: 0 })\n * }\n * });\n */\nfunction createCommand(\n name: string,\n subcommands: Record<string, SubcommandDefinition>,\n) {\n const usageLines = Object.entries(subcommands)\n .map(([, def]) => ` ${name} ${def.usage.padEnd(30)} ${def.description}`)\n .join('\\n');\n\n return defineCommand(name, async (args, ctx) => {\n const subcommand = args[0];\n const restArgs = args.slice(1);\n\n if (subcommand && subcommand in subcommands) {\n return subcommands[subcommand].handler(restArgs, ctx);\n }\n\n return {\n stdout: '',\n stderr: `${name}: ${subcommand ? `unknown subcommand '${subcommand}'` : 'missing subcommand'}\\n\\nUsage:\\n${usageLines}`,\n exitCode: 1,\n };\n });\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// SQL Command Implementation\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validates that a query is read-only (SELECT or WITH).\n */\nfunction validateReadOnly(query: string): { valid: boolean; error?: string } {\n const upper = query.toUpperCase().trim();\n if (!upper.startsWith('SELECT') && !upper.startsWith('WITH')) {\n return { valid: false, error: 'only SELECT or WITH queries allowed' };\n }\n return { valid: true };\n}\n\ntype MetaStore = AsyncLocalStorage<{ value?: Record<string, unknown> }>;\n\nfunction createSqlCommand(adapter: Adapter, metaStore: MetaStore) {\n return createCommand('sql', {\n run: {\n usage: 'run \"SELECT ...\"',\n description: 'Execute query and store results',\n handler: async (args, ctx) => {\n const rawQuery = args.join(' ').trim();\n\n if (!rawQuery) {\n return {\n stdout: '',\n stderr: 'sql run: no query provided',\n exitCode: 1,\n };\n }\n\n const validation = validateReadOnly(rawQuery);\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `sql run: ${validation.error}`,\n exitCode: 1,\n };\n }\n\n const query = adapter.format(rawQuery);\n const store = metaStore.getStore();\n if (store) store.value = { formattedSql: query };\n\n const syntaxError = await adapter.validate(query);\n if (syntaxError) {\n return {\n stdout: '',\n stderr: `sql run: ${syntaxError}`,\n exitCode: 1,\n };\n }\n\n try {\n const rows = await adapter.execute(query);\n const rowsArray = Array.isArray(rows) ? rows : [];\n const content = JSON.stringify(rowsArray, null, 2);\n\n const filename = `${v7()}.json`;\n const sqlPath = `/sql/${filename}`;\n\n await ctx.fs.mkdir('/sql', { recursive: true });\n await ctx.fs.writeFile(sqlPath, content);\n\n const columns =\n rowsArray.length > 0 ? Object.keys(rowsArray[0] as object) : [];\n\n return {\n stdout:\n [\n `results stored in ${sqlPath}`,\n `columns: ${columns.join(', ') || '(none)'}`,\n `rows: ${rowsArray.length}`,\n ].join('\\n') + '\\n',\n stderr: '',\n exitCode: 0,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: `sql run: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n };\n }\n },\n },\n validate: {\n usage: 'validate \"SELECT ...\"',\n description: 'Validate query syntax',\n handler: async (args) => {\n const rawQuery = args.join(' ').trim();\n\n if (!rawQuery) {\n return {\n stdout: '',\n stderr: 'sql validate: no query provided',\n exitCode: 1,\n };\n }\n\n const validation = validateReadOnly(rawQuery);\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `sql validate: ${validation.error}`,\n exitCode: 1,\n };\n }\n\n const query = adapter.format(rawQuery);\n const store = metaStore.getStore();\n if (store) store.value = { formattedSql: query };\n\n const syntaxError = await adapter.validate(query);\n if (syntaxError) {\n return {\n stdout: '',\n stderr: `sql validate: ${syntaxError}`,\n exitCode: 1,\n };\n }\n\n return {\n stdout: 'valid\\n',\n stderr: '',\n exitCode: 0,\n };\n },\n },\n });\n}\n\nconst BLOCKED_DB_CLIENT_COMMANDS = new Set([\n 'psql',\n 'sqlite3',\n 'mysql',\n 'duckdb',\n]);\nconst BLOCKED_RAW_SQL_COMMANDS = new Set(['select', 'with']);\nconst ALLOWED_SQL_PROXY_SUBCOMMANDS = new Set(['run', 'validate']);\nconst SHELL_INTERPRETER_COMMANDS = new Set([\n 'bash',\n 'sh',\n 'zsh',\n 'dash',\n 'ksh',\n]);\nconst WRAPPER_COMMANDS = new Set(['env', 'command', 'eval']);\nconst SQL_PROXY_ENFORCEMENT_MESSAGE = [\n 'Direct database querying through bash is blocked.',\n 'Use SQL proxy commands in this order:',\n '1) sql validate \"SELECT ...\"',\n '2) sql run \"SELECT ...\"',\n].join('\\n');\n\ntype SqlInspectionMode = 'blocked-only' | 'block-all-sql';\n\ntype FunctionDefCommand = Extract<CommandNode, { type: 'FunctionDef' }>;\n\ninterface InspectionContext {\n functionDefinitions: Map<string, FunctionDefCommand>;\n callStack: Set<string>;\n}\n\ninterface CommandInspectionOptions {\n stdinFromPipe: boolean;\n}\n\ninterface ShellInvocationDescriptor {\n kind: 'command' | 'script' | 'stdin' | 'none' | 'unknown';\n payload: string | null;\n}\n\ninterface WrapperCommandResolution {\n kind: 'resolved' | 'none' | 'unknown';\n name?: WordNode;\n args?: WordNode[];\n}\n\nfunction cloneInspectionContext(context: InspectionContext): InspectionContext {\n return {\n functionDefinitions: new Map(context.functionDefinitions),\n callStack: new Set(context.callStack),\n };\n}\n\nfunction asStaticWordText(word: WordNode | null | undefined): string | null {\n if (!word) {\n return null;\n }\n return asStaticWordPartText(\n word.parts as unknown as Array<Record<string, unknown>>,\n );\n}\n\nfunction asStaticWordPartText(\n parts: Array<Record<string, unknown>>,\n): string | null {\n let text = '';\n\n for (const part of parts) {\n const type = part.type;\n\n if (type === 'Literal' || type === 'SingleQuoted' || type === 'Escaped') {\n if (typeof part.value !== 'string') {\n return null;\n }\n text += part.value;\n continue;\n }\n\n if (type === 'DoubleQuoted') {\n if (!Array.isArray(part.parts)) {\n return null;\n }\n const inner = asStaticWordPartText(\n part.parts as Array<Record<string, unknown>>,\n );\n if (inner == null) {\n return null;\n }\n text += inner;\n continue;\n }\n\n return null;\n }\n\n return text;\n}\n\nfunction isScriptNode(value: unknown): value is ScriptNode {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const node = value as Record<string, unknown>;\n return node.type === 'Script' && Array.isArray(node.statements);\n}\n\nfunction scriptContainsBlockedCommand(\n script: ScriptNode,\n context: InspectionContext,\n mode: SqlInspectionMode = 'blocked-only',\n): boolean {\n return statementsContainBlockedCommand(script.statements, context, mode);\n}\n\nfunction statementsContainBlockedCommand(\n statements: Array<{ pipelines: Array<{ commands: CommandNode[] }> }>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const statement of statements) {\n if (statementContainsBlockedCommand(statement, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction statementContainsBlockedCommand(\n statement: { pipelines: Array<{ commands: CommandNode[] }> },\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const pipeline of statement.pipelines) {\n if (pipelineContainsBlockedCommand(pipeline, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction pipelineContainsBlockedCommand(\n pipeline: { commands: CommandNode[] },\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const [index, command] of pipeline.commands.entries()) {\n if (command.type === 'FunctionDef') {\n context.functionDefinitions.set(command.name, command);\n continue;\n }\n if (\n commandContainsBlockedCommand(command, context, mode, {\n stdinFromPipe: index > 0,\n })\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction stringCommandContainsBlockedCommand(\n command: string,\n context: InspectionContext,\n mode: SqlInspectionMode = 'blocked-only',\n): boolean {\n let script: ScriptNode;\n try {\n script = parse(command);\n } catch {\n return false;\n }\n\n return scriptContainsBlockedCommand(\n script,\n cloneInspectionContext(context),\n mode,\n );\n}\n\nfunction wordContainsBlockedCommand(\n word: WordNode | null | undefined,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n if (!word) {\n return false;\n }\n\n return wordPartContainsBlockedCommand(\n word.parts as unknown as Array<Record<string, unknown>>,\n context,\n mode,\n );\n}\n\nfunction wordPartContainsBlockedCommand(\n parts: Array<Record<string, unknown>>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const part of parts) {\n if (partContainsBlockedCommand(part, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction partContainsBlockedCommand(\n node: Record<string, unknown>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n const type = node.type;\n\n if (type === 'CommandSubstitution' || type === 'ProcessSubstitution') {\n if (isScriptNode(node.body)) {\n return scriptContainsBlockedCommand(\n node.body,\n cloneInspectionContext(context),\n mode,\n );\n }\n return false;\n }\n\n if (type === 'ArithCommandSubst' && typeof node.command === 'string') {\n return stringCommandContainsBlockedCommand(node.command, context, mode);\n }\n\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === 'object' && item !== null) {\n if (\n partContainsBlockedCommand(\n item as Record<string, unknown>,\n context,\n mode,\n )\n ) {\n return true;\n }\n }\n }\n continue;\n }\n\n if (typeof value === 'object' && value !== null) {\n if (\n partContainsBlockedCommand(\n value as Record<string, unknown>,\n context,\n mode,\n )\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction functionInvocationContainsBlockedCommand(\n functionName: string,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n const definition = context.functionDefinitions.get(functionName);\n if (!definition) {\n return false;\n }\n\n if (context.callStack.has(functionName)) {\n return false;\n }\n\n const invocationContext = cloneInspectionContext(context);\n invocationContext.callStack.add(functionName);\n return commandContainsBlockedCommand(\n definition.body,\n invocationContext,\n mode,\n { stdinFromPipe: false },\n );\n}\n\nfunction isAsciiLetter(character: string): boolean {\n const charCode = character.charCodeAt(0);\n return (\n (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)\n );\n}\n\nfunction isAsciiDigit(character: string): boolean {\n const charCode = character.charCodeAt(0);\n return charCode >= 48 && charCode <= 57;\n}\n\nfunction isValidEnvVariableName(name: string): boolean {\n if (!name) {\n return false;\n }\n\n const firstChar = name[0];\n if (!(isAsciiLetter(firstChar) || firstChar === '_')) {\n return false;\n }\n\n for (let index = 1; index < name.length; index += 1) {\n const char = name[index];\n if (!(isAsciiLetter(char) || isAsciiDigit(char) || char === '_')) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isEnvAssignmentToken(token: string): boolean {\n const separatorIndex = token.indexOf('=');\n if (separatorIndex <= 0) {\n return false;\n }\n\n return isValidEnvVariableName(token.slice(0, separatorIndex));\n}\n\nfunction parseShortOptionCluster(option: string): {\n valid: boolean;\n hasCommandFlag: boolean;\n hasStdinFlag: boolean;\n consumesNextArg: boolean;\n} {\n if (\n !option.startsWith('-') ||\n option.startsWith('--') ||\n option.length <= 1\n ) {\n return {\n valid: false,\n hasCommandFlag: false,\n hasStdinFlag: false,\n consumesNextArg: false,\n };\n }\n\n let hasCommandFlag = false;\n let hasStdinFlag = false;\n let consumesNextArg = false;\n\n for (let index = 1; index < option.length; index += 1) {\n const char = option[index];\n if (!isAsciiLetter(char)) {\n return {\n valid: false,\n hasCommandFlag: false,\n hasStdinFlag: false,\n consumesNextArg: false,\n };\n }\n\n if (char === 'c') {\n hasCommandFlag = true;\n } else if (char === 's') {\n hasStdinFlag = true;\n } else if (char === 'O' || char === 'o') {\n consumesNextArg = true;\n }\n }\n\n return { valid: true, hasCommandFlag, hasStdinFlag, consumesNextArg };\n}\n\nfunction getShellInvocationDescriptor(\n args: WordNode[],\n): ShellInvocationDescriptor {\n let readsFromStdin = false;\n const longOptionsWithValue = new Set(['--rcfile', '--init-file']);\n\n for (let index = 0; index < args.length; index += 1) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown', payload: null };\n }\n\n if (token === '--') {\n if (index + 1 >= args.length) {\n break;\n }\n return {\n kind: 'script',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (token === '--command') {\n return {\n kind: 'command',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (token.startsWith('--command=')) {\n return {\n kind: 'command',\n payload: token.slice('--command='.length),\n };\n }\n\n if (token.startsWith('--')) {\n if (token.includes('=')) {\n continue;\n }\n\n if (longOptionsWithValue.has(token)) {\n if (index + 1 >= args.length) {\n return { kind: 'unknown', payload: null };\n }\n index += 1;\n }\n continue;\n }\n\n if (token.startsWith('-') && !token.startsWith('--')) {\n const parsed = parseShortOptionCluster(token);\n if (!parsed.valid) {\n return { kind: 'unknown', payload: null };\n }\n\n if (parsed.hasCommandFlag) {\n return {\n kind: 'command',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (parsed.hasStdinFlag) {\n readsFromStdin = true;\n }\n\n if (parsed.consumesNextArg) {\n if (index + 1 >= args.length) {\n return { kind: 'unknown', payload: null };\n }\n index += 1;\n }\n continue;\n }\n\n return {\n kind: 'script',\n payload: token,\n };\n }\n\n if (readsFromStdin) {\n return { kind: 'stdin', payload: null };\n }\n\n return { kind: 'none', payload: null };\n}\n\nfunction getHereDocPayload(\n redirections: Array<{\n target: { type?: string; content?: WordNode };\n }>,\n): { hasHereDoc: boolean; payload: string | null } {\n const payloads: string[] = [];\n\n for (const redirection of redirections) {\n if (redirection.target.type !== 'HereDoc') {\n continue;\n }\n\n if (!redirection.target.content) {\n payloads.push('');\n continue;\n }\n\n const payload = asStaticWordText(redirection.target.content);\n if (payload == null) {\n return { hasHereDoc: true, payload: null };\n }\n\n payloads.push(payload);\n }\n\n if (payloads.length === 0) {\n return { hasHereDoc: false, payload: null };\n }\n\n return { hasHereDoc: true, payload: payloads.join('\\n') };\n}\n\nfunction joinStaticWords(words: WordNode[]): string | null {\n const tokens: string[] = [];\n\n for (const word of words) {\n const token = asStaticWordText(word);\n if (token == null) {\n return null;\n }\n tokens.push(token);\n }\n\n return tokens.join(' ');\n}\n\nfunction resolveEnvWrapperCommand(args: WordNode[]): WrapperCommandResolution {\n let index = 0;\n\n while (index < args.length) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown' };\n }\n\n if (token === '--') {\n index += 1;\n break;\n }\n\n if (token === '-u' || token === '--unset' || token === '--chdir') {\n if (index + 1 >= args.length) {\n return { kind: 'unknown' };\n }\n index += 2;\n continue;\n }\n\n if (token.startsWith('--unset=') || token.startsWith('--chdir=')) {\n index += 1;\n continue;\n }\n\n if (\n token.startsWith('-') &&\n token !== '-' &&\n !isEnvAssignmentToken(token)\n ) {\n index += 1;\n continue;\n }\n\n if (isEnvAssignmentToken(token)) {\n index += 1;\n continue;\n }\n\n break;\n }\n\n if (index >= args.length) {\n return { kind: 'none' };\n }\n\n return {\n kind: 'resolved',\n name: args[index],\n args: args.slice(index + 1),\n };\n}\n\nfunction resolveCommandWrapperCommand(\n args: WordNode[],\n): WrapperCommandResolution {\n let index = 0;\n let lookupOnly = false;\n\n while (index < args.length) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown' };\n }\n\n if (token === '--') {\n index += 1;\n break;\n }\n\n if (token === '-v' || token === '-V') {\n lookupOnly = true;\n index += 1;\n continue;\n }\n\n if (token.startsWith('-') && token !== '-') {\n index += 1;\n continue;\n }\n\n break;\n }\n\n if (lookupOnly || index >= args.length) {\n return { kind: 'none' };\n }\n\n return {\n kind: 'resolved',\n name: args[index],\n args: args.slice(index + 1),\n };\n}\n\nfunction commandContainsBlockedCommand(\n command: CommandNode,\n context: InspectionContext,\n mode: SqlInspectionMode,\n options: CommandInspectionOptions = { stdinFromPipe: false },\n): boolean {\n switch (command.type) {\n case 'SimpleCommand':\n return isBlockedSimpleCommand(command, context, mode, options);\n case 'If':\n return (\n command.clauses.some(\n (clause) =>\n statementsContainBlockedCommand(\n clause.condition,\n cloneInspectionContext(context),\n mode,\n ) ||\n statementsContainBlockedCommand(\n clause.body,\n cloneInspectionContext(context),\n mode,\n ),\n ) ||\n (command.elseBody\n ? statementsContainBlockedCommand(\n command.elseBody,\n cloneInspectionContext(context),\n mode,\n )\n : false)\n );\n case 'For':\n case 'CStyleFor':\n return statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n );\n case 'While':\n case 'Until':\n return (\n statementsContainBlockedCommand(\n command.condition,\n cloneInspectionContext(context),\n mode,\n ) ||\n statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n )\n );\n case 'Case':\n return command.items.some((item) =>\n statementsContainBlockedCommand(\n item.body,\n cloneInspectionContext(context),\n mode,\n ),\n );\n case 'Subshell':\n case 'Group':\n return statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n );\n case 'FunctionDef':\n return false;\n case 'ArithmeticCommand':\n case 'ConditionalCommand':\n return false;\n default: {\n const _unreachable: never = command;\n return _unreachable;\n }\n }\n}\n\nfunction isBlockedSimpleCommand(\n command: {\n name: WordNode | null;\n args: WordNode[];\n assignments: Array<{\n value: WordNode | null;\n array: WordNode[] | null;\n }>;\n redirections: Array<{\n target: { type?: string; content?: WordNode };\n }>;\n },\n context: InspectionContext,\n mode: SqlInspectionMode,\n options: CommandInspectionOptions,\n): boolean {\n if (wordContainsBlockedCommand(command.name, context, mode)) {\n return true;\n }\n\n if (\n command.args.some((arg) => wordContainsBlockedCommand(arg, context, mode))\n ) {\n return true;\n }\n\n if (\n command.assignments.some(\n (assignment) =>\n wordContainsBlockedCommand(assignment.value, context, mode) ||\n (assignment.array?.some((value) =>\n wordContainsBlockedCommand(value, context, mode),\n ) ??\n false),\n )\n ) {\n return true;\n }\n\n if (\n command.redirections.some((redirection) => {\n if (redirection.target.type === 'Word') {\n return wordContainsBlockedCommand(\n redirection.target as unknown as WordNode,\n context,\n mode,\n );\n }\n if (redirection.target.type === 'HereDoc' && redirection.target.content) {\n return wordContainsBlockedCommand(\n redirection.target.content,\n context,\n mode,\n );\n }\n return false;\n })\n ) {\n return true;\n }\n\n const commandName = asStaticWordText(command.name);\n if (!commandName) {\n return false;\n }\n\n const normalizedName = path.posix.basename(commandName).toLowerCase();\n\n if (BLOCKED_DB_CLIENT_COMMANDS.has(normalizedName)) {\n return true;\n }\n\n if (BLOCKED_RAW_SQL_COMMANDS.has(normalizedName)) {\n return true;\n }\n\n if (normalizedName === 'sql') {\n const subcommand = asStaticWordText(command.args[0])?.toLowerCase();\n if (!subcommand) {\n return true;\n }\n if (mode === 'block-all-sql') {\n return true;\n }\n return !ALLOWED_SQL_PROXY_SUBCOMMANDS.has(subcommand);\n }\n\n const inspectWrappedCommand = (\n resolved: WrapperCommandResolution,\n ): boolean => {\n if (resolved.kind === 'none') {\n return false;\n }\n\n if (resolved.kind === 'unknown' || !resolved.name || !resolved.args) {\n return true;\n }\n\n return isBlockedSimpleCommand(\n {\n name: resolved.name,\n args: resolved.args,\n assignments: [],\n redirections: [],\n },\n context,\n 'block-all-sql',\n options,\n );\n };\n\n if (WRAPPER_COMMANDS.has(normalizedName)) {\n if (normalizedName === 'env') {\n return inspectWrappedCommand(resolveEnvWrapperCommand(command.args));\n }\n\n if (normalizedName === 'command') {\n return inspectWrappedCommand(resolveCommandWrapperCommand(command.args));\n }\n\n const evalScript = joinStaticWords(command.args);\n if (evalScript == null) {\n return true;\n }\n if (!evalScript.trim()) {\n return false;\n }\n return stringCommandContainsBlockedCommand(\n evalScript,\n context,\n 'block-all-sql',\n );\n }\n\n if (SHELL_INTERPRETER_COMMANDS.has(normalizedName)) {\n const shellInvocation = getShellInvocationDescriptor(command.args);\n if (shellInvocation.kind === 'unknown') {\n return true;\n }\n\n if (shellInvocation.kind === 'command') {\n if (!shellInvocation.payload) {\n return true;\n }\n if (\n stringCommandContainsBlockedCommand(\n shellInvocation.payload,\n context,\n 'block-all-sql',\n )\n ) {\n return true;\n }\n return false;\n }\n\n const hereDoc = getHereDocPayload(command.redirections);\n if (hereDoc.hasHereDoc) {\n if (hereDoc.payload == null) {\n return true;\n }\n if (\n hereDoc.payload.trim().length > 0 &&\n stringCommandContainsBlockedCommand(\n hereDoc.payload,\n context,\n 'block-all-sql',\n )\n ) {\n return true;\n }\n }\n\n if (shellInvocation.kind === 'script') {\n // Executing shell script files can hide SQL proxy bypasses.\n return true;\n }\n\n if (options.stdinFromPipe || shellInvocation.kind === 'stdin') {\n // Cannot safely inspect stdin-fed shell scripts unless content is explicit here-doc.\n return !hereDoc.hasHereDoc;\n }\n }\n\n if (functionInvocationContainsBlockedCommand(commandName, context, mode)) {\n return true;\n }\n\n return false;\n}\n\nfunction getSqlProxyEnforcementResult(command: string): CommandResult | null {\n const trimmed = command.trim();\n if (!trimmed) {\n return null;\n }\n\n let script: ScriptNode;\n try {\n script = parse(trimmed);\n } catch {\n return null;\n }\n\n const blocked = scriptContainsBlockedCommand(script, {\n functionDefinitions: new Map(),\n callStack: new Set(),\n });\n if (!blocked) {\n return null;\n }\n\n return {\n stdout: '',\n stderr: `${SQL_PROXY_ENFORCEMENT_MESSAGE}\\n`,\n exitCode: 1,\n };\n}\n\n/**\n * Options for creating result tools.\n */\nexport interface ResultToolsOptions {\n /** Database adapter for executing SQL queries */\n adapter: Adapter;\n /** Skill mounts mapping host paths to sandbox paths */\n skillMounts: SkillPathMapping[];\n /** Filesystem for storage */\n filesystem: IFileSystem;\n}\n\n/**\n * Creates bash tool with integrated sql command.\n *\n * The agent sees only one tool: `bash`\n * SQL is executed via: sql run \"SELECT ...\"\n */\nexport async function createResultTools(options: ResultToolsOptions) {\n const { adapter, skillMounts, filesystem: baseFs } = options;\n\n const metaStore: MetaStore = new AsyncLocalStorage();\n const sqlCommand = createSqlCommand(adapter, metaStore);\n\n const fsMounts = skillMounts.map(({ host, sandbox }) => ({\n mountPoint: path.dirname(sandbox),\n filesystem: new OverlayFs({\n root: path.dirname(host),\n mountPoint: '/',\n readOnly: true,\n }),\n }));\n\n const filesystem = new MountableFs({\n base: baseFs,\n mounts: fsMounts,\n });\n\n const bashInstance = new Bash({\n customCommands: [sqlCommand],\n fs: filesystem,\n });\n\n const { sandbox, tools } = await createBashTool({\n sandbox: bashInstance,\n destination: '/',\n extraInstructions:\n 'Every bash tool call must include a brief non-empty \"reasoning\" input explaining why the command is needed.',\n onBeforeBashCall: ({ command }) => {\n console.log(chalk.cyan(`[onBeforeBashCall]: ${command}`));\n return { command };\n },\n onAfterBashCall: ({ result }) => {\n if (result.exitCode !== 0) {\n console.log(chalk.yellow(`[onAfterBashCall]: ${result.exitCode}`));\n }\n return { result };\n },\n });\n\n const guardedSandbox = {\n ...sandbox,\n executeCommand: async (command: string) => {\n const blockedResult = getSqlProxyEnforcementResult(command);\n if (blockedResult) {\n return blockedResult;\n }\n return sandbox.executeCommand(command);\n },\n };\n\n const bash = tool({\n ...(tools as any).bash,\n inputSchema: z.object({\n command: z.string().describe('The bash command to execute'),\n reasoning: z\n .string()\n .trim()\n .describe('Brief reason for executing this command'),\n }),\n execute: async ({ command }, execOptions) => {\n const execute = tools.bash.execute;\n if (!execute) {\n throw new Error('bash tool execution is not available');\n }\n\n const blockedResult = getSqlProxyEnforcementResult(command);\n if (blockedResult) {\n return blockedResult;\n }\n\n return metaStore.run({}, async () => {\n const result = await execute({ command }, execOptions);\n const meta = metaStore.getStore()?.value;\n return meta ? { ...result, meta } : result;\n });\n },\n toModelOutput: ({ output }) => {\n if (typeof output !== 'object' || output === null) {\n return { type: 'json' as const, value: output };\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { meta, ...rest } = output as unknown as Record<string, unknown>;\n return { type: 'json' as const, value: rest };\n },\n });\n\n return {\n sandbox: guardedSandbox,\n tools: {\n ...tools,\n bash,\n },\n };\n}\n", "import { groq } from '@ai-sdk/groq';\nimport {\n APICallError,\n JSONParseError,\n NoContentGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n TypeValidationError,\n defaultSettingsMiddleware,\n wrapLanguageModel,\n} from 'ai';\nimport dedent from 'dedent';\nimport pRetry from 'p-retry';\nimport z from 'zod';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n ContextEngine,\n type ContextFragment,\n InMemoryContextStore,\n example,\n fragment,\n guardrail,\n hint,\n persona,\n policy,\n structuredOutput,\n user,\n workflow,\n} from '@deepagents/context';\n\nimport type { Adapter } from '../adapters/adapter.ts';\nimport { SQLValidationError, UnanswerableSQLError } from './exceptions.ts';\n\nexport interface ToSqlOptions {\n /** The natural language input to convert to SQL */\n input: string;\n /** Database adapter for validation */\n adapter: Adapter;\n /** Context fragments (schema + instructions/teachings) */\n fragments: ContextFragment[];\n /** Optional model override */\n model: AgentModel;\n /** Maximum retry attempts on validation failure (default: 3) */\n maxRetries?: number;\n}\n\nexport interface ToSqlResult {\n /** The generated SQL query */\n sql: string;\n /** Number of attempts made */\n attempts: number;\n /** Validation errors encountered (if any retries occurred) */\n errors?: string[];\n}\n\n/** Temperature progression for retries: deterministic first, then increasingly exploratory */\nconst RETRY_TEMPERATURES = [0, 0.2, 0.3];\nconst SQL_AGENT_ROLE = 'Expert SQL query generator.';\nconst SQL_AGENT_OBJECTIVE = 'Generate precise SQL grounded in provided schema.';\n\nconst SQL_AGENT_POLICIES: ContextFragment[] = [\n fragment(\n 'schema_mapping',\n policy({\n rule: 'Translate natural language into precise SQL grounded in available schema entities.',\n }),\n hint('Preserve schema spelling exactly, including typos in column names.'),\n ),\n fragment(\n 'projection_minimality',\n policy({\n rule: 'Return only columns requested by the question; do not add helper columns unless explicitly requested.',\n }),\n policy({\n rule: 'For requests of the form \"X sorted/ordered by Y\", project X only unless Y is explicitly requested as an output field.',\n }),\n policy({\n rule: 'Prefer selecting schema columns directly without derived expressions when direct selection answers the request.',\n }),\n hint(\n 'Do not include ORDER BY, GROUP BY, or JOIN helper columns in SELECT output unless the question explicitly asks for them.',\n ),\n policy({\n rule: 'Use DISTINCT only when uniqueness is explicitly requested (for example distinct/unique/different/no duplicates).',\n }),\n hint(\n 'Do not infer DISTINCT from generic wording such as \"some\", plural nouns, or entity-set phrasing; for transactional/attendance-style tables, default to raw rows unless uniqueness is explicitly requested.',\n ),\n ),\n fragment(\n 'date_transform_safety',\n policy({\n rule: 'Do not assume VARCHAR/TEXT values are parseable dates. Avoid date extraction functions on text columns by default.',\n }),\n policy({\n rule: 'Use date-part extraction only when both conditions hold: the question explicitly asks for transformation and schema values require transformation to produce that unit.',\n }),\n hint(\n 'Do not apply SUBSTR, STRFTIME, DATE_PART, YEAR, or similar extraction functions unless the question explicitly asks for transformation and schema values require it.',\n ),\n hint(\n 'If a column already represents the requested concept (for example a stored year-like value), use the column as-is.',\n ),\n ),\n fragment(\n 'sql_minimality',\n guardrail({\n rule: 'Never hallucinate tables or columns.',\n reason: 'Schema fidelity is required.',\n action: 'Use only available schema entities.',\n }),\n guardrail({\n rule: 'Avoid unnecessary transformations and derived projections.',\n reason:\n 'Extra transformations frequently change semantics and reduce correctness.',\n action:\n 'Do not add date parsing, substring extraction, or derived columns unless explicitly required by the question or schema.',\n }),\n ),\n fragment(\n 'preflight_checklist',\n workflow({\n task: 'Final SQL preflight before returning output',\n steps: [\n 'Verify selected columns match the question and remove unrequested helper projections.',\n 'If aggregate values are used only for ranking/filtering, keep them out of SELECT unless explicitly requested.',\n 'Prefer raw schema columns over derived expressions when raw columns already satisfy the request.',\n 'If a candidate query uses STRFTIME, SUBSTR, DATE_PART, YEAR, or similar extraction on text-like columns, remove that transformation unless explicitly required by the question.',\n 'Return only schema-grounded SQL using existing tables and columns.',\n ],\n }),\n ),\n fragment(\n 'set_semantics',\n policy({\n rule: 'For questions asking where both condition A and condition B hold over an attribute, compute the intersection of qualifying sets for that attribute.',\n }),\n policy({\n rule: 'Do not force the same entity instance to satisfy both conditions unless the question explicitly requests the same person/row/entity.',\n }),\n hint(\n 'Prefer INTERSECT (or logically equivalent set-based shape) over requiring the same physical row/entity to satisfy both conditions unless explicitly requested.',\n ),\n hint(\n 'When two conditions describe different row groups whose shared attribute is requested, build each group separately and intersect the attribute values.',\n ),\n hint(\n 'Do not collapse cross-group conditions into a single-row AND predicate when the intent is shared values across groups.',\n ),\n policy({\n rule: 'If two predicates on the same field cannot both be true for one row, do not combine them with AND; use set operations across separate filtered subsets when shared values are requested.',\n }),\n ),\n fragment(\n 'predicate_column_alignment',\n policy({\n rule: 'Match literal values to semantically compatible columns. Do not compare descriptive names to identifier columns.',\n }),\n hint(\n 'When a filter value is a descriptive label (for example a department name), join through the lookup table and filter on its name/title column, not on *_id columns.',\n ),\n hint(\n 'When relation roles are explicit in wording (for example host/home/source/destination), prefer foreign keys with matching role qualifiers over generic similarly named columns.',\n ),\n policy({\n rule: 'When multiple foreign-key candidates exist, select the column whose qualifier best matches the relationship described in the question.',\n }),\n policy({\n rule: 'For hosting/held semantics, prefer host_* relationship columns when available over generic *_id alternatives.',\n }),\n hint(\n 'Interpret wording like \"held/hosted a competition or event\" as a hosting relationship and map to host_* foreign keys when present.',\n ),\n policy({\n rule: 'Do not compare descriptive labels or names to *_id columns; join to the table containing the descriptive field and filter there.',\n }),\n policy({\n rule: 'Keep numeric identifiers unquoted when used as numeric equality filters unless schema indicates text identifiers.',\n }),\n policy({\n rule: 'When filtering by a descriptive label value and a related table exposes a corresponding *_name or title column, join to that table and filter on the descriptive column.',\n }),\n ),\n fragment(\n 'ordering_semantics',\n policy({\n rule: 'Respect explicit sort direction terms. If direction is not specified, use ascending order unless a superlative intent (most/least/highest/lowest) implies direction.',\n }),\n policy({\n rule: 'When ranking categories by frequency, use COUNT for ordering but keep output focused on requested category fields unless counts are explicitly requested.',\n }),\n policy({\n rule: 'Do not use DESC unless descending direction is explicit or a superlative intent requires descending ranking.',\n }),\n policy({\n rule: 'For \"most common/frequent <attribute>\" requests, return the attribute value(s) only; use counts only for ordering/filtering unless the question explicitly asks to return counts.',\n }),\n hint(\n 'Use DESC with LIMIT 1 for \"most/highest/largest\"; use ASC with LIMIT 1 for \"least/lowest/smallest\".',\n ),\n ),\n fragment(\n 'negative_membership_queries',\n policy({\n rule: 'For requests asking entities that did not participate/host/appear in related records, prefer NOT IN or NOT EXISTS against the related foreign-key set.',\n }),\n hint(\n 'Map role-bearing relationship columns carefully (for example host_* foreign keys for hosting relationships) instead of generic IDs when role wording is explicit.',\n ),\n hint(\n 'For \"never had/never exceeded\" conditions over history tables, exclude entities via NOT IN/NOT EXISTS against the disqualifying entity-id set (often built with GROUP BY/HAVING MAX(...)).',\n ),\n ),\n fragment(\n 'join_completeness',\n policy({\n rule: 'Preserve entity-restricting joins implied by the question. Do not widen results by querying only a broader attribute table when a subset entity table is available.',\n }),\n policy({\n rule: 'If an entity term in the question maps to a table, keep that table in query scope and join to attribute tables rather than dropping the entity table.',\n }),\n hint(\n 'If the question targets a specific entity group, include that entity table and its join conditions even when selected columns come from a related table.',\n ),\n hint(\n 'When the question names an entity type and a relation table links to that entity via *_id, include the entity table in scope instead of counting only relation rows.',\n ),\n hint(\n 'Prefer INNER JOIN by default; use LEFT JOIN only when the question explicitly requests including unmatched rows or zero-related entities.',\n ),\n ),\n fragment(\n 'aggregation_exactness',\n policy({\n rule: 'Preserve requested aggregation semantics exactly: use COUNT(*) by default for total rows, use COUNT(DISTINCT ...) only when uniqueness is explicitly requested, and group by stable entity keys when computing per-entity aggregates.',\n }),\n policy({\n rule: 'For questions asking which entity has lowest/highest average of a metric, compute AVG(metric) per entity (GROUP BY entity) and rank those aggregates.',\n }),\n hint(\n 'For \"how many <entities>\" questions over relation records, default to COUNT(*) on qualifying rows unless explicit uniqueness language is present.',\n ),\n ),\n fragment(\n 'query_shape_examples',\n example({\n question:\n 'List categories ordered by how many records belong to each category.',\n answer:\n 'SELECT category FROM records GROUP BY category ORDER BY COUNT(*)',\n }),\n example({\n question:\n 'Show labels shared by rows with metric > 100 and rows with metric < 10.',\n answer:\n 'SELECT label FROM records WHERE metric > 100 INTERSECT SELECT label FROM records WHERE metric < 10',\n }),\n example({\n question: 'List locations that have not hosted any event.',\n answer:\n 'SELECT location_name FROM locations WHERE location_id NOT IN (SELECT host_location_id FROM events)',\n }),\n example({\n question: 'List the most common category across records.',\n answer:\n 'SELECT category FROM records GROUP BY category ORDER BY COUNT(*) DESC LIMIT 1',\n }),\n ),\n];\n\n/** Extract SQL from markdown fenced code block if present */\nfunction extractSql(output: string): string {\n const match = output.match(/```sql\\n?([\\s\\S]*?)```/);\n return match ? match[1].trim() : output.trim();\n}\n\nexport async function toSql(options: ToSqlOptions): Promise<ToSqlResult> {\n const { maxRetries = 3 } = options;\n\n return withRetry(\n async (attemptNumber, errors, attempts) => {\n const context = new ContextEngine({\n store: new InMemoryContextStore(),\n chatId: `sql-gen-${crypto.randomUUID()}`,\n userId: 'system',\n });\n\n context.set(\n persona({\n name: 'Freya',\n role: SQL_AGENT_ROLE,\n objective: SQL_AGENT_OBJECTIVE,\n // role: `You are a data science expert that provides well-reasoned and detailed responses.`,\n // objective: `Your task is to understand the schema and generate a valid SQL query to answer the question. You first think about the reasoning process as an internal monologue and then provide the user with the answer.`,\n }),\n ...SQL_AGENT_POLICIES,\n ...options.fragments,\n );\n\n // Add user message(s)\n if (errors.length) {\n const lastError = errors.at(-1);\n context.set(\n user(dedent`\n Answer the following question with the SQL code. Use the piece of evidence and base your answer on the database schema.\nGiven the question, the evidence and the database schema, return the SQL script that addresses the question.\n\nQuestion: ${options.input}\n`),\n UnanswerableSQLError.isInstance(lastError)\n ? user(\n `<retry_instruction>Your previous response marked the task as unanswerable. Re-evaluate using best-effort schema mapping. If the core intent is answerable with existing tables/columns, return SQL. Return error only when required core intent cannot be mapped without inventing schema elements.</retry_instruction>`,\n )\n : user(\n `<validation_error>Your previous SQL query had the following error: ${lastError?.message}. Please fix the query.</validation_error>`,\n ),\n );\n } else {\n context.set(\n user(dedent`\n Answer the following question with the SQL code. Use the piece of evidence and base your answer on the database schema.\nGiven the question, the evidence and the database schema, return the SQL script that addresses the question.\n\nQuestion: ${options.input}\n`),\n );\n }\n\n // Create structured output with schema\n const temperature =\n RETRY_TEMPERATURES[attemptNumber - 1] ??\n RETRY_TEMPERATURES[RETRY_TEMPERATURES.length - 1];\n const baseModel = options.model ?? groq('openai/gpt-oss-20b');\n const model = wrapLanguageModel({\n model: baseModel,\n middleware: defaultSettingsMiddleware({ settings: { temperature } }),\n });\n const sqlOutput = structuredOutput({\n model: model,\n context,\n schema: z.object({\n result: z.union([\n z.object({\n sql: z\n .string()\n .describe('The SQL query that answers the question'),\n reasoning: z\n .string()\n .describe('The reasoning steps taken to generate the SQL'),\n }),\n z.object({\n error: z\n .string()\n .describe(\n 'Error message explaining why the question cannot be answered with the given schema',\n ),\n }),\n ]),\n }),\n });\n\n const { result: output } = await sqlOutput.generate();\n\n const finalizeSql = async (rawSql: string): Promise<ToSqlResult> => {\n const sql = options.adapter.format(extractSql(rawSql));\n\n const validationError = await options.adapter.validate(sql);\n if (validationError) {\n throw new SQLValidationError(validationError);\n }\n\n return {\n attempts,\n sql,\n errors: errors.length ? errors.map(formatErrorMessage) : undefined,\n };\n };\n\n // Handle error responses (question is unanswerable with given schema)\n if ('error' in output) {\n context.set(\n user(\n '<best_effort_fallback>Do not return unanswerable. Produce the best valid SQL query that answers the core intent using only available schema entities.</best_effort_fallback>',\n ),\n );\n const forcedSqlOutput = structuredOutput({\n model,\n context,\n schema: z.object({\n sql: z\n .string()\n .describe(\n 'Best-effort SQL query that answers the core intent using only available schema entities.',\n ),\n reasoning: z\n .string()\n .describe('Reasoning steps for best-effort schema mapping.'),\n }),\n });\n\n try {\n const forced = await forcedSqlOutput.generate();\n return await finalizeSql(forced.sql);\n } catch (error) {\n if (\n SQLValidationError.isInstance(error) ||\n APICallError.isInstance(error) ||\n JSONParseError.isInstance(error) ||\n TypeValidationError.isInstance(error) ||\n NoObjectGeneratedError.isInstance(error) ||\n NoOutputGeneratedError.isInstance(error) ||\n NoContentGeneratedError.isInstance(error)\n ) {\n throw error;\n }\n throw new UnanswerableSQLError(output.error);\n }\n }\n\n return await finalizeSql(output.sql);\n },\n { retries: maxRetries - 1 },\n );\n}\n\nfunction formatErrorMessage(error: Error) {\n if (APICallError.isInstance(error)) {\n if (error.message.startsWith('Failed to validate JSON')) {\n return `Schema validation failed: ${error.message}`;\n }\n return error.message;\n }\n if (SQLValidationError.isInstance(error)) {\n return `SQL Validation Error: ${error.message}`;\n }\n return error.message;\n}\n\nfunction isModelUnavailableError(error: unknown): boolean {\n if (!APICallError.isInstance(error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n const responseBody = (error.responseBody ?? '').toLowerCase();\n const is404ModelError =\n error.statusCode === 404 &&\n (message.includes('model') || responseBody.includes('model_not_found'));\n const errorCode =\n typeof error.data === 'object' &&\n error.data !== null &&\n 'error' in error.data &&\n typeof error.data.error === 'object' &&\n error.data.error !== null &&\n 'code' in error.data.error &&\n typeof error.data.error.code === 'string'\n ? error.data.error.code.toLowerCase()\n : undefined;\n\n return (\n is404ModelError ||\n errorCode === 'model_not_found' ||\n responseBody.includes('\"code\":\"model_not_found\"') ||\n (message.includes('model') &&\n message.includes('does not exist or you do not have access to it'))\n );\n}\n\nasync function withRetry<T>(\n computation: (\n attemptNumber: number,\n errors: Error[],\n attempts: number,\n ) => Promise<T>,\n options: { retries: number } = { retries: 3 },\n) {\n const errors: Error[] = [];\n let attempts = 0;\n return pRetry(\n (attemptNumber) => {\n return computation(attemptNumber, errors, ++attempts);\n },\n {\n retries: options.retries,\n shouldRetry: (context) => {\n // Retry one time when the model marks query as unanswerable to recover from false positives.\n if (UnanswerableSQLError.isInstance(context.error)) {\n return false;\n // disable retryng here will also disable the forced sql generation fallback.\n // return context.attemptNumber === 0;\n }\n // Don't retry if the selected model is unavailable\n if (isModelUnavailableError(context.error)) {\n return false;\n }\n // Retry on validation errors\n if (SQLValidationError.isInstance(context.error)) {\n return true;\n }\n console.log({\n NoObjectGeneratedError: NoObjectGeneratedError.isInstance(\n context.error,\n ),\n NoOutputGeneratedError: NoOutputGeneratedError.isInstance(\n context.error,\n ),\n APICallError: APICallError.isInstance(context.error),\n JSONParseError: JSONParseError.isInstance(context.error),\n TypeValidationError: TypeValidationError.isInstance(context.error),\n NoContentGeneratedError: NoContentGeneratedError.isInstance(\n context.error,\n ),\n });\n // Retry on AI SDK errors\n return (\n APICallError.isInstance(context.error) ||\n JSONParseError.isInstance(context.error) ||\n TypeValidationError.isInstance(context.error) ||\n NoObjectGeneratedError.isInstance(context.error) ||\n NoOutputGeneratedError.isInstance(context.error) ||\n NoContentGeneratedError.isInstance(context.error)\n );\n },\n onFailedAttempt(context) {\n // console.log(\n // `Attempt ${context.attemptNumber} failed. There are ${context.retriesLeft} retries left.`,\n // );\n // console.dir(context.error, { depth: null });\n errors.push(context.error);\n },\n },\n );\n}\n", "import { groq } from '@ai-sdk/groq';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport { agent, thirdPersonPrompt } from '@deepagents/agent';\n\nimport type { Introspection } from '../adapters/adapter.ts';\nimport { databaseSchemaPrompt } from '../prompt.ts';\n\ntype SuggestionsAgentContext = {\n context?: string;\n adapterInfo?: string;\n};\ntype SuggestionsAgentOutput = {\n suggestions: {\n question: string;\n sql: string;\n businessValue: string;\n }[];\n};\n\nexport const suggestionsAgent = agent<\n SuggestionsAgentOutput,\n SuggestionsAgentContext\n>({\n name: 'text2sql-suggestions',\n model: groq('openai/gpt-oss-20b'),\n output: z.object({\n suggestions: z\n .array(\n z.object({\n question: z\n .string()\n .describe('A complex, high-impact business question.'),\n sql: z\n .string()\n .describe('The SQL statement needed to answer the question.'),\n businessValue: z\n .string()\n .describe('Why the question matters to stakeholders.'),\n }),\n )\n .min(1)\n .max(5)\n .describe('A set of up to two advanced question + SQL pairs.'),\n }),\n prompt: (state) => {\n return dedent`\n ${thirdPersonPrompt()}\n\n <identity>\n You are a senior analytics strategist who proposes ambitious business questions\n and drafts the SQL needed to answer them. You specialize in identifying ideas\n that combine multiple tables, apply segmentation or time analysis, and surface\n metrics that drive executive decisions.\n </identity>\n\n\n <instructions>\n - Recommend one or two UNIQUE questions that go beyond simple counts or listings.\n - Favor questions that require joins, aggregates, time comparisons, cohort analysis,\n or window functions.\n - For each question, explain the business reason stakeholders care about it.\n - Provide the complete SQL query that could answer the question in the given schema.\n - Keep result sets scoped with LIMIT clauses (max 50 rows) when returning raw rows.\n - Ensure table/column names match the provided schema exactly.\n - Use columns marked [LowCardinality: ...] to identify meaningful categorical filters or segmentations.\n - Leverage table [rows / size] hints to determine whether to aggregate (large tables) or inspect detailed data (tiny tables).\n - Reference PK/Indexed annotations and the Indexes list to recommend queries that use efficient join/filter paths.\n - Column annotations may expose ranges/null percentages\u2014use them to suggest realistic thresholds or quality checks.\n - Consult <relationship_examples> to anchor your recommendations in the actual join paths between tables.\n - Output only information grounded in the schema/context provided.\n </instructions>\n\n <response-format>\n Return valid JSON that satisfies the defined output schema.\n </response-format>\n `;\n },\n});\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport pLimit from 'p-limit';\n\nexport interface CheckpointOptions {\n /** Path to the checkpoint file */\n path: string;\n /** Hash to detect config changes - if changed, checkpoint is invalidated */\n configHash?: string;\n}\n\n/**\n * Codec for encoding/decoding values during checkpoint operations.\n * Use this when storing objects with methods (like Teachables) that need\n * to be serialized to plain JSON and restored with their methods.\n */\nexport interface Codec<T, TSerialized = unknown> {\n /** Convert runtime value to JSON-serializable format */\n encode: (value: T) => TSerialized;\n /** Convert stored JSON back to runtime value */\n decode: (serialized: TSerialized) => T;\n}\n\ninterface PointEntry {\n inputHash: string;\n output: unknown;\n}\n\ninterface PointData {\n committed: boolean;\n entries: PointEntry[];\n}\n\ninterface CheckpointFile {\n configHash?: string;\n points: Record<string, PointData>;\n}\n\nexport class Checkpoint {\n private points: Record<string, PointData>;\n private path: string;\n private configHash: string | undefined;\n\n private constructor(\n path: string,\n configHash: string | undefined,\n points: Record<string, PointData>,\n ) {\n this.points = points;\n this.path = path;\n this.configHash = configHash;\n }\n\n /**\n * Load checkpoint from file, or return empty checkpoint if none exists.\n * Handles corrupted files and config changes gracefully.\n */\n static async load(options: CheckpointOptions): Promise<Checkpoint> {\n const { path, configHash } = options;\n\n if (existsSync(path)) {\n try {\n const content = readFileSync(path, 'utf-8');\n const file: CheckpointFile = JSON.parse(content);\n\n // Check if config changed\n if (configHash && file.configHash && file.configHash !== configHash) {\n console.log('\u26A0 Config changed, starting fresh');\n return new Checkpoint(path, configHash, {});\n }\n\n const points = file.points ?? {};\n const totalEntries = Object.values(points).reduce(\n (sum, p) => sum + p.entries.length,\n 0,\n );\n console.log(`\u2713 Resuming from checkpoint (${totalEntries} entries)`);\n return new Checkpoint(path, configHash, points);\n } catch {\n console.log('\u26A0 Checkpoint corrupted, starting fresh');\n return new Checkpoint(path, configHash, {});\n }\n }\n\n console.log('Starting new checkpoint');\n return new Checkpoint(path, configHash, {});\n }\n\n /**\n * Run a single computation with checkpointing.\n * If already completed, returns cached value.\n *\n * @param key - Unique identifier for this computation\n * @param computation - Async function that produces the value\n * @param codec - Optional codec for encoding/decoding non-primitive values\n */\n async run<T>(\n key: string,\n computation: () => Promise<T>,\n codec?: Codec<T>,\n ): Promise<T> {\n const point = this.point<T>(key);\n\n // Use fixed input hash for single-value runs\n return point.through(\n 'single',\n async () => {\n const result = await computation();\n return codec ? (codec.encode(result) as T) : result;\n },\n codec,\n );\n }\n\n /**\n * Create a resumable checkpoint point for iterative operations.\n *\n * @param step - Unique identifier for this checkpoint point\n */\n point<T>(step: string): Point<T> {\n this.points[step] ??= { committed: false, entries: [] };\n return new Point<T>(this.points[step], () => this.save());\n }\n\n /**\n * Process each input with automatic checkpointing and concurrency.\n *\n * @param step - Unique identifier for this checkpoint\n * @param inputs - Items to process\n * @param process - Function to process each input\n * @param options - Optional settings like concurrency\n * @returns All outputs (use `.flat()` if outputs are arrays)\n */\n async each<I, O>(\n step: string,\n inputs: Iterable<I>,\n process: (input: I) => Promise<O>,\n options?: { concurrency?: number },\n ): Promise<O[]> {\n const point = this.point<O>(step);\n const limit = pLimit(options?.concurrency ?? 1);\n\n const inputArray = Array.from(inputs);\n await Promise.all(\n inputArray.map((input) =>\n limit(() => point.through(input, () => process(input))),\n ),\n );\n\n await point.commit();\n return point.values();\n }\n\n /**\n * Get clean output from all completed points.\n * Single-entry points return the value directly, multi-entry return arrays.\n */\n getOutput(): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n for (const [key, pointData] of Object.entries(this.points)) {\n if (pointData.entries.length === 1) {\n output[key] = pointData.entries[0].output;\n } else {\n output[key] = pointData.entries.map((e) => e.output);\n }\n }\n return output;\n }\n\n /** Get the file path where checkpoint is stored */\n getPath(): string {\n return this.path;\n }\n\n private async save(): Promise<void> {\n const file: CheckpointFile = {\n configHash: this.configHash,\n points: this.points,\n };\n const content = JSON.stringify(file, null, 2);\n\n // Atomic write: write to temp file, then rename\n const tempPath = `${this.path}.tmp`;\n writeFileSync(tempPath, content);\n renameSync(tempPath, this.path);\n }\n}\n\nfunction hash(value: unknown): string {\n return createHash('md5').update(JSON.stringify(value)).digest('hex');\n}\n\n/**\n * A checkpoint point for tracking iterative operations.\n * Uses input hashing to determine if an operation was already processed.\n */\nexport class Point<T> {\n #cache: Map<string, T>;\n private data: PointData;\n private persist: () => Promise<void>;\n\n constructor(data: PointData, persist: () => Promise<void>) {\n this.#cache = new Map(\n data.entries.map((e) => [e.inputHash, e.output as T]),\n );\n this.data = data;\n this.persist = persist;\n }\n\n /**\n * Execute computation if input wasn't processed before.\n * Returns cached output if input hash exists, otherwise executes, saves, and returns.\n */\n async through<I, O>(\n input: I,\n compute: () => Promise<O>,\n codec?: Codec<O>,\n ): Promise<O> {\n const inputHash = hash(input);\n\n if (this.#cache.has(inputHash)) {\n const cached = this.#cache.get(inputHash) as O;\n return codec ? codec.decode(cached) : cached;\n }\n\n const output = await compute();\n this.data.entries.push({ inputHash, output });\n this.#cache.set(inputHash, output as T);\n await this.persist();\n return codec ? codec.decode(output) : output;\n }\n\n /** Mark this point as complete. */\n async commit(): Promise<void> {\n this.data.committed = true;\n await this.persist();\n }\n\n /** Check if this point has been committed. */\n isCommitted(): boolean {\n return this.data.committed;\n }\n\n /** Get all outputs from this point. */\n values(): T[] {\n return this.data.entries.map((e) => e.output as T);\n }\n}\n\n/**\n * Generate a hash from a config object for checkpoint invalidation.\n * If config changes, the checkpoint will be invalidated and pipeline restarts.\n */\nexport function hashConfig(config: Record<string, unknown>): string {\n return createHash('md5').update(JSON.stringify(config)).digest('hex');\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nexport class FileCache {\n public path: string;\n constructor(watermark: string, extension = '.txt') {\n const hash = createHash('md5').update(watermark).digest('hex');\n this.path = path.join(tmpdir(), `text2sql-${hash}${extension}`);\n }\n\n async get() {\n if (existsSync(this.path)) {\n return readFile(this.path, 'utf-8');\n }\n return null;\n }\n\n set(content: string) {\n return writeFile(this.path, content, 'utf-8');\n }\n}\n\nexport class JsonCache<T> extends FileCache {\n constructor(watermark: string) {\n super(watermark, '.json');\n }\n\n async read(): Promise<T | null> {\n const content = await this.get();\n if (content) {\n return JSON.parse(content) as T;\n }\n return null;\n }\n\n write(data: T) {\n return this.set(JSON.stringify(data));\n }\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport * as path from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\n\nimport SQLITE_FS_DDL from './ddl.sqlite-fs.sql';\n\n// Types not exported from just-bash main index but defined in IFileSystem\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\n/**\n * Options for creating a SQLite filesystem.\n */\nexport interface SqliteFsOptions {\n /** Path to SQLite database file */\n dbPath: string;\n\n /**\n * Root path prefix for all operations (required).\n * All filesystem operations will be scoped under this path.\n * Use '/' for root-level storage without namespace isolation.\n *\n * @example\n * // With root: '/chat-123/results'\n * // writeFile('/file.json') \u2192 stores at '/chat-123/results/file.json'\n * // readFile('/file.json') \u2192 reads from '/chat-123/results/file.json'\n */\n root: string;\n\n /** Chunk size for large files in bytes (default: 1MB) */\n chunkSize?: number;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlinkTarget: string | null;\n}\n\ninterface ChunkRow {\n data: Uint8Array;\n}\n\n/**\n * SQLite-based filesystem implementing IFileSystem interface.\n *\n * Provides persistent storage for files and directories using SQLite.\n * Files are stored in chunks (default 1MB) to handle large files efficiently.\n *\n * Uses WAL mode and prepared statement caching for performance.\n */\nexport class SqliteFs implements IFileSystem {\n #db: DatabaseSync;\n #statements = new Map<string, ReturnType<DatabaseSync['prepare']>>();\n #chunkSize: number;\n #root: string;\n\n constructor(options: SqliteFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024; // 1MB default\n // Normalize root; if user passes '/', treat as empty (root-level storage)\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n this.#db = new DatabaseSync(options.dbPath);\n this.#db.exec(SQLITE_FS_DDL);\n\n // Always ensure '/' exists first (for all instances sharing the DB)\n const rootSlashExists = this.#stmt(\n 'SELECT 1 FROM fs_entries WHERE path = ?',\n ).get('/');\n if (!rootSlashExists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES ('/', 'directory', 493, 0, ?)`,\n ).run(Date.now());\n }\n\n if (this.#root) {\n this.#createParentDirs(this.#root);\n\n const rootExists = this.#stmt(\n 'SELECT 1 FROM fs_entries WHERE path = ?',\n ).get(this.#root);\n if (!rootExists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(this.#root, Date.now());\n }\n }\n }\n\n /**\n * Create parent directories for a path (used during initialization).\n * Creates all segments EXCEPT the last one (the path itself).\n */\n #createParentDirs(p: string): void {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n currentPath,\n );\n\n if (!exists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(currentPath, Date.now());\n }\n }\n }\n\n #stmt(sql: string): ReturnType<DatabaseSync['prepare']> {\n let stmt = this.#statements.get(sql);\n if (!stmt) {\n stmt = this.#db.prepare(sql);\n this.#statements.set(sql, stmt);\n }\n return stmt;\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n // path.posix.join('/root', '/') incorrectly returns '/root/'\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n // Should not happen unless a symlink escapes the configured root.\n // Return the best-effort canonical path to avoid breaking callers.\n return p;\n }\n\n #useTransaction<T>(fn: () => T): T {\n this.#db.exec('BEGIN TRANSACTION');\n try {\n const result = fn();\n this.#db.exec('COMMIT');\n return result;\n } catch (error) {\n this.#db.exec('ROLLBACK');\n throw error;\n }\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n #ensureParentExists(filePath: string): void {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n parent,\n ) as { type: string } | undefined;\n\n if (!entry) {\n this.#ensureParentExists(parent);\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(parent, Date.now());\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n #writeChunks(filePath: string, content: Uint8Array): void {\n this.#stmt('DELETE FROM fs_chunks WHERE path = ?').run(filePath);\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(filePath, Math.floor(i / this.#chunkSize), chunk);\n }\n }\n\n #readChunks(filePath: string): Uint8Array {\n const rows = this.#stmt(\n 'SELECT data FROM fs_chunks WHERE path = ? ORDER BY chunkIndex',\n ).all(filePath) as unknown as ChunkRow[];\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(row.data, offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n #resolveSymlink(p: string, seen = new Set<string>()): string {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const entry = this.#stmt(\n 'SELECT type, symlinkTarget FROM fs_entries WHERE path = ?',\n ).get(p) as Pick<FsEntryRow, 'type' | 'symlinkTarget'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlinkTarget!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', 420, ?, ?)\n ON CONFLICT(path) DO UPDATE SET\n type = 'file',\n size = excluded.size,\n mtime = excluded.mtime`,\n ).run(prefixed, data.length, Date.now());\n\n this.#writeChunks(prefixed, data);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n const entry = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry ? this.#readChunks(prefixed) : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', 420, ?, ?)\n ON CONFLICT(path) DO UPDATE SET\n size = excluded.size,\n mtime = excluded.mtime`,\n ).run(prefixed, combined.length, Date.now());\n\n this.#writeChunks(prefixed, combined);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const row = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n prefixed,\n );\n return row !== undefined;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as FsEntryRow | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false, // stat follows symlinks\n mode: entry.mode,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n prefixed,\n ) as FsEntryRow | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: entry.mode,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existing = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (existing) {\n if (options?.recursive) {\n return; // Already exists, ok for recursive\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n this.#useTransaction(() => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const exists = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(currentPath) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!exists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(currentPath, Date.now());\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n // Non-recursive: parent must exist\n const parent = this.#dirname(prefixed);\n const parentEntry = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(parent) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(prefixed, Date.now());\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n // Get direct children (path starts with dir/ but doesn't have another / after)\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = this.#stmt(\n `SELECT path FROM fs_entries\n WHERE path LIKE ? || '%'\n AND path != ?\n AND path NOT LIKE ? || '%/%'`,\n ).all(prefix, resolved, prefix) as { path: string }[];\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = this.#stmt(\n `SELECT path, type FROM fs_entries\n WHERE path LIKE ? || '%'\n AND path != ?\n AND path NOT LIKE ? || '%/%'`,\n ).all(prefix, resolved, prefix) as Pick<FsEntryRow, 'path' | 'type'>[];\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n prefixed,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n this.#useTransaction(() => {\n if (entry.type === 'directory') {\n const children = this.#stmt(\n `SELECT 1 FROM fs_entries WHERE path LIKE ? || '/%' LIMIT 1`,\n ).get(prefixed);\n\n if (children && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n // Chunks cascade via FK\n this.#stmt(\n `DELETE FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).run(prefixed, prefixed);\n } else {\n this.#stmt('DELETE FROM fs_entries WHERE path = ?').run(prefixed);\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n if (srcEntry.type === 'directory') {\n const allEntries = this.#stmt(\n `SELECT * FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).all(srcPrefixed, srcPrefixed) as unknown as FsEntryRow[];\n\n for (const entry of allEntries) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n this.#stmt(\n `INSERT OR REPLACE INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlinkTarget,\n );\n\n if (entry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(entry.path) as { chunkIndex: number; data: Uint8Array }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(newPath, chunk.chunkIndex, chunk.data);\n }\n }\n }\n } else {\n this.#stmt(\n `INSERT OR REPLACE INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlinkTarget,\n );\n\n if (srcEntry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as { chunkIndex: number; data: Uint8Array }[];\n\n this.#stmt('DELETE FROM fs_chunks WHERE path = ?').run(destPrefixed);\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n if (srcEntry.type === 'directory') {\n // Reverse order: children before parents for delete\n const allEntries = this.#stmt(\n `SELECT * FROM fs_entries WHERE path = ? OR path LIKE ? || '/%' ORDER BY path DESC`,\n ).all(srcPrefixed, srcPrefixed) as unknown as FsEntryRow[];\n\n for (const entry of [...allEntries].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlinkTarget,\n );\n\n if (entry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(entry.path) as unknown as {\n chunkIndex: number;\n data: Uint8Array;\n }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(newPath, chunk.chunkIndex, chunk.data);\n }\n }\n }\n\n // Chunks cascade via FK\n this.#stmt(\n `DELETE FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).run(srcPrefixed, srcPrefixed);\n } else {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlinkTarget,\n );\n\n if (srcEntry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as unknown as {\n chunkIndex: number;\n data: Uint8Array;\n }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n }\n\n this.#stmt('DELETE FROM fs_entries WHERE path = ?').run(srcPrefixed);\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n const rows = this.#stmt(\n 'SELECT path FROM fs_entries ORDER BY path',\n ).all() as {\n path: string;\n }[];\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const exists = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n resolved,\n );\n if (!exists) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const result = this.#stmt(\n 'UPDATE fs_entries SET mtime = ? WHERE path = ?',\n ).run(mtime.getTime(), resolved);\n\n if (result.changes === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = this.#stmt(\n 'UPDATE fs_entries SET mode = ? WHERE path = ?',\n ).run(mode, prefixed);\n\n if (result.changes === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existing = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n prefixed,\n );\n if (existing) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, 'symlink', 511, 0, ?, ?)`,\n ).run(prefixed, Date.now(), target);\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existing = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n destPrefixed,\n );\n if (existing) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n // Hard link: duplicate the entry and chunks\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', ?, ?, ?)`,\n ).run(destPrefixed, srcEntry.mode, srcEntry.size, Date.now());\n\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as { chunkIndex: number; data: Uint8Array }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt(\n 'SELECT type, symlinkTarget FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type' | 'symlinkTarget'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlinkTarget!;\n }\n}\n", "-- SQLite-based filesystem schema for artifact storage\n-- Tables: fs_entries (file/directory metadata), fs_chunks (file content)\n\n-- Performance PRAGMAs (session-level, run on each connection)\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000;\nPRAGMA temp_store = MEMORY;\nPRAGMA mmap_size = 268435456;\n\n-- Integrity\nPRAGMA foreign_keys = ON;\n\n-- Filesystem entries table (files, directories, symlinks)\nCREATE TABLE IF NOT EXISTS fs_entries (\n path TEXT PRIMARY KEY, -- Normalized absolute path (e.g., '/results/uuid.json')\n type TEXT NOT NULL, -- 'file' | 'directory' | 'symlink'\n mode INTEGER NOT NULL, -- Unix permissions (e.g., 0o644 = 420)\n size INTEGER NOT NULL, -- File size in bytes (0 for directories)\n mtime INTEGER NOT NULL, -- Modified time (milliseconds since epoch)\n symlinkTarget TEXT -- Target path for symlinks (NULL for files/dirs)\n);\n\nCREATE INDEX IF NOT EXISTS idx_fs_entries_type ON fs_entries(type);\n\n-- File content chunks table (for handling large files)\n-- Files are split into 1MB chunks to avoid SQLite BLOB performance issues\nCREATE TABLE IF NOT EXISTS fs_chunks (\n path TEXT NOT NULL, -- Reference to fs_entries.path\n chunkIndex INTEGER NOT NULL, -- 0-based chunk sequence\n data BLOB NOT NULL, -- Chunk content (up to 1MB default)\n PRIMARY KEY (path, chunkIndex),\n FOREIGN KEY (path) REFERENCES fs_entries(path) ON DELETE CASCADE ON UPDATE CASCADE\n);\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport type { ConnectionPool, Transaction, config } from 'mssql';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\n\nimport { mssqlFsDDL } from './ddl.mssql-fs.ts';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface MssqlFsOptions {\n /** SQL Server connection pool or configuration. Can be a connection string, config object, or existing ConnectionPool. */\n pool: config | string | ConnectionPool;\n /** Root path prefix for all operations */\n root: string;\n /** Chunk size for large files in bytes (default: 1MB) */\n chunkSize?: number;\n /**\n * SQL Server schema to scope all tables under.\n * Defaults to 'dbo'.\n */\n schema?: string;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlinkTarget: string | null;\n [key: string]: unknown;\n}\n\ninterface ChunkRow {\n data: Buffer;\n [key: string]: unknown;\n}\n\nexport class MssqlFs implements IFileSystem {\n #pool: ConnectionPool;\n #chunkSize: number;\n #root: string;\n #schema: string;\n #ownsPool: boolean;\n #isInitialized = false;\n\n constructor(options: MssqlFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024;\n const schema = options.schema ?? 'dbo';\n if (!/^[a-zA-Z_]\\w*$/.test(schema)) {\n throw new Error(`Invalid schema name: \"${schema}\"`);\n }\n this.#schema = schema;\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n\n const mssql = MssqlFs.#requireMssql();\n if (options.pool instanceof mssql.ConnectionPool) {\n this.#pool = options.pool;\n this.#ownsPool = false;\n } else {\n this.#pool = new mssql.ConnectionPool(options.pool);\n this.#ownsPool = true;\n }\n }\n\n static #requireMssql(): typeof import('mssql') {\n try {\n const require = createRequire(import.meta.url);\n return require('mssql');\n } catch {\n throw new Error(\n 'MssqlFs requires the \"mssql\" package. Install it with: npm install mssql',\n );\n }\n }\n\n #t(name: string): string {\n return `[${this.#schema}].[${name}]`;\n }\n\n async initialize(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.connect();\n }\n\n const schemaReq = this.#pool.request();\n schemaReq.input('schema', this.#schema);\n await schemaReq.query(`\n IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = @schema)\n BEGIN\n DECLARE @sql NVARCHAR(MAX) = N'CREATE SCHEMA ' + QUOTENAME(@schema);\n EXEC sp_executesql @sql;\n END\n `);\n\n const ddl = mssqlFsDDL(this.#schema);\n const batches = ddl.split(/\\bGO\\b/i).filter((b) => b.trim());\n for (const batch of batches) {\n if (batch.trim()) {\n await this.#pool.request().batch(batch);\n }\n }\n\n const rootSlashExists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = '/') THEN 1 ELSE 0 END as [exists]`,\n );\n if (rootSlashExists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ('/', 'directory', 493, 0, @p0)`,\n [Date.now()],\n );\n }\n\n if (this.#root) {\n await this.#createParentDirs(this.#root);\n\n const rootExists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [this.#root],\n );\n if (rootExists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n [this.#root, Date.now()],\n );\n }\n }\n\n this.#isInitialized = true;\n }\n\n #ensureInitialized(): void {\n if (!this.#isInitialized) {\n throw new Error(\n 'MssqlFs not initialized. Call await fs.initialize() after construction.',\n );\n }\n }\n\n async #createParentDirs(p: string): Promise<void> {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [currentPath],\n );\n\n if (exists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n [currentPath, Date.now()],\n );\n }\n }\n }\n\n async #rawQuery<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n const request = this.#pool.request();\n params?.forEach((value, index) => {\n request.input(`p${index}`, value);\n });\n const result = await request.query(sql);\n return result.recordset as T[];\n }\n\n async #rawExec(sql: string, params?: unknown[]): Promise<number> {\n const request = this.#pool.request();\n params?.forEach((value, index) => {\n request.input(`p${index}`, value);\n });\n const result = await request.query(sql);\n return result.rowsAffected[0] ?? 0;\n }\n\n async #query<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n this.#ensureInitialized();\n return this.#rawQuery<T>(sql, params);\n }\n\n async #exec(sql: string, params?: unknown[]): Promise<number> {\n this.#ensureInitialized();\n return this.#rawExec(sql, params);\n }\n\n async #useTransaction<T>(\n fn: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n this.#ensureInitialized();\n const mssql = MssqlFs.#requireMssql();\n const transaction = new mssql.Transaction(this.#pool);\n try {\n await transaction.begin();\n const result = await fn(transaction);\n await transaction.commit();\n return result;\n } catch (error) {\n await transaction.rollback();\n throw error;\n }\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n // Should not happen unless a symlink escapes the configured root.\n // Return the best-effort canonical path to avoid breaking callers.\n return p;\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n async #ensureParentExists(\n filePath: string,\n transaction: Transaction,\n ): Promise<void> {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const request = transaction.request();\n request.input('p0', parent);\n const result = await request.query<{ type: string }>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const entry = result.recordset[0];\n\n if (!entry) {\n await this.#ensureParentExists(parent, transaction);\n const insertReq = transaction.request();\n insertReq.input('p0', parent);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n async #writeChunks(\n filePath: string,\n content: Uint8Array,\n transaction: Transaction,\n ): Promise<void> {\n const deleteReq = transaction.request();\n deleteReq.input('p0', filePath);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n const insertReq = transaction.request();\n insertReq.input('p0', filePath);\n insertReq.input('p1', Math.floor(i / this.#chunkSize));\n insertReq.input('p2', Buffer.from(chunk));\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n\n async #readChunks(\n filePath: string,\n transaction?: Transaction,\n ): Promise<Uint8Array> {\n let rows: ChunkRow[];\n if (transaction) {\n const req = transaction.request();\n req.input('p0', filePath);\n const result = await req.query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = @p0 ORDER BY chunkIndex`,\n );\n rows = result.recordset as ChunkRow[];\n } else {\n rows = await this.#query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = @p0 ORDER BY chunkIndex`,\n [filePath],\n );\n }\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(new Uint8Array(row.data), offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n async #resolveSymlink(p: string, seen = new Set<string>()): Promise<string> {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlinkTarget'>>(\n `SELECT type, symlinkTarget FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [p],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlinkTarget!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.close();\n }\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = await this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const request = transaction.request();\n request.input('p0', prefixed);\n request.input('p1', data.length);\n request.input('p2', Date.now());\n\n await request.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = 'file', size = @p1, mtime = @p2\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime)\n VALUES (@p0, 'file', 420, @p1, @p2);\n `);\n\n await this.#writeChunks(prefixed, data, transaction);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const checkReq = transaction.request();\n checkReq.input('p0', prefixed);\n const result = await checkReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const entry = result.recordset[0];\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry\n ? await this.#readChunks(prefixed, transaction)\n : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n const upsertReq = transaction.request();\n upsertReq.input('p0', prefixed);\n upsertReq.input('p1', combined.length);\n upsertReq.input('p2', Date.now());\n\n await upsertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET size = @p1, mtime = @p2\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime)\n VALUES (@p0, 'file', 420, @p1, @p2);\n `);\n\n await this.#writeChunks(prefixed, combined, transaction);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const rows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [prefixed],\n );\n return rows[0].exists === 1;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false,\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const existing = existingRows[0];\n\n if (existing) {\n if (options?.recursive) {\n return;\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const checkReq = transaction.request();\n checkReq.input('p0', currentPath);\n const result = await checkReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const exists = result.recordset[0];\n\n if (!exists) {\n const insertReq = transaction.request();\n insertReq.input('p0', currentPath);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n const parent = this.#dirname(prefixed);\n const parentReq = transaction.request();\n parentReq.input('p0', parent);\n const parentResult = await parentReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const parentEntry = parentResult.recordset[0];\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n const insertReq = transaction.request();\n insertReq.input('p0', prefixed);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<{ path: string }>(\n `SELECT path FROM ${this.#t('fs_entries')}\n WHERE path LIKE @p0 + '%'\n AND path != @p1\n AND path NOT LIKE @p0 + '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<Pick<FsEntryRow, 'path' | 'type'>>(\n `SELECT path, type FROM ${this.#t('fs_entries')}\n WHERE path LIKE @p0 + '%'\n AND path != @p1\n AND path NOT LIKE @p0 + '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n if (entry.type === 'directory') {\n const childrenReq = transaction.request();\n childrenReq.input('p0', prefixed);\n const childrenResult = await childrenReq.query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path LIKE @p0 + '/%') THEN 1 ELSE 0 END as [exists]`,\n );\n\n if (childrenResult.recordset[0].exists === 1 && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', prefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n } else {\n const deleteReq = transaction.request();\n deleteReq.input('p0', prefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n if (srcEntry.type === 'directory') {\n const allEntriesReq = transaction.request();\n allEntriesReq.input('p0', srcPrefixed);\n const allEntriesResult = await allEntriesReq.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n\n for (const entry of allEntriesResult.recordset) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n const insertReq = transaction.request();\n insertReq.input('p0', newPath);\n insertReq.input('p1', entry.type);\n insertReq.input('p2', entry.mode);\n insertReq.input('p3', entry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', entry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (entry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', newPath);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', entry.path);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', newPath);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n } else {\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.type);\n insertReq.input('p2', srcEntry.mode);\n insertReq.input('p3', srcEntry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', srcEntry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (srcEntry.type === 'file') {\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', destPrefixed);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n if (srcEntry.type === 'directory') {\n const allEntriesReq = transaction.request();\n allEntriesReq.input('p0', srcPrefixed);\n const allEntriesResult = await allEntriesReq.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%' ORDER BY path DESC`,\n );\n\n const destDeleteReq = transaction.request();\n destDeleteReq.input('dp0', destPrefixed);\n await destDeleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @dp0 OR path LIKE @dp0 + '/%'`,\n );\n\n for (const entry of [...allEntriesResult.recordset].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n const insertReq = transaction.request();\n insertReq.input('p0', newPath);\n insertReq.input('p1', entry.type);\n insertReq.input('p2', entry.mode);\n insertReq.input('p3', entry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', entry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (entry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', newPath);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', entry.path);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', newPath);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', srcPrefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n } else {\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.type);\n insertReq.input('p2', srcEntry.mode);\n insertReq.input('p3', srcEntry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', srcEntry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (srcEntry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', destPrefixed);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', srcPrefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n throw new Error(\n 'getAllPaths() is not supported in MssqlFs - use getAllPathsAsync() instead',\n );\n }\n\n async getAllPathsAsync(): Promise<string[]> {\n const rows = await this.#query<{ path: string; [key: string]: unknown }>(\n `SELECT path FROM ${this.#t('fs_entries')} ORDER BY path`,\n );\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [resolved],\n );\n if (rows[0].exists !== 1) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mtime = @p0 WHERE path = @p1`,\n [mtime.getTime(), resolved],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mode = @p0 WHERE path = @p1`,\n [mode, prefixed],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [prefixed],\n );\n if (existingRows[0].exists === 1) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const insertReq = transaction.request();\n insertReq.input('p0', prefixed);\n insertReq.input('p1', Date.now());\n insertReq.input('p2', target);\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, 'symlink', 511, 0, @p1, @p2)`,\n );\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existingRows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [destPrefixed],\n );\n if (existingRows[0].exists === 1) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.mode);\n insertReq.input('p2', srcEntry.size);\n insertReq.input('p3', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES (@p0, 'file', @p1, @p2, @p3)`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlinkTarget'>>(\n `SELECT type, symlinkTarget FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlinkTarget!;\n }\n}\n", "export function mssqlFsDDL(schema: string): string {\n return `\nIF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[${schema}].[fs_entries]') AND type = 'U')\nCREATE TABLE [${schema}].[fs_entries] (\n path NVARCHAR(900) PRIMARY KEY,\n type NVARCHAR(20) NOT NULL,\n mode INT NOT NULL,\n size BIGINT NOT NULL,\n mtime BIGINT NOT NULL,\n symlinkTarget NVARCHAR(900) NULL\n);\nGO\n\nIF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'idx_${schema}_fs_entries_type')\nCREATE INDEX [idx_${schema}_fs_entries_type] ON [${schema}].[fs_entries](type);\nGO\n\nIF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[${schema}].[fs_chunks]') AND type = 'U')\nCREATE TABLE [${schema}].[fs_chunks] (\n path NVARCHAR(900) NOT NULL,\n chunkIndex INT NOT NULL,\n data VARBINARY(MAX) NOT NULL,\n PRIMARY KEY (path, chunkIndex),\n FOREIGN KEY (path) REFERENCES [${schema}].[fs_entries](path) ON DELETE CASCADE ON UPDATE CASCADE\n);\nGO\n`;\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport type { Pool, PoolClient, PoolConfig } from 'pg';\n\nimport { postgresFsDDL } from './ddl.postgres-fs.ts';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface PostgresFsOptions {\n pool: Pool | PoolConfig | string;\n root: string;\n chunkSize?: number;\n schema?: string;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlink_target: string | null;\n [key: string]: unknown;\n}\n\ninterface ChunkRow {\n data: Buffer;\n [key: string]: unknown;\n}\n\nexport class PostgresFs implements IFileSystem {\n #pool: Pool;\n #chunkSize: number;\n #root: string;\n #schema: string;\n #ownsPool: boolean;\n #isInitialized = false;\n\n constructor(options: PostgresFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024;\n const schema = options.schema ?? 'public';\n if (!/^[a-zA-Z_]\\w*$/.test(schema)) {\n throw new Error(`Invalid schema name: \"${schema}\"`);\n }\n this.#schema = schema;\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n\n const pg = PostgresFs.#requirePg();\n if (options.pool instanceof pg.Pool) {\n this.#pool = options.pool;\n this.#ownsPool = false;\n } else {\n this.#pool =\n typeof options.pool === 'string'\n ? new pg.Pool({ connectionString: options.pool })\n : new pg.Pool(options.pool);\n this.#ownsPool = true;\n }\n }\n\n static #requirePg(): typeof import('pg') {\n try {\n const require = createRequire(import.meta.url);\n return require('pg');\n } catch {\n throw new Error(\n 'PostgresFs requires the \"pg\" package. Install it with: npm install pg',\n );\n }\n }\n\n #t(name: string): string {\n return `\"${this.#schema}\".\"${name}\"`;\n }\n\n async initialize(): Promise<void> {\n const ddl = postgresFsDDL(this.#schema);\n await this.#pool.query(ddl);\n\n const rootSlashExists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = '/') AS exists`,\n );\n if (!rootSlashExists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ('/', 'directory', 493, 0, $1)`,\n [Date.now()],\n );\n }\n\n if (this.#root) {\n await this.#createParentDirs(this.#root);\n\n const rootExists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [this.#root],\n );\n if (!rootExists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [this.#root, Date.now()],\n );\n }\n }\n\n this.#isInitialized = true;\n }\n\n #ensureInitialized(): void {\n if (!this.#isInitialized) {\n throw new Error(\n 'PostgresFs not initialized. Call await fs.initialize() after construction.',\n );\n }\n }\n\n async #createParentDirs(p: string): Promise<void> {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [currentPath],\n );\n\n if (!exists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [currentPath, Date.now()],\n );\n }\n }\n }\n\n async #rawQuery<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n const result = await this.#pool.query(sql, params);\n return result.rows as T[];\n }\n\n async #rawExec(sql: string, params?: unknown[]): Promise<number> {\n const result = await this.#pool.query(sql, params);\n return result.rowCount ?? 0;\n }\n\n async #query<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n this.#ensureInitialized();\n return this.#rawQuery<T>(sql, params);\n }\n\n async #exec(sql: string, params?: unknown[]): Promise<number> {\n this.#ensureInitialized();\n return this.#rawExec(sql, params);\n }\n\n async #useTransaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T> {\n this.#ensureInitialized();\n const client = await this.#pool.connect();\n try {\n await client.query('BEGIN');\n const result = await fn(client);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n return p;\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n async #ensureParentExists(\n filePath: string,\n client: PoolClient,\n ): Promise<void> {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const result = await client.query<{ type: string }>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [parent],\n );\n const entry = result.rows[0];\n\n if (!entry) {\n await this.#ensureParentExists(parent, client);\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [parent, Date.now()],\n );\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n async #writeChunks(\n filePath: string,\n content: Uint8Array,\n client: PoolClient,\n ): Promise<void> {\n await client.query(`DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`, [\n filePath,\n ]);\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [filePath, Math.floor(i / this.#chunkSize), Buffer.from(chunk)],\n );\n }\n }\n\n async #readChunks(\n filePath: string,\n client?: PoolClient,\n ): Promise<Uint8Array> {\n let rows: ChunkRow[];\n if (client) {\n const result = await client.query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = $1 ORDER BY chunk_index`,\n [filePath],\n );\n rows = result.rows as ChunkRow[];\n } else {\n rows = await this.#query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = $1 ORDER BY chunk_index`,\n [filePath],\n );\n }\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(new Uint8Array(row.data), offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n async #resolveSymlink(p: string, seen = new Set<string>()): Promise<string> {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlink_target'>>(\n `SELECT type, symlink_target FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [p],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlink_target!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.end();\n }\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = await this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', 420, $2, $3)\n ON CONFLICT (path) DO UPDATE SET type = 'file', size = EXCLUDED.size, mtime = EXCLUDED.mtime`,\n [prefixed, data.length, Date.now()],\n );\n\n await this.#writeChunks(prefixed, data, client);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n const result = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = result.rows[0];\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry\n ? await this.#readChunks(prefixed, client)\n : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', 420, $2, $3)\n ON CONFLICT (path) DO UPDATE SET size = EXCLUDED.size, mtime = EXCLUDED.mtime`,\n [prefixed, combined.length, Date.now()],\n );\n\n await this.#writeChunks(prefixed, combined, client);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const rows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [prefixed],\n );\n return rows[0].exists;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false,\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const existing = existingRows[0];\n\n if (existing) {\n if (options?.recursive) {\n return;\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const result = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [currentPath],\n );\n const exists = result.rows[0];\n\n if (!exists) {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [currentPath, Date.now()],\n );\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n const parent = this.#dirname(prefixed);\n const parentResult = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [parent],\n );\n const parentEntry = parentResult.rows[0];\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [prefixed, Date.now()],\n );\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<{ path: string }>(\n `SELECT path FROM ${this.#t('fs_entries')}\n WHERE path LIKE $1 || '%'\n AND path != $2\n AND path NOT LIKE $1 || '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<Pick<FsEntryRow, 'path' | 'type'>>(\n `SELECT path, type FROM ${this.#t('fs_entries')}\n WHERE path LIKE $1 || '%'\n AND path != $2\n AND path NOT LIKE $1 || '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n await this.#useTransaction(async (client) => {\n if (entry.type === 'directory') {\n const childrenResult = await client.query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path LIKE $1 || '/%') AS exists`,\n [prefixed],\n );\n\n if (childrenResult.rows[0].exists && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [prefixed],\n );\n } else {\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n if (srcEntry.type === 'directory') {\n const allEntriesResult = await client.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [srcPrefixed],\n );\n\n for (const entry of allEntriesResult.rows) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlink_target,\n ],\n );\n\n if (entry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [newPath],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [entry.path],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [newPath, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n } else {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlink_target,\n ],\n );\n\n if (srcEntry.type === 'file') {\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [destPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n if (srcEntry.type === 'directory') {\n const allEntriesResult = await client.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%' ORDER BY path DESC`,\n [srcPrefixed],\n );\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [destPrefixed],\n );\n\n for (const entry of [...allEntriesResult.rows].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlink_target,\n ],\n );\n\n if (entry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [newPath],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [entry.path],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [newPath, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [srcPrefixed],\n );\n } else {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlink_target,\n ],\n );\n\n if (srcEntry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [destPrefixed],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n throw new Error(\n 'getAllPaths() is not supported in PostgresFs - use getAllPathsAsync() instead',\n );\n }\n\n async getAllPathsAsync(): Promise<string[]> {\n const rows = await this.#query<{ path: string; [key: string]: unknown }>(\n `SELECT path FROM ${this.#t('fs_entries')} ORDER BY path`,\n );\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [resolved],\n );\n if (!rows[0].exists) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mtime = $1 WHERE path = $2`,\n [mtime.getTime(), resolved],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mode = $1 WHERE path = $2`,\n [mode, prefixed],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [prefixed],\n );\n if (existingRows[0].exists) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, 'symlink', 511, 0, $2, $3)`,\n [prefixed, Date.now(), target],\n );\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existingRows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [destPrefixed],\n );\n if (existingRows[0].exists) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', $2, $3, $4)`,\n [destPrefixed, srcEntry.mode, srcEntry.size, Date.now()],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlink_target'>>(\n `SELECT type, symlink_target FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlink_target!;\n }\n}\n", "export function postgresFsDDL(schema: string): string {\n return `\nCREATE SCHEMA IF NOT EXISTS \"${schema}\";\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".\"fs_entries\" (\n path TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n mode INTEGER NOT NULL,\n size BIGINT NOT NULL,\n mtime BIGINT NOT NULL,\n symlink_target TEXT\n);\n\nCREATE INDEX IF NOT EXISTS \"idx_${schema}_fs_entries_type\" ON \"${schema}\".\"fs_entries\"(type);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".\"fs_chunks\" (\n path TEXT NOT NULL,\n chunk_index INTEGER NOT NULL,\n data BYTEA NOT NULL,\n PRIMARY KEY (path, chunk_index),\n FOREIGN KEY (path) REFERENCES \"${schema}\".\"fs_entries\"(path) ON DELETE CASCADE ON UPDATE CASCADE\n);\n`;\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\n\ntype BufferEncoding = 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex' | 'binary';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface ScopedFsOptions {\n base: IFileSystem;\n prefix: string;\n}\n\n/**\n * Filesystem wrapper that prefixes all paths with a given prefix.\n * Enables chat-level isolation without modifying command logic.\n *\n * @example\n * const scopedFs = new ScopedFs({\n * base: fs,\n * prefix: '/chat-123',\n * });\n */\nexport class ScopedFs implements IFileSystem {\n #base: IFileSystem;\n #prefix: string;\n\n constructor(options: ScopedFsOptions) {\n this.#base = options.base;\n this.#prefix = options.prefix.replace(/\\/$/, '');\n }\n\n #scope(path: string): string {\n return `${this.#prefix}${path}`;\n }\n\n #unscope(path: string): string {\n if (path === this.#prefix) {\n return '/';\n }\n if (path.startsWith(this.#prefix + '/')) {\n return path.slice(this.#prefix.length) || '/';\n }\n return path;\n }\n\n async writeFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.writeFile(this.#scope(path), content, options);\n }\n\n async appendFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.appendFile(this.#scope(path), content, options);\n }\n\n async mkdir(path: string, options?: MkdirOptions): Promise<void> {\n return this.#base.mkdir(this.#scope(path), options);\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n await this.#base.rm(this.#scope(path), options);\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n await this.#base.cp(this.#scope(src), this.#scope(dest), options);\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.#base.mv(this.#scope(src), this.#scope(dest));\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n return this.#base.chmod(this.#scope(path), mode);\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n await this.#base.symlink(target, this.#scope(linkPath));\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n await this.#base.link(this.#scope(existingPath), this.#scope(newPath));\n }\n\n readFile(\n path: string,\n options?: ReadFileOptions | BufferEncoding,\n ): Promise<string> {\n return this.#base.readFile(this.#scope(path), options);\n }\n\n readFileBuffer(path: string): Promise<Uint8Array> {\n return this.#base.readFileBuffer(this.#scope(path));\n }\n\n stat(path: string): Promise<FsStat> {\n return this.#base.stat(this.#scope(path));\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.#base.lstat(this.#scope(path));\n }\n\n readdir(path: string): Promise<string[]> {\n return this.#base.readdir(this.#scope(path));\n }\n\n readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n return this.#base.readdirWithFileTypes!(this.#scope(path));\n }\n\n exists(path: string): Promise<boolean> {\n return this.#base.exists(this.#scope(path));\n }\n\n readlink(path: string): Promise<string> {\n return this.#base.readlink(this.#scope(path));\n }\n\n realpath(path: string): Promise<string> {\n return this.#base.realpath(this.#scope(path)).then((p) => this.#unscope(p));\n }\n\n utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n return this.#base.utimes(this.#scope(path), atime, mtime);\n }\n\n resolvePath(base: string, relativePath: string): string {\n return this.#base.resolvePath(base, relativePath);\n }\n\n getAllPaths(): string[] {\n const allPaths = this.#base.getAllPaths?.() ?? [];\n return allPaths\n .filter((p) => p.startsWith(this.#prefix))\n .map((p) => p.slice(this.#prefix.length) || '/');\n }\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\n\ntype BufferEncoding = 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex' | 'binary';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport class TrackedFs implements IFileSystem {\n #base: IFileSystem;\n #createdFiles: Set<string> = new Set();\n\n constructor(base: IFileSystem) {\n this.#base = base;\n }\n\n getCreatedFiles(): string[] {\n return [...this.#createdFiles];\n }\n\n async writeFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.writeFile(path, content, options);\n this.#createdFiles.add(path);\n }\n\n async appendFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.appendFile(path, content, options);\n this.#createdFiles.add(path);\n }\n\n async mkdir(path: string, options?: MkdirOptions): Promise<void> {\n return this.#base.mkdir(path, options);\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n await this.#base.rm(path, options);\n this.#createdFiles.delete(path);\n\n if (options?.recursive) {\n const prefix = path.endsWith('/') ? path : path + '/';\n for (const file of this.#createdFiles) {\n if (file.startsWith(prefix)) {\n this.#createdFiles.delete(file);\n }\n }\n }\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n await this.#base.cp(src, dest, options);\n this.#createdFiles.add(dest);\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.#base.mv(src, dest);\n this.#createdFiles.delete(src);\n this.#createdFiles.add(dest);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n return this.#base.chmod(path, mode);\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n await this.#base.symlink(target, linkPath);\n this.#createdFiles.add(linkPath);\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n await this.#base.link(existingPath, newPath);\n this.#createdFiles.add(newPath);\n }\n\n readFile(\n path: string,\n options?: ReadFileOptions | BufferEncoding,\n ): Promise<string> {\n return this.#base.readFile(path, options);\n }\n\n readFileBuffer(path: string): Promise<Uint8Array> {\n return this.#base.readFileBuffer(path);\n }\n\n stat(path: string): Promise<FsStat> {\n return this.#base.stat(path);\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.#base.lstat(path);\n }\n\n readdir(path: string): Promise<string[]> {\n return this.#base.readdir(path);\n }\n\n readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n return this.#base.readdirWithFileTypes!(path);\n }\n\n exists(path: string): Promise<boolean> {\n return this.#base.exists(path);\n }\n\n readlink(path: string): Promise<string> {\n return this.#base.readlink(path);\n }\n\n resolvePath(base: string, relativePath: string): string {\n return this.#base.resolvePath(base, relativePath);\n }\n\n getAllPaths(): string[] {\n return this.#base.getAllPaths?.() ?? [];\n }\n realpath(path: string): Promise<string> {\n return this.#base.realpath(path);\n }\n utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n return this.#base.utimes(path, atime, mtime);\n }\n}\n", "import {\n type ContextFragment,\n clarification,\n example,\n explain,\n fragment,\n guardrail,\n hint,\n policy,\n principle,\n quirk,\n role,\n styleGuide,\n workflow,\n} from '@deepagents/context';\n\nexport interface TeachingsOptions {\n /**\n * Controls date/time clarification behavior:\n * - 'strict': Ask for clarification when date range is missing (production default)\n * - false: Skip date clarifications, assume all matching data (useful for evals/benchmarks)\n */\n date?: 'strict' | false;\n}\n\n/**\n * Meta-cognitive reasoning framework based on advanced prompt engineering.\n * Verbatim from prompt.md with hierarchical structure preserved.\n */\nfunction reasoningFramework(): ContextFragment[] {\n return [\n role(\n 'You are a very strong reasoner and planner. Use these critical instructions to structure your plans, thoughts, and responses.',\n ),\n\n fragment(\n 'meta-cognitive-reasoning-framework',\n hint(\n 'Before taking any action (either tool calls *or* responses to the user), you must proactively, methodically, and independently plan and reason about:',\n ),\n\n // 1) Logical dependencies and constraints\n principle({\n title: 'Logical dependencies and constraints',\n description:\n 'Analyze the intended action against the following factors. Resolve conflicts in order of importance:',\n policies: [\n policy({\n rule: 'Policy-based rules, mandatory prerequisites, and constraints.',\n }),\n policy({\n rule: 'Order of operations: Ensure taking an action does not prevent a subsequent necessary action.',\n policies: [\n 'The user may request actions in a random order, but you may need to reorder operations to maximize successful completion of the task.',\n ],\n }),\n policy({\n rule: 'Other prerequisites (information and/or actions needed).',\n }),\n policy({ rule: 'Explicit user constraints or preferences.' }),\n ],\n }),\n\n // 2) Risk assessment\n principle({\n title: 'Risk assessment',\n description:\n 'What are the consequences of taking the action? Will the new state cause any future issues?',\n policies: [\n 'For exploratory tasks (like searches), missing *optional* parameters is a LOW risk. **Prefer calling the tool with the available information over asking the user, unless** your Rule 1 (Logical Dependencies) reasoning determines that optional information is required for a later step in your plan.',\n ],\n }),\n\n // 3) Abductive reasoning and hypothesis exploration\n principle({\n title: 'Abductive reasoning and hypothesis exploration',\n description:\n 'At each step, identify the most logical and likely reason for any problem encountered.',\n policies: [\n 'Look beyond immediate or obvious causes. The most likely reason may not be the simplest and may require deeper inference.',\n 'Hypotheses may require additional research. Each hypothesis may take multiple steps to test.',\n 'Prioritize hypotheses based on likelihood, but do not discard less likely ones prematurely. A low-probability event may still be the root cause.',\n ],\n }),\n\n // 4) Outcome evaluation and adaptability\n principle({\n title: 'Outcome evaluation and adaptability',\n description:\n 'Does the previous observation require any changes to your plan?',\n policies: [\n 'If your initial hypotheses are disproven, actively generate new ones based on the gathered information.',\n ],\n }),\n\n // 5) Information availability\n principle({\n title: 'Information availability',\n description:\n 'Incorporate all applicable and alternative sources of information, including:',\n policies: [\n 'Using available tools and their capabilities',\n 'All policies, rules, checklists, and constraints',\n 'Previous observations and conversation history',\n 'Information only available by asking the user',\n ],\n }),\n\n // 6) Precision and Grounding\n principle({\n title: 'Precision and Grounding',\n description:\n 'Ensure your reasoning is extremely precise and relevant to each exact ongoing situation.',\n policies: [\n 'Verify your claims by quoting the exact applicable information (including policies) when referring to them.',\n ],\n }),\n\n // 7) Completeness\n principle({\n title: 'Completeness',\n description:\n 'Ensure that all requirements, constraints, options, and preferences are exhaustively incorporated into your plan.',\n policies: [\n policy({\n rule: 'Resolve conflicts using the order of importance in #1.',\n }),\n policy({\n rule: 'Avoid premature conclusions: There may be multiple relevant options for a given situation.',\n policies: [\n 'To check for whether an option is relevant, reason about all information sources from #5.',\n 'You may need to consult the user to even know whether something is applicable. Do not assume it is not applicable without checking.',\n ],\n }),\n policy({\n rule: 'Review applicable sources of information from #5 to confirm which are relevant to the current state.',\n }),\n ],\n }),\n\n // 8) Persistence and patience\n principle({\n title: 'Persistence and patience',\n description:\n 'Do not give up unless all the reasoning above is exhausted.',\n policies: [\n \"Don't be dissuaded by time taken or user frustration.\",\n 'This persistence must be intelligent: On *transient* errors (e.g. please try again), you *must* retry **unless an explicit retry limit (e.g., max x tries) has been reached**. If such a limit is hit, you *must* stop. On *other* errors, you must change your strategy or arguments, not repeat the same failed call.',\n ],\n }),\n\n // 9) Inhibit your response\n principle({\n title: 'Inhibit your response',\n description:\n \"Only take an action after all the above reasoning is completed. Once you've taken an action, you cannot take it back.\",\n }),\n\n principle({\n title: 'Continuous self-monitoring',\n description:\n 'Constantly evaluate your own reasoning process for any gaps, biases, or errors. Apply the above principles iteratively as needed.',\n }),\n ),\n ];\n}\n\nexport function guidelines(options: TeachingsOptions = {}): ContextFragment[] {\n const { date = 'strict' } = options;\n\n const baseTeachings: ContextFragment[] = [\n // Include the meta-cognitive reasoning framework\n ...reasoningFramework(),\n\n // Prerequisite policies (must do X before Y)\n fragment(\n 'prerequisite_policies',\n policy({\n rule: 'YOU MUST inspect schema structure and available tables',\n before: 'generating ANY SQL query',\n reason:\n 'NEVER generate SQL without knowing valid tables, columns, and relationships',\n }),\n policy({\n rule: 'YOU MUST resolve ambiguous business terms with the user',\n before: 'making ANY assumptions about terminology meaning',\n reason: 'NEVER guess domain-specific language\u2014ask for clarification',\n }),\n policy({\n rule: 'YOU MUST validate SQL syntax',\n before: 'executing ANY query against the database',\n reason: 'NEVER execute unvalidated queries',\n }),\n policy({\n rule: 'YOU MUST complete ALL reasoning steps',\n before: 'taking ANY tool call or response action',\n reason: 'Once an action is taken, it CANNOT be undone. NO EXCEPTIONS.',\n }),\n ),\n\n // Few-shot: Applying reasoning principles\n fragment(\n 'reasoning-examples',\n example({\n question: 'Show me sales last month',\n answer: `Applying Principle 1 (Logical dependencies):\n- Need: schema to know which table has sales data\n- Need: clarify \"last month\" = calendar month or rolling 30 days?\n\nApplying Principle 5 (Information availability):\n- Schema shows: orders table with created_at, total columns\n- Missing: user's definition of \"last month\"\n\nAction: Ask user for date range clarification BEFORE generating SQL.`,\n }),\n example({\n question: 'Why did my query return no results?',\n answer: `Applying Principle 3 (Abductive reasoning):\n- Hypothesis 1 (most likely): Filter too restrictive\n- Hypothesis 2: Data doesn't exist for that period\n- Hypothesis 3: JOIN eliminated matching rows\n\nTesting hypotheses:\n1. Remove filters one by one to isolate the issue\n2. Check date range actually has data\n3. Run subqueries separately to verify each table\n\nAction: Start with most likely hypothesis, test incrementally. NEVER guess.`,\n }),\n example({\n question: 'Get me the top customers',\n answer: `Applying Principle 1 (Logical dependencies):\n- \"Top\" is ambiguous\u2014by revenue? by order count? by recency?\n\nApplying Principle 9 (Inhibition):\n- MUST NOT generate SQL until \"top\" is defined\n\nAction: Ask user: \"Top by what metric\u2014total revenue, number of orders, or most recent activity?\"`,\n }),\n ),\n\n // Schema adherence - consolidated into clear rules\n fragment(\n 'schema_adherence',\n hint(\n 'Use only tables and columns from the schema. For unspecified columns, use SELECT *. When showing related items, include IDs and requested details.',\n ),\n hint(\n '\"Show\" means list items; \"count\" or \"total\" means aggregate. Use canonical values verbatim for filtering.',\n ),\n ),\n\n fragment(\n 'Column statistics',\n explain({\n concept: 'nDistinct in column stats',\n explanation:\n 'Positive values are the estimated count of distinct values. Negative values represent the fraction of unique rows (e.g., -1 means all rows are unique, -0.5 means 50% unique)',\n therefore:\n 'Use nDistinct to decide if GROUP BY is meaningful, if a column is a good filter candidate, or if COUNT(DISTINCT) will be expensive',\n }),\n explain({\n concept: 'correlation in column stats',\n explanation:\n 'Measures how closely the physical row order matches the logical sort order of the column. Values near 1 or -1 mean the data is well-ordered; near 0 means scattered',\n therefore:\n 'High correlation means range queries (BETWEEN, >, <) on that column benefit from index scans. Low correlation means the index is less effective for ranges',\n }),\n hint(\n 'When min/max stats are available, use them to validate filter values. If a user asks for values outside the known range, warn them the query may return no results.',\n ),\n ),\n\n // Joins - use relationship metadata\n hint(\n 'Use JOINs based on schema relationships. Favor PK/indexed columns; follow relationship metadata for direction and cardinality.',\n ),\n\n // Aggregations - explain the concepts\n fragment(\n 'Aggregations',\n hint(\n 'Apply COUNT, SUM, AVG when the question implies summarization. Use window functions for ranking, running totals, or row comparisons.',\n ),\n explain({\n concept: 'counting variety vs counting rows',\n explanation:\n '\"How many types/categories/statuses exist?\" asks about variety (unique values), not total row count',\n therefore: 'Use COUNT(DISTINCT column) for variety questions',\n }),\n ),\n\n // Query semantics - explain concepts and document quirks\n fragment(\n 'Query interpretation',\n explain({\n concept: 'threshold language',\n explanation:\n 'Words like \"reach\", \"hit\", \"exceed\" with a value imply a threshold being met or passed',\n therefore:\n 'Translate to >= (greater than or equal), not = (exact match)',\n }),\n quirk({\n issue:\n 'Contradictory WHERE conditions (e.g., value > 100 AND value < 50) return empty results',\n workaround:\n 'Use INTERSECT between separate queries when finding items \"shared by\" groups with mutually exclusive conditions',\n }),\n quirk({\n issue:\n 'NULL values behave unexpectedly in comparisons and aggregations',\n workaround:\n 'Use IS NULL, IS NOT NULL, or COALESCE() to handle NULLs explicitly',\n }),\n hint(\n 'Always include mentioned filters from joined tables in WHERE conditions.',\n ),\n ),\n\n // Style preferences\n styleGuide({\n prefer:\n 'Full table names as aliases (users AS users). Descriptive column aliases (COUNT(*) AS total_count).',\n never:\n 'Abbreviated aliases (u, oi) or positional aliases (t1, t2, a, b).',\n }),\n styleGuide({\n prefer:\n 'Concise, business-friendly summaries with key comparisons and helpful follow-ups.',\n }),\n\n // Safety guardrails - consolidated\n fragment(\n 'Query safety',\n guardrail({\n rule: 'Generate only valid, executable SELECT/WITH statements.',\n reason: 'Read-only access prevents data modification.',\n action:\n 'Never generate INSERT, UPDATE, DELETE, DROP, or DDL statements.',\n }),\n guardrail({\n rule: 'Avoid unbounded scans and cartesian joins.',\n reason: 'Protects performance and correctness.',\n action:\n 'Apply filters on indexed columns. If join keys are unclear, ask for clarification.',\n }),\n guardrail({\n rule: 'Preserve query semantics.',\n reason: 'Arbitrary modifications change results.',\n action:\n 'Only add LIMIT for explicit \"top N\" requests. Add ORDER BY for deterministic results.',\n }),\n guardrail({\n rule: 'Seek clarification for genuine ambiguity.',\n reason: 'Prevents incorrect assumptions.',\n action: 'Ask a focused question before guessing.',\n }),\n ),\n\n clarification({\n when: 'Ambiguous ranking language (top, best, active) without a metric.',\n ask: 'Clarify the ranking metric or definition.',\n reason: 'Ensures correct aggregation and ordering.',\n }),\n\n hint(\n 'Use sample cell values from schema hints to match exact casing and format in WHERE conditions (e.g., \"Male\" vs \"male\" vs \"M\").',\n ),\n\n workflow({\n task: 'SQL generation',\n steps: [\n 'Schema linking: identify which tables and columns are mentioned or implied by the question.',\n 'Check if column names match question terms (e.g., Total_X). Select directly if match found.',\n 'Identify SQL patterns needed: aggregation, segmentation, time range, ranking.',\n 'Select tables and relationships. Note lookup tables and filter values from schema.',\n 'Plan join/filter/aggregation order based on table sizes and indexes.',\n 'Generate SQL that answers the question.',\n 'Verify: mentally translate SQL back to natural language. Does it match the original question?',\n ],\n }),\n\n workflow({\n task: 'Error recovery',\n triggers: ['SQL error', 'query failed', 'execution error'],\n steps: [\n 'Classify the error type: syntax error, missing join, wrong aggregation, invalid column, type mismatch.',\n 'For syntax errors: check SQL keywords, quotes, parentheses balance.',\n 'For missing join: identify unlinked tables and add appropriate JOIN clause.',\n 'For wrong aggregation: verify GROUP BY includes all non-aggregated SELECT columns.',\n 'For invalid column: re-check schema for correct column name and table.',\n 'Apply targeted fix based on error classification. Avoid blind regeneration.',\n ],\n notes:\n 'Maximum 3 retry attempts. If still failing, explain the issue to the user.',\n }),\n\n workflow({\n task: 'Complex query decomposition',\n triggers: [\n 'multiple conditions',\n 'nested requirements',\n 'compare across',\n 'for each',\n ],\n steps: [\n 'Identify if question has multiple independent parts or nested dependencies.',\n 'For independent parts: break into sub-questions, solve each, then combine with UNION or JOIN.',\n 'For nested dependencies: solve inner requirement first, use result in outer query (subquery or CTE).',\n 'For comparisons across groups: use window functions or self-joins.',\n 'Combine sub-results into final answer. Verify completeness.',\n ],\n notes:\n 'Complex questions often need CTEs (WITH clauses) for clarity and reusability.',\n }),\n\n workflow({\n task: 'Multi-turn context',\n triggers: ['follow-up', 'and also', 'what about', 'same but', 'instead'],\n steps: [\n 'Identify references to previous context: \"it\", \"that\", \"those\", \"the same\".',\n 'Resolve references using conversation history: which tables, filters, or results were mentioned.',\n 'For refinements (\"but only X\"): add filter to previous query.',\n 'For extensions (\"and also Y\"): expand SELECT or add JOIN.',\n 'For pivots (\"what about Z instead\"): replace the changed element, keep unchanged parts.',\n 'Maintain consistency with previous query structure when possible.',\n ],\n notes:\n 'If reference is ambiguous, ask which previous result or entity the user means.',\n }),\n fragment(\n 'Bash tool usage',\n workflow({\n task: 'Query execution',\n steps: [\n 'Execute SQL through bash tool: sql run \"SELECT ...\"',\n 'Read the output: file path, column names, and row count.',\n \"Use column names to construct jq filters: cat <path> | jq '.[] | {col1, col2}'\",\n \"For large results, slice first: cat <path> | jq '.[:10]'\",\n ],\n }),\n hint(\n `You cannot access sql through a tool, it'll fail so the proper way to access it is through the bash tool using \"sql run\" and \"sql validate\" commands.`,\n ),\n hint(\n 'The sql command outputs: file path, column names (comma-separated), and row count. Use column names to construct precise jq queries.',\n ),\n hint(\n 'This is virtual bash environment and \"sql\" commands proxy to the database hence you cannot access sql files directly.',\n ),\n hint(\n 'If a query fails, the sql command returns an error message in stderr.',\n ),\n ),\n ];\n\n // Date-specific clarifications (only when strict)\n if (date === 'strict') {\n baseTeachings.push(\n clarification({\n when: 'The request targets time-based data without a date range.',\n ask: 'Confirm the intended timeframe (e.g., last 30/90 days, YTD, specific year).',\n reason: 'Prevents large scans and irrelevant results.',\n }),\n );\n } else {\n // When date is false, assume all matching data without asking\n baseTeachings.push(\n hint(\n 'When a month, day, or time period is mentioned without a year (e.g., \"in August\", \"on Monday\"), assume ALL occurrences of that period in the data. Do not ask for year clarification.',\n ),\n );\n }\n\n return baseTeachings;\n}\n", "import {\n APICallError,\n InvalidToolInputError,\n NoSuchToolError,\n type StreamTextTransform,\n type Tool,\n ToolCallRepairError,\n type ToolSet,\n createUIMessageStream,\n generateId,\n} from 'ai';\nimport { type IFileSystem } from 'just-bash';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n type ChatMessage,\n ContextEngine,\n type ContextFragment,\n agent,\n assistant,\n chatMessageToUIMessage,\n errorRecoveryGuardrail,\n toMessageFragment,\n} from '@deepagents/context';\n\nimport type { Adapter } from './adapters/adapter.ts';\nimport { createResultTools } from './agents/result-tools.ts';\nimport { toSql } from './agents/sql.agent.ts';\nimport { JsonCache } from './file-cache.ts';\nimport { TrackedFs } from './fs/tracked-fs.ts';\nimport { type TeachingsOptions, guidelines } from './instructions.ts';\nimport { type ExtractedPair, type PairProducer } from './synthesis/types.ts';\n\nexport type RenderingTools = Record<string, Tool<unknown, never>>;\n\nexport class Text2Sql {\n #config: {\n model: AgentModel;\n adapter: Adapter;\n context: (...fragments: ContextFragment[]) => ContextEngine;\n tools?: RenderingTools;\n introspection: JsonCache<ContextFragment[]>;\n teachingsOptions?: TeachingsOptions;\n transform?: StreamTextTransform<ToolSet> | StreamTextTransform<ToolSet>[];\n filesystem: IFileSystem;\n };\n\n constructor(config: {\n adapter: Adapter;\n context: (...fragments: ContextFragment[]) => ContextEngine;\n version: string;\n tools?: RenderingTools;\n model: AgentModel;\n transform?: StreamTextTransform<ToolSet> | StreamTextTransform<ToolSet>[];\n /** @see TeachingsOptions */\n teachingsOptions?: TeachingsOptions;\n filesystem: IFileSystem;\n }) {\n this.#config = {\n teachingsOptions: config.teachingsOptions,\n adapter: config.adapter,\n context: config.context,\n tools: config.tools ?? {},\n model: config.model,\n transform: config.transform,\n filesystem: config.filesystem,\n introspection: new JsonCache<ContextFragment[]>(\n 'introspection-' + config.version,\n ),\n };\n }\n\n public async toSql(input: string): Promise<string> {\n const schemaFragments = await this.index();\n const result = await toSql({\n input,\n adapter: this.#config.adapter,\n fragments: schemaFragments,\n model: this.#config.model,\n });\n return result.sql;\n }\n\n /**\n * Introspect the database schema and return context fragments.\n * Results are cached to avoid repeated introspection.\n */\n public async index(): Promise<ContextFragment[]> {\n const cached = await this.#config.introspection.read();\n if (cached) {\n return cached;\n }\n const fragments = await this.#config.adapter.introspect();\n await this.#config.introspection.write(fragments);\n return fragments;\n }\n\n /**\n * Generate training data pairs using a producer factory.\n * The factory receives the configured adapter, so users don't need to pass it manually.\n *\n * @example\n * // Generate questions for existing SQL\n * const pairs = await text2sql.toPairs(\n * (adapter) => new SqlExtractor(sqls, adapter, { validateSql: true })\n * );\n *\n * @example\n * // Extract from chat history with validation\n * const pairs = await text2sql.toPairs(\n * (adapter) => new ValidatedProducer(\n * new MessageExtractor(messages),\n * adapter\n * )\n * );\n */\n public async toPairs<T extends PairProducer>(\n factory: (adapter: Adapter) => T,\n ): Promise<ExtractedPair[]> {\n const producer = factory(this.#config.adapter);\n return producer.toPairs();\n }\n\n public async chat(\n messages: ChatMessage[],\n options?: { abortSignal?: AbortSignal },\n ) {\n if (messages.length === 0) {\n throw new Error('messages must not be empty');\n }\n\n const trackedFs = new TrackedFs(this.#config.filesystem);\n\n const context = this.#config.context(\n ...guidelines(this.#config.teachingsOptions),\n ...(await this.index()),\n );\n\n const lastItem = messages[messages.length - 1];\n const lastFragment = toMessageFragment(lastItem);\n const lastUIMessage = chatMessageToUIMessage(lastItem);\n let assistantMsgId: string;\n\n if (lastUIMessage.role === 'assistant') {\n context.set(lastFragment);\n await context.save({ branch: false });\n assistantMsgId = lastUIMessage.id;\n } else {\n context.set(lastFragment);\n await context.save();\n assistantMsgId = generateId();\n }\n\n const uiMessages = messages.map(chatMessageToUIMessage);\n\n const { mounts: skillMounts } = context.getSkillMounts();\n const { tools } = await createResultTools({\n adapter: this.#config.adapter,\n skillMounts,\n filesystem: trackedFs,\n });\n\n const chatAgent = agent({\n name: 'text2sql',\n model: this.#config.model,\n context,\n tools: {\n ...tools,\n ...this.#config.tools,\n },\n guardrails: [errorRecoveryGuardrail],\n maxGuardrailRetries: 3,\n });\n\n const result = await chatAgent.stream(\n {},\n { abortSignal: options?.abortSignal, transform: this.#config.transform },\n );\n\n const uiStream = result.toUIMessageStream({\n onError: (error) => this.#formatError(error),\n sendStart: true,\n sendFinish: true,\n sendReasoning: true,\n sendSources: true,\n originalMessages: uiMessages,\n generateMessageId: () => assistantMsgId,\n messageMetadata: ({ part }) => {\n if (part.type === 'finish-step') {\n return {\n finishReason: part.finishReason,\n usage: part.usage,\n };\n }\n if (part.type === 'finish') {\n return {\n finishReason: part.finishReason,\n totalUsage: part.totalUsage,\n };\n }\n return undefined;\n },\n });\n\n return createUIMessageStream({\n originalMessages: uiMessages,\n generateId: () => assistantMsgId,\n onStepFinish: async ({ responseMessage }) => {\n context.set(assistant({ ...responseMessage, id: assistantMsgId }));\n await context.save({ branch: false });\n },\n onFinish: async ({ responseMessage }) => {\n const createdFiles = trackedFs.getCreatedFiles();\n context.set(\n assistant({\n ...responseMessage,\n id: assistantMsgId,\n metadata: {\n ...((responseMessage.metadata as object) ?? {}),\n createdFiles,\n },\n }),\n );\n await context.save({ branch: false });\n await context.trackUsage(await result.totalUsage);\n },\n execute: async ({ writer }) => {\n writer.merge(uiStream);\n },\n });\n }\n\n #formatError(error: unknown): string {\n if (NoSuchToolError.isInstance(error)) {\n return 'The model tried to call an unknown tool.';\n } else if (InvalidToolInputError.isInstance(error)) {\n return 'The model called a tool with invalid arguments.';\n } else if (ToolCallRepairError.isInstance(error)) {\n return 'The model tried to call a tool with invalid arguments, but it was repaired.';\n } else if (APICallError.isInstance(error)) {\n console.error('Upstream API call failed:', error);\n return `Upstream API call failed with status ${(error as APICallError).statusCode}: ${(error as APICallError).message}`;\n }\n return JSON.stringify(error);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../src/lib/adapters/adapter.ts", "../src/lib/fragments/schema.ts", "../src/lib/adapters/groundings/context.ts", "../src/lib/agents/exceptions.ts", "../src/lib/agents/result-tools.ts", "../src/lib/agents/sql.agent.ts", "../src/lib/agents/suggestions.agents.ts", "../src/lib/checkpoint.ts", "../src/lib/file-cache.ts", "../src/lib/fs/sqlite/sqlite-fs.ts", "../src/lib/fs/sqlite/ddl.sqlite-fs.sql", "../src/lib/fs/mssql/mssql-fs.ts", "../src/lib/fs/mssql/ddl.mssql-fs.ts", "../src/lib/fs/postgres/postgres-fs.ts", "../src/lib/fs/postgres/ddl.postgres-fs.ts", "../src/lib/fs/scoped-fs.ts", "../src/lib/fs/tracked-fs.ts", "../src/lib/instructions.ts", "../src/lib/sql.ts"],
|
|
4
|
+
"sourcesContent": ["import { type SqlLanguage, format as formatSql } from 'sql-formatter';\n\nimport type { ContextFragment } from '@deepagents/context';\n\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';\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'\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}\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?: Record<string, unknown>;\n}\n\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'tables'\n | 'row_counts'\n | 'primary_keys'\n | 'indexes'\n | 'column_stats'\n | 'low_cardinality'\n | 'relationships';\n\nexport interface IntrospectionProgress {\n phase: IntrospectionPhase;\n message: string;\n current?: number;\n total?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport interface IntrospectOptions {\n onProgress?: OnProgress;\n}\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 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 await grounding.execute(ctx);\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 * Runs all configured groundings and returns the resolved set of names.\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 const grounding = fn(this);\n await grounding.execute(ctx);\n }\n return [\n ...ctx.tables.map((t) => t.name),\n ...ctx.views.map((v) => v.name),\n ];\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 }),\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\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n for (const rel of ctx.relationships) {\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 // Business context\n if (ctx.report) {\n fragments.push({ name: 'businessContext', data: ctx.report });\n }\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 // Build index fragments\n const indexFragments = (t.indexes ?? []).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 .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'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many'\n | 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 try {\n return formatSql(sql, { language: this.formatterLanguage });\n } catch {\n return sql;\n }\n }\n\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(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", "import type { ContextFragment } 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}): 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 },\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 {\n AdapterInfo,\n ColumnStats,\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 /** Business context report generated by ReportGrounding */\n report?: string;\n\n /** Shared cache for cross-grounding deduplication. Keyed by `type:key`. */\n cache: Map<string, unknown>;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n cache: new Map(),\n };\n}\n", "const sqlValidationMarker = Symbol('SQLValidationError');\nconst unanswerableSqlMarker = Symbol('UnanswerableSQLError');\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", "import { tool } from 'ai';\nimport { createBashTool } from 'bash-tool';\nimport chalk from 'chalk';\nimport {\n Bash,\n type CommandContext,\n type CommandNode,\n type IFileSystem,\n MountableFs,\n OverlayFs,\n type ScriptNode,\n type WordNode,\n defineCommand,\n parse,\n} from 'just-bash';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport * as path from 'node:path';\nimport { v7 } from 'uuid';\nimport z from 'zod';\n\nimport type { SkillPathMapping } from '@deepagents/context';\n\nimport type { Adapter } from '../adapters/adapter.ts';\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\ninterface SubcommandDefinition {\n usage: string;\n description: string;\n handler: (\n args: string[],\n ctx: CommandContext,\n ) => CommandResult | Promise<CommandResult>;\n}\n\n/**\n * Creates a command with subcommands using a declarative API.\n *\n * @example\n * const cmd = createCommand('sql', {\n * run: {\n * usage: 'run \"SELECT ...\"',\n * description: 'Execute query',\n * handler: async (args, ctx) => ({ stdout: '...', stderr: '', exitCode: 0 })\n * }\n * });\n */\nfunction createCommand(\n name: string,\n subcommands: Record<string, SubcommandDefinition>,\n) {\n const usageLines = Object.entries(subcommands)\n .map(([, def]) => ` ${name} ${def.usage.padEnd(30)} ${def.description}`)\n .join('\\n');\n\n return defineCommand(name, async (args, ctx) => {\n const subcommand = args[0];\n const restArgs = args.slice(1);\n\n if (subcommand && subcommand in subcommands) {\n return subcommands[subcommand].handler(restArgs, ctx);\n }\n\n return {\n stdout: '',\n stderr: `${name}: ${subcommand ? `unknown subcommand '${subcommand}'` : 'missing subcommand'}\\n\\nUsage:\\n${usageLines}`,\n exitCode: 1,\n };\n });\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// SQL Command Implementation\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validates that a query is read-only (SELECT or WITH).\n */\nfunction validateReadOnly(query: string): { valid: boolean; error?: string } {\n const upper = query.toUpperCase().trim();\n if (!upper.startsWith('SELECT') && !upper.startsWith('WITH')) {\n return { valid: false, error: 'only SELECT or WITH queries allowed' };\n }\n return { valid: true };\n}\n\ntype MetaStore = AsyncLocalStorage<{ value?: Record<string, unknown> }>;\n\nconst SQL_VALIDATE_REMINDER =\n 'Always run `sql validate` before `sql run` to catch syntax errors early.';\n\nfunction createSqlCommand(adapter: Adapter, metaStore: MetaStore) {\n return createCommand('sql', {\n run: {\n usage: 'run \"SELECT ...\"',\n description: 'Execute query and store results',\n handler: async (args, ctx) => {\n const store = metaStore.getStore();\n if (store) {\n store.value = { ...store.value, reminder: SQL_VALIDATE_REMINDER };\n }\n\n const rawQuery = args\n .join(' ')\n .trim()\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t');\n\n if (!rawQuery) {\n return {\n stdout: '',\n stderr: 'sql run: no query provided',\n exitCode: 1,\n };\n }\n\n const validation = validateReadOnly(rawQuery);\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `sql run: ${validation.error}`,\n exitCode: 1,\n };\n }\n\n const query = adapter.format(rawQuery);\n if (store) {\n store.value = { ...store.value, formattedSql: query };\n }\n\n const syntaxError = await adapter.validate(query);\n if (syntaxError) {\n return {\n stdout: '',\n stderr: `sql run: ${syntaxError}`,\n exitCode: 1,\n };\n }\n\n try {\n const rows = await adapter.execute(query);\n const rowsArray = Array.isArray(rows) ? rows : [];\n const content = JSON.stringify(rowsArray, null, 2);\n\n const filename = `${v7()}.json`;\n const sqlPath = `/sql/${filename}`;\n\n await ctx.fs.mkdir('/sql', { recursive: true });\n await ctx.fs.writeFile(sqlPath, content);\n\n const columns =\n rowsArray.length > 0 ? Object.keys(rowsArray[0] as object) : [];\n\n return {\n stdout:\n [\n `results stored in ${sqlPath}`,\n `columns: ${columns.join(', ') || '(none)'}`,\n `rows: ${rowsArray.length}`,\n ].join('\\n') + '\\n',\n stderr: '',\n exitCode: 0,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: `sql run: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n };\n }\n },\n },\n validate: {\n usage: 'validate \"SELECT ...\"',\n description: 'Validate query syntax',\n handler: async (args) => {\n const rawQuery = args\n .join(' ')\n .trim()\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t');\n\n if (!rawQuery) {\n return {\n stdout: '',\n stderr: 'sql validate: no query provided',\n exitCode: 1,\n };\n }\n\n const validation = validateReadOnly(rawQuery);\n if (!validation.valid) {\n return {\n stdout: '',\n stderr: `sql validate: ${validation.error}`,\n exitCode: 1,\n };\n }\n\n const query = adapter.format(rawQuery);\n const store = metaStore.getStore();\n if (store) store.value = { ...store.value, formattedSql: query };\n\n const syntaxError = await adapter.validate(query);\n if (syntaxError) {\n return {\n stdout: '',\n stderr: `sql validate: ${syntaxError}`,\n exitCode: 1,\n };\n }\n\n return {\n stdout: 'valid\\n',\n stderr: '',\n exitCode: 0,\n };\n },\n },\n });\n}\n\nconst BLOCKED_DB_CLIENT_COMMANDS = new Set([\n 'psql',\n 'sqlite3',\n 'mysql',\n 'duckdb',\n]);\nconst BLOCKED_RAW_SQL_COMMANDS = new Set(['select', 'with']);\nconst ALLOWED_SQL_PROXY_SUBCOMMANDS = new Set(['run', 'validate']);\nconst SHELL_INTERPRETER_COMMANDS = new Set([\n 'bash',\n 'sh',\n 'zsh',\n 'dash',\n 'ksh',\n]);\nconst WRAPPER_COMMANDS = new Set(['env', 'command', 'eval']);\nconst SQL_PROXY_ENFORCEMENT_MESSAGE = [\n 'Direct database querying through bash is blocked.',\n 'Use SQL proxy commands in this order:',\n '1) sql validate \"SELECT ...\"',\n '2) sql run \"SELECT ...\"',\n].join('\\n');\n\ntype SqlInspectionMode = 'blocked-only' | 'block-all-sql';\n\ntype FunctionDefCommand = Extract<CommandNode, { type: 'FunctionDef' }>;\n\ninterface InspectionContext {\n functionDefinitions: Map<string, FunctionDefCommand>;\n callStack: Set<string>;\n}\n\ninterface CommandInspectionOptions {\n stdinFromPipe: boolean;\n}\n\ninterface ShellInvocationDescriptor {\n kind: 'command' | 'script' | 'stdin' | 'none' | 'unknown';\n payload: string | null;\n}\n\ninterface WrapperCommandResolution {\n kind: 'resolved' | 'none' | 'unknown';\n name?: WordNode;\n args?: WordNode[];\n}\n\nfunction cloneInspectionContext(context: InspectionContext): InspectionContext {\n return {\n functionDefinitions: new Map(context.functionDefinitions),\n callStack: new Set(context.callStack),\n };\n}\n\nfunction asStaticWordText(word: WordNode | null | undefined): string | null {\n if (!word) {\n return null;\n }\n return asStaticWordPartText(\n word.parts as unknown as Array<Record<string, unknown>>,\n );\n}\n\nfunction asStaticWordPartText(\n parts: Array<Record<string, unknown>>,\n): string | null {\n let text = '';\n\n for (const part of parts) {\n const type = part.type;\n\n if (type === 'Literal' || type === 'SingleQuoted' || type === 'Escaped') {\n if (typeof part.value !== 'string') {\n return null;\n }\n text += part.value;\n continue;\n }\n\n if (type === 'DoubleQuoted') {\n if (!Array.isArray(part.parts)) {\n return null;\n }\n const inner = asStaticWordPartText(\n part.parts as Array<Record<string, unknown>>,\n );\n if (inner == null) {\n return null;\n }\n text += inner;\n continue;\n }\n\n return null;\n }\n\n return text;\n}\n\nfunction isScriptNode(value: unknown): value is ScriptNode {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const node = value as Record<string, unknown>;\n return node.type === 'Script' && Array.isArray(node.statements);\n}\n\nfunction scriptContainsBlockedCommand(\n script: ScriptNode,\n context: InspectionContext,\n mode: SqlInspectionMode = 'blocked-only',\n): boolean {\n return statementsContainBlockedCommand(script.statements, context, mode);\n}\n\nfunction statementsContainBlockedCommand(\n statements: Array<{ pipelines: Array<{ commands: CommandNode[] }> }>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const statement of statements) {\n if (statementContainsBlockedCommand(statement, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction statementContainsBlockedCommand(\n statement: { pipelines: Array<{ commands: CommandNode[] }> },\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const pipeline of statement.pipelines) {\n if (pipelineContainsBlockedCommand(pipeline, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction pipelineContainsBlockedCommand(\n pipeline: { commands: CommandNode[] },\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const [index, command] of pipeline.commands.entries()) {\n if (command.type === 'FunctionDef') {\n context.functionDefinitions.set(command.name, command);\n continue;\n }\n if (\n commandContainsBlockedCommand(command, context, mode, {\n stdinFromPipe: index > 0,\n })\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction stringCommandContainsBlockedCommand(\n command: string,\n context: InspectionContext,\n mode: SqlInspectionMode = 'blocked-only',\n): boolean {\n let script: ScriptNode;\n try {\n script = parse(command);\n } catch {\n return false;\n }\n\n return scriptContainsBlockedCommand(\n script,\n cloneInspectionContext(context),\n mode,\n );\n}\n\nfunction wordContainsBlockedCommand(\n word: WordNode | null | undefined,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n if (!word) {\n return false;\n }\n\n return wordPartContainsBlockedCommand(\n word.parts as unknown as Array<Record<string, unknown>>,\n context,\n mode,\n );\n}\n\nfunction wordPartContainsBlockedCommand(\n parts: Array<Record<string, unknown>>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n for (const part of parts) {\n if (partContainsBlockedCommand(part, context, mode)) {\n return true;\n }\n }\n return false;\n}\n\nfunction partContainsBlockedCommand(\n node: Record<string, unknown>,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n const type = node.type;\n\n if (type === 'CommandSubstitution' || type === 'ProcessSubstitution') {\n if (isScriptNode(node.body)) {\n return scriptContainsBlockedCommand(\n node.body,\n cloneInspectionContext(context),\n mode,\n );\n }\n return false;\n }\n\n if (type === 'ArithCommandSubst' && typeof node.command === 'string') {\n return stringCommandContainsBlockedCommand(node.command, context, mode);\n }\n\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === 'object' && item !== null) {\n if (\n partContainsBlockedCommand(\n item as Record<string, unknown>,\n context,\n mode,\n )\n ) {\n return true;\n }\n }\n }\n continue;\n }\n\n if (typeof value === 'object' && value !== null) {\n if (\n partContainsBlockedCommand(\n value as Record<string, unknown>,\n context,\n mode,\n )\n ) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction functionInvocationContainsBlockedCommand(\n functionName: string,\n context: InspectionContext,\n mode: SqlInspectionMode,\n): boolean {\n const definition = context.functionDefinitions.get(functionName);\n if (!definition) {\n return false;\n }\n\n if (context.callStack.has(functionName)) {\n return false;\n }\n\n const invocationContext = cloneInspectionContext(context);\n invocationContext.callStack.add(functionName);\n return commandContainsBlockedCommand(\n definition.body,\n invocationContext,\n mode,\n { stdinFromPipe: false },\n );\n}\n\nfunction isAsciiLetter(character: string): boolean {\n const charCode = character.charCodeAt(0);\n return (\n (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)\n );\n}\n\nfunction isAsciiDigit(character: string): boolean {\n const charCode = character.charCodeAt(0);\n return charCode >= 48 && charCode <= 57;\n}\n\nfunction isValidEnvVariableName(name: string): boolean {\n if (!name) {\n return false;\n }\n\n const firstChar = name[0];\n if (!(isAsciiLetter(firstChar) || firstChar === '_')) {\n return false;\n }\n\n for (let index = 1; index < name.length; index += 1) {\n const char = name[index];\n if (!(isAsciiLetter(char) || isAsciiDigit(char) || char === '_')) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isEnvAssignmentToken(token: string): boolean {\n const separatorIndex = token.indexOf('=');\n if (separatorIndex <= 0) {\n return false;\n }\n\n return isValidEnvVariableName(token.slice(0, separatorIndex));\n}\n\nfunction parseShortOptionCluster(option: string): {\n valid: boolean;\n hasCommandFlag: boolean;\n hasStdinFlag: boolean;\n consumesNextArg: boolean;\n} {\n if (\n !option.startsWith('-') ||\n option.startsWith('--') ||\n option.length <= 1\n ) {\n return {\n valid: false,\n hasCommandFlag: false,\n hasStdinFlag: false,\n consumesNextArg: false,\n };\n }\n\n let hasCommandFlag = false;\n let hasStdinFlag = false;\n let consumesNextArg = false;\n\n for (let index = 1; index < option.length; index += 1) {\n const char = option[index];\n if (!isAsciiLetter(char)) {\n return {\n valid: false,\n hasCommandFlag: false,\n hasStdinFlag: false,\n consumesNextArg: false,\n };\n }\n\n if (char === 'c') {\n hasCommandFlag = true;\n } else if (char === 's') {\n hasStdinFlag = true;\n } else if (char === 'O' || char === 'o') {\n consumesNextArg = true;\n }\n }\n\n return { valid: true, hasCommandFlag, hasStdinFlag, consumesNextArg };\n}\n\nfunction getShellInvocationDescriptor(\n args: WordNode[],\n): ShellInvocationDescriptor {\n let readsFromStdin = false;\n const longOptionsWithValue = new Set(['--rcfile', '--init-file']);\n\n for (let index = 0; index < args.length; index += 1) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown', payload: null };\n }\n\n if (token === '--') {\n if (index + 1 >= args.length) {\n break;\n }\n return {\n kind: 'script',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (token === '--command') {\n return {\n kind: 'command',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (token.startsWith('--command=')) {\n return {\n kind: 'command',\n payload: token.slice('--command='.length),\n };\n }\n\n if (token.startsWith('--')) {\n if (token.includes('=')) {\n continue;\n }\n\n if (longOptionsWithValue.has(token)) {\n if (index + 1 >= args.length) {\n return { kind: 'unknown', payload: null };\n }\n index += 1;\n }\n continue;\n }\n\n if (token.startsWith('-') && !token.startsWith('--')) {\n const parsed = parseShortOptionCluster(token);\n if (!parsed.valid) {\n return { kind: 'unknown', payload: null };\n }\n\n if (parsed.hasCommandFlag) {\n return {\n kind: 'command',\n payload: asStaticWordText(args[index + 1]),\n };\n }\n\n if (parsed.hasStdinFlag) {\n readsFromStdin = true;\n }\n\n if (parsed.consumesNextArg) {\n if (index + 1 >= args.length) {\n return { kind: 'unknown', payload: null };\n }\n index += 1;\n }\n continue;\n }\n\n return {\n kind: 'script',\n payload: token,\n };\n }\n\n if (readsFromStdin) {\n return { kind: 'stdin', payload: null };\n }\n\n return { kind: 'none', payload: null };\n}\n\nfunction getHereDocPayload(\n redirections: Array<{\n target: { type?: string; content?: WordNode };\n }>,\n): { hasHereDoc: boolean; payload: string | null } {\n const payloads: string[] = [];\n\n for (const redirection of redirections) {\n if (redirection.target.type !== 'HereDoc') {\n continue;\n }\n\n if (!redirection.target.content) {\n payloads.push('');\n continue;\n }\n\n const payload = asStaticWordText(redirection.target.content);\n if (payload == null) {\n return { hasHereDoc: true, payload: null };\n }\n\n payloads.push(payload);\n }\n\n if (payloads.length === 0) {\n return { hasHereDoc: false, payload: null };\n }\n\n return { hasHereDoc: true, payload: payloads.join('\\n') };\n}\n\nfunction joinStaticWords(words: WordNode[]): string | null {\n const tokens: string[] = [];\n\n for (const word of words) {\n const token = asStaticWordText(word);\n if (token == null) {\n return null;\n }\n tokens.push(token);\n }\n\n return tokens.join(' ');\n}\n\nfunction resolveEnvWrapperCommand(args: WordNode[]): WrapperCommandResolution {\n let index = 0;\n\n while (index < args.length) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown' };\n }\n\n if (token === '--') {\n index += 1;\n break;\n }\n\n if (token === '-u' || token === '--unset' || token === '--chdir') {\n if (index + 1 >= args.length) {\n return { kind: 'unknown' };\n }\n index += 2;\n continue;\n }\n\n if (token.startsWith('--unset=') || token.startsWith('--chdir=')) {\n index += 1;\n continue;\n }\n\n if (\n token.startsWith('-') &&\n token !== '-' &&\n !isEnvAssignmentToken(token)\n ) {\n index += 1;\n continue;\n }\n\n if (isEnvAssignmentToken(token)) {\n index += 1;\n continue;\n }\n\n break;\n }\n\n if (index >= args.length) {\n return { kind: 'none' };\n }\n\n return {\n kind: 'resolved',\n name: args[index],\n args: args.slice(index + 1),\n };\n}\n\nfunction resolveCommandWrapperCommand(\n args: WordNode[],\n): WrapperCommandResolution {\n let index = 0;\n let lookupOnly = false;\n\n while (index < args.length) {\n const token = asStaticWordText(args[index]);\n if (token == null) {\n return { kind: 'unknown' };\n }\n\n if (token === '--') {\n index += 1;\n break;\n }\n\n if (token === '-v' || token === '-V') {\n lookupOnly = true;\n index += 1;\n continue;\n }\n\n if (token.startsWith('-') && token !== '-') {\n index += 1;\n continue;\n }\n\n break;\n }\n\n if (lookupOnly || index >= args.length) {\n return { kind: 'none' };\n }\n\n return {\n kind: 'resolved',\n name: args[index],\n args: args.slice(index + 1),\n };\n}\n\nfunction commandContainsBlockedCommand(\n command: CommandNode,\n context: InspectionContext,\n mode: SqlInspectionMode,\n options: CommandInspectionOptions = { stdinFromPipe: false },\n): boolean {\n switch (command.type) {\n case 'SimpleCommand':\n return isBlockedSimpleCommand(command, context, mode, options);\n case 'If':\n return (\n command.clauses.some(\n (clause) =>\n statementsContainBlockedCommand(\n clause.condition,\n cloneInspectionContext(context),\n mode,\n ) ||\n statementsContainBlockedCommand(\n clause.body,\n cloneInspectionContext(context),\n mode,\n ),\n ) ||\n (command.elseBody\n ? statementsContainBlockedCommand(\n command.elseBody,\n cloneInspectionContext(context),\n mode,\n )\n : false)\n );\n case 'For':\n case 'CStyleFor':\n return statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n );\n case 'While':\n case 'Until':\n return (\n statementsContainBlockedCommand(\n command.condition,\n cloneInspectionContext(context),\n mode,\n ) ||\n statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n )\n );\n case 'Case':\n return command.items.some((item) =>\n statementsContainBlockedCommand(\n item.body,\n cloneInspectionContext(context),\n mode,\n ),\n );\n case 'Subshell':\n case 'Group':\n return statementsContainBlockedCommand(\n command.body,\n cloneInspectionContext(context),\n mode,\n );\n case 'FunctionDef':\n return false;\n case 'ArithmeticCommand':\n case 'ConditionalCommand':\n return false;\n default: {\n const _unreachable: never = command;\n return _unreachable;\n }\n }\n}\n\nfunction isBlockedSimpleCommand(\n command: {\n name: WordNode | null;\n args: WordNode[];\n assignments: Array<{\n value: WordNode | null;\n array: WordNode[] | null;\n }>;\n redirections: Array<{\n target: { type?: string; content?: WordNode };\n }>;\n },\n context: InspectionContext,\n mode: SqlInspectionMode,\n options: CommandInspectionOptions,\n): boolean {\n if (wordContainsBlockedCommand(command.name, context, mode)) {\n return true;\n }\n\n if (\n command.args.some((arg) => wordContainsBlockedCommand(arg, context, mode))\n ) {\n return true;\n }\n\n if (\n command.assignments.some(\n (assignment) =>\n wordContainsBlockedCommand(assignment.value, context, mode) ||\n (assignment.array?.some((value) =>\n wordContainsBlockedCommand(value, context, mode),\n ) ??\n false),\n )\n ) {\n return true;\n }\n\n if (\n command.redirections.some((redirection) => {\n if (redirection.target.type === 'Word') {\n return wordContainsBlockedCommand(\n redirection.target as unknown as WordNode,\n context,\n mode,\n );\n }\n if (redirection.target.type === 'HereDoc' && redirection.target.content) {\n return wordContainsBlockedCommand(\n redirection.target.content,\n context,\n mode,\n );\n }\n return false;\n })\n ) {\n return true;\n }\n\n const commandName = asStaticWordText(command.name);\n if (!commandName) {\n return false;\n }\n\n const normalizedName = path.posix.basename(commandName).toLowerCase();\n\n if (BLOCKED_DB_CLIENT_COMMANDS.has(normalizedName)) {\n return true;\n }\n\n if (BLOCKED_RAW_SQL_COMMANDS.has(normalizedName)) {\n return true;\n }\n\n if (normalizedName === 'sql') {\n const subcommand = asStaticWordText(command.args[0])?.toLowerCase();\n if (!subcommand) {\n return true;\n }\n if (mode === 'block-all-sql') {\n return true;\n }\n return !ALLOWED_SQL_PROXY_SUBCOMMANDS.has(subcommand);\n }\n\n const inspectWrappedCommand = (\n resolved: WrapperCommandResolution,\n ): boolean => {\n if (resolved.kind === 'none') {\n return false;\n }\n\n if (resolved.kind === 'unknown' || !resolved.name || !resolved.args) {\n return true;\n }\n\n return isBlockedSimpleCommand(\n {\n name: resolved.name,\n args: resolved.args,\n assignments: [],\n redirections: [],\n },\n context,\n 'block-all-sql',\n options,\n );\n };\n\n if (WRAPPER_COMMANDS.has(normalizedName)) {\n if (normalizedName === 'env') {\n return inspectWrappedCommand(resolveEnvWrapperCommand(command.args));\n }\n\n if (normalizedName === 'command') {\n return inspectWrappedCommand(resolveCommandWrapperCommand(command.args));\n }\n\n const evalScript = joinStaticWords(command.args);\n if (evalScript == null) {\n return true;\n }\n if (!evalScript.trim()) {\n return false;\n }\n return stringCommandContainsBlockedCommand(\n evalScript,\n context,\n 'block-all-sql',\n );\n }\n\n if (SHELL_INTERPRETER_COMMANDS.has(normalizedName)) {\n const shellInvocation = getShellInvocationDescriptor(command.args);\n if (shellInvocation.kind === 'unknown') {\n return true;\n }\n\n if (shellInvocation.kind === 'command') {\n if (!shellInvocation.payload) {\n return true;\n }\n if (\n stringCommandContainsBlockedCommand(\n shellInvocation.payload,\n context,\n 'block-all-sql',\n )\n ) {\n return true;\n }\n return false;\n }\n\n const hereDoc = getHereDocPayload(command.redirections);\n if (hereDoc.hasHereDoc) {\n if (hereDoc.payload == null) {\n return true;\n }\n if (\n hereDoc.payload.trim().length > 0 &&\n stringCommandContainsBlockedCommand(\n hereDoc.payload,\n context,\n 'block-all-sql',\n )\n ) {\n return true;\n }\n }\n\n if (shellInvocation.kind === 'script') {\n // Executing shell script files can hide SQL proxy bypasses.\n return true;\n }\n\n if (options.stdinFromPipe || shellInvocation.kind === 'stdin') {\n // Cannot safely inspect stdin-fed shell scripts unless content is explicit here-doc.\n return !hereDoc.hasHereDoc;\n }\n }\n\n if (functionInvocationContainsBlockedCommand(commandName, context, mode)) {\n return true;\n }\n\n return false;\n}\n\nfunction getSqlProxyEnforcementResult(command: string): CommandResult | null {\n const trimmed = command.trim();\n if (!trimmed) {\n return null;\n }\n\n let script: ScriptNode;\n try {\n script = parse(trimmed);\n } catch {\n return null;\n }\n\n const blocked = scriptContainsBlockedCommand(script, {\n functionDefinitions: new Map(),\n callStack: new Set(),\n });\n if (!blocked) {\n return null;\n }\n\n return {\n stdout: '',\n stderr: `${SQL_PROXY_ENFORCEMENT_MESSAGE}\\n`,\n exitCode: 1,\n };\n}\n\n/**\n * Options for creating result tools.\n */\nexport interface ResultToolsOptions {\n /** Database adapter for executing SQL queries */\n adapter: Adapter;\n /** Skill mounts mapping host paths to sandbox paths */\n skillMounts: SkillPathMapping[];\n /** Filesystem for storage */\n filesystem: IFileSystem;\n}\n\n/**\n * Creates bash tool with integrated sql command.\n *\n * The agent sees only one tool: `bash`\n * SQL is executed via: sql run \"SELECT ...\"\n */\nexport async function createResultTools(options: ResultToolsOptions) {\n const { adapter, skillMounts, filesystem: baseFs } = options;\n\n const metaStore: MetaStore = new AsyncLocalStorage();\n const sqlCommand = createSqlCommand(adapter, metaStore);\n\n const fsMounts = skillMounts.map(({ host, sandbox }) => ({\n mountPoint: path.dirname(sandbox),\n filesystem: new OverlayFs({\n root: path.dirname(host),\n mountPoint: '/',\n readOnly: true,\n }),\n }));\n\n const filesystem = new MountableFs({\n base: baseFs,\n mounts: fsMounts,\n });\n\n const bashInstance = new Bash({\n customCommands: [sqlCommand],\n fs: filesystem,\n });\n\n const { sandbox, tools } = await createBashTool({\n sandbox: bashInstance,\n destination: '/',\n extraInstructions:\n 'Every bash tool call must include a brief non-empty \"reasoning\" input explaining why the command is needed.',\n onBeforeBashCall: ({ command }) => {\n console.log(chalk.cyan(`[onBeforeBashCall]: ${command}`));\n return { command };\n },\n onAfterBashCall: ({ result }) => {\n if (result.exitCode !== 0) {\n console.log(chalk.yellow(`[onAfterBashCall]: ${result.exitCode}`));\n }\n return { result };\n },\n });\n\n const guardedSandbox = {\n ...sandbox,\n executeCommand: async (command: string) => {\n const blockedResult = getSqlProxyEnforcementResult(command);\n if (blockedResult) {\n return blockedResult;\n }\n return sandbox.executeCommand(command);\n },\n };\n\n const bash = tool({\n ...(tools as any).bash,\n inputSchema: z.object({\n command: z.string().describe('The bash command to execute'),\n reasoning: z\n .string()\n .trim()\n .describe('Brief reason for executing this command'),\n }),\n execute: async ({ command }, execOptions) => {\n const execute = tools.bash.execute;\n if (!execute) {\n throw new Error('bash tool execution is not available');\n }\n\n const blockedResult = getSqlProxyEnforcementResult(command);\n if (blockedResult) {\n return blockedResult;\n }\n\n return metaStore.run({}, async () => {\n const result = await execute({ command }, execOptions);\n const storeValue = metaStore.getStore()?.value;\n if (!storeValue) return result;\n\n const { reminder, ...meta } = storeValue;\n return { ...result, meta, reminder };\n });\n },\n toModelOutput: ({ output }) => {\n if (typeof output !== 'object' || output === null) {\n return { type: 'json' as const, value: output };\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { meta, ...rest } = output as unknown as Record<string, unknown>;\n return { type: 'json' as const, value: rest };\n },\n });\n\n return {\n sandbox: guardedSandbox,\n tools: {\n ...tools,\n bash,\n },\n };\n}\n", "import { groq } from '@ai-sdk/groq';\nimport {\n APICallError,\n JSONParseError,\n NoContentGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n TypeValidationError,\n defaultSettingsMiddleware,\n wrapLanguageModel,\n} from 'ai';\nimport dedent from 'dedent';\nimport pRetry from 'p-retry';\nimport z from 'zod';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n ContextEngine,\n type ContextFragment,\n InMemoryContextStore,\n example,\n fragment,\n guardrail,\n hint,\n persona,\n policy,\n structuredOutput,\n user,\n workflow,\n} from '@deepagents/context';\n\nimport type { Adapter } from '../adapters/adapter.ts';\nimport { SQLValidationError, UnanswerableSQLError } from './exceptions.ts';\n\nexport interface ToSqlOptions {\n /** The natural language input to convert to SQL */\n input: string;\n /** Database adapter for validation */\n adapter: Adapter;\n /** Context fragments (schema + instructions/teachings) */\n fragments: ContextFragment[];\n /** Optional model override */\n model: AgentModel;\n /** Maximum retry attempts on validation failure (default: 3) */\n maxRetries?: number;\n}\n\nexport interface ToSqlResult {\n /** The generated SQL query */\n sql: string;\n /** Number of attempts made */\n attempts: number;\n /** Validation errors encountered (if any retries occurred) */\n errors?: string[];\n}\n\n/** Temperature progression for retries: deterministic first, then increasingly exploratory */\nconst RETRY_TEMPERATURES = [0, 0.2, 0.3];\nconst SQL_AGENT_ROLE = 'Expert SQL query generator.';\nconst SQL_AGENT_OBJECTIVE = 'Generate precise SQL grounded in provided schema.';\n\nconst SQL_AGENT_POLICIES: ContextFragment[] = [\n fragment(\n 'schema_mapping',\n policy({\n rule: 'Translate natural language into precise SQL grounded in available schema entities.',\n }),\n hint('Preserve schema spelling exactly, including typos in column names.'),\n ),\n fragment(\n 'projection_minimality',\n policy({\n rule: 'Return only columns requested by the question; do not add helper columns unless explicitly requested.',\n }),\n policy({\n rule: 'For requests of the form \"X sorted/ordered by Y\", project X only unless Y is explicitly requested as an output field.',\n }),\n policy({\n rule: 'Prefer selecting schema columns directly without derived expressions when direct selection answers the request.',\n }),\n hint(\n 'Do not include ORDER BY, GROUP BY, or JOIN helper columns in SELECT output unless the question explicitly asks for them.',\n ),\n policy({\n rule: 'Use DISTINCT only when uniqueness is explicitly requested (for example distinct/unique/different/no duplicates).',\n }),\n hint(\n 'Do not infer DISTINCT from generic wording such as \"some\", plural nouns, or entity-set phrasing; for transactional/attendance-style tables, default to raw rows unless uniqueness is explicitly requested.',\n ),\n ),\n fragment(\n 'date_transform_safety',\n policy({\n rule: 'Do not assume VARCHAR/TEXT values are parseable dates. Avoid date extraction functions on text columns by default.',\n }),\n policy({\n rule: 'Use date-part extraction only when both conditions hold: the question explicitly asks for transformation and schema values require transformation to produce that unit.',\n }),\n hint(\n 'Do not apply SUBSTR, STRFTIME, DATE_PART, YEAR, or similar extraction functions unless the question explicitly asks for transformation and schema values require it.',\n ),\n hint(\n 'If a column already represents the requested concept (for example a stored year-like value), use the column as-is.',\n ),\n ),\n fragment(\n 'sql_minimality',\n guardrail({\n rule: 'Never hallucinate tables or columns.',\n reason: 'Schema fidelity is required.',\n action: 'Use only available schema entities.',\n }),\n guardrail({\n rule: 'Avoid unnecessary transformations and derived projections.',\n reason:\n 'Extra transformations frequently change semantics and reduce correctness.',\n action:\n 'Do not add date parsing, substring extraction, or derived columns unless explicitly required by the question or schema.',\n }),\n ),\n fragment(\n 'preflight_checklist',\n workflow({\n task: 'Final SQL preflight before returning output',\n steps: [\n 'Verify selected columns match the question and remove unrequested helper projections.',\n 'If aggregate values are used only for ranking/filtering, keep them out of SELECT unless explicitly requested.',\n 'Prefer raw schema columns over derived expressions when raw columns already satisfy the request.',\n 'If a candidate query uses STRFTIME, SUBSTR, DATE_PART, YEAR, or similar extraction on text-like columns, remove that transformation unless explicitly required by the question.',\n 'Return only schema-grounded SQL using existing tables and columns.',\n ],\n }),\n ),\n fragment(\n 'set_semantics',\n policy({\n rule: 'For questions asking where both condition A and condition B hold over an attribute, compute the intersection of qualifying sets for that attribute.',\n }),\n policy({\n rule: 'Do not force the same entity instance to satisfy both conditions unless the question explicitly requests the same person/row/entity.',\n }),\n hint(\n 'Prefer INTERSECT (or logically equivalent set-based shape) over requiring the same physical row/entity to satisfy both conditions unless explicitly requested.',\n ),\n hint(\n 'When two conditions describe different row groups whose shared attribute is requested, build each group separately and intersect the attribute values.',\n ),\n hint(\n 'Do not collapse cross-group conditions into a single-row AND predicate when the intent is shared values across groups.',\n ),\n policy({\n rule: 'If two predicates on the same field cannot both be true for one row, do not combine them with AND; use set operations across separate filtered subsets when shared values are requested.',\n }),\n ),\n fragment(\n 'predicate_column_alignment',\n policy({\n rule: 'Match literal values to semantically compatible columns. Do not compare descriptive names to identifier columns.',\n }),\n hint(\n 'When a filter value is a descriptive label (for example a department name), join through the lookup table and filter on its name/title column, not on *_id columns.',\n ),\n hint(\n 'When relation roles are explicit in wording (for example host/home/source/destination), prefer foreign keys with matching role qualifiers over generic similarly named columns.',\n ),\n policy({\n rule: 'When multiple foreign-key candidates exist, select the column whose qualifier best matches the relationship described in the question.',\n }),\n policy({\n rule: 'For hosting/held semantics, prefer host_* relationship columns when available over generic *_id alternatives.',\n }),\n hint(\n 'Interpret wording like \"held/hosted a competition or event\" as a hosting relationship and map to host_* foreign keys when present.',\n ),\n policy({\n rule: 'Do not compare descriptive labels or names to *_id columns; join to the table containing the descriptive field and filter there.',\n }),\n policy({\n rule: 'Keep numeric identifiers unquoted when used as numeric equality filters unless schema indicates text identifiers.',\n }),\n policy({\n rule: 'When filtering by a descriptive label value and a related table exposes a corresponding *_name or title column, join to that table and filter on the descriptive column.',\n }),\n ),\n fragment(\n 'ordering_semantics',\n policy({\n rule: 'Respect explicit sort direction terms. If direction is not specified, use ascending order unless a superlative intent (most/least/highest/lowest) implies direction.',\n }),\n policy({\n rule: 'When ranking categories by frequency, use COUNT for ordering but keep output focused on requested category fields unless counts are explicitly requested.',\n }),\n policy({\n rule: 'Do not use DESC unless descending direction is explicit or a superlative intent requires descending ranking.',\n }),\n policy({\n rule: 'For \"most common/frequent <attribute>\" requests, return the attribute value(s) only; use counts only for ordering/filtering unless the question explicitly asks to return counts.',\n }),\n hint(\n 'Use DESC with LIMIT 1 for \"most/highest/largest\"; use ASC with LIMIT 1 for \"least/lowest/smallest\".',\n ),\n ),\n fragment(\n 'negative_membership_queries',\n policy({\n rule: 'For requests asking entities that did not participate/host/appear in related records, prefer NOT IN or NOT EXISTS against the related foreign-key set.',\n }),\n hint(\n 'Map role-bearing relationship columns carefully (for example host_* foreign keys for hosting relationships) instead of generic IDs when role wording is explicit.',\n ),\n hint(\n 'For \"never had/never exceeded\" conditions over history tables, exclude entities via NOT IN/NOT EXISTS against the disqualifying entity-id set (often built with GROUP BY/HAVING MAX(...)).',\n ),\n ),\n fragment(\n 'join_completeness',\n policy({\n rule: 'Preserve entity-restricting joins implied by the question. Do not widen results by querying only a broader attribute table when a subset entity table is available.',\n }),\n policy({\n rule: 'If an entity term in the question maps to a table, keep that table in query scope and join to attribute tables rather than dropping the entity table.',\n }),\n hint(\n 'If the question targets a specific entity group, include that entity table and its join conditions even when selected columns come from a related table.',\n ),\n hint(\n 'When the question names an entity type and a relation table links to that entity via *_id, include the entity table in scope instead of counting only relation rows.',\n ),\n hint(\n 'Prefer INNER JOIN by default; use LEFT JOIN only when the question explicitly requests including unmatched rows or zero-related entities.',\n ),\n ),\n fragment(\n 'aggregation_exactness',\n policy({\n rule: 'Preserve requested aggregation semantics exactly: use COUNT(*) by default for total rows, use COUNT(DISTINCT ...) only when uniqueness is explicitly requested, and group by stable entity keys when computing per-entity aggregates.',\n }),\n policy({\n rule: 'For questions asking which entity has lowest/highest average of a metric, compute AVG(metric) per entity (GROUP BY entity) and rank those aggregates.',\n }),\n hint(\n 'For \"how many <entities>\" questions over relation records, default to COUNT(*) on qualifying rows unless explicit uniqueness language is present.',\n ),\n ),\n fragment(\n 'query_shape_examples',\n example({\n question:\n 'List categories ordered by how many records belong to each category.',\n answer:\n 'SELECT category FROM records GROUP BY category ORDER BY COUNT(*)',\n }),\n example({\n question:\n 'Show labels shared by rows with metric > 100 and rows with metric < 10.',\n answer:\n 'SELECT label FROM records WHERE metric > 100 INTERSECT SELECT label FROM records WHERE metric < 10',\n }),\n example({\n question: 'List locations that have not hosted any event.',\n answer:\n 'SELECT location_name FROM locations WHERE location_id NOT IN (SELECT host_location_id FROM events)',\n }),\n example({\n question: 'List the most common category across records.',\n answer:\n 'SELECT category FROM records GROUP BY category ORDER BY COUNT(*) DESC LIMIT 1',\n }),\n ),\n];\n\n/** Extract SQL from markdown fenced code block if present */\nfunction extractSql(output: string): string {\n const match = output.match(/```sql\\n?([\\s\\S]*?)```/);\n return match ? match[1].trim() : output.trim();\n}\n\nexport async function toSql(options: ToSqlOptions): Promise<ToSqlResult> {\n const { maxRetries = 3 } = options;\n\n return withRetry(\n async (attemptNumber, errors, attempts) => {\n const context = new ContextEngine({\n store: new InMemoryContextStore(),\n chatId: `sql-gen-${crypto.randomUUID()}`,\n userId: 'system',\n });\n\n context.set(\n persona({\n name: 'Freya',\n role: SQL_AGENT_ROLE,\n objective: SQL_AGENT_OBJECTIVE,\n // role: `You are a data science expert that provides well-reasoned and detailed responses.`,\n // objective: `Your task is to understand the schema and generate a valid SQL query to answer the question. You first think about the reasoning process as an internal monologue and then provide the user with the answer.`,\n }),\n ...SQL_AGENT_POLICIES,\n ...options.fragments,\n );\n\n // Add user message(s)\n if (errors.length) {\n const lastError = errors.at(-1);\n context.set(\n user(dedent`\n Answer the following question with the SQL code. Use the piece of evidence and base your answer on the database schema.\nGiven the question, the evidence and the database schema, return the SQL script that addresses the question.\n\nQuestion: ${options.input}\n`),\n UnanswerableSQLError.isInstance(lastError)\n ? user(\n `<retry_instruction>Your previous response marked the task as unanswerable. Re-evaluate using best-effort schema mapping. If the core intent is answerable with existing tables/columns, return SQL. Return error only when required core intent cannot be mapped without inventing schema elements.</retry_instruction>`,\n )\n : user(\n `<validation_error>Your previous SQL query had the following error: ${lastError?.message}. Please fix the query.</validation_error>`,\n ),\n );\n } else {\n context.set(\n user(dedent`\n Answer the following question with the SQL code. Use the piece of evidence and base your answer on the database schema.\nGiven the question, the evidence and the database schema, return the SQL script that addresses the question.\n\nQuestion: ${options.input}\n`),\n );\n }\n\n // Create structured output with schema\n const temperature =\n RETRY_TEMPERATURES[attemptNumber - 1] ??\n RETRY_TEMPERATURES[RETRY_TEMPERATURES.length - 1];\n const baseModel = options.model ?? groq('openai/gpt-oss-20b');\n const model = wrapLanguageModel({\n model: baseModel,\n middleware: defaultSettingsMiddleware({ settings: { temperature } }),\n });\n const sqlOutput = structuredOutput({\n model: model,\n context,\n schema: z.object({\n result: z.union([\n z.object({\n sql: z\n .string()\n .describe('The SQL query that answers the question'),\n reasoning: z\n .string()\n .describe('The reasoning steps taken to generate the SQL'),\n }),\n z.object({\n error: z\n .string()\n .describe(\n 'Error message explaining why the question cannot be answered with the given schema',\n ),\n }),\n ]),\n }),\n });\n\n const { result: output } = await sqlOutput.generate();\n\n const finalizeSql = async (rawSql: string): Promise<ToSqlResult> => {\n const sql = options.adapter.format(extractSql(rawSql));\n\n const validationError = await options.adapter.validate(sql);\n if (validationError) {\n throw new SQLValidationError(validationError);\n }\n\n return {\n attempts,\n sql,\n errors: errors.length ? errors.map(formatErrorMessage) : undefined,\n };\n };\n\n // Handle error responses (question is unanswerable with given schema)\n if ('error' in output) {\n context.set(\n user(\n '<best_effort_fallback>Do not return unanswerable. Produce the best valid SQL query that answers the core intent using only available schema entities.</best_effort_fallback>',\n ),\n );\n const forcedSqlOutput = structuredOutput({\n model,\n context,\n schema: z.object({\n sql: z\n .string()\n .describe(\n 'Best-effort SQL query that answers the core intent using only available schema entities.',\n ),\n reasoning: z\n .string()\n .describe('Reasoning steps for best-effort schema mapping.'),\n }),\n });\n\n try {\n const forced = await forcedSqlOutput.generate();\n return await finalizeSql(forced.sql);\n } catch (error) {\n if (\n SQLValidationError.isInstance(error) ||\n APICallError.isInstance(error) ||\n JSONParseError.isInstance(error) ||\n TypeValidationError.isInstance(error) ||\n NoObjectGeneratedError.isInstance(error) ||\n NoOutputGeneratedError.isInstance(error) ||\n NoContentGeneratedError.isInstance(error)\n ) {\n throw error;\n }\n throw new UnanswerableSQLError(output.error);\n }\n }\n\n return await finalizeSql(output.sql);\n },\n { retries: maxRetries - 1 },\n );\n}\n\nfunction formatErrorMessage(error: Error) {\n if (APICallError.isInstance(error)) {\n if (error.message.startsWith('Failed to validate JSON')) {\n return `Schema validation failed: ${error.message}`;\n }\n return error.message;\n }\n if (SQLValidationError.isInstance(error)) {\n return `SQL Validation Error: ${error.message}`;\n }\n return error.message;\n}\n\nfunction isModelUnavailableError(error: unknown): boolean {\n if (!APICallError.isInstance(error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n const responseBody = (error.responseBody ?? '').toLowerCase();\n const is404ModelError =\n error.statusCode === 404 &&\n (message.includes('model') || responseBody.includes('model_not_found'));\n const errorCode =\n typeof error.data === 'object' &&\n error.data !== null &&\n 'error' in error.data &&\n typeof error.data.error === 'object' &&\n error.data.error !== null &&\n 'code' in error.data.error &&\n typeof error.data.error.code === 'string'\n ? error.data.error.code.toLowerCase()\n : undefined;\n\n return (\n is404ModelError ||\n errorCode === 'model_not_found' ||\n responseBody.includes('\"code\":\"model_not_found\"') ||\n (message.includes('model') &&\n message.includes('does not exist or you do not have access to it'))\n );\n}\n\nasync function withRetry<T>(\n computation: (\n attemptNumber: number,\n errors: Error[],\n attempts: number,\n ) => Promise<T>,\n options: { retries: number } = { retries: 3 },\n) {\n const errors: Error[] = [];\n let attempts = 0;\n return pRetry(\n (attemptNumber) => {\n return computation(attemptNumber, errors, ++attempts);\n },\n {\n retries: options.retries,\n shouldRetry: (context) => {\n // Retry one time when the model marks query as unanswerable to recover from false positives.\n if (UnanswerableSQLError.isInstance(context.error)) {\n return false;\n // disable retryng here will also disable the forced sql generation fallback.\n // return context.attemptNumber === 0;\n }\n // Don't retry if the selected model is unavailable\n if (isModelUnavailableError(context.error)) {\n return false;\n }\n // Retry on validation errors\n if (SQLValidationError.isInstance(context.error)) {\n return true;\n }\n console.log({\n NoObjectGeneratedError: NoObjectGeneratedError.isInstance(\n context.error,\n ),\n NoOutputGeneratedError: NoOutputGeneratedError.isInstance(\n context.error,\n ),\n APICallError: APICallError.isInstance(context.error),\n JSONParseError: JSONParseError.isInstance(context.error),\n TypeValidationError: TypeValidationError.isInstance(context.error),\n NoContentGeneratedError: NoContentGeneratedError.isInstance(\n context.error,\n ),\n });\n // Retry on AI SDK errors\n return (\n APICallError.isInstance(context.error) ||\n JSONParseError.isInstance(context.error) ||\n TypeValidationError.isInstance(context.error) ||\n NoObjectGeneratedError.isInstance(context.error) ||\n NoOutputGeneratedError.isInstance(context.error) ||\n NoContentGeneratedError.isInstance(context.error)\n );\n },\n onFailedAttempt(context) {\n // console.log(\n // `Attempt ${context.attemptNumber} failed. There are ${context.retriesLeft} retries left.`,\n // );\n // console.dir(context.error, { depth: null });\n errors.push(context.error);\n },\n },\n );\n}\n", "import { groq } from '@ai-sdk/groq';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport { agent, thirdPersonPrompt } from '@deepagents/agent';\n\nimport type { Introspection } from '../adapters/adapter.ts';\nimport { databaseSchemaPrompt } from '../prompt.ts';\n\ntype SuggestionsAgentContext = {\n context?: string;\n adapterInfo?: string;\n};\ntype SuggestionsAgentOutput = {\n suggestions: {\n question: string;\n sql: string;\n businessValue: string;\n }[];\n};\n\nexport const suggestionsAgent = agent<\n SuggestionsAgentOutput,\n SuggestionsAgentContext\n>({\n name: 'text2sql-suggestions',\n model: groq('openai/gpt-oss-20b'),\n output: z.object({\n suggestions: z\n .array(\n z.object({\n question: z\n .string()\n .describe('A complex, high-impact business question.'),\n sql: z\n .string()\n .describe('The SQL statement needed to answer the question.'),\n businessValue: z\n .string()\n .describe('Why the question matters to stakeholders.'),\n }),\n )\n .min(1)\n .max(5)\n .describe('A set of up to two advanced question + SQL pairs.'),\n }),\n prompt: (state) => {\n return dedent`\n ${thirdPersonPrompt()}\n\n <identity>\n You are a senior analytics strategist who proposes ambitious business questions\n and drafts the SQL needed to answer them. You specialize in identifying ideas\n that combine multiple tables, apply segmentation or time analysis, and surface\n metrics that drive executive decisions.\n </identity>\n\n\n <instructions>\n - Recommend one or two UNIQUE questions that go beyond simple counts or listings.\n - Favor questions that require joins, aggregates, time comparisons, cohort analysis,\n or window functions.\n - For each question, explain the business reason stakeholders care about it.\n - Provide the complete SQL query that could answer the question in the given schema.\n - Keep result sets scoped with LIMIT clauses (max 50 rows) when returning raw rows.\n - Ensure table/column names match the provided schema exactly.\n - Use columns marked [LowCardinality: ...] to identify meaningful categorical filters or segmentations.\n - Leverage table [rows / size] hints to determine whether to aggregate (large tables) or inspect detailed data (tiny tables).\n - Reference PK/Indexed annotations and the Indexes list to recommend queries that use efficient join/filter paths.\n - Column annotations may expose ranges/null percentages\u2014use them to suggest realistic thresholds or quality checks.\n - Consult <relationship_examples> to anchor your recommendations in the actual join paths between tables.\n - Output only information grounded in the schema/context provided.\n </instructions>\n\n <response-format>\n Return valid JSON that satisfies the defined output schema.\n </response-format>\n `;\n },\n});\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport pLimit from 'p-limit';\n\nexport interface CheckpointOptions {\n /** Path to the checkpoint file */\n path: string;\n /** Hash to detect config changes - if changed, checkpoint is invalidated */\n configHash?: string;\n}\n\n/**\n * Codec for encoding/decoding values during checkpoint operations.\n * Use this when storing objects with methods (like Teachables) that need\n * to be serialized to plain JSON and restored with their methods.\n */\nexport interface Codec<T, TSerialized = unknown> {\n /** Convert runtime value to JSON-serializable format */\n encode: (value: T) => TSerialized;\n /** Convert stored JSON back to runtime value */\n decode: (serialized: TSerialized) => T;\n}\n\ninterface PointEntry {\n inputHash: string;\n output: unknown;\n}\n\ninterface PointData {\n committed: boolean;\n entries: PointEntry[];\n}\n\ninterface CheckpointFile {\n configHash?: string;\n points: Record<string, PointData>;\n}\n\nexport class Checkpoint {\n private points: Record<string, PointData>;\n private path: string;\n private configHash: string | undefined;\n\n private constructor(\n path: string,\n configHash: string | undefined,\n points: Record<string, PointData>,\n ) {\n this.points = points;\n this.path = path;\n this.configHash = configHash;\n }\n\n /**\n * Load checkpoint from file, or return empty checkpoint if none exists.\n * Handles corrupted files and config changes gracefully.\n */\n static async load(options: CheckpointOptions): Promise<Checkpoint> {\n const { path, configHash } = options;\n\n if (existsSync(path)) {\n try {\n const content = readFileSync(path, 'utf-8');\n const file: CheckpointFile = JSON.parse(content);\n\n // Check if config changed\n if (configHash && file.configHash && file.configHash !== configHash) {\n console.log('\u26A0 Config changed, starting fresh');\n return new Checkpoint(path, configHash, {});\n }\n\n const points = file.points ?? {};\n const totalEntries = Object.values(points).reduce(\n (sum, p) => sum + p.entries.length,\n 0,\n );\n console.log(`\u2713 Resuming from checkpoint (${totalEntries} entries)`);\n return new Checkpoint(path, configHash, points);\n } catch {\n console.log('\u26A0 Checkpoint corrupted, starting fresh');\n return new Checkpoint(path, configHash, {});\n }\n }\n\n console.log('Starting new checkpoint');\n return new Checkpoint(path, configHash, {});\n }\n\n /**\n * Run a single computation with checkpointing.\n * If already completed, returns cached value.\n *\n * @param key - Unique identifier for this computation\n * @param computation - Async function that produces the value\n * @param codec - Optional codec for encoding/decoding non-primitive values\n */\n async run<T>(\n key: string,\n computation: () => Promise<T>,\n codec?: Codec<T>,\n ): Promise<T> {\n const point = this.point<T>(key);\n\n // Use fixed input hash for single-value runs\n return point.through(\n 'single',\n async () => {\n const result = await computation();\n return codec ? (codec.encode(result) as T) : result;\n },\n codec,\n );\n }\n\n /**\n * Create a resumable checkpoint point for iterative operations.\n *\n * @param step - Unique identifier for this checkpoint point\n */\n point<T>(step: string): Point<T> {\n this.points[step] ??= { committed: false, entries: [] };\n return new Point<T>(this.points[step], () => this.save());\n }\n\n /**\n * Process each input with automatic checkpointing and concurrency.\n *\n * @param step - Unique identifier for this checkpoint\n * @param inputs - Items to process\n * @param process - Function to process each input\n * @param options - Optional settings like concurrency\n * @returns All outputs (use `.flat()` if outputs are arrays)\n */\n async each<I, O>(\n step: string,\n inputs: Iterable<I>,\n process: (input: I) => Promise<O>,\n options?: { concurrency?: number },\n ): Promise<O[]> {\n const point = this.point<O>(step);\n const limit = pLimit(options?.concurrency ?? 1);\n\n const inputArray = Array.from(inputs);\n await Promise.all(\n inputArray.map((input) =>\n limit(() => point.through(input, () => process(input))),\n ),\n );\n\n await point.commit();\n return point.values();\n }\n\n /**\n * Get clean output from all completed points.\n * Single-entry points return the value directly, multi-entry return arrays.\n */\n getOutput(): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n for (const [key, pointData] of Object.entries(this.points)) {\n if (pointData.entries.length === 1) {\n output[key] = pointData.entries[0].output;\n } else {\n output[key] = pointData.entries.map((e) => e.output);\n }\n }\n return output;\n }\n\n /** Get the file path where checkpoint is stored */\n getPath(): string {\n return this.path;\n }\n\n private async save(): Promise<void> {\n const file: CheckpointFile = {\n configHash: this.configHash,\n points: this.points,\n };\n const content = JSON.stringify(file, null, 2);\n\n // Atomic write: write to temp file, then rename\n const tempPath = `${this.path}.tmp`;\n writeFileSync(tempPath, content);\n renameSync(tempPath, this.path);\n }\n}\n\nfunction hash(value: unknown): string {\n return createHash('md5').update(JSON.stringify(value)).digest('hex');\n}\n\n/**\n * A checkpoint point for tracking iterative operations.\n * Uses input hashing to determine if an operation was already processed.\n */\nexport class Point<T> {\n #cache: Map<string, T>;\n private data: PointData;\n private persist: () => Promise<void>;\n\n constructor(data: PointData, persist: () => Promise<void>) {\n this.#cache = new Map(\n data.entries.map((e) => [e.inputHash, e.output as T]),\n );\n this.data = data;\n this.persist = persist;\n }\n\n /**\n * Execute computation if input wasn't processed before.\n * Returns cached output if input hash exists, otherwise executes, saves, and returns.\n */\n async through<I, O>(\n input: I,\n compute: () => Promise<O>,\n codec?: Codec<O>,\n ): Promise<O> {\n const inputHash = hash(input);\n\n if (this.#cache.has(inputHash)) {\n const cached = this.#cache.get(inputHash) as O;\n return codec ? codec.decode(cached) : cached;\n }\n\n const output = await compute();\n this.data.entries.push({ inputHash, output });\n this.#cache.set(inputHash, output as T);\n await this.persist();\n return codec ? codec.decode(output) : output;\n }\n\n /** Mark this point as complete. */\n async commit(): Promise<void> {\n this.data.committed = true;\n await this.persist();\n }\n\n /** Check if this point has been committed. */\n isCommitted(): boolean {\n return this.data.committed;\n }\n\n /** Get all outputs from this point. */\n values(): T[] {\n return this.data.entries.map((e) => e.output as T);\n }\n}\n\n/**\n * Generate a hash from a config object for checkpoint invalidation.\n * If config changes, the checkpoint will be invalidated and pipeline restarts.\n */\nexport function hashConfig(config: Record<string, unknown>): string {\n return createHash('md5').update(JSON.stringify(config)).digest('hex');\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nexport class FileCache {\n public path: string;\n constructor(watermark: string, extension = '.txt') {\n const hash = createHash('md5').update(watermark).digest('hex');\n this.path = path.join(tmpdir(), `text2sql-${hash}${extension}`);\n }\n\n async get() {\n if (existsSync(this.path)) {\n return readFile(this.path, 'utf-8');\n }\n return null;\n }\n\n set(content: string) {\n return writeFile(this.path, content, 'utf-8');\n }\n}\n\nexport class JsonCache<T> extends FileCache {\n constructor(watermark: string) {\n super(watermark, '.json');\n }\n\n async read(): Promise<T | null> {\n const content = await this.get();\n if (content) {\n return JSON.parse(content) as T;\n }\n return null;\n }\n\n write(data: T) {\n return this.set(JSON.stringify(data));\n }\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport * as path from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\n\nimport SQLITE_FS_DDL from './ddl.sqlite-fs.sql';\n\n// Types not exported from just-bash main index but defined in IFileSystem\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\n/**\n * Options for creating a SQLite filesystem.\n */\nexport interface SqliteFsOptions {\n /** Path to SQLite database file */\n dbPath: string;\n\n /**\n * Root path prefix for all operations (required).\n * All filesystem operations will be scoped under this path.\n * Use '/' for root-level storage without namespace isolation.\n *\n * @example\n * // With root: '/chat-123/results'\n * // writeFile('/file.json') \u2192 stores at '/chat-123/results/file.json'\n * // readFile('/file.json') \u2192 reads from '/chat-123/results/file.json'\n */\n root: string;\n\n /** Chunk size for large files in bytes (default: 1MB) */\n chunkSize?: number;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlinkTarget: string | null;\n}\n\ninterface ChunkRow {\n data: Uint8Array;\n}\n\n/**\n * SQLite-based filesystem implementing IFileSystem interface.\n *\n * Provides persistent storage for files and directories using SQLite.\n * Files are stored in chunks (default 1MB) to handle large files efficiently.\n *\n * Uses WAL mode and prepared statement caching for performance.\n */\nexport class SqliteFs implements IFileSystem {\n #db: DatabaseSync;\n #statements = new Map<string, ReturnType<DatabaseSync['prepare']>>();\n #chunkSize: number;\n #root: string;\n\n constructor(options: SqliteFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024; // 1MB default\n // Normalize root; if user passes '/', treat as empty (root-level storage)\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n this.#db = new DatabaseSync(options.dbPath);\n this.#db.exec(SQLITE_FS_DDL);\n\n // Always ensure '/' exists first (for all instances sharing the DB)\n const rootSlashExists = this.#stmt(\n 'SELECT 1 FROM fs_entries WHERE path = ?',\n ).get('/');\n if (!rootSlashExists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES ('/', 'directory', 493, 0, ?)`,\n ).run(Date.now());\n }\n\n if (this.#root) {\n this.#createParentDirs(this.#root);\n\n const rootExists = this.#stmt(\n 'SELECT 1 FROM fs_entries WHERE path = ?',\n ).get(this.#root);\n if (!rootExists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(this.#root, Date.now());\n }\n }\n }\n\n /**\n * Create parent directories for a path (used during initialization).\n * Creates all segments EXCEPT the last one (the path itself).\n */\n #createParentDirs(p: string): void {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n currentPath,\n );\n\n if (!exists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(currentPath, Date.now());\n }\n }\n }\n\n #stmt(sql: string): ReturnType<DatabaseSync['prepare']> {\n let stmt = this.#statements.get(sql);\n if (!stmt) {\n stmt = this.#db.prepare(sql);\n this.#statements.set(sql, stmt);\n }\n return stmt;\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n // path.posix.join('/root', '/') incorrectly returns '/root/'\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n // Should not happen unless a symlink escapes the configured root.\n // Return the best-effort canonical path to avoid breaking callers.\n return p;\n }\n\n #useTransaction<T>(fn: () => T): T {\n this.#db.exec('BEGIN TRANSACTION');\n try {\n const result = fn();\n this.#db.exec('COMMIT');\n return result;\n } catch (error) {\n this.#db.exec('ROLLBACK');\n throw error;\n }\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n #ensureParentExists(filePath: string): void {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n parent,\n ) as { type: string } | undefined;\n\n if (!entry) {\n this.#ensureParentExists(parent);\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(parent, Date.now());\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n #writeChunks(filePath: string, content: Uint8Array): void {\n this.#stmt('DELETE FROM fs_chunks WHERE path = ?').run(filePath);\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(filePath, Math.floor(i / this.#chunkSize), chunk);\n }\n }\n\n #readChunks(filePath: string): Uint8Array {\n const rows = this.#stmt(\n 'SELECT data FROM fs_chunks WHERE path = ? ORDER BY chunkIndex',\n ).all(filePath) as unknown as ChunkRow[];\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(row.data, offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n #resolveSymlink(p: string, seen = new Set<string>()): string {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const entry = this.#stmt(\n 'SELECT type, symlinkTarget FROM fs_entries WHERE path = ?',\n ).get(p) as Pick<FsEntryRow, 'type' | 'symlinkTarget'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlinkTarget!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', 420, ?, ?)\n ON CONFLICT(path) DO UPDATE SET\n type = 'file',\n size = excluded.size,\n mtime = excluded.mtime`,\n ).run(prefixed, data.length, Date.now());\n\n this.#writeChunks(prefixed, data);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n const entry = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry ? this.#readChunks(prefixed) : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', 420, ?, ?)\n ON CONFLICT(path) DO UPDATE SET\n size = excluded.size,\n mtime = excluded.mtime`,\n ).run(prefixed, combined.length, Date.now());\n\n this.#writeChunks(prefixed, combined);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const row = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n prefixed,\n );\n return row !== undefined;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as FsEntryRow | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false, // stat follows symlinks\n mode: entry.mode,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n prefixed,\n ) as FsEntryRow | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: entry.mode,\n size: entry.size,\n mtime: new Date(entry.mtime),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existing = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (existing) {\n if (options?.recursive) {\n return; // Already exists, ok for recursive\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n this.#useTransaction(() => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const exists = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(currentPath) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!exists) {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(currentPath, Date.now());\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n // Non-recursive: parent must exist\n const parent = this.#dirname(prefixed);\n const parentEntry = this.#stmt(\n 'SELECT type FROM fs_entries WHERE path = ?',\n ).get(parent) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'directory', 493, 0, ?)`,\n ).run(prefixed, Date.now());\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n // Get direct children (path starts with dir/ but doesn't have another / after)\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = this.#stmt(\n `SELECT path FROM fs_entries\n WHERE path LIKE ? || '%'\n AND path != ?\n AND path NOT LIKE ? || '%/%'`,\n ).all(prefix, resolved, prefix) as { path: string }[];\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n resolved,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = this.#stmt(\n `SELECT path, type FROM fs_entries\n WHERE path LIKE ? || '%'\n AND path != ?\n AND path NOT LIKE ? || '%/%'`,\n ).all(prefix, resolved, prefix) as Pick<FsEntryRow, 'path' | 'type'>[];\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt('SELECT type FROM fs_entries WHERE path = ?').get(\n prefixed,\n ) as Pick<FsEntryRow, 'type'> | undefined;\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n this.#useTransaction(() => {\n if (entry.type === 'directory') {\n const children = this.#stmt(\n `SELECT 1 FROM fs_entries WHERE path LIKE ? || '/%' LIMIT 1`,\n ).get(prefixed);\n\n if (children && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n // Chunks cascade via FK\n this.#stmt(\n `DELETE FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).run(prefixed, prefixed);\n } else {\n this.#stmt('DELETE FROM fs_entries WHERE path = ?').run(prefixed);\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n if (srcEntry.type === 'directory') {\n const allEntries = this.#stmt(\n `SELECT * FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).all(srcPrefixed, srcPrefixed) as unknown as FsEntryRow[];\n\n for (const entry of allEntries) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n this.#stmt(\n `INSERT OR REPLACE INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlinkTarget,\n );\n\n if (entry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(entry.path) as { chunkIndex: number; data: Uint8Array }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(newPath, chunk.chunkIndex, chunk.data);\n }\n }\n }\n } else {\n this.#stmt(\n `INSERT OR REPLACE INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlinkTarget,\n );\n\n if (srcEntry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as { chunkIndex: number; data: Uint8Array }[];\n\n this.#stmt('DELETE FROM fs_chunks WHERE path = ?').run(destPrefixed);\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n if (srcEntry.type === 'directory') {\n // Reverse order: children before parents for delete\n const allEntries = this.#stmt(\n `SELECT * FROM fs_entries WHERE path = ? OR path LIKE ? || '/%' ORDER BY path DESC`,\n ).all(srcPrefixed, srcPrefixed) as unknown as FsEntryRow[];\n\n for (const entry of [...allEntries].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlinkTarget,\n );\n\n if (entry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(entry.path) as unknown as {\n chunkIndex: number;\n data: Uint8Array;\n }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(newPath, chunk.chunkIndex, chunk.data);\n }\n }\n }\n\n // Chunks cascade via FK\n this.#stmt(\n `DELETE FROM fs_entries WHERE path = ? OR path LIKE ? || '/%'`,\n ).run(srcPrefixed, srcPrefixed);\n } else {\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlinkTarget,\n );\n\n if (srcEntry.type === 'file') {\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as unknown as {\n chunkIndex: number;\n data: Uint8Array;\n }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n }\n\n this.#stmt('DELETE FROM fs_entries WHERE path = ?').run(srcPrefixed);\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n const rows = this.#stmt(\n 'SELECT path FROM fs_entries ORDER BY path',\n ).all() as {\n path: string;\n }[];\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const exists = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n resolved,\n );\n if (!exists) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = this.#resolveSymlink(prefixed);\n\n const result = this.#stmt(\n 'UPDATE fs_entries SET mtime = ? WHERE path = ?',\n ).run(mtime.getTime(), resolved);\n\n if (result.changes === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = this.#stmt(\n 'UPDATE fs_entries SET mode = ? WHERE path = ?',\n ).run(mode, prefixed);\n\n if (result.changes === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existing = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n prefixed,\n );\n if (existing) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n this.#useTransaction(() => {\n this.#ensureParentExists(prefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime, symlinkTarget)\n VALUES (?, 'symlink', 511, 0, ?, ?)`,\n ).run(prefixed, Date.now(), target);\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcEntry = this.#stmt('SELECT * FROM fs_entries WHERE path = ?').get(\n srcPrefixed,\n ) as FsEntryRow | undefined;\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existing = this.#stmt('SELECT 1 FROM fs_entries WHERE path = ?').get(\n destPrefixed,\n );\n if (existing) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n // Hard link: duplicate the entry and chunks\n this.#useTransaction(() => {\n this.#ensureParentExists(destPrefixed);\n\n this.#stmt(\n `INSERT INTO fs_entries (path, type, mode, size, mtime)\n VALUES (?, 'file', ?, ?, ?)`,\n ).run(destPrefixed, srcEntry.mode, srcEntry.size, Date.now());\n\n const chunks = this.#stmt(\n 'SELECT chunkIndex, data FROM fs_chunks WHERE path = ?',\n ).all(srcPrefixed) as { chunkIndex: number; data: Uint8Array }[];\n\n for (const chunk of chunks) {\n this.#stmt(\n 'INSERT INTO fs_chunks (path, chunkIndex, data) VALUES (?, ?, ?)',\n ).run(destPrefixed, chunk.chunkIndex, chunk.data);\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const entry = this.#stmt(\n 'SELECT type, symlinkTarget FROM fs_entries WHERE path = ?',\n ).get(prefixed) as Pick<FsEntryRow, 'type' | 'symlinkTarget'> | undefined;\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlinkTarget!;\n }\n}\n", "-- SQLite-based filesystem schema for artifact storage\n-- Tables: fs_entries (file/directory metadata), fs_chunks (file content)\n\n-- Performance PRAGMAs (session-level, run on each connection)\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000;\nPRAGMA temp_store = MEMORY;\nPRAGMA mmap_size = 268435456;\n\n-- Integrity\nPRAGMA foreign_keys = ON;\n\n-- Filesystem entries table (files, directories, symlinks)\nCREATE TABLE IF NOT EXISTS fs_entries (\n path TEXT PRIMARY KEY, -- Normalized absolute path (e.g., '/results/uuid.json')\n type TEXT NOT NULL, -- 'file' | 'directory' | 'symlink'\n mode INTEGER NOT NULL, -- Unix permissions (e.g., 0o644 = 420)\n size INTEGER NOT NULL, -- File size in bytes (0 for directories)\n mtime INTEGER NOT NULL, -- Modified time (milliseconds since epoch)\n symlinkTarget TEXT -- Target path for symlinks (NULL for files/dirs)\n);\n\nCREATE INDEX IF NOT EXISTS idx_fs_entries_type ON fs_entries(type);\n\n-- File content chunks table (for handling large files)\n-- Files are split into 1MB chunks to avoid SQLite BLOB performance issues\nCREATE TABLE IF NOT EXISTS fs_chunks (\n path TEXT NOT NULL, -- Reference to fs_entries.path\n chunkIndex INTEGER NOT NULL, -- 0-based chunk sequence\n data BLOB NOT NULL, -- Chunk content (up to 1MB default)\n PRIMARY KEY (path, chunkIndex),\n FOREIGN KEY (path) REFERENCES fs_entries(path) ON DELETE CASCADE ON UPDATE CASCADE\n);\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport type { ConnectionPool, Transaction, config } from 'mssql';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\n\nimport { mssqlFsDDL } from './ddl.mssql-fs.ts';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface MssqlFsOptions {\n /** SQL Server connection pool or configuration. Can be a connection string, config object, or existing ConnectionPool. */\n pool: config | string | ConnectionPool;\n /** Root path prefix for all operations */\n root: string;\n /** Chunk size for large files in bytes (default: 1MB) */\n chunkSize?: number;\n /**\n * SQL Server schema to scope all tables under.\n * Defaults to 'dbo'.\n */\n schema?: string;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlinkTarget: string | null;\n [key: string]: unknown;\n}\n\ninterface ChunkRow {\n data: Buffer;\n [key: string]: unknown;\n}\n\nexport class MssqlFs implements IFileSystem {\n #pool: ConnectionPool;\n #chunkSize: number;\n #root: string;\n #schema: string;\n #ownsPool: boolean;\n #isInitialized = false;\n\n constructor(options: MssqlFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024;\n const schema = options.schema ?? 'dbo';\n if (!/^[a-zA-Z_]\\w*$/.test(schema)) {\n throw new Error(`Invalid schema name: \"${schema}\"`);\n }\n this.#schema = schema;\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n\n const mssql = MssqlFs.#requireMssql();\n if (options.pool instanceof mssql.ConnectionPool) {\n this.#pool = options.pool;\n this.#ownsPool = false;\n } else {\n this.#pool = new mssql.ConnectionPool(options.pool);\n this.#ownsPool = true;\n }\n }\n\n static #requireMssql(): typeof import('mssql') {\n try {\n const require = createRequire(import.meta.url);\n return require('mssql');\n } catch {\n throw new Error(\n 'MssqlFs requires the \"mssql\" package. Install it with: npm install mssql',\n );\n }\n }\n\n #t(name: string): string {\n return `[${this.#schema}].[${name}]`;\n }\n\n async initialize(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.connect();\n }\n\n const schemaReq = this.#pool.request();\n schemaReq.input('schema', this.#schema);\n await schemaReq.query(`\n IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = @schema)\n BEGIN\n DECLARE @sql NVARCHAR(MAX) = N'CREATE SCHEMA ' + QUOTENAME(@schema);\n EXEC sp_executesql @sql;\n END\n `);\n\n const ddl = mssqlFsDDL(this.#schema);\n const batches = ddl.split(/\\bGO\\b/i).filter((b) => b.trim());\n for (const batch of batches) {\n if (batch.trim()) {\n await this.#pool.request().batch(batch);\n }\n }\n\n const rootSlashExists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = '/') THEN 1 ELSE 0 END as [exists]`,\n );\n if (rootSlashExists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ('/', 'directory', 493, 0, @p0)`,\n [Date.now()],\n );\n }\n\n if (this.#root) {\n await this.#createParentDirs(this.#root);\n\n const rootExists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [this.#root],\n );\n if (rootExists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n [this.#root, Date.now()],\n );\n }\n }\n\n this.#isInitialized = true;\n }\n\n #ensureInitialized(): void {\n if (!this.#isInitialized) {\n throw new Error(\n 'MssqlFs not initialized. Call await fs.initialize() after construction.',\n );\n }\n }\n\n async #createParentDirs(p: string): Promise<void> {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = await this.#rawQuery<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [currentPath],\n );\n\n if (exists[0].exists === 0) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n [currentPath, Date.now()],\n );\n }\n }\n }\n\n async #rawQuery<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n const request = this.#pool.request();\n params?.forEach((value, index) => {\n request.input(`p${index}`, value);\n });\n const result = await request.query(sql);\n return result.recordset as T[];\n }\n\n async #rawExec(sql: string, params?: unknown[]): Promise<number> {\n const request = this.#pool.request();\n params?.forEach((value, index) => {\n request.input(`p${index}`, value);\n });\n const result = await request.query(sql);\n return result.rowsAffected[0] ?? 0;\n }\n\n async #query<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n this.#ensureInitialized();\n return this.#rawQuery<T>(sql, params);\n }\n\n async #exec(sql: string, params?: unknown[]): Promise<number> {\n this.#ensureInitialized();\n return this.#rawExec(sql, params);\n }\n\n async #useTransaction<T>(\n fn: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n this.#ensureInitialized();\n const mssql = MssqlFs.#requireMssql();\n const transaction = new mssql.Transaction(this.#pool);\n try {\n await transaction.begin();\n const result = await fn(transaction);\n await transaction.commit();\n return result;\n } catch (error) {\n await transaction.rollback();\n throw error;\n }\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n // Should not happen unless a symlink escapes the configured root.\n // Return the best-effort canonical path to avoid breaking callers.\n return p;\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n async #ensureParentExists(\n filePath: string,\n transaction: Transaction,\n ): Promise<void> {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const request = transaction.request();\n request.input('p0', parent);\n const result = await request.query<{ type: string }>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const entry = result.recordset[0];\n\n if (!entry) {\n await this.#ensureParentExists(parent, transaction);\n const insertReq = transaction.request();\n insertReq.input('p0', parent);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n async #writeChunks(\n filePath: string,\n content: Uint8Array,\n transaction: Transaction,\n ): Promise<void> {\n const deleteReq = transaction.request();\n deleteReq.input('p0', filePath);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n const insertReq = transaction.request();\n insertReq.input('p0', filePath);\n insertReq.input('p1', Math.floor(i / this.#chunkSize));\n insertReq.input('p2', Buffer.from(chunk));\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n\n async #readChunks(\n filePath: string,\n transaction?: Transaction,\n ): Promise<Uint8Array> {\n let rows: ChunkRow[];\n if (transaction) {\n const req = transaction.request();\n req.input('p0', filePath);\n const result = await req.query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = @p0 ORDER BY chunkIndex`,\n );\n rows = result.recordset as ChunkRow[];\n } else {\n rows = await this.#query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = @p0 ORDER BY chunkIndex`,\n [filePath],\n );\n }\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(new Uint8Array(row.data), offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n async #resolveSymlink(p: string, seen = new Set<string>()): Promise<string> {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlinkTarget'>>(\n `SELECT type, symlinkTarget FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [p],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlinkTarget!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.close();\n }\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = await this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const request = transaction.request();\n request.input('p0', prefixed);\n request.input('p1', data.length);\n request.input('p2', Date.now());\n\n await request.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = 'file', size = @p1, mtime = @p2\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime)\n VALUES (@p0, 'file', 420, @p1, @p2);\n `);\n\n await this.#writeChunks(prefixed, data, transaction);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const checkReq = transaction.request();\n checkReq.input('p0', prefixed);\n const result = await checkReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const entry = result.recordset[0];\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry\n ? await this.#readChunks(prefixed, transaction)\n : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n const upsertReq = transaction.request();\n upsertReq.input('p0', prefixed);\n upsertReq.input('p1', combined.length);\n upsertReq.input('p2', Date.now());\n\n await upsertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET size = @p1, mtime = @p2\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime)\n VALUES (@p0, 'file', 420, @p1, @p2);\n `);\n\n await this.#writeChunks(prefixed, combined, transaction);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const rows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [prefixed],\n );\n return rows[0].exists === 1;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false,\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const existing = existingRows[0];\n\n if (existing) {\n if (options?.recursive) {\n return;\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const checkReq = transaction.request();\n checkReq.input('p0', currentPath);\n const result = await checkReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const exists = result.recordset[0];\n\n if (!exists) {\n const insertReq = transaction.request();\n insertReq.input('p0', currentPath);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n const parent = this.#dirname(prefixed);\n const parentReq = transaction.request();\n parentReq.input('p0', parent);\n const parentResult = await parentReq.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n const parentEntry = parentResult.recordset[0];\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n const insertReq = transaction.request();\n insertReq.input('p0', prefixed);\n insertReq.input('p1', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES (@p0, 'directory', 493, 0, @p1)`,\n );\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<{ path: string }>(\n `SELECT path FROM ${this.#t('fs_entries')}\n WHERE path LIKE @p0 + '%'\n AND path != @p1\n AND path NOT LIKE @p0 + '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<Pick<FsEntryRow, 'path' | 'type'>>(\n `SELECT path, type FROM ${this.#t('fs_entries')}\n WHERE path LIKE @p0 + '%'\n AND path != @p1\n AND path NOT LIKE @p0 + '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n if (entry.type === 'directory') {\n const childrenReq = transaction.request();\n childrenReq.input('p0', prefixed);\n const childrenResult = await childrenReq.query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path LIKE @p0 + '/%') THEN 1 ELSE 0 END as [exists]`,\n );\n\n if (childrenResult.recordset[0].exists === 1 && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', prefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n } else {\n const deleteReq = transaction.request();\n deleteReq.input('p0', prefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n if (srcEntry.type === 'directory') {\n const allEntriesReq = transaction.request();\n allEntriesReq.input('p0', srcPrefixed);\n const allEntriesResult = await allEntriesReq.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n\n for (const entry of allEntriesResult.recordset) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n const insertReq = transaction.request();\n insertReq.input('p0', newPath);\n insertReq.input('p1', entry.type);\n insertReq.input('p2', entry.mode);\n insertReq.input('p3', entry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', entry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (entry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', newPath);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', entry.path);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', newPath);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n } else {\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.type);\n insertReq.input('p2', srcEntry.mode);\n insertReq.input('p3', srcEntry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', srcEntry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (srcEntry.type === 'file') {\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', destPrefixed);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n if (srcEntry.type === 'directory') {\n const allEntriesReq = transaction.request();\n allEntriesReq.input('p0', srcPrefixed);\n const allEntriesResult = await allEntriesReq.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%' ORDER BY path DESC`,\n );\n\n const destDeleteReq = transaction.request();\n destDeleteReq.input('dp0', destPrefixed);\n await destDeleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @dp0 OR path LIKE @dp0 + '/%'`,\n );\n\n for (const entry of [...allEntriesResult.recordset].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n const insertReq = transaction.request();\n insertReq.input('p0', newPath);\n insertReq.input('p1', entry.type);\n insertReq.input('p2', entry.mode);\n insertReq.input('p3', entry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', entry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (entry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', newPath);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', entry.path);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', newPath);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', srcPrefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0 OR path LIKE @p0 + '/%'`,\n );\n } else {\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.type);\n insertReq.input('p2', srcEntry.mode);\n insertReq.input('p3', srcEntry.size);\n insertReq.input('p4', Date.now());\n insertReq.input('p5', srcEntry.symlinkTarget);\n\n await insertReq.query(`\n MERGE ${this.#t('fs_entries')} AS target\n USING (SELECT @p0 AS path) AS source\n ON target.path = source.path\n WHEN MATCHED THEN\n UPDATE SET type = @p1, mode = @p2, size = @p3, mtime = @p4, symlinkTarget = @p5\n WHEN NOT MATCHED THEN\n INSERT (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, @p1, @p2, @p3, @p4, @p5);\n `);\n\n if (srcEntry.type === 'file') {\n const deleteChunksReq = transaction.request();\n deleteChunksReq.input('p0', destPrefixed);\n await deleteChunksReq.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n }\n\n const deleteReq = transaction.request();\n deleteReq.input('p0', srcPrefixed);\n await deleteReq.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n );\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n throw new Error(\n 'getAllPaths() is not supported in MssqlFs - use getAllPathsAsync() instead',\n );\n }\n\n async getAllPathsAsync(): Promise<string[]> {\n const rows = await this.#query<{ path: string; [key: string]: unknown }>(\n `SELECT path FROM ${this.#t('fs_entries')} ORDER BY path`,\n );\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [resolved],\n );\n if (rows[0].exists !== 1) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mtime = @p0 WHERE path = @p1`,\n [mtime.getTime(), resolved],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mode = @p0 WHERE path = @p1`,\n [mode, prefixed],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [prefixed],\n );\n if (existingRows[0].exists === 1) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(prefixed, transaction);\n\n const insertReq = transaction.request();\n insertReq.input('p0', prefixed);\n insertReq.input('p1', Date.now());\n insertReq.input('p2', target);\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlinkTarget)\n VALUES (@p0, 'symlink', 511, 0, @p1, @p2)`,\n );\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existingRows = await this.#query<{ exists: number }>(\n `SELECT CASE WHEN EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = @p0) THEN 1 ELSE 0 END as [exists]`,\n [destPrefixed],\n );\n if (existingRows[0].exists === 1) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n await this.#useTransaction(async (transaction) => {\n await this.#ensureParentExists(destPrefixed, transaction);\n\n const insertReq = transaction.request();\n insertReq.input('p0', destPrefixed);\n insertReq.input('p1', srcEntry.mode);\n insertReq.input('p2', srcEntry.size);\n insertReq.input('p3', Date.now());\n await insertReq.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES (@p0, 'file', @p1, @p2, @p3)`,\n );\n\n const chunksReq = transaction.request();\n chunksReq.input('p0', srcPrefixed);\n const chunksResult = await chunksReq.query<{\n chunkIndex: number;\n data: Buffer;\n }>(\n `SELECT chunkIndex, data FROM ${this.#t('fs_chunks')} WHERE path = @p0`,\n );\n\n for (const chunk of chunksResult.recordset) {\n const chunkInsertReq = transaction.request();\n chunkInsertReq.input('p0', destPrefixed);\n chunkInsertReq.input('p1', chunk.chunkIndex);\n chunkInsertReq.input('p2', chunk.data);\n await chunkInsertReq.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunkIndex, data) VALUES (@p0, @p1, @p2)`,\n );\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlinkTarget'>>(\n `SELECT type, symlinkTarget FROM ${this.#t('fs_entries')} WHERE path = @p0`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlinkTarget!;\n }\n}\n", "export function mssqlFsDDL(schema: string): string {\n return `\nIF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[${schema}].[fs_entries]') AND type = 'U')\nCREATE TABLE [${schema}].[fs_entries] (\n path NVARCHAR(900) PRIMARY KEY,\n type NVARCHAR(20) NOT NULL,\n mode INT NOT NULL,\n size BIGINT NOT NULL,\n mtime BIGINT NOT NULL,\n symlinkTarget NVARCHAR(900) NULL\n);\nGO\n\nIF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'idx_${schema}_fs_entries_type')\nCREATE INDEX [idx_${schema}_fs_entries_type] ON [${schema}].[fs_entries](type);\nGO\n\nIF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[${schema}].[fs_chunks]') AND type = 'U')\nCREATE TABLE [${schema}].[fs_chunks] (\n path NVARCHAR(900) NOT NULL,\n chunkIndex INT NOT NULL,\n data VARBINARY(MAX) NOT NULL,\n PRIMARY KEY (path, chunkIndex),\n FOREIGN KEY (path) REFERENCES [${schema}].[fs_entries](path) ON DELETE CASCADE ON UPDATE CASCADE\n);\nGO\n`;\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport type { Pool, PoolClient, PoolConfig } from 'pg';\n\nimport { postgresFsDDL } from './ddl.postgres-fs.ts';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface PostgresFsOptions {\n pool: Pool | PoolConfig | string;\n root: string;\n chunkSize?: number;\n schema?: string;\n}\n\ntype EntryType = 'file' | 'directory' | 'symlink';\n\ninterface FsEntryRow {\n path: string;\n type: EntryType;\n mode: number;\n size: number;\n mtime: number;\n symlink_target: string | null;\n [key: string]: unknown;\n}\n\ninterface ChunkRow {\n data: Buffer;\n [key: string]: unknown;\n}\n\nexport class PostgresFs implements IFileSystem {\n #pool: Pool;\n #chunkSize: number;\n #root: string;\n #schema: string;\n #ownsPool: boolean;\n #isInitialized = false;\n\n constructor(options: PostgresFsOptions) {\n this.#chunkSize = options.chunkSize ?? 1024 * 1024;\n const schema = options.schema ?? 'public';\n if (!/^[a-zA-Z_]\\w*$/.test(schema)) {\n throw new Error(`Invalid schema name: \"${schema}\"`);\n }\n this.#schema = schema;\n const normalizedRoot = this.#normalizeRoot(options.root);\n this.#root = normalizedRoot === '/' ? '' : normalizedRoot;\n\n const pg = PostgresFs.#requirePg();\n if (options.pool instanceof pg.Pool) {\n this.#pool = options.pool;\n this.#ownsPool = false;\n } else {\n this.#pool =\n typeof options.pool === 'string'\n ? new pg.Pool({ connectionString: options.pool })\n : new pg.Pool(options.pool);\n this.#ownsPool = true;\n }\n }\n\n static #requirePg(): typeof import('pg') {\n try {\n const require = createRequire(import.meta.url);\n return require('pg');\n } catch {\n throw new Error(\n 'PostgresFs requires the \"pg\" package. Install it with: npm install pg',\n );\n }\n }\n\n #t(name: string): string {\n return `\"${this.#schema}\".\"${name}\"`;\n }\n\n async initialize(): Promise<void> {\n const ddl = postgresFsDDL(this.#schema);\n await this.#pool.query(ddl);\n\n const rootSlashExists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = '/') AS exists`,\n );\n if (!rootSlashExists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ('/', 'directory', 493, 0, $1)`,\n [Date.now()],\n );\n }\n\n if (this.#root) {\n await this.#createParentDirs(this.#root);\n\n const rootExists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [this.#root],\n );\n if (!rootExists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [this.#root, Date.now()],\n );\n }\n }\n\n this.#isInitialized = true;\n }\n\n #ensureInitialized(): void {\n if (!this.#isInitialized) {\n throw new Error(\n 'PostgresFs not initialized. Call await fs.initialize() after construction.',\n );\n }\n }\n\n async #createParentDirs(p: string): Promise<void> {\n const segments = p.split('/').filter(Boolean);\n let currentPath = '/';\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath = path.posix.join(currentPath, segments[i]);\n const exists = await this.#rawQuery<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [currentPath],\n );\n\n if (!exists[0].exists) {\n await this.#rawExec(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [currentPath, Date.now()],\n );\n }\n }\n }\n\n async #rawQuery<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n const result = await this.#pool.query(sql, params);\n return result.rows as T[];\n }\n\n async #rawExec(sql: string, params?: unknown[]): Promise<number> {\n const result = await this.#pool.query(sql, params);\n return result.rowCount ?? 0;\n }\n\n async #query<T extends Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<T[]> {\n this.#ensureInitialized();\n return this.#rawQuery<T>(sql, params);\n }\n\n async #exec(sql: string, params?: unknown[]): Promise<number> {\n this.#ensureInitialized();\n return this.#rawExec(sql, params);\n }\n\n async #useTransaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T> {\n this.#ensureInitialized();\n const client = await this.#pool.connect();\n try {\n await client.query('BEGIN');\n const result = await fn(client);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n #normalizeRoot(root: string): string {\n return path.posix.resolve('/', root.trim());\n }\n\n #prefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === '/') {\n return this.#root;\n }\n return path.posix.join(this.#root, p);\n }\n\n #unprefixPath(p: string): string {\n if (!this.#root) {\n return p;\n }\n if (p === this.#root) {\n return '/';\n }\n if (p.startsWith(this.#root + '/')) {\n return p.slice(this.#root.length) || '/';\n }\n return p;\n }\n\n #normalizePath(p: string): string {\n return path.posix.resolve('/', p);\n }\n\n #dirname(p: string): string {\n const dir = path.posix.dirname(p);\n return dir === '' ? '/' : dir;\n }\n\n async #ensureParentExists(\n filePath: string,\n client: PoolClient,\n ): Promise<void> {\n const parent = this.#dirname(filePath);\n const rootPath = this.#root || '/';\n if (parent === rootPath || parent === '/') return;\n\n const result = await client.query<{ type: string }>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [parent],\n );\n const entry = result.rows[0];\n\n if (!entry) {\n await this.#ensureParentExists(parent, client);\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [parent, Date.now()],\n );\n } else if (entry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n }\n\n async #writeChunks(\n filePath: string,\n content: Uint8Array,\n client: PoolClient,\n ): Promise<void> {\n await client.query(`DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`, [\n filePath,\n ]);\n\n for (let i = 0; i < content.length; i += this.#chunkSize) {\n const chunk = content.slice(\n i,\n Math.min(i + this.#chunkSize, content.length),\n );\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [filePath, Math.floor(i / this.#chunkSize), Buffer.from(chunk)],\n );\n }\n }\n\n async #readChunks(\n filePath: string,\n client?: PoolClient,\n ): Promise<Uint8Array> {\n let rows: ChunkRow[];\n if (client) {\n const result = await client.query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = $1 ORDER BY chunk_index`,\n [filePath],\n );\n rows = result.rows as ChunkRow[];\n } else {\n rows = await this.#query<ChunkRow>(\n `SELECT data FROM ${this.#t('fs_chunks')} WHERE path = $1 ORDER BY chunk_index`,\n [filePath],\n );\n }\n\n if (rows.length === 0) {\n return new Uint8Array(0);\n }\n\n const totalSize = rows.reduce((sum, row) => sum + row.data.length, 0);\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n for (const row of rows) {\n result.set(new Uint8Array(row.data), offset);\n offset += row.data.length;\n }\n\n return result;\n }\n\n async #resolveSymlink(p: string, seen = new Set<string>()): Promise<string> {\n if (seen.has(p)) {\n throw new Error(`readFile: circular symlink: ${p}`);\n }\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlink_target'>>(\n `SELECT type, symlink_target FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [p],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${p}`);\n }\n\n if (entry.type !== 'symlink') {\n return p;\n }\n\n seen.add(p);\n const target = this.#normalizePath(\n path.posix.resolve(this.#dirname(p), entry.symlink_target!),\n );\n return this.#resolveSymlink(target, seen);\n }\n\n #toUint8Array(content: FileContent, encoding?: string): Uint8Array {\n if (content instanceof Uint8Array) {\n return content;\n }\n const enc = (encoding ?? 'utf8') as BufferEncoding;\n return new Uint8Array(Buffer.from(content, enc));\n }\n\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.end();\n }\n }\n\n // ============================================================================\n // IFileSystem Implementation\n // ============================================================================\n\n async readFile(\n filePath: string,\n options?: ReadFileOptions | string,\n ): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n const content = await this.#readChunks(resolved);\n const encoding =\n typeof options === 'string' ? options : (options?.encoding ?? 'utf8');\n return Buffer.from(content).toString(encoding as BufferEncoding);\n }\n\n async readFileBuffer(filePath: string): Promise<Uint8Array> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n if (entry.type === 'directory') {\n throw new Error(`EISDIR: illegal operation on a directory: ${filePath}`);\n }\n\n return this.#readChunks(resolved);\n }\n\n async writeFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const data = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', 420, $2, $3)\n ON CONFLICT (path) DO UPDATE SET type = 'file', size = EXCLUDED.size, mtime = EXCLUDED.mtime`,\n [prefixed, data.length, Date.now()],\n );\n\n await this.#writeChunks(prefixed, data, client);\n });\n }\n\n async appendFile(\n filePath: string,\n content: FileContent,\n options?: WriteFileOptions | string,\n ): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const newData = this.#toUint8Array(content, encoding);\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n const result = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = result.rows[0];\n\n if (entry && entry.type !== 'file') {\n throw new Error(`appendFile: not a file: ${filePath}`);\n }\n\n const existing = entry\n ? await this.#readChunks(prefixed, client)\n : new Uint8Array(0);\n const combined = new Uint8Array(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', 420, $2, $3)\n ON CONFLICT (path) DO UPDATE SET size = EXCLUDED.size, mtime = EXCLUDED.mtime`,\n [prefixed, combined.length, Date.now()],\n );\n\n await this.#writeChunks(prefixed, combined, client);\n });\n }\n\n async exists(filePath: string): Promise<boolean> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const rows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [prefixed],\n );\n return rows[0].exists;\n }\n\n async stat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: false,\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async lstat(filePath: string): Promise<FsStat> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return {\n isFile: entry.type === 'file',\n isDirectory: entry.type === 'directory',\n isSymbolicLink: entry.type === 'symlink',\n mode: Number(entry.mode),\n size: Number(entry.size),\n mtime: new Date(Number(entry.mtime)),\n };\n }\n\n async mkdir(dirPath: string, options?: MkdirOptions): Promise<void> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const existing = existingRows[0];\n\n if (existing) {\n if (options?.recursive) {\n return;\n }\n throw new Error(`EEXIST: file already exists: ${dirPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n if (options?.recursive) {\n const rootPath = this.#root || '/';\n const relativePath = path.posix.relative(rootPath, prefixed);\n const segments = relativePath.split('/').filter(Boolean);\n let currentPath = rootPath;\n\n for (const segment of segments) {\n currentPath = path.posix.join(currentPath, segment);\n const result = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [currentPath],\n );\n const exists = result.rows[0];\n\n if (!exists) {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [currentPath, Date.now()],\n );\n } else if (exists.type !== 'directory') {\n throw new Error(`mkdir: not a directory: ${currentPath}`);\n }\n }\n } else {\n const parent = this.#dirname(prefixed);\n const parentResult = await client.query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [parent],\n );\n const parentEntry = parentResult.rows[0];\n\n if (!parentEntry) {\n throw new Error(`mkdir: parent does not exist: ${parent}`);\n }\n if (parentEntry.type !== 'directory') {\n throw new Error(`mkdir: parent is not a directory: ${parent}`);\n }\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime) VALUES ($1, 'directory', 493, 0, $2)`,\n [prefixed, Date.now()],\n );\n }\n });\n }\n\n async readdir(dirPath: string): Promise<string[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<{ path: string }>(\n `SELECT path FROM ${this.#t('fs_entries')}\n WHERE path LIKE $1 || '%'\n AND path != $2\n AND path NOT LIKE $1 || '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => path.posix.basename(row.path));\n }\n\n async readdirWithFileTypes(dirPath: string): Promise<DirentEntry[]> {\n const normalized = this.#normalizePath(dirPath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const entryRows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [resolved],\n );\n const entry = entryRows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${dirPath}`);\n }\n if (entry.type !== 'directory') {\n throw new Error(`ENOTDIR: not a directory: ${dirPath}`);\n }\n\n const prefix = resolved === '/' ? '/' : resolved + '/';\n const rows = await this.#query<Pick<FsEntryRow, 'path' | 'type'>>(\n `SELECT path, type FROM ${this.#t('fs_entries')}\n WHERE path LIKE $1 || '%'\n AND path != $2\n AND path NOT LIKE $1 || '%/%'`,\n [prefix, resolved],\n );\n\n return rows.map((row) => ({\n name: path.posix.basename(row.path),\n isFile: row.type === 'file',\n isDirectory: row.type === 'directory',\n isSymbolicLink: row.type === 'symlink',\n }));\n }\n\n async rm(filePath: string, options?: RmOptions): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type'>>(\n `SELECT type FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n if (options?.force) {\n return;\n }\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n await this.#useTransaction(async (client) => {\n if (entry.type === 'directory') {\n const childrenResult = await client.query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path LIKE $1 || '/%') AS exists`,\n [prefixed],\n );\n\n if (childrenResult.rows[0].exists && !options?.recursive) {\n throw new Error(`ENOTEMPTY: directory not empty: ${filePath}`);\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [prefixed],\n );\n } else {\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n }\n });\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n if (srcEntry.type === 'directory' && !options?.recursive) {\n throw new Error(`cp: -r not specified; omitting directory: ${src}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n if (srcEntry.type === 'directory') {\n const allEntriesResult = await client.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [srcPrefixed],\n );\n\n for (const entry of allEntriesResult.rows) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlink_target,\n ],\n );\n\n if (entry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [newPath],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [entry.path],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [newPath, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n } else {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlink_target,\n ],\n );\n\n if (srcEntry.type === 'file') {\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [destPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n });\n }\n\n async mv(src: string, dest: string): Promise<void> {\n const srcNormalized = this.#normalizePath(src);\n const destNormalized = this.#normalizePath(dest);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${src}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n if (srcEntry.type === 'directory') {\n const allEntriesResult = await client.query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%' ORDER BY path DESC`,\n [srcPrefixed],\n );\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [destPrefixed],\n );\n\n for (const entry of [...allEntriesResult.rows].reverse()) {\n const relativePath = path.posix.relative(srcPrefixed, entry.path);\n const newPath = path.posix.join(destPrefixed, relativePath);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n newPath,\n entry.type,\n entry.mode,\n entry.size,\n Date.now(),\n entry.symlink_target,\n ],\n );\n\n if (entry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [newPath],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [entry.path],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [newPath, chunk.chunk_index, chunk.data],\n );\n }\n }\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1 OR path LIKE $1 || '/%'`,\n [srcPrefixed],\n );\n } else {\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (path) DO UPDATE SET type = EXCLUDED.type, mode = EXCLUDED.mode, size = EXCLUDED.size, mtime = EXCLUDED.mtime, symlink_target = EXCLUDED.symlink_target`,\n [\n destPrefixed,\n srcEntry.type,\n srcEntry.mode,\n srcEntry.size,\n Date.now(),\n srcEntry.symlink_target,\n ],\n );\n\n if (srcEntry.type === 'file') {\n await client.query(\n `DELETE FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [destPrefixed],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n }\n\n await client.query(\n `DELETE FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n }\n });\n }\n\n resolvePath(base: string, relativePath: string): string {\n return path.posix.resolve(base, relativePath);\n }\n\n getAllPaths(): string[] {\n throw new Error(\n 'getAllPaths() is not supported in PostgresFs - use getAllPathsAsync() instead',\n );\n }\n\n async getAllPathsAsync(): Promise<string[]> {\n const rows = await this.#query<{ path: string; [key: string]: unknown }>(\n `SELECT path FROM ${this.#t('fs_entries')} ORDER BY path`,\n );\n return rows.map((row) => row.path);\n }\n\n async realpath(filePath: string): Promise<string> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const rows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [resolved],\n );\n if (!rows[0].exists) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n\n return this.#unprefixPath(resolved);\n }\n\n async utimes(filePath: string, _atime: Date, mtime: Date): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n const resolved = await this.#resolveSymlink(prefixed);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mtime = $1 WHERE path = $2`,\n [mtime.getTime(), resolved],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async chmod(filePath: string, mode: number): Promise<void> {\n const normalized = this.#normalizePath(filePath);\n const prefixed = this.#prefixPath(normalized);\n\n const result = await this.#exec(\n `UPDATE ${this.#t('fs_entries')} SET mode = $1 WHERE path = $2`,\n [mode, prefixed],\n );\n\n if (result === 0) {\n throw new Error(`ENOENT: no such file or directory: ${filePath}`);\n }\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const existingRows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [prefixed],\n );\n if (existingRows[0].exists) {\n throw new Error(`EEXIST: file already exists: ${linkPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(prefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime, symlink_target)\n VALUES ($1, 'symlink', 511, 0, $2, $3)`,\n [prefixed, Date.now(), target],\n );\n });\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n const srcNormalized = this.#normalizePath(existingPath);\n const destNormalized = this.#normalizePath(newPath);\n const srcPrefixed = this.#prefixPath(srcNormalized);\n const destPrefixed = this.#prefixPath(destNormalized);\n\n const srcRows = await this.#query<FsEntryRow>(\n `SELECT * FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [srcPrefixed],\n );\n const srcEntry = srcRows[0];\n\n if (!srcEntry) {\n throw new Error(`ENOENT: no such file or directory: ${existingPath}`);\n }\n\n if (srcEntry.type !== 'file') {\n throw new Error(`link: not supported for directories: ${existingPath}`);\n }\n\n const existingRows = await this.#query<{ exists: boolean }>(\n `SELECT EXISTS(SELECT 1 FROM ${this.#t('fs_entries')} WHERE path = $1) AS exists`,\n [destPrefixed],\n );\n if (existingRows[0].exists) {\n throw new Error(`EEXIST: file already exists: ${newPath}`);\n }\n\n await this.#useTransaction(async (client) => {\n await this.#ensureParentExists(destPrefixed, client);\n\n await client.query(\n `INSERT INTO ${this.#t('fs_entries')} (path, type, mode, size, mtime)\n VALUES ($1, 'file', $2, $3, $4)`,\n [destPrefixed, srcEntry.mode, srcEntry.size, Date.now()],\n );\n\n const chunksResult = await client.query<{\n chunk_index: number;\n data: Buffer;\n }>(\n `SELECT chunk_index, data FROM ${this.#t('fs_chunks')} WHERE path = $1`,\n [srcPrefixed],\n );\n\n for (const chunk of chunksResult.rows) {\n await client.query(\n `INSERT INTO ${this.#t('fs_chunks')} (path, chunk_index, data) VALUES ($1, $2, $3)`,\n [destPrefixed, chunk.chunk_index, chunk.data],\n );\n }\n });\n }\n\n async readlink(linkPath: string): Promise<string> {\n const normalized = this.#normalizePath(linkPath);\n const prefixed = this.#prefixPath(normalized);\n\n const rows = await this.#query<Pick<FsEntryRow, 'type' | 'symlink_target'>>(\n `SELECT type, symlink_target FROM ${this.#t('fs_entries')} WHERE path = $1`,\n [prefixed],\n );\n const entry = rows[0];\n\n if (!entry) {\n throw new Error(`ENOENT: no such file or directory: ${linkPath}`);\n }\n\n if (entry.type !== 'symlink') {\n throw new Error(`readlink: not a symbolic link: ${linkPath}`);\n }\n\n return entry.symlink_target!;\n }\n}\n", "export function postgresFsDDL(schema: string): string {\n return `\nCREATE SCHEMA IF NOT EXISTS \"${schema}\";\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".\"fs_entries\" (\n path TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n mode INTEGER NOT NULL,\n size BIGINT NOT NULL,\n mtime BIGINT NOT NULL,\n symlink_target TEXT\n);\n\nCREATE INDEX IF NOT EXISTS \"idx_${schema}_fs_entries_type\" ON \"${schema}\".\"fs_entries\"(type);\n\nCREATE TABLE IF NOT EXISTS \"${schema}\".\"fs_chunks\" (\n path TEXT NOT NULL,\n chunk_index INTEGER NOT NULL,\n data BYTEA NOT NULL,\n PRIMARY KEY (path, chunk_index),\n FOREIGN KEY (path) REFERENCES \"${schema}\".\"fs_entries\"(path) ON DELETE CASCADE ON UPDATE CASCADE\n);\n`;\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\n\ntype BufferEncoding = 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex' | 'binary';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface ScopedFsOptions {\n base: IFileSystem;\n prefix: string;\n}\n\n/**\n * Filesystem wrapper that prefixes all paths with a given prefix.\n * Enables chat-level isolation without modifying command logic.\n *\n * @example\n * const scopedFs = new ScopedFs({\n * base: fs,\n * prefix: '/chat-123',\n * });\n */\nexport class ScopedFs implements IFileSystem {\n #base: IFileSystem;\n #prefix: string;\n\n constructor(options: ScopedFsOptions) {\n this.#base = options.base;\n this.#prefix = options.prefix.replace(/\\/$/, '');\n }\n\n #scope(path: string): string {\n return `${this.#prefix}${path}`;\n }\n\n #unscope(path: string): string {\n if (path === this.#prefix) {\n return '/';\n }\n if (path.startsWith(this.#prefix + '/')) {\n return path.slice(this.#prefix.length) || '/';\n }\n return path;\n }\n\n async writeFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.writeFile(this.#scope(path), content, options);\n }\n\n async appendFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.appendFile(this.#scope(path), content, options);\n }\n\n async mkdir(path: string, options?: MkdirOptions): Promise<void> {\n return this.#base.mkdir(this.#scope(path), options);\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n await this.#base.rm(this.#scope(path), options);\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n await this.#base.cp(this.#scope(src), this.#scope(dest), options);\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.#base.mv(this.#scope(src), this.#scope(dest));\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n return this.#base.chmod(this.#scope(path), mode);\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n await this.#base.symlink(target, this.#scope(linkPath));\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n await this.#base.link(this.#scope(existingPath), this.#scope(newPath));\n }\n\n readFile(\n path: string,\n options?: ReadFileOptions | BufferEncoding,\n ): Promise<string> {\n return this.#base.readFile(this.#scope(path), options);\n }\n\n readFileBuffer(path: string): Promise<Uint8Array> {\n return this.#base.readFileBuffer(this.#scope(path));\n }\n\n stat(path: string): Promise<FsStat> {\n return this.#base.stat(this.#scope(path));\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.#base.lstat(this.#scope(path));\n }\n\n readdir(path: string): Promise<string[]> {\n return this.#base.readdir(this.#scope(path));\n }\n\n readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n return this.#base.readdirWithFileTypes!(this.#scope(path));\n }\n\n exists(path: string): Promise<boolean> {\n return this.#base.exists(this.#scope(path));\n }\n\n readlink(path: string): Promise<string> {\n return this.#base.readlink(this.#scope(path));\n }\n\n realpath(path: string): Promise<string> {\n return this.#base.realpath(this.#scope(path)).then((p) => this.#unscope(p));\n }\n\n utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n return this.#base.utimes(this.#scope(path), atime, mtime);\n }\n\n resolvePath(base: string, relativePath: string): string {\n return this.#base.resolvePath(base, relativePath);\n }\n\n getAllPaths(): string[] {\n const allPaths = this.#base.getAllPaths?.() ?? [];\n return allPaths\n .filter((p) => p.startsWith(this.#prefix))\n .map((p) => p.slice(this.#prefix.length) || '/');\n }\n}\n", "import type {\n CpOptions,\n FileContent,\n FsStat,\n IFileSystem,\n MkdirOptions,\n RmOptions,\n} from 'just-bash';\n\ntype BufferEncoding = 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex' | 'binary';\n\ninterface ReadFileOptions {\n encoding?: BufferEncoding | null;\n}\n\ninterface WriteFileOptions {\n encoding?: BufferEncoding;\n}\n\ninterface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport class TrackedFs implements IFileSystem {\n #base: IFileSystem;\n #createdFiles: Set<string> = new Set();\n\n constructor(base: IFileSystem) {\n this.#base = base;\n }\n\n getCreatedFiles(): string[] {\n return [...this.#createdFiles];\n }\n\n async writeFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.writeFile(path, content, options);\n this.#createdFiles.add(path);\n }\n\n async appendFile(\n path: string,\n content: FileContent,\n options?: WriteFileOptions | BufferEncoding,\n ): Promise<void> {\n await this.#base.appendFile(path, content, options);\n this.#createdFiles.add(path);\n }\n\n async mkdir(path: string, options?: MkdirOptions): Promise<void> {\n return this.#base.mkdir(path, options);\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n await this.#base.rm(path, options);\n this.#createdFiles.delete(path);\n\n if (options?.recursive) {\n const prefix = path.endsWith('/') ? path : path + '/';\n for (const file of this.#createdFiles) {\n if (file.startsWith(prefix)) {\n this.#createdFiles.delete(file);\n }\n }\n }\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n await this.#base.cp(src, dest, options);\n this.#createdFiles.add(dest);\n }\n\n async mv(src: string, dest: string): Promise<void> {\n await this.#base.mv(src, dest);\n this.#createdFiles.delete(src);\n this.#createdFiles.add(dest);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n return this.#base.chmod(path, mode);\n }\n\n async symlink(target: string, linkPath: string): Promise<void> {\n await this.#base.symlink(target, linkPath);\n this.#createdFiles.add(linkPath);\n }\n\n async link(existingPath: string, newPath: string): Promise<void> {\n await this.#base.link(existingPath, newPath);\n this.#createdFiles.add(newPath);\n }\n\n readFile(\n path: string,\n options?: ReadFileOptions | BufferEncoding,\n ): Promise<string> {\n return this.#base.readFile(path, options);\n }\n\n readFileBuffer(path: string): Promise<Uint8Array> {\n return this.#base.readFileBuffer(path);\n }\n\n stat(path: string): Promise<FsStat> {\n return this.#base.stat(path);\n }\n\n lstat(path: string): Promise<FsStat> {\n return this.#base.lstat(path);\n }\n\n readdir(path: string): Promise<string[]> {\n return this.#base.readdir(path);\n }\n\n readdirWithFileTypes(path: string): Promise<DirentEntry[]> {\n return this.#base.readdirWithFileTypes!(path);\n }\n\n exists(path: string): Promise<boolean> {\n return this.#base.exists(path);\n }\n\n readlink(path: string): Promise<string> {\n return this.#base.readlink(path);\n }\n\n resolvePath(base: string, relativePath: string): string {\n return this.#base.resolvePath(base, relativePath);\n }\n\n getAllPaths(): string[] {\n return this.#base.getAllPaths?.() ?? [];\n }\n realpath(path: string): Promise<string> {\n return this.#base.realpath(path);\n }\n utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n return this.#base.utimes(path, atime, mtime);\n }\n}\n", "import {\n type ContextFragment,\n clarification,\n example,\n explain,\n fragment,\n guardrail,\n hint,\n policy,\n principle,\n quirk,\n role,\n styleGuide,\n workflow,\n} from '@deepagents/context';\n\nexport interface TeachingsOptions {\n /**\n * Controls date/time clarification behavior:\n * - 'strict': Ask for clarification when date range is missing (production default)\n * - false: Skip date clarifications, assume all matching data (useful for evals/benchmarks)\n */\n date?: 'strict' | false;\n}\n\n/**\n * Meta-cognitive reasoning framework based on advanced prompt engineering.\n * Verbatim from prompt.md with hierarchical structure preserved.\n */\nfunction reasoningFramework(): ContextFragment[] {\n return [\n role(\n 'You are a very strong reasoner and planner. Use these critical instructions to structure your plans, thoughts, and responses.',\n ),\n\n fragment(\n 'meta-cognitive-reasoning-framework',\n hint(\n 'Before taking any action (either tool calls *or* responses to the user), you must proactively, methodically, and independently plan and reason about:',\n ),\n\n // 1) Logical dependencies and constraints\n principle({\n title: 'Logical dependencies and constraints',\n description:\n 'Analyze the intended action against the following factors. Resolve conflicts in order of importance:',\n policies: [\n policy({\n rule: 'Policy-based rules, mandatory prerequisites, and constraints.',\n }),\n policy({\n rule: 'Order of operations: Ensure taking an action does not prevent a subsequent necessary action.',\n policies: [\n 'The user may request actions in a random order, but you may need to reorder operations to maximize successful completion of the task.',\n ],\n }),\n policy({\n rule: 'Other prerequisites (information and/or actions needed).',\n }),\n policy({ rule: 'Explicit user constraints or preferences.' }),\n ],\n }),\n\n // 2) Risk assessment\n principle({\n title: 'Risk assessment',\n description:\n 'What are the consequences of taking the action? Will the new state cause any future issues?',\n policies: [\n 'For exploratory tasks (like searches), missing *optional* parameters is a LOW risk. **Prefer calling the tool with the available information over asking the user, unless** your Rule 1 (Logical Dependencies) reasoning determines that optional information is required for a later step in your plan.',\n ],\n }),\n\n // 3) Abductive reasoning and hypothesis exploration\n principle({\n title: 'Abductive reasoning and hypothesis exploration',\n description:\n 'At each step, identify the most logical and likely reason for any problem encountered.',\n policies: [\n 'Look beyond immediate or obvious causes. The most likely reason may not be the simplest and may require deeper inference.',\n 'Hypotheses may require additional research. Each hypothesis may take multiple steps to test.',\n 'Prioritize hypotheses based on likelihood, but do not discard less likely ones prematurely. A low-probability event may still be the root cause.',\n ],\n }),\n\n // 4) Outcome evaluation and adaptability\n principle({\n title: 'Outcome evaluation and adaptability',\n description:\n 'Does the previous observation require any changes to your plan?',\n policies: [\n 'If your initial hypotheses are disproven, actively generate new ones based on the gathered information.',\n ],\n }),\n\n // 5) Information availability\n principle({\n title: 'Information availability',\n description:\n 'Incorporate all applicable and alternative sources of information, including:',\n policies: [\n 'Using available tools and their capabilities',\n 'All policies, rules, checklists, and constraints',\n 'Previous observations and conversation history',\n 'Information only available by asking the user',\n ],\n }),\n\n // 6) Precision and Grounding\n principle({\n title: 'Precision and Grounding',\n description:\n 'Ensure your reasoning is extremely precise and relevant to each exact ongoing situation.',\n policies: [\n 'Verify your claims by quoting the exact applicable information (including policies) when referring to them.',\n ],\n }),\n\n // 7) Completeness\n principle({\n title: 'Completeness',\n description:\n 'Ensure that all requirements, constraints, options, and preferences are exhaustively incorporated into your plan.',\n policies: [\n policy({\n rule: 'Resolve conflicts using the order of importance in #1.',\n }),\n policy({\n rule: 'Avoid premature conclusions: There may be multiple relevant options for a given situation.',\n policies: [\n 'To check for whether an option is relevant, reason about all information sources from #5.',\n 'You may need to consult the user to even know whether something is applicable. Do not assume it is not applicable without checking.',\n ],\n }),\n policy({\n rule: 'Review applicable sources of information from #5 to confirm which are relevant to the current state.',\n }),\n ],\n }),\n\n // 8) Persistence and patience\n principle({\n title: 'Persistence and patience',\n description:\n 'Do not give up unless all the reasoning above is exhausted.',\n policies: [\n \"Don't be dissuaded by time taken or user frustration.\",\n 'This persistence must be intelligent: On *transient* errors (e.g. please try again), you *must* retry **unless an explicit retry limit (e.g., max x tries) has been reached**. If such a limit is hit, you *must* stop. On *other* errors, you must change your strategy or arguments, not repeat the same failed call.',\n ],\n }),\n\n // 9) Inhibit your response\n principle({\n title: 'Inhibit your response',\n description:\n \"Only take an action after all the above reasoning is completed. Once you've taken an action, you cannot take it back.\",\n }),\n\n principle({\n title: 'Continuous self-monitoring',\n description:\n 'Constantly evaluate your own reasoning process for any gaps, biases, or errors. Apply the above principles iteratively as needed.',\n }),\n ),\n ];\n}\n\nexport function guidelines(options: TeachingsOptions = {}): ContextFragment[] {\n const { date = 'strict' } = options;\n\n const baseTeachings: ContextFragment[] = [\n // Include the meta-cognitive reasoning framework\n ...reasoningFramework(),\n\n // Prerequisite policies (must do X before Y)\n fragment(\n 'prerequisite_policies',\n policy({\n rule: 'YOU MUST inspect schema structure and available tables',\n before: 'generating ANY SQL query',\n reason:\n 'NEVER generate SQL without knowing valid tables, columns, and relationships',\n }),\n policy({\n rule: 'YOU MUST resolve ambiguous business terms with the user',\n before: 'making ANY assumptions about terminology meaning',\n reason: 'NEVER guess domain-specific language\u2014ask for clarification',\n }),\n policy({\n rule: 'YOU MUST validate SQL syntax',\n before: 'executing ANY query against the database',\n reason: 'NEVER execute unvalidated queries',\n }),\n policy({\n rule: 'YOU MUST complete ALL reasoning steps',\n before: 'taking ANY tool call or response action',\n reason: 'Once an action is taken, it CANNOT be undone. NO EXCEPTIONS.',\n }),\n ),\n\n // Few-shot: Applying reasoning principles\n fragment(\n 'reasoning-examples',\n example({\n question: 'Show me sales last month',\n answer: `Applying Principle 1 (Logical dependencies):\n- Need: schema to know which table has sales data\n- Need: clarify \"last month\" = calendar month or rolling 30 days?\n\nApplying Principle 5 (Information availability):\n- Schema shows: orders table with created_at, total columns\n- Missing: user's definition of \"last month\"\n\nAction: Ask user for date range clarification BEFORE generating SQL.`,\n }),\n example({\n question: 'Why did my query return no results?',\n answer: `Applying Principle 3 (Abductive reasoning):\n- Hypothesis 1 (most likely): Filter too restrictive\n- Hypothesis 2: Data doesn't exist for that period\n- Hypothesis 3: JOIN eliminated matching rows\n\nTesting hypotheses:\n1. Remove filters one by one to isolate the issue\n2. Check date range actually has data\n3. Run subqueries separately to verify each table\n\nAction: Start with most likely hypothesis, test incrementally. NEVER guess.`,\n }),\n example({\n question: 'Get me the top customers',\n answer: `Applying Principle 1 (Logical dependencies):\n- \"Top\" is ambiguous\u2014by revenue? by order count? by recency?\n\nApplying Principle 9 (Inhibition):\n- MUST NOT generate SQL until \"top\" is defined\n\nAction: Ask user: \"Top by what metric\u2014total revenue, number of orders, or most recent activity?\"`,\n }),\n ),\n\n // Schema adherence - consolidated into clear rules\n fragment(\n 'schema_adherence',\n hint(\n 'Use only tables and columns from the schema. For unspecified columns, use SELECT *. When showing related items, include IDs and requested details.',\n ),\n hint(\n '\"Show\" means list items; \"count\" or \"total\" means aggregate. Use canonical values verbatim for filtering.',\n ),\n ),\n\n fragment(\n 'Column statistics',\n explain({\n concept: 'nDistinct in column stats',\n explanation:\n 'Positive values are the estimated count of distinct values. Negative values represent the fraction of unique rows (e.g., -1 means all rows are unique, -0.5 means 50% unique)',\n therefore:\n 'Use nDistinct to decide if GROUP BY is meaningful, if a column is a good filter candidate, or if COUNT(DISTINCT) will be expensive',\n }),\n explain({\n concept: 'correlation in column stats',\n explanation:\n 'Measures how closely the physical row order matches the logical sort order of the column. Values near 1 or -1 mean the data is well-ordered; near 0 means scattered',\n therefore:\n 'High correlation means range queries (BETWEEN, >, <) on that column benefit from index scans. Low correlation means the index is less effective for ranges',\n }),\n hint(\n 'When min/max stats are available, use them to validate filter values. If a user asks for values outside the known range, warn them the query may return no results.',\n ),\n ),\n\n // Joins - use relationship metadata\n hint(\n 'Use JOINs based on schema relationships. Favor PK/indexed columns; follow relationship metadata for direction and cardinality.',\n ),\n\n // Aggregations - explain the concepts\n fragment(\n 'Aggregations',\n hint(\n 'Apply COUNT, SUM, AVG when the question implies summarization. Use window functions for ranking, running totals, or row comparisons.',\n ),\n explain({\n concept: 'counting variety vs counting rows',\n explanation:\n '\"How many types/categories/statuses exist?\" asks about variety (unique values), not total row count',\n therefore: 'Use COUNT(DISTINCT column) for variety questions',\n }),\n ),\n\n // Query semantics - explain concepts and document quirks\n fragment(\n 'Query interpretation',\n explain({\n concept: 'threshold language',\n explanation:\n 'Words like \"reach\", \"hit\", \"exceed\" with a value imply a threshold being met or passed',\n therefore:\n 'Translate to >= (greater than or equal), not = (exact match)',\n }),\n quirk({\n issue:\n 'Contradictory WHERE conditions (e.g., value > 100 AND value < 50) return empty results',\n workaround:\n 'Use INTERSECT between separate queries when finding items \"shared by\" groups with mutually exclusive conditions',\n }),\n quirk({\n issue:\n 'NULL values behave unexpectedly in comparisons and aggregations',\n workaround:\n 'Use IS NULL, IS NOT NULL, or COALESCE() to handle NULLs explicitly',\n }),\n hint(\n 'Always include mentioned filters from joined tables in WHERE conditions.',\n ),\n ),\n\n // Style preferences\n styleGuide({\n prefer:\n 'Full table names as aliases (users AS users). Descriptive column aliases (COUNT(*) AS total_count).',\n never:\n 'Abbreviated aliases (u, oi) or positional aliases (t1, t2, a, b).',\n }),\n styleGuide({\n prefer:\n 'Concise, business-friendly summaries with key comparisons and helpful follow-ups.',\n }),\n\n // Safety guardrails - consolidated\n fragment(\n 'Query safety',\n guardrail({\n rule: 'Generate only valid, executable SELECT/WITH statements.',\n reason: 'Read-only access prevents data modification.',\n action:\n 'Never generate INSERT, UPDATE, DELETE, DROP, or DDL statements.',\n }),\n guardrail({\n rule: 'Avoid unbounded scans and cartesian joins.',\n reason: 'Protects performance and correctness.',\n action:\n 'Apply filters on indexed columns. If join keys are unclear, ask for clarification.',\n }),\n guardrail({\n rule: 'Preserve query semantics.',\n reason: 'Arbitrary modifications change results.',\n action:\n 'Only add LIMIT for explicit \"top N\" requests. Add ORDER BY for deterministic results.',\n }),\n guardrail({\n rule: 'Seek clarification for genuine ambiguity.',\n reason: 'Prevents incorrect assumptions.',\n action: 'Ask a focused question before guessing.',\n }),\n ),\n\n clarification({\n when: 'Ambiguous ranking language (top, best, active) without a metric.',\n ask: 'Clarify the ranking metric or definition.',\n reason: 'Ensures correct aggregation and ordering.',\n }),\n\n hint(\n 'Use sample cell values from schema hints to match exact casing and format in WHERE conditions (e.g., \"Male\" vs \"male\" vs \"M\").',\n ),\n\n workflow({\n task: 'SQL generation',\n steps: [\n 'Schema linking: identify which tables and columns are mentioned or implied by the question.',\n 'Check if column names match question terms (e.g., Total_X). Select directly if match found.',\n 'Identify SQL patterns needed: aggregation, segmentation, time range, ranking.',\n 'Select tables and relationships. Note lookup tables and filter values from schema.',\n 'Plan join/filter/aggregation order based on table sizes and indexes.',\n 'Generate SQL that answers the question.',\n 'Verify: mentally translate SQL back to natural language. Does it match the original question?',\n ],\n }),\n\n workflow({\n task: 'Error recovery',\n triggers: ['SQL error', 'query failed', 'execution error'],\n steps: [\n 'Classify the error type: syntax error, missing join, wrong aggregation, invalid column, type mismatch.',\n 'For syntax errors: check SQL keywords, quotes, parentheses balance.',\n 'For missing join: identify unlinked tables and add appropriate JOIN clause.',\n 'For wrong aggregation: verify GROUP BY includes all non-aggregated SELECT columns.',\n 'For invalid column: re-check schema for correct column name and table.',\n 'Apply targeted fix based on error classification. Avoid blind regeneration.',\n ],\n notes:\n 'Maximum 3 retry attempts. If still failing, explain the issue to the user.',\n }),\n\n workflow({\n task: 'Complex query decomposition',\n triggers: [\n 'multiple conditions',\n 'nested requirements',\n 'compare across',\n 'for each',\n ],\n steps: [\n 'Identify if question has multiple independent parts or nested dependencies.',\n 'For independent parts: break into sub-questions, solve each, then combine with UNION or JOIN.',\n 'For nested dependencies: solve inner requirement first, use result in outer query (subquery or CTE).',\n 'For comparisons across groups: use window functions or self-joins.',\n 'Combine sub-results into final answer. Verify completeness.',\n ],\n notes:\n 'Complex questions often need CTEs (WITH clauses) for clarity and reusability.',\n }),\n\n workflow({\n task: 'Multi-turn context',\n triggers: ['follow-up', 'and also', 'what about', 'same but', 'instead'],\n steps: [\n 'Identify references to previous context: \"it\", \"that\", \"those\", \"the same\".',\n 'Resolve references using conversation history: which tables, filters, or results were mentioned.',\n 'For refinements (\"but only X\"): add filter to previous query.',\n 'For extensions (\"and also Y\"): expand SELECT or add JOIN.',\n 'For pivots (\"what about Z instead\"): replace the changed element, keep unchanged parts.',\n 'Maintain consistency with previous query structure when possible.',\n ],\n notes:\n 'If reference is ambiguous, ask which previous result or entity the user means.',\n }),\n fragment(\n 'Bash tool usage',\n workflow({\n task: 'Query execution',\n steps: [\n 'Execute SQL through bash tool: sql run \"SELECT ...\"',\n 'Read the output: file path, column names, and row count.',\n \"Use column names to construct jq filters: cat <path> | jq '.[] | {col1, col2}'\",\n \"For large results, slice first: cat <path> | jq '.[:10]'\",\n ],\n }),\n hint(\n `You cannot access sql through a tool, it'll fail so the proper way to access it is through the bash tool using \"sql run\" and \"sql validate\" commands.`,\n ),\n hint(\n 'The sql command outputs: file path, column names (comma-separated), and row count. Use column names to construct precise jq queries.',\n ),\n hint(\n 'This is virtual bash environment and \"sql\" commands proxy to the database hence you cannot access sql files directly.',\n ),\n hint(\n 'If a query fails, the sql command returns an error message in stderr.',\n ),\n ),\n ];\n\n // Date-specific clarifications (only when strict)\n if (date === 'strict') {\n baseTeachings.push(\n clarification({\n when: 'The request targets time-based data without a date range.',\n ask: 'Confirm the intended timeframe (e.g., last 30/90 days, YTD, specific year).',\n reason: 'Prevents large scans and irrelevant results.',\n }),\n );\n } else {\n // When date is false, assume all matching data without asking\n baseTeachings.push(\n hint(\n 'When a month, day, or time period is mentioned without a year (e.g., \"in August\", \"on Monday\"), assume ALL occurrences of that period in the data. Do not ask for year clarification.',\n ),\n );\n }\n\n return baseTeachings;\n}\n", "import {\n APICallError,\n InvalidToolInputError,\n NoSuchToolError,\n type StreamTextTransform,\n type Tool,\n ToolCallRepairError,\n type ToolSet,\n createUIMessageStream,\n generateId,\n} from 'ai';\nimport { type IFileSystem } from 'just-bash';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n type ChatMessage,\n ContextEngine,\n type ContextFragment,\n agent,\n assistant,\n chatMessageToUIMessage,\n errorRecoveryGuardrail,\n toMessageFragment,\n} from '@deepagents/context';\n\nimport type { Adapter } from './adapters/adapter.ts';\nimport { createResultTools } from './agents/result-tools.ts';\nimport { toSql } from './agents/sql.agent.ts';\nimport { JsonCache } from './file-cache.ts';\nimport { TrackedFs } from './fs/tracked-fs.ts';\nimport { type TeachingsOptions, guidelines } from './instructions.ts';\nimport { type ExtractedPair, type PairProducer } from './synthesis/types.ts';\n\nexport type RenderingTools = Record<string, Tool<unknown, never>>;\n\nexport class Text2Sql {\n #config: {\n model: AgentModel;\n adapter: Adapter;\n context: (...fragments: ContextFragment[]) => ContextEngine;\n tools?: RenderingTools;\n introspection: JsonCache<ContextFragment[]>;\n teachingsOptions?: TeachingsOptions;\n transform?: StreamTextTransform<ToolSet> | StreamTextTransform<ToolSet>[];\n filesystem: IFileSystem;\n };\n\n constructor(config: {\n adapter: Adapter;\n context: (...fragments: ContextFragment[]) => ContextEngine;\n version: string;\n tools?: RenderingTools;\n model: AgentModel;\n transform?: StreamTextTransform<ToolSet> | StreamTextTransform<ToolSet>[];\n /** @see TeachingsOptions */\n teachingsOptions?: TeachingsOptions;\n filesystem: IFileSystem;\n }) {\n this.#config = {\n teachingsOptions: config.teachingsOptions,\n adapter: config.adapter,\n context: config.context,\n tools: config.tools ?? {},\n model: config.model,\n transform: config.transform,\n filesystem: config.filesystem,\n introspection: new JsonCache<ContextFragment[]>(\n 'introspection-' + config.version,\n ),\n };\n }\n\n public async toSql(input: string): Promise<string> {\n const schemaFragments = await this.index();\n const result = await toSql({\n input,\n adapter: this.#config.adapter,\n fragments: schemaFragments,\n model: this.#config.model,\n });\n return result.sql;\n }\n\n /**\n * Introspect the database schema and return context fragments.\n * Results are cached to avoid repeated introspection.\n */\n public async index(): Promise<ContextFragment[]> {\n const cached = await this.#config.introspection.read();\n if (cached) {\n return cached;\n }\n const fragments = await this.#config.adapter.introspect();\n await this.#config.introspection.write(fragments);\n return fragments;\n }\n\n /**\n * Generate training data pairs using a producer factory.\n * The factory receives the configured adapter, so users don't need to pass it manually.\n *\n * @example\n * // Generate questions for existing SQL\n * const pairs = await text2sql.toPairs(\n * (adapter) => new SqlExtractor(sqls, adapter, { validateSql: true })\n * );\n *\n * @example\n * // Extract from chat history with validation\n * const pairs = await text2sql.toPairs(\n * (adapter) => new ValidatedProducer(\n * new MessageExtractor(messages),\n * adapter\n * )\n * );\n */\n public async toPairs<T extends PairProducer>(\n factory: (adapter: Adapter) => T,\n ): Promise<ExtractedPair[]> {\n const producer = factory(this.#config.adapter);\n return producer.toPairs();\n }\n\n public async chat(\n messages: ChatMessage[],\n options?: { abortSignal?: AbortSignal },\n ) {\n if (messages.length === 0) {\n throw new Error('messages must not be empty');\n }\n\n const trackedFs = new TrackedFs(this.#config.filesystem);\n\n const context = this.#config.context(\n ...guidelines(this.#config.teachingsOptions),\n ...(await this.index()),\n );\n\n const lastItem = messages[messages.length - 1];\n const lastFragment = toMessageFragment(lastItem);\n const lastUIMessage = chatMessageToUIMessage(lastItem);\n let assistantMsgId: string;\n\n if (lastUIMessage.role === 'assistant') {\n context.set(lastFragment);\n await context.save({ branch: false });\n assistantMsgId = lastUIMessage.id;\n } else {\n context.set(lastFragment);\n await context.save();\n assistantMsgId = generateId();\n }\n\n const uiMessages = messages.map(chatMessageToUIMessage);\n\n const { mounts: skillMounts } = context.getSkillMounts();\n const { tools } = await createResultTools({\n adapter: this.#config.adapter,\n skillMounts,\n filesystem: trackedFs,\n });\n\n const chatAgent = agent({\n name: 'text2sql',\n model: this.#config.model,\n context,\n tools: {\n ...tools,\n ...this.#config.tools,\n },\n guardrails: [errorRecoveryGuardrail],\n maxGuardrailRetries: 3,\n });\n\n const result = await chatAgent.stream(\n {},\n { abortSignal: options?.abortSignal, transform: this.#config.transform },\n );\n\n const uiStream = result.toUIMessageStream({\n onError: (error) => this.#formatError(error),\n sendStart: true,\n sendFinish: true,\n sendReasoning: true,\n sendSources: true,\n originalMessages: uiMessages,\n generateMessageId: () => assistantMsgId,\n messageMetadata: ({ part }) => {\n if (part.type === 'finish-step') {\n return {\n finishReason: part.finishReason,\n usage: part.usage,\n };\n }\n if (part.type === 'finish') {\n return {\n finishReason: part.finishReason,\n totalUsage: part.totalUsage,\n };\n }\n return undefined;\n },\n });\n\n return createUIMessageStream({\n originalMessages: uiMessages,\n generateId: () => assistantMsgId,\n onStepFinish: async ({ responseMessage }) => {\n context.set(assistant({ ...responseMessage, id: assistantMsgId }));\n await context.save({ branch: false });\n },\n onFinish: async ({ responseMessage }) => {\n const createdFiles = trackedFs.getCreatedFiles();\n context.set(\n assistant({\n ...responseMessage,\n id: assistantMsgId,\n metadata: {\n ...((responseMessage.metadata as object) ?? {}),\n createdFiles,\n },\n }),\n );\n await context.save({ branch: false });\n await context.trackUsage(await result.totalUsage);\n },\n execute: async ({ writer }) => {\n writer.merge(uiStream);\n },\n });\n }\n\n #formatError(error: unknown): string {\n if (NoSuchToolError.isInstance(error)) {\n return 'The model tried to call an unknown tool.';\n } else if (InvalidToolInputError.isInstance(error)) {\n return 'The model called a tool with invalid arguments.';\n } else if (ToolCallRepairError.isInstance(error)) {\n return 'The model tried to call a tool with invalid arguments, but it was repaired.';\n } else if (APICallError.isInstance(error)) {\n console.error('Upstream API call failed:', error);\n return `Upstream API call failed with status ${(error as APICallError).statusCode}: ${(error as APICallError).message}`;\n }\n return JSON.stringify(error);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["c", "table", "index", "sandbox", "z", "z", "groq", "dedent", "z", "groq", "z", "dedent", "path", "createHash", "existsSync", "path", "hash", "path", "path", "require", "index", "result", "createRequire", "path", "require", "createRequire", "result", "path", "path", "example", "fragment", "guardrail", "hint", "policy", "workflow", "APICallError", "agent", "agent", "APICallError"]
|
|
7
7
|
}
|