@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,30 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ export interface TwinRow {
3
+ id: string;
4
+ rowid: number;
5
+ created_at: string;
6
+ title: string;
7
+ summary: string;
8
+ ratified_by: string | null;
9
+ ratified_at: string | null;
10
+ confirmed_by: string | null;
11
+ confirmed_at: string | null;
12
+ }
13
+ /**
14
+ * Fold a set of twins of one item into one row. Survivor: the earliest ratified row, else the
15
+ * earliest confirmed row, else `preferred` (the keyed holder at runtime) or the newest. A row a
16
+ * person ratified or confirmed keeps ITS text and vector: the attestation covers text they
17
+ * read, so newer upstream text is recorded as a `text_revision_pending` audit note instead of
18
+ * replacing it. An unattested survivor holds the newest text already. Either way the survivor
19
+ * keeps the earliest created_at and carries any ratification or confirmation a loser held that
20
+ * it lacks. A SECOND ratified twin with different text is a disagreement between two people:
21
+ * its ratification is kept as a `ratification_conflict` audit row (by, at, text) on the
22
+ * survivor. The local graph has no decision flag column or status surface for that, so the
23
+ * audit row is the visible record. Caller owns the transaction.
24
+ */
25
+ export declare function foldTwins(db: DatabaseSync, twins: TwinRow[], key: string, actor: string, preferred?: string): void;
26
+ /** Runtime entry: fold the keyless row `twinId` into the row holding `key`, in one transaction
27
+ * (no partial re-points, no duplicate backup row on a retry). */
28
+ export declare function foldKeylessTwin(db: DatabaseSync, twinId: string, holderId: string, key: string): void;
29
+ export declare function migrateV7(db: DatabaseSync): void;
30
+ //# sourceMappingURL=local-db-v7.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v7.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v7.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAyHhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAC9E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAClH;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA0ClH;AAID;kEACkE;AAClE,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAYrG;AAQD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8ChD"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Schema v7 (plan phase L2): one bump for sync state, source identity, enrichment and local
3
+ * judgements. Called from migrate() in local-db-migrate.ts, inside the `version < 7` branch.
4
+ *
5
+ * What it adds:
6
+ * - `source_sync`: one row per (source, scope) - window, watermark, status and who changed it
7
+ * (`changed_via` cli|mcp, plus the agent for mcp). A widened scope is a NEW row, so it starts
8
+ * a fresh window instead of inheriting the narrow scope's watermark.
9
+ * - `decisions.source_key`: the identity of a one-item-per-URL connector item
10
+ * (source-key.ts). (source_url, title) stays the identity of every other row, because a
11
+ * session transcript or a manual capture can hold several decisions under one URL.
12
+ * - `decisions.detail_pending`: 1 while a GitHub item's discussion has not been fetched yet.
13
+ * - `decisions.enriched_at`: set by ingestOne as its LAST write, after the link pass. NULL on
14
+ * every row that exists at upgrade, on purpose: nothing on disk tells a finished ingest from
15
+ * one that died between embedding and linking, so every row is re-linked once by the next
16
+ * sync (Decision 30). The migration itself does no re-linking, so it stays fast.
17
+ * - `local_judgements`: a person's verdict on a decision, with judge, time and cli|mcp origin.
18
+ * No foreign key to `decisions`, like C7's `promotions`: a purge must not erase a record the
19
+ * user may still want to share. Ratification is not here (Decision 14).
20
+ * - `decisions_merged_backup`, `decision_embeddings_merged_backup`, `decision_refs_merged_backup`:
21
+ * every decision row the twin merge deletes, with that row's vector and refs. That is what a
22
+ * restore can recover (INSERT ... SELECT the three back). It is NOT a full undo: links, audit
23
+ * rows, local judgements and promotions that named a loser were RE-POINTED at the survivor
24
+ * (a link between two twins, and a duplicate link's lower confidence, were dropped), and are
25
+ * not copied anywhere. A restored loser comes back without them.
26
+ *
27
+ * Twin merge (Decision 3). v6 keyed rows on (source_url, title), so an edited PR or issue title
28
+ * wrote a second row for the same item. Rows sharing a source_key are merged: the survivor is
29
+ * the first ratified row, else the first confirmed row, else the most recently inserted. An
30
+ * unattested survivor holds the newest text (it is the newest row). An attested survivor KEEPS
31
+ * its own text and vector, and the newer text is stored as a `text_revision_pending` audit note
32
+ * (mergeGroup). Everything that named a loser is re-pointed; a link between two twins is dropped
33
+ * rather than turned into a self-link; a duplicate link keeps the higher confidence.
34
+ *
35
+ * Replay-safe: every CREATE is IF NOT EXISTS, every ALTER is guarded by table_info, keys are
36
+ * computed only where NULL, and a second pass finds no group of twins left to merge.
37
+ */
38
+ import { copyRowsToBackup } from './backup-copy.js';
39
+ import { bumpRowSetEpoch } from './local-db-epoch.js';
40
+ import { isCaptureShaped } from './local-ingest.js';
41
+ import { connectorItemKey } from './source-key.js';
42
+ const V7_TABLES = `
43
+ CREATE TABLE IF NOT EXISTS source_sync (
44
+ source_id TEXT NOT NULL,
45
+ scope_key TEXT NOT NULL,
46
+ scope TEXT NOT NULL CHECK (scope IN ('yours', 'team')),
47
+ window_since TEXT,
48
+ high_water TEXT,
49
+ pending_until TEXT,
50
+ status TEXT NOT NULL DEFAULT 'ok' CHECK (status IN ('ok', 'partial', 'needs_reauth', 'error')),
51
+ last_started_at TEXT,
52
+ last_success_at TEXT,
53
+ items_last_run INTEGER,
54
+ skips_last_run TEXT,
55
+ changed_via TEXT CHECK (changed_via IS NULL OR changed_via IN ('cli', 'mcp')),
56
+ changed_by_agent TEXT,
57
+ PRIMARY KEY (source_id, scope_key)
58
+ );
59
+
60
+ CREATE TABLE IF NOT EXISTS local_judgements (
61
+ id TEXT PRIMARY KEY,
62
+ decision_id TEXT NOT NULL,
63
+ counterpart_id TEXT,
64
+ context_key TEXT,
65
+ kind TEXT NOT NULL CHECK (kind IN ('conflict_verdict', 'check_verdict', 'supersede', 'not_a_decision', 'note')),
66
+ value TEXT CHECK (value IS NULL OR value IN ('real', 'false')),
67
+ note TEXT,
68
+ judge_id TEXT NOT NULL,
69
+ judge_label TEXT,
70
+ via TEXT NOT NULL CHECK (via IN ('cli', 'mcp')),
71
+ agent_id TEXT,
72
+ judged_at TEXT NOT NULL,
73
+ CHECK ((via = 'mcp') = (agent_id IS NOT NULL)),
74
+ CHECK ((kind = 'check_verdict') = (context_key IS NOT NULL))
75
+ );
76
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_local_judgements_person
77
+ ON local_judgements (decision_id, COALESCE(counterpart_id, context_key, decision_id), judge_id, kind)
78
+ WHERE kind <> 'note';
79
+ `;
80
+ /** Created LAST: the source_key index cannot build while twins still share a key. */
81
+ const V7_INDEXES = `
82
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_decisions_source_key ON decisions(source_key) WHERE source_key IS NOT NULL;
83
+ CREATE INDEX IF NOT EXISTS idx_decisions_detail_pending ON decisions(platform, decided_at) WHERE detail_pending = 1;
84
+ CREATE INDEX IF NOT EXISTS idx_decisions_not_enriched ON decisions(created_at) WHERE enriched_at IS NULL;
85
+ `;
86
+ const V7_COLUMNS = [
87
+ ['source_key', 'source_key TEXT'],
88
+ ['detail_pending', 'detail_pending INTEGER NOT NULL DEFAULT 0'],
89
+ ['enriched_at', 'enriched_at TEXT'],
90
+ ];
91
+ function tableExists(db, name) {
92
+ return db.prepare(`SELECT 1 AS hit FROM sqlite_master WHERE type = 'table' AND name = ?`).get(name) !== undefined;
93
+ }
94
+ function columnsOf(db, table) {
95
+ return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map(c => c.name));
96
+ }
97
+ /** Rows naming `from` now name `to`. A row whose re-pointed key already exists is left on the
98
+ * loser's id (the loser is in the backup table), never deleted: losing a record is the
99
+ * destructive direction, and an orphan pointing at a backed-up row can still be restored. */
100
+ function repoint(db, table, column, from, to) {
101
+ db.prepare(`UPDATE OR IGNORE ${table} SET ${column} = ? WHERE ${column} = ?`).run(to, from);
102
+ }
103
+ function repointLinks(db, loser, survivor, group) {
104
+ const links = db.prepare(`SELECT id, source_id AS s, target_id AS t, relation, confidence FROM decision_links WHERE source_id = ? OR target_id = ?`)
105
+ .all(loser, loser);
106
+ for (const link of links) {
107
+ const s = link.s === loser ? survivor : link.s;
108
+ const t = link.t === loser ? survivor : link.t;
109
+ // A link between two twins of one item would become a self-link: drop it.
110
+ if (s === t || (group.has(s) && group.has(t))) {
111
+ db.prepare('DELETE FROM decision_links WHERE id = ?').run(link.id);
112
+ continue;
113
+ }
114
+ const existing = db.prepare('SELECT id FROM decision_links WHERE source_id = ? AND target_id = ? AND relation = ?')
115
+ .get(s, t, link.relation);
116
+ if (existing) {
117
+ db.prepare('UPDATE decision_links SET confidence = MAX(confidence, ?) WHERE id = ?').run(link.confidence, existing.id);
118
+ db.prepare('DELETE FROM decision_links WHERE id = ?').run(link.id);
119
+ }
120
+ else {
121
+ db.prepare('UPDATE decision_links SET source_id = ?, target_id = ? WHERE id = ?').run(s, t, link.id);
122
+ }
123
+ }
124
+ }
125
+ /** Fold one twin into its survivor: back the row up, re-point everything that named it, delete
126
+ * it. The loser's vector is dropped: the survivor keeps its own text, so it keeps its own
127
+ * vector (a survivor that takes newer text is the newest row, which already holds that
128
+ * text's vector). Also used by insertDecision to absorb a keyless row written by an older
129
+ * binary. */
130
+ function absorbLoser(db, loserId, survivorId, group, actor) {
131
+ bumpRowSetEpoch(db);
132
+ const hasJudgements = tableExists(db, 'local_judgements');
133
+ const hasPromotions = tableExists(db, 'promotions');
134
+ copyRowsToBackup(db, 'decisions', 'decisions_merged_backup', 'id', loserId);
135
+ copyRowsToBackup(db, 'decision_embeddings', 'decision_embeddings_merged_backup', 'decision_id', loserId);
136
+ copyRowsToBackup(db, 'decision_refs', 'decision_refs_merged_backup', 'decision_id', loserId);
137
+ repoint(db, 'decision_audit', 'decision_id', loserId, survivorId);
138
+ repointLinks(db, loserId, survivorId, group);
139
+ repoint(db, 'decision_refs', 'decision_id', loserId, survivorId);
140
+ if (hasJudgements) {
141
+ repoint(db, 'local_judgements', 'decision_id', loserId, survivorId);
142
+ repoint(db, 'local_judgements', 'counterpart_id', loserId, survivorId);
143
+ }
144
+ if (hasPromotions)
145
+ repoint(db, 'promotions', 'local_id', loserId, survivorId);
146
+ // Refs the survivor already had stay as they are; the loser's leftovers are duplicates.
147
+ db.prepare('DELETE FROM decision_refs WHERE decision_id = ?').run(loserId);
148
+ db.prepare('DELETE FROM decision_embeddings WHERE decision_id = ?').run(loserId);
149
+ db.prepare('DELETE FROM decisions WHERE id = ?').run(loserId);
150
+ db.prepare(`INSERT INTO decision_audit (id, decision_id, action, actor, detail) VALUES (lower(hex(randomblob(16))), ?, 'merged', ?, ?)`)
151
+ .run(survivorId, actor, loserId);
152
+ }
153
+ /** Earliest first by the attestation time, ties by insertion order. */
154
+ function earliestBy(twins, at) {
155
+ return twins.filter(t => t[at] !== null)
156
+ .sort((a, b) => (a[at] < b[at] ? -1 : a[at] > b[at] ? 1 : a.rowid - b.rowid));
157
+ }
158
+ const auditInsert = `INSERT INTO decision_audit (id, decision_id, action, actor, detail) VALUES (lower(hex(randomblob(16))), ?, ?, ?, ?)`;
159
+ /**
160
+ * Fold a set of twins of one item into one row. Survivor: the earliest ratified row, else the
161
+ * earliest confirmed row, else `preferred` (the keyed holder at runtime) or the newest. A row a
162
+ * person ratified or confirmed keeps ITS text and vector: the attestation covers text they
163
+ * read, so newer upstream text is recorded as a `text_revision_pending` audit note instead of
164
+ * replacing it. An unattested survivor holds the newest text already. Either way the survivor
165
+ * keeps the earliest created_at and carries any ratification or confirmation a loser held that
166
+ * it lacks. A SECOND ratified twin with different text is a disagreement between two people:
167
+ * its ratification is kept as a `ratification_conflict` audit row (by, at, text) on the
168
+ * survivor. The local graph has no decision flag column or status surface for that, so the
169
+ * audit row is the visible record. Caller owns the transaction.
170
+ */
171
+ export function foldTwins(db, twins, key, actor, preferred) {
172
+ const newest = twins[twins.length - 1];
173
+ const ratifiedAll = earliestBy(twins, 'ratified_at');
174
+ const ratified = ratifiedAll[0];
175
+ const confirmed = earliestBy(twins, 'confirmed_at')[0];
176
+ const attested = ratified ?? confirmed;
177
+ const survivor = attested ?? twins.find(t => t.id === preferred) ?? newest;
178
+ const group = new Set(twins.map(t => t.id));
179
+ const earliestCreated = twins.map(t => t.created_at).sort()[0];
180
+ const latest = db.prepare('SELECT source_url, repo, decided_at FROM decisions WHERE id = ?')
181
+ .get(newest.id);
182
+ for (const loser of twins.filter(t => t.id !== survivor.id))
183
+ absorbLoser(db, loser.id, survivor.id, group, actor);
184
+ const others = ratifiedAll.slice(1).filter(t => t.id !== survivor.id);
185
+ const conflicts = others.filter(t => t.title !== survivor.title || t.summary !== survivor.summary);
186
+ // A second ratifier of the SAME text: their ratification would otherwise exist only in the backup.
187
+ for (const t of others.filter(o => !conflicts.includes(o))) {
188
+ db.prepare(auditInsert).run(survivor.id, 'ratification_agreed', actor, JSON.stringify({ by: t.ratified_by, at: t.ratified_at }));
189
+ }
190
+ for (const c of conflicts) {
191
+ db.prepare(auditInsert).run(survivor.id, 'ratification_conflict', actor, JSON.stringify({ by: c.ratified_by, at: c.ratified_at, title: c.title, summary: c.summary }));
192
+ }
193
+ if (attested === undefined) {
194
+ db.prepare('UPDATE decisions SET source_url = ?, repo = COALESCE(?, repo), decided_at = COALESCE(?, decided_at) WHERE id = ?')
195
+ .run(latest.source_url, latest.repo, latest.decided_at, survivor.id);
196
+ }
197
+ else {
198
+ db.prepare('UPDATE decisions SET repo = COALESCE(?, repo), decided_at = COALESCE(?, decided_at) WHERE id = ?')
199
+ .run(latest.repo, latest.decided_at, survivor.id);
200
+ const covered = conflicts.some(c => c.id === newest.id);
201
+ if (newest.id !== survivor.id && !covered && (newest.title !== survivor.title || newest.summary !== survivor.summary)) {
202
+ db.prepare(auditInsert).run(survivor.id, 'text_revision_pending', actor, JSON.stringify({ title: newest.title, summary: newest.summary }));
203
+ }
204
+ }
205
+ db.prepare(`UPDATE decisions SET created_at = ?, source_key = ?,
206
+ ratified_by = COALESCE(ratified_by, ?), ratified_at = COALESCE(ratified_at, ?),
207
+ confirmed_by = COALESCE(confirmed_by, ?), confirmed_at = COALESCE(confirmed_at, ?)
208
+ WHERE id = ?`).run(earliestCreated, key, ratified?.ratified_by ?? null, ratified?.ratified_at ?? null, confirmed?.confirmed_by ?? null, confirmed?.confirmed_at ?? null, survivor.id);
209
+ }
210
+ const TWIN_COLUMNS = 'id, rowid, created_at, title, summary, ratified_by, ratified_at, confirmed_by, confirmed_at';
211
+ /** Runtime entry: fold the keyless row `twinId` into the row holding `key`, in one transaction
212
+ * (no partial re-points, no duplicate backup row on a retry). */
213
+ export function foldKeylessTwin(db, twinId, holderId, key) {
214
+ const own = !db.isTransaction;
215
+ if (own)
216
+ db.exec('BEGIN IMMEDIATE');
217
+ try {
218
+ const twins = db.prepare(`SELECT ${TWIN_COLUMNS} FROM decisions WHERE id IN (?, ?) ORDER BY rowid`)
219
+ .all(twinId, holderId);
220
+ foldTwins(db, twins, key, 'sync', holderId);
221
+ if (own)
222
+ db.exec('COMMIT');
223
+ }
224
+ catch (err) {
225
+ if (own && db.isTransaction)
226
+ db.exec('ROLLBACK');
227
+ throw err;
228
+ }
229
+ }
230
+ function mergeGroup(db, key) {
231
+ const twins = db.prepare(`SELECT ${TWIN_COLUMNS} FROM decisions WHERE source_key = ? ORDER BY rowid`)
232
+ .all(key);
233
+ foldTwins(db, twins, key, 'migration');
234
+ }
235
+ export function migrateV7(db) {
236
+ const existing = columnsOf(db, 'decisions');
237
+ for (const [name, ddl] of V7_COLUMNS) {
238
+ if (!existing.has(name))
239
+ db.exec(`ALTER TABLE decisions ADD COLUMN ${ddl}`);
240
+ }
241
+ db.exec(V7_TABLES);
242
+ // After the ALTERs, so the backup carries every column a row can hold.
243
+ db.exec('CREATE TABLE IF NOT EXISTS decisions_merged_backup AS SELECT * FROM decisions WHERE 0');
244
+ db.exec('CREATE TABLE IF NOT EXISTS decision_embeddings_merged_backup AS SELECT * FROM decision_embeddings WHERE 0');
245
+ db.exec('CREATE TABLE IF NOT EXISTS decision_refs_merged_backup AS SELECT * FROM decision_refs WHERE 0');
246
+ // Only rows that look like connector imports are keyed. A v6 row cannot say how it was
247
+ // written, and `align capture <PR url>` wrote platform github too, so the rule is on the
248
+ // row: a capture has the summary "Captured from <host>" or the URL's last path segment as
249
+ // its title (isCaptureShaped). Those stay unkeyed. When unsure, do not merge: the cost of
250
+ // a missed twin is a duplicate the next sync can still resolve, the cost of a wrong merge
251
+ // is a lost record.
252
+ const unkeyed = db.prepare('SELECT id, platform, source_url, title, summary FROM decisions WHERE source_key IS NULL AND source_url IS NOT NULL')
253
+ .all();
254
+ const setKey = db.prepare('UPDATE decisions SET source_key = ? WHERE id = ?');
255
+ for (const row of unkeyed) {
256
+ if (isCaptureShaped(row))
257
+ continue;
258
+ const key = connectorItemKey(row.platform, row.source_url);
259
+ if (key !== undefined)
260
+ setKey.run(key, row.id);
261
+ }
262
+ // Non-unique and temporary: the unique index cannot exist while twins share a key, and
263
+ // without any index each group's `WHERE source_key = ?` scanned the whole table.
264
+ db.exec('CREATE INDEX IF NOT EXISTS tmp_v7_key ON decisions(source_key)');
265
+ const groups = db.prepare('SELECT source_key AS k FROM decisions WHERE source_key IS NOT NULL GROUP BY source_key HAVING count(*) > 1')
266
+ .all();
267
+ // The fold looks up links by target, audit rows and judgements by decision for every loser;
268
+ // none of those has an index (links are indexed by source only), so 3k merges scanned the
269
+ // tables 3k times. Temporary, created inside the migration's transaction and dropped with it.
270
+ const temp = [
271
+ 'CREATE INDEX IF NOT EXISTS tmp_v7_links_target ON decision_links(target_id)',
272
+ 'CREATE INDEX IF NOT EXISTS tmp_v7_audit_decision ON decision_audit(decision_id)',
273
+ 'CREATE INDEX IF NOT EXISTS tmp_v7_judgements_counterpart ON local_judgements(counterpart_id)',
274
+ ];
275
+ if (groups.length > 0)
276
+ for (const ddl of temp)
277
+ db.exec(ddl);
278
+ for (const { k } of groups)
279
+ mergeGroup(db, k);
280
+ for (const name of ['tmp_v7_key', 'tmp_v7_links_target', 'tmp_v7_audit_decision', 'tmp_v7_judgements_counterpart']) {
281
+ db.exec(`DROP INDEX IF EXISTS ${name}`);
282
+ }
283
+ db.exec(V7_INDEXES);
284
+ }
285
+ //# sourceMappingURL=local-db-v7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v7.js","sourceRoot":"","sources":["../../src/lib/local-db-v7.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Schema v8 (L5 review): the sync's own state moves into the migration system.
3
+ *
4
+ * - `source_sync.cycle_top`: the newest `updated_at` seen across a pending cycle (a read a ceiling
5
+ * split over several runs), kept in the scope's own row so another scope's items can never
6
+ * lift this scope's watermark.
7
+ * - `source_sync.last_attempt_at`: every run stamps it; `last_success_at` is stamped only by a
8
+ * COMPLETE run, so a source that is always partial no longer reads as freshly synced.
9
+ * - `sync_item_state`: the vendor's own last-updated time per stored item and scope (hot Slack
10
+ * threads). A cache of vendor facts, rebuilt by the next wide read. An earlier, unreleased shape
11
+ * of this table (no scope column, created outside the migrations) is replaced and its rows carried across.
12
+ * - `*_purged_backup`: every row `align local forget --purge` deletes is copied here first, with its
13
+ * vector and refs, inside the same transaction. Links, audit rows and judgements of a purged
14
+ * row are not copied (a purge never touches a row that has an audit act or a judgement).
15
+ *
16
+ * An earlier, unreleased shape of `sync_item_state` (no scope column) keeps its rows, as scope 'yours'.
17
+ *
18
+ * Replay-safe: every ALTER is guarded by table_info, every CREATE is IF NOT EXISTS.
19
+ */
20
+ import type { DatabaseSync } from 'node:sqlite';
21
+ export declare function migrateV8(db: DatabaseSync): void;
22
+ //# sourceMappingURL=local-db-v8.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v8.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v8.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0BhD"}
@@ -0,0 +1,33 @@
1
+ function columnsOf(db, table) {
2
+ return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((c) => c.name));
3
+ }
4
+ export function migrateV8(db) {
5
+ const sync = columnsOf(db, 'source_sync');
6
+ for (const [name, ddl] of [['cycle_top', 'cycle_top TEXT'], ['last_attempt_at', 'last_attempt_at TEXT']]) {
7
+ if (!sync.has(name))
8
+ db.exec(`ALTER TABLE source_sync ADD COLUMN ${ddl}`);
9
+ }
10
+ // An earlier, unreleased shape (no scope column, created outside the migrations) is set aside and its rows
11
+ // carried across as scope 'yours', the only scope that ever wrote them.
12
+ const state = columnsOf(db, 'sync_item_state');
13
+ const legacy = state.size > 0 && !state.has('scope_key');
14
+ if (legacy)
15
+ db.exec('ALTER TABLE sync_item_state RENAME TO sync_item_state_unscoped');
16
+ db.exec(`CREATE TABLE IF NOT EXISTS sync_item_state (
17
+ decision_id TEXT NOT NULL,
18
+ scope_key TEXT NOT NULL DEFAULT 'yours',
19
+ platform TEXT NOT NULL,
20
+ updated_at TEXT NOT NULL,
21
+ PRIMARY KEY (decision_id, scope_key)
22
+ )`);
23
+ db.exec('CREATE INDEX IF NOT EXISTS idx_sync_item_state_platform ON sync_item_state(platform)');
24
+ if (legacy) {
25
+ db.exec(`INSERT OR IGNORE INTO sync_item_state (decision_id, scope_key, platform, updated_at)
26
+ SELECT decision_id, 'yours', platform, updated_at FROM sync_item_state_unscoped`);
27
+ db.exec('DROP TABLE sync_item_state_unscoped');
28
+ }
29
+ db.exec('CREATE TABLE IF NOT EXISTS decisions_purged_backup AS SELECT * FROM decisions WHERE 0');
30
+ db.exec('CREATE TABLE IF NOT EXISTS decision_embeddings_purged_backup AS SELECT * FROM decision_embeddings WHERE 0');
31
+ db.exec('CREATE TABLE IF NOT EXISTS decision_refs_purged_backup AS SELECT * FROM decision_refs WHERE 0');
32
+ }
33
+ //# sourceMappingURL=local-db-v8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v8.js","sourceRoot":"","sources":["../../src/lib/local-db-v8.ts"],"names":[],"mappings":"AAqBA,SAAS,SAAS,CAAC,EAAgB,EAAE,KAAa;IAChD,OAAO,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAU,EAAE,CAAC;QAClH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,2GAA2G;IAC3G,wEAAwE;IACxE,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,EAAE,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IACtF,EAAE,CAAC,IAAI,CAAC;;;;;;IAMN,CAAC,CAAC;IACJ,EAAE,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IAChG,IAAI,MAAM,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CAAC;6FACiF,CAAC,CAAC;QAC3F,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACjD,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACjG,EAAE,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;IACrH,EAAE,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;AAC3G,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Schema v9 (L5 second review): a hole that comes back run after run has to be NAMED and counted, or the
3
+ * source re-reads it forever (or, worse, hides it). `source_sync.hole_sig` is a signature of what the last
4
+ * incomplete run could not read and `hole_streak` is how many consecutive runs had that same hole; after
5
+ * five, the sync says plainly that it is a persistent hole and stops letting it hold the watermark back.
6
+ * Guarded ALTERs: replay-safe.
7
+ */
8
+ import type { DatabaseSync } from 'node:sqlite';
9
+ export declare function migrateV9(db: DatabaseSync): void;
10
+ //# sourceMappingURL=local-db-v9.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v9.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v9.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAIhD"}
@@ -0,0 +1,8 @@
1
+ export function migrateV9(db) {
2
+ const have = new Set(db.prepare('PRAGMA table_info(source_sync)').all().map((c) => c.name));
3
+ if (!have.has('hole_sig'))
4
+ db.exec('ALTER TABLE source_sync ADD COLUMN hole_sig TEXT');
5
+ if (!have.has('hole_streak'))
6
+ db.exec('ALTER TABLE source_sync ADD COLUMN hole_streak INTEGER NOT NULL DEFAULT 0');
7
+ }
8
+ //# sourceMappingURL=local-db-v9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v9.js","sourceRoot":"","sources":["../../src/lib/local-db-v9.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACvF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;AACrH,CAAC"}
@@ -49,16 +49,7 @@ export interface DbStats {
49
49
  decisions: number;
50
50
  embeddings: number;
51
51
  }
52
- /**
53
- * Schema version this build expects. Bump when adding a step to `migrate`.
54
- *
55
- * Exported so a test can assert the migration WROTE the version it claims, without hardcoding
56
- * the number - a test pinning a literal 1 had to be edited by this change rather than passing
57
- * or failing on its own merits. A parity test also derives the highest `version <` branch in
58
- * `migrate` from the source and compares it here, because forgetting the bump leaves the new
59
- * branch running destructively on every open with nothing to stop it.
60
- */
61
- export declare const SCHEMA_VERSION = 6;
52
+ export { SCHEMA_VERSION } from './local-db-migrate.js';
62
53
  /**
63
54
  * ALI-829: a source timestamp as this database stores it - ISO-8601 Z - or null.
64
55
  *
@@ -134,6 +125,14 @@ export declare function createLocalDb(dbPath: string): {
134
125
  * immutable, so a human re-capture cannot launder an agent claim into 'human' (the
135
126
  * cloud's snapshots.ts rule). Omitted stores NULL, which reads as 'unknown'. */
136
127
  deciderKind?: DeciderKind | null;
128
+ /** L2: true ONLY from connector import code. Gives a one-item-per-URL item its source_key,
129
+ * so an edited title updates the row. Never inferred from the platform: `align capture
130
+ * <PR url>` stamps `github` too, and must not merge with the imported item. */
131
+ keyed?: boolean;
132
+ /** L3: the item arrived items-first (GitHub `discussion: 'none'`): its discussion has not
133
+ * been fetched. Stored in `detail_pending` so the later drain can find it. A pending
134
+ * arrival never downgrades a row whose discussion is already stored (see the upsert). */
135
+ detailPending?: boolean;
137
136
  }): string;
138
137
  /**
139
138
  * The id this graph already holds for `(source_url, title)`, or null.
@@ -159,7 +158,30 @@ export declare function createLocalDb(dbPath: string): {
159
158
  * A null `sourceUrl` is always null here: SQLite treats each NULL in a unique index as
160
159
  * distinct, so those rows never conflict and every one of them really is new.
161
160
  */
162
- findIdBySource(sourceUrl: string | null, title: string): string | null;
161
+ findIdBySource(sourceUrl: string | null, title: string, platform?: string, keyed?: boolean): string | null;
162
+ /**
163
+ * Review finding 4: what a keyed re-import may write over row `id`. A ratified or confirmed
164
+ * row keeps the text a person attested; the incoming text is recorded once as a
165
+ * `text_revision_pending` audit note and the stored text is returned. Any other row (or an
166
+ * unknown id) gets the incoming text back unchanged.
167
+ */
168
+ keepProtectedText(id: string, title: string, summary: string, thin?: boolean): {
169
+ title: string;
170
+ summary: string;
171
+ keptDiscussion?: true;
172
+ };
173
+ /** The id of the connector-imported item `url` names, under any platform, or null. A capture
174
+ * of that URL must not rewrite the imported text (L2 review finding 1). */
175
+ findKeyedIdByUrl(url: string): string | null;
176
+ /**
177
+ * A keyless row at this (source_url, title) is a twin an older binary wrote beside the keyed
178
+ * one. Adopt it as the keyed row, or fold it with the row that already holds the key (the
179
+ * attested one survives). ingestOne calls this BEFORE it looks the item up, so the text it
180
+ * protects and embeds is the survivor's. No-op for an unkeyed call.
181
+ */
182
+ foldPendingTwin(sourceUrl: string | null, title: string, platform: string, keyed?: boolean): void;
183
+ /** A capture of a URL a connector already imported: audit it, change nothing, return the row. */
184
+ noteCaptureOfHeldItem(url: string): DecisionRow | null;
163
185
  /**
164
186
  * `filter.repo` scopes to one repo's rows. `includeUnattributed` (ALI-798's own rule:
165
187
  * "repo = ? OR repo IS NULL") also returns rows with no repo at all - a Jira ticket, a
@@ -197,6 +219,14 @@ export declare function createLocalDb(dbPath: string): {
197
219
  markConfirmed(id: string, confirmedBy: string): {
198
220
  confirmedAt: string;
199
221
  } | null;
222
+ /**
223
+ * L2, Decision 30: the decision's ingest finished, link pass included. ingestOne is the one
224
+ * caller, and calls it as its last write; insertDecision clears it whenever it rewrites the
225
+ * row. NULL therefore means "links not known to be current", and the unchanged-skip will
226
+ * not skip such a row.
227
+ */
228
+ markEnriched(id: string): void;
229
+ getEnrichedAt(id: string): string | null;
200
230
  /** ALI-831: one row per human act on a decision (ratified, pushed), so "who stood behind
201
231
  * this, and when" is answerable after the fact. Append-only by construction. */
202
232
  insertAudit(entry: {
@@ -309,11 +339,20 @@ export declare function createLocalDb(dbPath: string): {
309
339
  * refreshed rather than ignored so a better score replaces a worse one.
310
340
  */
311
341
  insertLink(link: {
342
+ id?: string;
312
343
  sourceId: string;
313
344
  targetId: string;
314
345
  relation: string;
315
346
  confidence: number;
316
347
  }): void;
348
+ /**
349
+ * LM: the ONE way a link is deleted on behalf of a person's mark. `align mark <a> replaces <b>`
350
+ * writes its supersedes link under the id `mark:<judgement id>` (when the classifier had not
351
+ * already written that edge, in which case the edge keeps its own id and is not ours), and
352
+ * `--undo` removes exactly that row here. The id is built inside this method, so no caller can
353
+ * name another link: a classifier edge, or a link another mark owns, cannot be reached from here.
354
+ */
355
+ deleteMarkLink(judgementId: string): number;
317
356
  /**
318
357
  * ALI-1065: a pair gets ONE edge, never two. `insertLinkRow`'s unique index is on
319
358
  * (source_id, target_id, relation), so writing `supersedes` for a pair that already
@@ -392,6 +431,17 @@ export declare function createLocalDb(dbPath: string): {
392
431
  }): LinkRow[];
393
432
  getStats(): DbStats;
394
433
  dropAll(): void;
434
+ /** Goes up whenever a decision is deleted or re-id'd or an embedding is deleted or replaced
435
+ * on this connection (see local-db-epoch.ts). A holder of a copy of the embeddings
436
+ * compares it to the value it built at. */
437
+ rowSetEpoch(): number;
438
+ /** SQLite's data_version: changes when ANOTHER connection commits (another process, an
439
+ * MCP server, a second CLI), never for this connection's own writes. The cross-process
440
+ * half of "has the graph moved under my copy of it". */
441
+ dataVersion(): number;
442
+ /** Stored embeddings of every model: an upper bound on what a matrix would hold, read
443
+ * before building one so a huge graph is never loaded just to be refused. */
444
+ countEmbeddings(): number;
395
445
  close(): void;
396
446
  };
397
447
  export type LocalDb = ReturnType<typeof createLocalDb>;
@@ -1 +1 @@
1
- {"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"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"}