@tickernelz/paperclip-pro-db 2026.1011.2 → 2026.1012.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/backup-lib.d.ts +2 -0
  2. package/dist/backup-lib.d.ts.map +1 -1
  3. package/dist/backup-lib.js +52 -15
  4. package/dist/backup-lib.js.map +1 -1
  5. package/dist/backup-lib.test.js +64 -2
  6. package/dist/backup-lib.test.js.map +1 -1
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +81 -42
  9. package/dist/client.js.map +1 -1
  10. package/dist/client.test.js +33 -0
  11. package/dist/client.test.js.map +1 -1
  12. package/dist/connections-v3-schema-core-migration.test.js +3 -0
  13. package/dist/connections-v3-schema-core-migration.test.js.map +1 -1
  14. package/dist/heartbeat-run-issue-privacy-migration.test.d.ts +2 -0
  15. package/dist/heartbeat-run-issue-privacy-migration.test.d.ts.map +1 -0
  16. package/dist/heartbeat-run-issue-privacy-migration.test.js +265 -0
  17. package/dist/heartbeat-run-issue-privacy-migration.test.js.map +1 -0
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/migrations/0315_chunky_chamber.sql +3 -0
  23. package/dist/migrations/0316_lumpy_maria_hill.sql +157 -0
  24. package/dist/migrations/0317_colossal_otto_octavius.sql +24 -0
  25. package/dist/migrations/0318_supreme_garia.sql +1 -0
  26. package/dist/migrations/0319_curvy_shadow_king.sql +27 -0
  27. package/dist/migrations/0320_chubby_vin_gonzales.sql +7 -0
  28. package/dist/migrations/0321_familiar_titania.sql +4 -0
  29. package/dist/migrations/0322_cool_naoko.sql +3 -0
  30. package/dist/migrations/0323_whole_steel_serpent.sql +20 -0
  31. package/dist/migrations/0324_loving_the_hood.sql +77 -0
  32. package/dist/migrations/0325_agent_commentary.sql +33 -0
  33. package/dist/migrations/0326_mcp_file_transfers.sql +48 -0
  34. package/dist/migrations/0327_easy_eternity.sql +232 -0
  35. package/dist/migrations/0328_private_task_access.sql +278 -0
  36. package/dist/migrations/0329_private_task_draft_assets.sql +28 -0
  37. package/dist/migrations/0330_rapid_emma_frost.sql +44 -0
  38. package/dist/migrations/0331_premium_slayback.sql +81 -0
  39. package/dist/migrations/0332_messy_famine.sql +189 -0
  40. package/dist/migrations/0333_strong_blacklash.sql +23 -0
  41. package/dist/migrations/0334_heavy_captain_midlands.sql +15 -0
  42. package/dist/migrations/0335_daily_onslaught.sql +16 -0
  43. package/dist/migrations/0336_acoustic_human_fly.sql +1 -0
  44. package/dist/migrations/0337_reflective_kree.sql +98 -0
  45. package/dist/migrations/0338_petite_shockwave.sql +4 -0
  46. package/dist/migrations/0339_long_franklin_storm.sql +153 -0
  47. package/dist/migrations/0340_aberrant_machine_man.sql +6 -0
  48. package/dist/migrations/0341_blushing_screwball.sql +17 -0
  49. package/dist/migrations/0342_sad_proteus.sql +23 -0
  50. package/dist/migrations/0343_chunky_mentallo.sql +52 -0
  51. package/dist/migrations/0344_free_wolf_cub.sql +18 -0
  52. package/dist/migrations/0345_spooky_white_tiger.sql +7 -0
  53. package/dist/migrations/0346_panoramic_spyke.sql +74 -0
  54. package/dist/migrations/0347_little_night_nurse.sql +1 -0
  55. package/dist/migrations/meta/_journal.json +232 -1
  56. package/dist/private-task-draft-assets-migration.test.d.ts +2 -0
  57. package/dist/private-task-draft-assets-migration.test.d.ts.map +1 -0
  58. package/dist/private-task-draft-assets-migration.test.js +35 -0
  59. package/dist/private-task-draft-assets-migration.test.js.map +1 -0
  60. package/dist/question-response-history-migration.test.d.ts +2 -0
  61. package/dist/question-response-history-migration.test.d.ts.map +1 -0
  62. package/dist/question-response-history-migration.test.js +53 -0
  63. package/dist/question-response-history-migration.test.js.map +1 -0
  64. package/dist/schema/accounting.d.ts +1282 -0
  65. package/dist/schema/accounting.d.ts.map +1 -0
  66. package/dist/schema/accounting.js +120 -0
  67. package/dist/schema/accounting.js.map +1 -0
  68. package/dist/schema/adapter_auth_sessions.d.ts +2 -2
  69. package/dist/schema/agent_commentary.d.ts +181 -0
  70. package/dist/schema/agent_commentary.d.ts.map +1 -0
  71. package/dist/schema/agent_commentary.js +24 -0
  72. package/dist/schema/agent_commentary.js.map +1 -0
  73. package/dist/schema/agent_identity_keys.d.ts +131 -0
  74. package/dist/schema/agent_identity_keys.d.ts.map +1 -0
  75. package/dist/schema/agent_identity_keys.js +20 -0
  76. package/dist/schema/agent_identity_keys.js.map +1 -0
  77. package/dist/schema/agent_runtime_state.d.ts +2 -2
  78. package/dist/schema/agent_runtime_state.js +2 -2
  79. package/dist/schema/agent_runtime_state.js.map +1 -1
  80. package/dist/schema/agent_wakeup_requests.d.ts.map +1 -1
  81. package/dist/schema/agent_wakeup_requests.js +6 -0
  82. package/dist/schema/agent_wakeup_requests.js.map +1 -1
  83. package/dist/schema/agents.d.ts +132 -2
  84. package/dist/schema/agents.d.ts.map +1 -1
  85. package/dist/schema/agents.js +10 -2
  86. package/dist/schema/agents.js.map +1 -1
  87. package/dist/schema/ai_connection_defaults.d.ts +2 -2
  88. package/dist/schema/ai_connection_defaults.js +1 -1
  89. package/dist/schema/ai_connection_defaults.js.map +1 -1
  90. package/dist/schema/ai_connection_routing.d.ts +8 -8
  91. package/dist/schema/ai_provider_defaults.d.ts +2 -2
  92. package/dist/schema/ai_provider_defaults.js +1 -1
  93. package/dist/schema/ai_provider_defaults.js.map +1 -1
  94. package/dist/schema/ai_subscriptions.d.ts +619 -0
  95. package/dist/schema/ai_subscriptions.d.ts.map +1 -0
  96. package/dist/schema/ai_subscriptions.js +61 -0
  97. package/dist/schema/ai_subscriptions.js.map +1 -0
  98. package/dist/schema/budget_incidents.d.ts +2 -2
  99. package/dist/schema/budget_incidents.js +3 -3
  100. package/dist/schema/budget_incidents.js.map +1 -1
  101. package/dist/schema/budget_policies.d.ts +68 -0
  102. package/dist/schema/budget_policies.d.ts.map +1 -1
  103. package/dist/schema/budget_policies.js +7 -1
  104. package/dist/schema/budget_policies.js.map +1 -1
  105. package/dist/schema/chat_channels.d.ts +21 -4
  106. package/dist/schema/chat_channels.d.ts.map +1 -1
  107. package/dist/schema/chat_channels.js +3 -2
  108. package/dist/schema/chat_channels.js.map +1 -1
  109. package/dist/schema/chat_github.d.ts +108 -0
  110. package/dist/schema/chat_github.d.ts.map +1 -1
  111. package/dist/schema/chat_github.js +7 -0
  112. package/dist/schema/chat_github.js.map +1 -1
  113. package/dist/schema/chat_slack_registrations.d.ts +287 -0
  114. package/dist/schema/chat_slack_registrations.d.ts.map +1 -0
  115. package/dist/schema/chat_slack_registrations.js +26 -0
  116. package/dist/schema/chat_slack_registrations.js.map +1 -0
  117. package/dist/schema/chat_voice_callbacks.d.ts +128 -0
  118. package/dist/schema/chat_voice_callbacks.d.ts.map +1 -0
  119. package/dist/schema/chat_voice_callbacks.js +18 -0
  120. package/dist/schema/chat_voice_callbacks.js.map +1 -0
  121. package/dist/schema/chat_voice_inbound.d.ts +461 -0
  122. package/dist/schema/chat_voice_inbound.d.ts.map +1 -0
  123. package/dist/schema/chat_voice_inbound.js +45 -0
  124. package/dist/schema/chat_voice_inbound.js.map +1 -0
  125. package/dist/schema/chat_voice_reports.d.ts +184 -0
  126. package/dist/schema/chat_voice_reports.d.ts.map +1 -0
  127. package/dist/schema/chat_voice_reports.js +24 -0
  128. package/dist/schema/chat_voice_reports.js.map +1 -0
  129. package/dist/schema/chat_voice_sessions.d.ts +730 -0
  130. package/dist/schema/chat_voice_sessions.d.ts.map +1 -0
  131. package/dist/schema/chat_voice_sessions.js +85 -0
  132. package/dist/schema/chat_voice_sessions.js.map +1 -0
  133. package/dist/schema/companies.d.ts +19 -2
  134. package/dist/schema/companies.d.ts.map +1 -1
  135. package/dist/schema/companies.js +3 -2
  136. package/dist/schema/companies.js.map +1 -1
  137. package/dist/schema/cost_events.d.ts +141 -3
  138. package/dist/schema/cost_events.d.ts.map +1 -1
  139. package/dist/schema/cost_events.js +20 -3
  140. package/dist/schema/cost_events.js.map +1 -1
  141. package/dist/schema/decision_models.d.ts +579 -0
  142. package/dist/schema/decision_models.d.ts.map +1 -0
  143. package/dist/schema/decision_models.js +50 -0
  144. package/dist/schema/decision_models.js.map +1 -0
  145. package/dist/schema/dot_runner.d.ts +980 -0
  146. package/dist/schema/dot_runner.d.ts.map +1 -0
  147. package/dist/schema/dot_runner.js +82 -0
  148. package/dist/schema/dot_runner.js.map +1 -0
  149. package/dist/schema/fast_responses.d.ts +662 -0
  150. package/dist/schema/fast_responses.d.ts.map +1 -0
  151. package/dist/schema/fast_responses.js +65 -0
  152. package/dist/schema/fast_responses.js.map +1 -0
  153. package/dist/schema/finance_events.d.ts +36 -2
  154. package/dist/schema/finance_events.d.ts.map +1 -1
  155. package/dist/schema/finance_events.js +5 -2
  156. package/dist/schema/finance_events.js.map +1 -1
  157. package/dist/schema/heartbeat_runs.d.ts +138 -0
  158. package/dist/schema/heartbeat_runs.d.ts.map +1 -1
  159. package/dist/schema/heartbeat_runs.js +17 -1
  160. package/dist/schema/heartbeat_runs.js.map +1 -1
  161. package/dist/schema/index.d.ts +17 -0
  162. package/dist/schema/index.d.ts.map +1 -1
  163. package/dist/schema/index.js +17 -0
  164. package/dist/schema/index.js.map +1 -1
  165. package/dist/schema/issue_access_grants.d.ts +161 -0
  166. package/dist/schema/issue_access_grants.d.ts.map +1 -0
  167. package/dist/schema/issue_access_grants.js +21 -0
  168. package/dist/schema/issue_access_grants.js.map +1 -0
  169. package/dist/schema/issue_comments.d.ts +36 -0
  170. package/dist/schema/issue_comments.d.ts.map +1 -1
  171. package/dist/schema/issue_comments.js +2 -0
  172. package/dist/schema/issue_comments.js.map +1 -1
  173. package/dist/schema/issues.d.ts +51 -0
  174. package/dist/schema/issues.d.ts.map +1 -1
  175. package/dist/schema/issues.js +6 -0
  176. package/dist/schema/issues.js.map +1 -1
  177. package/dist/schema/plugin_lifecycle_acknowledgments.d.ts +59 -0
  178. package/dist/schema/plugin_lifecycle_acknowledgments.d.ts.map +1 -0
  179. package/dist/schema/plugin_lifecycle_acknowledgments.js +12 -0
  180. package/dist/schema/plugin_lifecycle_acknowledgments.js.map +1 -0
  181. package/dist/schema/project_access_members.d.ts +111 -0
  182. package/dist/schema/project_access_members.d.ts.map +1 -0
  183. package/dist/schema/project_access_members.js +18 -0
  184. package/dist/schema/project_access_members.js.map +1 -0
  185. package/dist/schema/projects.d.ts +51 -0
  186. package/dist/schema/projects.d.ts.map +1 -1
  187. package/dist/schema/projects.js +9 -1
  188. package/dist/schema/projects.js.map +1 -1
  189. package/dist/schema/public_mcp.d.ts +2100 -0
  190. package/dist/schema/public_mcp.d.ts.map +1 -0
  191. package/dist/schema/public_mcp.js +191 -0
  192. package/dist/schema/public_mcp.js.map +1 -0
  193. package/dist/schema/resource_lifecycle_events.d.ts +2 -2
  194. package/dist/schema/resource_lifecycle_events.d.ts.map +1 -1
  195. package/dist/schema/resource_lifecycle_events.js +2 -1
  196. package/dist/schema/resource_lifecycle_events.js.map +1 -1
  197. package/dist/schema/status_cards.d.ts +2 -2
  198. package/dist/schema/status_cards.js +2 -2
  199. package/dist/schema/status_cards.js.map +1 -1
  200. package/dist/schema/tool_access.d.ts +18 -0
  201. package/dist/schema/tool_access.d.ts.map +1 -1
  202. package/dist/schema/tool_access.js +3 -3
  203. package/dist/schema/tool_access.js.map +1 -1
  204. package/dist/schema/user_company_preferences.d.ts +127 -0
  205. package/dist/schema/user_company_preferences.d.ts.map +1 -0
  206. package/dist/schema/user_company_preferences.js +16 -0
  207. package/dist/schema/user_company_preferences.js.map +1 -0
  208. package/dist/speko-voice-migration.test.d.ts +2 -0
  209. package/dist/speko-voice-migration.test.d.ts.map +1 -0
  210. package/dist/speko-voice-migration.test.js +88 -0
  211. package/dist/speko-voice-migration.test.js.map +1 -0
  212. package/dist/work-signals.d.ts +20 -0
  213. package/dist/work-signals.d.ts.map +1 -0
  214. package/dist/work-signals.js +123 -0
  215. package/dist/work-signals.js.map +1 -0
  216. package/dist/work-signals.test.d.ts +2 -0
  217. package/dist/work-signals.test.d.ts.map +1 -0
  218. package/dist/work-signals.test.js +177 -0
  219. package/dist/work-signals.test.js.map +1 -0
  220. package/package.json +4 -4
  221. package/dist/seed.d.ts +0 -2
  222. package/dist/seed.d.ts.map +0 -1
  223. package/dist/seed.js +0 -91
  224. package/dist/seed.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ import { sql } from "drizzle-orm";
2
+ const contexts = new WeakMap();
3
+ function publish(scope, topic, event = "settled") {
4
+ for (const listener of scope.listeners.get(topic) ?? []) {
5
+ try {
6
+ listener(event);
7
+ }
8
+ catch (error) {
9
+ process.emitWarning(`Database work listener failed: ${String(error)}`);
10
+ }
11
+ }
12
+ }
13
+ /** Installed once by createDb; dedicated child pools share their owner's scope. */
14
+ export function installDatabaseWorkSignals(db, owner) {
15
+ const scope = (owner && contexts.get(owner)?.scope) || { listeners: new Map(), transactions: new Set(), root: db };
16
+ install(db, { scope });
17
+ return db;
18
+ }
19
+ function install(connection, context) {
20
+ contexts.set(connection, context);
21
+ const transaction = connection.transaction;
22
+ connection.transaction = async function (callback, ...options) {
23
+ // Nested savepoints belong to the outermost transaction. Even a released
24
+ // savepoint must not wake a consumer before its parent commits.
25
+ const state = context.transaction ?? { topics: new Set(), uncertain: false };
26
+ try {
27
+ const result = await transaction.call(this, async (tx) => {
28
+ install(tx, { scope: context.scope, transaction: state });
29
+ return callback(tx);
30
+ }, ...options);
31
+ if (!context.transaction)
32
+ context.scope.transactions.delete(state);
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ if (!context.transaction) {
37
+ // An XID is known before the first opted-in write can execute. If
38
+ // acquisition itself failed there cannot be a corresponding write.
39
+ if (state.xid)
40
+ state.uncertain = true;
41
+ else
42
+ context.scope.transactions.delete(state);
43
+ }
44
+ throw error;
45
+ }
46
+ finally {
47
+ if (!context.transaction)
48
+ for (const topic of state.topics)
49
+ publish(context.scope, topic);
50
+ }
51
+ };
52
+ }
53
+ /** Await BEFORE the queue write, on its transaction. Nested transactions work. */
54
+ export async function signalDatabaseWork(connection, topic) {
55
+ const context = contexts.get(connection);
56
+ if (!context)
57
+ return; // Lightweight service test doubles have no DB lifecycle.
58
+ const state = context.transaction;
59
+ if (!state)
60
+ throw new Error("Database work must be registered inside a transaction");
61
+ state.topics.add(topic);
62
+ context.scope.transactions.add(state);
63
+ publish(context.scope, topic, "intent");
64
+ if (!state.xid) {
65
+ state.xid = connection.execute(sql `select pg_current_xact_id()::text as xid`)
66
+ .then((rows) => rows[0].xid);
67
+ }
68
+ // Keep a failed acquisition distinguishable from an uncertain queue write.
69
+ try {
70
+ await state.xid;
71
+ }
72
+ catch (error) {
73
+ state.xid = undefined;
74
+ throw error;
75
+ }
76
+ }
77
+ export function databaseWorkPending(owner, topic) {
78
+ return [...(contexts.get(owner)?.scope.transactions ?? [])].some(state => state.topics.has(topic));
79
+ }
80
+ /** Resolve only failed transactions, on a fresh root-pool statement. Call
81
+ * BEFORE the queue scan so rows from a newly confirmed commit are visible.
82
+ * NULL means the XID aged out; it can no longer be in progress, so scanning
83
+ * the durable queue is sufficient even though its outcome is unavailable.
84
+ */
85
+ export async function reconcileDatabaseWork(owner, topic) {
86
+ const scope = contexts.get(owner)?.scope;
87
+ if (!scope)
88
+ return;
89
+ for (const state of [...scope.transactions]) {
90
+ if (!state.uncertain || !state.topics.has(topic) || !state.xid)
91
+ continue;
92
+ const xid = await state.xid;
93
+ const rows = await scope.root.execute(sql `select pg_xact_status(${xid}::xid8) as status`);
94
+ if (rows[0]?.status === "in progress")
95
+ continue;
96
+ if (!rows.length || ![null, "committed", "aborted"].includes(rows[0].status)) {
97
+ throw new Error("Unexpected database transaction status");
98
+ }
99
+ scope.transactions.delete(state);
100
+ for (const affected of state.topics)
101
+ publish(scope, affected);
102
+ }
103
+ }
104
+ /** Includes intent, outer settlement, and uncertainty-resolution changes. */
105
+ export function subscribeDatabaseWork(owner, topic, listener) {
106
+ const context = contexts.get(owner);
107
+ if (!context)
108
+ throw new Error("Database work subscriptions require createDb");
109
+ let listeners = context.scope.listeners.get(topic);
110
+ if (!listeners)
111
+ context.scope.listeners.set(topic, listeners = new Set());
112
+ listeners.add(listener);
113
+ if (databaseWorkPending(owner, topic)) {
114
+ try {
115
+ listener("intent");
116
+ }
117
+ catch (error) {
118
+ process.emitWarning(`Database work listener failed: ${String(error)}`);
119
+ }
120
+ }
121
+ return () => { listeners.delete(listener); };
122
+ }
123
+ //# sourceMappingURL=work-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-signals.js","sourceRoot":"","sources":["../src/work-signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=work-signals.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-signals.test.d.ts","sourceRoot":"","sources":["../src/work-signals.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { drizzle } from "drizzle-orm/postgres-js";
3
+ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
4
+ import { createDb, withDedicatedDbConnection } from "./client.js";
5
+ import { getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase } from "./test-embedded-postgres.js";
6
+ import { databaseWorkPending, installDatabaseWorkSignals, reconcileDatabaseWork, signalDatabaseWork, subscribeDatabaseWork } from "./work-signals.js";
7
+ const support = await getEmbeddedPostgresTestSupport();
8
+ (support.supported ? describe : describe.skip)("database work signals", () => {
9
+ let db;
10
+ let temporary;
11
+ beforeAll(async () => {
12
+ temporary = await startEmbeddedPostgresTestDatabase("work-signals-");
13
+ db = createDb(temporary.connectionString);
14
+ await db.execute(sql `create table work_signal_test (id text primary key)`);
15
+ }, 90_000);
16
+ afterAll(async () => { await temporary?.cleanup(); });
17
+ it("defers nested savepoint notifications until the outer commit and preserves return values", async () => {
18
+ const events = [];
19
+ const unsubscribe = subscribeDatabaseWork(db, "nested", event => events.push(event));
20
+ try {
21
+ const result = await db.transaction(async (tx) => {
22
+ await tx.transaction(async (nested) => {
23
+ await signalDatabaseWork(nested, "nested");
24
+ await nested.execute(sql `insert into work_signal_test values ('nested')`);
25
+ });
26
+ expect(events).toEqual(["intent"]);
27
+ expect(databaseWorkPending(db, "nested")).toBe(true);
28
+ expect(await db.execute(sql `select * from work_signal_test where id = 'nested'`)).toHaveLength(0);
29
+ return 123;
30
+ });
31
+ expect(result).toBe(123);
32
+ expect(events).toEqual(["intent", "settled"]);
33
+ expect(databaseWorkPending(db, "nested")).toBe(false);
34
+ expect(await db.execute(sql `select * from work_signal_test where id = 'nested'`)).toHaveLength(1);
35
+ }
36
+ finally {
37
+ unsubscribe();
38
+ }
39
+ });
40
+ it("reconciles a rollback without leaving a permanent pending flag", async () => {
41
+ await expect(db.transaction(async (tx) => {
42
+ await signalDatabaseWork(tx, "rollback");
43
+ await tx.execute(sql `insert into work_signal_test values ('rollback')`);
44
+ throw new Error("abort");
45
+ })).rejects.toThrow("abort");
46
+ await reconcileDatabaseWork(db, "rollback");
47
+ expect(databaseWorkPending(db, "rollback")).toBe(false);
48
+ expect(await db.execute(sql `select * from work_signal_test where id = 'rollback'`)).toHaveLength(0);
49
+ });
50
+ it("keeps outer ownership after a caught savepoint rollback", async () => {
51
+ const events = [];
52
+ const unsubscribe = subscribeDatabaseWork(db, "savepoint", event => events.push(event));
53
+ try {
54
+ await db.transaction(async (tx) => {
55
+ await expect(tx.transaction(async (nested) => {
56
+ await signalDatabaseWork(nested, "savepoint");
57
+ await nested.execute(sql `insert into work_signal_test values ('savepoint')`);
58
+ throw new Error("rollback savepoint");
59
+ })).rejects.toThrow("rollback savepoint");
60
+ expect(databaseWorkPending(db, "savepoint")).toBe(true);
61
+ expect(events).toEqual(["intent"]);
62
+ await signalDatabaseWork(tx, "savepoint");
63
+ await tx.execute(sql `insert into work_signal_test values ('savepoint-retry')`);
64
+ });
65
+ expect(events).toEqual(["intent", "intent", "settled"]);
66
+ expect(databaseWorkPending(db, "savepoint")).toBe(false);
67
+ }
68
+ finally {
69
+ unsubscribe();
70
+ }
71
+ });
72
+ it.each(["commit", "abort"])("does not clear a late %s until PostgreSQL reports a settled transaction", async (outcome) => {
73
+ // Inject a lost response at the client boundary while a REAL transaction
74
+ // remains open on PostgreSQL. The status probe and row visibility are real.
75
+ const raw = drizzle(db.$client);
76
+ const transaction = raw.transaction.bind(raw);
77
+ let release;
78
+ const gate = new Promise(resolve => { release = resolve; });
79
+ let wrote;
80
+ const written = new Promise(resolve => { wrote = resolve; });
81
+ let serverDone;
82
+ raw.transaction = ((callback) => {
83
+ serverDone = transaction(async (tx) => {
84
+ const result = await callback(tx);
85
+ wrote();
86
+ await gate;
87
+ if (outcome === "abort")
88
+ throw new Error("server abort");
89
+ return result;
90
+ });
91
+ // Observe rejection immediately; tests await the same result below.
92
+ void serverDone.catch(() => { });
93
+ return written.then(() => { throw new Error("lost transaction response"); });
94
+ });
95
+ const owner = installDatabaseWorkSignals(raw);
96
+ const topic = `late-${outcome}`;
97
+ try {
98
+ await expect(owner.transaction(async (tx) => {
99
+ await signalDatabaseWork(tx, topic);
100
+ await tx.execute(sql `insert into work_signal_test values (${topic})`);
101
+ })).rejects.toThrow("lost transaction response");
102
+ await reconcileDatabaseWork(owner, topic);
103
+ expect(databaseWorkPending(owner, topic)).toBe(true);
104
+ expect(await db.execute(sql `select * from work_signal_test where id = ${topic}`)).toHaveLength(0);
105
+ release();
106
+ await serverDone.catch(() => { });
107
+ await reconcileDatabaseWork(owner, topic);
108
+ expect(databaseWorkPending(owner, topic)).toBe(false);
109
+ expect(await db.execute(sql `select * from work_signal_test where id = ${topic}`)).toHaveLength(outcome === "commit" ? 1 : 0);
110
+ }
111
+ finally {
112
+ release();
113
+ await serverDone?.catch(() => { });
114
+ }
115
+ });
116
+ it("recovers after a real backend disconnect without replaying the queue write", async () => {
117
+ await expect(db.transaction(async (tx) => {
118
+ await signalDatabaseWork(tx, "disconnect");
119
+ await tx.execute(sql `insert into work_signal_test values ('disconnect')`);
120
+ const [{ pid }] = await tx.execute(sql `select pg_backend_pid() as pid`);
121
+ await db.execute(sql `select pg_terminate_backend(${pid})`);
122
+ await tx.execute(sql `select 1`);
123
+ })).rejects.toThrow();
124
+ await reconcileDatabaseWork(db, "disconnect");
125
+ expect(databaseWorkPending(db, "disconnect")).toBe(false);
126
+ expect(await db.execute(sql `select * from work_signal_test where id = 'disconnect'`)).toHaveLength(0);
127
+ });
128
+ it("shares notifications with dedicated child pools but isolates unrelated roots and topics", async () => {
129
+ const listener = vi.fn();
130
+ const other = createDb(temporary.connectionString);
131
+ const unsubscribe = subscribeDatabaseWork(db, "dedicated", listener);
132
+ try {
133
+ await other.transaction(tx => signalDatabaseWork(tx, "dedicated"));
134
+ await db.transaction(tx => signalDatabaseWork(tx, "other"));
135
+ expect(listener).not.toHaveBeenCalled();
136
+ await withDedicatedDbConnection(db, dedicated => dedicated.transaction(tx => signalDatabaseWork(tx, "dedicated")));
137
+ expect(listener.mock.calls.map(([event]) => event)).toEqual(["intent", "settled"]);
138
+ }
139
+ finally {
140
+ unsubscribe();
141
+ await other.$client.end();
142
+ }
143
+ });
144
+ it("never changes transaction success because a listener throws", async () => {
145
+ const warn = vi.spyOn(process, "emitWarning").mockImplementation(() => { });
146
+ const unsubscribe = subscribeDatabaseWork(db, "listener", () => { throw new Error("listener"); });
147
+ try {
148
+ await expect(db.transaction(async (tx) => { await signalDatabaseWork(tx, "listener"); return 7; })).resolves.toBe(7);
149
+ expect(warn).toHaveBeenCalledTimes(2);
150
+ }
151
+ finally {
152
+ unsubscribe();
153
+ warn.mockRestore();
154
+ }
155
+ });
156
+ });
157
+ describe("work signal query boundaries", () => {
158
+ it("adds no SQL to transactions which do not register queue work", async () => {
159
+ const execute = vi.fn();
160
+ const connection = installDatabaseWorkSignals({ execute, transaction: async (callback) => callback({ execute, transaction: async () => { } }) });
161
+ await expect(connection.transaction(async () => 19)).resolves.toBe(19);
162
+ expect(execute).not.toHaveBeenCalled();
163
+ });
164
+ it("fails before the write if XID acquisition fails, without retaining uncertainty", async () => {
165
+ const execute = vi.fn().mockRejectedValue(new Error("disconnected"));
166
+ const connection = installDatabaseWorkSignals({ execute, transaction: async (callback) => callback({ execute, transaction: async () => { } }) });
167
+ const write = vi.fn();
168
+ await expect(connection.transaction(async (tx) => { await signalDatabaseWork(tx, "failed"); write(); })).rejects.toThrow("disconnected");
169
+ expect(write).not.toHaveBeenCalled();
170
+ expect(databaseWorkPending(connection, "failed")).toBe(false);
171
+ });
172
+ it("rejects registration on an autocommit root", async () => {
173
+ const connection = installDatabaseWorkSignals({ execute: vi.fn(), transaction: vi.fn() });
174
+ await expect(signalDatabaseWork(connection, "bad")).rejects.toThrow("inside a transaction");
175
+ });
176
+ });
177
+ //# sourceMappingURL=work-signals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-signals.test.js","sourceRoot":"","sources":["../src/work-signals.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tickernelz/paperclip-pro-db",
3
- "version": "2026.1011.2",
3
+ "version": "2026.1012.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/tickernelz/paperclip-pro",
6
6
  "bugs": {
@@ -36,10 +36,10 @@
36
36
  "generate": "pnpm run check:migrations && pnpm run clean && tsc -p tsconfig.json && drizzle-kit generate && pnpm run prune:snapshots",
37
37
  "prune:snapshots": "ls src/migrations/meta/*_snapshot.json | sort -r | tail -n +6 | xargs rm -f",
38
38
  "migrate": "pnpm run check:migrations && tsx src/migrate.ts",
39
- "seed": "tsx src/seed.ts"
39
+ "seed": "pnpm --filter @tickernelz/paperclip-pro-server exec tsx scripts/seed.ts"
40
40
  },
41
41
  "dependencies": {
42
- "@tickernelz/paperclip-pro-shared": "2026.1011.2",
42
+ "@tickernelz/paperclip-pro-shared": "2026.1012.0",
43
43
  "drizzle-orm": "^0.45.2",
44
44
  "embedded-postgres": "^18.1.0-beta.16",
45
45
  "postgres": "^3.4.9"
@@ -49,7 +49,7 @@
49
49
  "drizzle-kit": "^0.31.10",
50
50
  "tsx": "^4.23.15",
51
51
  "typescript": "^7.0.2",
52
- "vitest": "^4.1.11"
52
+ "vitest": "^5.0.3"
53
53
  },
54
54
  "engines": {
55
55
  "node": ">=24.11.0"
package/dist/seed.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=seed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":""}
package/dist/seed.js DELETED
@@ -1,91 +0,0 @@
1
- import { createDb } from "./client.js";
2
- import { companies, agents, goals, projects, issues } from "./schema/index.js";
3
- const url = process.env.DATABASE_URL;
4
- if (!url)
5
- throw new Error("DATABASE_URL is required");
6
- const db = createDb(url);
7
- console.log("Seeding database...");
8
- const [company] = await db
9
- .insert(companies)
10
- .values({
11
- name: "Paperclip Demo Co",
12
- description: "A demo autonomous company",
13
- status: "active",
14
- budgetMonthlyCents: 50000,
15
- })
16
- .returning();
17
- const [ceo] = await db
18
- .insert(agents)
19
- .values({
20
- companyId: company.id,
21
- name: "CEO Agent",
22
- role: "ceo",
23
- title: "Chief Executive Officer",
24
- status: "idle",
25
- adapterType: "process",
26
- adapterConfig: { command: "echo", args: ["hello from ceo"] },
27
- budgetMonthlyCents: 15000,
28
- })
29
- .returning();
30
- const [engineer] = await db
31
- .insert(agents)
32
- .values({
33
- companyId: company.id,
34
- name: "Engineer Agent",
35
- role: "engineer",
36
- title: "Software Engineer",
37
- status: "idle",
38
- reportsTo: ceo.id,
39
- adapterType: "process",
40
- adapterConfig: { command: "echo", args: ["hello from engineer"] },
41
- budgetMonthlyCents: 10000,
42
- })
43
- .returning();
44
- const [goal] = await db
45
- .insert(goals)
46
- .values({
47
- companyId: company.id,
48
- title: "Ship V1",
49
- description: "Deliver first control plane release",
50
- level: "company",
51
- status: "active",
52
- ownerAgentId: ceo.id,
53
- })
54
- .returning();
55
- const [project] = await db
56
- .insert(projects)
57
- .values({
58
- companyId: company.id,
59
- goalId: goal.id,
60
- name: "Control Plane MVP",
61
- description: "Implement core board + agent loop",
62
- status: "in_progress",
63
- leadAgentId: ceo.id,
64
- })
65
- .returning();
66
- await db.insert(issues).values([
67
- {
68
- companyId: company.id,
69
- projectId: project.id,
70
- goalId: goal.id,
71
- title: "Implement atomic task checkout",
72
- description: "Ensure in_progress claiming is conflict-safe",
73
- status: "todo",
74
- priority: "high",
75
- assigneeAgentId: engineer.id,
76
- createdByAgentId: ceo.id,
77
- },
78
- {
79
- companyId: company.id,
80
- projectId: project.id,
81
- goalId: goal.id,
82
- title: "Add budget auto-pause",
83
- description: "Pause agent at hard budget ceiling",
84
- status: "backlog",
85
- priority: "medium",
86
- createdByAgentId: ceo.id,
87
- },
88
- ]);
89
- console.log("Seed complete");
90
- process.exit(0);
91
- //# sourceMappingURL=seed.js.map
package/dist/seed.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACrC,IAAI,CAAC,GAAG;IAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAEtD,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;AAEzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEnC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;KACvB,MAAM,CAAC,SAAS,CAAC;KACjB,MAAM,CAAC;IACN,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,2BAA2B;IACxC,MAAM,EAAE,QAAQ;IAChB,kBAAkB,EAAE,KAAK;CAC1B,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;KACnB,MAAM,CAAC,MAAM,CAAC;KACd,MAAM,CAAC;IACN,SAAS,EAAE,OAAQ,CAAC,EAAE;IACtB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE;IAC5D,kBAAkB,EAAE,KAAK;CAC1B,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE;KACxB,MAAM,CAAC,MAAM,CAAC;KACd,MAAM,CAAC;IACN,SAAS,EAAE,OAAQ,CAAC,EAAE;IACtB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,mBAAmB;IAC1B,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,GAAI,CAAC,EAAE;IAClB,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,qBAAqB,CAAC,EAAE;IACjE,kBAAkB,EAAE,KAAK;CAC1B,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;KACpB,MAAM,CAAC,KAAK,CAAC;KACb,MAAM,CAAC;IACN,SAAS,EAAE,OAAQ,CAAC,EAAE;IACtB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,qCAAqC;IAClD,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,GAAI,CAAC,EAAE;CACtB,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;KACvB,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC;IACN,SAAS,EAAE,OAAQ,CAAC,EAAE;IACtB,MAAM,EAAE,IAAK,CAAC,EAAE;IAChB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mCAAmC;IAChD,MAAM,EAAE,aAAa;IACrB,WAAW,EAAE,GAAI,CAAC,EAAE;CACrB,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC7B;QACE,SAAS,EAAE,OAAQ,CAAC,EAAE;QACtB,SAAS,EAAE,OAAQ,CAAC,EAAE;QACtB,MAAM,EAAE,IAAK,CAAC,EAAE;QAChB,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,8CAA8C;QAC3D,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,QAAS,CAAC,EAAE;QAC7B,gBAAgB,EAAE,GAAI,CAAC,EAAE;KAC1B;IACD;QACE,SAAS,EAAE,OAAQ,CAAC,EAAE;QACtB,SAAS,EAAE,OAAQ,CAAC,EAAE;QACtB,MAAM,EAAE,IAAK,CAAC,EAAE;QAChB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,QAAQ;QAClB,gBAAgB,EAAE,GAAI,CAAC,EAAE;KAC1B;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}