@tickernelz/paperclip-pro-db 2026.1006.0 → 2026.1006.2
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/agent-instruction-migration.test.d.ts +2 -0
- package/dist/agent-instruction-migration.test.d.ts.map +1 -0
- package/dist/agent-instruction-migration.test.js +141 -0
- package/dist/agent-instruction-migration.test.js.map +1 -0
- package/dist/client-disconnect-replay.test.d.ts +2 -0
- package/dist/client-disconnect-replay.test.d.ts.map +1 -0
- package/dist/client-disconnect-replay.test.js +182 -0
- package/dist/client-disconnect-replay.test.js.map +1 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +25 -5
- package/dist/client.js.map +1 -1
- package/dist/connections-v3-schema-core-migration.test.js +13 -0
- package/dist/connections-v3-schema-core-migration.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/0291_petite_genesis.sql +1 -0
- package/dist/migrations/0292_heavy_oracle.sql +1 -0
- package/dist/migrations/0293_complete_alice.sql +13 -0
- package/dist/migrations/0294_serious_tinkerer.sql +61 -0
- package/dist/migrations/0295_glorious_jamie_braddock.sql +36 -0
- package/dist/migrations/0296_drop_user_keyboard_shortcuts.sql +5 -0
- package/dist/migrations/0297_browser_use_cloud.sql +155 -0
- package/dist/migrations/0298_conscious_secret_warriors.sql +119 -0
- package/dist/migrations/0299_powerful_devos.sql +1 -0
- package/dist/migrations/0300_broad_rattler.sql +1 -0
- package/dist/migrations/0301_chilly_marvel_apes.sql +1 -0
- package/dist/migrations/0302_public_captain_cross.sql +21 -0
- package/dist/migrations/0303_stiff_thaddeus_ross.sql +25 -0
- package/dist/migrations/0304_foamy_swordsman.sql +14 -0
- package/dist/migrations/0305_connection_agent_instructions.sql +16 -0
- package/dist/migrations/0306_absent_ser_duncan.sql +64 -0
- package/dist/migrations/meta/_journal.json +113 -1
- package/dist/schema/agent_api_keys.d.ts +4 -4
- package/dist/schema/agent_instruction_revisions.d.ts +740 -0
- package/dist/schema/agent_instruction_revisions.d.ts.map +1 -0
- package/dist/schema/agent_instruction_revisions.js +80 -0
- package/dist/schema/agent_instruction_revisions.js.map +1 -0
- package/dist/schema/agent_wakeup_requests.d.ts.map +1 -1
- package/dist/schema/agent_wakeup_requests.js +3 -0
- package/dist/schema/agent_wakeup_requests.js.map +1 -1
- package/dist/schema/ai_connection_routing.d.ts +448 -0
- package/dist/schema/ai_connection_routing.d.ts.map +1 -0
- package/dist/schema/ai_connection_routing.js +37 -0
- package/dist/schema/ai_connection_routing.js.map +1 -0
- package/dist/schema/assets.d.ts +1 -1
- package/dist/schema/assets.js +2 -2
- package/dist/schema/assets.js.map +1 -1
- package/dist/schema/browser_use.d.ts +745 -0
- package/dist/schema/browser_use.d.ts.map +1 -0
- package/dist/schema/browser_use.js +104 -0
- package/dist/schema/browser_use.js.map +1 -0
- package/dist/schema/chat_completion_deliveries.d.ts +308 -0
- package/dist/schema/chat_completion_deliveries.d.ts.map +1 -0
- package/dist/schema/chat_completion_deliveries.js +33 -0
- package/dist/schema/chat_completion_deliveries.js.map +1 -0
- package/dist/schema/company_secrets.d.ts +17 -0
- package/dist/schema/company_secrets.d.ts.map +1 -1
- package/dist/schema/company_secrets.js +1 -0
- package/dist/schema/company_secrets.js.map +1 -1
- package/dist/schema/company_skill_sources.d.ts +498 -0
- package/dist/schema/company_skill_sources.d.ts.map +1 -0
- package/dist/schema/company_skill_sources.js +43 -0
- package/dist/schema/company_skill_sources.js.map +1 -0
- package/dist/schema/company_skills.d.ts +2 -0
- package/dist/schema/company_skills.d.ts.map +1 -1
- package/dist/schema/company_skills.js.map +1 -1
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/issues.d.ts +17 -0
- package/dist/schema/issues.d.ts.map +1 -1
- package/dist/schema/issues.js +2 -1
- package/dist/schema/issues.js.map +1 -1
- package/dist/schema/resource_lifecycle_events.d.ts +115 -0
- package/dist/schema/resource_lifecycle_events.d.ts.map +1 -0
- package/dist/schema/resource_lifecycle_events.js +18 -0
- package/dist/schema/resource_lifecycle_events.js.map +1 -0
- package/dist/schema/runner_api_response_reservations.d.ts +110 -0
- package/dist/schema/runner_api_response_reservations.d.ts.map +1 -0
- package/dist/schema/runner_api_response_reservations.js +13 -0
- package/dist/schema/runner_api_response_reservations.js.map +1 -0
- package/dist/schema/tool_access.d.ts +35 -2
- package/dist/schema/tool_access.d.ts.map +1 -1
- package/dist/schema/tool_access.js +2 -0
- package/dist/schema/tool_access.js.map +1 -1
- package/dist/schema/tool_connection_app_snapshots.d.ts +184 -0
- package/dist/schema/tool_connection_app_snapshots.d.ts.map +1 -0
- package/dist/schema/tool_connection_app_snapshots.js +20 -0
- package/dist/schema/tool_connection_app_snapshots.js.map +1 -0
- package/dist/schema/tool_connection_app_syncs.d.ts +215 -0
- package/dist/schema/tool_connection_app_syncs.d.ts.map +1 -0
- package/dist/schema/tool_connection_app_syncs.js +22 -0
- package/dist/schema/tool_connection_app_syncs.js.map +1 -0
- package/package.json +3 -3
- package/dist/transient-write-retry.d.ts +0 -4
- package/dist/transient-write-retry.d.ts.map +0 -1
- package/dist/transient-write-retry.js +0 -79
- package/dist/transient-write-retry.js.map +0 -1
- package/dist/transient-write-retry.test.d.ts +0 -2
- package/dist/transient-write-retry.test.d.ts.map +0 -1
- package/dist/transient-write-retry.test.js +0 -166
- package/dist/transient-write-retry.test.js.map +0 -1
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/** One bounded discovery lease per viewing human and saved credential identity. */
|
|
2
|
+
export declare const toolConnectionAppSyncs: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
3
|
+
name: "tool_connection_app_syncs";
|
|
4
|
+
schema: undefined;
|
|
5
|
+
columns: {
|
|
6
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
7
|
+
name: "id";
|
|
8
|
+
tableName: "tool_connection_app_syncs";
|
|
9
|
+
dataType: "string";
|
|
10
|
+
columnType: "PgUUID";
|
|
11
|
+
data: string;
|
|
12
|
+
driverParam: string;
|
|
13
|
+
notNull: true;
|
|
14
|
+
hasDefault: true;
|
|
15
|
+
isPrimaryKey: true;
|
|
16
|
+
isAutoincrement: false;
|
|
17
|
+
hasRuntimeDefault: false;
|
|
18
|
+
enumValues: undefined;
|
|
19
|
+
baseColumn: never;
|
|
20
|
+
identity: undefined;
|
|
21
|
+
generated: undefined;
|
|
22
|
+
}, {}, {}>;
|
|
23
|
+
companyId: import("drizzle-orm/pg-core").PgColumn<{
|
|
24
|
+
name: "company_id";
|
|
25
|
+
tableName: "tool_connection_app_syncs";
|
|
26
|
+
dataType: "string";
|
|
27
|
+
columnType: "PgUUID";
|
|
28
|
+
data: string;
|
|
29
|
+
driverParam: string;
|
|
30
|
+
notNull: true;
|
|
31
|
+
hasDefault: false;
|
|
32
|
+
isPrimaryKey: false;
|
|
33
|
+
isAutoincrement: false;
|
|
34
|
+
hasRuntimeDefault: false;
|
|
35
|
+
enumValues: undefined;
|
|
36
|
+
baseColumn: never;
|
|
37
|
+
identity: undefined;
|
|
38
|
+
generated: undefined;
|
|
39
|
+
}, {}, {}>;
|
|
40
|
+
connectionId: import("drizzle-orm/pg-core").PgColumn<{
|
|
41
|
+
name: "connection_id";
|
|
42
|
+
tableName: "tool_connection_app_syncs";
|
|
43
|
+
dataType: "string";
|
|
44
|
+
columnType: "PgUUID";
|
|
45
|
+
data: string;
|
|
46
|
+
driverParam: string;
|
|
47
|
+
notNull: true;
|
|
48
|
+
hasDefault: false;
|
|
49
|
+
isPrimaryKey: false;
|
|
50
|
+
isAutoincrement: false;
|
|
51
|
+
hasRuntimeDefault: false;
|
|
52
|
+
enumValues: undefined;
|
|
53
|
+
baseColumn: never;
|
|
54
|
+
identity: undefined;
|
|
55
|
+
generated: undefined;
|
|
56
|
+
}, {}, {}>;
|
|
57
|
+
userId: import("drizzle-orm/pg-core").PgColumn<{
|
|
58
|
+
name: "user_id";
|
|
59
|
+
tableName: "tool_connection_app_syncs";
|
|
60
|
+
dataType: "string";
|
|
61
|
+
columnType: "PgText";
|
|
62
|
+
data: string;
|
|
63
|
+
driverParam: string;
|
|
64
|
+
notNull: true;
|
|
65
|
+
hasDefault: false;
|
|
66
|
+
isPrimaryKey: false;
|
|
67
|
+
isAutoincrement: false;
|
|
68
|
+
hasRuntimeDefault: false;
|
|
69
|
+
enumValues: [string, ...string[]];
|
|
70
|
+
baseColumn: never;
|
|
71
|
+
identity: undefined;
|
|
72
|
+
generated: undefined;
|
|
73
|
+
}, {}, {}>;
|
|
74
|
+
credentialKey: import("drizzle-orm/pg-core").PgColumn<{
|
|
75
|
+
name: "credential_key";
|
|
76
|
+
tableName: "tool_connection_app_syncs";
|
|
77
|
+
dataType: "string";
|
|
78
|
+
columnType: "PgText";
|
|
79
|
+
data: string;
|
|
80
|
+
driverParam: string;
|
|
81
|
+
notNull: true;
|
|
82
|
+
hasDefault: false;
|
|
83
|
+
isPrimaryKey: false;
|
|
84
|
+
isAutoincrement: false;
|
|
85
|
+
hasRuntimeDefault: false;
|
|
86
|
+
enumValues: [string, ...string[]];
|
|
87
|
+
baseColumn: never;
|
|
88
|
+
identity: undefined;
|
|
89
|
+
generated: undefined;
|
|
90
|
+
}, {}, {}>;
|
|
91
|
+
leaseId: import("drizzle-orm/pg-core").PgColumn<{
|
|
92
|
+
name: "lease_id";
|
|
93
|
+
tableName: "tool_connection_app_syncs";
|
|
94
|
+
dataType: "string";
|
|
95
|
+
columnType: "PgUUID";
|
|
96
|
+
data: string;
|
|
97
|
+
driverParam: string;
|
|
98
|
+
notNull: true;
|
|
99
|
+
hasDefault: false;
|
|
100
|
+
isPrimaryKey: false;
|
|
101
|
+
isAutoincrement: false;
|
|
102
|
+
hasRuntimeDefault: false;
|
|
103
|
+
enumValues: undefined;
|
|
104
|
+
baseColumn: never;
|
|
105
|
+
identity: undefined;
|
|
106
|
+
generated: undefined;
|
|
107
|
+
}, {}, {}>;
|
|
108
|
+
status: import("drizzle-orm/pg-core").PgColumn<{
|
|
109
|
+
name: "status";
|
|
110
|
+
tableName: "tool_connection_app_syncs";
|
|
111
|
+
dataType: "string";
|
|
112
|
+
columnType: "PgText";
|
|
113
|
+
data: "error" | "ready" | "syncing" | "unsupported";
|
|
114
|
+
driverParam: string;
|
|
115
|
+
notNull: true;
|
|
116
|
+
hasDefault: false;
|
|
117
|
+
isPrimaryKey: false;
|
|
118
|
+
isAutoincrement: false;
|
|
119
|
+
hasRuntimeDefault: false;
|
|
120
|
+
enumValues: [string, ...string[]];
|
|
121
|
+
baseColumn: never;
|
|
122
|
+
identity: undefined;
|
|
123
|
+
generated: undefined;
|
|
124
|
+
}, {}, {
|
|
125
|
+
$type: "error" | "ready" | "syncing" | "unsupported";
|
|
126
|
+
}>;
|
|
127
|
+
checked: import("drizzle-orm/pg-core").PgColumn<{
|
|
128
|
+
name: "checked";
|
|
129
|
+
tableName: "tool_connection_app_syncs";
|
|
130
|
+
dataType: "number";
|
|
131
|
+
columnType: "PgInteger";
|
|
132
|
+
data: number;
|
|
133
|
+
driverParam: string | number;
|
|
134
|
+
notNull: true;
|
|
135
|
+
hasDefault: true;
|
|
136
|
+
isPrimaryKey: false;
|
|
137
|
+
isAutoincrement: false;
|
|
138
|
+
hasRuntimeDefault: false;
|
|
139
|
+
enumValues: undefined;
|
|
140
|
+
baseColumn: never;
|
|
141
|
+
identity: undefined;
|
|
142
|
+
generated: undefined;
|
|
143
|
+
}, {}, {}>;
|
|
144
|
+
total: import("drizzle-orm/pg-core").PgColumn<{
|
|
145
|
+
name: "total";
|
|
146
|
+
tableName: "tool_connection_app_syncs";
|
|
147
|
+
dataType: "number";
|
|
148
|
+
columnType: "PgInteger";
|
|
149
|
+
data: number;
|
|
150
|
+
driverParam: string | number;
|
|
151
|
+
notNull: true;
|
|
152
|
+
hasDefault: true;
|
|
153
|
+
isPrimaryKey: false;
|
|
154
|
+
isAutoincrement: false;
|
|
155
|
+
hasRuntimeDefault: false;
|
|
156
|
+
enumValues: undefined;
|
|
157
|
+
baseColumn: never;
|
|
158
|
+
identity: undefined;
|
|
159
|
+
generated: undefined;
|
|
160
|
+
}, {}, {}>;
|
|
161
|
+
failed: import("drizzle-orm/pg-core").PgColumn<{
|
|
162
|
+
name: "failed";
|
|
163
|
+
tableName: "tool_connection_app_syncs";
|
|
164
|
+
dataType: "number";
|
|
165
|
+
columnType: "PgInteger";
|
|
166
|
+
data: number;
|
|
167
|
+
driverParam: string | number;
|
|
168
|
+
notNull: true;
|
|
169
|
+
hasDefault: true;
|
|
170
|
+
isPrimaryKey: false;
|
|
171
|
+
isAutoincrement: false;
|
|
172
|
+
hasRuntimeDefault: false;
|
|
173
|
+
enumValues: undefined;
|
|
174
|
+
baseColumn: never;
|
|
175
|
+
identity: undefined;
|
|
176
|
+
generated: undefined;
|
|
177
|
+
}, {}, {}>;
|
|
178
|
+
lastCompletedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
179
|
+
name: "last_completed_at";
|
|
180
|
+
tableName: "tool_connection_app_syncs";
|
|
181
|
+
dataType: "date";
|
|
182
|
+
columnType: "PgTimestamp";
|
|
183
|
+
data: Date;
|
|
184
|
+
driverParam: string;
|
|
185
|
+
notNull: false;
|
|
186
|
+
hasDefault: false;
|
|
187
|
+
isPrimaryKey: false;
|
|
188
|
+
isAutoincrement: false;
|
|
189
|
+
hasRuntimeDefault: false;
|
|
190
|
+
enumValues: undefined;
|
|
191
|
+
baseColumn: never;
|
|
192
|
+
identity: undefined;
|
|
193
|
+
generated: undefined;
|
|
194
|
+
}, {}, {}>;
|
|
195
|
+
updatedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
196
|
+
name: "updated_at";
|
|
197
|
+
tableName: "tool_connection_app_syncs";
|
|
198
|
+
dataType: "date";
|
|
199
|
+
columnType: "PgTimestamp";
|
|
200
|
+
data: Date;
|
|
201
|
+
driverParam: string;
|
|
202
|
+
notNull: true;
|
|
203
|
+
hasDefault: true;
|
|
204
|
+
isPrimaryKey: false;
|
|
205
|
+
isAutoincrement: false;
|
|
206
|
+
hasRuntimeDefault: false;
|
|
207
|
+
enumValues: undefined;
|
|
208
|
+
baseColumn: never;
|
|
209
|
+
identity: undefined;
|
|
210
|
+
generated: undefined;
|
|
211
|
+
}, {}, {}>;
|
|
212
|
+
};
|
|
213
|
+
dialect: 'pg';
|
|
214
|
+
}>;
|
|
215
|
+
//# sourceMappingURL=tool_connection_app_syncs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_connection_app_syncs.d.ts","sourceRoot":"","sources":["../../src/schema/tool_connection_app_syncs.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBjC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { foreignKey, integer, pgTable, text, timestamp, uniqueIndex, uuid } from "drizzle-orm/pg-core";
|
|
2
|
+
import { companies } from "./companies.js";
|
|
3
|
+
import { toolConnections } from "./tool_access.js";
|
|
4
|
+
/** One bounded discovery lease per viewing human and saved credential identity. */
|
|
5
|
+
export const toolConnectionAppSyncs = pgTable("tool_connection_app_syncs", {
|
|
6
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
7
|
+
companyId: uuid("company_id").notNull().references(() => companies.id, { onDelete: "cascade" }),
|
|
8
|
+
connectionId: uuid("connection_id").notNull(),
|
|
9
|
+
userId: text("user_id").notNull(),
|
|
10
|
+
credentialKey: text("credential_key").notNull(),
|
|
11
|
+
leaseId: uuid("lease_id").notNull(),
|
|
12
|
+
status: text("status").$type().notNull(),
|
|
13
|
+
checked: integer("checked").notNull().default(0),
|
|
14
|
+
total: integer("total").notNull().default(0),
|
|
15
|
+
failed: integer("failed").notNull().default(0),
|
|
16
|
+
lastCompletedAt: timestamp("last_completed_at", { withTimezone: true }),
|
|
17
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
18
|
+
}, table => [
|
|
19
|
+
uniqueIndex("tool_connection_app_syncs_owner_key_uq").on(table.companyId, table.connectionId, table.userId, table.credentialKey),
|
|
20
|
+
foreignKey({ columns: [table.companyId, table.connectionId], foreignColumns: [toolConnections.companyId, toolConnections.id], name: "tool_connection_app_syncs_company_connection_fk" }).onDelete("cascade"),
|
|
21
|
+
]);
|
|
22
|
+
//# sourceMappingURL=tool_connection_app_syncs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_connection_app_syncs.js","sourceRoot":"","sources":["../../src/schema/tool_connection_app_syncs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC,2BAA2B,EAAE;IACzE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/F,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACjC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACnC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAiD,CAAC,OAAO,EAAE;IACvF,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,eAAe,EAAE,SAAS,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACvE,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,EAAE,KAAK,CAAC,EAAE,CAAC;IACV,WAAW,CAAC,wCAAwC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC;IAChI,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;CAC7M,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tickernelz/paperclip-pro-db",
|
|
3
|
-
"version": "2026.1006.
|
|
3
|
+
"version": "2026.1006.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://github.com/tickernelz/paperclip-pro",
|
|
6
6
|
"bugs": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"seed": "tsx src/seed.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@tickernelz/paperclip-pro-shared": "2026.1006.
|
|
42
|
+
"@tickernelz/paperclip-pro-shared": "2026.1006.2",
|
|
43
43
|
"drizzle-orm": "^0.45.2",
|
|
44
44
|
"embedded-postgres": "^18.1.0-beta.16",
|
|
45
45
|
"postgres": "^3.4.9"
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^24.0.0",
|
|
49
49
|
"drizzle-kit": "^0.31.10",
|
|
50
|
-
"tsx": "^4.23.
|
|
50
|
+
"tsx": "^4.23.15",
|
|
51
51
|
"typescript": "^7.0.2",
|
|
52
52
|
"vitest": "^4.1.11"
|
|
53
53
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-write-retry.d.ts","sourceRoot":"","sources":["../src/transient-write-retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAuBpC,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMlE;AAMD,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAsDhE"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Replays a query whose bytes never reached the server.
|
|
3
|
-
*
|
|
4
|
-
* Behind a connection pooler (Neon's PgBouncer), the server side of an idle
|
|
5
|
-
* connection can be recycled while the client still holds the socket. The
|
|
6
|
-
* next query then fails at the socket write — postgres.js reports it as
|
|
7
|
-
* `write CONNECTION_CLOSED <host>:<port>` with `code: "CONNECTION_CLOSED"`.
|
|
8
|
-
* Because the write itself failed, the server never saw the query, so
|
|
9
|
-
* replaying it on a fresh connection cannot double-execute anything — the
|
|
10
|
-
* replay is safe for reads and writes alike. Every other error, including a
|
|
11
|
-
* connection lost mid-query (where the server may have acted), propagates
|
|
12
|
-
* untouched.
|
|
13
|
-
*
|
|
14
|
-
* Drizzle routes every non-transactional query through the root client's
|
|
15
|
-
* `unsafe`; queries inside `db.transaction()` run on the scoped client
|
|
16
|
-
* `sql.begin()` hands out, which this wrapper deliberately does not touch —
|
|
17
|
-
* a transaction that loses its connection must abort, not replay.
|
|
18
|
-
*/
|
|
19
|
-
const TRANSIENT_WRITE_ATTEMPTS = 3;
|
|
20
|
-
const TRANSIENT_WRITE_BACKOFF_MS = 50;
|
|
21
|
-
export function isTransientWritePhaseError(error) {
|
|
22
|
-
return (error instanceof Error &&
|
|
23
|
-
error.code === "CONNECTION_CLOSED" &&
|
|
24
|
-
error.message.startsWith("write CONNECTION_CLOSED"));
|
|
25
|
-
}
|
|
26
|
-
export function withTransientWriteRetry(sql) {
|
|
27
|
-
const runWithRetry = async (execute) => {
|
|
28
|
-
for (let attempt = 0;; attempt++) {
|
|
29
|
-
try {
|
|
30
|
-
return await execute();
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
if (attempt >= TRANSIENT_WRITE_ATTEMPTS - 1 || !isTransientWritePhaseError(error)) {
|
|
34
|
-
throw error;
|
|
35
|
-
}
|
|
36
|
-
await new Promise((resolve) => setTimeout(resolve, TRANSIENT_WRITE_BACKOFF_MS * (attempt + 1)));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
return new Proxy(sql, {
|
|
41
|
-
get(target, property, receiver) {
|
|
42
|
-
if (property !== "unsafe")
|
|
43
|
-
return Reflect.get(target, property, receiver);
|
|
44
|
-
const unsafe = target.unsafe.bind(target);
|
|
45
|
-
const retryingUnsafe = (query, parameters, ...rest) => {
|
|
46
|
-
if (rest.length > 0) {
|
|
47
|
-
// An options argument selects driver surfaces this wrapper does not
|
|
48
|
-
// model; leave those calls exactly as they were.
|
|
49
|
-
return target.unsafe(query, parameters, ...rest);
|
|
50
|
-
}
|
|
51
|
-
// postgres.js queries execute lazily, exactly once, and `.values()`
|
|
52
|
-
// selects the row shape of that one execution rather than starting a
|
|
53
|
-
// second one. Mirror both halves: the execution starts when a consumer
|
|
54
|
-
// first settles the query, `.values()` marks the shape and returns the
|
|
55
|
-
// same pending query, and every later handler joins the same run. A
|
|
56
|
-
// shape chosen after the run started cannot change it — the same as
|
|
57
|
-
// the driver, and the reason a mutation can never execute twice here.
|
|
58
|
-
let started;
|
|
59
|
-
let wantsValues = false;
|
|
60
|
-
const runOnce = () => (started ??= runWithRetry(() => wantsValues
|
|
61
|
-
? unsafe(query, parameters).values()
|
|
62
|
-
: Promise.resolve(unsafe(query, parameters))));
|
|
63
|
-
const pending = {
|
|
64
|
-
then: (onFulfilled, onRejected) => runOnce().then(onFulfilled, onRejected),
|
|
65
|
-
catch: (onRejected) => runOnce().catch(onRejected),
|
|
66
|
-
finally: (onFinally) => runOnce().finally(onFinally),
|
|
67
|
-
values: () => {
|
|
68
|
-
if (!started)
|
|
69
|
-
wantsValues = true;
|
|
70
|
-
return pending;
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
return pending;
|
|
74
|
-
};
|
|
75
|
-
return retryingUnsafe;
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=transient-write-retry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-write-retry.js","sourceRoot":"","sources":["../src/transient-write-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-write-retry.test.d.ts","sourceRoot":"","sources":["../src/transient-write-retry.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import net from "node:net";
|
|
2
|
-
import { sql as drizzleSql } from "drizzle-orm";
|
|
3
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
-
import { closeRegisteredClients, createDb } from "./client.js";
|
|
5
|
-
import { isTransientWritePhaseError, withTransientWriteRetry } from "./transient-write-retry.js";
|
|
6
|
-
/** The exact shape postgres.js raises when the socket write fails. */
|
|
7
|
-
function writeClosedError() {
|
|
8
|
-
const error = new Error("write CONNECTION_CLOSED db.example.internal:5432");
|
|
9
|
-
error.code = "CONNECTION_CLOSED";
|
|
10
|
-
return error;
|
|
11
|
-
}
|
|
12
|
-
/** A stub standing in for the root postgres.js client's `unsafe` surface. */
|
|
13
|
-
function stubSql(behavior) {
|
|
14
|
-
let calls = 0;
|
|
15
|
-
const state = {
|
|
16
|
-
get calls() {
|
|
17
|
-
return calls;
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
const unsafe = (_query, _parameters) => {
|
|
21
|
-
calls += 1;
|
|
22
|
-
const attempt = calls;
|
|
23
|
-
const shouldFail = attempt <= behavior.failures;
|
|
24
|
-
const outcome = () => shouldFail
|
|
25
|
-
? Promise.reject((behavior.error ?? writeClosedError)())
|
|
26
|
-
: Promise.resolve([{ attempt }]);
|
|
27
|
-
return {
|
|
28
|
-
then: (onFulfilled, onRejected) => outcome().then(onFulfilled, onRejected),
|
|
29
|
-
values: () => outcome().then(() => [[attempt]]),
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
const sql = { unsafe };
|
|
33
|
-
return { sql, state };
|
|
34
|
-
}
|
|
35
|
-
describe("isTransientWritePhaseError", () => {
|
|
36
|
-
it("matches only the write-phase connection-closed shape", () => {
|
|
37
|
-
expect(isTransientWritePhaseError(writeClosedError())).toBe(true);
|
|
38
|
-
const midQuery = new Error("read CONNECTION_CLOSED db.example.internal:5432");
|
|
39
|
-
midQuery.code = "CONNECTION_CLOSED";
|
|
40
|
-
expect(isTransientWritePhaseError(midQuery)).toBe(false);
|
|
41
|
-
const ended = new Error("write CONNECTION_ENDED db.example.internal:5432");
|
|
42
|
-
ended.code = "CONNECTION_ENDED";
|
|
43
|
-
expect(isTransientWritePhaseError(ended)).toBe(false);
|
|
44
|
-
expect(isTransientWritePhaseError(new Error("write CONNECTION_CLOSED x:1"))).toBe(false); // no code
|
|
45
|
-
expect(isTransientWritePhaseError(null)).toBe(false);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
describe("withTransientWriteRetry", () => {
|
|
49
|
-
it("replays a query whose socket write failed, and returns the replay's rows", async () => {
|
|
50
|
-
const { sql, state } = stubSql({ failures: 1 });
|
|
51
|
-
const rows = await withTransientWriteRetry(sql).unsafe("select 1", []);
|
|
52
|
-
expect(rows).toEqual([{ attempt: 2 }]);
|
|
53
|
-
expect(state.calls).toBe(2);
|
|
54
|
-
});
|
|
55
|
-
it("replays the .values() form drizzle uses", async () => {
|
|
56
|
-
const { sql, state } = stubSql({ failures: 2 });
|
|
57
|
-
const values = await withTransientWriteRetry(sql).unsafe("select 1", []).values();
|
|
58
|
-
expect(values).toEqual([[3]]);
|
|
59
|
-
expect(state.calls).toBe(3);
|
|
60
|
-
});
|
|
61
|
-
it("gives up after the attempt budget and surfaces the driver error", async () => {
|
|
62
|
-
const { sql, state } = stubSql({ failures: Number.POSITIVE_INFINITY });
|
|
63
|
-
await expect(withTransientWriteRetry(sql).unsafe("select 1", [])).rejects.toThrow("write CONNECTION_CLOSED");
|
|
64
|
-
expect(state.calls).toBe(3);
|
|
65
|
-
});
|
|
66
|
-
it("does not replay an error that may have reached the server", async () => {
|
|
67
|
-
const midQuery = () => {
|
|
68
|
-
const error = new Error("read CONNECTION_CLOSED db.example.internal:5432");
|
|
69
|
-
error.code = "CONNECTION_CLOSED";
|
|
70
|
-
return error;
|
|
71
|
-
};
|
|
72
|
-
const { sql, state } = stubSql({ failures: Number.POSITIVE_INFINITY, error: midQuery });
|
|
73
|
-
await expect(withTransientWriteRetry(sql).unsafe("select 1", [])).rejects.toThrow("read CONNECTION_CLOSED");
|
|
74
|
-
expect(state.calls).toBe(1);
|
|
75
|
-
});
|
|
76
|
-
it("runs one execution no matter how many handlers attach to the pending query", async () => {
|
|
77
|
-
const { sql, state } = stubSql({ failures: 0 });
|
|
78
|
-
const pending = withTransientWriteRetry(sql).unsafe("select 1", []);
|
|
79
|
-
await Promise.all([pending, pending.catch(() => undefined), pending.then((rows) => rows)]);
|
|
80
|
-
expect(state.calls).toBe(1);
|
|
81
|
-
});
|
|
82
|
-
it("never executes a query twice when a caller both awaits it and takes its values", async () => {
|
|
83
|
-
// `.values()` selects the row shape of the one execution, like the driver.
|
|
84
|
-
// Starting a second execution here would repeat a mutation's effect.
|
|
85
|
-
const { sql, state } = stubSql({ failures: 0 });
|
|
86
|
-
const pending = withTransientWriteRetry(sql).unsafe("insert into t values (1)", []);
|
|
87
|
-
const rows = await pending;
|
|
88
|
-
const values = await pending.values();
|
|
89
|
-
expect(state.calls).toBe(1);
|
|
90
|
-
expect(values).toBe(rows);
|
|
91
|
-
});
|
|
92
|
-
it("takes the values shape when it is chosen before the query runs", async () => {
|
|
93
|
-
const { sql, state } = stubSql({ failures: 0 });
|
|
94
|
-
const pending = withTransientWriteRetry(sql).unsafe("select 1", []);
|
|
95
|
-
expect(await pending.values()).toEqual([[1]]);
|
|
96
|
-
expect(state.calls).toBe(1);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe("createDb with the retrying client", () => {
|
|
100
|
-
// The same minimal wire-protocol fake as client-teardown-registry.test.ts:
|
|
101
|
-
// enough of the startup and query flow for drizzle to run a real query
|
|
102
|
-
// through the proxied client, proving the retry face is transparent.
|
|
103
|
-
function startFakePostgresServer() {
|
|
104
|
-
const authOk = Buffer.from([0x52, 0, 0, 0, 8, 0, 0, 0, 0]);
|
|
105
|
-
const readyForQuery = Buffer.from([0x5a, 0, 0, 0, 5, 0x49]);
|
|
106
|
-
const emptyQueryReply = Buffer.concat([
|
|
107
|
-
Buffer.from([0x31, 0, 0, 0, 4]),
|
|
108
|
-
Buffer.from([0x32, 0, 0, 0, 4]),
|
|
109
|
-
Buffer.from([0x54, 0, 0, 0, 6, 0, 0]),
|
|
110
|
-
Buffer.from([0x43, 0, 0, 0, 0x0d, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x20, 0x30, 0]),
|
|
111
|
-
]);
|
|
112
|
-
const server = net.createServer((socket) => {
|
|
113
|
-
let greeted = false;
|
|
114
|
-
socket.on("data", () => {
|
|
115
|
-
if (!greeted) {
|
|
116
|
-
greeted = true;
|
|
117
|
-
socket.write(Buffer.concat([authOk, readyForQuery]));
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
socket.write(Buffer.concat([emptyQueryReply, readyForQuery]));
|
|
121
|
-
});
|
|
122
|
-
socket.on("error", () => { });
|
|
123
|
-
});
|
|
124
|
-
return new Promise((resolve) => {
|
|
125
|
-
server.listen(0, "127.0.0.1", () => {
|
|
126
|
-
resolve({ server, port: server.address().port });
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
let server = null;
|
|
131
|
-
let url = null;
|
|
132
|
-
afterEach(async () => {
|
|
133
|
-
if (url)
|
|
134
|
-
await closeRegisteredClients(url);
|
|
135
|
-
if (server)
|
|
136
|
-
await new Promise((resolve) => server.close(resolve));
|
|
137
|
-
server = null;
|
|
138
|
-
url = null;
|
|
139
|
-
});
|
|
140
|
-
it("still answers ordinary drizzle queries through the proxy", async () => {
|
|
141
|
-
const started = await startFakePostgresServer();
|
|
142
|
-
server = started.server;
|
|
143
|
-
url = `postgres://test:test@127.0.0.1:${started.port}/test`;
|
|
144
|
-
const db = createDb(url, { connectTimeoutSeconds: 5, prepare: false });
|
|
145
|
-
await expect(db.execute(drizzleSql `select 0`)).resolves.toBeDefined();
|
|
146
|
-
});
|
|
147
|
-
it("leaves every other client surface reachable through the proxy", async () => {
|
|
148
|
-
// Drizzle itself only awaits `unsafe()` or takes its `.values()`, but the
|
|
149
|
-
// client is reachable as `db.$client`, and callers use it as a tagged
|
|
150
|
-
// template, open transactions on it, and end it. A wrapper that broke any
|
|
151
|
-
// of those would fail far from here, so pin them against the real driver.
|
|
152
|
-
const started = await startFakePostgresServer();
|
|
153
|
-
server = started.server;
|
|
154
|
-
url = `postgres://test:test@127.0.0.1:${started.port}/test`;
|
|
155
|
-
const db = createDb(url, { connectTimeoutSeconds: 5, prepare: false });
|
|
156
|
-
const client = db.$client;
|
|
157
|
-
await expect(client `select 1`).resolves.toBeDefined();
|
|
158
|
-
await expect(client.unsafe("select 1", [])).resolves.toBeDefined();
|
|
159
|
-
await expect(client.begin(async (tx) => {
|
|
160
|
-
await tx.unsafe("select 1", []);
|
|
161
|
-
return "transaction result";
|
|
162
|
-
})).resolves.toBe("transaction result");
|
|
163
|
-
await expect(client.end({ timeout: 1 })).resolves.toBeUndefined();
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
//# sourceMappingURL=transient-write-retry.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-write-retry.test.js","sourceRoot":"","sources":["../src/transient-write-retry.test.ts"],"names":[],"mappings":"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"}
|