codesift-mcp 0.8.10 → 0.8.11
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/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +2 -1
- package/dist/cli/hooks.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +39 -1
- package/dist/register-tools.js.map +1 -1
- package/dist/search/model2vec-tokenize.d.ts +22 -0
- package/dist/search/model2vec-tokenize.d.ts.map +1 -0
- package/dist/search/model2vec-tokenize.js +140 -0
- package/dist/search/model2vec-tokenize.js.map +1 -0
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +7 -0
- package/dist/search/semantic.js.map +1 -1
- package/dist/search/static-embedding-provider.d.ts +24 -0
- package/dist/search/static-embedding-provider.d.ts.map +1 -0
- package/dist/search/static-embedding-provider.js +149 -0
- package/dist/search/static-embedding-provider.js.map +1 -0
- package/dist/storage/_shared.d.ts.map +1 -1
- package/dist/storage/_shared.js +4 -1
- package/dist/storage/_shared.js.map +1 -1
- package/dist/storage/hash-snapshot.d.ts +36 -0
- package/dist/storage/hash-snapshot.d.ts.map +1 -0
- package/dist/storage/hash-snapshot.js +101 -0
- package/dist/storage/hash-snapshot.js.map +1 -0
- package/dist/storage/usage-stats.d.ts +8 -0
- package/dist/storage/usage-stats.d.ts.map +1 -1
- package/dist/storage/usage-stats.js +74 -24
- package/dist/storage/usage-stats.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts +16 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +23 -3
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/index-tools.d.ts +31 -2
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +460 -33
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/pg-introspect-tools.d.ts +147 -0
- package/dist/tools/pg-introspect-tools.d.ts.map +1 -0
- package/dist/tools/pg-introspect-tools.js +396 -0
- package/dist/tools/pg-introspect-tools.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/hf-download-stream.d.ts +21 -0
- package/dist/utils/hf-download-stream.d.ts.map +1 -0
- package/dist/utils/hf-download-stream.js +101 -0
- package/dist/utils/hf-download-stream.js.map +1 -0
- package/dist/utils/hf-hub-download.d.ts +8 -0
- package/dist/utils/hf-hub-download.d.ts.map +1 -0
- package/dist/utils/hf-hub-download.js +149 -0
- package/dist/utils/hf-hub-download.js.map +1 -0
- package/dist/utils/safetensors-loader.d.ts +9 -0
- package/dist/utils/safetensors-loader.d.ts.map +1 -0
- package/dist/utils/safetensors-loader.js +95 -0
- package/dist/utils/safetensors-loader.js.map +1 -0
- package/dist/utils/safetensors-meta-guard.d.ts +7 -0
- package/dist/utils/safetensors-meta-guard.d.ts.map +1 -0
- package/dist/utils/safetensors-meta-guard.js +50 -0
- package/dist/utils/safetensors-meta-guard.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL introspection tools.
|
|
3
|
+
* `pg` is an optional dependency — all imports are dynamic so the module
|
|
4
|
+
* loads cleanly even when `pg` is not installed.
|
|
5
|
+
*/
|
|
6
|
+
export async function loadPgClient() {
|
|
7
|
+
try {
|
|
8
|
+
// Dynamic import keeps pg entirely optional at the type level.
|
|
9
|
+
// We use a specifier string stored in a variable so tsc does not attempt
|
|
10
|
+
// to resolve "pg" as a static module (avoids TS2307 when @types/pg is
|
|
11
|
+
// absent from node_modules at type-check time).
|
|
12
|
+
const pgSpecifier = "pg";
|
|
13
|
+
const mod = (await import(/* @vite-ignore */ pgSpecifier));
|
|
14
|
+
// Handle both ESM default-export and CJS named-export shapes.
|
|
15
|
+
const ClientCtor = mod.default?.Client ?? mod.Client;
|
|
16
|
+
if (!ClientCtor)
|
|
17
|
+
return { error: "pg not installed. Run: npm install pg" };
|
|
18
|
+
return { ClientCtor };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { error: "pg not installed. Run: npm install pg" };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Whole-call wall-clock cap (ms). Overridable via opts.timeoutMs. */
|
|
25
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
26
|
+
/** Per-connection + per-statement cap (ms). */
|
|
27
|
+
const STATEMENT_TIMEOUT_MS = 5000;
|
|
28
|
+
const COLUMNS_SQL = `
|
|
29
|
+
SELECT table_name, column_name, data_type, is_nullable
|
|
30
|
+
FROM information_schema.columns
|
|
31
|
+
WHERE table_schema = $1
|
|
32
|
+
ORDER BY table_name, ordinal_position`;
|
|
33
|
+
const PK_SQL = `
|
|
34
|
+
SELECT kcu.table_name, kcu.column_name
|
|
35
|
+
FROM information_schema.table_constraints tc
|
|
36
|
+
JOIN information_schema.key_column_usage kcu
|
|
37
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
38
|
+
AND tc.table_schema = kcu.table_schema
|
|
39
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
40
|
+
AND tc.table_schema = $1
|
|
41
|
+
ORDER BY kcu.table_name, kcu.ordinal_position`;
|
|
42
|
+
const INDEX_SQL = `
|
|
43
|
+
SELECT tablename AS table_name, indexname AS index_name
|
|
44
|
+
FROM pg_catalog.pg_indexes
|
|
45
|
+
WHERE schemaname = $1
|
|
46
|
+
ORDER BY tablename, indexname`;
|
|
47
|
+
const FK_SQL = `
|
|
48
|
+
SELECT
|
|
49
|
+
kcu.table_name AS from_table,
|
|
50
|
+
kcu.column_name AS from_column,
|
|
51
|
+
ccu.table_name AS to_table,
|
|
52
|
+
ccu.column_name AS to_column
|
|
53
|
+
FROM information_schema.referential_constraints rc
|
|
54
|
+
JOIN information_schema.key_column_usage kcu
|
|
55
|
+
ON rc.constraint_name = kcu.constraint_name
|
|
56
|
+
AND rc.constraint_schema = kcu.table_schema
|
|
57
|
+
JOIN information_schema.key_column_usage ccu
|
|
58
|
+
ON rc.unique_constraint_name = ccu.constraint_name
|
|
59
|
+
AND rc.unique_constraint_schema = ccu.table_schema
|
|
60
|
+
AND kcu.ordinal_position = ccu.ordinal_position
|
|
61
|
+
WHERE rc.constraint_schema = $1
|
|
62
|
+
ORDER BY kcu.table_name, kcu.column_name`;
|
|
63
|
+
/**
|
|
64
|
+
* Replace every occurrence of the connection string — and, separately, its
|
|
65
|
+
* password component — with "[REDACTED]" inside arbitrary text.
|
|
66
|
+
*
|
|
67
|
+
* Why password-separately: a thrown driver error often echoes only the host
|
|
68
|
+
* portion or a re-assembled URL with the password but a different surrounding
|
|
69
|
+
* shape, so a single full-string replace can miss the secret. Parsing the URL
|
|
70
|
+
* and replacing the password token independently closes that gap.
|
|
71
|
+
*
|
|
72
|
+
* Never throws — a malformed connStr just falls back to the full-string replace.
|
|
73
|
+
*/
|
|
74
|
+
export function redactConnStr(text, connStr) {
|
|
75
|
+
let out = text;
|
|
76
|
+
if (connStr) {
|
|
77
|
+
// 1. Replace the whole connection string verbatim.
|
|
78
|
+
out = out.split(connStr).join("[REDACTED]");
|
|
79
|
+
// 2. Replace the password component on its own (covers re-assembled forms).
|
|
80
|
+
try {
|
|
81
|
+
const url = new URL(connStr);
|
|
82
|
+
if (url.password) {
|
|
83
|
+
out = out.split(url.password).join("[REDACTED]");
|
|
84
|
+
}
|
|
85
|
+
// Also scrub a bare user:pass@ authority fragment if present in text.
|
|
86
|
+
if (url.username && url.password) {
|
|
87
|
+
out = out.split(`${url.username}:${url.password}`).join("[REDACTED]");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Non-URL conn string (e.g. libpq keyword form). Best-effort: pull a
|
|
92
|
+
// password=... token out and scrub its value.
|
|
93
|
+
const m = /password=([^\s]+)/i.exec(connStr);
|
|
94
|
+
if (m?.[1])
|
|
95
|
+
out = out.split(m[1]).join("[REDACTED]");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/** Coerce any thrown value to a message string, then redact it. */
|
|
101
|
+
function redactError(err, connStr) {
|
|
102
|
+
const raw = err instanceof Error ? (err.message ?? String(err)) : String(err);
|
|
103
|
+
return redactConnStr(raw, connStr);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Introspect a live PostgreSQL database's schema over a fresh connection.
|
|
107
|
+
*
|
|
108
|
+
* Opens a new Client, sets a statement timeout, reads columns / primary keys /
|
|
109
|
+
* indexes / foreign keys from information_schema + pg_catalog, and maps them to
|
|
110
|
+
* {@link PgTableInfo}[] / {@link PgRelationship}[]. The whole call is bounded by
|
|
111
|
+
* a wall-clock race (default 10s). The connection is always closed in a finally
|
|
112
|
+
* block. No connection-string material ever appears in the returned object, a
|
|
113
|
+
* warning, an error message, or a log.
|
|
114
|
+
*
|
|
115
|
+
* @returns {@link PgIntrospectResult} on success, or {@link PgIntrospectError}
|
|
116
|
+
* (with a redacted message) on any failure. Never throws, never logs secrets.
|
|
117
|
+
*/
|
|
118
|
+
export async function introspectPgSchema(connStr, opts = {}) {
|
|
119
|
+
// ── Input validation (CQ3) — before ANY Client construction ──────────────
|
|
120
|
+
if (typeof connStr !== "string" || connStr.trim() === "") {
|
|
121
|
+
return { error: "connStr is required and must be a non-empty string" };
|
|
122
|
+
}
|
|
123
|
+
const schema = opts.schema && opts.schema.trim() !== "" ? opts.schema : "public";
|
|
124
|
+
const timeoutMs = typeof opts.timeoutMs === "number" && opts.timeoutMs > 0 ? opts.timeoutMs : DEFAULT_TIMEOUT_MS;
|
|
125
|
+
// Resolve the Client constructor (injected seam or real pg).
|
|
126
|
+
let ClientCtor;
|
|
127
|
+
if (opts._clientCtor) {
|
|
128
|
+
ClientCtor = opts._clientCtor;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const loaded = await loadPgClient();
|
|
132
|
+
if ("error" in loaded)
|
|
133
|
+
return { error: loaded.error };
|
|
134
|
+
ClientCtor = loaded.ClientCtor;
|
|
135
|
+
}
|
|
136
|
+
// Construct the client up-front so the timeout path can also close it.
|
|
137
|
+
// (runIntrospection's own finally cannot run while it is hung on a query —
|
|
138
|
+
// so the wall-clock race owns cleanup for the timeout case.)
|
|
139
|
+
const client = new ClientCtor({
|
|
140
|
+
connectionString: connStr,
|
|
141
|
+
connectionTimeoutMillis: STATEMENT_TIMEOUT_MS,
|
|
142
|
+
});
|
|
143
|
+
// Race the whole introspection against a wall-clock timeout.
|
|
144
|
+
let timer;
|
|
145
|
+
let timedOut = false;
|
|
146
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
147
|
+
timer = setTimeout(() => {
|
|
148
|
+
timedOut = true;
|
|
149
|
+
// Static message (no secret), but redact defensively anyway.
|
|
150
|
+
reject(new Error("pg introspection timed out"));
|
|
151
|
+
}, timeoutMs);
|
|
152
|
+
});
|
|
153
|
+
// Hold a reference so we can silence any late rejection on the orphaned
|
|
154
|
+
// promise when timeout wins the race (otherwise Node fires unhandledRejection
|
|
155
|
+
// when the hung query later rejects — e.g. after client.end() tears the socket).
|
|
156
|
+
const introspectionPromise = runIntrospection(client, connStr, schema);
|
|
157
|
+
try {
|
|
158
|
+
const result = await Promise.race([introspectionPromise, timeout]);
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
return { error: redactError(err, connStr) };
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
if (timer)
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
// On the timeout path runIntrospection is still hung, so its finally never
|
|
168
|
+
// ran — close the client here. On the normal path runIntrospection already
|
|
169
|
+
// closed it; a second end() is harmless (and swallowed).
|
|
170
|
+
if (timedOut) {
|
|
171
|
+
// Swallow any future rejection from the orphaned introspection promise so
|
|
172
|
+
// Node never fires unhandledRejection after client.end() destroys the socket.
|
|
173
|
+
introspectionPromise.catch(() => undefined);
|
|
174
|
+
try {
|
|
175
|
+
await client.end();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* best-effort cleanup; never leak the conn string */
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The actual connect → query → map flow. Split out so the timeout race in
|
|
185
|
+
* {@link introspectPgSchema} stays readable. Always closes the client on the
|
|
186
|
+
* non-timeout paths (success / connect-failure / query-failure).
|
|
187
|
+
*/
|
|
188
|
+
async function runIntrospection(client, connStr, schema) {
|
|
189
|
+
try {
|
|
190
|
+
await client.connect();
|
|
191
|
+
// FIRST query after connect — bound every subsequent statement.
|
|
192
|
+
await client.query(`SET statement_timeout = ${STATEMENT_TIMEOUT_MS}`);
|
|
193
|
+
const [columnsRes, pkRes, indexRes, fkRes] = await Promise.all([
|
|
194
|
+
client.query(COLUMNS_SQL, [schema]),
|
|
195
|
+
client.query(PK_SQL, [schema]),
|
|
196
|
+
client.query(INDEX_SQL, [schema]),
|
|
197
|
+
client.query(FK_SQL, [schema]),
|
|
198
|
+
]);
|
|
199
|
+
const tables = buildTables(columnsRes.rows, pkRes.rows, indexRes.rows);
|
|
200
|
+
const relationships = buildRelationships(fkRes.rows);
|
|
201
|
+
return { tables, relationships, warnings: [] };
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
// Redact before the error escapes runIntrospection so the caller's catch
|
|
205
|
+
// (and the timeout race) never sees raw connection material.
|
|
206
|
+
throw new Error(redactError(err, connStr));
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
// Always close — connect-success, query-failure, or connect-failure paths.
|
|
210
|
+
// end() itself may throw; swallow + redact so cleanup never leaks secrets.
|
|
211
|
+
try {
|
|
212
|
+
await client.end();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
/* best-effort cleanup; nothing actionable, never leak the conn string */
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** Map raw column/pk/index rows into {@link PgTableInfo}[], deterministically ordered. */
|
|
220
|
+
function buildTables(columnRows, pkRows, indexRows) {
|
|
221
|
+
const pkByTable = new Map();
|
|
222
|
+
for (const r of pkRows) {
|
|
223
|
+
const t = String(r["table_name"]);
|
|
224
|
+
const c = String(r["column_name"]);
|
|
225
|
+
const list = pkByTable.get(t) ?? [];
|
|
226
|
+
list.push(c);
|
|
227
|
+
pkByTable.set(t, list);
|
|
228
|
+
}
|
|
229
|
+
const idxByTable = new Map();
|
|
230
|
+
for (const r of indexRows) {
|
|
231
|
+
const t = String(r["table_name"]);
|
|
232
|
+
const i = String(r["index_name"]);
|
|
233
|
+
const list = idxByTable.get(t) ?? [];
|
|
234
|
+
list.push(i);
|
|
235
|
+
idxByTable.set(t, list);
|
|
236
|
+
}
|
|
237
|
+
const tableOrder = [];
|
|
238
|
+
const colsByTable = new Map();
|
|
239
|
+
for (const r of columnRows) {
|
|
240
|
+
const t = String(r["table_name"]);
|
|
241
|
+
if (!colsByTable.has(t)) {
|
|
242
|
+
colsByTable.set(t, []);
|
|
243
|
+
tableOrder.push(t);
|
|
244
|
+
}
|
|
245
|
+
colsByTable.get(t).push({
|
|
246
|
+
name: String(r["column_name"]),
|
|
247
|
+
type: String(r["data_type"]),
|
|
248
|
+
nullable: String(r["is_nullable"]).toUpperCase() === "YES",
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return tableOrder.map((name) => ({
|
|
252
|
+
name,
|
|
253
|
+
columns: colsByTable.get(name) ?? [],
|
|
254
|
+
primary_key: pkByTable.get(name) ?? [],
|
|
255
|
+
indexes: idxByTable.get(name) ?? [],
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
/** Map raw FK rows into {@link PgRelationship}[]. */
|
|
259
|
+
function buildRelationships(fkRows) {
|
|
260
|
+
return fkRows.map((r) => ({
|
|
261
|
+
from_table: String(r["from_table"]),
|
|
262
|
+
from_column: String(r["from_column"]),
|
|
263
|
+
to_table: String(r["to_table"]),
|
|
264
|
+
to_column: String(r["to_column"]),
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Compare a live {@link PgIntrospectResult} against the migration-derived
|
|
269
|
+
* schema stored in the code index for `repo`.
|
|
270
|
+
*
|
|
271
|
+
* Instead of calling `getCodeIndex` directly (which would import index-tools
|
|
272
|
+
* and drag in the whole storage layer), callers inject the raw symbol array.
|
|
273
|
+
* This keeps pgDriftCheck pure and easily testable.
|
|
274
|
+
*
|
|
275
|
+
* The SQL schema is reconstructed from `kind === "table"` symbols and their
|
|
276
|
+
* `kind === "field"` children — the same shape that `analyzeSchemaDrift`
|
|
277
|
+
* consumes internally. We do NOT call `analyzeSchemaDrift` (different concern:
|
|
278
|
+
* that function compares ORM models vs SQL files, not live DB vs migrations).
|
|
279
|
+
*
|
|
280
|
+
* @param live Result from {@link introspectPgSchema}.
|
|
281
|
+
* @param symbols `index.symbols` from `getCodeIndex(repo)`.
|
|
282
|
+
* @returns {@link PgDriftResult} — never throws.
|
|
283
|
+
*/
|
|
284
|
+
export function pgDriftCheck(live, symbols) {
|
|
285
|
+
// Build migration-schema view from SQL symbols ─────────────────────────────
|
|
286
|
+
// Tables: kind === "table"; columns: kind === "field" with parent === table.id
|
|
287
|
+
const migrationTables = new Map();
|
|
288
|
+
for (const sym of symbols) {
|
|
289
|
+
if (sym.kind !== "table")
|
|
290
|
+
continue;
|
|
291
|
+
migrationTables.set(sym.name.toLowerCase(), {
|
|
292
|
+
id: sym.id,
|
|
293
|
+
columns: new Map(),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
if (migrationTables.size === 0) {
|
|
297
|
+
return {
|
|
298
|
+
missing_tables_live_only: [],
|
|
299
|
+
missing_tables_migrations_only: [],
|
|
300
|
+
column_mismatches: [],
|
|
301
|
+
note: "no migration-derived schema: no SQL table symbols found in index",
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
for (const sym of symbols) {
|
|
305
|
+
if (sym.kind !== "field" || !sym.parent)
|
|
306
|
+
continue;
|
|
307
|
+
// Find the parent table entry by matching the parent id against the id we stored
|
|
308
|
+
for (const [, tbl] of migrationTables) {
|
|
309
|
+
if (tbl.id === sym.parent) {
|
|
310
|
+
tbl.columns.set(sym.name.toLowerCase(), sym.signature ?? "unknown");
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Build live-schema lookup ─────────────────────────────────────────────────
|
|
316
|
+
const liveTables = new Map();
|
|
317
|
+
for (const tbl of live.tables) {
|
|
318
|
+
const cols = new Map();
|
|
319
|
+
for (const col of tbl.columns) {
|
|
320
|
+
cols.set(col.name.toLowerCase(), col.type);
|
|
321
|
+
}
|
|
322
|
+
liveTables.set(tbl.name.toLowerCase(), cols);
|
|
323
|
+
}
|
|
324
|
+
// Compare ──────────────────────────────────────────────────────────────────
|
|
325
|
+
const missing_tables_live_only = [];
|
|
326
|
+
const missing_tables_migrations_only = [];
|
|
327
|
+
const column_mismatches = [];
|
|
328
|
+
// Tables in live but not in migrations
|
|
329
|
+
for (const [tableName] of liveTables) {
|
|
330
|
+
if (!migrationTables.has(tableName)) {
|
|
331
|
+
missing_tables_live_only.push(tableName);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Tables in migrations but not in live + column-level diff for shared tables
|
|
335
|
+
for (const [tableName, migTbl] of migrationTables) {
|
|
336
|
+
const liveCols = liveTables.get(tableName);
|
|
337
|
+
if (!liveCols) {
|
|
338
|
+
missing_tables_migrations_only.push(tableName);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
// Columns in migrations but missing in live
|
|
342
|
+
for (const [colName, migType] of migTbl.columns) {
|
|
343
|
+
if (!liveCols.has(colName)) {
|
|
344
|
+
column_mismatches.push({
|
|
345
|
+
table: tableName,
|
|
346
|
+
column: colName,
|
|
347
|
+
kind: "missing_live",
|
|
348
|
+
migrations_type: migType,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Both sides have the column — check type compatibility
|
|
353
|
+
const liveType = liveCols.get(colName);
|
|
354
|
+
if (normalizeSimpleType(liveType) !== normalizeSimpleType(migType)) {
|
|
355
|
+
column_mismatches.push({
|
|
356
|
+
table: tableName,
|
|
357
|
+
column: colName,
|
|
358
|
+
kind: "type_mismatch",
|
|
359
|
+
live_type: liveType,
|
|
360
|
+
migrations_type: migType,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Columns in live but missing in migrations
|
|
366
|
+
for (const [colName, liveType] of liveCols) {
|
|
367
|
+
if (!migTbl.columns.has(colName)) {
|
|
368
|
+
column_mismatches.push({
|
|
369
|
+
table: tableName,
|
|
370
|
+
column: colName,
|
|
371
|
+
kind: "missing_migrations",
|
|
372
|
+
live_type: liveType,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
missing_tables_live_only,
|
|
379
|
+
missing_tables_migrations_only,
|
|
380
|
+
column_mismatches,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Minimal type normalisation: strips modifiers like `NOT NULL`, `DEFAULT …`,
|
|
385
|
+
* parenthesised sizes, and lowercases. Enough for gross-mismatch detection
|
|
386
|
+
* (e.g. `integer` vs `text`) without false-positives from vendor decoration.
|
|
387
|
+
*/
|
|
388
|
+
function normalizeSimpleType(raw) {
|
|
389
|
+
return raw
|
|
390
|
+
.toLowerCase()
|
|
391
|
+
.replace(/\s*not\s+null/gi, "")
|
|
392
|
+
.replace(/\s*default\s+\S+/gi, "")
|
|
393
|
+
.replace(/\([^)]*\)/g, "")
|
|
394
|
+
.trim();
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=pg-introspect-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-introspect-tools.js","sourceRoot":"","sources":["../../src/tools/pg-introspect-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -198,4 +198,31 @@ export interface CodeChunk {
|
|
|
198
198
|
text: string;
|
|
199
199
|
tokenCount: number;
|
|
200
200
|
}
|
|
201
|
+
export interface RepoGroup {
|
|
202
|
+
name: string;
|
|
203
|
+
repos: string[];
|
|
204
|
+
description?: string;
|
|
205
|
+
created_at: number;
|
|
206
|
+
updated_at: number;
|
|
207
|
+
}
|
|
208
|
+
export interface GroupRegistry {
|
|
209
|
+
groups: Record<string, RepoGroup>;
|
|
210
|
+
updated_at: number;
|
|
211
|
+
}
|
|
212
|
+
export interface RepoEndpoint {
|
|
213
|
+
repo: string;
|
|
214
|
+
method: string;
|
|
215
|
+
path: string;
|
|
216
|
+
normalized_path: string;
|
|
217
|
+
file: string;
|
|
218
|
+
}
|
|
219
|
+
export interface ContractMatch {
|
|
220
|
+
producer_repo: string;
|
|
221
|
+
consumer_repo: string;
|
|
222
|
+
method: string;
|
|
223
|
+
path: string;
|
|
224
|
+
consumer_file: string;
|
|
225
|
+
consumer_line: number;
|
|
226
|
+
confidence: "exact" | "partial";
|
|
227
|
+
}
|
|
201
228
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { WriteStream } from "node:fs";
|
|
2
|
+
/** Destroy a WriteStream and wait for 'close' so the fd is released before callers unlink. */
|
|
3
|
+
export declare function destroyAndWait(ws: WriteStream): Promise<void>;
|
|
4
|
+
/** FIX-2: default per-chunk inactivity timeout (overridable via opts for tests). */
|
|
5
|
+
export declare const READ_INACTIVITY_MS = 30000;
|
|
6
|
+
/** FIX-B: how many consecutive zero-byte chunks before the download is declared stalled. */
|
|
7
|
+
export declare const MAX_ZERO_READS = 1000;
|
|
8
|
+
export interface PumpOpts {
|
|
9
|
+
maxBytes: number;
|
|
10
|
+
expectedLength: number | null;
|
|
11
|
+
/** URL string used only in error messages. */
|
|
12
|
+
url: string;
|
|
13
|
+
/** FIX-2: max ms of silence between chunks before the download is declared stalled. */
|
|
14
|
+
inactivityMs?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Stream `body` to `tmpPath`, enforcing the byte cap and verifying content-length.
|
|
18
|
+
* Resolves with the number of bytes written; caller handles rename / unlink.
|
|
19
|
+
*/
|
|
20
|
+
export declare function pumpToFile(body: ReadableStream<Uint8Array>, tmpPath: string, opts: PumpOpts): Promise<number>;
|
|
21
|
+
//# sourceMappingURL=hf-download-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-download-stream.d.ts","sourceRoot":"","sources":["../../src/utils/hf-download-stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzD,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7D;AAED,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,4FAA4F;AAC5F,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,MAAM,CAAC,CAwFjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Streaming pump + integrity logic for HuggingFace Hub downloads.
|
|
2
|
+
// Extracted from hf-hub-download.ts — pure move, behavior identical.
|
|
3
|
+
import { createWriteStream } from "node:fs";
|
|
4
|
+
/** Destroy a WriteStream and wait for 'close' so the fd is released before callers unlink. */
|
|
5
|
+
export function destroyAndWait(ws) {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
if (ws.closed) {
|
|
8
|
+
resolve();
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
ws.once("close", resolve);
|
|
12
|
+
ws.destroy();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/** FIX-2: default per-chunk inactivity timeout (overridable via opts for tests). */
|
|
16
|
+
export const READ_INACTIVITY_MS = 30_000;
|
|
17
|
+
/** FIX-B: how many consecutive zero-byte chunks before the download is declared stalled. */
|
|
18
|
+
export const MAX_ZERO_READS = 1000;
|
|
19
|
+
/**
|
|
20
|
+
* Stream `body` to `tmpPath`, enforcing the byte cap and verifying content-length.
|
|
21
|
+
* Resolves with the number of bytes written; caller handles rename / unlink.
|
|
22
|
+
*/
|
|
23
|
+
export async function pumpToFile(body, tmpPath, opts) {
|
|
24
|
+
const { maxBytes, expectedLength, url } = opts;
|
|
25
|
+
const inactivityMs = opts.inactivityMs ?? READ_INACTIVITY_MS;
|
|
26
|
+
const ws = createWriteStream(tmpPath);
|
|
27
|
+
// Capture WriteStream errors into the promise flow immediately
|
|
28
|
+
let wsError;
|
|
29
|
+
const wsErrorPromise = new Promise((_resolve, reject) => {
|
|
30
|
+
ws.on("error", (err) => {
|
|
31
|
+
wsError = err;
|
|
32
|
+
reject(err);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
let accumulated = 0;
|
|
36
|
+
let zeroReads = 0;
|
|
37
|
+
const reader = body.getReader();
|
|
38
|
+
try {
|
|
39
|
+
while (true) {
|
|
40
|
+
// FIX-2: race each chunk read against a per-chunk inactivity timer
|
|
41
|
+
let inactivityHandle;
|
|
42
|
+
const inactivityTimer = new Promise((_resolve, reject) => {
|
|
43
|
+
inactivityHandle = setTimeout(() => reject(new Error(`ensureModelFile: download stalled: no data for ${inactivityMs}ms from ${url}`)), inactivityMs);
|
|
44
|
+
});
|
|
45
|
+
const readResult = await Promise.race([
|
|
46
|
+
reader.read(),
|
|
47
|
+
wsErrorPromise.then(() => ({ done: false, value: new Uint8Array(0) })),
|
|
48
|
+
inactivityTimer,
|
|
49
|
+
]).finally(() => clearTimeout(inactivityHandle));
|
|
50
|
+
const { done, value } = readResult;
|
|
51
|
+
if (wsError)
|
|
52
|
+
throw wsError;
|
|
53
|
+
if (done)
|
|
54
|
+
break;
|
|
55
|
+
// FIX-B: detect streams that emit only zero-length chunks (never trips inactivity timer
|
|
56
|
+
// because reads resolve instantly, and never trips the byte cap because no bytes arrive).
|
|
57
|
+
if (value.byteLength === 0) {
|
|
58
|
+
zeroReads++;
|
|
59
|
+
if (zeroReads > MAX_ZERO_READS) {
|
|
60
|
+
throw new Error(`ensureModelFile: download stalled: no progress after ${MAX_ZERO_READS} zero-length chunks from ${url}`);
|
|
61
|
+
}
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
zeroReads = 0; // reset on any real progress
|
|
65
|
+
accumulated += value.byteLength;
|
|
66
|
+
if (accumulated > maxBytes) {
|
|
67
|
+
reader.cancel().catch(() => undefined);
|
|
68
|
+
await destroyAndWait(ws);
|
|
69
|
+
throw new Error(`ensureModelFile: download exceeded 500 MB cap (${maxBytes} bytes) for ${url}`);
|
|
70
|
+
}
|
|
71
|
+
await Promise.race([
|
|
72
|
+
new Promise((resolve, reject) => {
|
|
73
|
+
ws.write(value, (err) => (err ? reject(err) : resolve()));
|
|
74
|
+
}),
|
|
75
|
+
wsErrorPromise,
|
|
76
|
+
]);
|
|
77
|
+
if (wsError)
|
|
78
|
+
throw wsError;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (streamErr) {
|
|
82
|
+
reader.cancel().catch(() => undefined);
|
|
83
|
+
await destroyAndWait(ws);
|
|
84
|
+
throw streamErr;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
reader.releaseLock();
|
|
88
|
+
}
|
|
89
|
+
await Promise.race([
|
|
90
|
+
new Promise((resolve, reject) => {
|
|
91
|
+
ws.end((err) => (err ? reject(err) : resolve()));
|
|
92
|
+
}),
|
|
93
|
+
wsErrorPromise,
|
|
94
|
+
]);
|
|
95
|
+
// Verify content-length matches actual bytes received
|
|
96
|
+
if (expectedLength !== null && accumulated !== expectedLength) {
|
|
97
|
+
throw new Error(`ensureModelFile: incomplete download: got ${accumulated} of ${expectedLength} bytes for ${url}`);
|
|
98
|
+
}
|
|
99
|
+
return accumulated;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=hf-download-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-download-stream.js","sourceRoot":"","sources":["../../src/utils/hf-download-stream.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,qEAAqE;AAErE,OAAO,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AAEzD,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,EAAe;IAC5C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAWnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAgC,EAChC,OAAe,EACf,IAAc;IAEd,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC;IAC7D,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEtC,+DAA+D;IAC/D,IAAI,OAA0B,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QAC7D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC5B,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAEhC,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,mEAAmE;YACnE,IAAI,gBAA2D,CAAC;YAChE,MAAM,eAAe,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBAC9D,gBAAgB,GAAG,UAAU,CAC3B,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kDAAkD,YAAY,WAAW,GAAG,EAAE,CAAC,CAAC,EACvG,YAAY,CACb,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACpC,MAAM,CAAC,IAAI,EAAE;gBACb,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/E,eAAe;aAChB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAEjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;YACnC,IAAI,OAAO;gBAAE,MAAM,OAAO,CAAC;YAC3B,IAAI,IAAI;gBAAE,MAAM;YAEhB,wFAAwF;YACxF,0FAA0F;YAC1F,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,cAAc,4BAA4B,GAAG,EAAE,CAAC,CAAC;gBAC3H,CAAC;gBACD,SAAS;YACX,CAAC;YACD,SAAS,GAAG,CAAC,CAAC,CAAC,6BAA6B;YAC5C,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC;YAChC,IAAI,WAAW,GAAG,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,eAAe,GAAG,EAAE,CAC/E,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC,CAAC;gBACF,cAAc;aACf,CAAC,CAAC;YACH,IAAI,OAAO;gBAAE,MAAM,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,SAAS,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAkB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC;QACF,cAAc;KACf,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,cAAc,KAAK,IAAI,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,6CAA6C,WAAW,OAAO,cAAc,cAAc,GAAG,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const MAX_DOWNLOAD_BYTES: number;
|
|
2
|
+
export declare const DOWNLOAD_TIMEOUT_MS = 30000;
|
|
3
|
+
export declare function ensureModelFile(modelId: string, filename: string, cacheDir: string, opts?: {
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
maxBytes?: number;
|
|
6
|
+
inactivityMs?: number;
|
|
7
|
+
}): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=hf-hub-download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-hub-download.d.ts","sourceRoot":"","sources":["../../src/utils/hf-hub-download.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AACpD,eAAO,MAAM,mBAAmB,QAAS,CAAC;AA8I1C,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|