@coldtea/abide 0.0.1

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 (370) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/abide-hook.d.ts +2 -0
  4. package/dist/abide-hook.d.ts.map +1 -0
  5. package/dist/abide-hook.js +23 -0
  6. package/dist/abide-hook.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +64 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/commands/audit.d.ts +3 -0
  12. package/dist/commands/audit.d.ts.map +1 -0
  13. package/dist/commands/audit.js +79 -0
  14. package/dist/commands/audit.js.map +1 -0
  15. package/dist/commands/bench.d.ts +3 -0
  16. package/dist/commands/bench.d.ts.map +1 -0
  17. package/dist/commands/bench.js +206 -0
  18. package/dist/commands/bench.js.map +1 -0
  19. package/dist/commands/calibrate.d.ts +3 -0
  20. package/dist/commands/calibrate.d.ts.map +1 -0
  21. package/dist/commands/calibrate.js +159 -0
  22. package/dist/commands/calibrate.js.map +1 -0
  23. package/dist/commands/check.d.ts +3 -0
  24. package/dist/commands/check.d.ts.map +1 -0
  25. package/dist/commands/check.js +106 -0
  26. package/dist/commands/check.js.map +1 -0
  27. package/dist/commands/compile.d.ts +3 -0
  28. package/dist/commands/compile.d.ts.map +1 -0
  29. package/dist/commands/compile.js +116 -0
  30. package/dist/commands/compile.js.map +1 -0
  31. package/dist/commands/init.d.ts +4 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +93 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/login.d.ts +3 -0
  36. package/dist/commands/login.d.ts.map +1 -0
  37. package/dist/commands/login.js +58 -0
  38. package/dist/commands/login.js.map +1 -0
  39. package/dist/commands/replay.d.ts +4 -0
  40. package/dist/commands/replay.d.ts.map +1 -0
  41. package/dist/commands/replay.js +118 -0
  42. package/dist/commands/replay.js.map +1 -0
  43. package/dist/commands/report.d.ts +5 -0
  44. package/dist/commands/report.d.ts.map +1 -0
  45. package/dist/commands/report.js +78 -0
  46. package/dist/commands/report.js.map +1 -0
  47. package/dist/commands/rubric.d.ts +3 -0
  48. package/dist/commands/rubric.d.ts.map +1 -0
  49. package/dist/commands/rubric.js +40 -0
  50. package/dist/commands/rubric.js.map +1 -0
  51. package/dist/commands/uninstall.d.ts +2 -0
  52. package/dist/commands/uninstall.d.ts.map +1 -0
  53. package/dist/commands/uninstall.js +31 -0
  54. package/dist/commands/uninstall.js.map +1 -0
  55. package/dist/hooks/postToolUse.d.ts +3 -0
  56. package/dist/hooks/postToolUse.d.ts.map +1 -0
  57. package/dist/hooks/postToolUse.js +145 -0
  58. package/dist/hooks/postToolUse.js.map +1 -0
  59. package/dist/hooks/sessionStart.d.ts +11 -0
  60. package/dist/hooks/sessionStart.d.ts.map +1 -0
  61. package/dist/hooks/sessionStart.js +83 -0
  62. package/dist/hooks/sessionStart.js.map +1 -0
  63. package/dist/hooks/stop.d.ts +26 -0
  64. package/dist/hooks/stop.d.ts.map +1 -0
  65. package/dist/hooks/stop.js +227 -0
  66. package/dist/hooks/stop.js.map +1 -0
  67. package/dist/hooks/turnStart.d.ts +8 -0
  68. package/dist/hooks/turnStart.d.ts.map +1 -0
  69. package/dist/hooks/turnStart.js +40 -0
  70. package/dist/hooks/turnStart.js.map +1 -0
  71. package/dist/lib/applyPatch.d.ts +22 -0
  72. package/dist/lib/applyPatch.d.ts.map +1 -0
  73. package/dist/lib/applyPatch.js +63 -0
  74. package/dist/lib/applyPatch.js.map +1 -0
  75. package/dist/lib/audit.d.ts +40 -0
  76. package/dist/lib/audit.d.ts.map +1 -0
  77. package/dist/lib/audit.js +215 -0
  78. package/dist/lib/audit.js.map +1 -0
  79. package/dist/lib/band.d.ts +20 -0
  80. package/dist/lib/band.d.ts.map +1 -0
  81. package/dist/lib/band.js +40 -0
  82. package/dist/lib/band.js.map +1 -0
  83. package/dist/lib/calibration.d.ts +13 -0
  84. package/dist/lib/calibration.d.ts.map +1 -0
  85. package/dist/lib/calibration.js +25 -0
  86. package/dist/lib/calibration.js.map +1 -0
  87. package/dist/lib/checkRunner.d.ts +34 -0
  88. package/dist/lib/checkRunner.d.ts.map +1 -0
  89. package/dist/lib/checkRunner.js +76 -0
  90. package/dist/lib/checkRunner.js.map +1 -0
  91. package/dist/lib/claude.d.ts +4 -0
  92. package/dist/lib/claude.d.ts.map +1 -0
  93. package/dist/lib/claude.js +28 -0
  94. package/dist/lib/claude.js.map +1 -0
  95. package/dist/lib/compilePrompt.d.ts +22 -0
  96. package/dist/lib/compilePrompt.d.ts.map +1 -0
  97. package/dist/lib/compilePrompt.js +33 -0
  98. package/dist/lib/compilePrompt.js.map +1 -0
  99. package/dist/lib/constants.d.ts +33 -0
  100. package/dist/lib/constants.d.ts.map +1 -0
  101. package/dist/lib/constants.js +33 -0
  102. package/dist/lib/constants.js.map +1 -0
  103. package/dist/lib/coverage.d.ts +7 -0
  104. package/dist/lib/coverage.d.ts.map +1 -0
  105. package/dist/lib/coverage.js +17 -0
  106. package/dist/lib/coverage.js.map +1 -0
  107. package/dist/lib/credentials.d.ts +27 -0
  108. package/dist/lib/credentials.d.ts.map +1 -0
  109. package/dist/lib/credentials.js +89 -0
  110. package/dist/lib/credentials.js.map +1 -0
  111. package/dist/lib/diff.d.ts +30 -0
  112. package/dist/lib/diff.d.ts.map +1 -0
  113. package/dist/lib/diff.js +139 -0
  114. package/dist/lib/diff.js.map +1 -0
  115. package/dist/lib/events.d.ts +5 -0
  116. package/dist/lib/events.d.ts.map +1 -0
  117. package/dist/lib/events.js +38 -0
  118. package/dist/lib/events.js.map +1 -0
  119. package/dist/lib/git.d.ts +37 -0
  120. package/dist/lib/git.d.ts.map +1 -0
  121. package/dist/lib/git.js +163 -0
  122. package/dist/lib/git.js.map +1 -0
  123. package/dist/lib/hookRunner.d.ts +10 -0
  124. package/dist/lib/hookRunner.d.ts.map +1 -0
  125. package/dist/lib/hookRunner.js +52 -0
  126. package/dist/lib/hookRunner.js.map +1 -0
  127. package/dist/lib/hosts.d.ts +20 -0
  128. package/dist/lib/hosts.d.ts.map +1 -0
  129. package/dist/lib/hosts.js +101 -0
  130. package/dist/lib/hosts.js.map +1 -0
  131. package/dist/lib/jev.d.ts +24 -0
  132. package/dist/lib/jev.d.ts.map +1 -0
  133. package/dist/lib/jev.js +169 -0
  134. package/dist/lib/jev.js.map +1 -0
  135. package/dist/lib/lintConfig.d.ts +3 -0
  136. package/dist/lib/lintConfig.d.ts.map +1 -0
  137. package/dist/lib/lintConfig.js +55 -0
  138. package/dist/lib/lintConfig.js.map +1 -0
  139. package/dist/lib/loadRules.d.ts +12 -0
  140. package/dist/lib/loadRules.d.ts.map +1 -0
  141. package/dist/lib/loadRules.js +31 -0
  142. package/dist/lib/loadRules.js.map +1 -0
  143. package/dist/lib/opencodePlugin.d.ts +10 -0
  144. package/dist/lib/opencodePlugin.d.ts.map +1 -0
  145. package/dist/lib/opencodePlugin.js +36 -0
  146. package/dist/lib/opencodePlugin.js.map +1 -0
  147. package/dist/lib/output.d.ts +6 -0
  148. package/dist/lib/output.d.ts.map +1 -0
  149. package/dist/lib/output.js +35 -0
  150. package/dist/lib/output.js.map +1 -0
  151. package/dist/lib/packageRoot.d.ts +12 -0
  152. package/dist/lib/packageRoot.d.ts.map +1 -0
  153. package/dist/lib/packageRoot.js +50 -0
  154. package/dist/lib/packageRoot.js.map +1 -0
  155. package/dist/lib/paths.d.ts +24 -0
  156. package/dist/lib/paths.d.ts.map +1 -0
  157. package/dist/lib/paths.js +75 -0
  158. package/dist/lib/paths.js.map +1 -0
  159. package/dist/lib/reason.d.ts +11 -0
  160. package/dist/lib/reason.d.ts.map +1 -0
  161. package/dist/lib/reason.js +31 -0
  162. package/dist/lib/reason.js.map +1 -0
  163. package/dist/lib/regularFile.d.ts +26 -0
  164. package/dist/lib/regularFile.d.ts.map +1 -0
  165. package/dist/lib/regularFile.js +77 -0
  166. package/dist/lib/regularFile.js.map +1 -0
  167. package/dist/lib/replay.d.ts +74 -0
  168. package/dist/lib/replay.d.ts.map +1 -0
  169. package/dist/lib/replay.js +250 -0
  170. package/dist/lib/replay.js.map +1 -0
  171. package/dist/lib/replayCodex.d.ts +6 -0
  172. package/dist/lib/replayCodex.d.ts.map +1 -0
  173. package/dist/lib/replayCodex.js +132 -0
  174. package/dist/lib/replayCodex.js.map +1 -0
  175. package/dist/lib/replayOpencode.d.ts +15 -0
  176. package/dist/lib/replayOpencode.d.ts.map +1 -0
  177. package/dist/lib/replayOpencode.js +154 -0
  178. package/dist/lib/replayOpencode.js.map +1 -0
  179. package/dist/lib/rubricFile.d.ts +31 -0
  180. package/dist/lib/rubricFile.d.ts.map +1 -0
  181. package/dist/lib/rubricFile.js +75 -0
  182. package/dist/lib/rubricFile.js.map +1 -0
  183. package/dist/lib/scope.d.ts +4 -0
  184. package/dist/lib/scope.d.ts.map +1 -0
  185. package/dist/lib/scope.js +14 -0
  186. package/dist/lib/scope.js.map +1 -0
  187. package/dist/lib/session.d.ts +48 -0
  188. package/dist/lib/session.d.ts.map +1 -0
  189. package/dist/lib/session.js +182 -0
  190. package/dist/lib/session.js.map +1 -0
  191. package/dist/lib/settings.d.ts +26 -0
  192. package/dist/lib/settings.d.ts.map +1 -0
  193. package/dist/lib/settings.js +104 -0
  194. package/dist/lib/settings.js.map +1 -0
  195. package/dist/lib/sources.d.ts +28 -0
  196. package/dist/lib/sources.d.ts.map +1 -0
  197. package/dist/lib/sources.js +137 -0
  198. package/dist/lib/sources.js.map +1 -0
  199. package/dist/lib/stdin.d.ts +3 -0
  200. package/dist/lib/stdin.d.ts.map +1 -0
  201. package/dist/lib/stdin.js +24 -0
  202. package/dist/lib/stdin.js.map +1 -0
  203. package/dist/lib/transcript.d.ts +3 -0
  204. package/dist/lib/transcript.d.ts.map +1 -0
  205. package/dist/lib/transcript.js +57 -0
  206. package/dist/lib/transcript.js.map +1 -0
  207. package/dist/lib/ui.d.ts +8 -0
  208. package/dist/lib/ui.d.ts.map +1 -0
  209. package/dist/lib/ui.js +34 -0
  210. package/dist/lib/ui.js.map +1 -0
  211. package/dist/ui/components/Buckets.d.ts +6 -0
  212. package/dist/ui/components/Buckets.d.ts.map +1 -0
  213. package/dist/ui/components/Buckets.js +11 -0
  214. package/dist/ui/components/Buckets.js.map +1 -0
  215. package/dist/ui/components/Callout.d.ts +11 -0
  216. package/dist/ui/components/Callout.d.ts.map +1 -0
  217. package/dist/ui/components/Callout.js +10 -0
  218. package/dist/ui/components/Callout.js.map +1 -0
  219. package/dist/ui/components/Checklist.d.ts +10 -0
  220. package/dist/ui/components/Checklist.d.ts.map +1 -0
  221. package/dist/ui/components/Checklist.js +8 -0
  222. package/dist/ui/components/Checklist.js.map +1 -0
  223. package/dist/ui/components/Columns.d.ts +28 -0
  224. package/dist/ui/components/Columns.d.ts.map +1 -0
  225. package/dist/ui/components/Columns.js +20 -0
  226. package/dist/ui/components/Columns.js.map +1 -0
  227. package/dist/ui/components/Header.d.ts +9 -0
  228. package/dist/ui/components/Header.d.ts.map +1 -0
  229. package/dist/ui/components/Header.js +7 -0
  230. package/dist/ui/components/Header.js.map +1 -0
  231. package/dist/ui/components/Live.d.ts +16 -0
  232. package/dist/ui/components/Live.d.ts.map +1 -0
  233. package/dist/ui/components/Live.js +40 -0
  234. package/dist/ui/components/Live.js.map +1 -0
  235. package/dist/ui/components/RuleTable.d.ts +15 -0
  236. package/dist/ui/components/RuleTable.d.ts.map +1 -0
  237. package/dist/ui/components/RuleTable.js +81 -0
  238. package/dist/ui/components/RuleTable.js.map +1 -0
  239. package/dist/ui/components/Section.d.ts +10 -0
  240. package/dist/ui/components/Section.d.ts.map +1 -0
  241. package/dist/ui/components/Section.js +8 -0
  242. package/dist/ui/components/Section.js.map +1 -0
  243. package/dist/ui/components/Verdicts.d.ts +9 -0
  244. package/dist/ui/components/Verdicts.d.ts.map +1 -0
  245. package/dist/ui/components/Verdicts.js +12 -0
  246. package/dist/ui/components/Verdicts.js.map +1 -0
  247. package/dist/ui/render.d.ts +20 -0
  248. package/dist/ui/render.d.ts.map +1 -0
  249. package/dist/ui/render.js +32 -0
  250. package/dist/ui/render.js.map +1 -0
  251. package/dist/ui/theme.d.ts +37 -0
  252. package/dist/ui/theme.d.ts.map +1 -0
  253. package/dist/ui/theme.js +63 -0
  254. package/dist/ui/theme.js.map +1 -0
  255. package/dist/ui/views/AuditView.d.ts +18 -0
  256. package/dist/ui/views/AuditView.d.ts.map +1 -0
  257. package/dist/ui/views/AuditView.js +48 -0
  258. package/dist/ui/views/AuditView.js.map +1 -0
  259. package/dist/ui/views/BenchView.d.ts +33 -0
  260. package/dist/ui/views/BenchView.d.ts.map +1 -0
  261. package/dist/ui/views/BenchView.js +19 -0
  262. package/dist/ui/views/BenchView.js.map +1 -0
  263. package/dist/ui/views/CalibrateView.d.ts +26 -0
  264. package/dist/ui/views/CalibrateView.d.ts.map +1 -0
  265. package/dist/ui/views/CalibrateView.js +42 -0
  266. package/dist/ui/views/CalibrateView.js.map +1 -0
  267. package/dist/ui/views/CheckView.d.ts +19 -0
  268. package/dist/ui/views/CheckView.d.ts.map +1 -0
  269. package/dist/ui/views/CheckView.js +15 -0
  270. package/dist/ui/views/CheckView.js.map +1 -0
  271. package/dist/ui/views/ErrorView.d.ts +4 -0
  272. package/dist/ui/views/ErrorView.d.ts.map +1 -0
  273. package/dist/ui/views/ErrorView.js +26 -0
  274. package/dist/ui/views/ErrorView.js.map +1 -0
  275. package/dist/ui/views/HelpView.d.ts +2 -0
  276. package/dist/ui/views/HelpView.d.ts.map +1 -0
  277. package/dist/ui/views/HelpView.js +25 -0
  278. package/dist/ui/views/HelpView.js.map +1 -0
  279. package/dist/ui/views/InitView.d.ts +27 -0
  280. package/dist/ui/views/InitView.d.ts.map +1 -0
  281. package/dist/ui/views/InitView.js +24 -0
  282. package/dist/ui/views/InitView.js.map +1 -0
  283. package/dist/ui/views/ReplayView.d.ts +16 -0
  284. package/dist/ui/views/ReplayView.d.ts.map +1 -0
  285. package/dist/ui/views/ReplayView.js +44 -0
  286. package/dist/ui/views/ReplayView.js.map +1 -0
  287. package/dist/ui/views/ReportView.d.ts +14 -0
  288. package/dist/ui/views/ReportView.d.ts.map +1 -0
  289. package/dist/ui/views/ReportView.js +86 -0
  290. package/dist/ui/views/ReportView.js.map +1 -0
  291. package/dist/ui/views/RubricView.d.ts +18 -0
  292. package/dist/ui/views/RubricView.d.ts.map +1 -0
  293. package/dist/ui/views/RubricView.js +18 -0
  294. package/dist/ui/views/RubricView.js.map +1 -0
  295. package/opencode/abide.mjs +246 -0
  296. package/package.json +50 -0
  297. package/skills/abide-compile/SKILL.md +173 -0
  298. package/src/abide-hook.ts +23 -0
  299. package/src/bin.ts +64 -0
  300. package/src/commands/audit.ts +97 -0
  301. package/src/commands/bench.ts +226 -0
  302. package/src/commands/calibrate.ts +165 -0
  303. package/src/commands/check.ts +114 -0
  304. package/src/commands/compile.ts +127 -0
  305. package/src/commands/init.ts +109 -0
  306. package/src/commands/login.ts +61 -0
  307. package/src/commands/replay.ts +148 -0
  308. package/src/commands/report.ts +83 -0
  309. package/src/commands/rubric.ts +45 -0
  310. package/src/commands/uninstall.ts +33 -0
  311. package/src/hooks/postToolUse.ts +171 -0
  312. package/src/hooks/sessionStart.ts +100 -0
  313. package/src/hooks/stop.ts +275 -0
  314. package/src/hooks/turnStart.ts +36 -0
  315. package/src/lib/applyPatch.ts +75 -0
  316. package/src/lib/audit.ts +265 -0
  317. package/src/lib/band.ts +49 -0
  318. package/src/lib/calibration.ts +35 -0
  319. package/src/lib/checkRunner.ts +124 -0
  320. package/src/lib/claude.ts +35 -0
  321. package/src/lib/compilePrompt.ts +67 -0
  322. package/src/lib/constants.ts +39 -0
  323. package/src/lib/coverage.ts +21 -0
  324. package/src/lib/credentials.ts +104 -0
  325. package/src/lib/diff.ts +209 -0
  326. package/src/lib/events.ts +34 -0
  327. package/src/lib/git.ts +206 -0
  328. package/src/lib/hookRunner.ts +55 -0
  329. package/src/lib/hosts.ts +112 -0
  330. package/src/lib/jev.ts +223 -0
  331. package/src/lib/lintConfig.ts +53 -0
  332. package/src/lib/loadRules.ts +39 -0
  333. package/src/lib/opencodePlugin.ts +38 -0
  334. package/src/lib/output.ts +44 -0
  335. package/src/lib/packageRoot.ts +48 -0
  336. package/src/lib/paths.ts +96 -0
  337. package/src/lib/reason.ts +46 -0
  338. package/src/lib/regularFile.ts +96 -0
  339. package/src/lib/replay.ts +314 -0
  340. package/src/lib/replayCodex.ts +130 -0
  341. package/src/lib/replayOpencode.ts +186 -0
  342. package/src/lib/rubricFile.ts +99 -0
  343. package/src/lib/scope.ts +18 -0
  344. package/src/lib/session.ts +223 -0
  345. package/src/lib/settings.ts +112 -0
  346. package/src/lib/sources.ts +154 -0
  347. package/src/lib/stdin.ts +23 -0
  348. package/src/lib/transcript.ts +49 -0
  349. package/src/lib/ui.ts +38 -0
  350. package/src/ui/components/Buckets.tsx +30 -0
  351. package/src/ui/components/Callout.tsx +26 -0
  352. package/src/ui/components/Checklist.tsx +29 -0
  353. package/src/ui/components/Columns.tsx +62 -0
  354. package/src/ui/components/Header.tsx +35 -0
  355. package/src/ui/components/Live.tsx +73 -0
  356. package/src/ui/components/RuleTable.tsx +94 -0
  357. package/src/ui/components/Section.tsx +24 -0
  358. package/src/ui/components/Verdicts.tsx +40 -0
  359. package/src/ui/render.tsx +51 -0
  360. package/src/ui/theme.ts +65 -0
  361. package/src/ui/views/AuditView.tsx +140 -0
  362. package/src/ui/views/BenchView.tsx +87 -0
  363. package/src/ui/views/CalibrateView.tsx +108 -0
  364. package/src/ui/views/CheckView.tsx +56 -0
  365. package/src/ui/views/ErrorView.tsx +32 -0
  366. package/src/ui/views/HelpView.tsx +51 -0
  367. package/src/ui/views/InitView.tsx +103 -0
  368. package/src/ui/views/ReplayView.tsx +100 -0
  369. package/src/ui/views/ReportView.tsx +225 -0
  370. package/src/ui/views/RubricView.tsx +82 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type Band, type Question, type Thresholds } from "@coldtea/abide-schema";
2
+ export type ModelAnswer = {
3
+ type: "boolean";
4
+ probability: number;
5
+ } | {
6
+ type: "choice";
7
+ choice: string;
8
+ probabilities?: Record<string, number>;
9
+ } | {
10
+ type: "score";
11
+ score: number;
12
+ probabilities?: Record<string, number>;
13
+ };
14
+ /** Probability that the rule is violated, whatever the question type. */
15
+ export declare const violationProbability: (question: Question, answer: ModelAnswer) => {
16
+ probability: number;
17
+ answer?: string;
18
+ };
19
+ export declare const bandFor: (probability: number, thresholds: Thresholds) => Band;
20
+ //# sourceMappingURL=band.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"band.d.ts","sourceRoot":"","sources":["../../src/lib/band.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAI7E,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,aACrB,QAAQ,UACV,WAAW,KAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAgCxC,CAAC;AAEF,eAAO,MAAM,OAAO,gBAAiB,MAAM,cAAc,UAAU,KAAG,IACqB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { assertNever } from "@coldtea/abide-schema";
2
+ const clamp01 = (n) => Math.min(1, Math.max(0, n));
3
+ /** Probability that the rule is violated, whatever the question type. */
4
+ export const violationProbability = (question, answer) => {
5
+ switch (question.type) {
6
+ case "boolean":
7
+ return answer.type === "boolean"
8
+ ? { probability: clamp01(answer.probability) }
9
+ : { probability: 0 };
10
+ case "choice": {
11
+ if (answer.type !== "choice")
12
+ return { probability: 0 };
13
+ const violating = new Set(question.violating);
14
+ if (answer.probabilities) {
15
+ const mass = Object.entries(answer.probabilities)
16
+ .filter(([name]) => violating.has(name))
17
+ .reduce((sum, [, p]) => sum + p, 0);
18
+ return { probability: clamp01(mass), answer: answer.choice };
19
+ }
20
+ return { probability: violating.has(answer.choice) ? 1 : 0, answer: answer.choice };
21
+ }
22
+ case "score": {
23
+ if (answer.type !== "score")
24
+ return { probability: 0 };
25
+ const level = Math.round(answer.score);
26
+ const label = question.criteria[level] ?? String(level);
27
+ if (answer.probabilities) {
28
+ const mass = Object.entries(answer.probabilities)
29
+ .filter(([index]) => Number(index) >= question.violatingFrom)
30
+ .reduce((sum, [, p]) => sum + p, 0);
31
+ return { probability: clamp01(mass), answer: label };
32
+ }
33
+ return { probability: answer.score >= question.violatingFrom ? 1 : 0, answer: label };
34
+ }
35
+ default:
36
+ return assertNever(question);
37
+ }
38
+ };
39
+ export const bandFor = (probability, thresholds) => probability >= thresholds.act ? "act" : probability >= thresholds.flag ? "flag" : "clear";
40
+ //# sourceMappingURL=band.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"band.js","sourceRoot":"","sources":["../../src/lib/band.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CalibrationVerdict, Thresholds } from "@coldtea/abide-schema";
2
+ export declare const MIN_CALIBRATION_STATES = 5;
3
+ export type CalibrationSummary = {
4
+ hunks: number;
5
+ median: number;
6
+ min: number;
7
+ max: number;
8
+ fired: number;
9
+ verdict: CalibrationVerdict;
10
+ };
11
+ /** Decisive rules answer near 0 or near 1 on real hunks. Weak ones sit in the middle. Noisy ones fire on most. */
12
+ export declare const summarizeCalibration: (probabilities: readonly number[], thresholds: Thresholds) => CalibrationSummary;
13
+ //# sourceMappingURL=calibration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration.d.ts","sourceRoot":"","sources":["../../src/lib/calibration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAG5E,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAMxC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAEF,kHAAkH;AAClH,eAAO,MAAM,oBAAoB,kBAChB,SAAS,MAAM,EAAE,cACpB,UAAU,KACrB,kBAYF,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { median } from "./ui.js";
2
+ export const MIN_CALIBRATION_STATES = 5;
3
+ /** Below this a "no" is confident. A rule whose median sits above it and whose max never reaches CLEAR_YES is dead. */
4
+ const CONFIDENT_NO = 0.25;
5
+ const CLEAR_YES = 0.7;
6
+ const NOISY_FIRE_RATE = 0.6;
7
+ /** Decisive rules answer near 0 or near 1 on real hunks. Weak ones sit in the middle. Noisy ones fire on most. */
8
+ export const summarizeCalibration = (probabilities, thresholds) => {
9
+ const n = probabilities.length;
10
+ const med = median(probabilities) ?? 0;
11
+ const min = n === 0 ? 0 : Math.min(...probabilities);
12
+ const max = n === 0 ? 0 : Math.max(...probabilities);
13
+ const fired = probabilities.filter((p) => p >= thresholds.act).length;
14
+ let verdict;
15
+ if (n < MIN_CALIBRATION_STATES)
16
+ verdict = "skipped";
17
+ else if (fired / n >= NOISY_FIRE_RATE)
18
+ verdict = "noisy";
19
+ else if (max < CLEAR_YES && med >= CONFIDENT_NO)
20
+ verdict = "weak";
21
+ else
22
+ verdict = "decisive";
23
+ return { hunks: n, median: med, min, max, fired, verdict };
24
+ };
25
+ //# sourceMappingURL=calibration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration.js","sourceRoot":"","sources":["../../src/lib/calibration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,uHAAuH;AACvH,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,eAAe,GAAG,GAAG,CAAC;AAW5B,kHAAkH;AAClH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,aAAgC,EAChC,UAAsB,EACF,EAAE;IACtB,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACtE,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC,GAAG,sBAAsB;QAAE,OAAO,GAAG,SAAS,CAAC;SAC/C,IAAI,KAAK,GAAG,CAAC,IAAI,eAAe;QAAE,OAAO,GAAG,OAAO,CAAC;SACpD,IAAI,GAAG,GAAG,SAAS,IAAI,GAAG,IAAI,YAAY;QAAE,OAAO,GAAG,MAAM,CAAC;;QAC7D,OAAO,GAAG,UAAU,CAAC;IAC1B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { CheckPhase, Rule, Thresholds, Usage, Verdict } from "@coldtea/abide-schema";
2
+ import type { FileDiff } from "./git.js";
3
+ import { type ModelRule } from "./jev.js";
4
+ export type CheckRequest = {
5
+ phase: CheckPhase;
6
+ /** The change, one entry per touched file, paths repo-relative. */
7
+ fileDiffs: readonly FileDiff[];
8
+ task?: string;
9
+ rules: readonly Rule[];
10
+ thresholds: Thresholds;
11
+ timeoutMs: number;
12
+ /** Transient gateway failures to retry. Hooks leave it at zero. */
13
+ retries?: number;
14
+ };
15
+ export type CheckOutcome = {
16
+ verdicts: Verdict[];
17
+ modelRules: ModelRule[];
18
+ /** How many model calls the check took: one per distinct set of in-scope files. */
19
+ calls: number;
20
+ usage: Usage;
21
+ modelLatencyMs: number;
22
+ };
23
+ /** Rules that are active, belong to this phase, and apply to at least one touched file. */
24
+ export declare const selectRules: (rules: readonly Rule[], phase: CheckPhase, files: readonly string[]) => Rule[];
25
+ /** Rules grouped by the files each one applies to, so no rule ever sees a file outside its scope. */
26
+ export declare const groupByScope: (rules: readonly ModelRule[], fileDiffs: readonly FileDiff[]) => {
27
+ rules: ModelRule[];
28
+ fileDiffs: FileDiff[];
29
+ }[];
30
+ /** One verdict per rule: the loudest. */
31
+ export declare const loudestVerdicts: (verdicts: readonly Verdict[]) => Verdict[];
32
+ export declare const mergeOutcomes: (outcomes: readonly CheckOutcome[]) => CheckOutcome;
33
+ export declare const runCheck: (request: CheckRequest) => Promise<CheckOutcome>;
34
+ //# sourceMappingURL=checkRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkRunner.d.ts","sourceRoot":"","sources":["../../src/lib/checkRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAGvE,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,mEAAmE;IACnE,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAMF,2FAA2F;AAC3F,eAAO,MAAM,WAAW,UACf,SAAS,IAAI,EAAE,SACf,UAAU,SACV,SAAS,MAAM,EAAE,KACvB,IAAI,EACwF,CAAC;AAKhG,qGAAqG;AACrG,eAAO,MAAM,YAAY,UAChB,SAAS,SAAS,EAAE,aAChB,SAAS,QAAQ,EAAE,KAC7B;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,EAW/C,CAAC;AAQF,yCAAyC;AACzC,eAAO,MAAM,eAAe,aAAc,SAAS,OAAO,EAAE,KAAG,OAAO,EAOrE,CAAC;AAEF,eAAO,MAAM,aAAa,aAAc,SAAS,YAAY,EAAE,KAAG,YAYjE,CAAC;AAEF,eAAO,MAAM,QAAQ,YAAmB,YAAY,KAAG,OAAO,CAAC,YAAY,CAmC1E,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { checkWithModel, isModelRule } from "./jev.js";
2
+ import { ruleAppliesTo } from "./scope.js";
3
+ /** Only model rules run. A lint-shaped rule is the linter's to enforce, and abide only reports it. */
4
+ const runsInPhase = (rule, phase) => rule.status === "active" && rule.check.type === "model" && rule.when === phase;
5
+ /** Rules that are active, belong to this phase, and apply to at least one touched file. */
6
+ export const selectRules = (rules, phase, files) => rules.filter((rule) => runsInPhase(rule, phase) && files.some((f) => ruleAppliesTo(rule, f)));
7
+ const renderFiles = (fileDiffs) => fileDiffs.map((f) => `--- a/${f.file}\n+++ b/${f.file}\n${f.text}`).join("\n");
8
+ /** Rules grouped by the files each one applies to, so no rule ever sees a file outside its scope. */
9
+ export const groupByScope = (rules, fileDiffs) => {
10
+ const groups = new Map();
11
+ for (const rule of rules) {
12
+ const inScope = fileDiffs.filter((f) => ruleAppliesTo(rule, f.file));
13
+ if (inScope.length === 0)
14
+ continue;
15
+ const key = inScope.map((f) => f.file).join("\n");
16
+ const group = groups.get(key) ?? { rules: [], fileDiffs: inScope };
17
+ group.rules.push(rule);
18
+ groups.set(key, group);
19
+ }
20
+ return [...groups.values()];
21
+ };
22
+ const addUsage = (a, b) => ({
23
+ inputTokens: (a.inputTokens ?? 0) + (b.inputTokens ?? 0),
24
+ outputTokens: (a.outputTokens ?? 0) + (b.outputTokens ?? 0),
25
+ costUsd: (a.costUsd ?? 0) + (b.costUsd ?? 0),
26
+ });
27
+ /** One verdict per rule: the loudest. */
28
+ export const loudestVerdicts = (verdicts) => {
29
+ const best = new Map();
30
+ for (const v of verdicts) {
31
+ const have = best.get(v.ruleId);
32
+ if (have === undefined || v.probability > have.probability)
33
+ best.set(v.ruleId, v);
34
+ }
35
+ return [...best.values()];
36
+ };
37
+ export const mergeOutcomes = (outcomes) => {
38
+ const modelRules = [];
39
+ for (const o of outcomes) {
40
+ for (const rule of o.modelRules)
41
+ if (!modelRules.includes(rule))
42
+ modelRules.push(rule);
43
+ }
44
+ return {
45
+ verdicts: loudestVerdicts(outcomes.flatMap((o) => o.verdicts)),
46
+ modelRules,
47
+ calls: outcomes.reduce((sum, o) => sum + o.calls, 0),
48
+ usage: outcomes.reduce((sum, o) => addUsage(sum, o.usage), {}),
49
+ modelLatencyMs: Math.max(0, ...outcomes.map((o) => o.modelLatencyMs)),
50
+ };
51
+ };
52
+ export const runCheck = async (request) => {
53
+ const files = request.fileDiffs.map((f) => f.file);
54
+ const modelRules = selectRules(request.rules, request.phase, files).filter(isModelRule);
55
+ const groups = groupByScope(modelRules, request.fileDiffs);
56
+ if (groups.length === 0) {
57
+ return { verdicts: [], modelRules, calls: 0, usage: {}, modelLatencyMs: 0 };
58
+ }
59
+ const started = performance.now();
60
+ const results = await Promise.all(groups.map((group) => checkWithModel(group.rules, {
61
+ ...(request.task === undefined ? {} : { task: request.task }),
62
+ ...(request.phase === "edit" &&
63
+ group.fileDiffs.length === 1 &&
64
+ group.fileDiffs[0] !== undefined
65
+ ? { file: group.fileDiffs[0].file, diff: group.fileDiffs[0].text }
66
+ : { files: group.fileDiffs.map((f) => f.file), diff: renderFiles(group.fileDiffs) }),
67
+ }, request.thresholds, request.timeoutMs, request.retries ?? 0)));
68
+ return {
69
+ verdicts: results.flatMap((r) => r.verdicts),
70
+ modelRules,
71
+ calls: groups.length,
72
+ usage: results.reduce((sum, r) => addUsage(sum, r.usage), {}),
73
+ modelLatencyMs: Math.round(performance.now() - started),
74
+ };
75
+ };
76
+ //# sourceMappingURL=checkRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkRunner.js","sourceRoot":"","sources":["../../src/lib/checkRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const claudeAvailable: () => boolean;
2
+ /** Runs one headless Claude Code turn in the repo and streams its output. */
3
+ export declare const runClaude: (root: string, prompt: string) => Promise<number>;
4
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/lib/claude.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,QAAO,OACoC,CAAC;AAExE,6EAA6E;AAC7E,eAAO,MAAM,SAAS,SAAU,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAyBnE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { globalAbideDir } from "./paths.js";
4
+ import { discoverGlobalSources } from "./sources.js";
5
+ export const claudeAvailable = () => spawnSync("claude", ["--version"], { encoding: "utf8" }).status === 0;
6
+ /** Runs one headless Claude Code turn in the repo and streams its output. */
7
+ export const runClaude = (root, prompt) => new Promise((resolve) => {
8
+ const extraDirs = [
9
+ globalAbideDir(),
10
+ ...discoverGlobalSources().map((s) => path.dirname(s.absolute)),
11
+ ];
12
+ const child = spawn("claude", [
13
+ "-p",
14
+ prompt,
15
+ "--permission-mode",
16
+ "acceptEdits",
17
+ "--allowedTools",
18
+ "Bash(node *)",
19
+ "Bash(abide *)",
20
+ "--add-dir",
21
+ ...extraDirs,
22
+ "--output-format",
23
+ "text",
24
+ ], { cwd: root, stdio: "inherit" });
25
+ child.on("exit", (code) => resolve(code ?? 1));
26
+ child.on("error", () => resolve(1));
27
+ });
28
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/lib/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE,CAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAExE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,MAAc,EAAmB,EAAE,CACzE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,MAAM,SAAS,GAAG;QAChB,cAAc,EAAE;QAChB,GAAG,qBAAqB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;KAChE,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CACjB,QAAQ,EACR;QACE,IAAI;QACJ,MAAM;QACN,mBAAmB;QACnB,aAAa;QACb,gBAAgB;QAChB,cAAc;QACd,eAAe;QACf,WAAW;QACX,GAAG,SAAS;QACZ,iBAAiB;QACjB,MAAM;KACP,EACD,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAChC,CAAC;IACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Rubric } from "@coldtea/abide-schema";
2
+ import { type SourceCandidate, type Staleness } from "./sources.js";
3
+ export type CompileTarget = {
4
+ which: "project" | "global";
5
+ root: string;
6
+ candidates: SourceCandidate[];
7
+ staleness: Staleness;
8
+ lintConfigs: string[];
9
+ };
10
+ export type TuneStats = {
11
+ rule: string;
12
+ status: string;
13
+ median: number | undefined;
14
+ fired: number;
15
+ checks: number;
16
+ };
17
+ /** The text SessionStart hands the agent, and what `abide compile` sends headless. */
18
+ export declare const compilePrompt: (skillPath: string, targets: readonly CompileTarget[], tune?: {
19
+ rubric: Rubric;
20
+ stats: TuneStats[];
21
+ }) => string;
22
+ //# sourceMappingURL=compilePrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compilePrompt.d.ts","sourceRoot":"","sources":["../../src/lib/compilePrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAiBF,sFAAsF;AACtF,eAAO,MAAM,aAAa,cACb,MAAM,WACR,SAAS,aAAa,EAAE,SAC1B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,KAC5C,MAyBF,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { binScriptPath } from "./packageRoot.js";
2
+ import { globalRubricPath, rubricPath } from "./paths.js";
3
+ import { describeStaleness } from "./sources.js";
4
+ const sourceLine = (c) => `${c.path} (rules apply to ${c.scope}${c.required ? "" : "; include only if it carries imperative rules"})`;
5
+ const targetBlock = (t) => {
6
+ const file = t.which === "project" ? rubricPath(t.root) : globalRubricPath();
7
+ const lines = [
8
+ `${t.which === "project" ? "Project" : "Global"} rubric: ${file} (${describeStaleness(t.staleness)})`,
9
+ ` repo root: ${t.root}`,
10
+ ...t.candidates.map((c) => ` source: ${sourceLine(c)}`),
11
+ ];
12
+ if (t.lintConfigs.length > 0)
13
+ lines.push(` lint config to read for overlaps: ${t.lintConfigs.join(", ")}`);
14
+ return lines.join("\n");
15
+ };
16
+ /** The text SessionStart hands the agent, and what `abide compile` sends headless. */
17
+ export const compilePrompt = (skillPath, targets, tune) => {
18
+ const head = tune === undefined
19
+ ? "Abide is installed here and its rubric is missing or out of date. Compile it before you start on the user's request."
20
+ : "Abide is installed here. Some rules in its rubric never fire or fire on everything. Rewrite those rules before you start on the user's request.";
21
+ const parts = [
22
+ head,
23
+ `Read ${skillPath} and follow it to the end. Do not skip the validate and calibrate steps.`,
24
+ `Run the abide CLI as: node "${binScriptPath()}" <command>`,
25
+ ...targets.map(targetBlock),
26
+ ];
27
+ if (tune !== undefined) {
28
+ parts.push("Calibration and firing statistics per rule (median violation probability across recent real hunks, how often it fired, how many checks it saw):", ...tune.stats.map((s) => ` ${s.rule}: status ${s.status}, median ${s.median === undefined ? "n/a" : s.median.toFixed(2)}, fired ${s.fired} of ${s.checks}`), "A rule stuck between 0.3 and 0.7 is underspecified: split it, name the concrete shape it should catch, or add a criteria example. A rule that fires on most hunks is too broad: narrow its scope or its wording. Keep every other rule exactly as it is.");
29
+ }
30
+ parts.push("When you are done, tell the user in two or three plain sentences how many rules were compiled into which buckets and which rules, if any, came out weak or noisy. Then continue with their request.");
31
+ return parts.join("\n\n");
32
+ };
33
+ //# sourceMappingURL=compilePrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compilePrompt.js","sourceRoot":"","sources":["../../src/lib/compilePrompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAwC,MAAM,cAAc,CAAC;AAkBvF,MAAM,UAAU,GAAG,CAAC,CAAkB,EAAU,EAAE,CAChD,GAAG,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,+CAA+C,GAAG,CAAC;AAE9G,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAU,EAAE;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,YAAY,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;QACrG,gBAAgB,CAAC,CAAC,IAAI,EAAE;QACxB,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;IACF,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAAiB,EACjB,OAAiC,EACjC,IAA6C,EACrC,EAAE;IACV,MAAM,IAAI,GACR,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,sHAAsH;QACxH,CAAC,CAAC,iJAAiJ,CAAC;IACxJ,MAAM,KAAK,GAAG;QACZ,IAAI;QACJ,QAAQ,SAAS,0EAA0E;QAC3F,+BAA+B,aAAa,EAAE,aAAa;QAC3D,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KAC5B,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,iJAAiJ,EACjJ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CACf,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CACrI,EACD,0PAA0P,CAC3P,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CACR,qMAAqM,CACtM,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /** Jev, called directly with a TypeSafe key, or through the Vercel AI Gateway with a gateway key. */
2
+ export declare const TYPESAFE_MODEL_ID = "jev-latest";
3
+ export declare const GATEWAY_MODEL_ID = "typesafe-ai/jev";
4
+ export declare const TYPESAFE_KEY_ENV = "TYPESAFE_AI_API_KEY";
5
+ export declare const GATEWAY_KEY_ENV = "AI_GATEWAY_API_KEY";
6
+ /** List price observed 2026-09-17: $0.042 per million input tokens, output free. */
7
+ export declare const JEV_USD_PER_INPUT_TOKEN: number;
8
+ export declare const EDIT_CHECK_TIMEOUT_MS = 8000;
9
+ export declare const TURN_CHECK_TIMEOUT_MS = 15000;
10
+ export declare const STDIN_TIMEOUT_MS = 2000;
11
+ /** Largest diff sent as state. Beyond this the diff is cut and marked. */
12
+ export declare const MAX_STATE_CHARS = 24000;
13
+ export declare const MAX_TASK_CHARS = 600;
14
+ /** How many times one rule may block the same file within one turn before it only flags. */
15
+ export declare const MAX_BLOCKS_PER_RULE_PER_TURN = 2;
16
+ /** How many Stop checks one turn gets: the first, plus one re-check after a repair. */
17
+ export declare const MAX_STOP_CHECKS_PER_TURN = 2;
18
+ export declare const SESSION_STATE_MAX_AGE_MS: number;
19
+ /** How long a single git call may run before it is killed. Well under every hook budget. */
20
+ export declare const GIT_TIMEOUT_MS = 5000;
21
+ /** How long turn-start may spend snapshotting the working tree with git, all calls together. */
22
+ export declare const TURN_START_TIMEOUT_MS = 5000;
23
+ /** How long Stop may spend on its own snapshot and the diff against the baseline. */
24
+ export declare const STOP_GIT_TIMEOUT_MS = 8000;
25
+ /** How long computing one diff may take. Past this the check is skipped and logged rather than the hook held. */
26
+ export declare const DIFF_TIMEOUT_MS = 2000;
27
+ /** Largest before-plus-after text a diff is attempted on at all. */
28
+ export declare const MAX_DIFF_INPUT_CHARS = 1000000;
29
+ /** Past this a file counts as unreadable. */
30
+ export declare const MAX_FILE_READ_BYTES: number;
31
+ /** How long Stop's per-file fallback may spend on all of its diffs together. */
32
+ export declare const STOP_FALLBACK_DIFF_TIMEOUT_MS = 6000;
33
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AACtD,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,QAAoB,CAAC;AAEzD,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AAEtC,0EAA0E;AAC1E,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,4FAA4F;AAC5F,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,uFAAuF;AACvF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,wBAAwB,QAA0B,CAAC;AAEhE,4FAA4F;AAC5F,eAAO,MAAM,cAAc,OAAQ,CAAC;AACpC,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC,iHAAiH;AACjH,eAAO,MAAM,eAAe,OAAQ,CAAC;AACrC,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,UAAY,CAAC;AAC9C,6CAA6C;AAC7C,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AACpD,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,OAAQ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /** Jev, called directly with a TypeSafe key, or through the Vercel AI Gateway with a gateway key. */
2
+ export const TYPESAFE_MODEL_ID = "jev-latest";
3
+ export const GATEWAY_MODEL_ID = "typesafe-ai/jev";
4
+ export const TYPESAFE_KEY_ENV = "TYPESAFE_AI_API_KEY";
5
+ export const GATEWAY_KEY_ENV = "AI_GATEWAY_API_KEY";
6
+ /** List price observed 2026-09-17: $0.042 per million input tokens, output free. */
7
+ export const JEV_USD_PER_INPUT_TOKEN = 0.042 / 1_000_000;
8
+ export const EDIT_CHECK_TIMEOUT_MS = 8_000;
9
+ export const TURN_CHECK_TIMEOUT_MS = 15_000;
10
+ export const STDIN_TIMEOUT_MS = 2_000;
11
+ /** Largest diff sent as state. Beyond this the diff is cut and marked. */
12
+ export const MAX_STATE_CHARS = 24_000;
13
+ export const MAX_TASK_CHARS = 600;
14
+ /** How many times one rule may block the same file within one turn before it only flags. */
15
+ export const MAX_BLOCKS_PER_RULE_PER_TURN = 2;
16
+ /** How many Stop checks one turn gets: the first, plus one re-check after a repair. */
17
+ export const MAX_STOP_CHECKS_PER_TURN = 2;
18
+ export const SESSION_STATE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
19
+ /** How long a single git call may run before it is killed. Well under every hook budget. */
20
+ export const GIT_TIMEOUT_MS = 5_000;
21
+ /** How long turn-start may spend snapshotting the working tree with git, all calls together. */
22
+ export const TURN_START_TIMEOUT_MS = 5_000;
23
+ /** How long Stop may spend on its own snapshot and the diff against the baseline. */
24
+ export const STOP_GIT_TIMEOUT_MS = 8_000;
25
+ /** How long computing one diff may take. Past this the check is skipped and logged rather than the hook held. */
26
+ export const DIFF_TIMEOUT_MS = 2_000;
27
+ /** Largest before-plus-after text a diff is attempted on at all. */
28
+ export const MAX_DIFF_INPUT_CHARS = 1_000_000;
29
+ /** Past this a file counts as unreadable. */
30
+ export const MAX_FILE_READ_BYTES = 16 * 1024 * 1024;
31
+ /** How long Stop's per-file fallback may spend on all of its diffs together. */
32
+ export const STOP_FALLBACK_DIFF_TIMEOUT_MS = 6_000;
33
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,uFAAuF;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhE,4FAA4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AACpC,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC,iHAAiH;AACjH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAC9C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,gFAAgF;AAChF,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CheckedEdit } from "./session.js";
2
+ /**
3
+ * Judged edits must chain from the turn's start content to the disk now.
4
+ * A change made by a shell, or while a judge was looking, breaks the chain.
5
+ */
6
+ export declare const editsCoverFile: (start: string | null, edits: readonly CheckedEdit[], now: string) => boolean;
7
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/lib/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,cAAc,UAClB,MAAM,GAAG,IAAI,SACb,SAAS,WAAW,EAAE,OACxB,MAAM,KACV,OAUF,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Judged edits must chain from the turn's start content to the disk now.
3
+ * A change made by a shell, or while a judge was looking, breaks the chain.
4
+ */
5
+ export const editsCoverFile = (start, edits, now) => {
6
+ const unused = [...edits];
7
+ let at = start;
8
+ while (at !== now) {
9
+ const index = unused.findIndex((e) => e.before === at);
10
+ const next = index === -1 ? undefined : unused.splice(index, 1)[0];
11
+ if (next === undefined)
12
+ return false;
13
+ at = next.after;
14
+ }
15
+ return true;
16
+ };
17
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/lib/coverage.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAoB,EACpB,KAA6B,EAC7B,GAAW,EACF,EAAE;IACX,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,OAAO,EAAE,KAAK,GAAG,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACrC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Which key abide has, and where it goes. A TypeSafe key talks to Jev
3
+ * directly; a gateway key goes through the user's Vercel AI Gateway.
4
+ */
5
+ export type Credentials = {
6
+ kind: "typesafe";
7
+ key: string;
8
+ from: string;
9
+ } | {
10
+ kind: "gateway";
11
+ key: string;
12
+ from: string;
13
+ } | {
14
+ kind: "none";
15
+ };
16
+ export declare const KEY_NAMES: readonly string[];
17
+ export declare const userEnvPath: () => string;
18
+ /** Only the two abide keys are read from a file; nothing else in it is touched or loaded. */
19
+ export declare const parseEnvFile: (text: string) => Map<string, string>;
20
+ export declare const findCredentials: (root: string) => Credentials;
21
+ export declare const resolveCredentials: (root: string) => Credentials;
22
+ export declare const credentials: () => Credentials;
23
+ export declare const hasApiKey: (root: string) => boolean;
24
+ /** The one file abide may write a key to; see AGENTS.md. */
25
+ export declare const saveUserKey: (name: string, key: string) => string;
26
+ export declare const NO_KEY_HINT = "No API key found. Run \"abide login\" with your TypeSafe key, or put TYPESAFE_AI_API_KEY in the environment or a .env file at the repo root.";
27
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAwC,CAAC;AAEhF,eAAO,MAAM,WAAW,QAAO,MAA6C,CAAC;AAE7E,6FAA6F;AAC7F,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAmB7D,CAAC;AAwBF,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,WAY9C,CAAC;AAIF,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,WAGjD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,WAG9B,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,OAAmD,CAAC;AAE7F,4DAA4D;AAC5D,eAAO,MAAM,WAAW,SAAU,MAAM,OAAO,MAAM,KAAG,MASvD,CAAC;AAEF,eAAO,MAAM,WAAW,iJAA+I,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { chmodSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { GATEWAY_KEY_ENV, TYPESAFE_KEY_ENV } from "./constants.js";
4
+ import { globalAbideDir } from "./paths.js";
5
+ import { readRegularText } from "./regularFile.js";
6
+ export const KEY_NAMES = [TYPESAFE_KEY_ENV, GATEWAY_KEY_ENV];
7
+ export const userEnvPath = () => path.join(globalAbideDir(), ".env");
8
+ /** Only the two abide keys are read from a file; nothing else in it is touched or loaded. */
9
+ export const parseEnvFile = (text) => {
10
+ const found = new Map();
11
+ for (const raw of text.split("\n")) {
12
+ const line = raw.trim();
13
+ if (line === "" || line.startsWith("#"))
14
+ continue;
15
+ const m = /^(?:export\s+)?([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/.exec(line);
16
+ if (m === null)
17
+ continue;
18
+ const name = m[1];
19
+ let value = (m[2] ?? "").trim();
20
+ if (name === undefined || !KEY_NAMES.includes(name))
21
+ continue;
22
+ if ((value.startsWith('"') && value.endsWith('"')) ||
23
+ (value.startsWith("'") && value.endsWith("'"))) {
24
+ value = value.slice(1, -1);
25
+ }
26
+ if (value !== "")
27
+ found.set(name, value);
28
+ }
29
+ return found;
30
+ };
31
+ const readEnvFile = (file) => {
32
+ const text = readRegularText(file);
33
+ return text === undefined ? new Map() : parseEnvFile(text);
34
+ };
35
+ const pick = (vars, from) => {
36
+ const typesafe = vars.get(TYPESAFE_KEY_ENV);
37
+ if (typesafe !== undefined)
38
+ return { kind: "typesafe", key: typesafe, from };
39
+ const gateway = vars.get(GATEWAY_KEY_ENV);
40
+ if (gateway !== undefined)
41
+ return { kind: "gateway", key: gateway, from };
42
+ return { kind: "none" };
43
+ };
44
+ const fromProcessEnv = () => {
45
+ const vars = new Map();
46
+ for (const name of KEY_NAMES) {
47
+ const value = (process.env[name] ?? "").trim();
48
+ if (value !== "")
49
+ vars.set(name, value);
50
+ }
51
+ return vars;
52
+ };
53
+ export const findCredentials = (root) => {
54
+ const places = [
55
+ ["the environment", fromProcessEnv],
56
+ [".env.local", () => readEnvFile(path.join(root, ".env.local"))],
57
+ [".env", () => readEnvFile(path.join(root, ".env"))],
58
+ [userEnvPath(), () => readEnvFile(userEnvPath())],
59
+ ];
60
+ for (const [from, read] of places) {
61
+ const picked = pick(read(), from);
62
+ if (picked.kind !== "none")
63
+ return picked;
64
+ }
65
+ return { kind: "none" };
66
+ };
67
+ let current;
68
+ export const resolveCredentials = (root) => {
69
+ current ??= findCredentials(root);
70
+ return current;
71
+ };
72
+ export const credentials = () => {
73
+ current ??= pick(fromProcessEnv(), "the environment");
74
+ return current;
75
+ };
76
+ export const hasApiKey = (root) => resolveCredentials(root).kind !== "none";
77
+ /** The one file abide may write a key to; see AGENTS.md. */
78
+ export const saveUserKey = (name, key) => {
79
+ const file = userEnvPath();
80
+ mkdirSync(path.dirname(file), { recursive: true });
81
+ const existing = readEnvFile(file);
82
+ existing.set(name, key);
83
+ const body = [...existing.entries()].map(([k, v]) => `${k}=${v}`).join("\n");
84
+ writeFileSync(file, `${body}\n`, { mode: 0o600 });
85
+ chmodSync(file, 0o600);
86
+ return file;
87
+ };
88
+ export const NO_KEY_HINT = `No API key found. Run "abide login" with your TypeSafe key, or put ${TYPESAFE_KEY_ENV} in the environment or a .env file at the repo root.`;
89
+ //# sourceMappingURL=credentials.js.map