@nanonets/graft 0.21.1 → 0.22.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 (389) hide show
  1. package/README.md +549 -314
  2. package/dist/app/checkout.d.ts +0 -32
  3. package/dist/app/checkout.d.ts.map +1 -1
  4. package/dist/app/checkout.js +0 -45
  5. package/dist/app/checkout.js.map +1 -1
  6. package/dist/app/identity.d.ts +0 -56
  7. package/dist/app/identity.d.ts.map +1 -1
  8. package/dist/app/identity.js +0 -119
  9. package/dist/app/identity.js.map +1 -1
  10. package/dist/app/main.js +0 -8
  11. package/dist/app/main.js.map +1 -1
  12. package/dist/app/review-process.d.ts.map +1 -1
  13. package/dist/app/review-process.js +6 -5
  14. package/dist/app/review-process.js.map +1 -1
  15. package/dist/app/server.d.ts +0 -20
  16. package/dist/app/server.d.ts.map +1 -1
  17. package/dist/app/server.js +0 -121
  18. package/dist/app/server.js.map +1 -1
  19. package/dist/ask/ask.d.ts +12 -6
  20. package/dist/ask/ask.d.ts.map +1 -1
  21. package/dist/ask/ask.js +28 -38
  22. package/dist/ask/ask.js.map +1 -1
  23. package/dist/bin/graft.d.ts +3 -0
  24. package/dist/bin/graft.d.ts.map +1 -0
  25. package/dist/bin/graft.js +8 -0
  26. package/dist/bin/graft.js.map +1 -0
  27. package/dist/bin/trail.d.ts +3 -0
  28. package/dist/bin/trail.d.ts.map +1 -0
  29. package/dist/bin/trail.js +6 -0
  30. package/dist/bin/trail.js.map +1 -0
  31. package/dist/blast/blast-cli.d.ts.map +1 -1
  32. package/dist/blast/blast-cli.js +2 -1
  33. package/dist/blast/blast-cli.js.map +1 -1
  34. package/dist/blast/render.d.ts.map +1 -1
  35. package/dist/blast/render.js +3 -2
  36. package/dist/blast/render.js.map +1 -1
  37. package/dist/brand.d.ts +97 -0
  38. package/dist/brand.d.ts.map +1 -0
  39. package/dist/brand.js +254 -0
  40. package/dist/brand.js.map +1 -0
  41. package/dist/check/learning-edits.d.ts +9 -0
  42. package/dist/check/learning-edits.d.ts.map +1 -0
  43. package/dist/check/learning-edits.js +62 -0
  44. package/dist/check/learning-edits.js.map +1 -0
  45. package/dist/check/local-check.d.ts +104 -0
  46. package/dist/check/local-check.d.ts.map +1 -0
  47. package/dist/check/local-check.js +830 -0
  48. package/dist/check/local-check.js.map +1 -0
  49. package/dist/check/types.d.ts +31 -0
  50. package/dist/check/types.d.ts.map +1 -0
  51. package/dist/check/types.js +2 -0
  52. package/dist/check/types.js.map +1 -0
  53. package/dist/claude/format.d.ts +44 -1
  54. package/dist/claude/format.d.ts.map +1 -1
  55. package/dist/claude/format.js +113 -19
  56. package/dist/claude/format.js.map +1 -1
  57. package/dist/claude/hook-layers.d.ts +8 -0
  58. package/dist/claude/hook-layers.d.ts.map +1 -0
  59. package/dist/claude/hook-layers.js +72 -0
  60. package/dist/claude/hook-layers.js.map +1 -0
  61. package/dist/claude/hooks.d.ts +34 -0
  62. package/dist/claude/hooks.d.ts.map +1 -1
  63. package/dist/claude/hooks.js +220 -12
  64. package/dist/claude/hooks.js.map +1 -1
  65. package/dist/claude/init.d.ts +12 -1
  66. package/dist/claude/init.d.ts.map +1 -1
  67. package/dist/claude/init.js +48 -19
  68. package/dist/claude/init.js.map +1 -1
  69. package/dist/claude/session-metrics.d.ts +1 -1
  70. package/dist/claude/session-metrics.d.ts.map +1 -1
  71. package/dist/claude/session-metrics.js +11 -8
  72. package/dist/claude/session-metrics.js.map +1 -1
  73. package/dist/claude/settings-merge.d.ts +1 -0
  74. package/dist/claude/settings-merge.d.ts.map +1 -1
  75. package/dist/claude/settings-merge.js +21 -18
  76. package/dist/claude/settings-merge.js.map +1 -1
  77. package/dist/claude/shim-template.d.ts +17 -2
  78. package/dist/claude/shim-template.d.ts.map +1 -1
  79. package/dist/claude/shim-template.js +153 -23
  80. package/dist/claude/shim-template.js.map +1 -1
  81. package/dist/claude/skill-template.d.ts +10 -1
  82. package/dist/claude/skill-template.d.ts.map +1 -1
  83. package/dist/claude/skill-template.js +143 -1
  84. package/dist/claude/skill-template.js.map +1 -1
  85. package/dist/claude/state.d.ts +8 -0
  86. package/dist/claude/state.d.ts.map +1 -1
  87. package/dist/claude/state.js.map +1 -1
  88. package/dist/claude/statusline.d.ts.map +1 -1
  89. package/dist/claude/statusline.js +4 -1
  90. package/dist/claude/statusline.js.map +1 -1
  91. package/dist/claude/tally.js +1 -1
  92. package/dist/claude/tally.js.map +1 -1
  93. package/dist/cli-epilogue.d.ts +0 -6
  94. package/dist/cli-epilogue.d.ts.map +1 -1
  95. package/dist/cli-epilogue.js +5 -4
  96. package/dist/cli-epilogue.js.map +1 -1
  97. package/dist/cli-meta.d.ts +8 -0
  98. package/dist/cli-meta.d.ts.map +1 -1
  99. package/dist/cli-meta.js +28 -8
  100. package/dist/cli-meta.js.map +1 -1
  101. package/dist/cli-picker.d.ts +15 -0
  102. package/dist/cli-picker.d.ts.map +1 -1
  103. package/dist/cli-picker.js +44 -10
  104. package/dist/cli-picker.js.map +1 -1
  105. package/dist/cli.d.ts +0 -5
  106. package/dist/cli.d.ts.map +1 -1
  107. package/dist/cli.js +1112 -559
  108. package/dist/cli.js.map +1 -1
  109. package/dist/cloud/diff.d.ts +20 -0
  110. package/dist/cloud/diff.d.ts.map +1 -0
  111. package/dist/cloud/diff.js +59 -0
  112. package/dist/cloud/diff.js.map +1 -0
  113. package/dist/cloud/nudge.d.ts +66 -0
  114. package/dist/cloud/nudge.d.ts.map +1 -0
  115. package/dist/cloud/nudge.js +269 -0
  116. package/dist/cloud/nudge.js.map +1 -0
  117. package/dist/cloud/workspace-sync.d.ts +58 -0
  118. package/dist/cloud/workspace-sync.d.ts.map +1 -0
  119. package/dist/cloud/workspace-sync.js +268 -0
  120. package/dist/cloud/workspace-sync.js.map +1 -0
  121. package/dist/cloud/workspace.d.ts +159 -0
  122. package/dist/cloud/workspace.d.ts.map +1 -0
  123. package/dist/cloud/workspace.js +134 -0
  124. package/dist/cloud/workspace.js.map +1 -0
  125. package/dist/context/check.d.ts +1 -1
  126. package/dist/context/check.d.ts.map +1 -1
  127. package/dist/context/check.js +9 -8
  128. package/dist/context/check.js.map +1 -1
  129. package/dist/context/node-file.js +1 -1
  130. package/dist/context/node-file.js.map +1 -1
  131. package/dist/context/savings.d.ts.map +1 -1
  132. package/dist/context/savings.js +10 -7
  133. package/dist/context/savings.js.map +1 -1
  134. package/dist/engine.d.ts.map +1 -1
  135. package/dist/engine.js +3 -1
  136. package/dist/engine.js.map +1 -1
  137. package/dist/graph/build.d.ts +30 -0
  138. package/dist/graph/build.d.ts.map +1 -1
  139. package/dist/graph/build.js +65 -19
  140. package/dist/graph/build.js.map +1 -1
  141. package/dist/graph/cards.d.ts.map +1 -1
  142. package/dist/graph/cards.js +4 -2
  143. package/dist/graph/cards.js.map +1 -1
  144. package/dist/graph/check.d.ts.map +1 -1
  145. package/dist/graph/check.js +17 -18
  146. package/dist/graph/check.js.map +1 -1
  147. package/dist/graph/container.d.ts.map +1 -1
  148. package/dist/graph/container.js +7 -2
  149. package/dist/graph/container.js.map +1 -1
  150. package/dist/graph/extract-cache.d.ts +4 -0
  151. package/dist/graph/extract-cache.d.ts.map +1 -1
  152. package/dist/graph/extract-cache.js.map +1 -1
  153. package/dist/graph/extract.d.ts +2 -0
  154. package/dist/graph/extract.d.ts.map +1 -1
  155. package/dist/graph/extract.js +5 -32
  156. package/dist/graph/extract.js.map +1 -1
  157. package/dist/graph/generic.d.ts +7 -1
  158. package/dist/graph/generic.d.ts.map +1 -1
  159. package/dist/graph/generic.js +48 -8
  160. package/dist/graph/generic.js.map +1 -1
  161. package/dist/graph/native.d.ts +38 -0
  162. package/dist/graph/native.d.ts.map +1 -0
  163. package/dist/graph/native.js +169 -0
  164. package/dist/graph/native.js.map +1 -0
  165. package/dist/graph/refresh.d.ts.map +1 -1
  166. package/dist/graph/refresh.js +3 -2
  167. package/dist/graph/refresh.js.map +1 -1
  168. package/dist/graph/traverse-cli.d.ts.map +1 -1
  169. package/dist/graph/traverse-cli.js +4 -3
  170. package/dist/graph/traverse-cli.js.map +1 -1
  171. package/dist/graph/workspace-cli.d.ts +2 -0
  172. package/dist/graph/workspace-cli.d.ts.map +1 -1
  173. package/dist/graph/workspace-cli.js +13 -1
  174. package/dist/graph/workspace-cli.js.map +1 -1
  175. package/dist/graph/workspace.d.ts.map +1 -1
  176. package/dist/graph/workspace.js +6 -5
  177. package/dist/graph/workspace.js.map +1 -1
  178. package/dist/hosts/antigravity.d.ts +10 -3
  179. package/dist/hosts/antigravity.d.ts.map +1 -1
  180. package/dist/hosts/antigravity.js +27 -10
  181. package/dist/hosts/antigravity.js.map +1 -1
  182. package/dist/hosts/claude-global.d.ts +27 -4
  183. package/dist/hosts/claude-global.d.ts.map +1 -1
  184. package/dist/hosts/claude-global.js +90 -9
  185. package/dist/hosts/claude-global.js.map +1 -1
  186. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  187. package/dist/hosts/codex-hooks.js +1 -2
  188. package/dist/hosts/codex-hooks.js.map +1 -1
  189. package/dist/hosts/config-write.d.ts.map +1 -1
  190. package/dist/hosts/config-write.js +2 -1
  191. package/dist/hosts/config-write.js.map +1 -1
  192. package/dist/hosts/cursor-hooks.d.ts +5 -2
  193. package/dist/hosts/cursor-hooks.d.ts.map +1 -1
  194. package/dist/hosts/cursor-hooks.js +14 -9
  195. package/dist/hosts/cursor-hooks.js.map +1 -1
  196. package/dist/hosts/init.d.ts +3 -0
  197. package/dist/hosts/init.d.ts.map +1 -1
  198. package/dist/hosts/init.js +32 -10
  199. package/dist/hosts/init.js.map +1 -1
  200. package/dist/hosts/instructions.d.ts +9 -4
  201. package/dist/hosts/instructions.d.ts.map +1 -1
  202. package/dist/hosts/instructions.js +19 -16
  203. package/dist/hosts/instructions.js.map +1 -1
  204. package/dist/hosts/mcp-config.d.ts +19 -4
  205. package/dist/hosts/mcp-config.d.ts.map +1 -1
  206. package/dist/hosts/mcp-config.js +81 -30
  207. package/dist/hosts/mcp-config.js.map +1 -1
  208. package/dist/hosts/plan.d.ts.map +1 -1
  209. package/dist/hosts/plan.js +11 -9
  210. package/dist/hosts/plan.js.map +1 -1
  211. package/dist/hosts/registry.d.ts +25 -2
  212. package/dist/hosts/registry.d.ts.map +1 -1
  213. package/dist/hosts/registry.js +53 -0
  214. package/dist/hosts/registry.js.map +1 -1
  215. package/dist/hosts/retract.d.ts.map +1 -1
  216. package/dist/hosts/retract.js +73 -33
  217. package/dist/hosts/retract.js.map +1 -1
  218. package/dist/hosts/sections.d.ts +17 -1
  219. package/dist/hosts/sections.d.ts.map +1 -1
  220. package/dist/hosts/sections.js +52 -2
  221. package/dist/hosts/sections.js.map +1 -1
  222. package/dist/mcp/instructions.d.ts +1 -25
  223. package/dist/mcp/instructions.d.ts.map +1 -1
  224. package/dist/mcp/instructions.js +6 -4
  225. package/dist/mcp/instructions.js.map +1 -1
  226. package/dist/mcp/server.d.ts.map +1 -1
  227. package/dist/mcp/server.js +7 -3
  228. package/dist/mcp/server.js.map +1 -1
  229. package/dist/mcp/tool-names.d.ts +10 -3
  230. package/dist/mcp/tool-names.d.ts.map +1 -1
  231. package/dist/mcp/tool-names.js +13 -5
  232. package/dist/mcp/tool-names.js.map +1 -1
  233. package/dist/mcp/tools.d.ts.map +1 -1
  234. package/dist/mcp/tools.js +6 -5
  235. package/dist/mcp/tools.js.map +1 -1
  236. package/dist/notes/ask-notes.d.ts +8 -0
  237. package/dist/notes/ask-notes.d.ts.map +1 -0
  238. package/dist/notes/ask-notes.js +18 -0
  239. package/dist/notes/ask-notes.js.map +1 -0
  240. package/dist/notes/branches.d.ts +85 -0
  241. package/dist/notes/branches.d.ts.map +1 -0
  242. package/dist/notes/branches.js +238 -0
  243. package/dist/notes/branches.js.map +1 -0
  244. package/dist/notes/cold-start.d.ts +177 -0
  245. package/dist/notes/cold-start.d.ts.map +1 -0
  246. package/dist/notes/cold-start.js +537 -0
  247. package/dist/notes/cold-start.js.map +1 -0
  248. package/dist/notes/git-facts.d.ts +17 -0
  249. package/dist/notes/git-facts.d.ts.map +1 -0
  250. package/dist/notes/git-facts.js +117 -0
  251. package/dist/notes/git-facts.js.map +1 -0
  252. package/dist/notes/home.d.ts +87 -0
  253. package/dist/notes/home.d.ts.map +1 -0
  254. package/dist/notes/home.js +423 -0
  255. package/dist/notes/home.js.map +1 -0
  256. package/dist/notes/notes.d.ts +193 -0
  257. package/dist/notes/notes.d.ts.map +1 -0
  258. package/dist/notes/notes.js +536 -0
  259. package/dist/notes/notes.js.map +1 -0
  260. package/dist/notes/pr-reviews.d.ts +108 -0
  261. package/dist/notes/pr-reviews.d.ts.map +1 -0
  262. package/dist/notes/pr-reviews.js +325 -0
  263. package/dist/notes/pr-reviews.js.map +1 -0
  264. package/dist/notes/repo-trail.d.ts +16 -0
  265. package/dist/notes/repo-trail.d.ts.map +1 -0
  266. package/dist/notes/repo-trail.js +74 -0
  267. package/dist/notes/repo-trail.js.map +1 -0
  268. package/dist/notes/session-cost.d.ts +21 -0
  269. package/dist/notes/session-cost.d.ts.map +1 -0
  270. package/dist/notes/session-cost.js +162 -0
  271. package/dist/notes/session-cost.js.map +1 -0
  272. package/dist/search/grep-cli.d.ts.map +1 -1
  273. package/dist/search/grep-cli.js +4 -3
  274. package/dist/search/grep-cli.js.map +1 -1
  275. package/dist/skills/skills.d.ts +118 -0
  276. package/dist/skills/skills.d.ts.map +1 -0
  277. package/dist/skills/skills.js +370 -0
  278. package/dist/skills/skills.js.map +1 -0
  279. package/dist/telemetry/contract.d.ts +2 -14
  280. package/dist/telemetry/contract.d.ts.map +1 -1
  281. package/dist/telemetry/contract.js +40 -24
  282. package/dist/telemetry/contract.js.map +1 -1
  283. package/dist/telemetry/gate.d.ts.map +1 -1
  284. package/dist/telemetry/gate.js +2 -1
  285. package/dist/telemetry/gate.js.map +1 -1
  286. package/dist/telemetry/notice.d.ts +1 -1
  287. package/dist/telemetry/notice.d.ts.map +1 -1
  288. package/dist/telemetry/notice.js +6 -5
  289. package/dist/telemetry/notice.js.map +1 -1
  290. package/dist/telemetry/track.d.ts.map +1 -1
  291. package/dist/telemetry/track.js +5 -0
  292. package/dist/telemetry/track.js.map +1 -1
  293. package/dist/upkeep-run.d.ts +7 -0
  294. package/dist/upkeep-run.d.ts.map +1 -1
  295. package/dist/upkeep-run.js +52 -12
  296. package/dist/upkeep-run.js.map +1 -1
  297. package/dist/upkeep.d.ts +9 -19
  298. package/dist/upkeep.d.ts.map +1 -1
  299. package/dist/upkeep.js +38 -59
  300. package/dist/upkeep.js.map +1 -1
  301. package/dist/util/browser.d.ts +3 -0
  302. package/dist/util/browser.d.ts.map +1 -0
  303. package/dist/util/browser.js +14 -0
  304. package/dist/util/browser.js.map +1 -0
  305. package/dist/util/front-matter.d.ts +19 -0
  306. package/dist/util/front-matter.d.ts.map +1 -0
  307. package/dist/util/front-matter.js +21 -0
  308. package/dist/util/front-matter.js.map +1 -0
  309. package/dist/util/state.d.ts +1 -18
  310. package/dist/util/state.d.ts.map +1 -1
  311. package/dist/util/state.js +4 -2
  312. package/dist/util/state.js.map +1 -1
  313. package/dist/viz/assemble.js +1 -1
  314. package/dist/viz/assemble.js.map +1 -1
  315. package/dist/viz/serve.d.ts.map +1 -1
  316. package/dist/viz/serve.js +4 -3
  317. package/dist/viz/serve.js.map +1 -1
  318. package/package.json +7 -7
  319. package/scripts/pack-trail.mjs +53 -0
  320. package/scripts/postinstall.mjs +17 -2
  321. package/scripts/run-tests.mjs +4 -1
  322. package/dist/app/brain-build-process.d.ts +0 -22
  323. package/dist/app/brain-build-process.d.ts.map +0 -1
  324. package/dist/app/brain-build-process.js +0 -129
  325. package/dist/app/brain-build-process.js.map +0 -1
  326. package/dist/app/brain-build-worker.d.ts +0 -35
  327. package/dist/app/brain-build-worker.d.ts.map +0 -1
  328. package/dist/app/brain-build-worker.js +0 -56
  329. package/dist/app/brain-build-worker.js.map +0 -1
  330. package/dist/app/brain-build.d.ts +0 -160
  331. package/dist/app/brain-build.d.ts.map +0 -1
  332. package/dist/app/brain-build.js +0 -278
  333. package/dist/app/brain-build.js.map +0 -1
  334. package/dist/app/history.d.ts +0 -163
  335. package/dist/app/history.d.ts.map +0 -1
  336. package/dist/app/history.js +0 -319
  337. package/dist/app/history.js.map +0 -1
  338. package/dist/app/sources.d.ts +0 -81
  339. package/dist/app/sources.d.ts.map +0 -1
  340. package/dist/app/sources.js +0 -470
  341. package/dist/app/sources.js.map +0 -1
  342. package/dist/brain/attach.d.ts +0 -44
  343. package/dist/brain/attach.d.ts.map +0 -1
  344. package/dist/brain/attach.js +0 -63
  345. package/dist/brain/attach.js.map +0 -1
  346. package/dist/brain/claude-md.d.ts +0 -61
  347. package/dist/brain/claude-md.d.ts.map +0 -1
  348. package/dist/brain/claude-md.js +0 -171
  349. package/dist/brain/claude-md.js.map +0 -1
  350. package/dist/brain/connect.d.ts +0 -59
  351. package/dist/brain/connect.d.ts.map +0 -1
  352. package/dist/brain/connect.js +0 -80
  353. package/dist/brain/connect.js.map +0 -1
  354. package/dist/brain/context-files.d.ts +0 -79
  355. package/dist/brain/context-files.d.ts.map +0 -1
  356. package/dist/brain/context-files.js +0 -245
  357. package/dist/brain/context-files.js.map +0 -1
  358. package/dist/brain/link.d.ts +0 -106
  359. package/dist/brain/link.d.ts.map +0 -1
  360. package/dist/brain/link.js +0 -167
  361. package/dist/brain/link.js.map +0 -1
  362. package/dist/brain/pull.d.ts +0 -48
  363. package/dist/brain/pull.d.ts.map +0 -1
  364. package/dist/brain/pull.js +0 -257
  365. package/dist/brain/pull.js.map +0 -1
  366. package/dist/brain/push.d.ts +0 -155
  367. package/dist/brain/push.d.ts.map +0 -1
  368. package/dist/brain/push.js +0 -304
  369. package/dist/brain/push.js.map +0 -1
  370. package/dist/brain/signup.d.ts +0 -117
  371. package/dist/brain/signup.d.ts.map +0 -1
  372. package/dist/brain/signup.js +0 -276
  373. package/dist/brain/signup.js.map +0 -1
  374. package/dist/brain/upload.d.ts +0 -61
  375. package/dist/brain/upload.d.ts.map +0 -1
  376. package/dist/brain/upload.js +0 -210
  377. package/dist/brain/upload.js.map +0 -1
  378. package/dist/brain/watch.d.ts +0 -209
  379. package/dist/brain/watch.d.ts.map +0 -1
  380. package/dist/brain/watch.js +0 -397
  381. package/dist/brain/watch.js.map +0 -1
  382. package/dist/brain/wire.d.ts +0 -38
  383. package/dist/brain/wire.d.ts.map +0 -1
  384. package/dist/brain/wire.js +0 -133
  385. package/dist/brain/wire.js.map +0 -1
  386. package/dist/legacy-args.d.ts +0 -12
  387. package/dist/legacy-args.d.ts.map +0 -1
  388. package/dist/legacy-args.js +0 -31
  389. package/dist/legacy-args.js.map +0 -1
@@ -1,245 +0,0 @@
1
- /**
2
- * `graft trail pull`, for every context file rather than only the root CLAUDE.md.
3
- *
4
- * Trail suggests changes to the files a repository hands its coding agents —
5
- * AGENTS.md, a folder's own CLAUDE.md, Cursor rules, Claude skills — and a
6
- * person accepts some of them. This fetches the accepted ones and writes them.
7
- *
8
- * Edits and new sections go through the same line-by-line patcher as the root
9
- * CLAUDE.md (see claude-md.ts), so everything a change does not name comes back
10
- * byte for byte. A `create` carries a whole file, and it is never allowed to
11
- * overwrite a file someone wrote here: an existing file with other content is a
12
- * conflict to report, unless graft itself owns that file. A `replace` (how a
13
- * Cursor rule is edited) carries the whole new file and the whole file it was
14
- * computed against, and is written only while the file here is still that one.
15
- */
16
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
17
- import { dirname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
18
- import { applyChanges } from "./claude-md.js";
19
- import { baseUrlFor } from "./link.js";
20
- /**
21
- * Which picked agents read a file of this kind. A file whose readers were not
22
- * picked is neither listed nor written: `graft init` is where someone said which
23
- * agents this repo is for, and a pull must not quietly add files for others.
24
- */
25
- const READERS = {
26
- claude_md: ["claude"],
27
- folder_claude_md: ["claude"],
28
- skill: ["claude"],
29
- agents_md: ["agents", "hermes", "antigravity"],
30
- cursor_rule: ["cursor"],
31
- };
32
- /** The kind of a context file, from its path — for the root CLAUDE.md pull,
33
- * which names a path but no kind. */
34
- export function kindForPath(path) {
35
- const p = path.replace(/\\/g, "/");
36
- const name = p.split("/").pop() ?? "";
37
- if (name === "CLAUDE.md")
38
- return p.includes("/") ? "folder_claude_md" : "claude_md";
39
- if (name === "AGENTS.md")
40
- return "agents_md";
41
- if (p.startsWith(".cursor/rules/"))
42
- return "cursor_rule";
43
- if (p.startsWith(".claude/skills/"))
44
- return "skill";
45
- return "";
46
- }
47
- /**
48
- * Whether a file of `kind` is for one of the `wired` agents. Everything passes
49
- * when nothing is wired — there is no choice to respect — and so does a kind
50
- * graft does not know, rather than dropping what Trail sent.
51
- */
52
- export function readByWired(kind, wired) {
53
- if (wired.length === 0)
54
- return true;
55
- const readers = READERS[kind];
56
- if (!readers)
57
- return true;
58
- return readers.some((r) => wired.includes(r));
59
- }
60
- /** The agents among `wired` that read a file of `kind`. */
61
- export function readersOf(kind, wired) {
62
- const readers = READERS[kind] ?? [];
63
- return wired.filter((w) => readers.includes(w));
64
- }
65
- /** GET /api/public/brains/:id/context-files. `unsupported` on a 404: an older Trail. */
66
- export async function fetchContextFiles(link, fetchImpl = fetch) {
67
- const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/context-files`;
68
- try {
69
- const res = await fetchImpl(url, {
70
- headers: { authorization: `Bearer ${link.token}`, accept: "application/json" },
71
- signal: AbortSignal.timeout(15_000),
72
- });
73
- const body = await res.text();
74
- if (res.status === 404)
75
- return { unsupported: true };
76
- if (!res.ok)
77
- return { error: `Trail refused the pull: ${res.status} ${body.slice(0, 200)}` };
78
- const parsed = JSON.parse(body);
79
- const files = Array.isArray(parsed.files) ? parsed.files : [];
80
- return {
81
- head_sha: String(parsed.head_sha ?? ""),
82
- files: files
83
- .filter((f) => f && typeof f.path === "string")
84
- .map((f) => ({ ...f, changes: Array.isArray(f.changes) ? f.changes : [] })),
85
- };
86
- }
87
- catch (e) {
88
- return { error: `could not reach Trail: ${e instanceof Error ? e.message : e}` };
89
- }
90
- }
91
- /** POST /api/public/brains/:id/context-files/applied, 100 ids per request. */
92
- export async function markContextFilesApplied(link, ids, fetchImpl = fetch) {
93
- if (ids.length === 0)
94
- return true;
95
- const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/context-files/applied`;
96
- try {
97
- for (let i = 0; i < ids.length; i += 100) {
98
- const res = await fetchImpl(url, {
99
- method: "POST",
100
- headers: {
101
- authorization: `Bearer ${link.token}`,
102
- "content-type": "application/json",
103
- accept: "application/json",
104
- },
105
- body: JSON.stringify({ ids: ids.slice(i, i + 100) }),
106
- signal: AbortSignal.timeout(15_000),
107
- });
108
- if (!res.ok)
109
- return false;
110
- }
111
- return true;
112
- }
113
- catch {
114
- return false;
115
- }
116
- }
117
- /**
118
- * The repo-relative form of a path Trail sent, or null when it points
119
- * anywhere but a file inside this checkout. Trail is trusted to suggest text,
120
- * not to choose where on this machine it lands.
121
- */
122
- export function safeRelPath(root, path) {
123
- const raw = path.replace(/\\/g, "/").trim();
124
- if (!raw || isAbsolute(raw) || /^[a-zA-Z]:/.test(raw))
125
- return null;
126
- const parts = raw.split("/");
127
- if (parts.some((p) => p === ".." || p === ""))
128
- return null;
129
- if (parts[0] === ".git")
130
- return null;
131
- const abs = resolve(root, normalize(raw));
132
- const rel = relative(resolve(root), abs);
133
- if (!rel || rel.startsWith("..") || isAbsolute(rel))
134
- return null;
135
- return rel.split(sep).join("/");
136
- }
137
- /**
138
- * Work out one file's changes against what is on disk. Pure but for reading
139
- * the file, so the command, the dry run and the tests share it.
140
- */
141
- export function planContextFile(root, file) {
142
- const rel = safeRelPath(root, file.path);
143
- const plan = { path: rel ?? file.path, status: "", written: [], present: [], skipped: [] };
144
- if (!rel) {
145
- for (const c of file.changes)
146
- plan.skipped.push({ change: c, why: "the path points outside this repo" });
147
- return plan;
148
- }
149
- const abs = join(root, rel);
150
- const existed = existsSync(abs);
151
- let original = "";
152
- if (existed) {
153
- try {
154
- original = readFileSync(abs, "utf8");
155
- }
156
- catch {
157
- for (const c of file.changes)
158
- plan.skipped.push({ change: c, why: "the file here could not be read" });
159
- return plan;
160
- }
161
- }
162
- let text = original;
163
- let changed = false;
164
- // Whole files first; the edits and sections after them may be relative to one.
165
- for (const c of file.changes.filter((x) => x.kind === "create")) {
166
- const want = c.text.replace(/\r\n/g, "\n");
167
- const have = text.replace(/\r\n/g, "\n");
168
- if (!existed && !changed) {
169
- text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
170
- changed = true;
171
- plan.written.push(c);
172
- }
173
- else if (have.trimEnd() === want.trimEnd()) {
174
- plan.present.push(c);
175
- }
176
- else if (file.managed_by_graft) {
177
- text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
178
- changed = true;
179
- plan.written.push(c);
180
- }
181
- else {
182
- plan.skipped.push({ change: c, why: "a file with other content is already there" });
183
- }
184
- }
185
- // Whole-file replacements, guarded by the text they were computed against.
186
- const same = (a, b) => a.replace(/\r\n/g, "\n").trimEnd() === b.replace(/\r\n/g, "\n").trimEnd();
187
- for (const c of file.changes.filter((x) => x.kind === "replace")) {
188
- if (same(text, c.text)) {
189
- plan.present.push(c);
190
- }
191
- else if (same(text, c.find ?? "") && (existed || changed || (c.find ?? "").trim() === "")) {
192
- text = c.text.endsWith("\n") ? c.text : `${c.text}\n`;
193
- changed = true;
194
- plan.written.push(c);
195
- }
196
- else {
197
- plan.skipped.push({ change: c, why: "the file changed here since Trail read it" });
198
- }
199
- }
200
- const patches = file.changes.filter((x) => x.kind === "edit" || x.kind === "add");
201
- if (patches.length > 0) {
202
- // A file that is not here yet is an empty one: an edit to a section of it
203
- // becomes that section, so the change lands rather than being skipped for
204
- // a heading nobody could have written.
205
- const fresh = !existed && !changed;
206
- const r = applyChanges(text, patches.map((c) => ({
207
- ...c,
208
- heading: c.heading ?? "",
209
- kind: fresh && c.kind === "edit" ? "add" : c.kind,
210
- ...(fresh && c.kind === "edit" ? { after_heading: "" } : {}),
211
- })));
212
- const byId = new Map(patches.map((c) => [c.id, c]));
213
- for (const w of r.written)
214
- plan.written.push(byId.get(w.id));
215
- for (const p of r.present)
216
- plan.present.push(byId.get(p.id));
217
- for (const s of r.skipped)
218
- plan.skipped.push({ change: byId.get(s.change.id), why: s.why });
219
- if (r.written.length > 0) {
220
- text = r.text;
221
- changed = true;
222
- }
223
- }
224
- if (changed && text !== original) {
225
- plan.status = existed ? "M" : "A";
226
- plan.text = text;
227
- }
228
- return plan;
229
- }
230
- /** Write a planned file, making its folder when it is new. */
231
- export function writePlannedFile(root, plan) {
232
- if (!plan.status || plan.text === undefined)
233
- return;
234
- const abs = join(root, plan.path);
235
- mkdirSync(dirname(abs), { recursive: true });
236
- writeFileSync(abs, plan.text);
237
- }
238
- /** `+ Money · ~ Commands` — a new section is +, an edited one ~, a whole file nothing. */
239
- export function changeSummary(changes) {
240
- return changes
241
- .filter((c) => c.kind === "add" || c.kind === "edit")
242
- .map((c) => `${c.kind === "add" ? "+" : "~"} ${c.heading ?? ""}`.trim())
243
- .join(" · ");
244
- }
245
- //# sourceMappingURL=context-files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-files.js","sourceRoot":"","sources":["../../src/brain/context-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AA8BvD;;;;GAIG;AACH,MAAM,OAAO,GAA6B;IACxC,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC5B,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjB,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC;IAC9C,WAAW,EAAE,CAAC,QAAQ,CAAC;CACxB,CAAC;AAEF;qCACqC;AACrC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC;IACpF,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC7C,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,aAAa,CAAC;IACzD,IAAI,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAwB;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAwB;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAe,EACf,YAA0B,KAAK;IAE/B,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC/B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC9E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8B,CAAC;QAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,KAAK,EAAE,KAAK;iBACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9E,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAe,EAAE,GAAa,EAAE,YAA0B,KAAK;IAC3G,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAC9G,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;oBACrC,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAgBD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAiB;IAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAa,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,mCAAmC,EAAE,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,+EAA+E;IAC/E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,4CAA4C,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACjH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5F,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,2CAA2C,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,0EAA0E;QAC1E,0EAA0E;QAC1E,uCAAuC;QACvC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,CAAC,GAAG,YAAY,CACpB,IAAI,EACJ,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;YACC,GAAG,CAAC;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACjD,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAmB,CACvB,CACF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACd,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAc;IAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,OAAkD;IAC9E,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;SACvE,IAAI,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC"}
@@ -1,106 +0,0 @@
1
- /** How long a cached rule set is served before upkeep refreshes it. */
2
- export declare const RULES_TTL_MS: number;
3
- /**
4
- * The TTL used while the cache holds NO rules.
5
- *
6
- * A brain is connected during onboarding while it is still being mined, so the
7
- * first pull legitimately returns nothing. Six hours of that is the difference
8
- * between the feature working and the user concluding it does not: they wired
9
- * graft up, got an empty rulebook, and nothing would go back for the real one
10
- * until tomorrow. Two minutes costs one cheap request per session until the
11
- * rules land, and then the normal TTL takes over.
12
- */
13
- export declare const EMPTY_RULES_TTL_MS: number;
14
- /** One rule from the brain, anchored to a symbol in this repo. */
15
- export interface BrainRule {
16
- ruleId: string;
17
- /** A graft node id: `<path>#<QualifiedName>`. */
18
- symbol: string;
19
- /** The symbol's body hash when the rule was mined; '' when unrecorded. */
20
- fingerprint: string;
21
- rule: string;
22
- /** Deep link to the commit or pull request that established it. */
23
- sourceUrl?: string;
24
- }
25
- /** The cached rule set, as stored under the repo's graft cache. */
26
- export interface RulesCache {
27
- brainId: string;
28
- fetchedAt: number;
29
- rules: BrainRule[];
30
- /** When a refresh was last ATTEMPTED, successful or not. Separate from
31
- * `fetchedAt`, which records when rules last actually arrived: without the
32
- * distinction, a brain that is still building would be re-checked on every
33
- * single command, because its `fetchedAt` never advances. */
34
- checkedAt?: number;
35
- }
36
- /** The persisted brain link. */
37
- export interface BrainLink {
38
- brainId: string;
39
- /** Workspace API key (`nn...`). Stored in the git-ignored `.graft/`. */
40
- token: string;
41
- /** Set only when the user pointed graft at a non-default host. */
42
- baseUrl?: string;
43
- }
44
- /**
45
- * The link for repo `dir`, or null when it has none.
46
- *
47
- * `GRAFT_BRAIN_TOKEN` / `GRAFT_BRAIN_ID` override the stored pair, so CI can
48
- * attach a brain without writing to the checkout.
49
- */
50
- export declare function readLink(dir: string): BrainLink | null;
51
- /** Persist the link for repo `dir`, merging into any existing build config.
52
- *
53
- * The write is what creates `.graft/config.json`, and that file holds the read
54
- * token — which is exactly why this is also where it gets ignored. The comment
55
- * on {@link BrainLink} has claimed `.graft/` was "git-ignored" since the day it
56
- * was written, and nothing ever made it true: `ensureGitignored` only ever ran
57
- * for the graph cache. Every repository anyone ran `graft trail connect` in was
58
- * therefore one `git add -A` away from publishing a credential. */
59
- export declare function writeLink(dir: string, link: BrainLink): void;
60
- /** Forget the link for repo `dir`. Leaves the cached rules for `uninstall` to remove. */
61
- export declare function clearLink(dir: string): void;
62
- /** Where the rule cache lives: beside the graph, since it is derived data. */
63
- export declare function rulesCachePath(dir: string): string;
64
- export declare function readRulesCache(dir: string): RulesCache | null;
65
- export declare function writeRulesCache(dir: string, cache: RulesCache): void;
66
- /**
67
- * Whether a cached set is old enough to refetch.
68
- *
69
- * Keyed off the last ATTEMPT, not the last success, and with a much shorter
70
- * window while the cache is empty — see EMPTY_RULES_TTL_MS for why that case
71
- * is the one that matters.
72
- */
73
- export declare function cacheIsStale(cache: RulesCache | null, now?: number): boolean;
74
- /** Record that a refresh was attempted, without claiming rules arrived. */
75
- export declare function markRulesChecked(dir: string, now?: number): void;
76
- /**
77
- * The base URL for a link, honouring the env override first so a misconfigured
78
- * stored value can always be corrected without editing a file.
79
- */
80
- export declare function baseUrlFor(link: BrainLink): string;
81
- /** The API host before there is a link to read one from: signing up. */
82
- export declare function apiBaseUrl(): string;
83
- /** A sign-up an agent-run push started and has not collected yet. */
84
- export interface PendingSignup {
85
- /** The state in the link, which is what claims the trail. */
86
- state: string;
87
- /** The repository the link was for, so a changed remote starts over. */
88
- repo: string;
89
- createdAt: number;
90
- }
91
- /** The sign-up waiting on repo `dir`, or null when there is none or it is too
92
- * old to claim, or it was for a different repository. */
93
- export declare function readPendingSignup(dir: string, repo: string, maxAgeMs: number, now?: number): PendingSignup | null;
94
- /** Save the sign-up an agent-run push just started. Git-ignored like the link,
95
- * because the state claims a read token. */
96
- export declare function writePendingSignup(dir: string, pending: PendingSignup): void;
97
- export declare function clearPendingSignup(dir: string): void;
98
- /**
99
- * Fetch the brain's symbol-anchored rules.
100
- *
101
- * Returns null on any failure — an unreachable brain, a revoked token, a
102
- * malformed body. Never throws: `ask` degrades to the code-only answer it gave
103
- * before a brain was attached, which is the whole reason the cache exists.
104
- */
105
- export declare function fetchRules(link: BrainLink, fetchImpl?: typeof fetch): Promise<BrainRule[] | null>;
106
- //# sourceMappingURL=link.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"AAsBA,uEAAuE;AACvE,eAAO,MAAM,YAAY,QAAqB,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAgB,CAAC;AAEhD,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB;;;iEAG6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAStD;AAED;;;;;;;mEAOmE;AACnE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAG5D;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,SAAa,GAAG,OAAO,CAIhF;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAElD;AAED,wEAAwE;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;yDACyD;AACzD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,aAAa,GAAG,IAAI,CAIrH;AAED;4CAC4C;AAC5C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAeD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CA4B7B"}
@@ -1,167 +0,0 @@
1
- /**
2
- * The link between a repo's graft graph and a Trail brain.
3
- *
4
- * A brain holds the rules mined out of this repository's history — what the
5
- * team decided and why, which the code graph cannot see. Graft holds the code
6
- * and can say which symbols an answer touches. This module is the join: the
7
- * token identifying the brain, and the rules cached beside it so `ask` never
8
- * waits on the network.
9
- *
10
- * The link lives in the per-repo, git-ignored `.graft/config.json`, next to the
11
- * other persisted build choices. Not in `~/.graft/`: a brain belongs to one
12
- * repository, and two checkouts of different repos on one machine must not
13
- * share one.
14
- */
15
- import { readBuildConfig, patchBuildConfig, cacheDir, readJson, writeJsonAtomic } from '../util/state.js';
16
- import { join } from 'node:path';
17
- import { ensureGitignored, LINK_NOTE } from '../context/node-file.js';
18
- import { BUILD_CONFIG_DIR } from '../util/state.js';
19
- /** Default API host. Overridden by GRAFT_BRAIN_URL, for staging and self-hosted. */
20
- const DEFAULT_BRAIN_BASE_URL = 'https://agents.nanonets.com';
21
- /** How long a cached rule set is served before upkeep refreshes it. */
22
- export const RULES_TTL_MS = 6 * 60 * 60 * 1000; // 6 hours
23
- /**
24
- * The TTL used while the cache holds NO rules.
25
- *
26
- * A brain is connected during onboarding while it is still being mined, so the
27
- * first pull legitimately returns nothing. Six hours of that is the difference
28
- * between the feature working and the user concluding it does not: they wired
29
- * graft up, got an empty rulebook, and nothing would go back for the real one
30
- * until tomorrow. Two minutes costs one cheap request per session until the
31
- * rules land, and then the normal TTL takes over.
32
- */
33
- export const EMPTY_RULES_TTL_MS = 2 * 60 * 1000;
34
- /**
35
- * The link for repo `dir`, or null when it has none.
36
- *
37
- * `GRAFT_BRAIN_TOKEN` / `GRAFT_BRAIN_ID` override the stored pair, so CI can
38
- * attach a brain without writing to the checkout.
39
- */
40
- export function readLink(dir) {
41
- const envToken = process.env.GRAFT_BRAIN_TOKEN;
42
- const envBrain = process.env.GRAFT_BRAIN_ID;
43
- if (envToken && envBrain) {
44
- return { brainId: envBrain, token: envToken, baseUrl: process.env.GRAFT_BRAIN_URL };
45
- }
46
- const stored = readBuildConfig(dir)?.brain;
47
- if (!stored?.brainId || !stored?.token)
48
- return null;
49
- return stored;
50
- }
51
- /** Persist the link for repo `dir`, merging into any existing build config.
52
- *
53
- * The write is what creates `.graft/config.json`, and that file holds the read
54
- * token — which is exactly why this is also where it gets ignored. The comment
55
- * on {@link BrainLink} has claimed `.graft/` was "git-ignored" since the day it
56
- * was written, and nothing ever made it true: `ensureGitignored` only ever ran
57
- * for the graph cache. Every repository anyone ran `graft trail connect` in was
58
- * therefore one `git add -A` away from publishing a credential. */
59
- export function writeLink(dir, link) {
60
- patchBuildConfig(dir, { brain: link });
61
- ensureGitignored(dir, join(dir, BUILD_CONFIG_DIR), LINK_NOTE);
62
- }
63
- /** Forget the link for repo `dir`. Leaves the cached rules for `uninstall` to remove. */
64
- export function clearLink(dir) {
65
- patchBuildConfig(dir, { brain: undefined });
66
- }
67
- /** Where the rule cache lives: beside the graph, since it is derived data. */
68
- export function rulesCachePath(dir) {
69
- return join(cacheDir(dir), 'brain-rules.json');
70
- }
71
- export function readRulesCache(dir) {
72
- return readJson(rulesCachePath(dir));
73
- }
74
- export function writeRulesCache(dir, cache) {
75
- writeJsonAtomic(rulesCachePath(dir), cache, true);
76
- }
77
- /**
78
- * Whether a cached set is old enough to refetch.
79
- *
80
- * Keyed off the last ATTEMPT, not the last success, and with a much shorter
81
- * window while the cache is empty — see EMPTY_RULES_TTL_MS for why that case
82
- * is the one that matters.
83
- */
84
- export function cacheIsStale(cache, now = Date.now()) {
85
- if (!cache)
86
- return true;
87
- const ttl = cache.rules.length === 0 ? EMPTY_RULES_TTL_MS : RULES_TTL_MS;
88
- return now - (cache.checkedAt ?? cache.fetchedAt) > ttl;
89
- }
90
- /** Record that a refresh was attempted, without claiming rules arrived. */
91
- export function markRulesChecked(dir, now = Date.now()) {
92
- const cache = readRulesCache(dir);
93
- if (!cache)
94
- return;
95
- writeRulesCache(dir, { ...cache, checkedAt: now });
96
- }
97
- /**
98
- * The base URL for a link, honouring the env override first so a misconfigured
99
- * stored value can always be corrected without editing a file.
100
- */
101
- export function baseUrlFor(link) {
102
- return (process.env.GRAFT_BRAIN_URL || link.baseUrl || DEFAULT_BRAIN_BASE_URL).replace(/\/+$/, '');
103
- }
104
- /** The API host before there is a link to read one from: signing up. */
105
- export function apiBaseUrl() {
106
- return (process.env.GRAFT_BRAIN_URL || DEFAULT_BRAIN_BASE_URL).replace(/\/+$/, '');
107
- }
108
- /** The sign-up waiting on repo `dir`, or null when there is none or it is too
109
- * old to claim, or it was for a different repository. */
110
- export function readPendingSignup(dir, repo, maxAgeMs, now = Date.now()) {
111
- const p = readBuildConfig(dir)?.pendingSignup;
112
- if (!p?.state || p.repo !== repo || !(now - p.createdAt < maxAgeMs))
113
- return null;
114
- return p;
115
- }
116
- /** Save the sign-up an agent-run push just started. Git-ignored like the link,
117
- * because the state claims a read token. */
118
- export function writePendingSignup(dir, pending) {
119
- patchBuildConfig(dir, { pendingSignup: pending });
120
- ensureGitignored(dir, join(dir, BUILD_CONFIG_DIR), LINK_NOTE);
121
- }
122
- export function clearPendingSignup(dir) {
123
- patchBuildConfig(dir, { pendingSignup: undefined });
124
- }
125
- /** Timeout for one rules fetch. Short: `ask` must never block on this. */
126
- const FETCH_TIMEOUT_MS = 5000;
127
- /**
128
- * Fetch the brain's symbol-anchored rules.
129
- *
130
- * Returns null on any failure — an unreachable brain, a revoked token, a
131
- * malformed body. Never throws: `ask` degrades to the code-only answer it gave
132
- * before a brain was attached, which is the whole reason the cache exists.
133
- */
134
- export async function fetchRules(link, fetchImpl = fetch) {
135
- // The PUBLIC, token-authenticated route: graft runs on a laptop with no
136
- // session, and the token it holds is scoped to this one brain rather than the
137
- // workspace. The protected route is for the app itself.
138
- const url = `${baseUrlFor(link)}/api/public/brains/${encodeURIComponent(link.brainId)}/rules/anchors`;
139
- try {
140
- const res = await fetchImpl(url, {
141
- headers: { authorization: `Bearer ${link.token}`, accept: 'application/json' },
142
- signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
143
- });
144
- if (!res.ok)
145
- return null;
146
- const body = (await res.json());
147
- if (!Array.isArray(body.anchors))
148
- return null;
149
- const out = [];
150
- for (const a of body.anchors) {
151
- if (!a?.symbol || !a?.rule)
152
- continue;
153
- out.push({
154
- ruleId: String(a.rule_id ?? ''),
155
- symbol: a.symbol,
156
- fingerprint: String(a.fingerprint ?? ''),
157
- rule: a.rule,
158
- sourceUrl: a.source_url || undefined,
159
- });
160
- }
161
- return out;
162
- }
163
- catch {
164
- return null;
165
- }
166
- }
167
- //# sourceMappingURL=link.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/brain/link.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import { type ConnectResult } from "./connect.js";
2
- import type { BrainLink } from "./link.js";
3
- import { type Suggestions } from "./watch.js";
4
- export interface PullOptions {
5
- home: string;
6
- /** The agents this repo is wired for; empty means no choice was recorded. */
7
- wired: string[];
8
- dryRun?: boolean;
9
- fetchImpl?: typeof fetch;
10
- write?: (line: string) => void;
11
- }
12
- /** The rules line: how many, and which files they are in. */
13
- export declare function rulesLine(repo: string, res: ConnectResult): string | null;
14
- /**
15
- * Trail's suggestions, cut to the files the wired agents read: how many, and
16
- * whose files they are (`the files claude and cursor read`).
17
- *
18
- * Every suggestion Trail has made, whatever became of it — the counts it sends
19
- * do not say which are still waiting for review and which were dismissed.
20
- */
21
- export declare function suggestedFor(s: Suggestions | undefined, wired: string[]): {
22
- count: number;
23
- whose: string;
24
- };
25
- /**
26
- * The suggestions line after a build:
27
- * `● 18 suggestions for the files claude, agents and cursor read`. Null when
28
- * there are none to mention.
29
- */
30
- export declare function suggestionsLine(s: Suggestions | undefined, wired: string[], again: boolean): string | null;
31
- /**
32
- * What a pull says about the suggestions it did not write:
33
- * `● 20 suggested so far for the files claude read, 2 of them accepted`.
34
- *
35
- * This is what lets an agent watching the trail say "there are suggestions
36
- * waiting for you" before anything has been accepted. "So far", because the
37
- * build keeps adding them after the push returns. Null when Trail sent no
38
- * counts, or counts that cannot hold what was accepted.
39
- */
40
- export declare function suggestedLine(suggested: {
41
- count: number;
42
- whose: string;
43
- }, accepted: number): string | null;
44
- /**
45
- * Run the pull. Returns the exit code; every line goes through `write`.
46
- */
47
- export declare function runTrailPull(repo: string, link: BrainLink, opts: PullOptions): Promise<number>;
48
- //# sourceMappingURL=pull.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/brain/pull.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAchE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAQD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CASzE;AAQD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAwB1G;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI1G;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1G;AAiCD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiIpG"}