@paperclipai/db 0.2.7 → 0.3.0-canary.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 (36) hide show
  1. package/LICENSE +21 -0
  2. package/dist/backup-lib.d.ts +15 -0
  3. package/dist/backup-lib.d.ts.map +1 -0
  4. package/dist/backup-lib.js +280 -0
  5. package/dist/backup-lib.js.map +1 -0
  6. package/dist/backup.js +88 -283
  7. package/dist/backup.js.map +1 -1
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +4 -4
  10. package/dist/client.js.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/migrations/0024_far_beast.sql +2 -0
  16. package/dist/migrations/0025_nasty_salo.sql +15 -0
  17. package/dist/migrations/meta/0024_snapshot.json +5693 -0
  18. package/dist/migrations/meta/0025_snapshot.json +5849 -0
  19. package/dist/migrations/meta/_journal.json +14 -0
  20. package/dist/migrations/migrations/0024_far_beast.sql +2 -0
  21. package/dist/migrations/migrations/0025_nasty_salo.sql +15 -0
  22. package/dist/migrations/migrations/meta/0024_snapshot.json +5693 -0
  23. package/dist/migrations/migrations/meta/0025_snapshot.json +5849 -0
  24. package/dist/migrations/migrations/meta/_journal.json +14 -0
  25. package/dist/schema/index.d.ts +1 -0
  26. package/dist/schema/index.d.ts.map +1 -1
  27. package/dist/schema/index.js +1 -0
  28. package/dist/schema/index.js.map +1 -1
  29. package/dist/schema/issue_comments.d.ts.map +1 -1
  30. package/dist/schema/issue_comments.js +2 -0
  31. package/dist/schema/issue_comments.js.map +1 -1
  32. package/dist/schema/issue_read_states.d.ts +127 -0
  33. package/dist/schema/issue_read_states.d.ts.map +1 -0
  34. package/dist/schema/issue_read_states.js +17 -0
  35. package/dist/schema/issue_read_states.js.map +1 -0
  36. package/package.json +3 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Paperclip AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,15 @@
1
+ export type RunDatabaseBackupOptions = {
2
+ connectionString: string;
3
+ backupDir: string;
4
+ retentionDays: number;
5
+ filenamePrefix?: string;
6
+ connectTimeoutSeconds?: number;
7
+ };
8
+ export type RunDatabaseBackupResult = {
9
+ backupFile: string;
10
+ sizeBytes: number;
11
+ prunedCount: number;
12
+ };
13
+ export declare function runDatabaseBackup(opts: RunDatabaseBackupOptions): Promise<RunDatabaseBackupResult>;
14
+ export declare function formatDatabaseBackupResult(result: RunDatabaseBackupResult): string;
15
+ //# sourceMappingURL=backup-lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-lib.d.ts","sourceRoot":"","sources":["../src/backup-lib.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAgCF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAqRxG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAIlF"}
@@ -0,0 +1,280 @@
1
+ import { existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from "node:fs";
2
+ import { writeFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import postgres from "postgres";
5
+ function timestamp(date = new Date()) {
6
+ const pad = (n) => String(n).padStart(2, "0");
7
+ return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`;
8
+ }
9
+ function pruneOldBackups(backupDir, retentionDays, filenamePrefix) {
10
+ if (!existsSync(backupDir))
11
+ return 0;
12
+ const safeRetention = Math.max(1, Math.trunc(retentionDays));
13
+ const cutoff = Date.now() - safeRetention * 24 * 60 * 60 * 1000;
14
+ let pruned = 0;
15
+ for (const name of readdirSync(backupDir)) {
16
+ if (!name.startsWith(`${filenamePrefix}-`) || !name.endsWith(".sql"))
17
+ continue;
18
+ const fullPath = resolve(backupDir, name);
19
+ const stat = statSync(fullPath);
20
+ if (stat.mtimeMs < cutoff) {
21
+ unlinkSync(fullPath);
22
+ pruned++;
23
+ }
24
+ }
25
+ return pruned;
26
+ }
27
+ function formatBackupSize(sizeBytes) {
28
+ if (sizeBytes < 1024)
29
+ return `${sizeBytes}B`;
30
+ if (sizeBytes < 1024 * 1024)
31
+ return `${(sizeBytes / 1024).toFixed(1)}K`;
32
+ return `${(sizeBytes / (1024 * 1024)).toFixed(1)}M`;
33
+ }
34
+ export async function runDatabaseBackup(opts) {
35
+ const filenamePrefix = opts.filenamePrefix ?? "paperclip";
36
+ const retentionDays = Math.max(1, Math.trunc(opts.retentionDays));
37
+ const connectTimeout = Math.max(1, Math.trunc(opts.connectTimeoutSeconds ?? 5));
38
+ const sql = postgres(opts.connectionString, { max: 1, connect_timeout: connectTimeout });
39
+ try {
40
+ await sql `SELECT 1`;
41
+ const lines = [];
42
+ const emit = (line) => lines.push(line);
43
+ emit("-- Paperclip database backup");
44
+ emit(`-- Created: ${new Date().toISOString()}`);
45
+ emit("");
46
+ emit("BEGIN;");
47
+ emit("");
48
+ // Get all enums
49
+ const enums = await sql `
50
+ SELECT t.typname, array_agg(e.enumlabel ORDER BY e.enumsortorder) AS labels
51
+ FROM pg_type t
52
+ JOIN pg_enum e ON t.oid = e.enumtypid
53
+ JOIN pg_namespace n ON t.typnamespace = n.oid
54
+ WHERE n.nspname = 'public'
55
+ GROUP BY t.typname
56
+ ORDER BY t.typname
57
+ `;
58
+ for (const e of enums) {
59
+ const labels = e.labels.map((l) => `'${l.replace(/'/g, "''")}'`).join(", ");
60
+ emit(`CREATE TYPE "public"."${e.typname}" AS ENUM (${labels});`);
61
+ }
62
+ if (enums.length > 0)
63
+ emit("");
64
+ // Get tables in dependency order (referenced tables first)
65
+ const tables = await sql `
66
+ SELECT c.relname AS tablename
67
+ FROM pg_class c
68
+ JOIN pg_namespace n ON n.oid = c.relnamespace
69
+ WHERE n.nspname = 'public'
70
+ AND c.relkind = 'r'
71
+ AND c.relname != '__drizzle_migrations'
72
+ ORDER BY c.relname
73
+ `;
74
+ // Get full CREATE TABLE DDL via column info
75
+ for (const { tablename } of tables) {
76
+ const columns = await sql `
77
+ SELECT column_name, data_type, udt_name, is_nullable, column_default,
78
+ character_maximum_length, numeric_precision, numeric_scale
79
+ FROM information_schema.columns
80
+ WHERE table_schema = 'public' AND table_name = ${tablename}
81
+ ORDER BY ordinal_position
82
+ `;
83
+ emit(`-- Table: ${tablename}`);
84
+ emit(`DROP TABLE IF EXISTS "${tablename}" CASCADE;`);
85
+ const colDefs = [];
86
+ for (const col of columns) {
87
+ let typeStr;
88
+ if (col.data_type === "USER-DEFINED") {
89
+ typeStr = `"${col.udt_name}"`;
90
+ }
91
+ else if (col.data_type === "ARRAY") {
92
+ typeStr = `${col.udt_name.replace(/^_/, "")}[]`;
93
+ }
94
+ else if (col.data_type === "character varying") {
95
+ typeStr = col.character_maximum_length
96
+ ? `varchar(${col.character_maximum_length})`
97
+ : "varchar";
98
+ }
99
+ else if (col.data_type === "numeric" && col.numeric_precision != null) {
100
+ typeStr =
101
+ col.numeric_scale != null
102
+ ? `numeric(${col.numeric_precision}, ${col.numeric_scale})`
103
+ : `numeric(${col.numeric_precision})`;
104
+ }
105
+ else {
106
+ typeStr = col.data_type;
107
+ }
108
+ let def = ` "${col.column_name}" ${typeStr}`;
109
+ if (col.column_default != null)
110
+ def += ` DEFAULT ${col.column_default}`;
111
+ if (col.is_nullable === "NO")
112
+ def += " NOT NULL";
113
+ colDefs.push(def);
114
+ }
115
+ // Primary key
116
+ const pk = await sql `
117
+ SELECT c.conname AS constraint_name,
118
+ array_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS column_names
119
+ FROM pg_constraint c
120
+ JOIN pg_class t ON t.oid = c.conrelid
121
+ JOIN pg_namespace n ON n.oid = t.relnamespace
122
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
123
+ WHERE n.nspname = 'public' AND t.relname = ${tablename} AND c.contype = 'p'
124
+ GROUP BY c.conname
125
+ `;
126
+ for (const p of pk) {
127
+ const cols = p.column_names.map((c) => `"${c}"`).join(", ");
128
+ colDefs.push(` CONSTRAINT "${p.constraint_name}" PRIMARY KEY (${cols})`);
129
+ }
130
+ emit(`CREATE TABLE "${tablename}" (`);
131
+ emit(colDefs.join(",\n"));
132
+ emit(");");
133
+ emit("");
134
+ }
135
+ // Foreign keys (after all tables created)
136
+ const fks = await sql `
137
+ SELECT
138
+ c.conname AS constraint_name,
139
+ src.relname AS source_table,
140
+ array_agg(sa.attname ORDER BY array_position(c.conkey, sa.attnum)) AS source_columns,
141
+ tgt.relname AS target_table,
142
+ array_agg(ta.attname ORDER BY array_position(c.confkey, ta.attnum)) AS target_columns,
143
+ CASE c.confupdtype WHEN 'a' THEN 'NO ACTION' WHEN 'r' THEN 'RESTRICT' WHEN 'c' THEN 'CASCADE' WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT' END AS update_rule,
144
+ CASE c.confdeltype WHEN 'a' THEN 'NO ACTION' WHEN 'r' THEN 'RESTRICT' WHEN 'c' THEN 'CASCADE' WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT' END AS delete_rule
145
+ FROM pg_constraint c
146
+ JOIN pg_class src ON src.oid = c.conrelid
147
+ JOIN pg_class tgt ON tgt.oid = c.confrelid
148
+ JOIN pg_namespace n ON n.oid = src.relnamespace
149
+ JOIN pg_attribute sa ON sa.attrelid = src.oid AND sa.attnum = ANY(c.conkey)
150
+ JOIN pg_attribute ta ON ta.attrelid = tgt.oid AND ta.attnum = ANY(c.confkey)
151
+ WHERE c.contype = 'f' AND n.nspname = 'public'
152
+ GROUP BY c.conname, src.relname, tgt.relname, c.confupdtype, c.confdeltype
153
+ ORDER BY src.relname, c.conname
154
+ `;
155
+ if (fks.length > 0) {
156
+ emit("-- Foreign keys");
157
+ for (const fk of fks) {
158
+ const srcCols = fk.source_columns.map((c) => `"${c}"`).join(", ");
159
+ const tgtCols = fk.target_columns.map((c) => `"${c}"`).join(", ");
160
+ emit(`ALTER TABLE "${fk.source_table}" ADD CONSTRAINT "${fk.constraint_name}" FOREIGN KEY (${srcCols}) REFERENCES "${fk.target_table}" (${tgtCols}) ON UPDATE ${fk.update_rule} ON DELETE ${fk.delete_rule};`);
161
+ }
162
+ emit("");
163
+ }
164
+ // Unique constraints
165
+ const uniques = await sql `
166
+ SELECT c.conname AS constraint_name,
167
+ t.relname AS tablename,
168
+ array_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS column_names
169
+ FROM pg_constraint c
170
+ JOIN pg_class t ON t.oid = c.conrelid
171
+ JOIN pg_namespace n ON n.oid = t.relnamespace
172
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
173
+ WHERE n.nspname = 'public' AND c.contype = 'u'
174
+ GROUP BY c.conname, t.relname
175
+ ORDER BY t.relname, c.conname
176
+ `;
177
+ if (uniques.length > 0) {
178
+ emit("-- Unique constraints");
179
+ for (const u of uniques) {
180
+ const cols = u.column_names.map((c) => `"${c}"`).join(", ");
181
+ emit(`ALTER TABLE "${u.tablename}" ADD CONSTRAINT "${u.constraint_name}" UNIQUE (${cols});`);
182
+ }
183
+ emit("");
184
+ }
185
+ // Indexes (non-primary, non-unique-constraint)
186
+ const indexes = await sql `
187
+ SELECT indexdef
188
+ FROM pg_indexes
189
+ WHERE schemaname = 'public'
190
+ AND indexname NOT IN (
191
+ SELECT conname FROM pg_constraint
192
+ WHERE connamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')
193
+ )
194
+ ORDER BY tablename, indexname
195
+ `;
196
+ if (indexes.length > 0) {
197
+ emit("-- Indexes");
198
+ for (const idx of indexes) {
199
+ emit(`${idx.indexdef};`);
200
+ }
201
+ emit("");
202
+ }
203
+ // Dump data for each table
204
+ for (const { tablename } of tables) {
205
+ const count = await sql `
206
+ SELECT count(*)::int AS n FROM ${sql(tablename)}
207
+ `;
208
+ if ((count[0]?.n ?? 0) === 0)
209
+ continue;
210
+ // Get column info for this table
211
+ const cols = await sql `
212
+ SELECT column_name, data_type
213
+ FROM information_schema.columns
214
+ WHERE table_schema = 'public' AND table_name = ${tablename}
215
+ ORDER BY ordinal_position
216
+ `;
217
+ const colNames = cols.map((c) => `"${c.column_name}"`).join(", ");
218
+ emit(`-- Data for: ${tablename} (${count[0].n} rows)`);
219
+ const rows = await sql `SELECT * FROM ${sql(tablename)}`.values();
220
+ for (const row of rows) {
221
+ const values = row.map((val) => {
222
+ if (val === null || val === undefined)
223
+ return "NULL";
224
+ if (typeof val === "boolean")
225
+ return val ? "true" : "false";
226
+ if (typeof val === "number")
227
+ return String(val);
228
+ if (val instanceof Date)
229
+ return `'${val.toISOString()}'`;
230
+ if (typeof val === "object")
231
+ return `'${JSON.stringify(val).replace(/'/g, "''")}'`;
232
+ return `'${String(val).replace(/'/g, "''")}'`;
233
+ });
234
+ emit(`INSERT INTO "${tablename}" (${colNames}) VALUES (${values.join(", ")});`);
235
+ }
236
+ emit("");
237
+ }
238
+ // Sequence values
239
+ const sequences = await sql `
240
+ SELECT sequence_name
241
+ FROM information_schema.sequences
242
+ WHERE sequence_schema = 'public'
243
+ ORDER BY sequence_name
244
+ `;
245
+ if (sequences.length > 0) {
246
+ emit("-- Sequence values");
247
+ for (const seq of sequences) {
248
+ const val = await sql `
249
+ SELECT last_value::text FROM ${sql(seq.sequence_name)}
250
+ `;
251
+ if (val[0]) {
252
+ emit(`SELECT setval('"${seq.sequence_name}"', ${val[0].last_value});`);
253
+ }
254
+ }
255
+ emit("");
256
+ }
257
+ emit("COMMIT;");
258
+ emit("");
259
+ // Write the backup file
260
+ mkdirSync(opts.backupDir, { recursive: true });
261
+ const backupFile = resolve(opts.backupDir, `${filenamePrefix}-${timestamp()}.sql`);
262
+ await writeFile(backupFile, lines.join("\n"), "utf8");
263
+ const sizeBytes = statSync(backupFile).size;
264
+ const prunedCount = pruneOldBackups(opts.backupDir, retentionDays, filenamePrefix);
265
+ return {
266
+ backupFile,
267
+ sizeBytes,
268
+ prunedCount,
269
+ };
270
+ }
271
+ finally {
272
+ await sql.end();
273
+ }
274
+ }
275
+ export function formatDatabaseBackupResult(result) {
276
+ const size = formatBackupSize(result.sizeBytes);
277
+ const pruned = result.prunedCount > 0 ? `; pruned ${result.prunedCount} old backup(s)` : "";
278
+ return `${result.backupFile} (${size}${pruned})`;
279
+ }
280
+ //# sourceMappingURL=backup-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-lib.js","sourceRoot":"","sources":["../src/backup-lib.ts"],"names":[],"mappings":"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"}