@proletariat/cli 0.3.89 → 0.3.91

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 (276) hide show
  1. package/dist/commands/agent/auth.js +2 -2
  2. package/dist/commands/agent/auth.js.map +1 -1
  3. package/dist/commands/agent/shell.js +3 -3
  4. package/dist/commands/agent/shell.js.map +1 -1
  5. package/dist/commands/branch/create.js +2 -2
  6. package/dist/commands/branch/create.js.map +1 -1
  7. package/dist/commands/claude/index.js +3 -3
  8. package/dist/commands/claude/index.js.map +1 -1
  9. package/dist/commands/claude/open.js +2 -2
  10. package/dist/commands/claude/open.js.map +1 -1
  11. package/dist/commands/config/index.js +65 -2
  12. package/dist/commands/config/index.js.map +1 -1
  13. package/dist/commands/db/repair.js +4 -4
  14. package/dist/commands/db/repair.js.map +1 -1
  15. package/dist/commands/docker/clean.js +2 -2
  16. package/dist/commands/docker/clean.js.map +1 -1
  17. package/dist/commands/docker/index.js +2 -2
  18. package/dist/commands/docker/index.js.map +1 -1
  19. package/dist/commands/docker/list.js +2 -2
  20. package/dist/commands/docker/list.js.map +1 -1
  21. package/dist/commands/docker/logs.js +2 -2
  22. package/dist/commands/docker/logs.js.map +1 -1
  23. package/dist/commands/docker/restart.js +2 -2
  24. package/dist/commands/docker/restart.js.map +1 -1
  25. package/dist/commands/docker/shell.js +2 -2
  26. package/dist/commands/docker/shell.js.map +1 -1
  27. package/dist/commands/docker/start.js +2 -2
  28. package/dist/commands/docker/start.js.map +1 -1
  29. package/dist/commands/docker/stop.js +2 -2
  30. package/dist/commands/docker/stop.js.map +1 -1
  31. package/dist/commands/docker/sync.js +2 -2
  32. package/dist/commands/docker/sync.js.map +1 -1
  33. package/dist/commands/execution/config.js.map +1 -1
  34. package/dist/commands/execution/list.js +2 -2
  35. package/dist/commands/execution/list.js.map +1 -1
  36. package/dist/commands/execution/logs.js +2 -2
  37. package/dist/commands/execution/logs.js.map +1 -1
  38. package/dist/commands/execution/stop.js +2 -2
  39. package/dist/commands/execution/stop.js.map +1 -1
  40. package/dist/commands/execution/view.js +2 -2
  41. package/dist/commands/execution/view.js.map +1 -1
  42. package/dist/commands/linear/connect.js.map +1 -1
  43. package/dist/commands/mcp-server.js +2 -2
  44. package/dist/commands/mcp-server.js.map +1 -1
  45. package/dist/commands/orchestrator/attach.js +2 -2
  46. package/dist/commands/orchestrator/attach.js.map +1 -1
  47. package/dist/commands/orchestrator/start.js +3 -3
  48. package/dist/commands/orchestrator/start.js.map +1 -1
  49. package/dist/commands/orchestrator/stop.js +2 -2
  50. package/dist/commands/orchestrator/stop.js.map +1 -1
  51. package/dist/commands/qa/index.js +3 -3
  52. package/dist/commands/qa/index.js.map +1 -1
  53. package/dist/commands/session/attach.js +3 -3
  54. package/dist/commands/session/attach.js.map +1 -1
  55. package/dist/commands/session/cleanup.js +2 -2
  56. package/dist/commands/session/cleanup.js.map +1 -1
  57. package/dist/commands/session/exec.js +2 -2
  58. package/dist/commands/session/exec.js.map +1 -1
  59. package/dist/commands/session/health.js +2 -2
  60. package/dist/commands/session/health.js.map +1 -1
  61. package/dist/commands/session/inspect.js +2 -2
  62. package/dist/commands/session/inspect.js.map +1 -1
  63. package/dist/commands/session/list.js +2 -2
  64. package/dist/commands/session/list.js.map +1 -1
  65. package/dist/commands/session/peek.js +3 -3
  66. package/dist/commands/session/peek.js.map +1 -1
  67. package/dist/commands/session/poke.js +2 -2
  68. package/dist/commands/session/poke.js.map +1 -1
  69. package/dist/commands/session/prune.js +2 -2
  70. package/dist/commands/session/prune.js.map +1 -1
  71. package/dist/commands/session/report.js +2 -2
  72. package/dist/commands/session/report.js.map +1 -1
  73. package/dist/commands/session/restart.js +2 -2
  74. package/dist/commands/session/restart.js.map +1 -1
  75. package/dist/commands/shortcut/connect.js.map +1 -1
  76. package/dist/commands/trello/configure.js.map +1 -1
  77. package/dist/commands/work/complete.js +2 -2
  78. package/dist/commands/work/complete.js.map +1 -1
  79. package/dist/commands/work/hooks/add.js +2 -2
  80. package/dist/commands/work/hooks/add.js.map +1 -1
  81. package/dist/commands/work/hooks/list.js +2 -2
  82. package/dist/commands/work/hooks/list.js.map +1 -1
  83. package/dist/commands/work/hooks/remove.js +2 -2
  84. package/dist/commands/work/hooks/remove.js.map +1 -1
  85. package/dist/commands/work/hooks/toggle.js +2 -2
  86. package/dist/commands/work/hooks/toggle.js.map +1 -1
  87. package/dist/commands/work/index.js +4 -0
  88. package/dist/commands/work/index.js.map +1 -1
  89. package/dist/commands/work/ready.js +2 -2
  90. package/dist/commands/work/ready.js.map +1 -1
  91. package/dist/commands/work/ship.d.ts +43 -0
  92. package/dist/commands/work/ship.js +587 -0
  93. package/dist/commands/work/ship.js.map +1 -0
  94. package/dist/commands/work/spawn.js +2 -2
  95. package/dist/commands/work/spawn.js.map +1 -1
  96. package/dist/commands/work/start.d.ts +1 -0
  97. package/dist/commands/work/start.js +36 -3
  98. package/dist/commands/work/start.js.map +1 -1
  99. package/dist/commands/work/stop.js +2 -2
  100. package/dist/commands/work/stop.js.map +1 -1
  101. package/dist/commands/work/watch.js +2 -2
  102. package/dist/commands/work/watch.js.map +1 -1
  103. package/dist/hooks/init.js +11 -15
  104. package/dist/hooks/init.js.map +1 -1
  105. package/dist/lib/agents/commands.js +18 -8
  106. package/dist/lib/agents/commands.js.map +1 -1
  107. package/dist/lib/agents/index.js +6 -0
  108. package/dist/lib/agents/index.js.map +1 -1
  109. package/dist/lib/asana/config.d.ts +8 -8
  110. package/dist/lib/asana/config.js.map +1 -1
  111. package/dist/lib/asana/mapper.d.ts +2 -2
  112. package/dist/lib/asana/mapper.js.map +1 -1
  113. package/dist/lib/container.d.ts +40 -0
  114. package/dist/lib/container.js +74 -0
  115. package/dist/lib/container.js.map +1 -0
  116. package/dist/lib/database/agents.js +4 -2
  117. package/dist/lib/database/agents.js.map +1 -1
  118. package/dist/lib/database/db-safety.d.ts +4 -4
  119. package/dist/lib/database/db-safety.js +6 -6
  120. package/dist/lib/database/db-safety.js.map +1 -1
  121. package/dist/lib/database/driver.d.ts +20 -21
  122. package/dist/lib/database/driver.js +24 -22
  123. package/dist/lib/database/driver.js.map +1 -1
  124. package/dist/lib/database/drizzle.d.ts +9 -9
  125. package/dist/lib/database/drizzle.js +9 -17
  126. package/dist/lib/database/drizzle.js.map +1 -1
  127. package/dist/lib/database/migrations/0001_baseline.js.map +1 -1
  128. package/dist/lib/database/migrations/0002_work_hooks.js.map +1 -1
  129. package/dist/lib/database/migrations/0003_actions_redesign.js.map +1 -1
  130. package/dist/lib/database/migrations/0004_workflow_rules.js.map +1 -1
  131. package/dist/lib/database/migrations/0005_provider_status_mapping.js.map +1 -1
  132. package/dist/lib/database/migrations/0006_drop_theme_names_used.js.map +1 -1
  133. package/dist/lib/database/migrations/0007_add_worktree_columns.js.map +1 -1
  134. package/dist/lib/database/migrations/0008_add_agent_mount_mode.js.map +1 -1
  135. package/dist/lib/database/migrations/0009_create_media_items.js.map +1 -1
  136. package/dist/lib/database/migrations/0010_add_ticket_position.js.map +1 -1
  137. package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -1
  138. package/dist/lib/database/migrations/0012_add_action_network_allowlist.js.map +1 -1
  139. package/dist/lib/database/migrator.d.ts +3 -3
  140. package/dist/lib/database/migrator.js.map +1 -1
  141. package/dist/lib/database/pmo-bootstrap.d.ts +2 -2
  142. package/dist/lib/database/pmo-bootstrap.js +4 -26
  143. package/dist/lib/database/pmo-bootstrap.js.map +1 -1
  144. package/dist/lib/database/repositories.js +1 -1
  145. package/dist/lib/database/repositories.js.map +1 -1
  146. package/dist/lib/database/settings-store.d.ts +3 -3
  147. package/dist/lib/database/settings-store.js +2 -2
  148. package/dist/lib/database/settings-store.js.map +1 -1
  149. package/dist/lib/database/sqlite.d.ts +155 -0
  150. package/dist/lib/database/sqlite.js +358 -0
  151. package/dist/lib/database/sqlite.js.map +1 -0
  152. package/dist/lib/database/themes.js +3 -3
  153. package/dist/lib/database/themes.js.map +1 -1
  154. package/dist/lib/database/workspace.d.ts +6 -4
  155. package/dist/lib/database/workspace.js +38 -46
  156. package/dist/lib/database/workspace.js.map +1 -1
  157. package/dist/lib/execution/config.d.ts +33 -33
  158. package/dist/lib/execution/config.js.map +1 -1
  159. package/dist/lib/execution/context.d.ts +20 -0
  160. package/dist/lib/execution/context.js +88 -0
  161. package/dist/lib/execution/context.js.map +1 -1
  162. package/dist/lib/execution/devcontainer.d.ts +9 -1
  163. package/dist/lib/execution/devcontainer.js +62 -40
  164. package/dist/lib/execution/devcontainer.js.map +1 -1
  165. package/dist/lib/execution/runners/devcontainer.js +11 -0
  166. package/dist/lib/execution/runners/devcontainer.js.map +1 -1
  167. package/dist/lib/execution/runners/docker-management.js +6 -1
  168. package/dist/lib/execution/runners/docker-management.js.map +1 -1
  169. package/dist/lib/execution/runners/orchestrator.js +6 -3
  170. package/dist/lib/execution/runners/orchestrator.js.map +1 -1
  171. package/dist/lib/execution/runners/prompt-builder.js +31 -0
  172. package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
  173. package/dist/lib/execution/runners/shared.d.ts +2 -2
  174. package/dist/lib/execution/runners/shared.js +2 -2
  175. package/dist/lib/execution/runners/shared.js.map +1 -1
  176. package/dist/lib/execution/spawner.d.ts +3 -3
  177. package/dist/lib/execution/spawner.js +11 -0
  178. package/dist/lib/execution/spawner.js.map +1 -1
  179. package/dist/lib/execution/storage.d.ts +3 -3
  180. package/dist/lib/execution/storage.js.map +1 -1
  181. package/dist/lib/execution/types.d.ts +23 -0
  182. package/dist/lib/execution/types.js.map +1 -1
  183. package/dist/lib/external-issues/mapping-store.d.ts +2 -2
  184. package/dist/lib/external-issues/mapping-store.js.map +1 -1
  185. package/dist/lib/external-issues/outbound-sync.d.ts +3 -3
  186. package/dist/lib/external-issues/outbound-sync.js.map +1 -1
  187. package/dist/lib/init/index.js +6 -8
  188. package/dist/lib/init/index.js.map +1 -1
  189. package/dist/lib/jira/config.d.ts +5 -5
  190. package/dist/lib/jira/config.js.map +1 -1
  191. package/dist/lib/linear/config.d.ts +8 -8
  192. package/dist/lib/linear/config.js.map +1 -1
  193. package/dist/lib/linear/mapper.d.ts +2 -2
  194. package/dist/lib/linear/mapper.js.map +1 -1
  195. package/dist/lib/mcp/types.d.ts +2 -2
  196. package/dist/lib/monday/config.d.ts +9 -9
  197. package/dist/lib/monday/config.js.map +1 -1
  198. package/dist/lib/monday/mapper.d.ts +2 -2
  199. package/dist/lib/monday/mapper.js.map +1 -1
  200. package/dist/lib/pmo/diet.d.ts +3 -3
  201. package/dist/lib/pmo/diet.js.map +1 -1
  202. package/dist/lib/pmo/find-pmo.js +5 -8
  203. package/dist/lib/pmo/find-pmo.js.map +1 -1
  204. package/dist/lib/pmo/index.js +9 -7
  205. package/dist/lib/pmo/index.js.map +1 -1
  206. package/dist/lib/pmo/storage/base.d.ts +15 -15
  207. package/dist/lib/pmo/storage/base.js.map +1 -1
  208. package/dist/lib/pmo/storage/dependencies.js.map +1 -1
  209. package/dist/lib/pmo/storage/helpers.js.map +1 -1
  210. package/dist/lib/pmo/storage/index.d.ts +8 -2
  211. package/dist/lib/pmo/storage/index.js +10 -2
  212. package/dist/lib/pmo/storage/index.js.map +1 -1
  213. package/dist/lib/pmo/storage/projects.js.map +1 -1
  214. package/dist/lib/pmo/storage/roadmaps.js +4 -4
  215. package/dist/lib/pmo/storage/roadmaps.js.map +1 -1
  216. package/dist/lib/pmo/storage/specs.js.map +1 -1
  217. package/dist/lib/pmo/storage/statuses.js +1 -1
  218. package/dist/lib/pmo/storage/statuses.js.map +1 -1
  219. package/dist/lib/pmo/storage/tickets.js +1 -1
  220. package/dist/lib/pmo/storage/tickets.js.map +1 -1
  221. package/dist/lib/pmo/storage/types.d.ts +2 -2
  222. package/dist/lib/pmo/storage/views.js.map +1 -1
  223. package/dist/lib/pmo/sync-manager.js +12 -0
  224. package/dist/lib/pmo/sync-manager.js.map +1 -1
  225. package/dist/lib/providers/index.d.ts +2 -0
  226. package/dist/lib/providers/index.js +2 -0
  227. package/dist/lib/providers/index.js.map +1 -1
  228. package/dist/lib/providers/linear-provider.d.ts +2 -2
  229. package/dist/lib/providers/linear-provider.js.map +1 -1
  230. package/dist/lib/providers/resolver.d.ts +3 -3
  231. package/dist/lib/providers/resolver.js.map +1 -1
  232. package/dist/lib/providers/state-intents.d.ts +44 -0
  233. package/dist/lib/providers/state-intents.js +101 -0
  234. package/dist/lib/providers/state-intents.js.map +1 -0
  235. package/dist/lib/providers/state-resolution.d.ts +137 -0
  236. package/dist/lib/providers/state-resolution.js +302 -0
  237. package/dist/lib/providers/state-resolution.js.map +1 -0
  238. package/dist/lib/providers/status-mapping.d.ts +2 -2
  239. package/dist/lib/providers/status-mapping.js.map +1 -1
  240. package/dist/lib/providers/trigger-config.d.ts +4 -4
  241. package/dist/lib/providers/trigger-config.js.map +1 -1
  242. package/dist/lib/providers/types.d.ts +2 -1
  243. package/dist/lib/registry/index.js +4 -11
  244. package/dist/lib/registry/index.js.map +1 -1
  245. package/dist/lib/repos/index.js +3 -0
  246. package/dist/lib/repos/index.js.map +1 -1
  247. package/dist/lib/shortcut/config.d.ts +8 -8
  248. package/dist/lib/shortcut/config.js.map +1 -1
  249. package/dist/lib/trello/config.d.ts +10 -10
  250. package/dist/lib/trello/config.js.map +1 -1
  251. package/dist/lib/trello/mapper.d.ts +2 -2
  252. package/dist/lib/trello/mapper.js.map +1 -1
  253. package/dist/lib/work-lifecycle/action-chaining.d.ts +3 -3
  254. package/dist/lib/work-lifecycle/action-chaining.js.map +1 -1
  255. package/dist/lib/work-lifecycle/hooks/manager.d.ts +3 -3
  256. package/dist/lib/work-lifecycle/hooks/manager.js.map +1 -1
  257. package/dist/lib/work-lifecycle/hooks/storage.d.ts +3 -3
  258. package/dist/lib/work-lifecycle/hooks/storage.js.map +1 -1
  259. package/dist/lib/work-lifecycle/post-execution.d.ts +2 -2
  260. package/dist/lib/work-lifecycle/post-execution.js +47 -28
  261. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  262. package/dist/lib/work-lifecycle/rule-evaluator.d.ts +3 -3
  263. package/dist/lib/work-lifecycle/rule-evaluator.js.map +1 -1
  264. package/dist/lib/work-source/config.d.ts +6 -6
  265. package/dist/lib/work-source/config.js.map +1 -1
  266. package/dist/lib/work-source/provider-sources.d.ts +12 -12
  267. package/dist/lib/work-source/provider-sources.js.map +1 -1
  268. package/dist/lib/workspace-config.d.ts +19 -0
  269. package/dist/lib/workspace-config.js +32 -0
  270. package/dist/lib/workspace-config.js.map +1 -1
  271. package/oclif.manifest.json +776 -661
  272. package/package.json +3 -4
  273. package/bin/validate-better-sqlite3.cjs +0 -129
  274. package/dist/lib/database/native-validation.d.ts +0 -40
  275. package/dist/lib/database/native-validation.js +0 -123
  276. package/dist/lib/database/native-validation.js.map +0 -1
@@ -4,8 +4,7 @@
4
4
  * Raw SQL operations required for PMO initialization and teardown.
5
5
  * These run before the storage layer is available.
6
6
  */
7
- import Database from 'better-sqlite3';
8
- import { throwIfNativeBindingError } from './native-validation.js';
7
+ import { SqliteDatabase } from './sqlite.js';
9
8
  import { createDrizzleConnection } from './drizzle.js';
10
9
  import { workspaceSettings as workspaceSettingsTable, } from './drizzle-schema.js';
11
10
  /**
@@ -13,14 +12,7 @@ import { workspaceSettings as workspaceSettingsTable, } from './drizzle-schema.j
13
12
  * Raw SQL: uses sqlite_master introspection (pre-migration bootstrap).
14
13
  */
15
14
  export function checkPMOExists(dbPath) {
16
- let db;
17
- try {
18
- db = new Database(dbPath);
19
- }
20
- catch (error) {
21
- throwIfNativeBindingError(error, 'checkPMOExists');
22
- throw error;
23
- }
15
+ const db = new SqliteDatabase(dbPath);
24
16
  try {
25
17
  const result = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pmo_projects'").get();
26
18
  if (result === undefined) {
@@ -43,14 +35,7 @@ export function checkPMOExists(dbPath) {
43
35
  * Raw SQL: pre-migration bootstrap query.
44
36
  */
45
37
  export function getPMOSetting(dbPath, key) {
46
- let db;
47
- try {
48
- db = new Database(dbPath);
49
- }
50
- catch (error) {
51
- throwIfNativeBindingError(error, 'getPMOSetting');
52
- throw error;
53
- }
38
+ const db = new SqliteDatabase(dbPath);
54
39
  try {
55
40
  const result = db.prepare('SELECT value FROM pmo_settings WHERE key = ?').get(key);
56
41
  return result?.value ?? null;
@@ -67,14 +52,7 @@ export function getPMOSetting(dbPath, key) {
67
52
  * Raw SQL: DDL operations (DROP TABLE) are not supported by Drizzle.
68
53
  */
69
54
  export function dropPMOTables(dbPath, tables) {
70
- let db;
71
- try {
72
- db = new Database(dbPath);
73
- }
74
- catch (error) {
75
- throwIfNativeBindingError(error, 'dropPMOTables');
76
- throw error;
77
- }
55
+ const db = new SqliteDatabase(dbPath);
78
56
  try {
79
57
  for (const table of tables) {
80
58
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"pmo-bootstrap.js","sourceRoot":"","sources":["../../../src/lib/database/pmo-bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pmo-bootstrap.js","sourceRoot":"","sources":["../../../src/lib/database/pmo-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EACL,iBAAiB,IAAI,sBAAsB,GAC5C,MAAM,qBAAqB,CAAA;AAE5B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,2EAA2E,CAC5E,CAAC,GAAG,EAAE,CAAA;QAEP,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAA;QAC3D,CAAC;QAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAuB,CAAA;QAC9G,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAAuB,CAAA;QAE5G,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,kBAAkB,CAAC,KAAK;YACtC,WAAW,EAAE,iBAAiB,CAAC,KAAK;SACrC,CAAA;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAW;IACvD,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAkC,CAAA;QACnH,OAAO,MAAM,EAAE,KAAK,IAAI,IAAI,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,MAAgB;IAC5D,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,OAAO,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAkB,EAAE,GAAW,EAAE,KAAa;IACnF,MAAM,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAA;IACvC,GAAG,CAAC,MAAM,CAAC,sBAAsB,CAAC;SAC/B,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACtB,kBAAkB,CAAC;QAClB,MAAM,EAAE,sBAAsB,CAAC,GAAG;QAClC,GAAG,EAAE,EAAE,KAAK,EAAE;KACf,CAAC;SACD,GAAG,EAAE,CAAA;AACV,CAAC"}
@@ -43,7 +43,7 @@ export function getWorkspaceRepositories(workspacePath) {
43
43
  const rows = ddb.select().from(repositoriesTable)
44
44
  .orderBy(asc(repositoriesTable.addedAt))
45
45
  .all();
46
- return rows.map(row => ({
46
+ return rows.map((row) => ({
47
47
  name: row.name,
48
48
  path: row.path,
49
49
  type: (row.type || 'main'),
@@ -1 +1 @@
1
- {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../../src/lib/database/repositories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EACL,YAAY,IAAI,iBAAiB,GAClC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAW5C;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAqB,EAAE,KAAgG;IAC/J,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;iBAC1B,MAAM,CAAC;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;gBAC3B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,iBAAiB,CAAC,IAAI;gBAC9B,GAAG,EAAE;oBACH,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;oBAC3B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAClC;aACF,CAAC;iBACD,GAAG,EAAE,CAAA;QACV,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAAqB;IAC5D,OAAO,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;aACvC,GAAG,EAAE,CAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAA0B;YACnD,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACtC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAA0C;YAC1E,QAAQ,EAAE,GAAG,CAAC,OAAO;SACtB,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../../src/lib/database/repositories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EACL,YAAY,IAAI,iBAAiB,GAClC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAW5C;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAqB,EAAE,KAAgG;IAC/J,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;iBAC1B,MAAM,CAAC;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;gBAC3B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,iBAAiB,CAAC,IAAI;gBAC9B,GAAG,EAAE;oBACH,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;oBAC3B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAClC;aACF,CAAC;iBACD,GAAG,EAAE,CAAA;QACV,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAAqB;IAC5D,OAAO,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;aACvC,GAAG,EAAE,CAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAA0B;YACnD,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;YACtC,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAA0C;YAC1E,QAAQ,EAAE,GAAG,CAAC,OAAO;SACtB,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -8,7 +8,7 @@
8
8
  * All workspace settings access should go through this store.
9
9
  */
10
10
  import type { DatabaseDriver } from './driver.js';
11
- import Database from 'better-sqlite3';
11
+ import { SqliteDatabase } from './sqlite.js';
12
12
  /**
13
13
  * Provides CRUD access to the workspace_settings key-value table.
14
14
  *
@@ -27,7 +27,7 @@ export declare class SettingsStore {
27
27
  * Accepts either a DatabaseDriver or a raw better-sqlite3 Database
28
28
  * (for backward compatibility during migration).
29
29
  */
30
- constructor(driverOrDb: DatabaseDriver | Database.Database);
30
+ constructor(driverOrDb: DatabaseDriver | SqliteDatabase);
31
31
  /**
32
32
  * Get a setting value by key. Returns null if not found.
33
33
  */
@@ -57,4 +57,4 @@ export declare class SettingsStore {
57
57
  * Create a SettingsStore from a raw better-sqlite3 Database.
58
58
  * Convenience function for backward compatibility.
59
59
  */
60
- export declare function createSettingsStore(db: Database.Database): SettingsStore;
60
+ export declare function createSettingsStore(db: SqliteDatabase): SettingsStore;
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * All workspace settings access should go through this store.
9
9
  */
10
- import Database from 'better-sqlite3';
10
+ import { SqliteDatabase } from './sqlite.js';
11
11
  import { wrapDatabase } from './driver.js';
12
12
  const SETTINGS_TABLE = 'workspace_settings';
13
13
  /**
@@ -29,7 +29,7 @@ export class SettingsStore {
29
29
  * (for backward compatibility during migration).
30
30
  */
31
31
  constructor(driverOrDb) {
32
- if (driverOrDb instanceof Database) {
32
+ if (driverOrDb instanceof SqliteDatabase) {
33
33
  this.driver = wrapDatabase(driverOrDb);
34
34
  }
35
35
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../../src/lib/database/settings-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAgB;IAE9B;;;;OAIG;IACH,YAAY,UAA8C;QACxD,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;aACpB,OAAO,CAAoB,qBAAqB,cAAc,gBAAgB,CAAC;aAC/E,GAAG,CAAC,GAAG,CAAC,CAAA;QACX,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW,EAAE,KAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACJ,cAAc;;;KAG7B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,cAAc,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7E,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,MAAM;aACf,OAAO,CAAiC,0BAA0B,cAAc,mBAAmB,CAAC;aACpG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;IACtB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAqB;IACvD,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;AAC9B,CAAC"}
1
+ {"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../../src/lib/database/settings-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAgB;IAE9B;;;;OAIG;IACH,YAAY,UAA2C;QACrD,IAAI,UAAU,YAAY,cAAc,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM;aACpB,OAAO,CAAoB,qBAAqB,cAAc,gBAAgB,CAAC;aAC/E,GAAG,CAAC,GAAG,CAAC,CAAA;QACX,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW,EAAE,KAAa;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACJ,cAAc;;;KAG7B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,cAAc,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7E,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,MAAM;aACf,OAAO,CAAiC,0BAA0B,cAAc,mBAAmB,CAAC;aACpG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;IACtB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAkB;IACpD,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * sql.js SQLite Compatibility Layer
3
+ *
4
+ * Provides a SqliteDatabase class that wraps sql.js (pure JS/WASM SQLite)
5
+ * with a better-sqlite3-compatible API. This allows the rest of the codebase
6
+ * to use the same .prepare(), .exec(), .pragma(), .transaction() methods
7
+ * without modification.
8
+ *
9
+ * Key differences from better-sqlite3:
10
+ * - Database is loaded into memory from file on open
11
+ * - Changes are written back to file on close() or save()
12
+ * - No native module compilation required
13
+ * - WASM must be initialized once via initSqlite() before use
14
+ *
15
+ * See: PRLT-1074
16
+ */
17
+ import { type Database as RawSqlJsDatabase } from 'sql.js';
18
+ /**
19
+ * Initialize the sql.js WASM module. Must be called once before creating
20
+ * any SqliteDatabase instances (typically in the init hook).
21
+ *
22
+ * This is the only async operation — after initialization, all database
23
+ * operations are synchronous.
24
+ */
25
+ export declare function initSqlite(): Promise<void>;
26
+ /**
27
+ * Result of executing a statement that modifies data.
28
+ * Compatible with better-sqlite3's RunResult.
29
+ */
30
+ export interface RunResult {
31
+ changes: number;
32
+ lastInsertRowid: number | bigint;
33
+ }
34
+ /**
35
+ * Wraps sql.js statement execution to provide better-sqlite3-compatible
36
+ * .run(), .get(), .all() methods.
37
+ *
38
+ * Statements are re-prepared on each call for simplicity and safety.
39
+ * For a CLI doing dozens of queries per command, the overhead is negligible.
40
+ */
41
+ declare class SqlitePreparedStatement<T = any> {
42
+ private db;
43
+ private sql;
44
+ private readonly _readonly;
45
+ private readonly _onWrite?;
46
+ constructor(db: RawSqlJsDatabase, sql: string, _readonly?: boolean, _onWrite?: (() => void) | undefined);
47
+ /**
48
+ * Execute the statement and return change info (INSERT/UPDATE/DELETE).
49
+ */
50
+ run(...params: unknown[]): RunResult;
51
+ /**
52
+ * Execute the statement and return the first matching row.
53
+ */
54
+ get(...params: unknown[]): T | undefined;
55
+ /**
56
+ * Execute the statement and return all matching rows.
57
+ */
58
+ all(...params: unknown[]): T[];
59
+ }
60
+ /**
61
+ * A synchronous SQLite database backed by sql.js (WASM).
62
+ *
63
+ * Provides the same API surface as better-sqlite3's Database class:
64
+ * .prepare(), .exec(), .pragma(), .transaction(), .close()
65
+ *
66
+ * File persistence: Write operations automatically flush changes to disk,
67
+ * matching better-sqlite3's write-through behavior. This ensures that
68
+ * separate connections reading the same file see committed changes.
69
+ */
70
+ export declare class SqliteDatabase {
71
+ private _db;
72
+ private _dbPath;
73
+ private _open;
74
+ private _readonly;
75
+ private _savepointCounter;
76
+ private _transactionDepth;
77
+ /** Timestamp of last load/save — used to detect external file modifications */
78
+ private _lastSyncMs;
79
+ constructor(pathOrMemory: string, options?: {
80
+ readonly?: boolean;
81
+ });
82
+ /**
83
+ * Check if the underlying file was modified by another connection.
84
+ * If so, reload the database from disk to see the latest changes.
85
+ * This provides behavior similar to better-sqlite3's shared file access.
86
+ */
87
+ private _checkForExternalChanges;
88
+ /**
89
+ * Prepare a SQL statement for execution.
90
+ * Returns an object with .run(), .get(), .all() methods
91
+ * compatible with better-sqlite3's prepared statements.
92
+ */
93
+ prepare<T = any>(sql: string): SqlitePreparedStatement<T>;
94
+ /**
95
+ * Execute raw SQL (DDL, multi-statement). No return value.
96
+ */
97
+ exec(sql: string): void;
98
+ /**
99
+ * Get or set SQLite pragmas.
100
+ * Converts better-sqlite3's pragma syntax to sql.js exec calls.
101
+ *
102
+ * Note: WAL mode and busy_timeout are no-ops in sql.js (in-memory).
103
+ * They execute without error but don't change behavior.
104
+ */
105
+ pragma(source: string, options?: {
106
+ simple?: boolean;
107
+ }): unknown;
108
+ /**
109
+ * Create a transaction function.
110
+ * Returns a new function that, when called, runs the wrapped function
111
+ * inside a SQLite transaction.
112
+ *
113
+ * Uses SAVEPOINT/RELEASE for all levels, which correctly handles:
114
+ * - Top-level calls (SAVEPOINT implicitly starts a transaction)
115
+ * - Nested calls within other transactions
116
+ * - Calls within externally-created savepoints (e.g., test helpers)
117
+ *
118
+ * Auto-save is deferred until the outermost transaction completes,
119
+ * so nested writes don't flush to disk until the whole transaction commits.
120
+ */
121
+ transaction<F extends (...args: unknown[]) => unknown>(fn: F): F;
122
+ /**
123
+ * Auto-save to disk after write operations when not inside a transaction.
124
+ * This matches better-sqlite3's write-through behavior where changes
125
+ * are visible to other connections immediately.
126
+ */
127
+ private _autoSave;
128
+ /**
129
+ * Close the database connection and write changes to disk.
130
+ * After closing, the database cannot be used.
131
+ */
132
+ close(): void;
133
+ /**
134
+ * Write the current in-memory database to the file on disk.
135
+ * No-op for in-memory databases or readonly connections.
136
+ */
137
+ save(): void;
138
+ /**
139
+ * Reload the database from disk, refreshing the in-memory state.
140
+ * Useful when another connection has modified the same file.
141
+ * No-op for in-memory databases.
142
+ */
143
+ reload(): void;
144
+ /**
145
+ * Whether the database connection is open.
146
+ */
147
+ get open(): boolean;
148
+ /**
149
+ * Access the underlying raw sql.js Database instance.
150
+ * Used for Drizzle ORM interop.
151
+ * @internal
152
+ */
153
+ get rawDatabase(): RawSqlJsDatabase;
154
+ }
155
+ export {};
@@ -0,0 +1,358 @@
1
+ /**
2
+ * sql.js SQLite Compatibility Layer
3
+ *
4
+ * Provides a SqliteDatabase class that wraps sql.js (pure JS/WASM SQLite)
5
+ * with a better-sqlite3-compatible API. This allows the rest of the codebase
6
+ * to use the same .prepare(), .exec(), .pragma(), .transaction() methods
7
+ * without modification.
8
+ *
9
+ * Key differences from better-sqlite3:
10
+ * - Database is loaded into memory from file on open
11
+ * - Changes are written back to file on close() or save()
12
+ * - No native module compilation required
13
+ * - WASM must be initialized once via initSqlite() before use
14
+ *
15
+ * See: PRLT-1074
16
+ */
17
+ import initSqlJs from 'sql.js';
18
+ import * as fs from 'node:fs';
19
+ // =============================================================================
20
+ // WASM Module Initialization
21
+ // =============================================================================
22
+ let _SQL = null;
23
+ /**
24
+ * Initialize the sql.js WASM module. Must be called once before creating
25
+ * any SqliteDatabase instances (typically in the init hook).
26
+ *
27
+ * This is the only async operation — after initialization, all database
28
+ * operations are synchronous.
29
+ */
30
+ export async function initSqlite() {
31
+ if (!_SQL) {
32
+ _SQL = await initSqlJs();
33
+ }
34
+ }
35
+ /**
36
+ * Get the initialized sql.js module. Throws if initSqlite() hasn't been called.
37
+ */
38
+ function getSqlJs() {
39
+ if (!_SQL) {
40
+ throw new Error('sql.js WASM module not initialized. Call initSqlite() before creating databases.\n' +
41
+ 'This usually means the init hook did not run — check apps/cli/src/hooks/init.ts.');
42
+ }
43
+ return _SQL;
44
+ }
45
+ /**
46
+ * Wraps sql.js statement execution to provide better-sqlite3-compatible
47
+ * .run(), .get(), .all() methods.
48
+ *
49
+ * Statements are re-prepared on each call for simplicity and safety.
50
+ * For a CLI doing dozens of queries per command, the overhead is negligible.
51
+ */
52
+ class SqlitePreparedStatement {
53
+ db;
54
+ sql;
55
+ _readonly;
56
+ _onWrite;
57
+ constructor(db, sql, _readonly = false, _onWrite) {
58
+ this.db = db;
59
+ this.sql = sql;
60
+ this._readonly = _readonly;
61
+ this._onWrite = _onWrite;
62
+ }
63
+ /**
64
+ * Execute the statement and return change info (INSERT/UPDATE/DELETE).
65
+ */
66
+ run(...params) {
67
+ if (this._readonly) {
68
+ const trimmed = this.sql.trimStart().toUpperCase();
69
+ if (trimmed.startsWith('INSERT') || trimmed.startsWith('UPDATE') ||
70
+ trimmed.startsWith('DELETE') || trimmed.startsWith('DROP') ||
71
+ trimmed.startsWith('ALTER') || trimmed.startsWith('CREATE')) {
72
+ throw new Error('attempt to write a readonly database');
73
+ }
74
+ }
75
+ const stmt = this.db.prepare(this.sql);
76
+ try {
77
+ if (params.length > 0) {
78
+ stmt.bind(params.map(p => p === undefined ? null : p));
79
+ }
80
+ stmt.step();
81
+ }
82
+ finally {
83
+ stmt.free();
84
+ }
85
+ const changes = this.db.getRowsModified();
86
+ // Get lastInsertRowid via SQL (sql.js doesn't expose it directly)
87
+ const ridStmt = this.db.prepare('SELECT last_insert_rowid()');
88
+ let lastInsertRowid = 0;
89
+ try {
90
+ if (ridStmt.step()) {
91
+ lastInsertRowid = ridStmt.get()[0];
92
+ }
93
+ }
94
+ finally {
95
+ ridStmt.free();
96
+ }
97
+ // Auto-save to disk after write (matches better-sqlite3 behavior)
98
+ this._onWrite?.();
99
+ return { changes, lastInsertRowid };
100
+ }
101
+ /**
102
+ * Execute the statement and return the first matching row.
103
+ */
104
+ get(...params) {
105
+ const stmt = this.db.prepare(this.sql);
106
+ try {
107
+ if (params.length > 0) {
108
+ stmt.bind(params.map(p => p === undefined ? null : p));
109
+ }
110
+ if (stmt.step()) {
111
+ return stmt.getAsObject();
112
+ }
113
+ return undefined;
114
+ }
115
+ finally {
116
+ stmt.free();
117
+ }
118
+ }
119
+ /**
120
+ * Execute the statement and return all matching rows.
121
+ */
122
+ all(...params) {
123
+ const stmt = this.db.prepare(this.sql);
124
+ const results = [];
125
+ try {
126
+ if (params.length > 0) {
127
+ stmt.bind(params.map(p => p === undefined ? null : p));
128
+ }
129
+ while (stmt.step()) {
130
+ results.push(stmt.getAsObject());
131
+ }
132
+ return results;
133
+ }
134
+ finally {
135
+ stmt.free();
136
+ }
137
+ }
138
+ }
139
+ // =============================================================================
140
+ // SqliteDatabase Class
141
+ // =============================================================================
142
+ /**
143
+ * A synchronous SQLite database backed by sql.js (WASM).
144
+ *
145
+ * Provides the same API surface as better-sqlite3's Database class:
146
+ * .prepare(), .exec(), .pragma(), .transaction(), .close()
147
+ *
148
+ * File persistence: Write operations automatically flush changes to disk,
149
+ * matching better-sqlite3's write-through behavior. This ensures that
150
+ * separate connections reading the same file see committed changes.
151
+ */
152
+ export class SqliteDatabase {
153
+ _db;
154
+ _dbPath;
155
+ _open = true;
156
+ _readonly = false;
157
+ _savepointCounter = 0;
158
+ _transactionDepth = 0;
159
+ /** Timestamp of last load/save — used to detect external file modifications */
160
+ _lastSyncMs = 0;
161
+ constructor(pathOrMemory, options) {
162
+ const SQL = getSqlJs();
163
+ this._readonly = options?.readonly ?? false;
164
+ if (pathOrMemory === ':memory:') {
165
+ this._db = new SQL.Database();
166
+ this._dbPath = null;
167
+ }
168
+ else {
169
+ this._dbPath = pathOrMemory;
170
+ if (fs.existsSync(pathOrMemory)) {
171
+ const buf = fs.readFileSync(pathOrMemory);
172
+ this._db = new SQL.Database(buf);
173
+ this._lastSyncMs = fs.statSync(pathOrMemory).mtimeMs;
174
+ }
175
+ else {
176
+ // Create new empty database; write immediately so the file exists
177
+ this._db = new SQL.Database();
178
+ if (!this._readonly) {
179
+ const data = this._db.export();
180
+ fs.writeFileSync(pathOrMemory, Buffer.from(data));
181
+ this._lastSyncMs = fs.statSync(pathOrMemory).mtimeMs;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ /**
187
+ * Check if the underlying file was modified by another connection.
188
+ * If so, reload the database from disk to see the latest changes.
189
+ * This provides behavior similar to better-sqlite3's shared file access.
190
+ */
191
+ _checkForExternalChanges() {
192
+ if (!this._dbPath || !this._open || this._transactionDepth > 0)
193
+ return;
194
+ try {
195
+ const currentMtime = fs.statSync(this._dbPath).mtimeMs;
196
+ if (currentMtime > this._lastSyncMs) {
197
+ this.reload();
198
+ }
199
+ }
200
+ catch {
201
+ // File may have been deleted — ignore
202
+ }
203
+ }
204
+ /**
205
+ * Prepare a SQL statement for execution.
206
+ * Returns an object with .run(), .get(), .all() methods
207
+ * compatible with better-sqlite3's prepared statements.
208
+ */
209
+ prepare(sql) {
210
+ this._checkForExternalChanges();
211
+ return new SqlitePreparedStatement(this._db, sql, this._readonly, () => this._autoSave());
212
+ }
213
+ /**
214
+ * Execute raw SQL (DDL, multi-statement). No return value.
215
+ */
216
+ exec(sql) {
217
+ this._checkForExternalChanges();
218
+ if (this._readonly) {
219
+ const trimmed = sql.trimStart().toUpperCase();
220
+ if (trimmed.startsWith('INSERT') || trimmed.startsWith('UPDATE') ||
221
+ trimmed.startsWith('DELETE') || trimmed.startsWith('DROP') ||
222
+ trimmed.startsWith('ALTER') || trimmed.startsWith('CREATE')) {
223
+ throw new Error('attempt to write a readonly database');
224
+ }
225
+ }
226
+ this._db.run(sql);
227
+ this._autoSave();
228
+ }
229
+ /**
230
+ * Get or set SQLite pragmas.
231
+ * Converts better-sqlite3's pragma syntax to sql.js exec calls.
232
+ *
233
+ * Note: WAL mode and busy_timeout are no-ops in sql.js (in-memory).
234
+ * They execute without error but don't change behavior.
235
+ */
236
+ pragma(source, options) {
237
+ try {
238
+ const results = this._db.exec(`PRAGMA ${source}`);
239
+ if (results.length === 0) {
240
+ return options?.simple ? undefined : [];
241
+ }
242
+ const columns = results[0].columns;
243
+ if (options?.simple) {
244
+ return results[0].values[0]?.[0];
245
+ }
246
+ // Return as array of objects (same shape as better-sqlite3)
247
+ return results[0].values.map((row) => {
248
+ const obj = {};
249
+ columns.forEach((col, i) => {
250
+ obj[col] = row[i];
251
+ });
252
+ return obj;
253
+ });
254
+ }
255
+ catch {
256
+ // Some pragmas may not be supported in sql.js; return safe defaults
257
+ return options?.simple ? undefined : [];
258
+ }
259
+ }
260
+ /**
261
+ * Create a transaction function.
262
+ * Returns a new function that, when called, runs the wrapped function
263
+ * inside a SQLite transaction.
264
+ *
265
+ * Uses SAVEPOINT/RELEASE for all levels, which correctly handles:
266
+ * - Top-level calls (SAVEPOINT implicitly starts a transaction)
267
+ * - Nested calls within other transactions
268
+ * - Calls within externally-created savepoints (e.g., test helpers)
269
+ *
270
+ * Auto-save is deferred until the outermost transaction completes,
271
+ * so nested writes don't flush to disk until the whole transaction commits.
272
+ */
273
+ transaction(fn) {
274
+ return ((...args) => {
275
+ const savepointName = `sp_${++this._savepointCounter}`;
276
+ this._transactionDepth++;
277
+ this._db.run(`SAVEPOINT ${savepointName}`);
278
+ try {
279
+ const result = fn(...args);
280
+ this._db.run(`RELEASE ${savepointName}`);
281
+ this._transactionDepth--;
282
+ if (this._transactionDepth === 0) {
283
+ this._autoSave();
284
+ }
285
+ return result;
286
+ }
287
+ catch (e) {
288
+ this._db.run(`ROLLBACK TO ${savepointName}`);
289
+ this._db.run(`RELEASE ${savepointName}`);
290
+ this._transactionDepth--;
291
+ throw e;
292
+ }
293
+ });
294
+ }
295
+ /**
296
+ * Auto-save to disk after write operations when not inside a transaction.
297
+ * This matches better-sqlite3's write-through behavior where changes
298
+ * are visible to other connections immediately.
299
+ */
300
+ _autoSave() {
301
+ if (this._transactionDepth === 0) {
302
+ this.save();
303
+ }
304
+ }
305
+ /**
306
+ * Close the database connection and write changes to disk.
307
+ * After closing, the database cannot be used.
308
+ */
309
+ close() {
310
+ if (!this._open)
311
+ return;
312
+ this.save();
313
+ this._db.close();
314
+ this._open = false;
315
+ }
316
+ /**
317
+ * Write the current in-memory database to the file on disk.
318
+ * No-op for in-memory databases or readonly connections.
319
+ */
320
+ save() {
321
+ if (this._dbPath && !this._readonly && this._open) {
322
+ const data = this._db.export();
323
+ fs.writeFileSync(this._dbPath, Buffer.from(data));
324
+ this._lastSyncMs = fs.statSync(this._dbPath).mtimeMs;
325
+ }
326
+ }
327
+ /**
328
+ * Reload the database from disk, refreshing the in-memory state.
329
+ * Useful when another connection has modified the same file.
330
+ * No-op for in-memory databases.
331
+ */
332
+ reload() {
333
+ if (!this._dbPath || !this._open)
334
+ return;
335
+ if (fs.existsSync(this._dbPath)) {
336
+ const buf = fs.readFileSync(this._dbPath);
337
+ this._db.close();
338
+ const SQL = getSqlJs();
339
+ this._db = new SQL.Database(buf);
340
+ this._lastSyncMs = fs.statSync(this._dbPath).mtimeMs;
341
+ }
342
+ }
343
+ /**
344
+ * Whether the database connection is open.
345
+ */
346
+ get open() {
347
+ return this._open;
348
+ }
349
+ /**
350
+ * Access the underlying raw sql.js Database instance.
351
+ * Used for Drizzle ORM interop.
352
+ * @internal
353
+ */
354
+ get rawDatabase() {
355
+ return this._db;
356
+ }
357
+ }
358
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/lib/database/sqlite.ts"],"names":[],"mappings":"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"}