@aligndottech/cli 0.50.0 → 0.51.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 (323) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +6 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/config.d.ts +8 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +33 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/connect-agents.d.ts.map +1 -1
  10. package/dist/commands/connect-agents.js +3 -1
  11. package/dist/commands/connect-agents.js.map +1 -1
  12. package/dist/commands/env.d.ts.map +1 -1
  13. package/dist/commands/env.js +11 -0
  14. package/dist/commands/env.js.map +1 -1
  15. package/dist/commands/invite.d.ts +8 -18
  16. package/dist/commands/invite.d.ts.map +1 -1
  17. package/dist/commands/invite.js +23 -46
  18. package/dist/commands/invite.js.map +1 -1
  19. package/dist/commands/join.d.ts +5 -0
  20. package/dist/commands/join.d.ts.map +1 -0
  21. package/dist/commands/join.js +49 -0
  22. package/dist/commands/join.js.map +1 -0
  23. package/dist/commands/local-relink.d.ts +35 -0
  24. package/dist/commands/local-relink.d.ts.map +1 -0
  25. package/dist/commands/local-relink.js +72 -0
  26. package/dist/commands/local-relink.js.map +1 -0
  27. package/dist/commands/local.d.ts.map +1 -1
  28. package/dist/commands/local.js +37 -0
  29. package/dist/commands/local.js.map +1 -1
  30. package/dist/commands/login.d.ts.map +1 -1
  31. package/dist/commands/login.js +21 -2
  32. package/dist/commands/login.js.map +1 -1
  33. package/dist/commands/mcp.d.ts +8 -0
  34. package/dist/commands/mcp.d.ts.map +1 -1
  35. package/dist/commands/mcp.js +12 -5
  36. package/dist/commands/mcp.js.map +1 -1
  37. package/dist/commands/registry.d.ts.map +1 -1
  38. package/dist/commands/registry.js +4 -0
  39. package/dist/commands/registry.js.map +1 -1
  40. package/dist/commands/share.d.ts.map +1 -1
  41. package/dist/commands/share.js +81 -12
  42. package/dist/commands/share.js.map +1 -1
  43. package/dist/commands/status.d.ts.map +1 -1
  44. package/dist/commands/status.js +10 -0
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/detector/detector-version.d.ts +16 -0
  47. package/dist/detector/detector-version.d.ts.map +1 -0
  48. package/dist/detector/detector-version.js +36 -0
  49. package/dist/detector/detector-version.js.map +1 -0
  50. package/dist/detector/relationship-contract.d.ts +30 -0
  51. package/dist/detector/relationship-contract.d.ts.map +1 -0
  52. package/dist/detector/relationship-contract.js +120 -0
  53. package/dist/detector/relationship-contract.js.map +1 -0
  54. package/dist/detector/relationship-contract.v1.json +53 -0
  55. package/dist/detector/relationship-prompt.d.ts +20 -0
  56. package/dist/detector/relationship-prompt.d.ts.map +1 -0
  57. package/dist/detector/relationship-prompt.js +55 -0
  58. package/dist/detector/relationship-prompt.js.map +1 -0
  59. package/dist/detector/relationship-prompt.v1.json +13 -0
  60. package/dist/detector/resolve-pair.d.ts +39 -0
  61. package/dist/detector/resolve-pair.d.ts.map +1 -0
  62. package/dist/detector/resolve-pair.js +345 -0
  63. package/dist/detector/resolve-pair.js.map +1 -0
  64. package/dist/detector/similar-item.d.ts +20 -0
  65. package/dist/detector/similar-item.d.ts.map +1 -0
  66. package/dist/detector/similar-item.js +16 -0
  67. package/dist/detector/similar-item.js.map +1 -0
  68. package/dist/index.js +29 -11
  69. package/dist/index.js.map +1 -1
  70. package/dist/lib/advisory-dedup.d.ts.map +1 -1
  71. package/dist/lib/advisory-dedup.js +16 -8
  72. package/dist/lib/advisory-dedup.js.map +1 -1
  73. package/dist/lib/advisory-verdict.d.ts +19 -0
  74. package/dist/lib/advisory-verdict.d.ts.map +1 -1
  75. package/dist/lib/advisory-verdict.js +6 -3
  76. package/dist/lib/advisory-verdict.js.map +1 -1
  77. package/dist/lib/backup-exclusion.d.ts +10 -0
  78. package/dist/lib/backup-exclusion.d.ts.map +1 -0
  79. package/dist/lib/backup-exclusion.js +58 -0
  80. package/dist/lib/backup-exclusion.js.map +1 -0
  81. package/dist/lib/cli-oauth.d.ts +2 -0
  82. package/dist/lib/cli-oauth.d.ts.map +1 -1
  83. package/dist/lib/cli-oauth.js +61 -10
  84. package/dist/lib/cli-oauth.js.map +1 -1
  85. package/dist/lib/config.d.ts +41 -1
  86. package/dist/lib/config.d.ts.map +1 -1
  87. package/dist/lib/config.js +106 -1
  88. package/dist/lib/config.js.map +1 -1
  89. package/dist/lib/curation/guardrail.d.ts.map +1 -1
  90. package/dist/lib/curation/guardrail.js +2 -0
  91. package/dist/lib/curation/guardrail.js.map +1 -1
  92. package/dist/lib/curation/judgements-db.d.ts +1 -0
  93. package/dist/lib/curation/judgements-db.d.ts.map +1 -1
  94. package/dist/lib/curation/judgements-db.js +9 -3
  95. package/dist/lib/curation/judgements-db.js.map +1 -1
  96. package/dist/lib/curation/mark.js +4 -2
  97. package/dist/lib/curation/mark.js.map +1 -1
  98. package/dist/lib/destination-name.d.ts +24 -0
  99. package/dist/lib/destination-name.d.ts.map +1 -0
  100. package/dist/lib/destination-name.js +39 -0
  101. package/dist/lib/destination-name.js.map +1 -0
  102. package/dist/lib/destination-summary.d.ts +6 -0
  103. package/dist/lib/destination-summary.d.ts.map +1 -0
  104. package/dist/lib/destination-summary.js +27 -0
  105. package/dist/lib/destination-summary.js.map +1 -0
  106. package/dist/lib/destination-trust.d.ts +54 -0
  107. package/dist/lib/destination-trust.d.ts.map +1 -0
  108. package/dist/lib/destination-trust.js +107 -0
  109. package/dist/lib/destination-trust.js.map +1 -0
  110. package/dist/lib/env-resolver.d.ts.map +1 -1
  111. package/dist/lib/env-resolver.js +3 -0
  112. package/dist/lib/env-resolver.js.map +1 -1
  113. package/dist/lib/fatal.d.ts +11 -0
  114. package/dist/lib/fatal.d.ts.map +1 -0
  115. package/dist/lib/fatal.js +22 -0
  116. package/dist/lib/fatal.js.map +1 -0
  117. package/dist/lib/gateway-client.d.ts +8 -16
  118. package/dist/lib/gateway-client.d.ts.map +1 -1
  119. package/dist/lib/gateway-client.js +30 -20
  120. package/dist/lib/gateway-client.js.map +1 -1
  121. package/dist/lib/invite-prompt.d.ts +4 -4
  122. package/dist/lib/invite-prompt.d.ts.map +1 -1
  123. package/dist/lib/invite-prompt.js +4 -4
  124. package/dist/lib/invite-prompt.js.map +1 -1
  125. package/dist/lib/invite-settings.d.ts +18 -0
  126. package/dist/lib/invite-settings.d.ts.map +1 -0
  127. package/dist/lib/invite-settings.js +29 -0
  128. package/dist/lib/invite-settings.js.map +1 -0
  129. package/dist/lib/join-flow.d.ts +60 -0
  130. package/dist/lib/join-flow.d.ts.map +1 -0
  131. package/dist/lib/join-flow.js +282 -0
  132. package/dist/lib/join-flow.js.map +1 -0
  133. package/dist/lib/launch/mcp-child-env.d.ts.map +1 -1
  134. package/dist/lib/launch/mcp-child-env.js +5 -2
  135. package/dist/lib/launch/mcp-child-env.js.map +1 -1
  136. package/dist/lib/lead-prompt.d.ts +106 -0
  137. package/dist/lib/lead-prompt.d.ts.map +1 -0
  138. package/dist/lib/lead-prompt.js +175 -0
  139. package/dist/lib/lead-prompt.js.map +1 -0
  140. package/dist/lib/local-candidate-classify.d.ts +26 -0
  141. package/dist/lib/local-candidate-classify.d.ts.map +1 -0
  142. package/dist/lib/local-candidate-classify.js +53 -0
  143. package/dist/lib/local-candidate-classify.js.map +1 -0
  144. package/dist/lib/local-db-migrate.d.ts +1 -1
  145. package/dist/lib/local-db-migrate.d.ts.map +1 -1
  146. package/dist/lib/local-db-migrate.js +45 -1
  147. package/dist/lib/local-db-migrate.js.map +1 -1
  148. package/dist/lib/local-db-v12.d.ts +17 -0
  149. package/dist/lib/local-db-v12.d.ts.map +1 -0
  150. package/dist/lib/local-db-v12.js +8 -0
  151. package/dist/lib/local-db-v12.js.map +1 -0
  152. package/dist/lib/local-db.d.ts +13 -13
  153. package/dist/lib/local-db.d.ts.map +1 -1
  154. package/dist/lib/local-db.js +41 -6
  155. package/dist/lib/local-db.js.map +1 -1
  156. package/dist/lib/local-gateway-client.d.ts +1 -0
  157. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  158. package/dist/lib/local-gateway-client.js +31 -20
  159. package/dist/lib/local-gateway-client.js.map +1 -1
  160. package/dist/lib/local-ingest.d.ts +2 -0
  161. package/dist/lib/local-ingest.d.ts.map +1 -1
  162. package/dist/lib/local-ingest.js.map +1 -1
  163. package/dist/lib/local-link-pass.d.ts.map +1 -1
  164. package/dist/lib/local-link-pass.js +25 -29
  165. package/dist/lib/local-link-pass.js.map +1 -1
  166. package/dist/lib/local-llm.d.ts +1 -1
  167. package/dist/lib/local-llm.d.ts.map +1 -1
  168. package/dist/lib/local-llm.js +3 -2
  169. package/dist/lib/local-llm.js.map +1 -1
  170. package/dist/lib/local-mode.d.ts +5 -1
  171. package/dist/lib/local-mode.d.ts.map +1 -1
  172. package/dist/lib/local-mode.js +11 -6
  173. package/dist/lib/local-mode.js.map +1 -1
  174. package/dist/lib/local-relationship-classifier.d.ts +4 -0
  175. package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
  176. package/dist/lib/local-relationship-classifier.js +9 -4
  177. package/dist/lib/local-relationship-classifier.js.map +1 -1
  178. package/dist/lib/local-relink.d.ts +59 -0
  179. package/dist/lib/local-relink.d.ts.map +1 -0
  180. package/dist/lib/local-relink.js +171 -0
  181. package/dist/lib/local-relink.js.map +1 -0
  182. package/dist/lib/local-set-classifier.d.ts +36 -0
  183. package/dist/lib/local-set-classifier.d.ts.map +1 -0
  184. package/dist/lib/local-set-classifier.js +81 -0
  185. package/dist/lib/local-set-classifier.js.map +1 -0
  186. package/dist/lib/local-snapshot-loader.d.ts +29 -0
  187. package/dist/lib/local-snapshot-loader.d.ts.map +1 -0
  188. package/dist/lib/local-snapshot-loader.js +108 -0
  189. package/dist/lib/local-snapshot-loader.js.map +1 -0
  190. package/dist/lib/login-flow.d.ts +15 -0
  191. package/dist/lib/login-flow.d.ts.map +1 -1
  192. package/dist/lib/login-flow.js +80 -4
  193. package/dist/lib/login-flow.js.map +1 -1
  194. package/dist/lib/mcp/share-status-tool.d.ts +13 -0
  195. package/dist/lib/mcp/share-status-tool.d.ts.map +1 -0
  196. package/dist/lib/mcp/share-status-tool.js +116 -0
  197. package/dist/lib/mcp/share-status-tool.js.map +1 -0
  198. package/dist/lib/mcp/share-tool.d.ts +18 -14
  199. package/dist/lib/mcp/share-tool.d.ts.map +1 -1
  200. package/dist/lib/mcp/share-tool.js +127 -21
  201. package/dist/lib/mcp/share-tool.js.map +1 -1
  202. package/dist/lib/model-cache.d.ts +10 -0
  203. package/dist/lib/model-cache.d.ts.map +1 -0
  204. package/dist/lib/model-cache.js +35 -0
  205. package/dist/lib/model-cache.js.map +1 -0
  206. package/dist/lib/next-step.d.ts.map +1 -1
  207. package/dist/lib/next-step.js +2 -1
  208. package/dist/lib/next-step.js.map +1 -1
  209. package/dist/lib/private-files.d.ts +33 -0
  210. package/dist/lib/private-files.d.ts.map +1 -0
  211. package/dist/lib/private-files.js +96 -0
  212. package/dist/lib/private-files.js.map +1 -0
  213. package/dist/lib/redaction-notice.d.ts +7 -0
  214. package/dist/lib/redaction-notice.d.ts.map +1 -0
  215. package/dist/lib/redaction-notice.js +32 -0
  216. package/dist/lib/redaction-notice.js.map +1 -0
  217. package/dist/lib/relink-estimate.d.ts +16 -0
  218. package/dist/lib/relink-estimate.d.ts.map +1 -0
  219. package/dist/lib/relink-estimate.js +30 -0
  220. package/dist/lib/relink-estimate.js.map +1 -0
  221. package/dist/lib/resolve-env.d.ts +15 -1
  222. package/dist/lib/resolve-env.d.ts.map +1 -1
  223. package/dist/lib/resolve-env.js +27 -7
  224. package/dist/lib/resolve-env.js.map +1 -1
  225. package/dist/lib/scope-defaults.d.ts.map +1 -1
  226. package/dist/lib/scope-defaults.js +2 -0
  227. package/dist/lib/scope-defaults.js.map +1 -1
  228. package/dist/lib/scope-real.d.ts +57 -0
  229. package/dist/lib/scope-real.d.ts.map +1 -1
  230. package/dist/lib/setup-route.d.ts +4 -2
  231. package/dist/lib/setup-route.d.ts.map +1 -1
  232. package/dist/lib/setup-route.js +12 -6
  233. package/dist/lib/setup-route.js.map +1 -1
  234. package/dist/lib/share/approval.d.ts +71 -0
  235. package/dist/lib/share/approval.d.ts.map +1 -0
  236. package/dist/lib/share/approval.js +139 -0
  237. package/dist/lib/share/approval.js.map +1 -0
  238. package/dist/lib/share/approve-link.d.ts +31 -0
  239. package/dist/lib/share/approve-link.d.ts.map +1 -0
  240. package/dist/lib/share/approve-link.js +46 -0
  241. package/dist/lib/share/approve-link.js.map +1 -0
  242. package/dist/lib/share/browser-flow.d.ts +85 -0
  243. package/dist/lib/share/browser-flow.d.ts.map +1 -0
  244. package/dist/lib/share/browser-flow.js +168 -0
  245. package/dist/lib/share/browser-flow.js.map +1 -0
  246. package/dist/lib/share/command.d.ts +34 -1
  247. package/dist/lib/share/command.d.ts.map +1 -1
  248. package/dist/lib/share/command.js +153 -11
  249. package/dist/lib/share/command.js.map +1 -1
  250. package/dist/lib/share/delivery-options.d.ts +15 -0
  251. package/dist/lib/share/delivery-options.d.ts.map +1 -0
  252. package/dist/lib/share/delivery-options.js +16 -0
  253. package/dist/lib/share/delivery-options.js.map +1 -0
  254. package/dist/lib/share/delivery.d.ts +83 -0
  255. package/dist/lib/share/delivery.d.ts.map +1 -0
  256. package/dist/lib/share/delivery.js +134 -0
  257. package/dist/lib/share/delivery.js.map +1 -0
  258. package/dist/lib/share/envelope.d.ts +61 -0
  259. package/dist/lib/share/envelope.d.ts.map +1 -0
  260. package/dist/lib/share/envelope.js +99 -0
  261. package/dist/lib/share/envelope.js.map +1 -0
  262. package/dist/lib/share/ledger.d.ts.map +1 -1
  263. package/dist/lib/share/ledger.js +3 -1
  264. package/dist/lib/share/ledger.js.map +1 -1
  265. package/dist/lib/share/payload.d.ts +9 -0
  266. package/dist/lib/share/payload.d.ts.map +1 -1
  267. package/dist/lib/share/payload.js +9 -0
  268. package/dist/lib/share/payload.js.map +1 -1
  269. package/dist/lib/share/pending.d.ts +47 -1
  270. package/dist/lib/share/pending.d.ts.map +1 -1
  271. package/dist/lib/share/pending.js +139 -13
  272. package/dist/lib/share/pending.js.map +1 -1
  273. package/dist/lib/share/preview.d.ts +5 -1
  274. package/dist/lib/share/preview.d.ts.map +1 -1
  275. package/dist/lib/share/preview.js +3 -1
  276. package/dist/lib/share/preview.js.map +1 -1
  277. package/dist/lib/share/qr.d.ts +13 -0
  278. package/dist/lib/share/qr.d.ts.map +1 -0
  279. package/dist/lib/share/qr.js +77 -0
  280. package/dist/lib/share/qr.js.map +1 -0
  281. package/dist/lib/share/requests-client.d.ts +63 -0
  282. package/dist/lib/share/requests-client.d.ts.map +1 -0
  283. package/dist/lib/share/requests-client.js +69 -0
  284. package/dist/lib/share/requests-client.js.map +1 -0
  285. package/dist/lib/share/run.d.ts +20 -1
  286. package/dist/lib/share/run.d.ts.map +1 -1
  287. package/dist/lib/share/run.js +27 -10
  288. package/dist/lib/share/run.js.map +1 -1
  289. package/dist/lib/share/secret-scan.d.ts +5 -0
  290. package/dist/lib/share/secret-scan.d.ts.map +1 -1
  291. package/dist/lib/share/secret-scan.js +43 -2
  292. package/dist/lib/share/secret-scan.js.map +1 -1
  293. package/dist/lib/share/target.d.ts +38 -0
  294. package/dist/lib/share/target.d.ts.map +1 -0
  295. package/dist/lib/share/target.js +80 -0
  296. package/dist/lib/share/target.js.map +1 -0
  297. package/dist/lib/share/tty.d.ts +8 -0
  298. package/dist/lib/share/tty.d.ts.map +1 -1
  299. package/dist/lib/share/tty.js +45 -0
  300. package/dist/lib/share/tty.js.map +1 -1
  301. package/dist/lib/source-sync-state.d.ts.map +1 -1
  302. package/dist/lib/source-sync-state.js +2 -0
  303. package/dist/lib/source-sync-state.js.map +1 -1
  304. package/dist/lib/sync/blocked.d.ts.map +1 -1
  305. package/dist/lib/sync/blocked.js +2 -1
  306. package/dist/lib/sync/blocked.js.map +1 -1
  307. package/dist/lib/sync/classify.d.ts.map +1 -1
  308. package/dist/lib/sync/classify.js +2 -0
  309. package/dist/lib/sync/classify.js.map +1 -1
  310. package/dist/lib/sync/real-env.d.ts +57 -0
  311. package/dist/lib/sync/real-env.d.ts.map +1 -1
  312. package/dist/lib/sync/sync-state.d.ts.map +1 -1
  313. package/dist/lib/sync/sync-state.js +3 -1
  314. package/dist/lib/sync/sync-state.js.map +1 -1
  315. package/dist/lib/usage-telemetry.d.ts +2 -2
  316. package/dist/lib/usage-telemetry.d.ts.map +1 -1
  317. package/dist/lib/usage-telemetry.js +21 -3
  318. package/dist/lib/usage-telemetry.js.map +1 -1
  319. package/package.json +4 -2
  320. package/dist/lib/personal-email-domains.d.ts +0 -8
  321. package/dist/lib/personal-email-domains.d.ts.map +0 -1
  322. package/dist/lib/personal-email-domains.js +0 -39
  323. package/dist/lib/personal-email-domains.js.map +0 -1
@@ -0,0 +1,175 @@
1
+ import { visible } from './share/visible.js';
2
+ import pkg from '../../package.json' with { type: 'json' };
3
+ /** The consent text version. The privacy page uses the same string: change both together. */
4
+ export const LEAD_CONSENT_VERSION = '2026-10-cli-share-1';
5
+ export const PRIVACY_URL = 'https://align.tech/privacy';
6
+ export const LEAD_CONSENT_LINE = `We will store it to email you about team plans. One confirmation email, unsubscribe any time. Details: ${PRIVACY_URL}.`;
7
+ export const LEAD_QUESTION_LINE = 'Want an email when your team can join Align, or to set up a call?';
8
+ export const LEAD_INPUT_PROMPT = 'Work email (press Enter to skip):';
9
+ const CAP_MS = 5000;
10
+ const MAX_RESPONSE_BYTES = 4096;
11
+ const sameUrl = (a, b) => a.trim().replace(/\/+$/, '').toLowerCase() === b.trim().replace(/\/+$/, '').toLowerCase();
12
+ const isSet = (v) => v !== undefined && v !== '';
13
+ /** Null means ask. Anything else is the one reason it must not. Pure, so the decision table is testable as one. */
14
+ export function leadPromptDecision(i) {
15
+ // A self-hosted or preview gateway is not Align's list: no prompt, no send, no flag, no network.
16
+ if (i.hostedGatewayUrl === '' || !sameUrl(i.gatewayUrl, i.hostedGatewayUrl))
17
+ return 'not-hosted';
18
+ if (i.hasTeamDestination)
19
+ return 'has-team-destination';
20
+ if (isSet(i.env['ALIGN_WRAPPED']))
21
+ return 'wrapped';
22
+ if (i.inCi)
23
+ return 'ci';
24
+ if (isSet(i.env['ALIGN_NO_LEAD_PROMPT']))
25
+ return 'suppressed';
26
+ if (!i.tty)
27
+ return 'not-a-terminal';
28
+ if (i.hasLogin)
29
+ return 'has-login';
30
+ if (i.state.shownAt !== undefined && i.state.version === LEAD_CONSENT_VERSION)
31
+ return 'already-asked';
32
+ return null;
33
+ }
34
+ // Zero-width, bidi, line and paragraph separators and exotic spaces, plus punctuation that never belongs in an address.
35
+ const FORBIDDEN = /[\s\u00a0\u1680\u180e\u2000-\u200f\u2028-\u202f\u205f-\u206f\u3000\ufeff,;:<>()[\]"\\]/u;
36
+ const hasControl = (s) => [...s].some((c) => { const n = c.codePointAt(0); return n < 0x20 || (n >= 0x7f && n <= 0x9f); });
37
+ /** The address to send, or null. Trims, lowercases the domain, and refuses anything the server would also refuse. */
38
+ export function normaliseEmail(raw) {
39
+ const s = raw.trim();
40
+ if (s.length === 0 || s.length > 254 || FORBIDDEN.test(s) || hasControl(s))
41
+ return null;
42
+ const parts = s.split('@');
43
+ if (parts.length !== 2)
44
+ return null;
45
+ const [local, domain] = parts;
46
+ if (local.length === 0 || local.length > 64)
47
+ return null;
48
+ if (!domain.includes('.') || domain.startsWith('.') || domain.endsWith('.') || domain.includes('..'))
49
+ return null;
50
+ return `${local}@${domain.toLowerCase()}`;
51
+ }
52
+ export function leadBody(email) {
53
+ const p = process.platform;
54
+ return {
55
+ email,
56
+ source: 'cli-share',
57
+ consent_version: LEAD_CONSENT_VERSION,
58
+ cli_version: pkg.version.slice(0, 32),
59
+ ...(p === 'darwin' || p === 'linux' || p === 'win32' ? { os: p } : {}),
60
+ };
61
+ }
62
+ /** One attempt. No retry, no redirect, a hard time cap and a size cap on what is read back. Never throws. */
63
+ export async function postLead(email, baseUrl, capMs = CAP_MS) {
64
+ const controller = new AbortController();
65
+ const timer = setTimeout(() => controller.abort(), capMs);
66
+ try {
67
+ const res = await fetch(`${baseUrl.trim().replace(/\/+$/, '')}/leads/team-interest`, {
68
+ method: 'POST',
69
+ headers: { 'Content-Type': 'application/json' },
70
+ body: JSON.stringify(leadBody(email)),
71
+ redirect: 'error',
72
+ signal: controller.signal,
73
+ });
74
+ // Read at most a few KB: the answer is tiny, and a server that streams forever must not hold the terminal.
75
+ const reader = res.body?.getReader();
76
+ let seen = 0;
77
+ while (reader) {
78
+ const { done, value } = await reader.read();
79
+ if (done)
80
+ break;
81
+ seen += value.byteLength;
82
+ if (seen > MAX_RESPONSE_BYTES) {
83
+ await reader.cancel();
84
+ break;
85
+ }
86
+ }
87
+ if (res.status === 202)
88
+ return { kind: 'accepted' };
89
+ if (res.status === 422)
90
+ return { kind: 'invalid' };
91
+ if (res.status === 429)
92
+ return { kind: 'rate-limited' };
93
+ // The server does not offer the route (an older gateway): permanent for this install, so not a retry.
94
+ if (res.status === 404 || res.status === 405)
95
+ return { kind: 'unavailable' };
96
+ return { kind: 'failed' };
97
+ }
98
+ catch {
99
+ return { kind: 'failed' };
100
+ }
101
+ finally {
102
+ clearTimeout(timer);
103
+ }
104
+ }
105
+ const DECLINES = /^(n|no|never|no thanks|no thank you)$/i;
106
+ /** Runs the whole prompt. Returns what happened, for tests. Never throws: a broken store costs the prompt, never the command. */
107
+ export async function maybeAskLead(d) {
108
+ try {
109
+ if (leadPromptDecision({ env: d.env, tty: d.tty, hasLogin: d.hasLogin, inCi: d.inCi, gatewayUrl: d.gatewayUrl, hostedGatewayUrl: d.hostedGatewayUrl, hasTeamDestination: d.hasTeamDestination, state: d.store.getLeadState() }) !== null)
110
+ return 'skipped-by-gate';
111
+ const shown = `${LEAD_QUESTION_LINE}\n${LEAD_CONSENT_LINE}`;
112
+ // Marked as soon as the person can see it, so Ctrl-C or end of input still counts as asked.
113
+ let line = await d.ask(shown, LEAD_INPUT_PROMPT, () => d.store.markLeadPromptShown(LEAD_CONSENT_VERSION));
114
+ if (line === null)
115
+ return 'no-terminal';
116
+ let email = normaliseEmail(line);
117
+ if (line.trim() !== '' && DECLINES.test(line.trim())) {
118
+ d.store.setLeadOutcome('declined');
119
+ return 'declined';
120
+ }
121
+ if (line.trim() !== '' && email === null) {
122
+ d.out('That does not look like an email address. Try once more, or press Enter to skip.');
123
+ line = (await d.ask('', LEAD_INPUT_PROMPT, () => undefined)) ?? '';
124
+ email = normaliseEmail(line);
125
+ }
126
+ if (email === null)
127
+ return 'skipped'; // Enter, Ctrl-C, end of input, or a second bad address: asked, and not again
128
+ const sent = await d.post(email);
129
+ if (sent.kind === 'accepted') {
130
+ d.store.setLeadOutcome('submitted');
131
+ d.out(`We sent a confirmation email to ${visible(email)}. Check your inbox.`);
132
+ return 'submitted';
133
+ }
134
+ if (sent.kind === 'invalid') {
135
+ d.out('The server did not accept that address, so nothing was saved.');
136
+ return 'skipped';
137
+ }
138
+ if (sent.kind === 'unavailable') {
139
+ // Permanent: keep the asked mark, or every share on this server would ask again and fail the same way.
140
+ d.out('Email sign-up is not available from this server yet. Nothing was sent.');
141
+ return 'skipped';
142
+ }
143
+ // A timeout or a 5xx may mean the server already took the address; a later share asking again is absorbed by
144
+ // the server's one-confirmation-per-24-hours rule, so the person gets no second email inside a day.
145
+ // Nothing reached the server's list: forget that we asked, so a later share can offer it again.
146
+ d.store.clearLeadPromptShown();
147
+ d.out(sent.kind === 'rate-limited' ? 'Too many requests just now. Nothing was sent. Try again later.' : 'Could not reach the server. Nothing was sent.');
148
+ return 'not-sent';
149
+ }
150
+ catch {
151
+ return 'skipped-by-gate';
152
+ }
153
+ }
154
+ /**
155
+ * What `align share` hands the run as its lead prompt. Two rules live here so a test can hold them:
156
+ * a saved team destination switches the prompt off, and the address is posted to Align's hosted gateway
157
+ * as Align spells it, never to whatever the run resolved (a self-host, or an environment override that merely
158
+ * matches after normalising).
159
+ */
160
+ export function leadPromptFor(w) {
161
+ return () => maybeAskLead({
162
+ store: w.store,
163
+ env: w.env,
164
+ hasLogin: false,
165
+ gatewayUrl: w.cloudGatewayUrl,
166
+ hostedGatewayUrl: w.hostedGatewayUrl,
167
+ hasTeamDestination: w.store.listTeamDestinationNames().length > 0,
168
+ inCi: w.inCi,
169
+ tty: w.tty,
170
+ ask: w.ask,
171
+ post: (email) => postLead(email, w.hostedGatewayUrl),
172
+ out: w.out,
173
+ });
174
+ }
175
+ //# sourceMappingURL=lead-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lead-prompt.js","sourceRoot":"","sources":["../../src/lib/lead-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Type a set of candidate edges with whichever local detector ALIGN_DETECTOR selects.
3
+ *
4
+ * v0 (ALIGN_DETECTOR=v0): the pairwise classifier, one call per candidate, stopping after a
5
+ * provider stop (ALI-692) - moved here verbatim from `checkAlignment` and `linkPass` so both
6
+ * callers share it.
7
+ * v1 (the default): one call over the whole set (local-set-classifier.ts). A candidate v1 judged as having no
8
+ * relationship comes back typed `relates` at its similarity, exactly what a judged, unrelated
9
+ * pair reads as to every caller today; a whole-call failure is reported on every candidate.
10
+ *
11
+ * `order` keeps v0's two orientations: `check` asks how the candidate relates to the proposed
12
+ * change (subject is A), capture asks how the new decision relates to the existing one (existing
13
+ * is A). v1 always puts the new/proposed side as the NEW DECISION.
14
+ */
15
+ import { type DetectorVersion } from '../detector/detector-version.js';
16
+ import { type ClassificationOutcome, classifyRelationship } from './local-relationship-classifier.js';
17
+ import { classifyCandidateSet, type SetCandidate, type SetSubject } from './local-set-classifier.js';
18
+ export interface CandidateClassification {
19
+ version: DetectorVersion;
20
+ outcomes: ClassificationOutcome[];
21
+ }
22
+ export declare function classifyCandidates(subject: SetSubject, candidates: readonly SetCandidate[], order: 'subject-first' | 'candidate-first', deps?: {
23
+ pair?: typeof classifyRelationship;
24
+ set?: typeof classifyCandidateSet;
25
+ }): Promise<CandidateClassification>;
26
+ //# sourceMappingURL=local-candidate-classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-candidate-classify.d.ts","sourceRoot":"","sources":["../../src/lib/local-candidate-classify.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,KAAK,qBAAqB,EAAE,oBAAoB,EAAyB,MAAM,oCAAoC,CAAC;AAC7H,OAAO,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAErG,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,KAAK,EAAE,eAAe,GAAG,iBAAiB,EAC1C,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,oBAAoB,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,oBAAoB,CAAA;CAAO,GACnF,OAAO,CAAC,uBAAuB,CAAC,CA+BlC"}
@@ -0,0 +1,53 @@
1
+ import { createConfigStore } from './config.js';
2
+ /**
3
+ * Type a set of candidate edges with whichever local detector ALIGN_DETECTOR selects.
4
+ *
5
+ * v0 (ALIGN_DETECTOR=v0): the pairwise classifier, one call per candidate, stopping after a
6
+ * provider stop (ALI-692) - moved here verbatim from `checkAlignment` and `linkPass` so both
7
+ * callers share it.
8
+ * v1 (the default): one call over the whole set (local-set-classifier.ts). A candidate v1 judged as having no
9
+ * relationship comes back typed `relates` at its similarity, exactly what a judged, unrelated
10
+ * pair reads as to every caller today; a whole-call failure is reported on every candidate.
11
+ *
12
+ * `order` keeps v0's two orientations: `check` asks how the candidate relates to the proposed
13
+ * change (subject is A), capture asks how the new decision relates to the existing one (existing
14
+ * is A). v1 always puts the new/proposed side as the NEW DECISION.
15
+ */
16
+ import { resolveDetectorVersion } from '../detector/detector-version.js';
17
+ import { classifyRelationship } from './local-relationship-classifier.js';
18
+ import { classifyCandidateSet } from './local-set-classifier.js';
19
+ export async function classifyCandidates(subject, candidates, order, deps = {}) {
20
+ const version = resolveDetectorVersion(process.env, createConfigStore().getDetector());
21
+ if (version === 'v1') {
22
+ if (!candidates.length)
23
+ return { version, outcomes: [] };
24
+ const result = await (deps.set ?? classifyCandidateSet)(subject, candidates);
25
+ if (!result.ok) {
26
+ const failed = { ok: false, reason: result.reason, ...(result.failure ? { failure: result.failure } : {}) };
27
+ return { version, outcomes: candidates.map(() => failed) };
28
+ }
29
+ return {
30
+ version,
31
+ outcomes: result.verdicts.map((v) => ({
32
+ ok: true,
33
+ relationship: { type: (v.relation ?? 'relates'), confidence: v.confidence, ...(v.reason ? { reason: v.reason } : {}) },
34
+ })),
35
+ };
36
+ }
37
+ const pair = deps.pair ?? classifyRelationship;
38
+ const outcomes = [];
39
+ let chainStopped = false;
40
+ for (const c of candidates) {
41
+ // ALI-692: a recorded chain stop is a property of the PROVIDER, not of this candidate, so
42
+ // asking again per candidate repeats one doomed call N times.
43
+ const lite = { title: c.title, summary: c.summary };
44
+ const outcome = chainStopped
45
+ ? { ok: false, reason: 'classifier_error' }
46
+ : await (order === 'subject-first' ? pair({ title: subject.title, summary: subject.summary }, lite) : pair(lite, { title: subject.title, summary: subject.summary }));
47
+ if (!outcome.ok && outcome.failure?.kind === 'provider_stopped')
48
+ chainStopped = true;
49
+ outcomes.push(outcome);
50
+ }
51
+ return { version, outcomes };
52
+ }
53
+ //# sourceMappingURL=local-candidate-classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-candidate-classify.js","sourceRoot":"","sources":["../../src/lib/local-candidate-classify.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,6 @@ export declare const SLACK_TOMBSTONE_TITLE = "This message was deleted.";
80
80
  */
81
81
  export declare function deleteDecisionWithDependents(db: DatabaseSync, id: string): void;
82
82
  /** The one downgrade guard: migrate() and every other writer of this file (the sync state, purge) call it. */
83
- export declare function assertSchemaSupported(version: number): void;
83
+ export declare function assertSchemaSupported(version: number, db?: DatabaseSync): void;
84
84
  export declare function migrate(db: DatabaseSync): void;
85
85
  //# sourceMappingURL=local-db-migrate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-db-migrate.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-migrate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,eAAO,MAAM,MAAM,oyCA+ClB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;4EAE4E;AAC5E,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAoBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED,8GAA8G;AAC9G,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAO3D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoS9C"}
1
+ {"version":3,"file":"local-db-migrate.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-migrate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,eAAO,MAAM,MAAM,oyCA+ClB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;4EAE4E;AAC5E,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAoBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED,8GAA8G;AAC9G,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAS9E;AAsBD,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmT9C"}
@@ -10,6 +10,7 @@ import { migrateV8 } from './local-db-v8.js';
10
10
  import { migrateV9 } from './local-db-v9.js';
11
11
  import { migrateV10, repairPromotions } from './local-db-v10.js';
12
12
  import { migrateV11 } from './local-db-v11.js';
13
+ import { hasDetectorVersion, migrateV12 } from './local-db-v12.js';
13
14
  export const SCHEMA = `
14
15
  CREATE TABLE IF NOT EXISTS decisions (
15
16
  id TEXT PRIMARY KEY,
@@ -161,13 +162,40 @@ export function deleteDecisionWithDependents(db, id) {
161
162
  db.prepare('DELETE FROM decisions WHERE id = ?').run(id);
162
163
  }
163
164
  /** The one downgrade guard: migrate() and every other writer of this file (the sync state, purge) call it. */
164
- export function assertSchemaSupported(version) {
165
+ export function assertSchemaSupported(version, db) {
166
+ // R4: an early-branch 12 that differs only by the additive column is not newer (see restampEarlyV12).
167
+ if (version === 12 && db !== undefined && hasDetectorVersion(db))
168
+ return;
165
169
  if (version > SCHEMA_VERSION) {
166
170
  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
171
  'Upgrade the CLI (npm install -g @aligndottech/cli@latest) before opening it.');
168
172
  }
169
173
  }
174
+ /**
175
+ * Re-review R4: an unreleased build of the detector branch (68cc596) stamped user_version 12 for
176
+ * the detector_version column, which is now an additive step. A 12 whose only difference is that
177
+ * column is put back to 11, inside a write lock, so this CLI and older ones open it. A 12 without
178
+ * the column came from somewhere else and is still refused. The day a real numbered step 12 lands,
179
+ * this must go, or it would hide that step.
180
+ */
181
+ function restampEarlyV12(db) {
182
+ if (db.prepare('PRAGMA user_version').get().user_version !== 12)
183
+ return;
184
+ db.exec('BEGIN IMMEDIATE');
185
+ try {
186
+ const current = db.prepare('PRAGMA user_version').get().user_version;
187
+ if (current === 12 && hasDetectorVersion(db))
188
+ db.exec('PRAGMA user_version = 11');
189
+ db.exec('COMMIT');
190
+ }
191
+ catch (err) {
192
+ if (db.isTransaction)
193
+ db.exec('ROLLBACK');
194
+ throw err;
195
+ }
196
+ }
170
197
  export function migrate(db) {
198
+ restampEarlyV12(db);
171
199
  const version = db.prepare('PRAGMA user_version').get().user_version;
172
200
  // A newer CLI migrated this file. Running this build's older code against the newer tables
173
201
  // (a v6 binary inserting rows without a source_key beside keyed ones) corrupts identity, so
@@ -477,6 +505,22 @@ export function migrate(db) {
477
505
  }
478
506
  // A graph an earlier build of this branch stamped v10 (see repairPromotions): runs on every open.
479
507
  repairPromotions(db);
508
+ // ADDITIVE steps (review F7): a change an older CLI can live with does not bump user_version,
509
+ // because every older CLI refuses a graph whose user_version is above what it knows. A column
510
+ // with a DEFAULT an older CLI's INSERTs fill correctly is additive; anything an older CLI would
511
+ // write wrongly, or misread, is not, and still takes a numbered step and the refusal.
512
+ if (!hasDetectorVersion(db)) {
513
+ db.exec('BEGIN IMMEDIATE');
514
+ try {
515
+ migrateV12(db); // re-checks the column inside the lock
516
+ db.exec('COMMIT');
517
+ }
518
+ catch (err) {
519
+ if (db.isTransaction)
520
+ db.exec('ROLLBACK');
521
+ throw err;
522
+ }
523
+ }
480
524
  if (version < SCHEMA_VERSION) {
481
525
  db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
482
526
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-db-migrate.js","sourceRoot":"","sources":["../../src/lib/local-db-migrate.ts"],"names":[],"mappings":"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"}
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,17 @@
1
+ /**
2
+ * `decision_links.detector_version` (shared detector P3): an ADDITIVE step, not a schema version.
3
+ *
4
+ * Every link that exists when this runs was written by the v0 classifier, the cosine pass, a
5
+ * ref match or a person's mark, so all of them read 'v0'. A link the v1 detector writes is
6
+ * stamped 'v1'. Nothing is re-typed here: relation and confidence are untouched, and the only
7
+ * path that re-types an existing link is the explicit `align local relink`.
8
+ *
9
+ * Review F7: it does NOT bump user_version. An older CLI (0.50.0 refuses anything above 11) keeps
10
+ * opening the graph, and its link INSERTs, which name no detector_version, get the DEFAULT 'v0',
11
+ * which is true of what they write. It runs on every open, in a write lock, only when the column
12
+ * is missing, and re-checks inside the lock so two openers cannot both ALTER.
13
+ */
14
+ import type { DatabaseSync } from 'node:sqlite';
15
+ export declare function hasDetectorVersion(db: DatabaseSync): boolean;
16
+ export declare function migrateV12(db: DatabaseSync): void;
17
+ //# sourceMappingURL=local-db-v12.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v12.d.ts","sourceRoot":"","sources":["../../src/lib/local-db-v12.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAE5D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEjD"}
@@ -0,0 +1,8 @@
1
+ export function hasDetectorVersion(db) {
2
+ return db.prepare('PRAGMA table_info(decision_links)').all().some((c) => c.name === 'detector_version');
3
+ }
4
+ export function migrateV12(db) {
5
+ if (!hasDetectorVersion(db))
6
+ db.exec(`ALTER TABLE decision_links ADD COLUMN detector_version TEXT NOT NULL DEFAULT 'v0'`);
7
+ }
8
+ //# sourceMappingURL=local-db-v12.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db-v12.js","sourceRoot":"","sources":["../../src/lib/local-db-v12.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,kBAAkB,CAAC,EAAgB;IACjD,OAAQ,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;AACvI,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAgB;IACzC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAAE,EAAE,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;AAC5H,CAAC"}
@@ -33,6 +33,15 @@ export interface AuditRow {
33
33
  detail: string | null;
34
34
  createdAt: string;
35
35
  }
36
+ /** A link to write. `detectorVersion` defaults to 'v0' (schema v12). */
37
+ export interface NewLink {
38
+ id?: string;
39
+ sourceId: string;
40
+ targetId: string;
41
+ relation: string;
42
+ confidence: number;
43
+ detectorVersion?: 'v0' | 'v1';
44
+ }
36
45
  export interface LinkRow {
37
46
  id: string;
38
47
  sourceId: string;
@@ -338,13 +347,7 @@ export declare function createLocalDb(dbPath: string): {
338
347
  * The unique index (created in migrate) is what makes the OR IGNORE real. Confidence is
339
348
  * refreshed rather than ignored so a better score replaces a worse one.
340
349
  */
341
- insertLink(link: {
342
- id?: string;
343
- sourceId: string;
344
- targetId: string;
345
- relation: string;
346
- confidence: number;
347
- }): void;
350
+ insertLink(link: NewLink): void;
348
351
  /**
349
352
  * LM: the ONE way a link is deleted on behalf of a person's mark. `align mark <a> replaces <b>`
350
353
  * writes its supersedes link under the id `mark:<judgement id>` (when the classifier had not
@@ -361,12 +364,7 @@ export declare function createLocalDb(dbPath: string): {
361
364
  * (either direction, any relation) before writing the new one, so capture-time
362
365
  * classification can upgrade a cosine `relates` edge into a typed one atomically.
363
366
  */
364
- replaceLink(link: {
365
- sourceId: string;
366
- targetId: string;
367
- relation: string;
368
- confidence: number;
369
- }): void;
367
+ replaceLink(link: Omit<NewLink, "id">): void;
370
368
  /**
371
369
  * ALI-792: what this decision's text points at (ticket keys, #N, tool URLs).
372
370
  * REPLACE semantics, deliberately: insertDecision refreshes the summary on
@@ -429,6 +427,8 @@ export declare function createLocalDb(dbPath: string): {
429
427
  decisionId?: string;
430
428
  createdBefore?: string;
431
429
  }): LinkRow[];
430
+ /** True when another stored decision supersedes this one: the v1 detector shows it RETIRED and refuses a verdict edge (review F5). */
431
+ isSuperseded(decisionId: string): boolean;
432
432
  getStats(): DbStats;
433
433
  dropAll(): void;
434
434
  /** Goes up whenever a decision is deleted or re-id'd or an embedding is deleted or replaced
@@ -1 +1 @@
1
- {"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;gEAE4D;IAC5D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;8CAE0C;IAC1C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;+EAC2E;IAC3E,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC;uFACmF;IACnF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0FAA0F;IAC1F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB;;;0FAGsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAclF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAetE;AAYD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM;IAoCxC;;;;;;;;;;;OAWG;IACH;;;;;;;;;;;OAWG;wBACiB;QAClB,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjG;;0DAEkD;QAClD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B;;yFAEiF;QACjF,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;QACjC;;wFAEgF;QAChF,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB;;kGAE0F;QAC1F,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,MAAM;IAiDV;;;;;;;;;;;;;;;;;;;;;;;OAuBG;8BACuB,MAAM,GAAG,IAAI,SAAS,MAAM,aAAa,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,IAAI;IAgB1G;;;;;OAKG;0BACmB,MAAM,SAAS,MAAM,WAAW,MAAM,mBAAiB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,IAAI,CAAA;KAAE;IA2BtI;gFAC4E;0BACtD,MAAM,GAAG,MAAM,GAAG,IAAI;IAW5C;;;;;OAKG;+BACwB,MAAM,GAAG,IAAI,SAAS,MAAM,YAAY,MAAM,UAAU,OAAO,GAAG,IAAI;IAUjG,iGAAiG;+BACtE,MAAM,GAAG,WAAW,GAAG,IAAI;IAQtD;;;;;;;;OAQG;2BACmB;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAQ,WAAW,EAAE;wBAgB7F,MAAM,GAAG,WAAW,GAAG,IAAI;IAM/C;;;;;;OAMG;qBACc,MAAM,cAAc,MAAM,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAU3E;;;;;;;;OAQG;sBACe,MAAM,eAAe,MAAM,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAU9E;;;;;OAKG;qBACc,MAAM,GAAG,IAAI;sBAIZ,MAAM,GAAG,MAAM,GAAG,IAAI;IAKxC;qFACiF;uBAC9D;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;0BAMxF,MAAM,GAAG,QAAQ,EAAE;IAOzC;;;;;;;;;;OAUG;wCACiC,MAAM,GAAG,IAAI,GAAG,IAAI;IASxD;2EACuE;iBAC1D,MAAM,EAAE;IAKrB;;;6EAGyE;2BAClD,MAAM,GAAG,MAAM;IAKtC;;;;;;;+BAO2B;yBACN,MAAM,GAAG,OAAO;IAUrC;;;;;;;;;;;;OAYG;6BACsB,MAAM,aAAa,YAAY,UAAU,MAAM,GAAG,IAAI;6BAStD,MAAM,GAAG,YAAY,GAAG,IAAI;IAQrD;;+FAE2F;kCAC7D,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpD;;;;;;;;;;;;;;;;;;;OAmBG;IACH;;;;;;;;;;;;;;OAcG;8BACsB;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAQ,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,YAAY,CAAA;KAAE,CAAC;IA2B/K;;;;;;;;;OASG;qBACc;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIjH;;;;;;OAMG;gCACyB,MAAM,GAAG,MAAM;IAI3C;;;;;;;OAOG;sBACe;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAUrG;;;;;;OAMG;4BACqB,MAAM,QAAQ,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;wBAmBjE,MAAM,GAAG,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAMrE;;;;OAIG;kBACW,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAM1E;;;;;;;;;;;;;;;;;;;;OAoBG;+BACwB,MAAM,cAAc,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAa9F;;;;;;OAMG;uBACgB;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,EAAE;gBASrF,OAAO;eAQR,IAAI;IAQf;;gDAE4C;mBAC7B,MAAM;IAIrB;;6DAEyD;mBAC1C,MAAM;IAIrB;kFAC8E;uBAC3D,MAAM;aAIhB,IAAI;EAKhB;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"local-db.d.ts","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { DatabaseSync } from 'node:sqlite';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { mkdirSync } from 'node:fs';
4
- import { dirname } from 'node:path';
4
+ import { dirname, resolve } from 'node:path';
5
5
  import { deleteDecisionWithDependents, migrate, SCHEMA, SLACK_TOMBSTONE_TITLE } from './local-db-migrate.js';
6
6
  import { bumpRowSetEpoch, rowSetEpoch } from './local-db-epoch.js';
7
7
  import { foldKeylessTwin } from './local-db-v7.js';
8
8
  import { discussionStart } from './github-text.js';
9
9
  import { connectorItemKey, KEYED_PLATFORMS } from './source-key.js';
10
+ import { alignConfigDir, ensurePrivateDir, precreatePrivateFile, tightenGraphFiles } from './private-files.js';
10
11
  export { SCHEMA_VERSION } from './local-db-migrate.js';
11
12
  /**
12
13
  * ALI-829: a source timestamp as this database stores it - ISO-8601 Z - or null.
@@ -92,8 +93,19 @@ export function createLocalDb(dbPath) {
92
93
  // database file". Create the directory first. ':memory:' has no parent.
93
94
  //
94
95
  // Still true after the move off better-sqlite3: node:sqlite does not mkdir either.
96
+ //
97
+ // The directory is created 0700 and the file 0600 before SQLite opens it (whose own default for a
98
+ // new file is 0644). The file is tightened on every open, and so is the folder when it is align's own
99
+ // config folder (private-files.ts). SQLite gives the
100
+ // -wal and -shm it creates the main file's mode, so they follow it.
95
101
  if (dbPath !== ':memory:') {
96
- mkdirSync(dirname(dbPath), { recursive: true });
102
+ const dir = dirname(dbPath);
103
+ // Throws the real reason (ENOTDIR, EACCES) rather than SQLite's "unable to open database file".
104
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
105
+ if (resolve(dir) === resolve(alignConfigDir()))
106
+ ensurePrivateDir(dir);
107
+ precreatePrivateFile(dbPath);
108
+ tightenGraphFiles(dbPath);
97
109
  }
98
110
  const db = new DatabaseSync(dbPath);
99
111
  // 30s: the longest measured v7 migration (100k rows, 33k merges) takes about 5s, so a waiting
@@ -112,10 +124,13 @@ export function createLocalDb(dbPath) {
112
124
  }
113
125
  // Shared by insertLink and resolveRefs (ALI-796), so there is one writer of the
114
126
  // decision_links insert rather than two copies of the same ON CONFLICT clause.
127
+ // `detectorVersion` (schema v12): which detector wrote the edge. Omitted means 'v0'; only the
128
+ // v1 detector passes 'v1'. A conflict on the triple keeps the stored version: same relation,
129
+ // nothing re-typed.
115
130
  function insertLinkRow(link) {
116
- db.prepare(`INSERT INTO decision_links (id, source_id, target_id, relation, confidence) VALUES (?, ?, ?, ?, ?)
131
+ db.prepare(`INSERT INTO decision_links (id, source_id, target_id, relation, confidence, detector_version) VALUES (?, ?, ?, ?, ?, ?)
117
132
  ON CONFLICT(source_id, target_id, relation)
118
- DO UPDATE SET confidence = MAX(confidence, excluded.confidence)`).run(link.id ?? randomUUID(), link.sourceId, link.targetId, link.relation, link.confidence);
133
+ DO UPDATE SET confidence = MAX(confidence, excluded.confidence)`).run(link.id ?? randomUUID(), link.sourceId, link.targetId, link.relation, link.confidence, link.detectorVersion ?? 'v0');
119
134
  }
120
135
  let dataVersionStmt;
121
136
  const api = {
@@ -551,8 +566,23 @@ export function createLocalDb(dbPath) {
551
566
  // LM: an edge a person's `align mark ... replaces` wrote (id `mark:<judgement id>`) is theirs, not
552
567
  // the classifier's to upgrade away: deleting it would orphan the judgement, and `--undo` could
553
568
  // no longer find its link. The pair may then carry that edge beside the new one.
554
- db.prepare(`DELETE FROM decision_links WHERE ((source_id = ? AND target_id = ?) OR (source_id = ? AND target_id = ?)) AND id NOT LIKE 'mark:%'`).run(link.sourceId, link.targetId, link.targetId, link.sourceId);
555
- insertLinkRow(link);
569
+ // One unit (review F8): a failure after the delete must not leave the pair unlinked. A
570
+ // SAVEPOINT, not BEGIN, so a caller already inside a transaction can still call this.
571
+ db.exec('SAVEPOINT replace_link');
572
+ try {
573
+ // Review F1: a `replaces` mark written over an existing classifier row keeps that row's id,
574
+ // so the judgement itself is what protects it, not only the `mark:` id.
575
+ db.prepare(`DELETE FROM decision_links WHERE ((source_id = ? AND target_id = ?) OR (source_id = ? AND target_id = ?)) AND id NOT LIKE 'mark:%'
576
+ AND NOT (relation = 'supersedes' AND EXISTS (SELECT 1 FROM local_judgements j
577
+ WHERE j.kind = 'supersede' AND j.decision_id = decision_links.source_id AND j.counterpart_id = decision_links.target_id))`).run(link.sourceId, link.targetId, link.targetId, link.sourceId);
578
+ insertLinkRow(link);
579
+ db.exec('RELEASE replace_link');
580
+ }
581
+ catch (err) {
582
+ db.exec('ROLLBACK TO replace_link');
583
+ db.exec('RELEASE replace_link');
584
+ throw err;
585
+ }
556
586
  },
557
587
  /**
558
588
  * ALI-792: what this decision's text points at (ticket keys, #N, tool URLs).
@@ -647,6 +677,11 @@ export function createLocalDb(dbPath) {
647
677
  }
648
678
  return db.prepare(sql).all(...params);
649
679
  },
680
+ /** True when another stored decision supersedes this one: the v1 detector shows it RETIRED and refuses a verdict edge (review F5). */
681
+ isSuperseded(decisionId) {
682
+ return db.prepare(`SELECT 1 FROM decision_links l JOIN decisions s ON s.id = l.source_id
683
+ WHERE l.target_id = ? AND l.relation IN ('supersedes', 'partially_supersedes') LIMIT 1`).get(decisionId) !== undefined;
684
+ },
650
685
  getStats() {
651
686
  const decisions = db.prepare(`SELECT COUNT(*) as n FROM decisions`).get().n;
652
687
  const embeddings = db.prepare(`SELECT COUNT(*) as n FROM decision_embeddings`).get().n;