@lumifai/harness-tool-pack-postgres 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +84 -0
  2. package/dist/cast-types.d.ts +1 -0
  3. package/dist/cast-types.js +24 -0
  4. package/dist/cast-types.js.map +1 -0
  5. package/dist/catalog-cache.d.ts +9 -0
  6. package/dist/catalog-cache.js +49 -0
  7. package/dist/catalog-cache.js.map +1 -0
  8. package/dist/catalog.d.ts +45 -0
  9. package/dist/catalog.js +221 -0
  10. package/dist/catalog.js.map +1 -0
  11. package/dist/constants.d.ts +45 -0
  12. package/dist/constants.js +94 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/errors.d.ts +18 -0
  15. package/dist/errors.js +29 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/identifiers.d.ts +1 -0
  18. package/dist/identifiers.js +21 -0
  19. package/dist/identifiers.js.map +1 -0
  20. package/dist/index.d.ts +7 -0
  21. package/dist/index.js +22 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/insert-compiler.d.ts +21 -0
  24. package/dist/insert-compiler.js +126 -0
  25. package/dist/insert-compiler.js.map +1 -0
  26. package/dist/insert-executor.d.ts +25 -0
  27. package/dist/insert-executor.js +101 -0
  28. package/dist/insert-executor.js.map +1 -0
  29. package/dist/insert-language.d.ts +56 -0
  30. package/dist/insert-language.js +218 -0
  31. package/dist/insert-language.js.map +1 -0
  32. package/dist/postgres.d.ts +39 -0
  33. package/dist/postgres.js +503 -0
  34. package/dist/postgres.js.map +1 -0
  35. package/dist/query-compiler.d.ts +16 -0
  36. package/dist/query-compiler.js +504 -0
  37. package/dist/query-compiler.js.map +1 -0
  38. package/dist/query-executor.d.ts +27 -0
  39. package/dist/query-executor.js +223 -0
  40. package/dist/query-executor.js.map +1 -0
  41. package/dist/query-language.d.ts +208 -0
  42. package/dist/query-language.js +500 -0
  43. package/dist/query-language.js.map +1 -0
  44. package/dist/workspace-file.d.ts +6 -0
  45. package/dist/workspace-file.js +47 -0
  46. package/dist/workspace-file.js.map +1 -0
  47. package/package.json +43 -0
  48. package/skills/postgres/SKILL.md +144 -0
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.executeReadQuery = executeReadQuery;
7
+ exports.withReadOnlyTransaction = withReadOnlyTransaction;
8
+ exports.mapExecutionError = mapExecutionError;
9
+ const pg_cursor_1 = __importDefault(require("pg-cursor"));
10
+ const constants_1 = require("./constants");
11
+ const errors_1 = require("./errors");
12
+ async function executeReadQuery(client, compiled, fetchLimit, options = {}, audit) {
13
+ const started = Date.now();
14
+ await beginReadOnlyTransaction(client, options);
15
+ try {
16
+ if (options.enableExplainCostGate ?? true) {
17
+ await assertExplainCostWithinLimit(client, compiled, options.explainCostLimit);
18
+ }
19
+ // Stream through a cursor so oversized result sets are abandoned as soon
20
+ // as a limit trips, instead of being fully buffered in memory.
21
+ const maxCellBytes = Math.max(options.maxCellBytes ?? constants_1.DEFAULT_MAX_CELL_BYTES, 1);
22
+ const maxResultBytes = options.maxResultBytes ?? constants_1.DEFAULT_MAX_RESULT_BYTES;
23
+ const cursor = client.query(new pg_cursor_1.default(compiled.text, compiled.values, { rowMode: 'array' }));
24
+ const rows = [];
25
+ let fields = [];
26
+ let truncatedRows = false;
27
+ let truncatedBytes = false;
28
+ let truncatedCells = false;
29
+ let totalBytes = 0;
30
+ try {
31
+ reading: while (rows.length <= fetchLimit) {
32
+ // Fetch up to fetchLimit + 1 rows so a full page still lets us detect
33
+ // that more rows exist, batching cursor reads instead of one per row.
34
+ const remaining = fetchLimit + 1 - rows.length;
35
+ const batchSize = Math.min(constants_1.CURSOR_BATCH_SIZE, remaining);
36
+ const batch = fields.length === 0
37
+ ? await readCursorBatch(cursor, batchSize, (result) => {
38
+ fields = result.fields;
39
+ })
40
+ : await cursor.read(batchSize);
41
+ if (batch.length === 0) {
42
+ break;
43
+ }
44
+ for (const raw of batch) {
45
+ const normalized = normalizeRow(raw, maxCellBytes);
46
+ if (normalized.truncatedCells) {
47
+ truncatedCells = true;
48
+ }
49
+ const rowBytes = estimateRowBytes(normalized.values);
50
+ if (totalBytes + rowBytes > maxResultBytes) {
51
+ truncatedBytes = true;
52
+ break reading;
53
+ }
54
+ if (rows.length >= fetchLimit) {
55
+ truncatedRows = true;
56
+ break reading;
57
+ }
58
+ totalBytes += rowBytes;
59
+ rows.push(normalized.values);
60
+ }
61
+ }
62
+ }
63
+ finally {
64
+ await cursor.close().catch(() => undefined);
65
+ }
66
+ const hasMore = truncatedRows || truncatedBytes;
67
+ const queryResult = {
68
+ columns: fields.map((field) => ({
69
+ name: field.name,
70
+ type: String(field.dataTypeID),
71
+ })),
72
+ rows,
73
+ returned_count: rows.length,
74
+ has_more: hasMore,
75
+ limit: fetchLimit,
76
+ truncation: {
77
+ rows: truncatedRows,
78
+ bytes: truncatedBytes,
79
+ cells: truncatedCells,
80
+ },
81
+ };
82
+ audit?.({
83
+ fingerprint: compiled.fingerprint,
84
+ referencedRelations: compiled.referencedRelations,
85
+ durationMs: Date.now() - started,
86
+ returnedCount: queryResult.returned_count,
87
+ hasMore: queryResult.has_more,
88
+ truncation: queryResult.truncation,
89
+ });
90
+ return queryResult;
91
+ }
92
+ finally {
93
+ await client.query('ROLLBACK').catch(() => undefined);
94
+ }
95
+ }
96
+ async function beginReadOnlyTransaction(client, options) {
97
+ const statementTimeout = options.statementTimeoutMs ?? constants_1.DEFAULT_STATEMENT_TIMEOUT_MS;
98
+ const lockTimeout = options.lockTimeoutMs ?? constants_1.DEFAULT_LOCK_TIMEOUT_MS;
99
+ const idleTimeout = options.idleInTransactionTimeoutMs ?? constants_1.DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS;
100
+ await client.query('BEGIN TRANSACTION READ ONLY');
101
+ await client.query(`SET LOCAL statement_timeout = ${statementTimeout}`);
102
+ await client.query(`SET LOCAL lock_timeout = ${lockTimeout}`);
103
+ await client.query(`SET LOCAL idle_in_transaction_session_timeout = ${idleTimeout}`);
104
+ const tempFileLimitKb = Math.min(Math.max(options.tempFileLimitKb ?? constants_1.DEFAULT_TEMP_FILE_LIMIT_KB, 1), constants_1.MAX_TEMP_FILE_LIMIT_KB);
105
+ await client.query(`SET LOCAL temp_file_limit = '${tempFileLimitKb}kB'`);
106
+ if (options.searchPath && options.searchPath.length > 0) {
107
+ const path = options.searchPath.map((entry) => `"${entry.replace(/"/g, '""')}"`).join(', ');
108
+ await client.query(`SET LOCAL search_path = ${path}`);
109
+ }
110
+ }
111
+ async function withReadOnlyTransaction(client, options, run) {
112
+ await beginReadOnlyTransaction(client, options);
113
+ try {
114
+ return await run();
115
+ }
116
+ finally {
117
+ await client.query('ROLLBACK').catch(() => undefined);
118
+ }
119
+ }
120
+ async function assertExplainCostWithinLimit(client, compiled, limit = 50_000) {
121
+ // EXPLAIN plans only; it does not execute the query. The cursor below is the
122
+ // sole data-fetch execution path.
123
+ const explain = await client.query(`EXPLAIN (FORMAT JSON) ${compiled.text}`, compiled.values);
124
+ const plan = explain.rows[0]?.['QUERY PLAN']?.[0]?.Plan?.['Total Cost'];
125
+ if (typeof plan === 'number' && plan > limit) {
126
+ throw new errors_1.PostgresToolError('COST_EXCEEDED', `Estimated query cost ${plan} exceeds limit ${limit}.`, { hint: 'Narrow filters, reduce joins, or add indexes before retrying.' });
127
+ }
128
+ }
129
+ function readCursorBatch(cursor, batchSize, onResult) {
130
+ return new Promise((resolve, reject) => {
131
+ cursor.read(batchSize, (error, rows, result) => {
132
+ if (error) {
133
+ reject(error);
134
+ return;
135
+ }
136
+ if (result) {
137
+ onResult(result);
138
+ }
139
+ resolve(rows);
140
+ });
141
+ });
142
+ }
143
+ function normalizeRow(row, maxCellBytes) {
144
+ let truncatedCells = false;
145
+ const values = row.map((value) => {
146
+ const normalized = normalizeCellValue(value, maxCellBytes);
147
+ if (normalized.truncated) {
148
+ truncatedCells = true;
149
+ }
150
+ return normalized.value;
151
+ });
152
+ return { values, truncatedCells };
153
+ }
154
+ /** Truncate a string to at most `maxBytes` UTF-8 bytes, appending an ellipsis. */
155
+ function truncateUtf8(value, maxBytes) {
156
+ if (Buffer.byteLength(value, 'utf8') <= maxBytes) {
157
+ return value;
158
+ }
159
+ let end = Math.min(value.length, maxBytes);
160
+ let truncated = value.slice(0, end);
161
+ while (end > 0 && Buffer.byteLength(truncated, 'utf8') > maxBytes) {
162
+ end -= 1;
163
+ truncated = value.slice(0, end);
164
+ }
165
+ return `${truncated}…`;
166
+ }
167
+ function utf8ByteLength(value) {
168
+ return Buffer.byteLength(value, 'utf8');
169
+ }
170
+ function normalizeCellValue(value, maxCellBytes) {
171
+ if (value === null || value === undefined) {
172
+ return { value: null, truncated: false };
173
+ }
174
+ if (value instanceof Date) {
175
+ return { value: value.toISOString(), truncated: false };
176
+ }
177
+ if (Buffer.isBuffer(value)) {
178
+ const encoded = value.toString('base64');
179
+ if (utf8ByteLength(encoded) > maxCellBytes) {
180
+ return {
181
+ value: `<base64:${truncateUtf8(encoded, Math.max(maxCellBytes - 10, 1))}>`,
182
+ truncated: true,
183
+ };
184
+ }
185
+ return { value: `<base64:${encoded}>`, truncated: false };
186
+ }
187
+ if (typeof value === 'object') {
188
+ const serialized = JSON.stringify(value);
189
+ if (utf8ByteLength(serialized) > maxCellBytes) {
190
+ return {
191
+ value: truncateUtf8(serialized, maxCellBytes),
192
+ truncated: true,
193
+ };
194
+ }
195
+ return { value, truncated: false };
196
+ }
197
+ const asString = String(value);
198
+ if (utf8ByteLength(asString) > maxCellBytes) {
199
+ return {
200
+ value: truncateUtf8(asString, maxCellBytes),
201
+ truncated: true,
202
+ };
203
+ }
204
+ return { value, truncated: false };
205
+ }
206
+ function estimateRowBytes(row) {
207
+ return row.reduce((total, cell) => {
208
+ return total + utf8ByteLength(JSON.stringify(cell));
209
+ }, 0);
210
+ }
211
+ function mapExecutionError(error) {
212
+ if (error instanceof errors_1.PostgresToolError) {
213
+ return error;
214
+ }
215
+ const message = error instanceof Error ? error.message : String(error);
216
+ if (/statement timeout|canceling statement/i.test(message)) {
217
+ return new errors_1.PostgresToolError('TIMEOUT', 'Query exceeded the statement timeout.', {
218
+ cause: error,
219
+ });
220
+ }
221
+ return new errors_1.PostgresToolError('EXECUTION_ERROR', message, { cause: error });
222
+ }
223
+ //# sourceMappingURL=query-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-executor.js","sourceRoot":"","sources":["../src/query-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ import { z } from 'zod';
2
+ import { AGGREGATE_FUNCTIONS, COMPARISON_OPERATORS, JOIN_TYPES, QUERY_PLAN_VERSION, SET_OPERATIONS, WINDOW_FUNCTIONS } from './constants';
3
+ declare const literalValueSchema: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
4
+ export type LiteralValue = z.infer<typeof literalValueSchema>;
5
+ export type ComparisonOp = (typeof COMPARISON_OPERATORS)[number];
6
+ export type AggregateFn = (typeof AGGREGATE_FUNCTIONS)[number];
7
+ export type JoinType = (typeof JOIN_TYPES)[number];
8
+ export type SetOperation = (typeof SET_OPERATIONS)[number];
9
+ export type WindowFn = (typeof WINDOW_FUNCTIONS)[number];
10
+ /** `count(*)` / `count(t.*)` argument; only valid for the `count` aggregate. */
11
+ export type AggregateStarArg = {
12
+ kind: 'star';
13
+ table?: string;
14
+ };
15
+ export type Expr = {
16
+ kind: 'literal';
17
+ value: LiteralValue;
18
+ } | {
19
+ kind: 'column';
20
+ table?: string;
21
+ column: string;
22
+ } | {
23
+ kind: 'comparison';
24
+ op: ComparisonOp;
25
+ left: Expr;
26
+ right: Expr;
27
+ } | {
28
+ kind: 'logical';
29
+ op: 'and' | 'or';
30
+ terms: Expr[];
31
+ } | {
32
+ kind: 'not';
33
+ term: Expr;
34
+ } | {
35
+ kind: 'is_null';
36
+ expr: Expr;
37
+ negated?: boolean;
38
+ } | {
39
+ kind: 'between';
40
+ expr: Expr;
41
+ lower: Expr;
42
+ upper: Expr;
43
+ negated?: boolean;
44
+ } | {
45
+ kind: 'in_list';
46
+ expr: Expr;
47
+ values: LiteralValue[];
48
+ negated?: boolean;
49
+ } | {
50
+ kind: 'in_subquery';
51
+ expr: Expr;
52
+ query: SelectBody;
53
+ negated?: boolean;
54
+ } | {
55
+ kind: 'exists';
56
+ query: SelectBody;
57
+ negated?: boolean;
58
+ } | {
59
+ kind: 'function';
60
+ name: string;
61
+ args: Expr[];
62
+ } | {
63
+ kind: 'aggregate';
64
+ fn: AggregateFn;
65
+ arg?: Expr | AggregateStarArg;
66
+ distinct?: boolean;
67
+ } | {
68
+ kind: 'case';
69
+ clauses: {
70
+ when: Expr;
71
+ then: Expr;
72
+ }[];
73
+ else?: Expr;
74
+ } | {
75
+ kind: 'cast';
76
+ expr: Expr;
77
+ to: string;
78
+ } | {
79
+ kind: 'scalar_subquery';
80
+ query: SelectBody;
81
+ } | {
82
+ kind: 'window';
83
+ fn: WindowFn;
84
+ arg?: Expr;
85
+ partition_by?: Expr[];
86
+ order_by?: OrderByItem[];
87
+ };
88
+ export type OrderByItem = {
89
+ expr: Expr;
90
+ direction?: 'asc' | 'desc';
91
+ nulls?: 'first' | 'last';
92
+ };
93
+ export type SelectItem = {
94
+ kind: 'column';
95
+ expr: Expr;
96
+ alias?: string;
97
+ } | {
98
+ kind: 'star';
99
+ table?: string;
100
+ } | {
101
+ kind: 'expression';
102
+ expr: Expr;
103
+ alias?: string;
104
+ };
105
+ export type RelationRef = {
106
+ /** Omit schema to reference a CTE defined in the enclosing query. */
107
+ schema?: string;
108
+ name: string;
109
+ alias?: string;
110
+ };
111
+ export type JoinDef = {
112
+ type: JoinType;
113
+ relation: RelationRef;
114
+ on: Expr;
115
+ };
116
+ export type CteDef = {
117
+ name: string;
118
+ query: SelectBody;
119
+ };
120
+ export type SelectBody = {
121
+ with?: CteDef[];
122
+ distinct?: boolean;
123
+ select: SelectItem[];
124
+ from: RelationRef;
125
+ joins?: JoinDef[];
126
+ where?: Expr;
127
+ group_by?: Expr[];
128
+ having?: Expr;
129
+ order_by?: OrderByItem[];
130
+ };
131
+ export type SetOpBody = {
132
+ kind: 'set';
133
+ op: SetOperation;
134
+ left: SelectBody;
135
+ right: SelectBody;
136
+ };
137
+ export type QueryBody = SelectBody | SetOpBody;
138
+ export type QueryPlan = {
139
+ version: typeof QUERY_PLAN_VERSION;
140
+ query: QueryBody;
141
+ limit?: number;
142
+ offset?: number;
143
+ };
144
+ export declare function isSetOpBody(body: QueryBody): body is SetOpBody;
145
+ export declare function isAggregateStarArg(arg: Expr | AggregateStarArg | undefined): arg is AggregateStarArg | undefined;
146
+ /**
147
+ * LLMs routinely emit `null` for omitted optional properties. Drop them so
148
+ * `.optional()` fields accept the input. The only property where `null` is
149
+ * meaningful is a literal expression's `value`, which is preserved.
150
+ */
151
+ export declare function stripNullProperties(input: unknown): unknown;
152
+ export declare const queryPlanSchema: z.ZodObject<{
153
+ version: z.ZodLiteral<1>;
154
+ query: z.ZodType<QueryBody, unknown, z.core.$ZodTypeInternals<QueryBody, unknown>>;
155
+ limit: z.ZodOptional<z.ZodNumber>;
156
+ offset: z.ZodOptional<z.ZodNumber>;
157
+ }, z.core.$strict>;
158
+ export declare const previewInputSchema: z.ZodObject<{
159
+ schema: z.ZodString;
160
+ relation: z.ZodString;
161
+ columns: z.ZodOptional<z.ZodArray<z.ZodString>>;
162
+ where: z.ZodOptional<z.ZodType<Expr, unknown, z.core.$ZodTypeInternals<Expr, unknown>>>;
163
+ order_by: z.ZodOptional<z.ZodArray<z.ZodType<OrderByItem, unknown, z.core.$ZodTypeInternals<OrderByItem, unknown>>>>;
164
+ limit: z.ZodOptional<z.ZodNumber>;
165
+ }, z.core.$strict>;
166
+ export declare const schemaDetailsInputSchema: z.ZodObject<{
167
+ schemas: z.ZodArray<z.ZodString>;
168
+ include_indexes: z.ZodOptional<z.ZodBoolean>;
169
+ cursor: z.ZodOptional<z.ZodString>;
170
+ page_size: z.ZodOptional<z.ZodNumber>;
171
+ }, z.core.$strict>;
172
+ export type PreviewInput = z.infer<typeof previewInputSchema>;
173
+ export type SchemaDetailsInput = z.infer<typeof schemaDetailsInputSchema>;
174
+ export declare function parseQueryPlan(input: unknown): QueryPlan;
175
+ export declare function assertInputShapeComplexity(input: unknown): void;
176
+ export declare function countExprNodes(expr: Expr, depth?: number): {
177
+ nodes: number;
178
+ depth: number;
179
+ };
180
+ export declare function countSelectBodyNodes(body: SelectBody): {
181
+ nodes: number;
182
+ depth: number;
183
+ };
184
+ export declare function countQueryPlanNodes(plan: QueryPlan): {
185
+ nodes: number;
186
+ depth: number;
187
+ };
188
+ export declare function assertQueryPlanComplexity(plan: QueryPlan, limits?: {
189
+ maxDepth?: number;
190
+ maxNodes?: number;
191
+ }): void;
192
+ export declare const queryResultSchema: z.ZodObject<{
193
+ columns: z.ZodArray<z.ZodObject<{
194
+ name: z.ZodString;
195
+ type: z.ZodString;
196
+ }, z.core.$strip>>;
197
+ rows: z.ZodArray<z.ZodArray<z.ZodUnknown>>;
198
+ returned_count: z.ZodNumber;
199
+ has_more: z.ZodBoolean;
200
+ limit: z.ZodNumber;
201
+ truncation: z.ZodObject<{
202
+ rows: z.ZodBoolean;
203
+ bytes: z.ZodBoolean;
204
+ cells: z.ZodBoolean;
205
+ }, z.core.$strip>;
206
+ }, z.core.$strip>;
207
+ export type QueryResult = z.infer<typeof queryResultSchema>;
208
+ export {};