@aligndottech/cli 0.49.0 → 0.50.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 (622) hide show
  1. package/README.md +4 -3
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +26 -8
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +4 -1
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +18 -2
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/connect.d.ts +5 -0
  12. package/dist/commands/connect.d.ts.map +1 -1
  13. package/dist/commands/connect.js +24 -0
  14. package/dist/commands/connect.js.map +1 -1
  15. package/dist/commands/import/confluence.d.ts.map +1 -1
  16. package/dist/commands/import/confluence.js +24 -5
  17. package/dist/commands/import/confluence.js.map +1 -1
  18. package/dist/commands/import/docs.js +2 -2
  19. package/dist/commands/import/git.d.ts.map +1 -1
  20. package/dist/commands/import/git.js +15 -5
  21. package/dist/commands/import/git.js.map +1 -1
  22. package/dist/commands/import/github.d.ts.map +1 -1
  23. package/dist/commands/import/github.js +34 -7
  24. package/dist/commands/import/github.js.map +1 -1
  25. package/dist/commands/import/gitlab.d.ts.map +1 -1
  26. package/dist/commands/import/gitlab.js +10 -5
  27. package/dist/commands/import/gitlab.js.map +1 -1
  28. package/dist/commands/import/jira.d.ts.map +1 -1
  29. package/dist/commands/import/jira.js +10 -5
  30. package/dist/commands/import/jira.js.map +1 -1
  31. package/dist/commands/import/linear.d.ts.map +1 -1
  32. package/dist/commands/import/linear.js +10 -5
  33. package/dist/commands/import/linear.js.map +1 -1
  34. package/dist/commands/import/notion.d.ts.map +1 -1
  35. package/dist/commands/import/notion.js +10 -5
  36. package/dist/commands/import/notion.js.map +1 -1
  37. package/dist/commands/import/sessions.js +2 -2
  38. package/dist/commands/import/slack.d.ts.map +1 -1
  39. package/dist/commands/import/slack.js +12 -7
  40. package/dist/commands/import/slack.js.map +1 -1
  41. package/dist/commands/import/teams.d.ts.map +1 -1
  42. package/dist/commands/import/teams.js +10 -5
  43. package/dist/commands/import/teams.js.map +1 -1
  44. package/dist/commands/import/zoom.d.ts.map +1 -1
  45. package/dist/commands/import/zoom.js +10 -5
  46. package/dist/commands/import/zoom.js.map +1 -1
  47. package/dist/commands/import.d.ts.map +1 -1
  48. package/dist/commands/import.js +43 -1
  49. package/dist/commands/import.js.map +1 -1
  50. package/dist/commands/local.d.ts.map +1 -1
  51. package/dist/commands/local.js +76 -4
  52. package/dist/commands/local.js.map +1 -1
  53. package/dist/commands/mark.d.ts +37 -0
  54. package/dist/commands/mark.d.ts.map +1 -0
  55. package/dist/commands/mark.js +105 -0
  56. package/dist/commands/mark.js.map +1 -0
  57. package/dist/commands/mcp.d.ts +141 -2
  58. package/dist/commands/mcp.d.ts.map +1 -1
  59. package/dist/commands/mcp.js +72 -14
  60. package/dist/commands/mcp.js.map +1 -1
  61. package/dist/commands/registry.d.ts.map +1 -1
  62. package/dist/commands/registry.js +8 -2
  63. package/dist/commands/registry.js.map +1 -1
  64. package/dist/commands/setup.d.ts +39 -0
  65. package/dist/commands/setup.d.ts.map +1 -1
  66. package/dist/commands/setup.js +65 -50
  67. package/dist/commands/setup.js.map +1 -1
  68. package/dist/commands/share.d.ts +7 -0
  69. package/dist/commands/share.d.ts.map +1 -0
  70. package/dist/commands/share.js +60 -0
  71. package/dist/commands/share.js.map +1 -0
  72. package/dist/commands/sync.d.ts +55 -0
  73. package/dist/commands/sync.d.ts.map +1 -0
  74. package/dist/commands/sync.js +278 -0
  75. package/dist/commands/sync.js.map +1 -0
  76. package/dist/commands/telemetry.d.ts +3 -3
  77. package/dist/commands/telemetry.js +6 -6
  78. package/dist/commands/telemetry.js.map +1 -1
  79. package/dist/commands/why.d.ts.map +1 -1
  80. package/dist/commands/why.js +6 -1
  81. package/dist/commands/why.js.map +1 -1
  82. package/dist/index.d.ts +2 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +2 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/lib/backfill-state.d.ts +116 -0
  87. package/dist/lib/backfill-state.d.ts.map +1 -0
  88. package/dist/lib/backfill-state.js +342 -0
  89. package/dist/lib/backfill-state.js.map +1 -0
  90. package/dist/lib/backup-copy.d.ts +17 -0
  91. package/dist/lib/backup-copy.d.ts.map +1 -0
  92. package/dist/lib/backup-copy.js +13 -0
  93. package/dist/lib/backup-copy.js.map +1 -0
  94. package/dist/lib/capture-report.d.ts +22 -18
  95. package/dist/lib/capture-report.d.ts.map +1 -1
  96. package/dist/lib/capture-report.js +64 -2
  97. package/dist/lib/capture-report.js.map +1 -1
  98. package/dist/lib/config.d.ts +31 -0
  99. package/dist/lib/config.d.ts.map +1 -1
  100. package/dist/lib/config.js +139 -0
  101. package/dist/lib/config.js.map +1 -1
  102. package/dist/lib/confirm-timeout.d.ts +8 -0
  103. package/dist/lib/confirm-timeout.d.ts.map +1 -0
  104. package/dist/lib/confirm-timeout.js +18 -0
  105. package/dist/lib/confirm-timeout.js.map +1 -0
  106. package/dist/lib/curation/check-marks.d.ts +48 -0
  107. package/dist/lib/curation/check-marks.d.ts.map +1 -0
  108. package/dist/lib/curation/check-marks.js +81 -0
  109. package/dist/lib/curation/check-marks.js.map +1 -0
  110. package/dist/lib/curation/guardrail.d.ts +39 -0
  111. package/dist/lib/curation/guardrail.d.ts.map +1 -0
  112. package/dist/lib/curation/guardrail.js +93 -0
  113. package/dist/lib/curation/guardrail.js.map +1 -0
  114. package/dist/lib/curation/judge.d.ts +3 -0
  115. package/dist/lib/curation/judge.d.ts.map +1 -0
  116. package/dist/lib/curation/judge.js +9 -0
  117. package/dist/lib/curation/judge.js.map +1 -0
  118. package/dist/lib/curation/judgements-db.d.ts +96 -0
  119. package/dist/lib/curation/judgements-db.d.ts.map +1 -0
  120. package/dist/lib/curation/judgements-db.js +200 -0
  121. package/dist/lib/curation/judgements-db.js.map +1 -0
  122. package/dist/lib/curation/last-check.d.ts +32 -0
  123. package/dist/lib/curation/last-check.d.ts.map +1 -0
  124. package/dist/lib/curation/last-check.js +81 -0
  125. package/dist/lib/curation/last-check.js.map +1 -0
  126. package/dist/lib/curation/mark.d.ts +76 -0
  127. package/dist/lib/curation/mark.d.ts.map +1 -0
  128. package/dist/lib/curation/mark.js +359 -0
  129. package/dist/lib/curation/mark.js.map +1 -0
  130. package/dist/lib/curation/text.d.ts +6 -0
  131. package/dist/lib/curation/text.d.ts.map +1 -0
  132. package/dist/lib/curation/text.js +35 -0
  133. package/dist/lib/curation/text.js.map +1 -0
  134. package/dist/lib/fetchers/capture.d.ts +49 -2
  135. package/dist/lib/fetchers/capture.d.ts.map +1 -1
  136. package/dist/lib/fetchers/capture.js +7 -1
  137. package/dist/lib/fetchers/capture.js.map +1 -1
  138. package/dist/lib/fetchers/confluence.d.ts +2 -2
  139. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  140. package/dist/lib/fetchers/confluence.js.map +1 -1
  141. package/dist/lib/fetchers/git.d.ts +1 -0
  142. package/dist/lib/fetchers/git.d.ts.map +1 -1
  143. package/dist/lib/fetchers/git.js +3 -1
  144. package/dist/lib/fetchers/git.js.map +1 -1
  145. package/dist/lib/fetchers/github.d.ts +44 -5
  146. package/dist/lib/fetchers/github.d.ts.map +1 -1
  147. package/dist/lib/fetchers/github.js +122 -5
  148. package/dist/lib/fetchers/github.js.map +1 -1
  149. package/dist/lib/fetchers/gitlab.d.ts +2 -2
  150. package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
  151. package/dist/lib/fetchers/gitlab.js.map +1 -1
  152. package/dist/lib/fetchers/jira.d.ts +2 -2
  153. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  154. package/dist/lib/fetchers/jira.js.map +1 -1
  155. package/dist/lib/fetchers/linear.d.ts +2 -2
  156. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  157. package/dist/lib/fetchers/linear.js.map +1 -1
  158. package/dist/lib/fetchers/notion.d.ts +2 -2
  159. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  160. package/dist/lib/fetchers/notion.js.map +1 -1
  161. package/dist/lib/fetchers/slack.d.ts +2 -3
  162. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  163. package/dist/lib/fetchers/slack.js.map +1 -1
  164. package/dist/lib/fetchers/teams.d.ts +2 -2
  165. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  166. package/dist/lib/fetchers/teams.js.map +1 -1
  167. package/dist/lib/fetchers/zoom.d.ts +2 -2
  168. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  169. package/dist/lib/fetchers/zoom.js.map +1 -1
  170. package/dist/lib/gateway-client.d.ts +34 -0
  171. package/dist/lib/gateway-client.d.ts.map +1 -1
  172. package/dist/lib/gateway-client.js +19 -1
  173. package/dist/lib/gateway-client.js.map +1 -1
  174. package/dist/lib/github-text.d.ts +3 -0
  175. package/dist/lib/github-text.d.ts.map +1 -0
  176. package/dist/lib/github-text.js +18 -0
  177. package/dist/lib/github-text.js.map +1 -0
  178. package/dist/lib/hook-context.d.ts +10 -0
  179. package/dist/lib/hook-context.d.ts.map +1 -1
  180. package/dist/lib/hook-context.js +14 -0
  181. package/dist/lib/hook-context.js.map +1 -1
  182. package/dist/lib/import-defaults.d.ts +39 -23
  183. package/dist/lib/import-defaults.d.ts.map +1 -1
  184. package/dist/lib/import-defaults.js +28 -26
  185. package/dist/lib/import-defaults.js.map +1 -1
  186. package/dist/lib/launch/adapters/aider.d.ts +17 -0
  187. package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
  188. package/dist/lib/launch/adapters/aider.js +30 -0
  189. package/dist/lib/launch/adapters/aider.js.map +1 -0
  190. package/dist/lib/launch/adapters/auggie.d.ts +18 -0
  191. package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
  192. package/dist/lib/launch/adapters/auggie.js +34 -0
  193. package/dist/lib/launch/adapters/auggie.js.map +1 -0
  194. package/dist/lib/launch/adapters/cline.d.ts +10 -0
  195. package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
  196. package/dist/lib/launch/adapters/cline.js +41 -0
  197. package/dist/lib/launch/adapters/cline.js.map +1 -0
  198. package/dist/lib/launch/adapters/continue.d.ts +22 -0
  199. package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
  200. package/dist/lib/launch/adapters/continue.js +46 -0
  201. package/dist/lib/launch/adapters/continue.js.map +1 -0
  202. package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
  203. package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
  204. package/dist/lib/launch/adapters/gemini-cli.js +38 -53
  205. package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
  206. package/dist/lib/launch/adapters/goose.d.ts +20 -0
  207. package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
  208. package/dist/lib/launch/adapters/goose.js +47 -0
  209. package/dist/lib/launch/adapters/goose.js.map +1 -0
  210. package/dist/lib/launch/adapters/notes.d.ts +7 -0
  211. package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
  212. package/dist/lib/launch/adapters/notes.js +5 -0
  213. package/dist/lib/launch/adapters/notes.js.map +1 -0
  214. package/dist/lib/launch/agents.d.ts +2 -0
  215. package/dist/lib/launch/agents.d.ts.map +1 -1
  216. package/dist/lib/launch/agents.js +3 -1
  217. package/dist/lib/launch/agents.js.map +1 -1
  218. package/dist/lib/launch/auggie-state.d.ts +25 -0
  219. package/dist/lib/launch/auggie-state.d.ts.map +1 -0
  220. package/dist/lib/launch/auggie-state.js +74 -0
  221. package/dist/lib/launch/auggie-state.js.map +1 -0
  222. package/dist/lib/launch/cline-state.d.ts +32 -0
  223. package/dist/lib/launch/cline-state.d.ts.map +1 -0
  224. package/dist/lib/launch/cline-state.js +108 -0
  225. package/dist/lib/launch/cline-state.js.map +1 -0
  226. package/dist/lib/launch/config-writes.d.ts +4 -0
  227. package/dist/lib/launch/config-writes.d.ts.map +1 -1
  228. package/dist/lib/launch/config-writes.js +8 -3
  229. package/dist/lib/launch/config-writes.js.map +1 -1
  230. package/dist/lib/launch/continue-state.d.ts +41 -0
  231. package/dist/lib/launch/continue-state.d.ts.map +1 -0
  232. package/dist/lib/launch/continue-state.js +142 -0
  233. package/dist/lib/launch/continue-state.js.map +1 -0
  234. package/dist/lib/launch/detect.d.ts.map +1 -1
  235. package/dist/lib/launch/detect.js +3 -1
  236. package/dist/lib/launch/detect.js.map +1 -1
  237. package/dist/lib/launch/gemini-state.d.ts +26 -20
  238. package/dist/lib/launch/gemini-state.d.ts.map +1 -1
  239. package/dist/lib/launch/gemini-state.js +95 -37
  240. package/dist/lib/launch/gemini-state.js.map +1 -1
  241. package/dist/lib/launch/gemini-system-file.d.ts +17 -0
  242. package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
  243. package/dist/lib/launch/gemini-system-file.js +55 -0
  244. package/dist/lib/launch/gemini-system-file.js.map +1 -0
  245. package/dist/lib/launch/gemini-trust.d.ts +3 -1
  246. package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
  247. package/dist/lib/launch/gemini-trust.js +10 -3
  248. package/dist/lib/launch/gemini-trust.js.map +1 -1
  249. package/dist/lib/launch/goose-state.d.ts +53 -0
  250. package/dist/lib/launch/goose-state.d.ts.map +1 -0
  251. package/dist/lib/launch/goose-state.js +137 -0
  252. package/dist/lib/launch/goose-state.js.map +1 -0
  253. package/dist/lib/launch/launch-files.d.ts.map +1 -1
  254. package/dist/lib/launch/launch-files.js +3 -2
  255. package/dist/lib/launch/launch-files.js.map +1 -1
  256. package/dist/lib/launch/launch.d.ts +17 -2
  257. package/dist/lib/launch/launch.d.ts.map +1 -1
  258. package/dist/lib/launch/launch.js +36 -3
  259. package/dist/lib/launch/launch.js.map +1 -1
  260. package/dist/lib/launch/mcp-child-env.d.ts +30 -0
  261. package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
  262. package/dist/lib/launch/mcp-child-env.js +151 -0
  263. package/dist/lib/launch/mcp-child-env.js.map +1 -0
  264. package/dist/lib/launch/pick-agent.d.ts.map +1 -1
  265. package/dist/lib/launch/pick-agent.js +4 -4
  266. package/dist/lib/launch/pick-agent.js.map +1 -1
  267. package/dist/lib/launch/picker-options.d.ts.map +1 -1
  268. package/dist/lib/launch/picker-options.js +7 -2
  269. package/dist/lib/launch/picker-options.js.map +1 -1
  270. package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
  271. package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
  272. package/dist/lib/launch/registry/agents/aider.js +13 -0
  273. package/dist/lib/launch/registry/agents/aider.js.map +1 -0
  274. package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
  275. package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
  276. package/dist/lib/launch/registry/agents/auggie.js +11 -0
  277. package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
  278. package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
  279. package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
  280. package/dist/lib/launch/registry/agents/cline.js +19 -0
  281. package/dist/lib/launch/registry/agents/cline.js.map +1 -0
  282. package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
  283. package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
  284. package/dist/lib/launch/registry/agents/continue.js +20 -0
  285. package/dist/lib/launch/registry/agents/continue.js.map +1 -0
  286. package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
  287. package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
  288. package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
  289. package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
  290. package/dist/lib/launch/registry/agents/goose.js +20 -0
  291. package/dist/lib/launch/registry/agents/goose.js.map +1 -0
  292. package/dist/lib/launch/registry/index.d.ts +1 -1
  293. package/dist/lib/launch/registry/index.d.ts.map +1 -1
  294. package/dist/lib/launch/registry/index.js +7 -2
  295. package/dist/lib/launch/registry/index.js.map +1 -1
  296. package/dist/lib/launch/registry/types.d.ts +12 -1
  297. package/dist/lib/launch/registry/types.d.ts.map +1 -1
  298. package/dist/lib/launch/strict-entry.d.ts +22 -2
  299. package/dist/lib/launch/strict-entry.d.ts.map +1 -1
  300. package/dist/lib/launch/strict-entry.js +80 -2
  301. package/dist/lib/launch/strict-entry.js.map +1 -1
  302. package/dist/lib/launch/yaml-scan.d.ts +59 -0
  303. package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
  304. package/dist/lib/launch/yaml-scan.js +275 -0
  305. package/dist/lib/launch/yaml-scan.js.map +1 -0
  306. package/dist/lib/local-db-epoch.d.ts +4 -0
  307. package/dist/lib/local-db-epoch.d.ts.map +1 -0
  308. package/dist/lib/local-db-epoch.js +19 -0
  309. package/dist/lib/local-db-epoch.js.map +1 -0
  310. package/dist/lib/local-db-migrate.d.ts +85 -0
  311. package/dist/lib/local-db-migrate.d.ts.map +1 -0
  312. package/dist/lib/local-db-migrate.js +484 -0
  313. package/dist/lib/local-db-migrate.js.map +1 -0
  314. package/dist/lib/local-db-v10.d.ts +28 -0
  315. package/dist/lib/local-db-v10.d.ts.map +1 -0
  316. package/dist/lib/local-db-v10.js +49 -0
  317. package/dist/lib/local-db-v10.js.map +1 -0
  318. package/dist/lib/local-db-v11.d.ts +24 -0
  319. package/dist/lib/local-db-v11.d.ts.map +1 -0
  320. package/dist/lib/local-db-v11.js +25 -0
  321. package/dist/lib/local-db-v11.js.map +1 -0
  322. package/dist/lib/local-db-v7.d.ts +30 -0
  323. package/dist/lib/local-db-v7.d.ts.map +1 -0
  324. package/dist/lib/local-db-v7.js +285 -0
  325. package/dist/lib/local-db-v7.js.map +1 -0
  326. package/dist/lib/local-db-v8.d.ts +22 -0
  327. package/dist/lib/local-db-v8.d.ts.map +1 -0
  328. package/dist/lib/local-db-v8.js +33 -0
  329. package/dist/lib/local-db-v8.js.map +1 -0
  330. package/dist/lib/local-db-v9.d.ts +10 -0
  331. package/dist/lib/local-db-v9.d.ts.map +1 -0
  332. package/dist/lib/local-db-v9.js +8 -0
  333. package/dist/lib/local-db-v9.js.map +1 -0
  334. package/dist/lib/local-db.d.ts +61 -11
  335. package/dist/lib/local-db.d.ts.map +1 -1
  336. package/dist/lib/local-db.js +186 -371
  337. package/dist/lib/local-db.js.map +1 -1
  338. package/dist/lib/local-embeddings.d.ts.map +1 -1
  339. package/dist/lib/local-embeddings.js +2 -2
  340. package/dist/lib/local-embeddings.js.map +1 -1
  341. package/dist/lib/local-gateway-client.d.ts +30 -87
  342. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  343. package/dist/lib/local-gateway-client.js +182 -171
  344. package/dist/lib/local-gateway-client.js.map +1 -1
  345. package/dist/lib/local-ingest.d.ts +129 -0
  346. package/dist/lib/local-ingest.d.ts.map +1 -0
  347. package/dist/lib/local-ingest.js +81 -0
  348. package/dist/lib/local-ingest.js.map +1 -0
  349. package/dist/lib/local-link-pass.d.ts +15 -0
  350. package/dist/lib/local-link-pass.d.ts.map +1 -0
  351. package/dist/lib/local-link-pass.js +61 -0
  352. package/dist/lib/local-link-pass.js.map +1 -0
  353. package/dist/lib/local-mode.d.ts +4 -1
  354. package/dist/lib/local-mode.d.ts.map +1 -1
  355. package/dist/lib/local-mode.js +16 -1
  356. package/dist/lib/local-mode.js.map +1 -1
  357. package/dist/lib/local-provenance.d.ts +14 -0
  358. package/dist/lib/local-provenance.d.ts.map +1 -0
  359. package/dist/lib/local-provenance.js +14 -0
  360. package/dist/lib/local-provenance.js.map +1 -0
  361. package/dist/lib/local-thresholds.d.ts +70 -0
  362. package/dist/lib/local-thresholds.d.ts.map +1 -0
  363. package/dist/lib/local-thresholds.js +79 -0
  364. package/dist/lib/local-thresholds.js.map +1 -0
  365. package/dist/lib/mcp/mark-tool.d.ts +27 -0
  366. package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
  367. package/dist/lib/mcp/mark-tool.js +103 -0
  368. package/dist/lib/mcp/mark-tool.js.map +1 -0
  369. package/dist/lib/mcp/share-tool.d.ts +46 -0
  370. package/dist/lib/mcp/share-tool.d.ts.map +1 -0
  371. package/dist/lib/mcp/share-tool.js +68 -0
  372. package/dist/lib/mcp/share-tool.js.map +1 -0
  373. package/dist/lib/mcp/tool-rules.d.ts +30 -0
  374. package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
  375. package/dist/lib/mcp/tool-rules.js +84 -0
  376. package/dist/lib/mcp/tool-rules.js.map +1 -0
  377. package/dist/lib/mcp-backfill.d.ts +89 -0
  378. package/dist/lib/mcp-backfill.d.ts.map +1 -0
  379. package/dist/lib/mcp-backfill.js +194 -0
  380. package/dist/lib/mcp-backfill.js.map +1 -0
  381. package/dist/lib/mcp-scope.d.ts +90 -0
  382. package/dist/lib/mcp-scope.d.ts.map +1 -0
  383. package/dist/lib/mcp-scope.js +125 -0
  384. package/dist/lib/mcp-scope.js.map +1 -0
  385. package/dist/lib/mcp-sync.d.ts +64 -0
  386. package/dist/lib/mcp-sync.d.ts.map +1 -0
  387. package/dist/lib/mcp-sync.js +183 -0
  388. package/dist/lib/mcp-sync.js.map +1 -0
  389. package/dist/lib/personal-import.d.ts +7 -0
  390. package/dist/lib/personal-import.d.ts.map +1 -1
  391. package/dist/lib/personal-import.js +13 -1
  392. package/dist/lib/personal-import.js.map +1 -1
  393. package/dist/lib/safe-config-write.d.ts.map +1 -1
  394. package/dist/lib/safe-config-write.js +39 -2
  395. package/dist/lib/safe-config-write.js.map +1 -1
  396. package/dist/lib/scope-choices.d.ts +51 -0
  397. package/dist/lib/scope-choices.d.ts.map +1 -0
  398. package/dist/lib/scope-choices.js +193 -0
  399. package/dist/lib/scope-choices.js.map +1 -0
  400. package/dist/lib/scope-connect.d.ts +82 -0
  401. package/dist/lib/scope-connect.d.ts.map +1 -0
  402. package/dist/lib/scope-connect.js +258 -0
  403. package/dist/lib/scope-connect.js.map +1 -0
  404. package/dist/lib/scope-defaults.d.ts +3 -0
  405. package/dist/lib/scope-defaults.d.ts.map +1 -0
  406. package/dist/lib/scope-defaults.js +42 -0
  407. package/dist/lib/scope-defaults.js.map +1 -0
  408. package/dist/lib/scope-real.d.ts +223 -0
  409. package/dist/lib/scope-real.d.ts.map +1 -0
  410. package/dist/lib/scope-real.js +58 -0
  411. package/dist/lib/scope-real.js.map +1 -0
  412. package/dist/lib/scope-values.d.ts +76 -0
  413. package/dist/lib/scope-values.d.ts.map +1 -0
  414. package/dist/lib/scope-values.js +169 -0
  415. package/dist/lib/scope-values.js.map +1 -0
  416. package/dist/lib/scope.d.ts +161 -0
  417. package/dist/lib/scope.d.ts.map +1 -0
  418. package/dist/lib/scope.js +323 -0
  419. package/dist/lib/scope.js.map +1 -0
  420. package/dist/lib/share/command.d.ts +32 -0
  421. package/dist/lib/share/command.d.ts.map +1 -0
  422. package/dist/lib/share/command.js +136 -0
  423. package/dist/lib/share/command.js.map +1 -0
  424. package/dist/lib/share/ledger.d.ts +59 -0
  425. package/dist/lib/share/ledger.d.ts.map +1 -0
  426. package/dist/lib/share/ledger.js +135 -0
  427. package/dist/lib/share/ledger.js.map +1 -0
  428. package/dist/lib/share/payload.d.ts +92 -0
  429. package/dist/lib/share/payload.d.ts.map +1 -0
  430. package/dist/lib/share/payload.js +138 -0
  431. package/dist/lib/share/payload.js.map +1 -0
  432. package/dist/lib/share/pending.d.ts +48 -0
  433. package/dist/lib/share/pending.d.ts.map +1 -0
  434. package/dist/lib/share/pending.js +130 -0
  435. package/dist/lib/share/pending.js.map +1 -0
  436. package/dist/lib/share/preview.d.ts +18 -0
  437. package/dist/lib/share/preview.d.ts.map +1 -0
  438. package/dist/lib/share/preview.js +72 -0
  439. package/dist/lib/share/preview.js.map +1 -0
  440. package/dist/lib/share/run.d.ts +115 -0
  441. package/dist/lib/share/run.d.ts.map +1 -0
  442. package/dist/lib/share/run.js +261 -0
  443. package/dist/lib/share/run.js.map +1 -0
  444. package/dist/lib/share/salt.d.ts +2 -0
  445. package/dist/lib/share/salt.d.ts.map +1 -0
  446. package/dist/lib/share/salt.js +44 -0
  447. package/dist/lib/share/salt.js.map +1 -0
  448. package/dist/lib/share/secret-patterns.json +100 -0
  449. package/dist/lib/share/secret-scan.d.ts +19 -0
  450. package/dist/lib/share/secret-scan.d.ts.map +1 -0
  451. package/dist/lib/share/secret-scan.js +75 -0
  452. package/dist/lib/share/secret-scan.js.map +1 -0
  453. package/dist/lib/share/tty.d.ts +4 -0
  454. package/dist/lib/share/tty.d.ts.map +1 -0
  455. package/dist/lib/share/tty.js +57 -0
  456. package/dist/lib/share/tty.js.map +1 -0
  457. package/dist/lib/share/visible.d.ts +4 -0
  458. package/dist/lib/share/visible.d.ts.map +1 -0
  459. package/dist/lib/share/visible.js +30 -0
  460. package/dist/lib/share/visible.js.map +1 -0
  461. package/dist/lib/share/wire.d.ts +98 -0
  462. package/dist/lib/share/wire.d.ts.map +1 -0
  463. package/dist/lib/share/wire.js +43 -0
  464. package/dist/lib/share/wire.js.map +1 -0
  465. package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
  466. package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
  467. package/dist/lib/similarity/embedding-matrix.js +119 -0
  468. package/dist/lib/similarity/embedding-matrix.js.map +1 -0
  469. package/dist/lib/since-flag.d.ts +11 -0
  470. package/dist/lib/since-flag.d.ts.map +1 -0
  471. package/dist/lib/since-flag.js +24 -0
  472. package/dist/lib/since-flag.js.map +1 -0
  473. package/dist/lib/since.d.ts +59 -0
  474. package/dist/lib/since.d.ts.map +1 -0
  475. package/dist/lib/since.js +86 -0
  476. package/dist/lib/since.js.map +1 -0
  477. package/dist/lib/source-key.d.ts +13 -0
  478. package/dist/lib/source-key.d.ts.map +1 -0
  479. package/dist/lib/source-key.js +60 -0
  480. package/dist/lib/source-key.js.map +1 -0
  481. package/dist/lib/source-sync-state.d.ts +12 -0
  482. package/dist/lib/source-sync-state.d.ts.map +1 -0
  483. package/dist/lib/source-sync-state.js +43 -0
  484. package/dist/lib/source-sync-state.js.map +1 -0
  485. package/dist/lib/startup-backfill-track.d.ts +2 -0
  486. package/dist/lib/startup-backfill-track.d.ts.map +1 -0
  487. package/dist/lib/startup-backfill-track.js +6 -0
  488. package/dist/lib/startup-backfill-track.js.map +1 -0
  489. package/dist/lib/startup-xdg.d.ts +2 -0
  490. package/dist/lib/startup-xdg.d.ts.map +1 -0
  491. package/dist/lib/startup-xdg.js +9 -0
  492. package/dist/lib/startup-xdg.js.map +1 -0
  493. package/dist/lib/sync/after-connect.d.ts +2 -0
  494. package/dist/lib/sync/after-connect.d.ts.map +1 -0
  495. package/dist/lib/sync/after-connect.js +18 -0
  496. package/dist/lib/sync/after-connect.js.map +1 -0
  497. package/dist/lib/sync/bg-claim.d.ts +14 -0
  498. package/dist/lib/sync/bg-claim.d.ts.map +1 -0
  499. package/dist/lib/sync/bg-claim.js +97 -0
  500. package/dist/lib/sync/bg-claim.js.map +1 -0
  501. package/dist/lib/sync/blocked.d.ts +8 -0
  502. package/dist/lib/sync/blocked.d.ts.map +1 -0
  503. package/dist/lib/sync/blocked.js +44 -0
  504. package/dist/lib/sync/blocked.js.map +1 -0
  505. package/dist/lib/sync/classify.d.ts +34 -0
  506. package/dist/lib/sync/classify.d.ts.map +1 -0
  507. package/dist/lib/sync/classify.js +91 -0
  508. package/dist/lib/sync/classify.js.map +1 -0
  509. package/dist/lib/sync/drain.d.ts +16 -0
  510. package/dist/lib/sync/drain.d.ts.map +1 -0
  511. package/dist/lib/sync/drain.js +33 -0
  512. package/dist/lib/sync/drain.js.map +1 -0
  513. package/dist/lib/sync/forget.d.ts +12 -0
  514. package/dist/lib/sync/forget.d.ts.map +1 -0
  515. package/dist/lib/sync/forget.js +32 -0
  516. package/dist/lib/sync/forget.js.map +1 -0
  517. package/dist/lib/sync/launch-hook.d.ts +42 -0
  518. package/dist/lib/sync/launch-hook.d.ts.map +1 -0
  519. package/dist/lib/sync/launch-hook.js +117 -0
  520. package/dist/lib/sync/launch-hook.js.map +1 -0
  521. package/dist/lib/sync/lock.d.ts +35 -0
  522. package/dist/lib/sync/lock.d.ts.map +1 -0
  523. package/dist/lib/sync/lock.js +175 -0
  524. package/dist/lib/sync/lock.js.map +1 -0
  525. package/dist/lib/sync/purge.d.ts +38 -0
  526. package/dist/lib/sync/purge.d.ts.map +1 -0
  527. package/dist/lib/sync/purge.js +61 -0
  528. package/dist/lib/sync/purge.js.map +1 -0
  529. package/dist/lib/sync/real-env.d.ts +208 -0
  530. package/dist/lib/sync/real-env.d.ts.map +1 -0
  531. package/dist/lib/sync/real-env.js +47 -0
  532. package/dist/lib/sync/real-env.js.map +1 -0
  533. package/dist/lib/sync/relink.d.ts +14 -0
  534. package/dist/lib/sync/relink.d.ts.map +1 -0
  535. package/dist/lib/sync/relink.js +36 -0
  536. package/dist/lib/sync/relink.js.map +1 -0
  537. package/dist/lib/sync/report.d.ts +3 -0
  538. package/dist/lib/sync/report.d.ts.map +1 -0
  539. package/dist/lib/sync/report.js +54 -0
  540. package/dist/lib/sync/report.js.map +1 -0
  541. package/dist/lib/sync/run-all.d.ts +23 -0
  542. package/dist/lib/sync/run-all.d.ts.map +1 -0
  543. package/dist/lib/sync/run-all.js +30 -0
  544. package/dist/lib/sync/run-all.js.map +1 -0
  545. package/dist/lib/sync/run-source.d.ts +73 -0
  546. package/dist/lib/sync/run-source.d.ts.map +1 -0
  547. package/dist/lib/sync/run-source.js +262 -0
  548. package/dist/lib/sync/run-source.js.map +1 -0
  549. package/dist/lib/sync/safe-read.d.ts +4 -0
  550. package/dist/lib/sync/safe-read.d.ts.map +1 -0
  551. package/dist/lib/sync/safe-read.js +40 -0
  552. package/dist/lib/sync/safe-read.js.map +1 -0
  553. package/dist/lib/sync/should-background-sync.d.ts +31 -0
  554. package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
  555. package/dist/lib/sync/should-background-sync.js +69 -0
  556. package/dist/lib/sync/should-background-sync.js.map +1 -0
  557. package/dist/lib/sync/source-ids.d.ts +10 -0
  558. package/dist/lib/sync/source-ids.d.ts.map +1 -0
  559. package/dist/lib/sync/source-ids.js +9 -0
  560. package/dist/lib/sync/source-ids.js.map +1 -0
  561. package/dist/lib/sync/sources.d.ts +33 -0
  562. package/dist/lib/sync/sources.d.ts.map +1 -0
  563. package/dist/lib/sync/sources.js +37 -0
  564. package/dist/lib/sync/sources.js.map +1 -0
  565. package/dist/lib/sync/spawn-background.d.ts +27 -0
  566. package/dist/lib/sync/spawn-background.d.ts.map +1 -0
  567. package/dist/lib/sync/spawn-background.js +66 -0
  568. package/dist/lib/sync/spawn-background.js.map +1 -0
  569. package/dist/lib/sync/status.d.ts +57 -0
  570. package/dist/lib/sync/status.d.ts.map +1 -0
  571. package/dist/lib/sync/status.js +166 -0
  572. package/dist/lib/sync/status.js.map +1 -0
  573. package/dist/lib/sync/summary-read.d.ts +19 -0
  574. package/dist/lib/sync/summary-read.d.ts.map +1 -0
  575. package/dist/lib/sync/summary-read.js +39 -0
  576. package/dist/lib/sync/summary-read.js.map +1 -0
  577. package/dist/lib/sync/summary.d.ts +10 -0
  578. package/dist/lib/sync/summary.d.ts.map +1 -0
  579. package/dist/lib/sync/summary.js +80 -0
  580. package/dist/lib/sync/summary.js.map +1 -0
  581. package/dist/lib/sync/sync-state.d.ts +128 -0
  582. package/dist/lib/sync/sync-state.d.ts.map +1 -0
  583. package/dist/lib/sync/sync-state.js +253 -0
  584. package/dist/lib/sync/sync-state.js.map +1 -0
  585. package/dist/lib/sync/telemetry.d.ts +20 -0
  586. package/dist/lib/sync/telemetry.d.ts.map +1 -0
  587. package/dist/lib/sync/telemetry.js +31 -0
  588. package/dist/lib/sync/telemetry.js.map +1 -0
  589. package/dist/lib/sync/threads.d.ts +48 -0
  590. package/dist/lib/sync/threads.d.ts.map +1 -0
  591. package/dist/lib/sync/threads.js +82 -0
  592. package/dist/lib/sync/threads.js.map +1 -0
  593. package/dist/lib/sync/window.d.ts +72 -0
  594. package/dist/lib/sync/window.d.ts.map +1 -0
  595. package/dist/lib/sync/window.js +112 -0
  596. package/dist/lib/sync/window.js.map +1 -0
  597. package/dist/lib/team-cta.d.ts +11 -0
  598. package/dist/lib/team-cta.d.ts.map +1 -0
  599. package/dist/lib/team-cta.js +16 -0
  600. package/dist/lib/team-cta.js.map +1 -0
  601. package/dist/lib/telemetry-ci.d.ts +2 -0
  602. package/dist/lib/telemetry-ci.d.ts.map +1 -0
  603. package/dist/lib/telemetry-ci.js +21 -0
  604. package/dist/lib/telemetry-ci.js.map +1 -0
  605. package/dist/lib/telemetry-consent.d.ts +44 -23
  606. package/dist/lib/telemetry-consent.d.ts.map +1 -1
  607. package/dist/lib/telemetry-consent.js +74 -35
  608. package/dist/lib/telemetry-consent.js.map +1 -1
  609. package/dist/lib/telemetry-env.d.ts +1 -1
  610. package/dist/lib/usage-telemetry.d.ts +87 -22
  611. package/dist/lib/usage-telemetry.d.ts.map +1 -1
  612. package/dist/lib/usage-telemetry.js +263 -74
  613. package/dist/lib/usage-telemetry.js.map +1 -1
  614. package/dist/lib/xdg.d.ts +27 -0
  615. package/dist/lib/xdg.d.ts.map +1 -0
  616. package/dist/lib/xdg.js +56 -0
  617. package/dist/lib/xdg.js.map +1 -0
  618. package/package.json +3 -2
  619. package/dist/commands/push.d.ts +0 -25
  620. package/dist/commands/push.d.ts.map +0 -1
  621. package/dist/commands/push.js +0 -98
  622. package/dist/commands/push.js.map +0 -1
@@ -0,0 +1,484 @@
1
+ /**
2
+ * The local graph's schema and its one-time migrations, moved out of local-db.ts verbatim so
3
+ * that file stays under the 900-line limit. local-db.ts re-exports SCHEMA_VERSION, so every
4
+ * existing `import { SCHEMA_VERSION } from './local-db.js'` still resolves.
5
+ */
6
+ import { bumpRowSetEpoch } from './local-db-epoch.js';
7
+ import { repoFromSourceUrl } from './repo-identity.js';
8
+ import { migrateV7 } from './local-db-v7.js';
9
+ import { migrateV8 } from './local-db-v8.js';
10
+ import { migrateV9 } from './local-db-v9.js';
11
+ import { migrateV10, repairPromotions } from './local-db-v10.js';
12
+ import { migrateV11 } from './local-db-v11.js';
13
+ export const SCHEMA = `
14
+ CREATE TABLE IF NOT EXISTS decisions (
15
+ id TEXT PRIMARY KEY,
16
+ title TEXT NOT NULL,
17
+ summary TEXT NOT NULL,
18
+ source_url TEXT,
19
+ platform TEXT NOT NULL DEFAULT 'cli',
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
21
+ repo TEXT,
22
+ decided_at TEXT,
23
+ decider_kind TEXT,
24
+ confirmed_by TEXT,
25
+ confirmed_at TEXT,
26
+ ratified_by TEXT,
27
+ ratified_at TEXT
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS decision_audit (
31
+ id TEXT PRIMARY KEY,
32
+ decision_id TEXT NOT NULL,
33
+ action TEXT NOT NULL,
34
+ actor TEXT,
35
+ detail TEXT,
36
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
37
+ );
38
+
39
+ CREATE TABLE IF NOT EXISTS decision_embeddings (
40
+ decision_id TEXT PRIMARY KEY REFERENCES decisions(id) ON DELETE CASCADE,
41
+ embedding BLOB NOT NULL,
42
+ model TEXT
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS decision_links (
46
+ id TEXT PRIMARY KEY,
47
+ source_id TEXT NOT NULL REFERENCES decisions(id) ON DELETE CASCADE,
48
+ target_id TEXT NOT NULL REFERENCES decisions(id) ON DELETE CASCADE,
49
+ relation TEXT NOT NULL,
50
+ confidence REAL NOT NULL DEFAULT 1.0,
51
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
52
+ );
53
+
54
+ CREATE TABLE IF NOT EXISTS decision_refs (
55
+ decision_id TEXT NOT NULL REFERENCES decisions(id) ON DELETE CASCADE,
56
+ ref TEXT NOT NULL,
57
+ platform TEXT NOT NULL,
58
+ PRIMARY KEY (decision_id, ref)
59
+ );
60
+ `;
61
+ /**
62
+ * Schema version this build expects. Bump when adding a step to `migrate`.
63
+ *
64
+ * Exported so a test can assert the migration WROTE the version it claims, without hardcoding
65
+ * the number - a test pinning a literal 1 had to be edited by this change rather than passing
66
+ * or failing on its own merits. A parity test also derives the highest `version <` branch in
67
+ * `migrate` from the source and compares it here, because forgetting the bump leaves the new
68
+ * branch running destructively on every open with nothing to stop it.
69
+ */
70
+ export const SCHEMA_VERSION = 11;
71
+ /** The title connector-core 0.5.0 gave every Slack thread whose root was deleted. The 0.6.0
72
+ * fetcher titles such a thread from its first human message, or drops it; either way this
73
+ * row is a duplicate-to-be under the (source_url, title) key, or noise. */
74
+ export const SLACK_TOMBSTONE_TITLE = 'This message was deleted.';
75
+ /** The five ALI-831 columns, named exactly as the shared contract spells them. One list,
76
+ * read by the migration; SCHEMA above spells them a second time because a fresh CREATE
77
+ * TABLE cannot read a constant, and the provenance test pins both against each other. */
78
+ const PROVENANCE_COLUMNS = ['decider_kind', 'confirmed_by', 'confirmed_at', 'ratified_by', 'ratified_at'];
79
+ /**
80
+ * ALI-787: the only embedding model this graph has ever written before the `model` column
81
+ * existed. Verified, not assumed - `git log --all -p` on local-embeddings.ts and
82
+ * local-embeddings-wasm.ts shows exactly one HF model id was ever hardcoded there, across
83
+ * every commit. So backfilling every pre-column row with this is a true historical fact,
84
+ * unlike `decided_at` (step 4 below), which genuinely cannot be derived from an existing row.
85
+ *
86
+ * A deliberate LITERAL, not an import of local-embeddings.ts's EMBEDDING_MODEL_ID: this
87
+ * constant names what was true when the column was added, and must stay that value even
88
+ * after a future model swap changes EMBEDDING_MODEL_ID. Migrations are a historical record.
89
+ */
90
+ const LEGACY_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
91
+ /**
92
+ * One-time data migrations, tracked in SQLite's built-in `user_version`.
93
+ *
94
+ * 1. ALI-503: relabel the cosine-similarity links that were written as `conflicts_with`.
95
+ * Every such row at version 0 is provably an artefact, because `insertLink` had exactly
96
+ * one caller and it hardcoded that relation for any pair over 0.65 cosine. No classifier
97
+ * verdict was ever persisted, so there is no earned row to damage.
98
+ *
99
+ * 2. A decision's `source_url` identifies it, and nothing enforced that: `insertDecision` minted
100
+ * a fresh UUID per call, so re-importing the same commit added a second copy. The documented
101
+ * first run does exactly that - `setup --local` seeds from git, then its own outro tells you
102
+ * to run `align connect git` - so a graph goes from 2 decisions to 4 by following the tips.
103
+ * Collapse the existing duplicates, then make them unrepresentable with a unique index.
104
+ *
105
+ * 3. ALI-798: add the `repo` column (missing on any graph that predates it) and backfill it
106
+ * for every existing row from `source_url`, via the same `repoFromSourceUrl` the importer
107
+ * now stamps new rows with - one reader of the URL shape, used for both. A row whose
108
+ * source is not code (Jira, Slack, a bare capture) stays NULL, which is "unattributed",
109
+ * not "wrong": `--repo` scoping always includes unattributed rows alongside the named
110
+ * repo (see local-gateway-client.ts), so nothing existing becomes invisible.
111
+ *
112
+ * 4. ALI-829: add `decided_at` - when the decision was MADE, from the source's own
113
+ * timestamp, as distinct from `created_at`, the minute this CLI imported it. Every one
114
+ * of the 684 rows in the 2026-09-02 measurement carried the ingest minute and nothing
115
+ * else, so "what changed since March" was unanswerable offline. No backfill, unlike
116
+ * `repo`: a repo is derivable from a stored source_url, and a decision date is not
117
+ * derivable from anything already in the row. A re-import fills it in; inventing one
118
+ * from created_at would write the exact wrong fact this column exists to correct.
119
+ *
120
+ * Same bump, second step: drop the Slack rows titled by a deleted root. The 0.6.0
121
+ * fetcher titles a thread from its first human message, and the dedup key is
122
+ * (source_url, title), so each of those rows would otherwise be re-inserted BESIDE its
123
+ * tombstone twin on the next import (35 of 39 on the 2026-09-02 graph). The next import
124
+ * recreates the real ones with real titles; the ones that were only bot output on a
125
+ * deleted root do not come back, which is the point. Foreign keys are off in this
126
+ * database (see step 2), so the dependent rows are deleted explicitly - including any
127
+ * link a human adjudicated on such a row. That is a real loss, accepted: the row's
128
+ * identity is changing under it, and the re-import classifies the retitled thread
129
+ * afresh. Scoped to platform = 'slack': a git commit or a captured note that happens to
130
+ * carry the same words is not a tombstone and is left alone.
131
+ *
132
+ * 5. ALI-831: add the decider/ratified columns (`decider_kind`, `confirmed_by`,
133
+ * `confirmed_at`, `ratified_by`, `ratified_at`) so an agent-made decision can enter as a
134
+ * CLAIM a human later stands behind, and the `decision_audit` table the human act is
135
+ * recorded in. No backfill, on purpose: a row captured before the column reads as
136
+ * 'unknown', and stamping 'human' on it from its platform would be the retroactive
137
+ * guess align-stack's migration 113 refuses. The columns are added here rather than only
138
+ * in SCHEMA because CREATE TABLE IF NOT EXISTS never alters an existing table.
139
+ *
140
+ * 6. ALI-787: tag each embedding with the model that produced it (see LEGACY_EMBEDDING_MODEL).
141
+ *
142
+ * 7. L2: per-source sync state, `source_key` identity with a backed-up twin merge,
143
+ * `detail_pending`, `enriched_at` (NULL on every existing row) and `local_judgements`.
144
+ * See local-db-v7.ts.
145
+ *
146
+ * The version guard is load-bearing rather than tidiness. The same UPDATE run on every open
147
+ * is indistinguishable from this one today, and starts silently eating genuine conflicts the
148
+ * moment anything writes one.
149
+ */
150
+ /**
151
+ * Remove a decision and everything hanging off it. Foreign keys are off in this database
152
+ * (see migrate, step 2), so the dependents are named explicitly rather than cascaded. One
153
+ * writer for the v4 tombstone sweep and the ingest-time twin removal (ALI-829).
154
+ */
155
+ export function deleteDecisionWithDependents(db, id) {
156
+ bumpRowSetEpoch(db);
157
+ db.prepare('DELETE FROM decision_links WHERE source_id = ? OR target_id = ?').run(id, id);
158
+ db.prepare('DELETE FROM decision_refs WHERE decision_id = ?').run(id);
159
+ db.prepare('DELETE FROM decision_embeddings WHERE decision_id = ?').run(id);
160
+ db.prepare('DELETE FROM decision_audit WHERE decision_id = ?').run(id);
161
+ db.prepare('DELETE FROM decisions WHERE id = ?').run(id);
162
+ }
163
+ /** The one downgrade guard: migrate() and every other writer of this file (the sync state, purge) call it. */
164
+ export function assertSchemaSupported(version) {
165
+ if (version > SCHEMA_VERSION) {
166
+ throw new Error(`This local graph was written by a newer Align CLI (schema v${version}; this CLI supports up to v${SCHEMA_VERSION}). ` +
167
+ 'Upgrade the CLI (npm install -g @aligndottech/cli@latest) before opening it.');
168
+ }
169
+ }
170
+ export function migrate(db) {
171
+ const version = db.prepare('PRAGMA user_version').get().user_version;
172
+ // A newer CLI migrated this file. Running this build's older code against the newer tables
173
+ // (a v6 binary inserting rows without a source_key beside keyed ones) corrupts identity, so
174
+ // refuse before touching anything.
175
+ assertSchemaSupported(version);
176
+ if (version < 1) {
177
+ db.exec(`UPDATE decision_links SET relation = 'relates' WHERE relation = 'conflicts_with'`);
178
+ }
179
+ if (version < 2) {
180
+ // IMMEDIATE, not the default DEFERRED: this transaction reads (the survivor scan) before it
181
+ // writes, and under WAL another writer arriving in between makes the first write fail with
182
+ // SQLITE_BUSY_SNAPSHOT, which busy_timeout does not retry. Every local command opens the DB
183
+ // and the advisory hook fires on every agent edit, so a concurrent open is the normal case.
184
+ db.exec('BEGIN IMMEDIATE');
185
+ try {
186
+ // The survivor is the row inserted FIRST. `rowid` rather than `id` breaks a created_at
187
+ // tie: created_at has one-second granularity so rows written in one import tie routinely,
188
+ // and ordering by a random UUID would keep an arbitrary one while this comment claimed to
189
+ // keep the long-standing id. rowid is insertion order (the table is not WITHOUT ROWID).
190
+ //
191
+ // Keyed on (source_url, title), not source_url alone. Some fetchers emit a CONSTANT
192
+ // source_url when the per-item link is missing - connector-core's Teams fallback is
193
+ // literally 'https://teams.microsoft.com' - and collapsing on the URL alone deleted every
194
+ // such message but one. Two rows sharing a URL AND a title are duplicates by any reading;
195
+ // two sharing only the URL are not.
196
+ db.exec(`
197
+ CREATE TEMP TABLE dedup_survivor AS
198
+ SELECT source_url, title, id FROM (
199
+ SELECT source_url, title, id,
200
+ ROW_NUMBER() OVER (PARTITION BY source_url, title ORDER BY created_at, rowid) AS rn
201
+ FROM decisions WHERE source_url IS NOT NULL
202
+ ) WHERE rn = 1;
203
+
204
+ CREATE TEMP TABLE dedup_dropped AS
205
+ SELECT d.id AS id, s.id AS survivor_id
206
+ FROM decisions d JOIN dedup_survivor s
207
+ ON d.source_url = s.source_url AND d.title = s.title
208
+ WHERE d.id <> s.id;
209
+ `);
210
+ // Repoint edges rather than dropping them: an edge naming a duplicate is a real edge that
211
+ // happened to name the copy. Dropping it would lose a relationship the user earned.
212
+ db.exec(`
213
+ UPDATE decision_links SET source_id = (
214
+ SELECT survivor_id FROM dedup_dropped WHERE id = decision_links.source_id
215
+ ) WHERE source_id IN (SELECT id FROM dedup_dropped);
216
+ UPDATE decision_links SET target_id = (
217
+ SELECT survivor_id FROM dedup_dropped WHERE id = decision_links.target_id
218
+ ) WHERE target_id IN (SELECT id FROM dedup_dropped);
219
+ `);
220
+ // Both cleanups are scoped to the pairs repointing actually touched. An earlier version
221
+ // deduplicated decision_links table-wide, which deleted user-earned edges that had nothing
222
+ // to do with duplication - and kept the lowest UUID rather than the highest confidence.
223
+ db.exec(`
224
+ DELETE FROM decision_links
225
+ WHERE source_id = target_id
226
+ AND (source_id IN (SELECT survivor_id FROM dedup_dropped)
227
+ OR target_id IN (SELECT survivor_id FROM dedup_dropped));
228
+ `);
229
+ // Explicitly, not by CASCADE: SQLite leaves foreign_keys OFF unless asked, so the
230
+ // ON DELETE CASCADE in the schema does not fire and these would be orphaned.
231
+ if (db.prepare('SELECT COUNT(*) AS n FROM dedup_dropped').get().n > 0)
232
+ bumpRowSetEpoch(db);
233
+ db.exec(`DELETE FROM decision_embeddings WHERE decision_id IN (SELECT id FROM dedup_dropped)`);
234
+ db.exec(`DELETE FROM decisions WHERE id IN (SELECT id FROM dedup_dropped)`);
235
+ db.exec(`DROP TABLE dedup_dropped; DROP TABLE dedup_survivor;`);
236
+ // Created here rather than in SCHEMA on purpose: SCHEMA runs before this function, so on
237
+ // any already-duplicated graph the index would fail to build before the collapse could
238
+ // run. A fresh database passes through the same path with nothing to collapse.
239
+ //
240
+ // A distinct name from any previous attempt, because IF NOT EXISTS matches on the NAME
241
+ // only: an index of the same name with different columns would be silently kept, and
242
+ // every later insert would then fail with "ON CONFLICT clause does not match".
243
+ db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS decisions_source_title_unique ON decisions(source_url, title)`);
244
+ // Same story for edges: insertLink's `OR IGNORE` was decorative without a unique index, so
245
+ // a re-import stacked an identical relates row every time. Collapse, then constrain.
246
+ //
247
+ // This one IS table-wide, unavoidably: the index cannot be created while any duplicate
248
+ // triple remains anywhere. Every row it removes duplicates another by definition - same
249
+ // source, same target, same relation. It keeps the HIGHEST confidence rather than the
250
+ // lowest uuid, so the survivor is the best score rather than an arbitrary one.
251
+ db.exec(`
252
+ DELETE FROM decision_links WHERE id NOT IN (
253
+ SELECT id FROM (
254
+ SELECT id, ROW_NUMBER() OVER (
255
+ PARTITION BY source_id, target_id, relation ORDER BY confidence DESC, rowid
256
+ ) AS rn FROM decision_links
257
+ ) WHERE rn = 1
258
+ );
259
+ `);
260
+ db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS decision_links_triple_unique ON decision_links(source_id, target_id, relation)`);
261
+ // Stamped INSIDE the transaction. Outside it, a process killed between COMMIT and the
262
+ // pragma replays the version-1 relabel on the next open, which turns an adjudicated
263
+ // conflicts_with edge into relates - the exact silent loss the docstring above warns of.
264
+ //
265
+ // Stamps this step's OWN number (2), not SCHEMA_VERSION: a later step (3, below) runs
266
+ // after this one commits, and if a crash lands between the two, `user_version` must
267
+ // still read 2 so the version-3 step is not skipped on the next open.
268
+ db.exec('PRAGMA user_version = 2');
269
+ db.exec('COMMIT');
270
+ }
271
+ catch (err) {
272
+ // Guarded: SQLITE_FULL, IOERR, BUSY, NOMEM and INTERRUPT auto-roll-back, and an
273
+ // unconditional ROLLBACK then throws "no transaction is active" and buries the real
274
+ // cause - so a user whose disk filled mid-migration would be told the wrong thing.
275
+ if (db.isTransaction)
276
+ db.exec('ROLLBACK');
277
+ throw err;
278
+ }
279
+ }
280
+ if (version < 3) {
281
+ // The column may already exist: a brand-new database's CREATE TABLE (SCHEMA, above)
282
+ // declares `repo` directly, so on a fresh install this ALTER would fail with "duplicate
283
+ // column name" if run unconditionally. A legacy database predates the column entirely.
284
+ const hasRepoColumn = db.prepare('PRAGMA table_info(decisions)').all()
285
+ .some((c) => c.name === 'repo');
286
+ if (!hasRepoColumn) {
287
+ db.exec('ALTER TABLE decisions ADD COLUMN repo TEXT');
288
+ }
289
+ // Backfill every row with no repo yet. JS-side because SQLite has no regex function to
290
+ // apply `repoFromSourceUrl`'s pattern in SQL - and it must be the SAME function the
291
+ // importer stamps new rows with, or a backfilled row and a freshly-imported one for the
292
+ // same URL could disagree about which repo they belong to.
293
+ const rows = db.prepare('SELECT id, source_url FROM decisions WHERE repo IS NULL')
294
+ .all();
295
+ if (rows.length) {
296
+ db.exec('BEGIN IMMEDIATE');
297
+ try {
298
+ const update = db.prepare('UPDATE decisions SET repo = ? WHERE id = ?');
299
+ for (const row of rows) {
300
+ const repo = repoFromSourceUrl(row.source_url);
301
+ // Only WRITE when a repo was found: leaving a non-code row NULL is the correct
302
+ // outcome (unattributed, not "wrong"), and writing NULL over NULL is a no-op
303
+ // this loop can just skip.
304
+ if (repo)
305
+ update.run(repo, row.id);
306
+ }
307
+ db.exec('PRAGMA user_version = 3');
308
+ db.exec('COMMIT');
309
+ }
310
+ catch (err) {
311
+ if (db.isTransaction)
312
+ db.exec('ROLLBACK');
313
+ throw err;
314
+ }
315
+ }
316
+ else {
317
+ db.exec('PRAGMA user_version = 3');
318
+ }
319
+ }
320
+ if (version < 4) {
321
+ db.exec('BEGIN IMMEDIATE');
322
+ try {
323
+ // Same shape as the `repo` step: a fresh database's CREATE TABLE already declares the
324
+ // column, and a legacy one predates it, so the ALTER is conditional. Checked INSIDE
325
+ // the write lock, unlike step 3: two processes opening a v3 file at once (the
326
+ // advisory hook is the normal concurrent case) could otherwise both read "no column"
327
+ // and the second would die on "duplicate column name". SQLite DDL is transactional.
328
+ const hasDecidedAt = db.prepare('PRAGMA table_info(decisions)').all()
329
+ .some((c) => c.name === 'decided_at');
330
+ if (!hasDecidedAt) {
331
+ db.exec('ALTER TABLE decisions ADD COLUMN decided_at TEXT');
332
+ }
333
+ const tombstones = db.prepare(`SELECT id FROM decisions WHERE platform = 'slack' AND title = ?`).all(SLACK_TOMBSTONE_TITLE);
334
+ for (const { id } of tombstones)
335
+ deleteDecisionWithDependents(db, id);
336
+ // Stamped inside the transaction, for the reason step 2 gives.
337
+ db.exec('PRAGMA user_version = 4');
338
+ db.exec('COMMIT');
339
+ }
340
+ catch (err) {
341
+ if (db.isTransaction)
342
+ db.exec('ROLLBACK');
343
+ throw err;
344
+ }
345
+ }
346
+ if (version < 5) {
347
+ // Inside the write lock, for the reason step 4 gives: two concurrent opens of a v4
348
+ // file must not both read "no column" and race the ALTER.
349
+ db.exec('BEGIN IMMEDIATE');
350
+ try {
351
+ const existing = new Set(db.prepare('PRAGMA table_info(decisions)').all().map((c) => c.name));
352
+ for (const column of PROVENANCE_COLUMNS) {
353
+ if (!existing.has(column))
354
+ db.exec(`ALTER TABLE decisions ADD COLUMN ${column} TEXT`);
355
+ }
356
+ db.exec('PRAGMA user_version = 5');
357
+ db.exec('COMMIT');
358
+ }
359
+ catch (err) {
360
+ if (db.isTransaction)
361
+ db.exec('ROLLBACK');
362
+ throw err;
363
+ }
364
+ }
365
+ if (version < 6) {
366
+ // Inside the write lock, for the reason step 4/5 give: two concurrent opens of a v5
367
+ // file must not both read "no column" and race the ALTER.
368
+ db.exec('BEGIN IMMEDIATE');
369
+ try {
370
+ const hasModel = db.prepare('PRAGMA table_info(decision_embeddings)').all()
371
+ .some((c) => c.name === 'model');
372
+ if (!hasModel) {
373
+ db.exec('ALTER TABLE decision_embeddings ADD COLUMN model TEXT');
374
+ }
375
+ // Every row that predates the column was written by LEGACY_EMBEDDING_MODEL - see its
376
+ // doc comment for how that is verified rather than assumed. Only rows with no tag yet
377
+ // are touched, so re-running this on an already-migrated database is a no-op.
378
+ db.prepare('UPDATE decision_embeddings SET model = ? WHERE model IS NULL').run(LEGACY_EMBEDDING_MODEL);
379
+ db.exec('PRAGMA user_version = 6');
380
+ db.exec('COMMIT');
381
+ }
382
+ catch (err) {
383
+ if (db.isTransaction)
384
+ db.exec('ROLLBACK');
385
+ throw err;
386
+ }
387
+ }
388
+ if (version < 7) {
389
+ // L2: sync state, source_key with the twin merge, enriched_at, local_judgements. One
390
+ // transaction, IMMEDIATE and stamped inside, for the reasons steps 2 and 4 give. The step
391
+ // itself, and why each part is shaped as it is, lives in local-db-v7.ts.
392
+ //
393
+ // `version` was read BEFORE this lock: a second opener of a v6 file waits here (busy_timeout)
394
+ // while the first migrates, and must then find the work done. Re-read it inside the lock.
395
+ db.exec('BEGIN IMMEDIATE');
396
+ try {
397
+ const current = db.prepare('PRAGMA user_version').get().user_version;
398
+ if (current < 7) {
399
+ migrateV7(db);
400
+ db.exec('PRAGMA user_version = 7');
401
+ }
402
+ db.exec('COMMIT');
403
+ }
404
+ catch (err) {
405
+ if (db.isTransaction)
406
+ db.exec('ROLLBACK');
407
+ throw err;
408
+ }
409
+ }
410
+ if (version < 8) {
411
+ // L5 review: sync cycle state, last_attempt_at, sync_item_state and the purge backups.
412
+ db.exec('BEGIN IMMEDIATE');
413
+ try {
414
+ const current = db.prepare('PRAGMA user_version').get().user_version;
415
+ if (current < 8) {
416
+ migrateV8(db);
417
+ db.exec('PRAGMA user_version = 8');
418
+ }
419
+ db.exec('COMMIT');
420
+ }
421
+ catch (err) {
422
+ if (db.isTransaction)
423
+ db.exec('ROLLBACK');
424
+ throw err;
425
+ }
426
+ }
427
+ if (version < 9) {
428
+ // L5 second review: hole_sig and hole_streak on source_sync.
429
+ db.exec('BEGIN IMMEDIATE');
430
+ try {
431
+ const current = db.prepare('PRAGMA user_version').get().user_version;
432
+ if (current < 9) {
433
+ migrateV9(db);
434
+ db.exec('PRAGMA user_version = 9');
435
+ }
436
+ db.exec('COMMIT');
437
+ }
438
+ catch (err) {
439
+ if (db.isTransaction)
440
+ db.exec('ROLLBACK');
441
+ throw err;
442
+ }
443
+ }
444
+ if (version < 10) {
445
+ // L9: the promotions ledger, and the old `align push` audit rows carried across as legacy rows.
446
+ db.exec('BEGIN IMMEDIATE');
447
+ try {
448
+ const current = db.prepare('PRAGMA user_version').get().user_version;
449
+ if (current < 10) {
450
+ migrateV10(db);
451
+ db.exec('PRAGMA user_version = 10');
452
+ }
453
+ db.exec('COMMIT');
454
+ }
455
+ catch (err) {
456
+ if (db.isTransaction)
457
+ db.exec('ROLLBACK');
458
+ throw err;
459
+ }
460
+ }
461
+ if (version < 11) {
462
+ // ALI-1527: re-key zoom rows after connector-core changed the zoom source key. See local-db-v11.ts.
463
+ db.exec('BEGIN IMMEDIATE');
464
+ try {
465
+ const current = db.prepare('PRAGMA user_version').get().user_version;
466
+ if (current < 11) {
467
+ migrateV11(db);
468
+ db.exec('PRAGMA user_version = 11');
469
+ }
470
+ db.exec('COMMIT');
471
+ }
472
+ catch (err) {
473
+ if (db.isTransaction)
474
+ db.exec('ROLLBACK');
475
+ throw err;
476
+ }
477
+ }
478
+ // A graph an earlier build of this branch stamped v10 (see repairPromotions): runs on every open.
479
+ repairPromotions(db);
480
+ if (version < SCHEMA_VERSION) {
481
+ db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
482
+ }
483
+ }
484
+ //# sourceMappingURL=local-db-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-migrate.js","sourceRoot":"","sources":["../../src/lib/local-db-migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Schema v10 (L9): the promotions ledger - what this machine has shared to which team workspace.
3
+ *
4
+ * One row per (local decision, environment, workspace). It holds the remote id (to retract), the
5
+ * hash of the payload that was sent (to say "already shared" and to notice an edit), and whether
6
+ * the share MATCHED a decision the team already held (`matched`: a retract must never archive
7
+ * somebody else's decision).
8
+ *
9
+ * There is deliberately NO foreign key to `decisions`: `align local forget` must not erase the only
10
+ * record that lets a person retract a copy that is on the team graph.
11
+ *
12
+ * Old `align push` rows (audit action 'pushed', detail `<env>:<cloudId>`) become 'legacy' rows: they
13
+ * carry no workspace, so a second share of the same decision warns that it may create a second copy
14
+ * instead of pretending the first never happened. Replay-safe: CREATE IF NOT EXISTS, INSERT OR IGNORE.
15
+ */
16
+ import type { DatabaseSync } from 'node:sqlite';
17
+ export declare const PROMOTIONS_TABLE = "\nCREATE TABLE IF NOT EXISTS promotions (\n local_id TEXT NOT NULL,\n env TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n remote_id TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n matched INTEGER NOT NULL DEFAULT 0,\n client_key TEXT NOT NULL DEFAULT '',\n sent TEXT NOT NULL DEFAULT '[]',\n confirm_pending INTEGER NOT NULL DEFAULT 0,\n shared_at TEXT NOT NULL DEFAULT (datetime('now')),\n retracted_at TEXT,\n PRIMARY KEY (local_id, env, tenant_id)\n);\n";
18
+ export declare function migrateV10(db: DatabaseSync): void;
19
+ /**
20
+ * A graph an EARLIER build of this branch already stamped v10 has `promotions` without the columns v10 grew
21
+ * (`client_key`, `sent`, `confirm_pending`), and the `version < 10` step will never run for it. This repair
22
+ * runs on every open: guarded by table_info, so it is idempotent and a no-op on a current graph. Existing
23
+ * rows keep their values (the defaults say "no key yet, nothing recorded as sent, nothing pending").
24
+ */
25
+ export declare function repairPromotions(db: DatabaseSync): void;
26
+ /** The columns the ledger code reads and writes, in one place so the share can refuse BEFORE any request. */
27
+ export declare const LEDGER_COLUMNS: readonly ["local_id", "env", "tenant_id", "remote_id", "content_hash", "matched", "client_key", "sent", "confirm_pending", "shared_at", "retracted_at"];
28
+ //# sourceMappingURL=local-db-v10.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v10.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v10.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,gBAAgB,yfAe5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAWjD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAMvD;AAED,6GAA6G;AAC7G,eAAO,MAAM,cAAc,yJAA0J,CAAC"}
@@ -0,0 +1,49 @@
1
+ export const PROMOTIONS_TABLE = `
2
+ CREATE TABLE IF NOT EXISTS promotions (
3
+ local_id TEXT NOT NULL,
4
+ env TEXT NOT NULL,
5
+ tenant_id TEXT NOT NULL,
6
+ remote_id TEXT NOT NULL,
7
+ content_hash TEXT NOT NULL,
8
+ matched INTEGER NOT NULL DEFAULT 0,
9
+ client_key TEXT NOT NULL DEFAULT '',
10
+ sent TEXT NOT NULL DEFAULT '[]',
11
+ confirm_pending INTEGER NOT NULL DEFAULT 0,
12
+ shared_at TEXT NOT NULL DEFAULT (datetime('now')),
13
+ retracted_at TEXT,
14
+ PRIMARY KEY (local_id, env, tenant_id)
15
+ );
16
+ `;
17
+ export function migrateV10(db) {
18
+ db.exec(PROMOTIONS_TABLE);
19
+ const pushes = db.prepare(`SELECT decision_id, detail FROM decision_audit WHERE action = 'pushed' AND detail IS NOT NULL ORDER BY created_at, rowid`).all();
20
+ const insert = db.prepare(`INSERT OR IGNORE INTO promotions (local_id, env, tenant_id, remote_id, content_hash) VALUES (?, ?, 'legacy', ?, '')`);
21
+ for (const p of pushes) {
22
+ const cut = p.detail.indexOf(':');
23
+ const env = cut > 0 ? p.detail.slice(0, cut) : '';
24
+ const remote = cut > 0 ? p.detail.slice(cut + 1) : '';
25
+ if (env === '' || remote === '')
26
+ continue; // no cloud id recorded: nothing a retract could name
27
+ insert.run(p.decision_id, env, remote);
28
+ }
29
+ }
30
+ /**
31
+ * A graph an EARLIER build of this branch already stamped v10 has `promotions` without the columns v10 grew
32
+ * (`client_key`, `sent`, `confirm_pending`), and the `version < 10` step will never run for it. This repair
33
+ * runs on every open: guarded by table_info, so it is idempotent and a no-op on a current graph. Existing
34
+ * rows keep their values (the defaults say "no key yet, nothing recorded as sent, nothing pending").
35
+ */
36
+ export function repairPromotions(db) {
37
+ const cols = new Set(db.prepare('PRAGMA table_info(promotions)').all().map((c) => c.name));
38
+ if (cols.size === 0)
39
+ return; // pre-v10: the step itself creates it
40
+ if (!cols.has('client_key'))
41
+ db.exec("ALTER TABLE promotions ADD COLUMN client_key TEXT NOT NULL DEFAULT ''");
42
+ if (!cols.has('sent'))
43
+ db.exec("ALTER TABLE promotions ADD COLUMN sent TEXT NOT NULL DEFAULT '[]'");
44
+ if (!cols.has('confirm_pending'))
45
+ db.exec('ALTER TABLE promotions ADD COLUMN confirm_pending INTEGER NOT NULL DEFAULT 0');
46
+ }
47
+ /** The columns the ledger code reads and writes, in one place so the share can refuse BEFORE any request. */
48
+ export const LEDGER_COLUMNS = ['local_id', 'env', 'tenant_id', 'remote_id', 'content_hash', 'matched', 'client_key', 'sent', 'confirm_pending', 'shared_at', 'retracted_at'];
49
+ //# sourceMappingURL=local-db-v10.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v10.js","sourceRoot":"","sources":["../../src/lib/local-db-v10.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;CAe/B,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EAAgB;IACzC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,0HAA0H,CAAC,CAAC,GAAG,EAAoD,CAAC;IAC9M,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,qHAAqH,CAAC,CAAC;IACjJ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,GAAG,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE;YAAE,SAAS,CAAC,qDAAqD;QAChG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxH,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,sCAAsC;IACnE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAC9G,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACpG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;AAC5H,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,CAAU,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Schema v11 (ALI-1527): re-key zoom rows after connector-core 0.10.1 changed the zoom source key.
3
+ *
4
+ * Until 0.10.1 the key dropped the whole query for zoom, so the gateway's Discover recording URL
5
+ * `https://zoom.us/recording/detail?meeting_id=<uuid>` keyed every meeting to
6
+ * `zoom|https://zoom.us/recording/detail`. The key now keeps `meeting_id`. A graph written by an
7
+ * older build can still hold a row under the collapsed key (the v7 twin merge folded every
8
+ * Discover recording it saw into one such row).
9
+ *
10
+ * What it does: for each zoom row that has a key, recompute the key from the row's own source_url
11
+ * with the current function. Same key: untouched. A key that no longer exists (the URL names no
12
+ * item): cleared, and the row keeps its (source_url, title) identity. A different key that another
13
+ * row already holds: the two are twins, folded with the v7 fold (a ratified or confirmed row
14
+ * survives, everything that named the loser is re-pointed, the loser is backed up). Otherwise the
15
+ * key is rewritten in place, so the id, ratification, judgements and promotions are untouched.
16
+ *
17
+ * It does NOT bring back rows the v7 merge already folded away under the collapsed key: those are
18
+ * in `decisions_merged_backup`, and which of them were distinct meetings is a decision for a person.
19
+ *
20
+ * Replay-safe: a row already on the current key is skipped, so a second pass finds nothing.
21
+ */
22
+ import type { DatabaseSync } from 'node:sqlite';
23
+ export declare function migrateV11(db: DatabaseSync): void;
24
+ //# sourceMappingURL=local-db-v11.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v11.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v11.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmBjD"}
@@ -0,0 +1,25 @@
1
+ import { foldTwins } from './local-db-v7.js';
2
+ import { connectorItemKey } from './source-key.js';
3
+ const TWIN_COLUMNS = 'id, rowid, created_at, title, summary, ratified_by, ratified_at, confirmed_by, confirmed_at';
4
+ export function migrateV11(db) {
5
+ const rows = db.prepare(`SELECT id, source_url, source_key FROM decisions WHERE platform = 'zoom' AND source_key IS NOT NULL AND source_url IS NOT NULL ORDER BY rowid`)
6
+ .all();
7
+ for (const row of rows) {
8
+ const next = connectorItemKey('zoom', row.source_url);
9
+ if (next === row.source_key)
10
+ continue;
11
+ if (next === undefined) {
12
+ db.prepare('UPDATE decisions SET source_key = NULL WHERE id = ?').run(row.id);
13
+ continue;
14
+ }
15
+ const holder = db.prepare('SELECT id FROM decisions WHERE source_key = ? AND id <> ?').get(next, row.id);
16
+ if (holder === undefined) {
17
+ db.prepare('UPDATE decisions SET source_key = ? WHERE id = ?').run(next, row.id);
18
+ continue;
19
+ }
20
+ const twins = db.prepare(`SELECT ${TWIN_COLUMNS} FROM decisions WHERE id IN (?, ?) ORDER BY rowid`).all(row.id, holder.id);
21
+ // The row holding the right key is the preferred survivor when neither is attested.
22
+ foldTwins(db, twins, next, 'migration', holder.id);
23
+ }
24
+ }
25
+ //# sourceMappingURL=local-db-v11.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v11.js","sourceRoot":"","sources":["../../src/lib/local-db-v11.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,YAAY,GAAG,6FAA6F,CAAC;AAEnH,MAAM,UAAU,UAAU,CAAC,EAAgB;IACzC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,+IAA+I,CAAC;SACrK,GAAG,EAAmE,CAAC;IAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,GAAG,CAAC,UAAU;YAAE,SAAS;QACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAA+B,CAAC;QACvI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,YAAY,mDAAmD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAyB,CAAC;QACnJ,oFAAoF;QACpF,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}