@nanonets/graft 0.24.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/README.md +26 -21
  2. package/dist/blast/render.js +1 -1
  3. package/dist/blast/render.js.map +1 -1
  4. package/dist/brand.js +1 -1
  5. package/dist/brand.js.map +1 -1
  6. package/dist/check/learning-edits.d.ts +18 -3
  7. package/dist/check/learning-edits.d.ts.map +1 -1
  8. package/dist/check/learning-edits.js +54 -10
  9. package/dist/check/learning-edits.js.map +1 -1
  10. package/dist/check/local-check.d.ts +7 -3
  11. package/dist/check/local-check.d.ts.map +1 -1
  12. package/dist/check/local-check.js +55 -11
  13. package/dist/check/local-check.js.map +1 -1
  14. package/dist/check/types.d.ts +11 -2
  15. package/dist/check/types.d.ts.map +1 -1
  16. package/dist/claude/format.d.ts +11 -7
  17. package/dist/claude/format.d.ts.map +1 -1
  18. package/dist/claude/format.js +50 -28
  19. package/dist/claude/format.js.map +1 -1
  20. package/dist/claude/hook-io.js +1 -1
  21. package/dist/claude/hook-io.js.map +1 -1
  22. package/dist/claude/hook-layers.d.ts +4 -2
  23. package/dist/claude/hook-layers.d.ts.map +1 -1
  24. package/dist/claude/hook-layers.js +21 -4
  25. package/dist/claude/hook-layers.js.map +1 -1
  26. package/dist/claude/hooks.d.ts +9 -32
  27. package/dist/claude/hooks.d.ts.map +1 -1
  28. package/dist/claude/hooks.js +154 -350
  29. package/dist/claude/hooks.js.map +1 -1
  30. package/dist/claude/init.d.ts.map +1 -1
  31. package/dist/claude/init.js +56 -18
  32. package/dist/claude/init.js.map +1 -1
  33. package/dist/claude/note-signals.d.ts +6 -0
  34. package/dist/claude/note-signals.d.ts.map +1 -1
  35. package/dist/claude/note-signals.js +14 -3
  36. package/dist/claude/note-signals.js.map +1 -1
  37. package/dist/claude/post-bash.d.ts +26 -0
  38. package/dist/claude/post-bash.d.ts.map +1 -0
  39. package/dist/claude/post-bash.js +191 -0
  40. package/dist/claude/post-bash.js.map +1 -0
  41. package/dist/claude/pre-bash-skills.d.ts +21 -0
  42. package/dist/claude/pre-bash-skills.d.ts.map +1 -0
  43. package/dist/claude/pre-bash-skills.js +253 -0
  44. package/dist/claude/pre-bash-skills.js.map +1 -0
  45. package/dist/claude/pre-bash.d.ts +50 -0
  46. package/dist/claude/pre-bash.d.ts.map +1 -0
  47. package/dist/claude/pre-bash.js +245 -0
  48. package/dist/claude/pre-bash.js.map +1 -0
  49. package/dist/claude/prompt-consent.d.ts +19 -0
  50. package/dist/claude/prompt-consent.d.ts.map +1 -0
  51. package/dist/claude/prompt-consent.js +14 -0
  52. package/dist/claude/prompt-consent.js.map +1 -0
  53. package/dist/claude/prompt-hook.d.ts +76 -0
  54. package/dist/claude/prompt-hook.d.ts.map +1 -0
  55. package/dist/claude/prompt-hook.js +303 -0
  56. package/dist/claude/prompt-hook.js.map +1 -0
  57. package/dist/claude/prompt-skills.d.ts +19 -0
  58. package/dist/claude/prompt-skills.d.ts.map +1 -0
  59. package/dist/claude/prompt-skills.js +305 -0
  60. package/dist/claude/prompt-skills.js.map +1 -0
  61. package/dist/claude/session-metrics.js +4 -4
  62. package/dist/claude/session-metrics.js.map +1 -1
  63. package/dist/claude/settings-merge.d.ts +10 -0
  64. package/dist/claude/settings-merge.d.ts.map +1 -1
  65. package/dist/claude/settings-merge.js +46 -17
  66. package/dist/claude/settings-merge.js.map +1 -1
  67. package/dist/claude/shim-template.d.ts.map +1 -1
  68. package/dist/claude/shim-template.js +86 -28
  69. package/dist/claude/shim-template.js.map +1 -1
  70. package/dist/claude/skill-template.d.ts +2 -0
  71. package/dist/claude/skill-template.d.ts.map +1 -1
  72. package/dist/claude/skill-template.js +53 -34
  73. package/dist/claude/skill-template.js.map +1 -1
  74. package/dist/claude/skill-use.d.ts +16 -0
  75. package/dist/claude/skill-use.d.ts.map +1 -0
  76. package/dist/claude/skill-use.js +78 -0
  77. package/dist/claude/skill-use.js.map +1 -0
  78. package/dist/claude/skills-wiring.d.ts +26 -0
  79. package/dist/claude/skills-wiring.d.ts.map +1 -0
  80. package/dist/claude/skills-wiring.js +110 -0
  81. package/dist/claude/skills-wiring.js.map +1 -0
  82. package/dist/claude/start-init.d.ts +13 -0
  83. package/dist/claude/start-init.d.ts.map +1 -0
  84. package/dist/claude/start-init.js +75 -0
  85. package/dist/claude/start-init.js.map +1 -0
  86. package/dist/claude/start-skills.d.ts +31 -0
  87. package/dist/claude/start-skills.d.ts.map +1 -0
  88. package/dist/claude/start-skills.js +274 -0
  89. package/dist/claude/start-skills.js.map +1 -0
  90. package/dist/claude/state.d.ts +19 -7
  91. package/dist/claude/state.d.ts.map +1 -1
  92. package/dist/claude/state.js +59 -4
  93. package/dist/claude/state.js.map +1 -1
  94. package/dist/claude/stop-skills.d.ts +23 -0
  95. package/dist/claude/stop-skills.d.ts.map +1 -0
  96. package/dist/claude/stop-skills.js +233 -0
  97. package/dist/claude/stop-skills.js.map +1 -0
  98. package/dist/claude/stop.d.ts +23 -0
  99. package/dist/claude/stop.d.ts.map +1 -0
  100. package/dist/claude/stop.js +219 -0
  101. package/dist/claude/stop.js.map +1 -0
  102. package/dist/claude/tally.d.ts +29 -41
  103. package/dist/claude/tally.d.ts.map +1 -1
  104. package/dist/claude/tally.js +111 -165
  105. package/dist/claude/tally.js.map +1 -1
  106. package/dist/claude/walls-hook.d.ts +52 -0
  107. package/dist/claude/walls-hook.d.ts.map +1 -0
  108. package/dist/claude/walls-hook.js +279 -0
  109. package/dist/claude/walls-hook.js.map +1 -0
  110. package/dist/cli-epilogue.d.ts.map +1 -1
  111. package/dist/cli-epilogue.js +24 -14
  112. package/dist/cli-epilogue.js.map +1 -1
  113. package/dist/cli-meta.js +3 -3
  114. package/dist/cli-meta.js.map +1 -1
  115. package/dist/cli-picker.d.ts.map +1 -1
  116. package/dist/cli-picker.js +8 -6
  117. package/dist/cli-picker.js.map +1 -1
  118. package/dist/cli.d.ts.map +1 -1
  119. package/dist/cli.js +238 -402
  120. package/dist/cli.js.map +1 -1
  121. package/dist/cloud/head-learnings.d.ts +13 -0
  122. package/dist/cloud/head-learnings.d.ts.map +1 -0
  123. package/dist/cloud/head-learnings.js +84 -0
  124. package/dist/cloud/head-learnings.js.map +1 -0
  125. package/dist/cloud/lookup-activity.d.ts +5 -3
  126. package/dist/cloud/lookup-activity.d.ts.map +1 -1
  127. package/dist/cloud/lookup-activity.js +8 -8
  128. package/dist/cloud/lookup-activity.js.map +1 -1
  129. package/dist/cloud/nudge.d.ts +15 -7
  130. package/dist/cloud/nudge.d.ts.map +1 -1
  131. package/dist/cloud/nudge.js +42 -33
  132. package/dist/cloud/nudge.js.map +1 -1
  133. package/dist/cloud/onboarding.d.ts +37 -1
  134. package/dist/cloud/onboarding.d.ts.map +1 -1
  135. package/dist/cloud/onboarding.js +77 -1
  136. package/dist/cloud/onboarding.js.map +1 -1
  137. package/dist/cloud/other-repos.d.ts +39 -0
  138. package/dist/cloud/other-repos.d.ts.map +1 -0
  139. package/dist/cloud/other-repos.js +137 -0
  140. package/dist/cloud/other-repos.js.map +1 -0
  141. package/dist/cloud/pair.d.ts +17 -7
  142. package/dist/cloud/pair.d.ts.map +1 -1
  143. package/dist/cloud/pair.js +81 -60
  144. package/dist/cloud/pair.js.map +1 -1
  145. package/dist/cloud/workspace-sync.d.ts +67 -11
  146. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  147. package/dist/cloud/workspace-sync.js +299 -55
  148. package/dist/cloud/workspace-sync.js.map +1 -1
  149. package/dist/cloud/workspace.d.ts +74 -10
  150. package/dist/cloud/workspace.d.ts.map +1 -1
  151. package/dist/cloud/workspace.js +96 -8
  152. package/dist/cloud/workspace.js.map +1 -1
  153. package/dist/hosts/claude-global.js +1 -1
  154. package/dist/hosts/claude-global.js.map +1 -1
  155. package/dist/hosts/codex-hooks.d.ts +6 -0
  156. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  157. package/dist/hosts/codex-hooks.js +89 -16
  158. package/dist/hosts/codex-hooks.js.map +1 -1
  159. package/dist/hosts/codex-trust.d.ts +28 -0
  160. package/dist/hosts/codex-trust.d.ts.map +1 -0
  161. package/dist/hosts/codex-trust.js +280 -0
  162. package/dist/hosts/codex-trust.js.map +1 -0
  163. package/dist/hosts/cursor-hooks.d.ts.map +1 -1
  164. package/dist/hosts/cursor-hooks.js +3 -1
  165. package/dist/hosts/cursor-hooks.js.map +1 -1
  166. package/dist/init/candidates.d.ts +60 -0
  167. package/dist/init/candidates.d.ts.map +1 -0
  168. package/dist/init/candidates.js +202 -0
  169. package/dist/init/candidates.js.map +1 -0
  170. package/dist/init/claude-call.d.ts +51 -0
  171. package/dist/init/claude-call.d.ts.map +1 -0
  172. package/dist/init/claude-call.js +199 -0
  173. package/dist/init/claude-call.js.map +1 -0
  174. package/dist/init/discover-worker.d.ts +18 -0
  175. package/dist/init/discover-worker.d.ts.map +1 -0
  176. package/dist/init/discover-worker.js +111 -0
  177. package/dist/init/discover-worker.js.map +1 -0
  178. package/dist/init/handover.d.ts +16 -0
  179. package/dist/init/handover.d.ts.map +1 -0
  180. package/dist/init/handover.js +92 -0
  181. package/dist/init/handover.js.map +1 -0
  182. package/dist/init/howtos.d.ts +20 -0
  183. package/dist/init/howtos.d.ts.map +1 -0
  184. package/dist/init/howtos.js +90 -0
  185. package/dist/init/howtos.js.map +1 -0
  186. package/dist/init/init-record.d.ts +134 -0
  187. package/dist/init/init-record.d.ts.map +1 -0
  188. package/dist/init/init-record.js +339 -0
  189. package/dist/init/init-record.js.map +1 -0
  190. package/dist/init/install-paths.d.ts +6 -0
  191. package/dist/init/install-paths.d.ts.map +1 -0
  192. package/dist/init/install-paths.js +87 -0
  193. package/dist/init/install-paths.js.map +1 -0
  194. package/dist/init/keep-answer.d.ts +43 -0
  195. package/dist/init/keep-answer.d.ts.map +1 -0
  196. package/dist/init/keep-answer.js +118 -0
  197. package/dist/init/keep-answer.js.map +1 -0
  198. package/dist/init/keep-gate.d.ts +30 -0
  199. package/dist/init/keep-gate.d.ts.map +1 -0
  200. package/dist/init/keep-gate.js +178 -0
  201. package/dist/init/keep-gate.js.map +1 -0
  202. package/dist/init/keep-list.d.ts +67 -0
  203. package/dist/init/keep-list.d.ts.map +1 -0
  204. package/dist/init/keep-list.js +232 -0
  205. package/dist/init/keep-list.js.map +1 -0
  206. package/dist/init/keep.d.ts +52 -0
  207. package/dist/init/keep.d.ts.map +1 -0
  208. package/dist/init/keep.js +393 -0
  209. package/dist/init/keep.js.map +1 -0
  210. package/dist/init/look-back-mine.d.ts +37 -0
  211. package/dist/init/look-back-mine.d.ts.map +1 -0
  212. package/dist/init/look-back-mine.js +215 -0
  213. package/dist/init/look-back-mine.js.map +1 -0
  214. package/dist/init/look-back.d.ts +81 -0
  215. package/dist/init/look-back.d.ts.map +1 -0
  216. package/dist/init/look-back.js +170 -0
  217. package/dist/init/look-back.js.map +1 -0
  218. package/dist/init/miners.d.ts +46 -0
  219. package/dist/init/miners.d.ts.map +1 -0
  220. package/dist/init/miners.js +141 -0
  221. package/dist/init/miners.js.map +1 -0
  222. package/dist/init/name-call.d.ts +37 -0
  223. package/dist/init/name-call.d.ts.map +1 -0
  224. package/dist/init/name-call.js +151 -0
  225. package/dist/init/name-call.js.map +1 -0
  226. package/dist/init/plain-file.d.ts.map +1 -1
  227. package/dist/init/plain-file.js +3 -0
  228. package/dist/init/plain-file.js.map +1 -1
  229. package/dist/init/prefs.d.ts +70 -0
  230. package/dist/init/prefs.d.ts.map +1 -0
  231. package/dist/init/prefs.js +282 -0
  232. package/dist/init/prefs.js.map +1 -0
  233. package/dist/init/relay.d.ts +15 -0
  234. package/dist/init/relay.d.ts.map +1 -0
  235. package/dist/init/relay.js +15 -0
  236. package/dist/init/relay.js.map +1 -0
  237. package/dist/init/replay-runs.d.ts +121 -0
  238. package/dist/init/replay-runs.d.ts.map +1 -0
  239. package/dist/init/replay-runs.js +457 -0
  240. package/dist/init/replay-runs.js.map +1 -0
  241. package/dist/init/replay-tamper.d.ts +18 -0
  242. package/dist/init/replay-tamper.d.ts.map +1 -0
  243. package/dist/init/replay-tamper.js +87 -0
  244. package/dist/init/replay-tamper.js.map +1 -0
  245. package/dist/init/review-screen.d.ts +74 -0
  246. package/dist/init/review-screen.d.ts.map +1 -0
  247. package/dist/init/review-screen.js +258 -0
  248. package/dist/init/review-screen.js.map +1 -0
  249. package/dist/init/review-tty.d.ts +29 -0
  250. package/dist/init/review-tty.d.ts.map +1 -0
  251. package/dist/init/review-tty.js +218 -0
  252. package/dist/init/review-tty.js.map +1 -0
  253. package/dist/init/review.d.ts +12 -0
  254. package/dist/init/review.d.ts.map +1 -0
  255. package/dist/init/review.js +12 -0
  256. package/dist/init/review.js.map +1 -0
  257. package/dist/init/run.d.ts +87 -0
  258. package/dist/init/run.d.ts.map +1 -0
  259. package/dist/init/run.js +347 -0
  260. package/dist/init/run.js.map +1 -0
  261. package/dist/init/sessions.d.ts +63 -0
  262. package/dist/init/sessions.d.ts.map +1 -0
  263. package/dist/init/sessions.js +377 -0
  264. package/dist/init/sessions.js.map +1 -0
  265. package/dist/init/transcript.d.ts +81 -0
  266. package/dist/init/transcript.d.ts.map +1 -0
  267. package/dist/init/transcript.js +216 -0
  268. package/dist/init/transcript.js.map +1 -0
  269. package/dist/init/types.d.ts +139 -0
  270. package/dist/init/types.d.ts.map +1 -0
  271. package/dist/init/types.js +2 -0
  272. package/dist/init/types.js.map +1 -0
  273. package/dist/notes/cold-start.d.ts +5 -213
  274. package/dist/notes/cold-start.d.ts.map +1 -1
  275. package/dist/notes/cold-start.js +5 -654
  276. package/dist/notes/cold-start.js.map +1 -1
  277. package/dist/notes/edit-overlap.d.ts.map +1 -1
  278. package/dist/notes/edit-overlap.js +4 -1
  279. package/dist/notes/edit-overlap.js.map +1 -1
  280. package/dist/notes/notes.d.ts +8 -4
  281. package/dist/notes/notes.d.ts.map +1 -1
  282. package/dist/notes/notes.js +9 -7
  283. package/dist/notes/notes.js.map +1 -1
  284. package/dist/notes/pr-reviews.d.ts +4 -0
  285. package/dist/notes/pr-reviews.d.ts.map +1 -1
  286. package/dist/notes/pr-reviews.js +6 -5
  287. package/dist/notes/pr-reviews.js.map +1 -1
  288. package/dist/notes/repo-trail.d.ts +1 -1
  289. package/dist/notes/repo-trail.d.ts.map +1 -1
  290. package/dist/notes/repo-trail.js +24 -4
  291. package/dist/notes/repo-trail.js.map +1 -1
  292. package/dist/search/grep.d.ts.map +1 -1
  293. package/dist/search/grep.js +4 -2
  294. package/dist/search/grep.js.map +1 -1
  295. package/dist/search/user-regexp.d.ts +26 -0
  296. package/dist/search/user-regexp.d.ts.map +1 -0
  297. package/dist/search/user-regexp.js +150 -0
  298. package/dist/search/user-regexp.js.map +1 -0
  299. package/dist/skills/anchors-cli.d.ts +5 -0
  300. package/dist/skills/anchors-cli.d.ts.map +1 -1
  301. package/dist/skills/anchors-cli.js +7 -2
  302. package/dist/skills/anchors-cli.js.map +1 -1
  303. package/dist/skills/anchors-wide.js +2 -2
  304. package/dist/skills/anchors-wide.js.map +1 -1
  305. package/dist/skills/cli-skills-1b.d.ts +17 -0
  306. package/dist/skills/cli-skills-1b.d.ts.map +1 -0
  307. package/dist/skills/cli-skills-1b.js +166 -0
  308. package/dist/skills/cli-skills-1b.js.map +1 -0
  309. package/dist/skills/cli-skills-2.d.ts +35 -0
  310. package/dist/skills/cli-skills-2.d.ts.map +1 -0
  311. package/dist/skills/cli-skills-2.js +129 -0
  312. package/dist/skills/cli-skills-2.js.map +1 -0
  313. package/dist/skills/cli-skills-report-1b.d.ts +49 -0
  314. package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
  315. package/dist/skills/cli-skills-report-1b.js +191 -0
  316. package/dist/skills/cli-skills-report-1b.js.map +1 -0
  317. package/dist/skills/cli-skills-report.d.ts +86 -0
  318. package/dist/skills/cli-skills-report.d.ts.map +1 -0
  319. package/dist/skills/cli-skills-report.js +121 -0
  320. package/dist/skills/cli-skills-report.js.map +1 -0
  321. package/dist/skills/cli-skills.d.ts +30 -0
  322. package/dist/skills/cli-skills.d.ts.map +1 -0
  323. package/dist/skills/cli-skills.js +379 -0
  324. package/dist/skills/cli-skills.js.map +1 -0
  325. package/dist/skills/compile-split.d.ts.map +1 -1
  326. package/dist/skills/compile-split.js +18 -0
  327. package/dist/skills/compile-split.js.map +1 -1
  328. package/dist/skills/compile-words.d.ts +4 -1
  329. package/dist/skills/compile-words.d.ts.map +1 -1
  330. package/dist/skills/compile-words.js +68 -8
  331. package/dist/skills/compile-words.js.map +1 -1
  332. package/dist/skills/compile.d.ts +7 -0
  333. package/dist/skills/compile.d.ts.map +1 -1
  334. package/dist/skills/compile.js +17 -0
  335. package/dist/skills/compile.js.map +1 -1
  336. package/dist/skills/credit.d.ts +86 -0
  337. package/dist/skills/credit.d.ts.map +1 -0
  338. package/dist/skills/credit.js +259 -0
  339. package/dist/skills/credit.js.map +1 -0
  340. package/dist/skills/fold-gated.d.ts +3 -0
  341. package/dist/skills/fold-gated.d.ts.map +1 -0
  342. package/dist/skills/fold-gated.js +78 -0
  343. package/dist/skills/fold-gated.js.map +1 -0
  344. package/dist/skills/fold.d.ts +87 -0
  345. package/dist/skills/fold.d.ts.map +1 -0
  346. package/dist/skills/fold.js +348 -0
  347. package/dist/skills/fold.js.map +1 -0
  348. package/dist/skills/follow-learnings.d.ts +128 -0
  349. package/dist/skills/follow-learnings.d.ts.map +1 -0
  350. package/dist/skills/follow-learnings.js +278 -0
  351. package/dist/skills/follow-learnings.js.map +1 -0
  352. package/dist/skills/learning-steps.d.ts +43 -0
  353. package/dist/skills/learning-steps.d.ts.map +1 -0
  354. package/dist/skills/learning-steps.js +294 -0
  355. package/dist/skills/learning-steps.js.map +1 -0
  356. package/dist/skills/lesson-gate.d.ts +25 -0
  357. package/dist/skills/lesson-gate.d.ts.map +1 -0
  358. package/dist/skills/lesson-gate.js +316 -0
  359. package/dist/skills/lesson-gate.js.map +1 -0
  360. package/dist/skills/offer-drift.d.ts +35 -0
  361. package/dist/skills/offer-drift.d.ts.map +1 -0
  362. package/dist/skills/offer-drift.js +98 -0
  363. package/dist/skills/offer-drift.js.map +1 -0
  364. package/dist/skills/offer-lesson.d.ts +31 -0
  365. package/dist/skills/offer-lesson.d.ts.map +1 -0
  366. package/dist/skills/offer-lesson.js +123 -0
  367. package/dist/skills/offer-lesson.js.map +1 -0
  368. package/dist/skills/offer-lines.d.ts +40 -0
  369. package/dist/skills/offer-lines.d.ts.map +1 -0
  370. package/dist/skills/offer-lines.js +80 -0
  371. package/dist/skills/offer-lines.js.map +1 -0
  372. package/dist/skills/offer-moment.d.ts +102 -0
  373. package/dist/skills/offer-moment.d.ts.map +1 -0
  374. package/dist/skills/offer-moment.js +260 -0
  375. package/dist/skills/offer-moment.js.map +1 -0
  376. package/dist/skills/offer-repair.d.ts +36 -0
  377. package/dist/skills/offer-repair.d.ts.map +1 -0
  378. package/dist/skills/offer-repair.js +212 -0
  379. package/dist/skills/offer-repair.js.map +1 -0
  380. package/dist/skills/offer-retire.d.ts +53 -0
  381. package/dist/skills/offer-retire.d.ts.map +1 -0
  382. package/dist/skills/offer-retire.js +149 -0
  383. package/dist/skills/offer-retire.js.map +1 -0
  384. package/dist/skills/offer-update.d.ts +54 -0
  385. package/dist/skills/offer-update.d.ts.map +1 -0
  386. package/dist/skills/offer-update.js +115 -0
  387. package/dist/skills/offer-update.js.map +1 -0
  388. package/dist/skills/offer-words-1b.d.ts +32 -0
  389. package/dist/skills/offer-words-1b.d.ts.map +1 -0
  390. package/dist/skills/offer-words-1b.js +80 -0
  391. package/dist/skills/offer-words-1b.js.map +1 -0
  392. package/dist/skills/offer-words-2.d.ts +123 -0
  393. package/dist/skills/offer-words-2.d.ts.map +1 -0
  394. package/dist/skills/offer-words-2.js +194 -0
  395. package/dist/skills/offer-words-2.js.map +1 -0
  396. package/dist/skills/offer-words.d.ts +65 -0
  397. package/dist/skills/offer-words.d.ts.map +1 -0
  398. package/dist/skills/offer-words.js +205 -0
  399. package/dist/skills/offer-words.js.map +1 -0
  400. package/dist/skills/offers.d.ts +66 -0
  401. package/dist/skills/offers.d.ts.map +1 -0
  402. package/dist/skills/offers.js +284 -0
  403. package/dist/skills/offers.js.map +1 -0
  404. package/dist/skills/runblock.d.ts +2 -0
  405. package/dist/skills/runblock.d.ts.map +1 -1
  406. package/dist/skills/runblock.js +11 -6
  407. package/dist/skills/runblock.js.map +1 -1
  408. package/dist/skills/save-gate.d.ts +64 -0
  409. package/dist/skills/save-gate.d.ts.map +1 -0
  410. package/dist/skills/save-gate.js +354 -0
  411. package/dist/skills/save-gate.js.map +1 -0
  412. package/dist/skills/save-verify.d.ts +59 -0
  413. package/dist/skills/save-verify.d.ts.map +1 -0
  414. package/dist/skills/save-verify.js +390 -0
  415. package/dist/skills/save-verify.js.map +1 -0
  416. package/dist/skills/settings.d.ts +12 -2
  417. package/dist/skills/settings.d.ts.map +1 -1
  418. package/dist/skills/settings.js +24 -2
  419. package/dist/skills/settings.js.map +1 -1
  420. package/dist/skills/skills.d.ts +26 -8
  421. package/dist/skills/skills.d.ts.map +1 -1
  422. package/dist/skills/skills.js +105 -52
  423. package/dist/skills/skills.js.map +1 -1
  424. package/dist/skills/types.d.ts +8 -0
  425. package/dist/skills/types.d.ts.map +1 -1
  426. package/dist/skills/update-gate.d.ts +36 -0
  427. package/dist/skills/update-gate.d.ts.map +1 -0
  428. package/dist/skills/update-gate.js +357 -0
  429. package/dist/skills/update-gate.js.map +1 -0
  430. package/dist/skills/update-plan.d.ts +40 -0
  431. package/dist/skills/update-plan.d.ts.map +1 -0
  432. package/dist/skills/update-plan.js +196 -0
  433. package/dist/skills/update-plan.js.map +1 -0
  434. package/dist/skills/value-line.d.ts +94 -0
  435. package/dist/skills/value-line.d.ts.map +1 -0
  436. package/dist/skills/value-line.js +355 -0
  437. package/dist/skills/value-line.js.map +1 -0
  438. package/dist/telemetry/contract.d.ts +15 -1
  439. package/dist/telemetry/contract.d.ts.map +1 -1
  440. package/dist/telemetry/contract.js +80 -11
  441. package/dist/telemetry/contract.js.map +1 -1
  442. package/dist/telemetry/gate.js +4 -4
  443. package/dist/telemetry/gate.js.map +1 -1
  444. package/dist/telemetry/index.d.ts +1 -1
  445. package/dist/telemetry/index.d.ts.map +1 -1
  446. package/dist/telemetry/index.js +1 -1
  447. package/dist/telemetry/index.js.map +1 -1
  448. package/dist/telemetry/notice.js +5 -5
  449. package/dist/telemetry/notice.js.map +1 -1
  450. package/dist/telemetry/queue.d.ts.map +1 -1
  451. package/dist/telemetry/queue.js +7 -7
  452. package/dist/telemetry/queue.js.map +1 -1
  453. package/dist/telemetry/track.d.ts.map +1 -1
  454. package/dist/telemetry/track.js +4 -3
  455. package/dist/telemetry/track.js.map +1 -1
  456. package/dist/trace/checks.d.ts.map +1 -1
  457. package/dist/trace/checks.js +10 -2
  458. package/dist/trace/checks.js.map +1 -1
  459. package/dist/trace/gate-file.d.ts +1 -1
  460. package/dist/trace/gate-file.d.ts.map +1 -1
  461. package/dist/trace/gate-file.js +3 -3
  462. package/dist/trace/gate-file.js.map +1 -1
  463. package/dist/upkeep-run.d.ts.map +1 -1
  464. package/dist/upkeep-run.js +2 -23
  465. package/dist/upkeep-run.js.map +1 -1
  466. package/dist/upkeep.d.ts.map +1 -1
  467. package/dist/upkeep.js +2 -3
  468. package/dist/upkeep.js.map +1 -1
  469. package/dist/util/private-fs.d.ts +6 -0
  470. package/dist/util/private-fs.d.ts.map +1 -1
  471. package/dist/util/private-fs.js +9 -1
  472. package/dist/util/private-fs.js.map +1 -1
  473. package/dist/util/state.d.ts.map +1 -1
  474. package/dist/util/state.js +17 -3
  475. package/dist/util/state.js.map +1 -1
  476. package/package.json +1 -1
  477. package/dist/skills/found-skill.d.ts +0 -35
  478. package/dist/skills/found-skill.d.ts.map +0 -1
  479. package/dist/skills/found-skill.js +0 -66
  480. package/dist/skills/found-skill.js.map +0 -1
@@ -0,0 +1,457 @@
1
+ /**
2
+ * Init's replay of past sessions (design 4.2): a transcript's stretch goes
3
+ * through 1a's own transcript reader (`lineEvents`) and fold (`foldEvents`),
4
+ * turn by turn, with the Stop hook's end-of-turn judgement in between, so a
5
+ * run's verdict here is the verdict the live hooks reach on the same lines.
6
+ *
7
+ * Everything stays in memory: no run sheet, cursor or session file is
8
+ * written. Closed runs drop their calls as live (only wall hits stay); a run
9
+ * sheet is built only for a checked run of a moment-2 job, and only the
10
+ * newest 3 per job are held as the read goes, so a 200 MB transcript is read
11
+ * with bounded memory (R36). Typed lines stay as text in memory with a
12
+ * pointer (transcript, offset, sha of the line) that finds them again; the
13
+ * text goes when the worker returns (0 rule 6).
14
+ */
15
+ import { createHash } from 'node:crypto';
16
+ import { closeSync, readSync, statSync } from 'node:fs';
17
+ import { homedir } from 'node:os';
18
+ import { basename } from 'node:path';
19
+ import { repoPlace } from '../notes/home.js';
20
+ import { trailHome } from '../notes/trail-home.js';
21
+ import { compileRun } from '../skills/compile.js';
22
+ import { skillSha } from '../skills/offer-moment.js';
23
+ import { isKeepLine } from '../skills/offer-words.js';
24
+ import { renderSkillMd } from '../skills/skillmd.js';
25
+ import { nameTaken } from '../skills/store.js';
26
+ import { labInteractive } from '../skills/host-facts.js';
27
+ import { skillProblems } from '../skills/validate.js';
28
+ import { lineEvents, typedText } from '../trace/claude.js';
29
+ import { noteRepairs } from '../trace/repairs.js';
30
+ import { programOf } from '../trace/shell.js';
31
+ import { askText, MAX_ASK_WORDS, OFFER_FAMILIES, wordCount } from '../trace/jobs.js';
32
+ import { checkedSuccess, foldEvents, joinCarriedSheet, runHelpers } from '../trace/runs.js';
33
+ import { claudeTranscript, openPlain } from './plain-file.js';
34
+ import { tamperedBefore, turnOnly, writeMarkIn } from './replay-tamper.js';
35
+ import { dayOf, eachLine } from './transcript.js';
36
+ import { stepLearnings } from '../skills/follow-learnings.js';
37
+ /** A session's replay stops at this many runs (4.2 cost control). */
38
+ export const MAX_REPLAY_RUNS = 200;
39
+ /** ... or after this long. */
40
+ export const MAX_REPLAY_MS = 60_000;
41
+ /** Sheets held per job as the read goes (R36). */
42
+ const SHEETS_PER_JOB = 3;
43
+ /** Draft sheets held for a compaction's carried run to join (D59a). */
44
+ const MAX_DRAFTS = 6;
45
+ /** Typed text held per line: a preference is 25 words or fewer (4.4). */
46
+ const TYPED_CHARS = 600;
47
+ const sha256 = (s) => createHash('sha256').update(s).digest('hex');
48
+ /** 1a's session hash: sha256 of the session id, 12 hex. Claude Code names a transcript after its session id. */
49
+ export function sessionHashOf(path) {
50
+ return sha256(basename(path, '.jsonl')).slice(0, 12);
51
+ }
52
+ function newState(sh, repoKey, now) {
53
+ return {
54
+ v: 1, sessionHash: sh, host: 'claude', tier: 'A', learn: true, scopeKeys: repoKey ? [repoKey] : [], epoch: 0, pendingBoundary: false,
55
+ runs: [], pendingOffer: null, offerUsed: false, offerUsedBy: null, saveRequest: null, injected: [], credit: [], tampered: null,
56
+ updatedAt: now.toISOString(),
57
+ };
58
+ }
59
+ /** The run sheet 1a would have written (1a §2.4), built in memory: `writeRunSheet`'s shape, nothing on disk. */
60
+ export function sheetFromRun(run, sessionHash) {
61
+ const v = checkedSuccess(run, null);
62
+ const checked = v.checked && v.checkIndex !== null;
63
+ return {
64
+ v: 1, id: run.id, session: sessionHash, repoKey: run.repoKey, branch: run.branch, host: 'claude', tier: 'A', epoch: run.epoch,
65
+ startedAt: run.startedAt, endedAt: run.lastAt, job: run.job, jobWords: [...run.jobWords], sharedWords: [...run.sharedWords],
66
+ promptParams: { ...run.promptParams },
67
+ calls: run.calls.map((c) => (c.key === run.repoKey ? { ...c } : { ...c, cwd: null })),
68
+ checkIndex: checked ? v.checkIndex : null, checked, end: v.end,
69
+ counts: { commands: run.commands, failed: run.failedCount, toolCalls: run.toolCalls, edits: run.edits },
70
+ helpers: runHelpers(run), skillId: run.skillId ?? null, ...(run.carriedFrom ? { carriedFrom: run.carriedFrom } : {}),
71
+ };
72
+ }
73
+ class Stop extends Error {
74
+ }
75
+ /** What a reply may dress a line in (a fence, a quote, bold, end space), as the live Stop reads the offer (`withoutOffer`). */
76
+ const core = (t) => t.replace(/[*_`"'>\u2018\u2019\u201c\u201d]/gu, '').replace(/\s+/g, ' ').trim();
77
+ /** The offer's line 1 (4.12): "<what the check showed> That's the 3rd day I've worked out this release from scratch (…)." */
78
+ const OFFER_LINE_1 = /That['\u2019]?s the \S+ (?:day|time) I['\u2019]?ve worked out this .{1,60} from scratch \(/;
79
+ /**
80
+ * A reply without Trail's moment-2 offer lines at its end. The live Stop judged the run before the agent said them
81
+ * (the block continues the turn, and that Stop, `stop_hook_active`, judges nothing), so the replay reads the reply
82
+ * as live did: line 2 "Keep the n that worked as a skill …? (yes / show me / no)" read as a question would make
83
+ * the run a question, and line 1's "1 failed" a failure. '' when the reply was only the offer (b5 review).
84
+ */
85
+ export function withoutOfferLines(text) {
86
+ const lines = String(text ?? '').split(/\r?\n/);
87
+ const trim = () => {
88
+ while (lines.length && !core(lines[lines.length - 1]))
89
+ lines.pop();
90
+ };
91
+ trim();
92
+ if (!lines.length || !isKeepLine(core(lines[lines.length - 1]).replace(/[.\s]+$/u, '')))
93
+ return text;
94
+ lines.pop();
95
+ trim();
96
+ if (lines.length && OFFER_LINE_1.test(lines[lines.length - 1].replace(/\s+/g, ' ')))
97
+ lines.pop();
98
+ trim();
99
+ return lines.join('\n');
100
+ }
101
+ /** Claude Code's marker for a turn the person stopped: no Stop hook runs for it, so no end is judged. */
102
+ const INTERRUPTED = /^\[Request interrupted by user/;
103
+ /**
104
+ * One past session's stretch through 1a's parser and fold, in memory; nothing written. Run sheets are built only
105
+ * for checked runs of an OFFER_FAMILIES job, and only the newest 3 per job are kept as the read goes (R36).
106
+ * Never throws: an unreadable file replays to nothing.
107
+ */
108
+ export function replaySession(path, stretch, repoKey, now = new Date(), opts = {}) {
109
+ const env = opts.env ?? process.env;
110
+ const sh = sessionHashOf(path);
111
+ const out = { runs: [], sheets: [], typed: [], headless: false, sh, repoKey, path, size: 0, mtimeMs: 0, programs: [], stretch: { ...stretch } };
112
+ const programs = new Set();
113
+ try {
114
+ const st0 = statSync(path);
115
+ out.size = st0.size;
116
+ out.mtimeMs = st0.mtimeMs;
117
+ }
118
+ catch {
119
+ return out;
120
+ }
121
+ const maxRuns = opts.maxRuns ?? MAX_REPLAY_RUNS;
122
+ const deadline = Date.now() + (opts.maxMs ?? MAX_REPLAY_MS);
123
+ const st = newState(sh, repoKey, now);
124
+ const places = new Map();
125
+ const place = (p) => {
126
+ let v = places.get(p);
127
+ if (!v)
128
+ places.set(p, (v = repoPlace(p, env)));
129
+ return v;
130
+ };
131
+ /** Repo key -> the checkout it was first seen in. */
132
+ const roots = new Map();
133
+ const keyOf = (p) => {
134
+ const v = place(p);
135
+ if (!v.git)
136
+ return null;
137
+ if (!roots.has(v.key))
138
+ roots.set(v.key, v.checkout);
139
+ return v.key;
140
+ };
141
+ let ctx = null;
142
+ const ctxFor = (cwd) => {
143
+ const p = cwd ? place(cwd) : null;
144
+ return {
145
+ sessionHash: sh, checkout: p?.git ? p.checkout : '', repoKey, repoKeyOf: keyOf, rootOf: (q) => (place(q).git ? place(q).checkout : null),
146
+ trailHome: trailHome(env), transcriptPath: path, marks: [], now,
147
+ };
148
+ };
149
+ const runStart = new Map();
150
+ const drafts = [];
151
+ const byId = (id) => drafts.find((d) => d.id === id) ?? out.sheets.find((s) => s.sheet.id === id)?.sheet ?? null;
152
+ const draftFrom = new Map();
153
+ let started = 0;
154
+ const want = opts.want;
155
+ /** The replay stopped early: the wanted run was found, or no run can end at its end any more. */
156
+ let early = false;
157
+ /** `tampered`: the session had written Trail's or the host's files by the time the run closed, or the run was open
158
+ * in a turn that ran a hook script by hand. `whole`: closed by
159
+ * the line that ends it, or by the end of the file, not by a cut. */
160
+ const closeRun = (run, to, tampered, whole = true) => {
161
+ const from = runStart.get(run.id) ?? to;
162
+ if (run.stepCalls > 0 && run.calls.length) {
163
+ const sheet = sheetFromRun(run, sh);
164
+ run.sheet = sheet.checked ? 'checked' : 'draft';
165
+ run.checkIndex = sheet.checkIndex;
166
+ if (sheet.checked && run.job && OFFER_FAMILIES[run.job] && !tampered) {
167
+ const joined = joinCarriedSheet(sheet, byId);
168
+ const first = joined.joined?.[0]?.id;
169
+ const src = { from: first !== undefined ? draftFrom.get(first) ?? from : from, to };
170
+ out.sheets.push({ sheet: joined, src, root: roots.get(joined.repoKey) ?? '' });
171
+ if (want && whole && !out.wanted && src.from === want.from && src.to === want.to)
172
+ out.wanted = out.sheets[out.sheets.length - 1];
173
+ const same = out.sheets.filter((s) => s.sheet.job === run.job);
174
+ if (same.length > SHEETS_PER_JOB)
175
+ out.sheets.splice(out.sheets.indexOf(same[0]), 1);
176
+ }
177
+ else if (!sheet.checked && run.job) {
178
+ // A part a later carried run may join (D59a).
179
+ drafts.push(sheet);
180
+ draftFrom.set(sheet.id, from);
181
+ if (drafts.length > MAX_DRAFTS)
182
+ draftFrom.delete(drafts.shift().id);
183
+ }
184
+ }
185
+ for (const c of run.calls) {
186
+ const p = c.cmd ? programOf(c.cmd)?.split(' ')[0] : null;
187
+ if (p && programs.size < 200 && /^[\w.+-]{1,40}$/.test(p))
188
+ programs.add(p);
189
+ }
190
+ if (!opts.keepCalls)
191
+ run.calls = run.calls.filter((c) => c.wall !== undefined);
192
+ out.runs.push(run);
193
+ };
194
+ const memo = {};
195
+ /** Runs that were open in a turn that ran a hook script by hand (D135 (1)). */
196
+ const turnTainted = new Set();
197
+ let chunk = [];
198
+ let chunkAt = stretch.from;
199
+ let turnLast = '';
200
+ /** The person interrupted this turn: Claude Code runs no Stop for it (b5 review). */
201
+ let turnCut = false;
202
+ const fold = (endsTurn) => {
203
+ if (chunk.length) {
204
+ ctx ??= ctxFor('');
205
+ // The turn's last words as the live Stop judged them: before Trail's offer lines, which a block made the agent say.
206
+ for (const ev of chunk) {
207
+ if (ev.kind === 'assistant') {
208
+ const t = withoutOfferLines(ev.text);
209
+ if (t.trim())
210
+ turnLast = t.slice(-600);
211
+ }
212
+ else if (ev.kind === 'injected' && INTERRUPTED.test(ev.text))
213
+ turnCut = true;
214
+ }
215
+ const known = new Set(st.runs.map((r) => r.id));
216
+ // Closes happen at the chunk's first event, before any call in it: what the session had done by then.
217
+ const tampered = st.tampered !== null;
218
+ const res = foldEvents(st, chunk, ctx);
219
+ // A run starts at the typed line that opened it, or at its first call.
220
+ let first = chunk[0].kind === 'typed';
221
+ for (const r of st.runs) {
222
+ if (known.has(r.id) || runStart.has(r.id))
223
+ continue;
224
+ started += 1;
225
+ runStart.set(r.id, first && r.typedCount > 0 && !r.carriedFrom ? chunkAt : r.calls[0]?.src.use ?? chunkAt);
226
+ first = false;
227
+ }
228
+ // Runs close only at the chunk's first event: a typed line or a compaction.
229
+ for (const r of res.closed)
230
+ closeRun(r, chunkAt, tampered || turnTainted.has(r.id));
231
+ // D135 (1): a hook script run by hand taints only the runs open in its turn; a write still marks the session.
232
+ if (turnOnly(st.tampered)) {
233
+ for (const r of st.runs)
234
+ if (!r.closed)
235
+ turnTainted.add(r.id);
236
+ st.tampered = writeMarkIn(chunk, ctx);
237
+ }
238
+ chunk = [];
239
+ // Closes happen at chunk starts, which only grow: past the wanted end, no run can end there any more.
240
+ if (want && (out.wanted || chunkAt >= want.to)) {
241
+ early = true;
242
+ throw new Stop();
243
+ }
244
+ }
245
+ if (endsTurn) {
246
+ // The Stop hook at the end of the turn (3.5 step 4): the open run's end, from the turn's last words. A turn the
247
+ // person interrupted had no Stop.
248
+ const open = st.runs[st.runs.length - 1];
249
+ if (open && !open.closed && !turnCut)
250
+ open.end = checkedSuccess(open, turnLast || null).end;
251
+ turnLast = '';
252
+ turnCut = false;
253
+ }
254
+ if (started >= maxRuns) {
255
+ out.stopped = 'runs';
256
+ throw new Stop();
257
+ }
258
+ if (Date.now() > deadline) {
259
+ out.stopped = 'time';
260
+ throw new Stop();
261
+ }
262
+ };
263
+ try {
264
+ eachLine(path, (line, offset) => {
265
+ if (!(line.includes('"type":"user"') || line.includes('"type":"assistant"') || line.includes('"type":"attachment"') || line.includes('compact_boundary')))
266
+ return;
267
+ let entry;
268
+ try {
269
+ entry = JSON.parse(line);
270
+ }
271
+ catch {
272
+ return;
273
+ }
274
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry))
275
+ return;
276
+ // A script's run is headless, unless a lab home has the switch (D99, D136 (2)).
277
+ if (typeof entry.entrypoint === 'string' && entry.entrypoint.startsWith('sdk') && !labInteractive(env)) {
278
+ out.headless = true;
279
+ throw new Stop();
280
+ }
281
+ if (ctx === null && typeof entry.cwd === 'string' && entry.cwd)
282
+ ctx = ctxFor(entry.cwd);
283
+ for (const ev of lineEvents(entry, memo, offset, env)) {
284
+ if (ev.kind === 'typed' || ev.kind === 'compaction') {
285
+ fold(ev.kind === 'typed');
286
+ chunkAt = offset;
287
+ }
288
+ if (ev.kind === 'typed' && wordCount(askText(ev.text)) <= MAX_ASK_WORDS) {
289
+ out.typed.push({ ref: { t: path, o: offset, s: sha256(line) }, day: dayOf(ev.at), text: ev.text.slice(0, TYPED_CHARS), at: ev.at });
290
+ }
291
+ chunk.push(ev);
292
+ }
293
+ }, stretch);
294
+ fold(true);
295
+ }
296
+ catch (e) {
297
+ if (!(e instanceof Stop))
298
+ return { ...out, runs: [], sheets: [], typed: [] };
299
+ }
300
+ if (out.headless)
301
+ return { ...out, runs: [], sheets: [], typed: [] };
302
+ const finish = () => {
303
+ out.programs = [...programs];
304
+ return out;
305
+ };
306
+ if (early)
307
+ return finish();
308
+ // The end of the stretch closes what is still open (4.2: "or the end").
309
+ for (const r of st.runs) {
310
+ if (r.closed)
311
+ continue;
312
+ r.closed = true;
313
+ // As the fold does for a run it closes (b2): its repairs, while it still has its calls.
314
+ noteRepairs(r, { home: homedir(), root: ctx?.checkout ?? '' });
315
+ // A run closed by the stretch's end is whole only when the stretch is the rest of the file and was read to it.
316
+ closeRun(r, out.stopped ? chunkAt : stretch.to, st.tampered !== null || turnTainted.has(r.id), !out.stopped && stretch.to >= out.size);
317
+ }
318
+ return finish();
319
+ }
320
+ /**
321
+ * 1a's compile of one replayed sheet as moment 2 would offer it (4.5): `moment: 'repeated'`, its prior from
322
+ * memory, paths relativized against the run's own checkout, 2+ steps (D70) and no validator problem. The look-back
323
+ * and `recompileInitSkill` both call this, so the same range gives the same `skillSha`.
324
+ */
325
+ export function compileInitSkill(entry, prior, repoKey, env = process.env, now = new Date()) {
326
+ const scope = { repoKeys: [...new Set([repoKey, entry.sheet.repoKey])], checkout: entry.root, env };
327
+ const r = compileRun(entry.sheet, {
328
+ repoRoot: entry.root, home: env.HOME || homedir(), platform: process.platform, prior: prior?.sheet ?? null, moment: 'repeated',
329
+ applies: repoKey, now, readSheet: () => null, taken: (n) => nameTaken(n, scope) !== null,
330
+ learnings: stepLearnings({ repoKeys: [...new Set([repoKey, entry.sheet.repoKey])], checkout: entry.root, env }),
331
+ });
332
+ if (!r.ok)
333
+ return { ok: false, why: r.reason, detail: r.detail };
334
+ if (r.skill.steps.length < 2)
335
+ return { ok: false, why: 'one-step' };
336
+ const problems = skillProblems(renderSkillMd(r.skill), r.skill.name);
337
+ if (problems.length)
338
+ return { ok: false, why: 'invalid', detail: problems[0] };
339
+ return { ok: true, compiled: r.skill, skillSha: skillSha(r.skill) };
340
+ }
341
+ /**
342
+ * The run whose byte range is exactly `range`, found by replaying the whole transcript (D112): a range that is not one
343
+ * whole run there (cut short of its end, starting mid-run, or two runs glued together) is null, so an edited record
344
+ * can't make a skill of a run the session never checked. No run cap: the replay stops at the range's end.
345
+ */
346
+ function wholeRun(t, range, repoKey, env, now) {
347
+ let size;
348
+ try {
349
+ size = statSync(t).size;
350
+ }
351
+ catch {
352
+ return null;
353
+ }
354
+ if (!(Number.isSafeInteger(range.from) && Number.isSafeInteger(range.to) && range.from >= 0 && range.from < range.to && range.to <= size))
355
+ return null;
356
+ const r = replaySession(t, { from: 0, to: size }, repoKey, now, { env, want: range, maxRuns: Number.POSITIVE_INFINITY });
357
+ return r.headless || r.stopped ? null : r.wanted ?? null;
358
+ }
359
+ /**
360
+ * Compile one init skill again from its source (keep and `draft init-<n>`, R24): replay the whole source session and
361
+ * take the run whose range is exactly `src.run` (and `src.prior`'s), compile with the prior served from memory
362
+ * (findPriorSheet reads disk, R21). The file must be the one init read (size and mtime), nothing before the run may
363
+ * have written Trail's files, each range must be one whole run of its session (D112), and the compile must give the
364
+ * same `skillSha`.
365
+ */
366
+ export function recompileInitSkill(src, repoKey, env = process.env, now = new Date()) {
367
+ try {
368
+ let st;
369
+ try {
370
+ st = statSync(src.t);
371
+ }
372
+ catch {
373
+ return { ok: false, why: 'gone' };
374
+ }
375
+ if (!st.isFile())
376
+ return { ok: false, why: 'gone' };
377
+ // Only a transcript where Claude Code keeps them, reached with no link: the record is editable, and a file the
378
+ // agent wrote anywhere else could hold any steps it likes (R24, b5 review).
379
+ if (!claudeTranscript(src.t, env) || (src.prior && !claudeTranscript(src.prior.t, env)))
380
+ return { ok: false, why: 'refused' };
381
+ if (st.size !== src.size || st.mtimeMs !== src.mtimeMs)
382
+ return { ok: false, why: 'changed' };
383
+ const range = src.run;
384
+ if (!(Number.isSafeInteger(range.from) && Number.isSafeInteger(range.to) && range.from >= 0 && range.from < range.to && range.to <= st.size)) {
385
+ return { ok: false, why: 'changed' };
386
+ }
387
+ if (tamperedBefore(src.t, range.from, env))
388
+ return { ok: false, why: 'refused' };
389
+ const entry = wholeRun(src.t, range, repoKey, env, now);
390
+ if (!entry)
391
+ return { ok: false, why: 'changed' };
392
+ let prior = null;
393
+ if (src.prior) {
394
+ prior = wholeRun(src.prior.t, { from: src.prior.from, to: src.prior.to }, repoKey, env, now);
395
+ if (!prior)
396
+ return { ok: false, why: 'changed' };
397
+ }
398
+ const c = compileInitSkill(entry, prior, repoKey, env, now);
399
+ if (!c.ok)
400
+ return { ok: false, why: 'refused' };
401
+ return c.skillSha === src.skillSha ? { ok: true, compiled: c.compiled } : { ok: false, why: 'changed' };
402
+ }
403
+ catch {
404
+ return { ok: false, why: 'changed' };
405
+ }
406
+ }
407
+ const MAX_LINE = 2 * 1024 * 1024;
408
+ /**
409
+ * The person's typed words a pointer names, read again now: the line at `ref.o` in `ref.t`, only when its sha is
410
+ * still `ref.s`, it is still a line the person typed, and `ref.t` is a transcript in Claude Code's projects folder
411
+ * (`env`'s HOME), reached with no link: the pointer sits in an editable record, and a line in a file the agent wrote
412
+ * is not the person's. Null otherwise; never waits on a FIFO. The words are shown, never stored.
413
+ */
414
+ export function typedAt(ref, env = process.env) {
415
+ try {
416
+ if (!Number.isSafeInteger(ref.o) || ref.o < 0 || !/^[0-9a-f]{64}$/.test(ref.s))
417
+ return null;
418
+ if (!claudeTranscript(ref.t, env))
419
+ return null;
420
+ const fd = openPlain(ref.t);
421
+ let line;
422
+ try {
423
+ if (ref.o > 0) {
424
+ const b = Buffer.alloc(1);
425
+ if (readSync(fd, b, 0, 1, ref.o - 1) !== 1 || b[0] !== 0x0a)
426
+ return null;
427
+ }
428
+ const parts = [];
429
+ let size = 0;
430
+ const buf = Buffer.allocUnsafe(64 * 1024);
431
+ for (;;) {
432
+ const got = readSync(fd, buf, 0, buf.length, ref.o + size);
433
+ if (got <= 0)
434
+ break;
435
+ const nl = buf.subarray(0, got).indexOf(0x0a);
436
+ const piece = Buffer.from(buf.subarray(0, nl < 0 ? got : nl));
437
+ parts.push(piece);
438
+ size += piece.length;
439
+ if (nl >= 0 || size > MAX_LINE)
440
+ break;
441
+ }
442
+ if (size > MAX_LINE)
443
+ return null;
444
+ line = Buffer.concat(parts).toString('utf8');
445
+ }
446
+ finally {
447
+ closeSync(fd);
448
+ }
449
+ if (sha256(line) !== ref.s)
450
+ return null;
451
+ return typedText(JSON.parse(line), env) || null;
452
+ }
453
+ catch {
454
+ return null;
455
+ }
456
+ }
457
+ //# sourceMappingURL=replay-runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-runs.js","sourceRoot":"","sources":["../../src/init/replay-runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type TraceEvent } from '../trace/claude.js';
2
+ /** A mark that taints only its own turn when looking back. */
3
+ export declare const turnOnly: (mark: string | null) => boolean;
4
+ /**
5
+ * The first mark in a turn's events that is not turn-only: the fold keeps only the session's first mark, so a write
6
+ * after a hook run in the same turn would otherwise be lost when the turn's mark is cleared.
7
+ */
8
+ export declare function writeMarkIn(chunk: TraceEvent[], ctx: {
9
+ trailHome: string;
10
+ transcriptPath: string;
11
+ checkout?: string;
12
+ }): string | null;
13
+ /**
14
+ * Whether the session was tampered with before `to` (a run's start), as the look-back reads it: any write before it,
15
+ * or a hook script run by hand with no typed line between it and `to` (the line at `to` included).
16
+ */
17
+ export declare function tamperedBefore(path: string, to: number, env: NodeJS.ProcessEnv): boolean;
18
+ //# sourceMappingURL=replay-tamper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-tamper.d.ts","sourceRoot":"","sources":["../../src/init/replay-tamper.ts"],"names":[],"mappings":"AAWA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIjE,8DAA8D;AAC9D,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,GAAG,IAAI,KAAG,OAAoD,CAAC;AAQpG;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAQrI;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAkCxF"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The tamper check as init's look-back reads it (D135 (1)). Live, 1a's mark is session-wide: the first call that
3
+ * writes Trail's or the host's files, or runs a Trail hook script by hand, marks the session and it can never save a
4
+ * skill. Looking back, a hook script run by hand taints only its own turn, up to the next typed line: the review
5
+ * screen still gates every look-back item, and the 1b lab lost 16 days of runs to two sessions that once ran a hook
6
+ * to see what it said. A write still taints the rest of the session.
7
+ *
8
+ * Pure but for reading the transcript. Never throws: an unreadable file reads as tampered.
9
+ */
10
+ import { homedir } from 'node:os';
11
+ import { trailHome } from '../notes/trail-home.js';
12
+ import { lineEvents } from '../trace/claude.js';
13
+ import { isHookScriptTamper, tamperOf } from '../trace/tamper.js';
14
+ import { eachLine } from './transcript.js';
15
+ /** A mark that taints only its own turn when looking back. */
16
+ export const turnOnly = (mark) => mark !== null && isHookScriptTamper(mark);
17
+ function markOf(name, input, cwd, ctx) {
18
+ const inp = input && typeof input === 'object' ? input : {};
19
+ const raw = name === 'Bash' && typeof inp.command === 'string' ? inp.command : null;
20
+ return tamperOf(name, inp, raw, { ...ctx, folder: typeof cwd === 'string' && cwd ? cwd : ctx.folder ?? null });
21
+ }
22
+ /**
23
+ * The first mark in a turn's events that is not turn-only: the fold keeps only the session's first mark, so a write
24
+ * after a hook run in the same turn would otherwise be lost when the turn's mark is cleared.
25
+ */
26
+ export function writeMarkIn(chunk, ctx) {
27
+ const c = { trailHome: ctx.trailHome, transcriptPath: ctx.transcriptPath, home: homedir(), folder: ctx.checkout || null };
28
+ for (const ev of chunk) {
29
+ if (ev.kind !== 'tool_call')
30
+ continue;
31
+ const m = markOf(ev.name, ev.input, ev.cwd, c);
32
+ if (m && !turnOnly(m))
33
+ return m;
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Whether the session was tampered with before `to` (a run's start), as the look-back reads it: any write before it,
39
+ * or a hook script run by hand with no typed line between it and `to` (the line at `to` included).
40
+ */
41
+ export function tamperedBefore(path, to, env) {
42
+ const ctx = { trailHome: trailHome(env), transcriptPath: path, home: env.HOME || homedir() };
43
+ const memo = {};
44
+ let write = false;
45
+ let hook = false;
46
+ try {
47
+ eachLine(path, (line, offset) => {
48
+ if (write)
49
+ return;
50
+ const user = line.includes('"type":"user"');
51
+ if (!user && !line.includes('"tool_use"'))
52
+ return;
53
+ let e;
54
+ try {
55
+ e = JSON.parse(line);
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ if (!e || typeof e !== 'object')
61
+ return;
62
+ if (e.type === 'user') {
63
+ if (lineEvents(e, memo, offset, env).some((ev) => ev.kind === 'typed'))
64
+ hook = false;
65
+ return;
66
+ }
67
+ if (offset >= to || e.type !== 'assistant' || e.isSidechain || !Array.isArray(e.message?.content))
68
+ return;
69
+ for (const part of e.message.content) {
70
+ if (!part || part.type !== 'tool_use')
71
+ continue;
72
+ const m = markOf(String(part.name ?? ''), part.input, e.cwd, ctx);
73
+ if (!m)
74
+ continue;
75
+ if (turnOnly(m))
76
+ hook = true;
77
+ else
78
+ write = true;
79
+ }
80
+ }, { from: 0, to: to + 1 });
81
+ }
82
+ catch {
83
+ return true;
84
+ }
85
+ return write || hook;
86
+ }
87
+ //# sourceMappingURL=replay-tamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-tamper.js","sourceRoot":"","sources":["../../src/init/replay-tamper.ts"],"names":[],"mappings":"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"}