limn-review 0.1.123

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 (474) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +133 -0
  3. package/dist/ai/runtime.js +535 -0
  4. package/dist/api/plugins/auth.js +169 -0
  5. package/dist/api/plugins/error-handler.js +114 -0
  6. package/dist/api/plugins/rate-limit.js +855 -0
  7. package/dist/api/plugins/security.js +321 -0
  8. package/dist/api/routes/activity.js +103 -0
  9. package/dist/api/routes/ai-runtime.js +67 -0
  10. package/dist/api/routes/auth.js +194 -0
  11. package/dist/api/routes/billing.js +209 -0
  12. package/dist/api/routes/bot-triage.js +1289 -0
  13. package/dist/api/routes/conflicts.js +730 -0
  14. package/dist/api/routes/contact.js +318 -0
  15. package/dist/api/routes/daily-brief.js +58 -0
  16. package/dist/api/routes/flow.js +71 -0
  17. package/dist/api/routes/health.js +7 -0
  18. package/dist/api/routes/insights.js +200 -0
  19. package/dist/api/routes/me.js +458 -0
  20. package/dist/api/routes/mentions.js +22 -0
  21. package/dist/api/routes/mergers.js +8 -0
  22. package/dist/api/routes/ml-labels.js +109 -0
  23. package/dist/api/routes/open-prs.js +35 -0
  24. package/dist/api/routes/prs.js +1633 -0
  25. package/dist/api/routes/reactions.js +217 -0
  26. package/dist/api/routes/repos.js +563 -0
  27. package/dist/api/routes/search.js +41 -0
  28. package/dist/api/routes/threads.js +118 -0
  29. package/dist/api/routes/timeline.js +150 -0
  30. package/dist/api/routes/users.js +67 -0
  31. package/dist/api/routes/webhooks.js +181 -0
  32. package/dist/api/routes/workspaces.js +322 -0
  33. package/dist/app.js +274 -0
  34. package/dist/ascii.js +19 -0
  35. package/dist/auth/account.js +482 -0
  36. package/dist/auth/crypto.js +46 -0
  37. package/dist/bot-triage/resolve.js +59 -0
  38. package/dist/cli.js +388 -0
  39. package/dist/coding/activity.js +80 -0
  40. package/dist/coding/agent.js +288 -0
  41. package/dist/coding/ai-fix/auto-fix.js +212 -0
  42. package/dist/coding/ai-fix/manager.js +370 -0
  43. package/dist/coding/ai-fix/persist.js +213 -0
  44. package/dist/coding/ai-fix/pr-context.js +58 -0
  45. package/dist/coding/ai-fix/prompts.js +138 -0
  46. package/dist/coding/ai-fix/review-seed.js +357 -0
  47. package/dist/coding/ai-fix/routes.js +425 -0
  48. package/dist/coding/git-ops.js +321 -0
  49. package/dist/coding/git.js +184 -0
  50. package/dist/coding/merge.js +262 -0
  51. package/dist/coding/safe-path.js +75 -0
  52. package/dist/coding/schema.js +43 -0
  53. package/dist/config.js +648 -0
  54. package/dist/conflict/diff.js +304 -0
  55. package/dist/conflict/git.js +118 -0
  56. package/dist/conflict/hash.js +73 -0
  57. package/dist/conflict/janitor.js +218 -0
  58. package/dist/conflict/land.js +675 -0
  59. package/dist/conflict/model-types.js +2 -0
  60. package/dist/conflict/model.js +1081 -0
  61. package/dist/conflict/parse.js +142 -0
  62. package/dist/conflict/seam.js +136 -0
  63. package/dist/conflict/session.js +532 -0
  64. package/dist/conflict/suggestion.js +398 -0
  65. package/dist/conflict/tokens.js +72 -0
  66. package/dist/data-dir.js +112 -0
  67. package/dist/db/actor-lanes.js +213 -0
  68. package/dist/db/automation-ids.js +97 -0
  69. package/dist/db/automation-output.js +349 -0
  70. package/dist/db/blast-radius-query.js +36 -0
  71. package/dist/db/blast-radius.js +226 -0
  72. package/dist/db/bot-dormancy.js +115 -0
  73. package/dist/db/bot-overlap.js +579 -0
  74. package/dist/db/bot-volume.js +722 -0
  75. package/dist/db/bot-window.js +35 -0
  76. package/dist/db/branch-queries.js +310 -0
  77. package/dist/db/change-shape.js +243 -0
  78. package/dist/db/changepoint.js +75 -0
  79. package/dist/db/cleanup.js +36 -0
  80. package/dist/db/client.js +102 -0
  81. package/dist/db/code-loc.js +388 -0
  82. package/dist/db/credits.js +79 -0
  83. package/dist/db/daily-brief.js +406 -0
  84. package/dist/db/dependency-cards.js +145 -0
  85. package/dist/db/erase-account.js +255 -0
  86. package/dist/db/export-account.js +189 -0
  87. package/dist/db/failing-checks.js +124 -0
  88. package/dist/db/file-coupling.js +197 -0
  89. package/dist/db/flow-detail.js +661 -0
  90. package/dist/db/flow-pointers.js +197 -0
  91. package/dist/db/flow-settings.js +67 -0
  92. package/dist/db/forecast.js +114 -0
  93. package/dist/db/line-overlap.js +81 -0
  94. package/dist/db/merge-queue.js +189 -0
  95. package/dist/db/migrate.js +17 -0
  96. package/dist/db/migrations/0000_purple_ben_grimm.sql +155 -0
  97. package/dist/db/migrations/0001_colorful_ozymandias.sql +31 -0
  98. package/dist/db/migrations/0002_famous_sersi.sql +9 -0
  99. package/dist/db/migrations/0003_clever_shinobi_shaw.sql +3 -0
  100. package/dist/db/migrations/0004_pale_scalphunter.sql +1 -0
  101. package/dist/db/migrations/0005_daffy_guardian.sql +2 -0
  102. package/dist/db/migrations/0006_cute_violations.sql +45 -0
  103. package/dist/db/migrations/0007_dark_anthem.sql +2 -0
  104. package/dist/db/migrations/0008_multitenant_accounts.sql +44 -0
  105. package/dist/db/migrations/0009_lean_bodies.sql +13 -0
  106. package/dist/db/migrations/0010_lean_bodies_nullable.sql +56 -0
  107. package/dist/db/migrations/0011_pr_diff_size.sql +10 -0
  108. package/dist/db/migrations/0012_findings_included_default.sql +7 -0
  109. package/dist/db/migrations/0013_review_routing.sql +9 -0
  110. package/dist/db/migrations/0014_account_last_active.sql +6 -0
  111. package/dist/db/migrations/0015_repos_inbox_watch.sql +9 -0
  112. package/dist/db/migrations/0016_repo_viewer_permission.sql +7 -0
  113. package/dist/db/migrations/0017_account_display_name.sql +7 -0
  114. package/dist/db/migrations/0018_finding_comment_kind.sql +7 -0
  115. package/dist/db/migrations/0019_finding_file_in_diff.sql +7 -0
  116. package/dist/db/migrations/0020_claude_review_cost_telemetry.sql +11 -0
  117. package/dist/db/migrations/0021_account_feed_last_seen.sql +7 -0
  118. package/dist/db/migrations/0022_ci_status_events.sql +21 -0
  119. package/dist/db/migrations/0023_ai_usage.sql +21 -0
  120. package/dist/db/migrations/0024_pr_head_ref_name.sql +6 -0
  121. package/dist/db/migrations/0025_account_billing.sql +7 -0
  122. package/dist/db/migrations/0026_ai_credit_allowance.sql +5 -0
  123. package/dist/db/migrations/0027_user_github_type.sql +6 -0
  124. package/dist/db/migrations/0028_bot_review_classification.sql +21 -0
  125. package/dist/db/migrations/0029_bot_mute_rules.sql +19 -0
  126. package/dist/db/migrations/0030_teams.sql +32 -0
  127. package/dist/db/migrations/0031_events_pr_idx.sql +7 -0
  128. package/dist/db/migrations/0032_benchmark_contributions.sql +29 -0
  129. package/dist/db/migrations/0033_thread_addressed_confidence.sql +9 -0
  130. package/dist/db/migrations/0034_thread_resolved_at.sql +6 -0
  131. package/dist/db/migrations/0035_pr_first_review_requested_at.sql +5 -0
  132. package/dist/db/migrations/0036_search_index.sql +25 -0
  133. package/dist/db/migrations/0037_author_indexes.sql +15 -0
  134. package/dist/db/migrations/0038_auto_merge_requests.sql +37 -0
  135. package/dist/db/migrations/0039_branch_status.sql +44 -0
  136. package/dist/db/migrations/0040_pr_review_decision.sql +10 -0
  137. package/dist/db/migrations/0041_branch_commit_detail.sql +38 -0
  138. package/dist/db/migrations/0042_repo_reviewers.sql +176 -0
  139. package/dist/db/migrations/0043_account_reviewers.sql +131 -0
  140. package/dist/db/migrations/0044_workspaces.sql +138 -0
  141. package/dist/db/migrations/0045_workspace_reviewers.sql +180 -0
  142. package/dist/db/migrations/0046_drop_inbox_watch.sql +25 -0
  143. package/dist/db/migrations/0047_ml_comment_labels.sql +40 -0
  144. package/dist/db/migrations/0048_ml_vendor_severity.sql +31 -0
  145. package/dist/db/migrations/0049_seat_pricing_repo_description.sql +21 -0
  146. package/dist/db/migrations/0050_users_app_slug.sql +12 -0
  147. package/dist/db/migrations/0051_auto_merge_queue.sql +17 -0
  148. package/dist/db/migrations/0052_trunk_ci_status_events.sql +43 -0
  149. package/dist/db/migrations/0053_automation_roles.sql +79 -0
  150. package/dist/db/migrations/0054_automation_vendor_kinds.sql +514 -0
  151. package/dist/db/migrations/0055_auto_merge_phase.sql +12 -0
  152. package/dist/db/migrations/0056_pr_mentions.sql +22 -0
  153. package/dist/db/migrations/0057_large_pr_threshold.sql +14 -0
  154. package/dist/db/migrations/0058_pending_mute.sql +53 -0
  155. package/dist/db/migrations/0059_merge_queue_state.sql +33 -0
  156. package/dist/db/migrations/0060_drop_my_turn_dismissals.sql +33 -0
  157. package/dist/db/migrations/0061_auto_merge_durable_anchors.sql +27 -0
  158. package/dist/db/migrations/0062_blast_radius_config.sql +21 -0
  159. package/dist/db/migrations/0063_repo_file_coupling.sql +33 -0
  160. package/dist/db/migrations/0064_pr_content_kind.sql +21 -0
  161. package/dist/db/migrations/0065_workspace_flow_settings.sql +13 -0
  162. package/dist/db/migrations/0066_review_request_events.sql +31 -0
  163. package/dist/db/migrations/0067_pr_security_signals.sql +86 -0
  164. package/dist/db/migrations/0068_my_turn_settings.sql +18 -0
  165. package/dist/db/migrations/0069_my_turn_dismissals.sql +41 -0
  166. package/dist/db/migrations/0070_claude_review_follow_up_ticket.sql +22 -0
  167. package/dist/db/migrations/0071_claude_review_trigger.sql +11 -0
  168. package/dist/db/migrations/0072_commit_message_headline.sql +13 -0
  169. package/dist/db/migrations/0073_claude_review_chat.sql +31 -0
  170. package/dist/db/migrations/0074_adopt_agentic_tables.sql +98 -0
  171. package/dist/db/migrations/0075_review_lens_drop_learnings.sql +15 -0
  172. package/dist/db/migrations/0076_claude_review_threads.sql +17 -0
  173. package/dist/db/migrations/0077_claude_review_ci_failures.sql +10 -0
  174. package/dist/db/migrations/0078_ai_fix_change_report.sql +17 -0
  175. package/dist/db/migrations/0079_claude_finding_story.sql +16 -0
  176. package/dist/db/migrations/meta/0000_snapshot.json +1116 -0
  177. package/dist/db/migrations/meta/0001_snapshot.json +1321 -0
  178. package/dist/db/migrations/meta/0002_snapshot.json +1375 -0
  179. package/dist/db/migrations/meta/0003_snapshot.json +1396 -0
  180. package/dist/db/migrations/meta/0004_snapshot.json +1416 -0
  181. package/dist/db/migrations/meta/0005_snapshot.json +1430 -0
  182. package/dist/db/migrations/meta/0006_snapshot.json +1745 -0
  183. package/dist/db/migrations/meta/0007_snapshot.json +1759 -0
  184. package/dist/db/migrations/meta/_journal.json +566 -0
  185. package/dist/db/migrations-pg/0000_tired_alex_power.sql +268 -0
  186. package/dist/db/migrations-pg/0001_dizzy_mockingbird.sql +3 -0
  187. package/dist/db/migrations-pg/0002_glorious_ikaris.sql +4 -0
  188. package/dist/db/migrations-pg/0003_melted_secret_warriors.sql +2 -0
  189. package/dist/db/migrations-pg/0004_numerous_triton.sql +1 -0
  190. package/dist/db/migrations-pg/0005_thick_blockbuster.sql +2 -0
  191. package/dist/db/migrations-pg/0006_majestic_dracula.sql +1 -0
  192. package/dist/db/migrations-pg/0007_same_human_torch.sql +2 -0
  193. package/dist/db/migrations-pg/0008_slimy_toxin.sql +1 -0
  194. package/dist/db/migrations-pg/0009_fuzzy_jubilee.sql +4 -0
  195. package/dist/db/migrations-pg/0010_late_hammerhead.sql +1 -0
  196. package/dist/db/migrations-pg/0011_happy_leech.sql +16 -0
  197. package/dist/db/migrations-pg/0012_woozy_captain_midlands.sql +16 -0
  198. package/dist/db/migrations-pg/0013_yielding_nicolaos.sql +1 -0
  199. package/dist/db/migrations-pg/0014_wakeful_bill_hollister.sql +2 -0
  200. package/dist/db/migrations-pg/0015_aspiring_black_tom.sql +1 -0
  201. package/dist/db/migrations-pg/0016_cute_ghost_rider.sql +30 -0
  202. package/dist/db/migrations-pg/0017_far_changeling.sql +24 -0
  203. package/dist/db/migrations-pg/0018_fancy_miss_america.sql +1 -0
  204. package/dist/db/migrations-pg/0019_benchmark_contributions.sql +22 -0
  205. package/dist/db/migrations-pg/0020_majestic_edwin_jarvis.sql +3 -0
  206. package/dist/db/migrations-pg/0021_green_salo.sql +1 -0
  207. package/dist/db/migrations-pg/0022_wise_baron_strucker.sql +1 -0
  208. package/dist/db/migrations-pg/0023_search_index.sql +19 -0
  209. package/dist/db/migrations-pg/0024_author_indexes.sql +9 -0
  210. package/dist/db/migrations-pg/0025_auto_merge_requests.sql +26 -0
  211. package/dist/db/migrations-pg/0026_branch_status.sql +32 -0
  212. package/dist/db/migrations-pg/0027_pr_review_decision.sql +5 -0
  213. package/dist/db/migrations-pg/0028_branch_commit_detail.sql +9 -0
  214. package/dist/db/migrations-pg/0029_repo_reviewers.sql +127 -0
  215. package/dist/db/migrations-pg/0030_account_reviewers.sql +77 -0
  216. package/dist/db/migrations-pg/0031_workspaces.sql +131 -0
  217. package/dist/db/migrations-pg/0032_workspace_reviewers.sql +165 -0
  218. package/dist/db/migrations-pg/0033_drop_inbox_watch.sql +14 -0
  219. package/dist/db/migrations-pg/0034_ml_comment_labels.sql +33 -0
  220. package/dist/db/migrations-pg/0035_ml_vendor_severity.sql +16 -0
  221. package/dist/db/migrations-pg/0036_seat_pricing_repo_description.sql +12 -0
  222. package/dist/db/migrations-pg/0037_users_app_slug.sql +9 -0
  223. package/dist/db/migrations-pg/0038_auto_merge_queue.sql +10 -0
  224. package/dist/db/migrations-pg/0039_trunk_ci_status_events.sql +27 -0
  225. package/dist/db/migrations-pg/0040_automation_roles.sql +63 -0
  226. package/dist/db/migrations-pg/0041_automation_vendor_kinds.sql +488 -0
  227. package/dist/db/migrations-pg/0042_auto_merge_phase.sql +8 -0
  228. package/dist/db/migrations-pg/0043_pr_mentions.sql +19 -0
  229. package/dist/db/migrations-pg/0044_large_pr_threshold.sql +6 -0
  230. package/dist/db/migrations-pg/0045_pending_mute.sql +26 -0
  231. package/dist/db/migrations-pg/0046_merge_queue_state.sql +18 -0
  232. package/dist/db/migrations-pg/0047_drop_my_turn_dismissals.sql +21 -0
  233. package/dist/db/migrations-pg/0048_auto_merge_durable_anchors.sql +27 -0
  234. package/dist/db/migrations-pg/0049_blast_radius_config.sql +8 -0
  235. package/dist/db/migrations-pg/0050_repo_file_coupling.sql +13 -0
  236. package/dist/db/migrations-pg/0051_pr_content_kind.sql +6 -0
  237. package/dist/db/migrations-pg/0052_workspace_flow_settings.sql +4 -0
  238. package/dist/db/migrations-pg/0053_review_request_events.sql +18 -0
  239. package/dist/db/migrations-pg/0054_pr_security_signals.sql +59 -0
  240. package/dist/db/migrations-pg/0055_my_turn_settings.sql +6 -0
  241. package/dist/db/migrations-pg/0056_my_turn_dismissals.sql +21 -0
  242. package/dist/db/migrations-pg/0057_claude_review_follow_up_ticket.sql +8 -0
  243. package/dist/db/migrations-pg/0058_claude_review_trigger.sql +4 -0
  244. package/dist/db/migrations-pg/0059_commit_message_headline.sql +3 -0
  245. package/dist/db/migrations-pg/0060_claude_review_chat.sql +24 -0
  246. package/dist/db/migrations-pg/0061_adopt_agentic_tables.sql +79 -0
  247. package/dist/db/migrations-pg/0062_review_lens_drop_learnings.sql +5 -0
  248. package/dist/db/migrations-pg/0063_claude_review_threads.sql +7 -0
  249. package/dist/db/migrations-pg/0064_claude_review_ci_failures.sql +4 -0
  250. package/dist/db/migrations-pg/0065_ai_fix_change_report.sql +9 -0
  251. package/dist/db/migrations-pg/0066_claude_finding_story.sql +7 -0
  252. package/dist/db/migrations-pg/meta/0000_snapshot.json +2137 -0
  253. package/dist/db/migrations-pg/meta/0001_snapshot.json +2143 -0
  254. package/dist/db/migrations-pg/meta/0002_snapshot.json +2170 -0
  255. package/dist/db/migrations-pg/meta/0003_snapshot.json +2182 -0
  256. package/dist/db/migrations-pg/meta/0004_snapshot.json +2188 -0
  257. package/dist/db/migrations-pg/meta/0005_snapshot.json +2201 -0
  258. package/dist/db/migrations-pg/meta/0006_snapshot.json +2207 -0
  259. package/dist/db/migrations-pg/meta/0007_snapshot.json +2219 -0
  260. package/dist/db/migrations-pg/meta/0008_snapshot.json +2226 -0
  261. package/dist/db/migrations-pg/meta/0009_snapshot.json +2250 -0
  262. package/dist/db/migrations-pg/meta/0010_snapshot.json +2256 -0
  263. package/dist/db/migrations-pg/meta/0011_snapshot.json +2412 -0
  264. package/dist/db/migrations-pg/meta/0012_snapshot.json +2528 -0
  265. package/dist/db/migrations-pg/meta/0013_snapshot.json +2534 -0
  266. package/dist/db/migrations-pg/meta/0014_snapshot.json +2547 -0
  267. package/dist/db/migrations-pg/meta/0015_snapshot.json +2553 -0
  268. package/dist/db/migrations-pg/meta/0016_snapshot.json +2774 -0
  269. package/dist/db/migrations-pg/meta/0017_snapshot.json +2999 -0
  270. package/dist/db/migrations-pg/meta/0018_snapshot.json +3020 -0
  271. package/dist/db/migrations-pg/meta/0020_snapshot.json +3228 -0
  272. package/dist/db/migrations-pg/meta/0021_snapshot.json +3234 -0
  273. package/dist/db/migrations-pg/meta/0022_snapshot.json +3240 -0
  274. package/dist/db/migrations-pg/meta/_journal.json +475 -0
  275. package/dist/db/ml-labels.js +1666 -0
  276. package/dist/db/my-turn-dismissals.js +343 -0
  277. package/dist/db/my-turn-settings.js +34 -0
  278. package/dist/db/pending-classify.js +46 -0
  279. package/dist/db/pending-mute.js +171 -0
  280. package/dist/db/pending-tabs.js +238 -0
  281. package/dist/db/period-metrics.js +820 -0
  282. package/dist/db/person-period.js +763 -0
  283. package/dist/db/pr-intervals.js +930 -0
  284. package/dist/db/pr-liveness.js +240 -0
  285. package/dist/db/pr-mentions.js +279 -0
  286. package/dist/db/pr-merge-queue-stamp.js +91 -0
  287. package/dist/db/queries.js +14631 -0
  288. package/dist/db/reaction-targets.js +94 -0
  289. package/dist/db/repo-activity.js +171 -0
  290. package/dist/db/retention.js +138 -0
  291. package/dist/db/review-threads-for-review.js +240 -0
  292. package/dist/db/run-migrations.js +24 -0
  293. package/dist/db/schema.pg.js +1220 -0
  294. package/dist/db/schema.sqlite.js +1801 -0
  295. package/dist/db/search.js +317 -0
  296. package/dist/db/security-alerts.js +218 -0
  297. package/dist/db/synthesis-input.js +565 -0
  298. package/dist/db/triage.js +320 -0
  299. package/dist/db/usage.js +63 -0
  300. package/dist/db/work-plan.js +1086 -0
  301. package/dist/db/working-hours.js +161 -0
  302. package/dist/feed/my-turn.js +122 -0
  303. package/dist/github/actions-logs.js +397 -0
  304. package/dist/github/auth.js +86 -0
  305. package/dist/github/branch-queries.js +229 -0
  306. package/dist/github/client.js +454 -0
  307. package/dist/github/codeowners.js +221 -0
  308. package/dist/github/commit-checks.js +105 -0
  309. package/dist/github/compare.js +110 -0
  310. package/dist/github/diff-anchor.js +227 -0
  311. package/dist/github/mutations.js +706 -0
  312. package/dist/github/pr-file-content.js +254 -0
  313. package/dist/github/pr-liveness.js +161 -0
  314. package/dist/github/queries.js +875 -0
  315. package/dist/github/rate-budget.js +129 -0
  316. package/dist/github/reactions.js +161 -0
  317. package/dist/github/reviewer-suggest.js +104 -0
  318. package/dist/github/team-reviewers.js +96 -0
  319. package/dist/index.js +184 -0
  320. package/dist/merge/auto-merge-runner.js +960 -0
  321. package/dist/ml/severity-client.js +218 -0
  322. package/dist/pr/detail-enricher.js +26 -0
  323. package/dist/pro/bind.js +302 -0
  324. package/dist/pro/contract.js +37 -0
  325. package/dist/pro/migrate.js +64 -0
  326. package/dist/review/agent-context.js +127 -0
  327. package/dist/review/agent.js +385 -0
  328. package/dist/review/agentic.js +59 -0
  329. package/dist/review/auth.js +94 -0
  330. package/dist/review/chat-agent.js +179 -0
  331. package/dist/review/claude-review/ai-ready.js +16 -0
  332. package/dist/review/claude-review/auto-settings.js +139 -0
  333. package/dist/review/claude-review/auto.js +244 -0
  334. package/dist/review/claude-review/chat.js +489 -0
  335. package/dist/review/claude-review/ci-failures.js +350 -0
  336. package/dist/review/claude-review/follow-up.js +310 -0
  337. package/dist/review/claude-review/manager.js +686 -0
  338. package/dist/review/claude-review/persist.js +996 -0
  339. package/dist/review/claude-review/prompts.js +357 -0
  340. package/dist/review/claude-review/routes.js +518 -0
  341. package/dist/review/claude-review/routing.js +61 -0
  342. package/dist/review/claude-review/specialists.js +190 -0
  343. package/dist/review/claude-review/threads.js +265 -0
  344. package/dist/review/claude-review/ticket.js +282 -0
  345. package/dist/review/clone-hygiene.js +380 -0
  346. package/dist/review/clone-manager.js +367 -0
  347. package/dist/review/llm.js +113 -0
  348. package/dist/review/model-options.js +48 -0
  349. package/dist/review/plugin-providers.js +12 -0
  350. package/dist/review/post-review.js +216 -0
  351. package/dist/review/post-seam.js +161 -0
  352. package/dist/review/prepare.js +168 -0
  353. package/dist/review/pricing.js +17 -0
  354. package/dist/review/schema.js +156 -0
  355. package/dist/review/submit-map.js +41 -0
  356. package/dist/review/usage.js +90 -0
  357. package/dist/shared/claude-review.js +335 -0
  358. package/dist/shared/conflict-fold.js +151 -0
  359. package/dist/shared/conflicts.js +30 -0
  360. package/dist/shared/flow-settings.js +191 -0
  361. package/dist/shared/index.js +8 -0
  362. package/dist/shared/my-turn-settings.js +238 -0
  363. package/dist/shared/pending-rules.js +281 -0
  364. package/dist/shared/product.js +54 -0
  365. package/dist/shared/types.js +896 -0
  366. package/dist/status.js +386 -0
  367. package/dist/sync/adaptive.js +185 -0
  368. package/dist/sync/app-attribution.js +66 -0
  369. package/dist/sync/auth-notices.js +36 -0
  370. package/dist/sync/backfill-ci-history.js +315 -0
  371. package/dist/sync/backfill-commit-headlines.js +136 -0
  372. package/dist/sync/backfill-pr-security.js +175 -0
  373. package/dist/sync/backfill-review-requests.js +97 -0
  374. package/dist/sync/benchmark-rollup.js +50 -0
  375. package/dist/sync/bot-detection.js +309 -0
  376. package/dist/sync/bot-resolution-markers.js +30 -0
  377. package/dist/sync/branch-status.js +634 -0
  378. package/dist/sync/classify-change-shape.js +150 -0
  379. package/dist/sync/commit-files.js +74 -0
  380. package/dist/sync/derive-thread-state.js +99 -0
  381. package/dist/sync/drain-review-threads.js +212 -0
  382. package/dist/sync/hydrate-detail.js +482 -0
  383. package/dist/sync/mention-scan.js +89 -0
  384. package/dist/sync/ml-enrichment.js +478 -0
  385. package/dist/sync/pr-change-signal.js +96 -0
  386. package/dist/sync/pr-liveness-sweep.js +139 -0
  387. package/dist/sync/pr-settle.js +381 -0
  388. package/dist/sync/refresh-pr.js +163 -0
  389. package/dist/sync/reparse-vendor-badges.js +495 -0
  390. package/dist/sync/resync-after-write.js +280 -0
  391. package/dist/sync/review-fingerprint.js +117 -0
  392. package/dist/sync/reviewer-behavior.js +103 -0
  393. package/dist/sync/reviewer-classify.js +503 -0
  394. package/dist/sync/routing-files.js +97 -0
  395. package/dist/sync/scheduled-jobs.js +12 -0
  396. package/dist/sync/scheduler.js +159 -0
  397. package/dist/sync/security-detect.js +521 -0
  398. package/dist/sync/sync-manager.js +750 -0
  399. package/dist/sync/sync-one-pr.js +205 -0
  400. package/dist/sync/sync-repo.js +400 -0
  401. package/dist/sync/unsettled-prs.js +506 -0
  402. package/dist/sync/upsert.js +1190 -0
  403. package/package.json +56 -0
  404. package/public/apple-touch-icon.png +0 -0
  405. package/public/assets/AiFixTab-CQP6PT5u.js +2 -0
  406. package/public/assets/ClaudeReviewTab-DQJ-58ZA.js +8 -0
  407. package/public/assets/PrBotBehaviourTab-CCnFrWbC.js +1 -0
  408. package/public/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
  409. package/public/assets/highlight-BEHUn5zE.css +10 -0
  410. package/public/assets/highlight-CIIZLa6Z.js +12 -0
  411. package/public/assets/index-BDnYs6zg.js +73 -0
  412. package/public/assets/index-mCuI--RC.css +1 -0
  413. package/public/assets/markdown-I_JLLVAZ.js +32 -0
  414. package/public/assets/perfProbe-Da13EhTE.js +1 -0
  415. package/public/assets/tanstack-5qsxxaLe.js +17 -0
  416. package/public/assets/vis-C3BCkP5U.js +1280 -0
  417. package/public/assets/vis-ziCVehMy.css +1 -0
  418. package/public/favicon-16.png +0 -0
  419. package/public/favicon-32.png +0 -0
  420. package/public/favicon-48.png +0 -0
  421. package/public/favicon.svg +5 -0
  422. package/public/index.html +41 -0
  423. package/public-landing/apple-touch-icon.png +0 -0
  424. package/public-landing/assets/archivo-latin-500-BWmvx2Mg.woff2 +0 -0
  425. package/public-landing/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
  426. package/public-landing/assets/index-CA3eEGXO.js +40 -0
  427. package/public-landing/assets/index-naQrQ6Fe.css +1 -0
  428. package/public-landing/assets/jetbrains-mono-latin-400-RruCX7RW.woff2 +0 -0
  429. package/public-landing/assets/newsreader-latin-400-DExrRRrN.woff2 +0 -0
  430. package/public-landing/assets/newsreader-latin-400-italic-b0I-AwbV.woff2 +0 -0
  431. package/public-landing/bots/index.html +156 -0
  432. package/public-landing/contact/index.html +156 -0
  433. package/public-landing/cookies/index.html +156 -0
  434. package/public-landing/demo/limn-walkthrough-poster.jpg +0 -0
  435. package/public-landing/demo/limn-walkthrough.cues.json +44 -0
  436. package/public-landing/demo/limn-walkthrough.mp4 +0 -0
  437. package/public-landing/favicon-16.png +0 -0
  438. package/public-landing/favicon-32.png +0 -0
  439. package/public-landing/favicon-48.png +0 -0
  440. package/public-landing/favicon.svg +5 -0
  441. package/public-landing/features/index.html +156 -0
  442. package/public-landing/for-developers/index.html +156 -0
  443. package/public-landing/for-managers/index.html +156 -0
  444. package/public-landing/how-it-works/index.html +156 -0
  445. package/public-landing/how-we-measure/index.html +156 -0
  446. package/public-landing/icon-192.png +0 -0
  447. package/public-landing/icon-512.png +0 -0
  448. package/public-landing/index.html +156 -0
  449. package/public-landing/insights/index.html +156 -0
  450. package/public-landing/og-image.png +0 -0
  451. package/public-landing/pricing/index.html +156 -0
  452. package/public-landing/privacy/index.html +156 -0
  453. package/public-landing/pro/index.html +156 -0
  454. package/public-landing/reviews/index.html +156 -0
  455. package/public-landing/robots.txt +8 -0
  456. package/public-landing/shots/benchmark.png +0 -0
  457. package/public-landing/shots/bot-roi.png +0 -0
  458. package/public-landing/shots/bot-settings.png +0 -0
  459. package/public-landing/shots/chronology.png +0 -0
  460. package/public-landing/shots/feed.png +0 -0
  461. package/public-landing/shots/flow-metrics.png +0 -0
  462. package/public-landing/shots/free-reports.png +0 -0
  463. package/public-landing/shots/pending-board.png +0 -0
  464. package/public-landing/shots/pending-card.png +0 -0
  465. package/public-landing/shots/period-report.png +0 -0
  466. package/public-landing/shots/pr-detail.png +0 -0
  467. package/public-landing/shots/pr-threads.png +0 -0
  468. package/public-landing/shots/reach.png +0 -0
  469. package/public-landing/shots/repo-rows.png +0 -0
  470. package/public-landing/shots/severity-findings.png +0 -0
  471. package/public-landing/shots/severity-strip.png +0 -0
  472. package/public-landing/site.webmanifest +14 -0
  473. package/public-landing/sitemap.xml +51 -0
  474. package/public-landing/terms/index.html +156 -0
@@ -0,0 +1,281 @@
1
+ // THE PENDING BOARD'S RULES, AS NUMBERS — the ONE spelling the server folds with and the SPA
2
+ // explains with.
3
+ //
4
+ // ⚠ THIS FILE EXISTS SO THE EXPLANATION CANNOT DRIFT FROM THE BEHAVIOUR. The board's "how is this
5
+ // ordered" copy (the header info popover, the "How Pending works" modal, every card's own info
6
+ // popover) prints these thresholds and weights. Were the copy to re-type them, the first retune of
7
+ // the ranker would leave the app confidently describing an order it no longer produces — a false
8
+ // statement on the one screen whose job is to be believed. So `db/queries.ts` (admission, colour,
9
+ // board order) and `db/work-plan.ts` (the "Do next" score) read their constants FROM HERE, and the
10
+ // SPA renders from here. Change a number here and both move together.
11
+ //
12
+ // ⚠ VALUES ONLY — nothing here decides anything, beyond two one-line lookups the server and the SPA
13
+ // must answer identically (`pendingTabOf`, `pendingAuthorSideOf`). The folds that apply these
14
+ // numbers stay in the backend; this module is the table they share.
15
+ /**
16
+ * WHO GETS ON THE BOARD, and how many of each kind — the admission floors and caps
17
+ * `getWorkspaceInsights` applies.
18
+ */
19
+ export const PENDING_LIMITS = {
20
+ /** A requested review must have been open longer than this before it counts as stalled. */
21
+ stalledReviewMinHours: 24,
22
+ /** An untouched review thread must be older than this before it gets a card. */
23
+ untouchedThreadMinHours: 24,
24
+ /** A PR with nobody asked and nobody reviewing must be older than this ("ignore brand-new PRs"). */
25
+ routingMinAgeHours: 4,
26
+ /** A PR with no activity event in this many days is treated as abandoned and gets no survey card. */
27
+ maxQuietDays: 90,
28
+ /** Per-kind cap for every kind except `my_turn`, in the DEFAULT fold every other consumer reads
29
+ * (the daily brief, the Pro insights pane, chat, the sprint report, Slack). The Pending board
30
+ * asks for the uncapped fold instead and applies `boardListCap` AFTER ranking by score. */
31
+ cardCap: 15,
32
+ /** `my_turn`'s own, larger cap in the default fold. */
33
+ myTurnCardCap: 50,
34
+ /** How many reviewers the review-load cards name. */
35
+ reviewerLoadCap: 8,
36
+ /** The Pending board lists at most this many cards of each kind — the highest-scoring ones — and
37
+ * every tab says when it holds more. */
38
+ boardListCap: 50,
39
+ /** Suggested reviewers are looked up (CODEOWNERS + history, network-backed) for this many
40
+ * "Needs a reviewer" cards on the board — the highest-scoring ones. The rest show none. */
41
+ routingSuggestCap: 15,
42
+ };
43
+ /**
44
+ * How many failing check names a Pending card names beside its red CI label — "CI failing: build,
45
+ * lint and 2 more". The server slices to this and sends the count of every name STORED for that
46
+ * head (`failingCheckTotal`), so the "and N more" has a denominator of its own. ⚠ Storage has
47
+ * bounds of its own: a trunk commit keeps at most 20 (the writer's `MAX_FAILING_CHECKS_PER_COMMIT`)
48
+ * and a PR's sync reads at most 100 contexts, so a total AT a bound is a floor. MEASURED: three
49
+ * names cover 91% of red PR heads on real data.
50
+ */
51
+ export const FAILING_CHECKS_SHOWN = 3;
52
+ /**
53
+ * How many commits a "Pushed since" My Turn card lists (`NewPrBall.commits`), newest first. The
54
+ * rest are "and N more", where N = `humanCommitsAfter` − the listed count — the same population,
55
+ * so the two cannot disagree. A PR with 30 commits pushed since would otherwise fill the board.
56
+ */
57
+ export const PUSHED_COMMITS_SHOWN = 5;
58
+ /**
59
+ * The longest reply a reply-type My Turn card carries inline (`MyTurnCard.reply`), in characters.
60
+ * Longer bodies are cut and flagged `truncated`, and the card offers "Open thread". MEASURED on
61
+ * human review comments: average 262 characters, 44 of 13,200 over 2,000, longest 8,021.
62
+ */
63
+ export const MY_TURN_REPLY_MAX_CHARS = 1500;
64
+ /**
65
+ * THE ONE SENTENCE a Pending card's detail says while GitHub's merge queue holds its PR — on a
66
+ * `merge` / `update_branch` card and your own ready PR in My turn (`mergeCardDetail`), on a
67
+ * Dependencies card (`dependencyStateDetail`), and as the Do next row's `reason`, which the same
68
+ * two functions build.
69
+ *
70
+ * ⚠ A QUEUED PR STAYS ON Ready to land AND Dependencies, and that is why it needs its own words.
71
+ * GitHub has no QUEUED merge state, so a queued PR reads like any other ('clean' and 'unknown' have
72
+ * both been seen here); a clean one is minted exactly as before and used to say "Nothing is
73
+ * blocking this — it can land now" beside the card's queue chip. Time-free, like every card
74
+ * sentence.
75
+ *
76
+ * ⚠ SHARED BECAUSE THE SPA DOES NOT PRINT IT. The card's queue chip (or, for a reader who can push,
77
+ * its merge row) already says the PR is queued, so the card leaves this sentence out and keeps it
78
+ * for the ranker (`pendingCardDetail`, Activity/pendingLabels.ts — the `ci_red` precedent). The
79
+ * SPA recognises it by value, so the value lives here, once.
80
+ */
81
+ export const MERGE_QUEUE_CARD_DETAIL = 'In the merge queue. GitHub merges it from here.';
82
+ /**
83
+ * THE COLOUR RULES — where a kind's severity comes from a threshold rather than a fixed value.
84
+ * `high` renders red, `warn` amber, anything below `warn` blue.
85
+ */
86
+ export const PENDING_SEVERITY = {
87
+ /** Hours the PR has been OPEN (not since the request) with a review still outstanding. */
88
+ stalledReviewHours: { high: 72, warn: 48 },
89
+ /** Hours since the untouched thread was started. */
90
+ untouchedThreadHours: { high: 96, warn: 48 },
91
+ /** Requested reviews a person has not yet done. */
92
+ reviewerLoadPending: { high: 4, warn: 2 },
93
+ };
94
+ /**
95
+ * THE COLOUR OF EACH MY TURN TYPE. Somebody waiting on you, or a failing build or a conflict on
96
+ * your own PR, is red; new code to re-read, a red default branch, your own PR's good news or
97
+ * unanswered threads, or findings you have not posted, is amber; a PR nobody asked you about is
98
+ * blue. A red default branch turns red when you merged the PR that landed its head (the card
99
+ * builder's rule, as on the ci_failing trunk card).
100
+ */
101
+ export const MY_TURN_SEVERITY = {
102
+ review_request: 'high',
103
+ mention: 'high',
104
+ thread: 'high',
105
+ thread_reply: 'high',
106
+ comment_reply: 'high',
107
+ pushed_since: 'warn',
108
+ own_ci_red: 'high',
109
+ own_conflicts: 'high',
110
+ trunk_red: 'warn',
111
+ pr_approved: 'warn',
112
+ own_ready: 'warn',
113
+ your_pr: 'warn',
114
+ own_thread: 'warn',
115
+ claude_review: 'warn',
116
+ watched_repo_pr: 'info',
117
+ };
118
+ /**
119
+ * THE "EVERYTHING ELSE" ORDER WITHIN ONE COLOUR. The board sorts by severity first (red, amber,
120
+ * blue) and by this rank second; within one kind, each builder's own order stands (the sort is
121
+ * stable). The two bot kinds keep their slots because the fold still emits them — the Pending
122
+ * route filters them out, the Pro Insights pane does not.
123
+ *
124
+ * ⚠ The two FORWARD kinds (`merge`, `update_branch`) rank after the problems on purpose: they are
125
+ * opportunities, and every kind above them is a problem. The "Do next" head is where they get to
126
+ * lead. `security` is a problem, so it sits with the problems; a `dependency_bump` is housekeeping,
127
+ * so it sits after the forward kinds.
128
+ */
129
+ export const PENDING_KIND_RANK = {
130
+ my_turn: 0,
131
+ ci_failing: 1,
132
+ conflicts: 2,
133
+ security: 3,
134
+ bot_signal: 4,
135
+ bot_only_review: 5,
136
+ stalled_review: 6,
137
+ untouched_thread: 7,
138
+ reviewer_load: 8,
139
+ reviewer_routing: 9,
140
+ merge: 10,
141
+ update_branch: 11,
142
+ dependency_bump: 12,
143
+ };
144
+ /**
145
+ * THE "DO NEXT" SCORE — `db/work-plan.ts`'s deterministic rank.
146
+ *
147
+ * score = weights.proximity × proximity + weights.stall × stallRisk + weights.relevance × relevanceWeight
148
+ *
149
+ * Every value is 0..1. `proximity` is "how few steps from a merged PR", `stallRisk` is "how long it
150
+ * has been waiting, bucketed", `relevanceWeight` is "how much it is the viewer's".
151
+ */
152
+ export const DO_NEXT_RULES = {
153
+ /** How many rows the head seats. */
154
+ cap: 12,
155
+ /** The product default (= `DO_NEXT_PRESETS.balanced`). The ranker reads the ACCOUNT's resolved
156
+ * weights (`resolveMyTurnSettings`); nothing may read this field except the resolver and its
157
+ * test. */
158
+ weights: { proximity: 0.5, stall: 0.3, relevance: 0.2 },
159
+ /**
160
+ * Proximity by the row's next step. `merge` splits on approval: a clean PR nobody has approved is
161
+ * ready for GitHub, not for a human, so it scores BELOW a review or a reply. A red trunk sits
162
+ * above a red PR because it breaks every open PR in the repo at once.
163
+ */
164
+ proximity: {
165
+ merge_approved: 0.95,
166
+ merge_unapproved: 0.45,
167
+ update_branch: 0.7,
168
+ red_trunk: 0.65,
169
+ unblock_ci: 0.6,
170
+ review: 0.55,
171
+ reply: 0.5,
172
+ thread: 0.4,
173
+ nudge: 0.25,
174
+ /** A merge conflict — board-only. Conflicts cards compete inside the "Needs fixing" tab and
175
+ * are NOT part of the Pro work plan's evidence (its kind vocabulary has no conflicts member).
176
+ * The `conflicts` adjustment below is NOT applied on top of this base: it IS the conflict. */
177
+ conflicts: 0.5,
178
+ /** A person's PR a security tool flagged for a known advisory — board-only (the Dependencies
179
+ * tab). There is no security bonus: the tab's strict group already lists every security card
180
+ * above every bump, so a bonus would change no order and be one more number to explain. */
181
+ security_alert: 0.55,
182
+ /** A dependency PR GitHub is holding for something other than review or red CI (checks still
183
+ * running, other protection), or whose merge state it has not worked out — board-only. */
184
+ waiting: 0.3,
185
+ },
186
+ /** Applied once each, then the sum is clamped to 0..1. */
187
+ adjustments: {
188
+ /** GitHub reports the PR as conflicting (`mergeStateStatus === 'dirty'`). */
189
+ conflicts: -0.15,
190
+ /** At least `manyUntouchedThreadsMin` review threads with no reply and no follow-up commit. */
191
+ many_untouched_threads: -0.1,
192
+ /** The PR touches at most `smallChangeMaxFiles` files. */
193
+ small_change: 0.05,
194
+ },
195
+ manyUntouchedThreadsMin: 3,
196
+ smallChangeMaxFiles: 3,
197
+ /** Hours on the row's OWN clock → stall risk. First match wins, checked top down. */
198
+ stallBuckets: [
199
+ { minHours: 96, risk: 1.0 },
200
+ { minHours: 48, risk: 0.7 },
201
+ { minHours: 24, risk: 0.4 },
202
+ ],
203
+ /** Under the lowest bucket, or no clock at all. An unknown age is never treated as urgent. */
204
+ stallBase: 0.15,
205
+ relevanceWeight: { direct: 1.0, maintained: 0.6, none: 0.25 },
206
+ };
207
+ /** The four named weightings Settings offers. A preset is DERIVED from the stored weights (an
208
+ * exact match on all three), never stored — Balanced stores nothing at all. */
209
+ export const DO_NEXT_PRESETS = {
210
+ balanced: { proximity: 50, stall: 30, relevance: 20 },
211
+ mine_first: { proximity: 30, stall: 10, relevance: 60 },
212
+ oldest_first: { proximity: 20, stall: 70, relevance: 10 },
213
+ quick_wins: { proximity: 80, stall: 10, relevance: 10 },
214
+ };
215
+ export const DO_NEXT_PRESET_ORDER = [
216
+ 'balanced',
217
+ 'mine_first',
218
+ 'oldest_first',
219
+ 'quick_wins',
220
+ ];
221
+ /** Where a Dependencies-tab card starts on the Do next scale, by `DependencyPrState`. 'ready'
222
+ * splits on approval like a `merge` card (merge_approved / merge_unapproved); a flagged person's
223
+ * PR has no state and starts at `security_alert`. Read by db/work-plan.ts, printed by the guide. */
224
+ export const DEPENDENCY_STATE_BASE = {
225
+ behind: 'update_branch',
226
+ conflicts: 'conflicts',
227
+ ci_red: 'unblock_ci',
228
+ needs_review: 'nudge',
229
+ blocked: 'waiting',
230
+ unknown: 'waiting',
231
+ };
232
+ /** The card kinds that get no score. Review load is about PEOPLE, not pull requests, so it is
233
+ * listed beside the ranking rather than in it; the two bot cards never reach the Pending board. */
234
+ export const DO_NEXT_UNSCORED_KINDS = new Set([
235
+ 'reviewer_load',
236
+ 'bot_signal',
237
+ 'bot_only_review',
238
+ ]);
239
+ // ── THE PENDING TABS ──────────────────────────────────────────────────────────────────────────
240
+ /** How many of a tab's highest-scoring cards sit under "Do next". The rest are "Everything else". */
241
+ export const PENDING_DO_NEXT_SIZE = 5;
242
+ /**
243
+ * The six tabs, in display order, and the card kinds each holds. Every PR card kind on the board
244
+ * belongs to exactly ONE tab, so a card is listed once; a PR with two jobs (your approved PR is both
245
+ * "Approved" in My turn and "Ready to merge") appears once per job, in each job's tab.
246
+ *
247
+ * `reviewer_load` sits in 'review' but is not ranked with the PR cards — it is the "who has reviews
248
+ * waiting" strip at the top of that tab, and it is not in the tab's count.
249
+ *
250
+ * Every tab is one scored list, except the two STRICT-GROUP tabs, whose groups come first and are
251
+ * each scored within, whatever the scores:
252
+ * • `groupByReason` — My turn, grouped by card type (`MyTurnCard.reason`) in the READER'S order
253
+ * (Settings → My Turn; `PendingRankRules.myTurnOrder` on the response).
254
+ * • `groupByKind` — Dependencies, grouped by kind in the order listed: every security item before
255
+ * every bump.
256
+ * Both are read by the ONE group comparator (`tabGroupRank`, db/pending-tabs.ts), never a second
257
+ * sort chosen by tab key.
258
+ */
259
+ export const PENDING_TABS = [
260
+ { key: 'my_turn', kinds: ['my_turn'], groupByReason: true },
261
+ { key: 'fixing', kinds: ['ci_failing', 'conflicts'] },
262
+ { key: 'review', kinds: ['stalled_review', 'reviewer_routing', 'reviewer_load'] },
263
+ { key: 'threads', kinds: ['untouched_thread'] },
264
+ { key: 'land', kinds: ['merge', 'update_branch'] },
265
+ { key: 'deps', kinds: ['security', 'dependency_bump'], groupByKind: true },
266
+ ];
267
+ /** The tab a card kind lives in, or null for the two bot kinds (they never reach the board). */
268
+ export function pendingTabOf(kind) {
269
+ for (const t of PENDING_TABS)
270
+ if (t.kinds.includes(kind))
271
+ return t.key;
272
+ return null;
273
+ }
274
+ /** WHO OPENED IT, as the board's lens reads it: 'automation' iff the card names a PR whose
275
+ * `automation` is set (bots, coding agents, and a person's PR a tool's marker proves the tool made),
276
+ * else 'people'. ONE predicate for the server's caps and totals and the SPA's filter. A card that
277
+ * names no PR (review load, a trunk with no landing PR) is 'people', so every card falls on exactly
278
+ * one side and `people + automation === total` holds by construction. */
279
+ export function pendingAuthorSideOf(card) {
280
+ return 'automation' in card && card.automation != null ? 'automation' : 'people';
281
+ }
@@ -0,0 +1,54 @@
1
+ // ---------------------------------------------------------------------------
2
+ // THE PRODUCT NAME, and the three labels that compose it.
3
+ //
4
+ // The app is called Limn. It used to be called Pierre, and the rename was staged:
5
+ // every user-visible string moved, while the published/runtime identifiers stayed
6
+ // on the old spelling because they are migrations rather than text edits.
7
+ // The npm package (`limn-review`, bin `limn`) and the data dir (`~/.limn`, moved once
8
+ // from `~/.pierre-review` on first boot) have since moved too. The
9
+ // canonical statement of that split lives at apps/landing/src/lib/site.ts (which
10
+ // has its own SITE_NAME and deliberately imports nothing from here — the landing
11
+ // bundle does not depend on this package). Short version of what is STILL
12
+ // `pierre` on purpose, and must never be swept:
13
+ //
14
+ // · the domain, the `pierre_session` / `pierre_oauth_state` cookies
15
+ // · the ~20 `pierre:*` localStorage keys
16
+ // · the AutomatedReviewerKind `'pierre'` — a persisted DB value AND a
17
+ // 400-validated API path segment
18
+ // · the `refs/pierre/conflict/` git namespace the janitor sweeps by prefix
19
+ // · `<!-- pierre:claude-review v=1 -->`, already stamped into GitHub review
20
+ // bodies we do not control
21
+ //
22
+ // So the name is a STRING, never an identifier. Use PRODUCT_NAME wherever the
23
+ // name is composed into a sentence or a label; the ~30 plain "Limn" literals
24
+ // already in the SPA are left alone on purpose (rewriting files nobody is
25
+ // otherwise touching buys churn, not safety).
26
+ // ---------------------------------------------------------------------------
27
+ /** The product name, as a reader sees it. */
28
+ export const PRODUCT_NAME = 'Limn';
29
+ /**
30
+ * Display labels for the three UNBRANDED automated-reviewer kinds.
31
+ *
32
+ * ⚠ SHARED IS OTHERWISE PRESENTATION-FREE AND THIS IS THE ONE EXCEPTION, narrowly. The ~80
33
+ * BRANDED vendor labels stay in the frontend's `BOT_VENDOR_META` beside their colours, which
34
+ * is what that rule is for. These three are different: `pierre` COMPOSES THE PRODUCT NAME, and
35
+ * `in_house` carries a judgement ("In-house / custom", not "In-house AI" — see below) that has
36
+ * to read the same everywhere. Three independent copies of these strings existed — the SPA's
37
+ * `BOT_VENDOR_META`, the backend's `labelFor`, and the Pro plugin's Slack `BOT_LABELS` — and
38
+ * they had drifted on BOTH counts: Slack was still emitting "Pierre · Claude" into digests
39
+ * months after the other two were renamed, and "In-house AI" after the other two had rejected
40
+ * that wording. Each of the three now reads these three keys from here.
41
+ *
42
+ * ⚠ "In-house / custom", NOT "In-house AI". The kind is the fallback for EVERY reviewer role,
43
+ * so an unbranded quality gate or a CLA bot lands here — and calling those "In-house AI" is how
44
+ * the bucket earned its reputation for being wrong. It is the role-neutral escape hatch.
45
+ *
46
+ * ⚠ `labelFor` in the backend WRITES these into `workspace_reviewers.label`, so they are
47
+ * persisted as well as rendered. Changing one is a copy change that shows up on already-stored
48
+ * rows only after the next classification pass.
49
+ */
50
+ export const GENERIC_REVIEWER_LABELS = {
51
+ in_house: 'In-house / custom',
52
+ vendor: 'Vendor',
53
+ pierre: `${PRODUCT_NAME} · Claude`,
54
+ };