@nanonets/graft 0.24.0 → 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 (791) hide show
  1. package/README.md +26 -21
  2. package/dist/ask/ask.d.ts +8 -0
  3. package/dist/ask/ask.d.ts.map +1 -1
  4. package/dist/ask/ask.js +33 -12
  5. package/dist/ask/ask.js.map +1 -1
  6. package/dist/blast/render.js +1 -1
  7. package/dist/blast/render.js.map +1 -1
  8. package/dist/brand.js +1 -1
  9. package/dist/brand.js.map +1 -1
  10. package/dist/check/learning-edits.d.ts +18 -3
  11. package/dist/check/learning-edits.d.ts.map +1 -1
  12. package/dist/check/learning-edits.js +54 -10
  13. package/dist/check/learning-edits.js.map +1 -1
  14. package/dist/check/local-check.d.ts +7 -3
  15. package/dist/check/local-check.d.ts.map +1 -1
  16. package/dist/check/local-check.js +55 -11
  17. package/dist/check/local-check.js.map +1 -1
  18. package/dist/check/types.d.ts +11 -2
  19. package/dist/check/types.d.ts.map +1 -1
  20. package/dist/claude/format.d.ts +11 -7
  21. package/dist/claude/format.d.ts.map +1 -1
  22. package/dist/claude/format.js +50 -28
  23. package/dist/claude/format.js.map +1 -1
  24. package/dist/claude/hook-io.d.ts +44 -0
  25. package/dist/claude/hook-io.d.ts.map +1 -0
  26. package/dist/claude/hook-io.js +144 -0
  27. package/dist/claude/hook-io.js.map +1 -0
  28. package/dist/claude/hook-layers.d.ts +4 -2
  29. package/dist/claude/hook-layers.d.ts.map +1 -1
  30. package/dist/claude/hook-layers.js +21 -4
  31. package/dist/claude/hook-layers.js.map +1 -1
  32. package/dist/claude/hooks.d.ts +9 -32
  33. package/dist/claude/hooks.d.ts.map +1 -1
  34. package/dist/claude/hooks.js +154 -350
  35. package/dist/claude/hooks.js.map +1 -1
  36. package/dist/claude/init.d.ts.map +1 -1
  37. package/dist/claude/init.js +56 -18
  38. package/dist/claude/init.js.map +1 -1
  39. package/dist/claude/note-signals.d.ts +6 -0
  40. package/dist/claude/note-signals.d.ts.map +1 -1
  41. package/dist/claude/note-signals.js +14 -3
  42. package/dist/claude/note-signals.js.map +1 -1
  43. package/dist/claude/post-bash.d.ts +26 -0
  44. package/dist/claude/post-bash.d.ts.map +1 -0
  45. package/dist/claude/post-bash.js +191 -0
  46. package/dist/claude/post-bash.js.map +1 -0
  47. package/dist/claude/pre-bash-skills.d.ts +21 -0
  48. package/dist/claude/pre-bash-skills.d.ts.map +1 -0
  49. package/dist/claude/pre-bash-skills.js +253 -0
  50. package/dist/claude/pre-bash-skills.js.map +1 -0
  51. package/dist/claude/pre-bash.d.ts +50 -0
  52. package/dist/claude/pre-bash.d.ts.map +1 -0
  53. package/dist/claude/pre-bash.js +245 -0
  54. package/dist/claude/pre-bash.js.map +1 -0
  55. package/dist/claude/prompt-consent.d.ts +19 -0
  56. package/dist/claude/prompt-consent.d.ts.map +1 -0
  57. package/dist/claude/prompt-consent.js +14 -0
  58. package/dist/claude/prompt-consent.js.map +1 -0
  59. package/dist/claude/prompt-hook.d.ts +76 -0
  60. package/dist/claude/prompt-hook.d.ts.map +1 -0
  61. package/dist/claude/prompt-hook.js +303 -0
  62. package/dist/claude/prompt-hook.js.map +1 -0
  63. package/dist/claude/prompt-skills.d.ts +19 -0
  64. package/dist/claude/prompt-skills.d.ts.map +1 -0
  65. package/dist/claude/prompt-skills.js +305 -0
  66. package/dist/claude/prompt-skills.js.map +1 -0
  67. package/dist/claude/session-metrics.js +4 -4
  68. package/dist/claude/session-metrics.js.map +1 -1
  69. package/dist/claude/settings-merge.d.ts +10 -0
  70. package/dist/claude/settings-merge.d.ts.map +1 -1
  71. package/dist/claude/settings-merge.js +46 -17
  72. package/dist/claude/settings-merge.js.map +1 -1
  73. package/dist/claude/shim-template.d.ts.map +1 -1
  74. package/dist/claude/shim-template.js +86 -28
  75. package/dist/claude/shim-template.js.map +1 -1
  76. package/dist/claude/skill-template.d.ts +2 -0
  77. package/dist/claude/skill-template.d.ts.map +1 -1
  78. package/dist/claude/skill-template.js +53 -34
  79. package/dist/claude/skill-template.js.map +1 -1
  80. package/dist/claude/skill-use.d.ts +16 -0
  81. package/dist/claude/skill-use.d.ts.map +1 -0
  82. package/dist/claude/skill-use.js +78 -0
  83. package/dist/claude/skill-use.js.map +1 -0
  84. package/dist/claude/skills-hook-util.d.ts +25 -0
  85. package/dist/claude/skills-hook-util.d.ts.map +1 -0
  86. package/dist/claude/skills-hook-util.js +71 -0
  87. package/dist/claude/skills-hook-util.js.map +1 -0
  88. package/dist/claude/skills-wiring.d.ts +26 -0
  89. package/dist/claude/skills-wiring.d.ts.map +1 -0
  90. package/dist/claude/skills-wiring.js +110 -0
  91. package/dist/claude/skills-wiring.js.map +1 -0
  92. package/dist/claude/start-init.d.ts +13 -0
  93. package/dist/claude/start-init.d.ts.map +1 -0
  94. package/dist/claude/start-init.js +75 -0
  95. package/dist/claude/start-init.js.map +1 -0
  96. package/dist/claude/start-skills.d.ts +31 -0
  97. package/dist/claude/start-skills.d.ts.map +1 -0
  98. package/dist/claude/start-skills.js +274 -0
  99. package/dist/claude/start-skills.js.map +1 -0
  100. package/dist/claude/state.d.ts +19 -7
  101. package/dist/claude/state.d.ts.map +1 -1
  102. package/dist/claude/state.js +59 -4
  103. package/dist/claude/state.js.map +1 -1
  104. package/dist/claude/stop-skills.d.ts +23 -0
  105. package/dist/claude/stop-skills.d.ts.map +1 -0
  106. package/dist/claude/stop-skills.js +233 -0
  107. package/dist/claude/stop-skills.js.map +1 -0
  108. package/dist/claude/stop.d.ts +23 -0
  109. package/dist/claude/stop.d.ts.map +1 -0
  110. package/dist/claude/stop.js +219 -0
  111. package/dist/claude/stop.js.map +1 -0
  112. package/dist/claude/tally.d.ts +29 -41
  113. package/dist/claude/tally.d.ts.map +1 -1
  114. package/dist/claude/tally.js +111 -165
  115. package/dist/claude/tally.js.map +1 -1
  116. package/dist/claude/walls-hook.d.ts +52 -0
  117. package/dist/claude/walls-hook.d.ts.map +1 -0
  118. package/dist/claude/walls-hook.js +279 -0
  119. package/dist/claude/walls-hook.js.map +1 -0
  120. package/dist/cli-epilogue.d.ts.map +1 -1
  121. package/dist/cli-epilogue.js +24 -14
  122. package/dist/cli-epilogue.js.map +1 -1
  123. package/dist/cli-meta.js +3 -3
  124. package/dist/cli-meta.js.map +1 -1
  125. package/dist/cli-picker.d.ts +24 -0
  126. package/dist/cli-picker.d.ts.map +1 -1
  127. package/dist/cli-picker.js +44 -11
  128. package/dist/cli-picker.js.map +1 -1
  129. package/dist/cli.d.ts.map +1 -1
  130. package/dist/cli.js +475 -390
  131. package/dist/cli.js.map +1 -1
  132. package/dist/cloud/head-learnings.d.ts +13 -0
  133. package/dist/cloud/head-learnings.d.ts.map +1 -0
  134. package/dist/cloud/head-learnings.js +84 -0
  135. package/dist/cloud/head-learnings.js.map +1 -0
  136. package/dist/cloud/lookup-activity.d.ts +18 -0
  137. package/dist/cloud/lookup-activity.d.ts.map +1 -0
  138. package/dist/cloud/lookup-activity.js +56 -0
  139. package/dist/cloud/lookup-activity.js.map +1 -0
  140. package/dist/cloud/nudge.d.ts +15 -7
  141. package/dist/cloud/nudge.d.ts.map +1 -1
  142. package/dist/cloud/nudge.js +45 -33
  143. package/dist/cloud/nudge.js.map +1 -1
  144. package/dist/cloud/onboarding.d.ts +273 -0
  145. package/dist/cloud/onboarding.d.ts.map +1 -0
  146. package/dist/cloud/onboarding.js +612 -0
  147. package/dist/cloud/onboarding.js.map +1 -0
  148. package/dist/cloud/other-repos.d.ts +39 -0
  149. package/dist/cloud/other-repos.d.ts.map +1 -0
  150. package/dist/cloud/other-repos.js +137 -0
  151. package/dist/cloud/other-repos.js.map +1 -0
  152. package/dist/cloud/pair.d.ts +86 -0
  153. package/dist/cloud/pair.d.ts.map +1 -0
  154. package/dist/cloud/pair.js +270 -0
  155. package/dist/cloud/pair.js.map +1 -0
  156. package/dist/cloud/workspace-sync.d.ts +75 -11
  157. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  158. package/dist/cloud/workspace-sync.js +409 -53
  159. package/dist/cloud/workspace-sync.js.map +1 -1
  160. package/dist/cloud/workspace.d.ts +95 -10
  161. package/dist/cloud/workspace.d.ts.map +1 -1
  162. package/dist/cloud/workspace.js +112 -9
  163. package/dist/cloud/workspace.js.map +1 -1
  164. package/dist/graph/native.d.ts +2 -0
  165. package/dist/graph/native.d.ts.map +1 -1
  166. package/dist/graph/native.js +29 -4
  167. package/dist/graph/native.js.map +1 -1
  168. package/dist/hosts/claude-global.d.ts +14 -0
  169. package/dist/hosts/claude-global.d.ts.map +1 -1
  170. package/dist/hosts/claude-global.js +39 -4
  171. package/dist/hosts/claude-global.js.map +1 -1
  172. package/dist/hosts/codex-hooks.d.ts +6 -0
  173. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  174. package/dist/hosts/codex-hooks.js +89 -16
  175. package/dist/hosts/codex-hooks.js.map +1 -1
  176. package/dist/hosts/codex-trust.d.ts +28 -0
  177. package/dist/hosts/codex-trust.d.ts.map +1 -0
  178. package/dist/hosts/codex-trust.js +280 -0
  179. package/dist/hosts/codex-trust.js.map +1 -0
  180. package/dist/hosts/cursor-hooks.d.ts.map +1 -1
  181. package/dist/hosts/cursor-hooks.js +3 -1
  182. package/dist/hosts/cursor-hooks.js.map +1 -1
  183. package/dist/init/candidates.d.ts +60 -0
  184. package/dist/init/candidates.d.ts.map +1 -0
  185. package/dist/init/candidates.js +202 -0
  186. package/dist/init/candidates.js.map +1 -0
  187. package/dist/init/claude-call.d.ts +51 -0
  188. package/dist/init/claude-call.d.ts.map +1 -0
  189. package/dist/init/claude-call.js +199 -0
  190. package/dist/init/claude-call.js.map +1 -0
  191. package/dist/init/discover-worker.d.ts +18 -0
  192. package/dist/init/discover-worker.d.ts.map +1 -0
  193. package/dist/init/discover-worker.js +111 -0
  194. package/dist/init/discover-worker.js.map +1 -0
  195. package/dist/init/handover.d.ts +16 -0
  196. package/dist/init/handover.d.ts.map +1 -0
  197. package/dist/init/handover.js +92 -0
  198. package/dist/init/handover.js.map +1 -0
  199. package/dist/init/howtos.d.ts +20 -0
  200. package/dist/init/howtos.d.ts.map +1 -0
  201. package/dist/init/howtos.js +90 -0
  202. package/dist/init/howtos.js.map +1 -0
  203. package/dist/init/init-record.d.ts +134 -0
  204. package/dist/init/init-record.d.ts.map +1 -0
  205. package/dist/init/init-record.js +339 -0
  206. package/dist/init/init-record.js.map +1 -0
  207. package/dist/init/install-paths.d.ts +6 -0
  208. package/dist/init/install-paths.d.ts.map +1 -0
  209. package/dist/init/install-paths.js +87 -0
  210. package/dist/init/install-paths.js.map +1 -0
  211. package/dist/init/install-record.d.ts +21 -0
  212. package/dist/init/install-record.d.ts.map +1 -0
  213. package/dist/init/install-record.js +144 -0
  214. package/dist/init/install-record.js.map +1 -0
  215. package/dist/init/keep-answer.d.ts +43 -0
  216. package/dist/init/keep-answer.d.ts.map +1 -0
  217. package/dist/init/keep-answer.js +118 -0
  218. package/dist/init/keep-answer.js.map +1 -0
  219. package/dist/init/keep-gate.d.ts +30 -0
  220. package/dist/init/keep-gate.d.ts.map +1 -0
  221. package/dist/init/keep-gate.js +178 -0
  222. package/dist/init/keep-gate.js.map +1 -0
  223. package/dist/init/keep-list.d.ts +67 -0
  224. package/dist/init/keep-list.d.ts.map +1 -0
  225. package/dist/init/keep-list.js +232 -0
  226. package/dist/init/keep-list.js.map +1 -0
  227. package/dist/init/keep.d.ts +52 -0
  228. package/dist/init/keep.d.ts.map +1 -0
  229. package/dist/init/keep.js +393 -0
  230. package/dist/init/keep.js.map +1 -0
  231. package/dist/init/look-back-mine.d.ts +37 -0
  232. package/dist/init/look-back-mine.d.ts.map +1 -0
  233. package/dist/init/look-back-mine.js +215 -0
  234. package/dist/init/look-back-mine.js.map +1 -0
  235. package/dist/init/look-back.d.ts +81 -0
  236. package/dist/init/look-back.d.ts.map +1 -0
  237. package/dist/init/look-back.js +170 -0
  238. package/dist/init/look-back.js.map +1 -0
  239. package/dist/init/miners.d.ts +46 -0
  240. package/dist/init/miners.d.ts.map +1 -0
  241. package/dist/init/miners.js +141 -0
  242. package/dist/init/miners.js.map +1 -0
  243. package/dist/init/name-call.d.ts +37 -0
  244. package/dist/init/name-call.d.ts.map +1 -0
  245. package/dist/init/name-call.js +151 -0
  246. package/dist/init/name-call.js.map +1 -0
  247. package/dist/init/plain-file.d.ts +11 -0
  248. package/dist/init/plain-file.d.ts.map +1 -0
  249. package/dist/init/plain-file.js +83 -0
  250. package/dist/init/plain-file.js.map +1 -0
  251. package/dist/init/prefs.d.ts +70 -0
  252. package/dist/init/prefs.d.ts.map +1 -0
  253. package/dist/init/prefs.js +282 -0
  254. package/dist/init/prefs.js.map +1 -0
  255. package/dist/init/relay.d.ts +15 -0
  256. package/dist/init/relay.d.ts.map +1 -0
  257. package/dist/init/relay.js +15 -0
  258. package/dist/init/relay.js.map +1 -0
  259. package/dist/init/replay-runs.d.ts +121 -0
  260. package/dist/init/replay-runs.d.ts.map +1 -0
  261. package/dist/init/replay-runs.js +457 -0
  262. package/dist/init/replay-runs.js.map +1 -0
  263. package/dist/init/replay-tamper.d.ts +18 -0
  264. package/dist/init/replay-tamper.d.ts.map +1 -0
  265. package/dist/init/replay-tamper.js +87 -0
  266. package/dist/init/replay-tamper.js.map +1 -0
  267. package/dist/init/review-screen.d.ts +74 -0
  268. package/dist/init/review-screen.d.ts.map +1 -0
  269. package/dist/init/review-screen.js +258 -0
  270. package/dist/init/review-screen.js.map +1 -0
  271. package/dist/init/review-tty.d.ts +29 -0
  272. package/dist/init/review-tty.d.ts.map +1 -0
  273. package/dist/init/review-tty.js +218 -0
  274. package/dist/init/review-tty.js.map +1 -0
  275. package/dist/init/review.d.ts +12 -0
  276. package/dist/init/review.d.ts.map +1 -0
  277. package/dist/init/review.js +12 -0
  278. package/dist/init/review.js.map +1 -0
  279. package/dist/init/run.d.ts +87 -0
  280. package/dist/init/run.d.ts.map +1 -0
  281. package/dist/init/run.js +347 -0
  282. package/dist/init/run.js.map +1 -0
  283. package/dist/init/sessions.d.ts +63 -0
  284. package/dist/init/sessions.d.ts.map +1 -0
  285. package/dist/init/sessions.js +377 -0
  286. package/dist/init/sessions.js.map +1 -0
  287. package/dist/init/transcript.d.ts +81 -0
  288. package/dist/init/transcript.d.ts.map +1 -0
  289. package/dist/init/transcript.js +216 -0
  290. package/dist/init/transcript.js.map +1 -0
  291. package/dist/init/types.d.ts +139 -0
  292. package/dist/init/types.d.ts.map +1 -0
  293. package/dist/init/types.js +2 -0
  294. package/dist/init/types.js.map +1 -0
  295. package/dist/mcp/brains.d.ts +72 -0
  296. package/dist/mcp/brains.d.ts.map +1 -0
  297. package/dist/mcp/brains.js +220 -0
  298. package/dist/mcp/brains.js.map +1 -0
  299. package/dist/mcp/server.d.ts +3 -1
  300. package/dist/mcp/server.d.ts.map +1 -1
  301. package/dist/mcp/server.js +40 -5
  302. package/dist/mcp/server.js.map +1 -1
  303. package/dist/mcp/tools.d.ts.map +1 -1
  304. package/dist/mcp/tools.js +7 -2
  305. package/dist/mcp/tools.js.map +1 -1
  306. package/dist/notes/cold-start.d.ts +5 -184
  307. package/dist/notes/cold-start.d.ts.map +1 -1
  308. package/dist/notes/cold-start.js +5 -575
  309. package/dist/notes/cold-start.js.map +1 -1
  310. package/dist/notes/edit-overlap.d.ts.map +1 -1
  311. package/dist/notes/edit-overlap.js +4 -1
  312. package/dist/notes/edit-overlap.js.map +1 -1
  313. package/dist/notes/every-repo.d.ts +18 -0
  314. package/dist/notes/every-repo.d.ts.map +1 -0
  315. package/dist/notes/every-repo.js +86 -0
  316. package/dist/notes/every-repo.js.map +1 -0
  317. package/dist/notes/guardrails.d.ts +8 -0
  318. package/dist/notes/guardrails.d.ts.map +1 -0
  319. package/dist/notes/guardrails.js +38 -0
  320. package/dist/notes/guardrails.js.map +1 -0
  321. package/dist/notes/lesson-index.d.ts +13 -0
  322. package/dist/notes/lesson-index.d.ts.map +1 -0
  323. package/dist/notes/lesson-index.js +135 -0
  324. package/dist/notes/lesson-index.js.map +1 -0
  325. package/dist/notes/linked-learnings.d.ts +8 -0
  326. package/dist/notes/linked-learnings.d.ts.map +1 -0
  327. package/dist/notes/linked-learnings.js +113 -0
  328. package/dist/notes/linked-learnings.js.map +1 -0
  329. package/dist/notes/notes.d.ts +8 -4
  330. package/dist/notes/notes.d.ts.map +1 -1
  331. package/dist/notes/notes.js +9 -7
  332. package/dist/notes/notes.js.map +1 -1
  333. package/dist/notes/pr-reviews.d.ts +4 -0
  334. package/dist/notes/pr-reviews.d.ts.map +1 -1
  335. package/dist/notes/pr-reviews.js +6 -5
  336. package/dist/notes/pr-reviews.js.map +1 -1
  337. package/dist/notes/replace.d.ts +14 -0
  338. package/dist/notes/replace.d.ts.map +1 -0
  339. package/dist/notes/replace.js +38 -0
  340. package/dist/notes/replace.js.map +1 -0
  341. package/dist/notes/repo-notes-dir.d.ts +2 -0
  342. package/dist/notes/repo-notes-dir.d.ts.map +1 -0
  343. package/dist/notes/repo-notes-dir.js +16 -0
  344. package/dist/notes/repo-notes-dir.js.map +1 -0
  345. package/dist/notes/repo-trail.d.ts +1 -1
  346. package/dist/notes/repo-trail.d.ts.map +1 -1
  347. package/dist/notes/repo-trail.js +24 -4
  348. package/dist/notes/repo-trail.js.map +1 -1
  349. package/dist/search/grep.d.ts.map +1 -1
  350. package/dist/search/grep.js +4 -2
  351. package/dist/search/grep.js.map +1 -1
  352. package/dist/search/user-regexp.d.ts +26 -0
  353. package/dist/search/user-regexp.d.ts.map +1 -0
  354. package/dist/search/user-regexp.js +150 -0
  355. package/dist/search/user-regexp.js.map +1 -0
  356. package/dist/skills/anchors-cli.d.ts +38 -0
  357. package/dist/skills/anchors-cli.d.ts.map +1 -0
  358. package/dist/skills/anchors-cli.js +279 -0
  359. package/dist/skills/anchors-cli.js.map +1 -0
  360. package/dist/skills/anchors-git.d.ts +29 -0
  361. package/dist/skills/anchors-git.d.ts.map +1 -0
  362. package/dist/skills/anchors-git.js +241 -0
  363. package/dist/skills/anchors-git.js.map +1 -0
  364. package/dist/skills/anchors-wide.d.ts +25 -0
  365. package/dist/skills/anchors-wide.d.ts.map +1 -0
  366. package/dist/skills/anchors-wide.js +481 -0
  367. package/dist/skills/anchors-wide.js.map +1 -0
  368. package/dist/skills/anchors.d.ts +32 -0
  369. package/dist/skills/anchors.d.ts.map +1 -0
  370. package/dist/skills/anchors.js +485 -0
  371. package/dist/skills/anchors.js.map +1 -0
  372. package/dist/skills/check-result.d.ts +26 -0
  373. package/dist/skills/check-result.d.ts.map +1 -0
  374. package/dist/skills/check-result.js +46 -0
  375. package/dist/skills/check-result.js.map +1 -0
  376. package/dist/skills/cli-skills-1b.d.ts +17 -0
  377. package/dist/skills/cli-skills-1b.d.ts.map +1 -0
  378. package/dist/skills/cli-skills-1b.js +166 -0
  379. package/dist/skills/cli-skills-1b.js.map +1 -0
  380. package/dist/skills/cli-skills-2.d.ts +35 -0
  381. package/dist/skills/cli-skills-2.d.ts.map +1 -0
  382. package/dist/skills/cli-skills-2.js +129 -0
  383. package/dist/skills/cli-skills-2.js.map +1 -0
  384. package/dist/skills/cli-skills-report-1b.d.ts +49 -0
  385. package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
  386. package/dist/skills/cli-skills-report-1b.js +191 -0
  387. package/dist/skills/cli-skills-report-1b.js.map +1 -0
  388. package/dist/skills/cli-skills-report.d.ts +86 -0
  389. package/dist/skills/cli-skills-report.d.ts.map +1 -0
  390. package/dist/skills/cli-skills-report.js +121 -0
  391. package/dist/skills/cli-skills-report.js.map +1 -0
  392. package/dist/skills/cli-skills.d.ts +30 -0
  393. package/dist/skills/cli-skills.d.ts.map +1 -0
  394. package/dist/skills/cli-skills.js +379 -0
  395. package/dist/skills/cli-skills.js.map +1 -0
  396. package/dist/skills/codex-sandbox.d.ts +6 -0
  397. package/dist/skills/codex-sandbox.d.ts.map +1 -0
  398. package/dist/skills/codex-sandbox.js +55 -0
  399. package/dist/skills/codex-sandbox.js.map +1 -0
  400. package/dist/skills/compile-split.d.ts +57 -0
  401. package/dist/skills/compile-split.d.ts.map +1 -0
  402. package/dist/skills/compile-split.js +550 -0
  403. package/dist/skills/compile-split.js.map +1 -0
  404. package/dist/skills/compile-version.d.ts +37 -0
  405. package/dist/skills/compile-version.d.ts.map +1 -0
  406. package/dist/skills/compile-version.js +56 -0
  407. package/dist/skills/compile-version.js.map +1 -0
  408. package/dist/skills/compile-waits.d.ts +12 -0
  409. package/dist/skills/compile-waits.d.ts.map +1 -0
  410. package/dist/skills/compile-waits.js +52 -0
  411. package/dist/skills/compile-waits.js.map +1 -0
  412. package/dist/skills/compile-words.d.ts +85 -0
  413. package/dist/skills/compile-words.d.ts.map +1 -0
  414. package/dist/skills/compile-words.js +445 -0
  415. package/dist/skills/compile-words.js.map +1 -0
  416. package/dist/skills/compile.d.ts +42 -0
  417. package/dist/skills/compile.d.ts.map +1 -0
  418. package/dist/skills/compile.js +505 -0
  419. package/dist/skills/compile.js.map +1 -0
  420. package/dist/skills/credit-facts.d.ts +8 -0
  421. package/dist/skills/credit-facts.d.ts.map +1 -0
  422. package/dist/skills/credit-facts.js +32 -0
  423. package/dist/skills/credit-facts.js.map +1 -0
  424. package/dist/skills/credit.d.ts +86 -0
  425. package/dist/skills/credit.d.ts.map +1 -0
  426. package/dist/skills/credit.js +259 -0
  427. package/dist/skills/credit.js.map +1 -0
  428. package/dist/skills/directive-words.d.ts +11 -0
  429. package/dist/skills/directive-words.d.ts.map +1 -0
  430. package/dist/skills/directive-words.js +33 -0
  431. package/dist/skills/directive-words.js.map +1 -0
  432. package/dist/skills/fidelity.d.ts +42 -0
  433. package/dist/skills/fidelity.d.ts.map +1 -0
  434. package/dist/skills/fidelity.js +138 -0
  435. package/dist/skills/fidelity.js.map +1 -0
  436. package/dist/skills/fold-gated.d.ts +3 -0
  437. package/dist/skills/fold-gated.d.ts.map +1 -0
  438. package/dist/skills/fold-gated.js +78 -0
  439. package/dist/skills/fold-gated.js.map +1 -0
  440. package/dist/skills/fold.d.ts +87 -0
  441. package/dist/skills/fold.d.ts.map +1 -0
  442. package/dist/skills/fold.js +348 -0
  443. package/dist/skills/fold.js.map +1 -0
  444. package/dist/skills/follow-learnings.d.ts +128 -0
  445. package/dist/skills/follow-learnings.d.ts.map +1 -0
  446. package/dist/skills/follow-learnings.js +278 -0
  447. package/dist/skills/follow-learnings.js.map +1 -0
  448. package/dist/skills/forget-notice.d.ts +44 -0
  449. package/dist/skills/forget-notice.d.ts.map +1 -0
  450. package/dist/skills/forget-notice.js +131 -0
  451. package/dist/skills/forget-notice.js.map +1 -0
  452. package/dist/skills/front-version.d.ts +12 -0
  453. package/dist/skills/front-version.d.ts.map +1 -0
  454. package/dist/skills/front-version.js +87 -0
  455. package/dist/skills/front-version.js.map +1 -0
  456. package/dist/skills/host-facts.d.ts +51 -0
  457. package/dist/skills/host-facts.d.ts.map +1 -0
  458. package/dist/skills/host-facts.js +134 -0
  459. package/dist/skills/host-facts.js.map +1 -0
  460. package/dist/skills/learning-steps.d.ts +43 -0
  461. package/dist/skills/learning-steps.d.ts.map +1 -0
  462. package/dist/skills/learning-steps.js +294 -0
  463. package/dist/skills/learning-steps.js.map +1 -0
  464. package/dist/skills/ledger.d.ts +43 -0
  465. package/dist/skills/ledger.d.ts.map +1 -0
  466. package/dist/skills/ledger.js +336 -0
  467. package/dist/skills/ledger.js.map +1 -0
  468. package/dist/skills/lesson-gate.d.ts +25 -0
  469. package/dist/skills/lesson-gate.d.ts.map +1 -0
  470. package/dist/skills/lesson-gate.js +316 -0
  471. package/dist/skills/lesson-gate.js.map +1 -0
  472. package/dist/skills/lessons.d.ts +60 -0
  473. package/dist/skills/lessons.d.ts.map +1 -0
  474. package/dist/skills/lessons.js +396 -0
  475. package/dist/skills/lessons.js.map +1 -0
  476. package/dist/skills/offer-answers.d.ts +20 -0
  477. package/dist/skills/offer-answers.d.ts.map +1 -0
  478. package/dist/skills/offer-answers.js +51 -0
  479. package/dist/skills/offer-answers.js.map +1 -0
  480. package/dist/skills/offer-drift.d.ts +35 -0
  481. package/dist/skills/offer-drift.d.ts.map +1 -0
  482. package/dist/skills/offer-drift.js +98 -0
  483. package/dist/skills/offer-drift.js.map +1 -0
  484. package/dist/skills/offer-lesson.d.ts +31 -0
  485. package/dist/skills/offer-lesson.d.ts.map +1 -0
  486. package/dist/skills/offer-lesson.js +123 -0
  487. package/dist/skills/offer-lesson.js.map +1 -0
  488. package/dist/skills/offer-lines.d.ts +40 -0
  489. package/dist/skills/offer-lines.d.ts.map +1 -0
  490. package/dist/skills/offer-lines.js +80 -0
  491. package/dist/skills/offer-lines.js.map +1 -0
  492. package/dist/skills/offer-moment.d.ts +102 -0
  493. package/dist/skills/offer-moment.d.ts.map +1 -0
  494. package/dist/skills/offer-moment.js +260 -0
  495. package/dist/skills/offer-moment.js.map +1 -0
  496. package/dist/skills/offer-repair.d.ts +36 -0
  497. package/dist/skills/offer-repair.d.ts.map +1 -0
  498. package/dist/skills/offer-repair.js +212 -0
  499. package/dist/skills/offer-repair.js.map +1 -0
  500. package/dist/skills/offer-retire.d.ts +53 -0
  501. package/dist/skills/offer-retire.d.ts.map +1 -0
  502. package/dist/skills/offer-retire.js +149 -0
  503. package/dist/skills/offer-retire.js.map +1 -0
  504. package/dist/skills/offer-update.d.ts +54 -0
  505. package/dist/skills/offer-update.d.ts.map +1 -0
  506. package/dist/skills/offer-update.js +115 -0
  507. package/dist/skills/offer-update.js.map +1 -0
  508. package/dist/skills/offer-words-1b.d.ts +32 -0
  509. package/dist/skills/offer-words-1b.d.ts.map +1 -0
  510. package/dist/skills/offer-words-1b.js +80 -0
  511. package/dist/skills/offer-words-1b.js.map +1 -0
  512. package/dist/skills/offer-words-2.d.ts +123 -0
  513. package/dist/skills/offer-words-2.d.ts.map +1 -0
  514. package/dist/skills/offer-words-2.js +194 -0
  515. package/dist/skills/offer-words-2.js.map +1 -0
  516. package/dist/skills/offer-words.d.ts +65 -0
  517. package/dist/skills/offer-words.d.ts.map +1 -0
  518. package/dist/skills/offer-words.js +205 -0
  519. package/dist/skills/offer-words.js.map +1 -0
  520. package/dist/skills/offers.d.ts +66 -0
  521. package/dist/skills/offers.d.ts.map +1 -0
  522. package/dist/skills/offers.js +284 -0
  523. package/dist/skills/offers.js.map +1 -0
  524. package/dist/skills/own-folder.d.ts +9 -0
  525. package/dist/skills/own-folder.d.ts.map +1 -0
  526. package/dist/skills/own-folder.js +36 -0
  527. package/dist/skills/own-folder.js.map +1 -0
  528. package/dist/skills/person.d.ts +34 -0
  529. package/dist/skills/person.d.ts.map +1 -0
  530. package/dist/skills/person.js +102 -0
  531. package/dist/skills/person.js.map +1 -0
  532. package/dist/skills/probe-clean.d.ts +9 -0
  533. package/dist/skills/probe-clean.d.ts.map +1 -0
  534. package/dist/skills/probe-clean.js +48 -0
  535. package/dist/skills/probe-clean.js.map +1 -0
  536. package/dist/skills/probes.d.ts +26 -0
  537. package/dist/skills/probes.d.ts.map +1 -0
  538. package/dist/skills/probes.js +225 -0
  539. package/dist/skills/probes.js.map +1 -0
  540. package/dist/skills/recall.d.ts +119 -0
  541. package/dist/skills/recall.d.ts.map +1 -0
  542. package/dist/skills/recall.js +370 -0
  543. package/dist/skills/recall.js.map +1 -0
  544. package/dist/skills/receipts.d.ts +44 -0
  545. package/dist/skills/receipts.d.ts.map +1 -0
  546. package/dist/skills/receipts.js +223 -0
  547. package/dist/skills/receipts.js.map +1 -0
  548. package/dist/skills/run-checkout.d.ts +4 -0
  549. package/dist/skills/run-checkout.d.ts.map +1 -0
  550. package/dist/skills/run-checkout.js +37 -0
  551. package/dist/skills/run-checkout.js.map +1 -0
  552. package/dist/skills/runblock.d.ts +47 -0
  553. package/dist/skills/runblock.d.ts.map +1 -0
  554. package/dist/skills/runblock.js +227 -0
  555. package/dist/skills/runblock.js.map +1 -0
  556. package/dist/skills/save-gate.d.ts +64 -0
  557. package/dist/skills/save-gate.d.ts.map +1 -0
  558. package/dist/skills/save-gate.js +354 -0
  559. package/dist/skills/save-gate.js.map +1 -0
  560. package/dist/skills/save-parse.d.ts +42 -0
  561. package/dist/skills/save-parse.d.ts.map +1 -0
  562. package/dist/skills/save-parse.js +172 -0
  563. package/dist/skills/save-parse.js.map +1 -0
  564. package/dist/skills/save-store.d.ts +12 -0
  565. package/dist/skills/save-store.d.ts.map +1 -0
  566. package/dist/skills/save-store.js +22 -0
  567. package/dist/skills/save-store.js.map +1 -0
  568. package/dist/skills/save-verify.d.ts +59 -0
  569. package/dist/skills/save-verify.d.ts.map +1 -0
  570. package/dist/skills/save-verify.js +390 -0
  571. package/dist/skills/save-verify.js.map +1 -0
  572. package/dist/skills/settings.d.ts +48 -0
  573. package/dist/skills/settings.d.ts.map +1 -0
  574. package/dist/skills/settings.js +155 -0
  575. package/dist/skills/settings.js.map +1 -0
  576. package/dist/skills/skill-diff.d.ts +40 -0
  577. package/dist/skills/skill-diff.d.ts.map +1 -0
  578. package/dist/skills/skill-diff.js +191 -0
  579. package/dist/skills/skill-diff.js.map +1 -0
  580. package/dist/skills/skill-file.d.ts +24 -0
  581. package/dist/skills/skill-file.d.ts.map +1 -0
  582. package/dist/skills/skill-file.js +97 -0
  583. package/dist/skills/skill-file.js.map +1 -0
  584. package/dist/skills/skill-rebuild.d.ts +27 -0
  585. package/dist/skills/skill-rebuild.d.ts.map +1 -0
  586. package/dist/skills/skill-rebuild.js +85 -0
  587. package/dist/skills/skill-rebuild.js.map +1 -0
  588. package/dist/skills/skillmd.d.ts +17 -0
  589. package/dist/skills/skillmd.d.ts.map +1 -0
  590. package/dist/skills/skillmd.js +219 -0
  591. package/dist/skills/skillmd.js.map +1 -0
  592. package/dist/skills/skills.d.ts +28 -8
  593. package/dist/skills/skills.d.ts.map +1 -1
  594. package/dist/skills/skills.js +106 -53
  595. package/dist/skills/skills.js.map +1 -1
  596. package/dist/skills/staleness.d.ts +27 -0
  597. package/dist/skills/staleness.d.ts.map +1 -0
  598. package/dist/skills/staleness.js +178 -0
  599. package/dist/skills/staleness.js.map +1 -0
  600. package/dist/skills/state.d.ts +36 -0
  601. package/dist/skills/state.d.ts.map +1 -0
  602. package/dist/skills/state.js +259 -0
  603. package/dist/skills/state.js.map +1 -0
  604. package/dist/skills/store-fs.d.ts +77 -0
  605. package/dist/skills/store-fs.d.ts.map +1 -0
  606. package/dist/skills/store-fs.js +194 -0
  607. package/dist/skills/store-fs.js.map +1 -0
  608. package/dist/skills/store-held.d.ts +44 -0
  609. package/dist/skills/store-held.d.ts.map +1 -0
  610. package/dist/skills/store-held.js +147 -0
  611. package/dist/skills/store-held.js.map +1 -0
  612. package/dist/skills/store.d.ts +73 -0
  613. package/dist/skills/store.d.ts.map +1 -0
  614. package/dist/skills/store.js +279 -0
  615. package/dist/skills/store.js.map +1 -0
  616. package/dist/skills/types.d.ts +8 -0
  617. package/dist/skills/types.d.ts.map +1 -1
  618. package/dist/skills/update-gate.d.ts +36 -0
  619. package/dist/skills/update-gate.d.ts.map +1 -0
  620. package/dist/skills/update-gate.js +357 -0
  621. package/dist/skills/update-gate.js.map +1 -0
  622. package/dist/skills/update-plan.d.ts +40 -0
  623. package/dist/skills/update-plan.d.ts.map +1 -0
  624. package/dist/skills/update-plan.js +196 -0
  625. package/dist/skills/update-plan.js.map +1 -0
  626. package/dist/skills/validate.d.ts +11 -0
  627. package/dist/skills/validate.d.ts.map +1 -0
  628. package/dist/skills/validate.js +112 -0
  629. package/dist/skills/validate.js.map +1 -0
  630. package/dist/skills/value-line.d.ts +94 -0
  631. package/dist/skills/value-line.d.ts.map +1 -0
  632. package/dist/skills/value-line.js +355 -0
  633. package/dist/skills/value-line.js.map +1 -0
  634. package/dist/skills/versions-fs.d.ts +45 -0
  635. package/dist/skills/versions-fs.d.ts.map +1 -0
  636. package/dist/skills/versions-fs.js +234 -0
  637. package/dist/skills/versions-fs.js.map +1 -0
  638. package/dist/skills/versions.d.ts +56 -0
  639. package/dist/skills/versions.d.ts.map +1 -0
  640. package/dist/skills/versions.js +351 -0
  641. package/dist/skills/versions.js.map +1 -0
  642. package/dist/telemetry/contract.d.ts +15 -1
  643. package/dist/telemetry/contract.d.ts.map +1 -1
  644. package/dist/telemetry/contract.js +80 -11
  645. package/dist/telemetry/contract.js.map +1 -1
  646. package/dist/telemetry/gate.js +4 -4
  647. package/dist/telemetry/gate.js.map +1 -1
  648. package/dist/telemetry/index.d.ts +1 -1
  649. package/dist/telemetry/index.d.ts.map +1 -1
  650. package/dist/telemetry/index.js +1 -1
  651. package/dist/telemetry/index.js.map +1 -1
  652. package/dist/telemetry/notice.js +5 -5
  653. package/dist/telemetry/notice.js.map +1 -1
  654. package/dist/telemetry/queue.d.ts.map +1 -1
  655. package/dist/telemetry/queue.js +7 -7
  656. package/dist/telemetry/queue.js.map +1 -1
  657. package/dist/telemetry/track.d.ts.map +1 -1
  658. package/dist/telemetry/track.js +4 -3
  659. package/dist/telemetry/track.js.map +1 -1
  660. package/dist/trace/checks.d.ts +63 -0
  661. package/dist/trace/checks.d.ts.map +1 -0
  662. package/dist/trace/checks.js +495 -0
  663. package/dist/trace/checks.js.map +1 -0
  664. package/dist/trace/claude.d.ts +124 -0
  665. package/dist/trace/claude.d.ts.map +1 -0
  666. package/dist/trace/claude.js +303 -0
  667. package/dist/trace/claude.js.map +1 -0
  668. package/dist/trace/codex-exec.d.ts +22 -0
  669. package/dist/trace/codex-exec.d.ts.map +1 -0
  670. package/dist/trace/codex-exec.js +129 -0
  671. package/dist/trace/codex-exec.js.map +1 -0
  672. package/dist/trace/codex-meta.d.ts +23 -0
  673. package/dist/trace/codex-meta.d.ts.map +1 -0
  674. package/dist/trace/codex-meta.js +112 -0
  675. package/dist/trace/codex-meta.js.map +1 -0
  676. package/dist/trace/codex.d.ts +33 -0
  677. package/dist/trace/codex.d.ts.map +1 -0
  678. package/dist/trace/codex.js +485 -0
  679. package/dist/trace/codex.js.map +1 -0
  680. package/dist/trace/cursor.d.ts +16 -0
  681. package/dist/trace/cursor.d.ts.map +1 -0
  682. package/dist/trace/cursor.js +133 -0
  683. package/dist/trace/cursor.js.map +1 -0
  684. package/dist/trace/dialect.d.ts +43 -0
  685. package/dist/trace/dialect.d.ts.map +1 -0
  686. package/dist/trace/dialect.js +95 -0
  687. package/dist/trace/dialect.js.map +1 -0
  688. package/dist/trace/epochs.d.ts +10 -0
  689. package/dist/trace/epochs.d.ts.map +1 -0
  690. package/dist/trace/epochs.js +16 -0
  691. package/dist/trace/epochs.js.map +1 -0
  692. package/dist/trace/failure.d.ts +15 -0
  693. package/dist/trace/failure.d.ts.map +1 -0
  694. package/dist/trace/failure.js +69 -0
  695. package/dist/trace/failure.js.map +1 -0
  696. package/dist/trace/gate-file.d.ts +71 -0
  697. package/dist/trace/gate-file.d.ts.map +1 -0
  698. package/dist/trace/gate-file.js +329 -0
  699. package/dist/trace/gate-file.js.map +1 -0
  700. package/dist/trace/guard-fast.d.ts +22 -0
  701. package/dist/trace/guard-fast.d.ts.map +1 -0
  702. package/dist/trace/guard-fast.js +213 -0
  703. package/dist/trace/guard-fast.js.map +1 -0
  704. package/dist/trace/housekeeping.d.ts +5 -0
  705. package/dist/trace/housekeeping.d.ts.map +1 -0
  706. package/dist/trace/housekeeping.js +93 -0
  707. package/dist/trace/housekeeping.js.map +1 -0
  708. package/dist/trace/jobs.d.ts +52 -0
  709. package/dist/trace/jobs.d.ts.map +1 -0
  710. package/dist/trace/jobs.js +182 -0
  711. package/dist/trace/jobs.js.map +1 -0
  712. package/dist/trace/known-repo.d.ts +3 -0
  713. package/dist/trace/known-repo.d.ts.map +1 -0
  714. package/dist/trace/known-repo.js +55 -0
  715. package/dist/trace/known-repo.js.map +1 -0
  716. package/dist/trace/pool.d.ts +40 -0
  717. package/dist/trace/pool.d.ts.map +1 -0
  718. package/dist/trace/pool.js +154 -0
  719. package/dist/trace/pool.js.map +1 -0
  720. package/dist/trace/repairs.d.ts +27 -0
  721. package/dist/trace/repairs.d.ts.map +1 -0
  722. package/dist/trace/repairs.js +303 -0
  723. package/dist/trace/repairs.js.map +1 -0
  724. package/dist/trace/run-calls.d.ts +82 -0
  725. package/dist/trace/run-calls.d.ts.map +1 -0
  726. package/dist/trace/run-calls.js +331 -0
  727. package/dist/trace/run-calls.js.map +1 -0
  728. package/dist/trace/run-join.d.ts +20 -0
  729. package/dist/trace/run-join.d.ts.map +1 -0
  730. package/dist/trace/run-join.js +99 -0
  731. package/dist/trace/run-join.js.map +1 -0
  732. package/dist/trace/run-sheets.d.ts +26 -0
  733. package/dist/trace/run-sheets.d.ts.map +1 -0
  734. package/dist/trace/run-sheets.js +145 -0
  735. package/dist/trace/run-sheets.js.map +1 -0
  736. package/dist/trace/run-turns.d.ts +24 -0
  737. package/dist/trace/run-turns.d.ts.map +1 -0
  738. package/dist/trace/run-turns.js +67 -0
  739. package/dist/trace/run-turns.js.map +1 -0
  740. package/dist/trace/run-verdict.d.ts +24 -0
  741. package/dist/trace/run-verdict.d.ts.map +1 -0
  742. package/dist/trace/run-verdict.js +176 -0
  743. package/dist/trace/run-verdict.js.map +1 -0
  744. package/dist/trace/runs.d.ts +54 -0
  745. package/dist/trace/runs.d.ts.map +1 -0
  746. package/dist/trace/runs.js +501 -0
  747. package/dist/trace/runs.js.map +1 -0
  748. package/dist/trace/skill-session.d.ts +64 -0
  749. package/dist/trace/skill-session.d.ts.map +1 -0
  750. package/dist/trace/skill-session.js +232 -0
  751. package/dist/trace/skill-session.js.map +1 -0
  752. package/dist/trace/tamper.d.ts +12 -0
  753. package/dist/trace/tamper.d.ts.map +1 -0
  754. package/dist/trace/tamper.js +405 -0
  755. package/dist/trace/tamper.js.map +1 -0
  756. package/dist/trace/typed.d.ts +30 -0
  757. package/dist/trace/typed.d.ts.map +1 -0
  758. package/dist/trace/typed.js +132 -0
  759. package/dist/trace/typed.js.map +1 -0
  760. package/dist/trace/wall-state.d.ts +86 -0
  761. package/dist/trace/wall-state.d.ts.map +1 -0
  762. package/dist/trace/wall-state.js +279 -0
  763. package/dist/trace/wall-state.js.map +1 -0
  764. package/dist/trace/walls.d.ts +40 -0
  765. package/dist/trace/walls.d.ts.map +1 -0
  766. package/dist/trace/walls.js +318 -0
  767. package/dist/trace/walls.js.map +1 -0
  768. package/dist/upkeep-run.d.ts.map +1 -1
  769. package/dist/upkeep-run.js +2 -23
  770. package/dist/upkeep-run.js.map +1 -1
  771. package/dist/upkeep.d.ts.map +1 -1
  772. package/dist/upkeep.js +2 -3
  773. package/dist/upkeep.js.map +1 -1
  774. package/dist/util/private-fs.d.ts +6 -0
  775. package/dist/util/private-fs.d.ts.map +1 -1
  776. package/dist/util/private-fs.js +9 -1
  777. package/dist/util/private-fs.js.map +1 -1
  778. package/dist/util/state.d.ts.map +1 -1
  779. package/dist/util/state.js +17 -3
  780. package/dist/util/state.js.map +1 -1
  781. package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
  782. package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
  783. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
  784. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
  785. package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
  786. package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
  787. package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
  788. package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
  789. package/package.json +6 -3
  790. package/scripts/stamp-telemetry-key.mjs +8 -5
  791. package/scripts/vendor-grammars.mjs +35 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Housekeeping for the skills files under `~/.trail` (design 1.3, 2): at most
3
+ * once an hour per machine, old run sheets (7 days), session files (30 days),
4
+ * receipts (1 day), held items shown more than 24 hours ago, and probe
5
+ * results older than 10 minutes. Re-exported from `skill-session.ts`.
6
+ */
7
+ import { readdirSync, rmSync, statSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
10
+ import { pruneRunSheets } from './run-sheets.js';
11
+ const HOUR = 3600_000;
12
+ const DAY = 24 * HOUR;
13
+ /** Files in `dir` (not folders) whose mtime is older than `ms`, removed. */
14
+ function dropOld(dir, ms, now, keep = () => false) {
15
+ let names;
16
+ try {
17
+ names = readdirSync(dir);
18
+ }
19
+ catch {
20
+ return;
21
+ }
22
+ for (const name of names) {
23
+ if (keep(name))
24
+ continue;
25
+ const p = join(dir, name);
26
+ try {
27
+ const st = statSync(p);
28
+ if (st.isFile() && now.getTime() - st.mtimeMs > ms)
29
+ rmSync(p, { force: true });
30
+ }
31
+ catch { /* gone already */ }
32
+ }
33
+ }
34
+ /** Held items shown more than 24 h ago (held/<name>/held.json `shownAt`). */
35
+ function dropShownHeld(dir, now) {
36
+ let names;
37
+ try {
38
+ names = readdirSync(dir);
39
+ }
40
+ catch {
41
+ return;
42
+ }
43
+ for (const name of names) {
44
+ if (name.startsWith('.'))
45
+ continue;
46
+ const held = readJsonSafe(join(dir, name, 'held.json'));
47
+ const shown = typeof held?.shownAt === 'string' ? Date.parse(held.shownAt) : NaN;
48
+ if (!Number.isNaN(shown) && now.getTime() - shown > DAY) {
49
+ try {
50
+ rmSync(join(dir, name), { recursive: true, force: true });
51
+ }
52
+ catch { /* next time */ }
53
+ }
54
+ }
55
+ }
56
+ /** state/probes.json entries `{ at }` older than 10 minutes, under `entries` or at the top level. */
57
+ function dropOldProbes(path, now) {
58
+ const raw = readJsonSafe(path);
59
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
60
+ return;
61
+ const box = raw.entries && typeof raw.entries === 'object' && !Array.isArray(raw.entries) ? raw.entries : raw;
62
+ let changed = false;
63
+ for (const [k, v] of Object.entries(box)) {
64
+ const at = v && typeof v === 'object' ? Date.parse(String(v.at)) : NaN;
65
+ if (!Number.isNaN(at) && now.getTime() - at > 10 * 60_000) {
66
+ delete box[k];
67
+ changed = true;
68
+ }
69
+ }
70
+ if (changed)
71
+ writePrivate(path, JSON.stringify(raw));
72
+ }
73
+ /** At most once an hour (state/housekeeping.json): pruneRunSheets; sessions/*.json and their .gate.json and
74
+ * .post.jsonl (and crash leftovers beside them) older than 30 days; receipts older than 1 day; held items shown more than 24 h ago;
75
+ * expired state/probes.json entries. */
76
+ export function housekeeping(now = new Date(), env) {
77
+ const mark = trailPath(env, 'state', 'housekeeping.json');
78
+ const last = readJsonSafe(mark);
79
+ const lastAt = typeof last?.at === 'string' ? Date.parse(last.at) : NaN;
80
+ if (!Number.isNaN(lastAt) && now.getTime() - lastAt < HOUR && now.getTime() >= lastAt)
81
+ return;
82
+ // One process does it; another one meanwhile skips it.
83
+ withLock(mark, () => {
84
+ writePrivate(mark, JSON.stringify({ at: now.toISOString() }));
85
+ pruneRunSheets(now, env);
86
+ // Every file: a session's state, gate and marks, and what a crash left beside them (.lock, .steal, .stale, .tmp).
87
+ dropOld(trailPath(env, 'sessions'), 30 * DAY, now);
88
+ dropOld(trailPath(env, 'receipts'), DAY, now, (n) => !n.endsWith('.json'));
89
+ dropShownHeld(trailPath(env, 'held'), now);
90
+ dropOldProbes(trailPath(env, 'state', 'probes.json'), now);
91
+ }, 0);
92
+ }
93
+ //# sourceMappingURL=housekeeping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"housekeeping.js","sourceRoot":"","sources":["../../src/trace/housekeeping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The job vocabulary (design 4.14): which short typed asks name a job, from a
3
+ * fixed list of verb classes ported from the mining's lexicon. Only canonical
4
+ * words and values of known shapes leave this file, never the typed text.
5
+ *
6
+ * An ask is a job only when it is 25 words or fewer, not a status or history
7
+ * question ("did you push?", "is it live", "..., right?") and not a problem
8
+ * report ("prod is broken", "why ..."). Fenced code, quoted lines and very
9
+ * long lines are pasted context, not the ask, and are dropped first.
10
+ *
11
+ * Tuned on one person's prompts; the real near misses live in the private
12
+ * lab, and every test here is synthetic. Pure: no files, no clock.
13
+ */
14
+ import type { CheckFamily, JobClass, JobMatch, PromptParams } from './types.js';
15
+ type JobDef = {
16
+ job: JobClass;
17
+ pattern: RegExp;
18
+ exclude?: RegExp;
19
+ vocab: Record<string, string>;
20
+ noun: string;
21
+ checkWords: string[];
22
+ };
23
+ export declare const JOB_CLASSES: ReadonlyArray<JobDef>;
24
+ /** Jobs that can reach moment 2, and the check families that fit each (4.2). */
25
+ export declare const OFFER_FAMILIES: Readonly<Partial<Record<JobClass, CheckFamily[]>>>;
26
+ /** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
27
+ export declare const JUDGEMENT_JOBS: ReadonlySet<JobClass>;
28
+ /** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
29
+ export declare const STATUS_OR_HISTORY: RegExp;
30
+ export declare const PROBLEM_REPORT: RegExp;
31
+ export declare const MAX_ASK_WORDS = 25;
32
+ /**
33
+ * The person's own ask in a typed message: fenced code blocks (an unclosed one
34
+ * runs to the end), quoted lines (`>`) and lines of 800 characters or more
35
+ * dropped. Every matcher of typed text reads this, not the raw message.
36
+ */
37
+ export declare function askText(typed: string): string;
38
+ export declare function wordCount(text: string): number;
39
+ export declare function isStatusOrHistory(text: string): boolean;
40
+ /**
41
+ * Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
42
+ * whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
43
+ * staging name a ship.
44
+ */
45
+ export declare function matchJob(typedText: string, opts?: {
46
+ anyLength?: boolean;
47
+ hasBranch?: (name: string) => boolean;
48
+ }): JobMatch | null;
49
+ /** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
50
+ export declare function promptParams(typedText: string): PromptParams;
51
+ export {};
52
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmChF,KAAK,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMtI,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,MAAM,CA2D7C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAE5E,CAAC;AAEH,+FAA+F;AAC/F,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,QAAQ,CAA4C,CAAC;AAE9F,wHAAwH;AACxH,eAAO,MAAM,iBAAiB,QACsU,CAAC;AACrW,eAAO,MAAM,cAAc,QAAmI,CAAC;AAC/J,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAKD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GAAG,QAAQ,GAAG,IAAI,CAqBtI;AAID,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAiB5D"}
@@ -0,0 +1,182 @@
1
+ /** Words that may sit between "run" and "tests": never a conjunction or another verb ("run it and write tests"). */
2
+ const GAP = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip)\b)[\w./:-]+ ){0,3}?`;
3
+ const RUNNER = String.raw `(?:npm|pnpm|yarn|bun)(?: run)? test\b|npx (?:vitest|jest|playwright test)\b|go test\b|cargo test\b|make test\w*|python3? -m pytest\b|pytest\b|bats\b|rspec\b|jest\b|vitest\b`;
4
+ /** D136 (3): up to 2 words naming what to test before a runner ("sql-output bats"), never a verb that sets it up. */
5
+ const NAMED = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip|install|configure|set|setup|upgrade|migrate|use|switch|what|how|which|why)\b)[\w./:-]+ ){0,2}?`;
6
+ /** The tests job (4.14, D56b). */
7
+ const TESTS = new RegExp([
8
+ String.raw `\b(?:re-?run|re run|run|kick off|execute)\b (?:the |all (?:of )?(?:the )?|our |my |these |those )?${GAP}(?:tests?|test ?suites?|suites?|specs?)\b`,
9
+ String.raw `\b(?:run|re-?run)\b (?:\S+ ){0,2}?(?:${RUNNER})`,
10
+ String.raw `^\s*(?:please |can you |could you |pls )?(?:${RUNNER})`,
11
+ // D136 (3): "sql-output bats please", "api tests", "sql-output tests please": the whole ask names what to test.
12
+ String.raw `^\s*(?:please |can you |could you |pls )?(?:the )?${NAMED}(?:bats|rspec|pytest|jest|vitest)\b(?: (?:please|pls|again|now))?\s*[.!]*$`,
13
+ String.raw `^\s*(?:please |pls )?(?:the )?(?!(?:write|add|fix|new|more|unit|my|our|your|these|those|some|any|no)\b)[\w./:-]+ tests?(?: (?:please|pls|again|now))?\s*[.!]*$`,
14
+ String.raw `\bmake sure (?:that )?(?:the |all (?:the )?)?(?:\w+ )?tests? (?:still )?(?:pass|are passing|are green|go green)\b`,
15
+ String.raw `\bget (?:the |all (?:the )?)?(?:\w+ )?tests? (?:passing|green|to pass)\b`,
16
+ String.raw `\b(?:integration|e2e|end-to-end|smoke|regression|acceptance) tests?\b`,
17
+ String.raw `\btest (?:it|this|that|everything|all(?: of (?:it|this))?) before (?:push|commit|merg|ship|deploy)\w*`,
18
+ ].join('|'));
19
+ /**
20
+ * Not the tests job: how-to and wh- questions, a status question with no lead verb ("integration tests
21
+ * green?"), writing or changing tests, a test environment or account, testing it yourself.
22
+ */
23
+ const TESTS_NOT = new RegExp([
24
+ String.raw `^\s*(?:(?:ok(?:ay)?|so|and|hmm)[\s,]+)*(?:how|what|which|where|when|why|who)\b`,
25
+ String.raw `\b(?:tests?|suites?|specs?)\b[^?]{0,30}\b(?:pass\w*|green|red|fail\w*|ok|done|finish\w*|running|broken)\s*\?\s*$`,
26
+ String.raw `\b(?:write|writing|add|adding|create|fix|fixing|update|remove|delete|skip|mock|refactor|rewrite|cover)\w* (?:\w+ ){0,3}?(?:tests?|specs?)\b`,
27
+ String.raw `\btest (?:env|environment|channel|account|data|mode|user|key|card|server|db|database|webhook|token|number|payment)s?\b`,
28
+ String.raw `\b(?:myself|yourself|ourselves)\b|\bfor (?:me|us|him|her|them) to (?:re-?)?(?:run|test)\b`,
29
+ String.raw `\b(?:install|configure|set ?up|upgrade|migrate|switch)\w* (?:\w+ ){0,3}?(?:to )?(?:bats|rspec|pytest|jest|vitest)\b`,
30
+ ].join('|'));
31
+ /** D136 (3): ship or deploy (it) to a named place: the ship job when the repo has a branch by that name. */
32
+ const SHIP_TO = /\b(?:ship|deploy)\w*(?: (?:it|this|that|them))? to (?:the )?([\w./-]+)/;
33
+ /** Surface forms to canonical words, one map per class. */
34
+ const words = (pairs) => Object.fromEntries(Object.entries(pairs).flatMap(([canon, forms]) => [canon, ...forms].map((f) => [f, canon])));
35
+ export const JOB_CLASSES = [
36
+ {
37
+ job: 'release',
38
+ pattern: /\b(publish\w*|re-?publish|release\w* (a |the )?(new |next )?(version|ver|patch|minor|major)|cut (a |that |the )?release|redo the (npm )?publish|npm publish|bump (the )?version)\b/,
39
+ exclude: /publish\w* (on|to) (the )?(web|website)|call it publish|publishable|\brelease (the )?notes\b|\b(i|we)( have|'ve| had)? (already )?released\b/,
40
+ vocab: words({ publish: ['publishing', 'published', 'publishes', 'republish', 're-publish'], release: ['releases', 'releasing'], bump: ['bumping'], npm: [] }),
41
+ noun: 'release',
42
+ checkWords: ['published', 'released', 'out', 'live', 'up'],
43
+ },
44
+ {
45
+ job: 'ship',
46
+ pattern: /\b(push|puch|ff|fast.?forward|promote|deploy|ship|merge|update|move|get)\w* (\w+ ){0,4}(to |for |on |in |into )?(the )?(beta|prod|production|staging)\b|\bff to prod\b|\bupdate prod\b|^\s*(please )?ship it\b/,
47
+ exclude: /not working on (prod|beta)/,
48
+ vocab: words({
49
+ push: ['pushed', 'pushing', 'puch'], ff: ['fast-forward', 'fastforward'], promote: ['promoted'], deploy: ['deploying', 'deployed'], ship: ['shipping'],
50
+ merge: ['merged'], update: ['updated'], beta: [], prod: ['production'], staging: [],
51
+ }),
52
+ noun: 'ship',
53
+ checkWords: ['live', 'deployed', 'updated', 'up', 'out', 'green'],
54
+ },
55
+ {
56
+ job: 'pr-green',
57
+ pattern: /\b(ci\b|ci's|checks? (are |is )?fail\w*|failing (tests|checks)|failed tests|review comments|nitpicks|make (the )?ci (go )?green|ci goes? green|review.?bot)/,
58
+ vocab: words({ ci: ["ci's"], checks: ['check'], review: ['reviews'] }),
59
+ noun: 'CI fix',
60
+ checkWords: [],
61
+ },
62
+ {
63
+ job: 'sweep',
64
+ pattern: /\b(go through|sweep|verify|check)\b.{0,40}\b(all|other|more|newer|backlog|recent)\b.{0,25}\b(prs|pull requests|issues)\b|\bclose (more )?(issues|prs)\b/,
65
+ vocab: words({ sweep: [], prs: ['pull-requests'], issues: [] }),
66
+ noun: 'PR sweep',
67
+ checkWords: [],
68
+ },
69
+ {
70
+ job: 'run-local',
71
+ pattern: /\b(open (it|this|the \w+)? ?(locally|in (the )?browser|on (a )?local)|localhost|local server|run it locally|open locally)\b/,
72
+ vocab: words({ open: [], locally: [], localhost: [] }),
73
+ noun: 'local run',
74
+ checkWords: [],
75
+ },
76
+ {
77
+ job: 'report',
78
+ pattern: /\b(any new (users|people)|new users? (since|till|through|we have|came)|how many (new )?(users|people) (have|came|joined))\b/,
79
+ vocab: words({ new: [], users: ['user', 'people'], signups: ['signup'] }),
80
+ noun: 'report',
81
+ checkWords: [],
82
+ },
83
+ {
84
+ // D56b, rebuilt from real asks: none said "run the integration tests"; they said "run the tests", "rerun
85
+ // the e2e tests", named the runner, or "make sure the tests pass". "Test this thoroughly end to end" is a
86
+ // feature check the agent designs each time, not a test run, so it stays out.
87
+ job: 'tests',
88
+ pattern: TESTS,
89
+ exclude: TESTS_NOT,
90
+ vocab: words({ integration: [], e2e: ['end-to-end'], tests: ['test', 'suite', 'suites', 'specs', 'spec'] }),
91
+ noun: 'test run',
92
+ checkWords: ['passing', 'green', 'pass', 'passed'],
93
+ },
94
+ ];
95
+ /** Jobs that can reach moment 2, and the check families that fit each (4.2). */
96
+ export const OFFER_FAMILIES = Object.freeze({
97
+ release: ['npm-view'], ship: ['deploy', 'ls-remote', 'push'], tests: ['tests'], report: ['query'],
98
+ });
99
+ /** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
100
+ export const JUDGEMENT_JOBS = new Set(['pr-green', 'sweep']);
101
+ /** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
102
+ export const STATUS_OR_HISTORY = /^\s*(?:(?:okay|ok|so|and|also|hey|btw|wait|hmm|tell(?: me)?)[\s,]+)*(did|is|was|has|have|are|were|does|how did|what did|when did|where did)\b|\b(did (you|we)|is it (live|done|published|deployed|out|up|green)|how did (we|you)|check (now )?if)\b|\b(right|correct)\?\s*$|\b(?:is|are|was|were|did|does|do|has|have)n'?t (?:it|they|we|you|that|he|she)\?\s*$/i;
103
+ export const PROBLEM_REPORT = /\b(not working|(does|did|do)n'?t work|did not work|does not work|went wrong|still (broken|failing|not)|is broken)\b|^\s*why\b/i;
104
+ export const MAX_ASK_WORDS = 25;
105
+ /**
106
+ * The person's own ask in a typed message: fenced code blocks (an unclosed one
107
+ * runs to the end), quoted lines (`>`) and lines of 800 characters or more
108
+ * dropped. Every matcher of typed text reads this, not the raw message.
109
+ */
110
+ export function askText(typed) {
111
+ const t = String(typed ?? '').replace(/```[\s\S]*?(?:```|$)/g, '\n');
112
+ return t.split(/\r?\n/).filter((l) => !/^\s*>/.test(l) && l.length < 800).join('\n').trim();
113
+ }
114
+ export function wordCount(text) {
115
+ return String(text ?? '').split(/\s+/).filter(Boolean).length;
116
+ }
117
+ export function isStatusOrHistory(text) {
118
+ return STATUS_OR_HISTORY.test(askText(text));
119
+ }
120
+ const URL = /\b[a-z][a-z0-9+.-]*:\/\/\S+/gi;
121
+ const VERSION = /\bv?\d+\.\d+\.\d+(?:-[0-9a-z.]+)?\b/gi;
122
+ /**
123
+ * Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
124
+ * whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
125
+ * staging name a ship.
126
+ */
127
+ export function matchJob(typedText, opts = {}) {
128
+ const ask = askText(typedText);
129
+ // The cap is for matching skills; D120 (1)'s continuation of the open run's own job reads any length.
130
+ if (!ask || (!opts.anyLength && wordCount(ask) > MAX_ASK_WORDS))
131
+ return null;
132
+ if (STATUS_OR_HISTORY.test(ask) || PROBLEM_REPORT.test(ask))
133
+ return null;
134
+ const t = ask.toLowerCase().replace(URL, ' url ').replace(VERSION, ' ver ').replace(/\bfast forward/g, 'fast-forward').replace(/\s+/g, ' ').trim();
135
+ for (const c of JOB_CLASSES) {
136
+ if (!c.pattern.test(t) || c.exclude?.test(t))
137
+ continue;
138
+ const found = [];
139
+ for (const w of t.split(/[^a-z0-9'-]+/)) {
140
+ const canon = c.vocab[w] ?? c.vocab[w.replace(/'s$/, '')];
141
+ if (canon && !found.includes(canon))
142
+ found.push(canon);
143
+ }
144
+ return { job: c.job, words: found };
145
+ }
146
+ const to = opts.hasBranch ? SHIP_TO.exec(t) : null;
147
+ if (to && opts.hasBranch(to[1].replace(/[.]+$/, ''))) {
148
+ const ship = JOB_CLASSES.find((c) => c.job === 'ship');
149
+ if (!ship.exclude?.test(t))
150
+ return { job: 'ship', words: [...new Set(t.split(/[^a-z0-9'-]+/).map((w) => ship.vocab[w]).filter((w) => !!w))] };
151
+ }
152
+ return null;
153
+ }
154
+ const NOT_A_BRANCH = new Set(['to', 'and', 'the', 'is', 'of', 'for', 'from', 'then', 'with', 'in', 'on', 'it', 'so', 'a', 'name', 'called', 'named']);
155
+ /** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
156
+ export function promptParams(typedText) {
157
+ const t = askText(typedText);
158
+ const out = {};
159
+ const version = /\bv?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?)\b/.exec(t);
160
+ if (version)
161
+ out.version = version[1].replace(/\.$/, '');
162
+ for (const m of t.matchAll(/\b[0-9a-f]{7,40}\b/g)) {
163
+ if (/\d/.test(m[0]) && /[a-f]/.test(m[0])) {
164
+ out.sha = m[0];
165
+ break;
166
+ }
167
+ }
168
+ const pr = /(?:^|\s)#(\d+)\b|\bpr\s*#?(\d+)\b|\/pull\/(\d+)/i.exec(t);
169
+ if (pr)
170
+ out.pr = pr[1] ?? pr[2] ?? pr[3];
171
+ const port = /\b(?:localhost|127\.0\.0\.1|0\.0\.0\.0):(\d{2,5})\b|--port[= ](\d{2,5})\b|\bPORT=(\d{2,5})\b|\bport (\d{2,5})\b/i.exec(t);
172
+ if (port)
173
+ out.port = port[1] ?? port[2] ?? port[3] ?? port[4];
174
+ const branch = /\bbranch(?: called| named)? ([\w./-]+)/i.exec(t);
175
+ if (branch && !NOT_A_BRANCH.has(branch[1].toLowerCase()) && branch[1].length >= 2)
176
+ out.branch = branch[1];
177
+ const date = /\b20\d\d-\d\d-\d\d\b/.exec(t);
178
+ if (date)
179
+ out.date = date[0];
180
+ return out;
181
+ }
182
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Never throws: a read that fails knows nothing. */
2
+ export declare function repoKnown(key: string | null | undefined, checkout: string | null | undefined, env: NodeJS.ProcessEnv): boolean;
3
+ //# sourceMappingURL=known-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-repo.d.ts","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AA0CA,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAO9H"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * D117 (3), J16: is this a repo Trail knows? It has a `.trail/` folder (trail
3
+ * init made it, or the team committed one), or its key is in
4
+ * `~/.trail/repos/index.json` (a root commit's key, or an alias either side).
5
+ * Outside one, the global hooks keep no pool and make no offers there; walls
6
+ * and guardrails still apply everywhere.
7
+ *
8
+ * Reads only: one stat and one small JSON file, no git, no process.
9
+ */
10
+ import { realpathSync, statSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { trailHome } from '../notes/trail-home.js';
13
+ import { readJsonSafe, trailPath } from '../util/private-fs.js';
14
+ function isDir(p) {
15
+ try {
16
+ return statSync(p).isDirectory();
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /** `<checkout>/.trail` is a folder and not the Trail home itself (a home folder that is a work tree). */
23
+ function hasTrailFolder(checkout, env) {
24
+ const dot = join(checkout, '.trail');
25
+ if (!isDir(dot))
26
+ return false;
27
+ try {
28
+ return realpathSync(dot) !== realpathSync(trailHome(env));
29
+ }
30
+ catch {
31
+ return true;
32
+ }
33
+ }
34
+ function inIndex(key, env) {
35
+ const raw = readJsonSafe(trailPath(env, 'repos', 'index.json'));
36
+ if (!raw || typeof raw !== 'object')
37
+ return false;
38
+ const map = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : {});
39
+ const aliases = map(raw.aliases);
40
+ if (Object.prototype.hasOwnProperty.call(aliases, key) || Object.values(aliases).includes(key))
41
+ return true;
42
+ return Object.values(map(raw.roots)).includes(key);
43
+ }
44
+ /** Never throws: a read that fails knows nothing. */
45
+ export function repoKnown(key, checkout, env) {
46
+ try {
47
+ if (checkout && hasTrailFolder(checkout, env))
48
+ return true;
49
+ return typeof key === 'string' && key !== '' && inIndex(key, env);
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ //# sourceMappingURL=known-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-repo.js","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEhE,SAAS,KAAK,CAAC,CAAS;IACtB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,SAAS,cAAc,CAAC,QAAgB,EAAE,GAAsB;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAsB;IAClD,MAAM,GAAG,GAAG,YAAY,CAAyC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACxG,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,CAAU,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7I,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5G,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,GAA8B,EAAE,QAAmC,EAAE,GAAsB;IACnH,IAAI,CAAC;QACH,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { JobClass, JobMatch } from './types.js';
2
+ export interface PoolDay {
3
+ d: string;
4
+ s: string;
5
+ costly: boolean;
6
+ }
7
+ export interface PoolEntry {
8
+ words: string[];
9
+ days: PoolDay[];
10
+ lastGoodRun: string | null;
11
+ lastSeen: string;
12
+ shownAtInit: boolean;
13
+ }
14
+ export interface PoolFile {
15
+ v: 1;
16
+ jobs: Partial<Record<JobClass, PoolEntry>>;
17
+ }
18
+ export interface RepeatVerdict {
19
+ ok: boolean;
20
+ sessionDays: number;
21
+ dates: number;
22
+ costlyDays: number;
23
+ need: number;
24
+ }
25
+ /** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
26
+ export declare function poolPath(repoKey: string, env?: NodeJS.ProcessEnv): string;
27
+ export declare function readPool(repoKey: string, env?: NodeJS.ProcessEnv): PoolFile;
28
+ /** Adds or updates the (d, s) day for a job (costly OR-ed), prunes days older than 45 and entries unseen for 45 days. Locked; null when the lock timed out. */
29
+ export declare function notePoolDay(repoKey: string, m: JobMatch, day: PoolDay, goodRun: string | null, env?: NodeJS.ProcessEnv, now?: Date): PoolEntry | null;
30
+ /** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
31
+ export declare function repeatedEnough(e: PoolEntry, extraDay: boolean, now?: Date): RepeatVerdict;
32
+ /** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
33
+ export declare function watching(env?: NodeJS.ProcessEnv, now?: Date): Array<{
34
+ repoKey: string;
35
+ job: JobClass;
36
+ sessionDays: number;
37
+ costlyDays: number;
38
+ need: number;
39
+ }>;
40
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/trace/pool.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,OAAO;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAClE,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE;AACnI,MAAM,WAAW,QAAQ;IAAG,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;CAAE;AAC9E,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAepH,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAGzE;AA6BD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAE3E;AAED,+JAA+J;AAC/J,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,SAAS,GAAG,IAAI,CAyBjK;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CASrG;AA4BD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAa1K"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * The pool (design 2.3): for one repo, the days each job came back, kept in
3
+ * `~/.trail/repos/<key>/pool.json` beside phase 0's repo folder. A day is a
4
+ * session-day: the local date a run started on and the session's hash, with
5
+ * whether that run cost much (5+ tool calls or a failure). Job words from a
6
+ * fixed vocabulary and days only: no prompt text, no commands.
7
+ *
8
+ * Only jobs that can reach moment 2 are counted (release, ship, tests,
9
+ * report). A job is due an offer on its 3rd session-day in the last 45 days
10
+ * counting today (the 4th under the governor), at least 2 of them costly.
11
+ * Days older than that are dropped on every write.
12
+ */
13
+ import { readdirSync, statSync } from 'node:fs';
14
+ import { join, relative, sep } from 'node:path';
15
+ import { localDate, readSettings } from '../skills/settings.js';
16
+ import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
17
+ import { OFFER_FAMILIES } from './jobs.js';
18
+ /** The window: today and the 44 days before it. */
19
+ const WINDOW_DAYS = 45;
20
+ const MAX_WORDS = 12;
21
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
22
+ /** The first local date inside the 45-day window that ends today. */
23
+ function windowStart(now) {
24
+ const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (WINDOW_DAYS - 1), 12);
25
+ return localDate(d);
26
+ }
27
+ const offerJob = (job) => Object.prototype.hasOwnProperty.call(OFFER_FAMILIES, job);
28
+ /** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
29
+ export function poolPath(repoKey, env) {
30
+ const parts = String(repoKey).split('/').filter((p) => p && p !== '.' && p !== '..');
31
+ return trailPath(env, 'repos', ...parts, 'pool.json');
32
+ }
33
+ function cleanEntry(v) {
34
+ if (!v || typeof v !== 'object' || Array.isArray(v))
35
+ return null;
36
+ const e = v;
37
+ const days = Array.isArray(e.days)
38
+ ? e.days.filter((d) => !!d && typeof d.d === 'string' && DATE.test(d.d) && typeof d.s === 'string').map((d) => ({ d: d.d, s: d.s, costly: d.costly === true }))
39
+ : [];
40
+ return {
41
+ words: Array.isArray(e.words) ? e.words.filter((w) => typeof w === 'string').slice(0, MAX_WORDS) : [],
42
+ days,
43
+ lastGoodRun: typeof e.lastGoodRun === 'string' ? e.lastGoodRun : null,
44
+ lastSeen: typeof e.lastSeen === 'string' ? e.lastSeen : days.map((d) => d.d).sort().at(-1) ?? '',
45
+ shownAtInit: e.shownAtInit === true,
46
+ };
47
+ }
48
+ function parsePool(raw) {
49
+ const jobs = {};
50
+ const r = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
51
+ if (r.jobs && typeof r.jobs === 'object' && !Array.isArray(r.jobs)) {
52
+ for (const [job, v] of Object.entries(r.jobs)) {
53
+ const e = cleanEntry(v);
54
+ if (e && offerJob(job))
55
+ jobs[job] = e;
56
+ }
57
+ }
58
+ return { v: 1, jobs };
59
+ }
60
+ export function readPool(repoKey, env) {
61
+ return parsePool(readJsonSafe(poolPath(repoKey, env)));
62
+ }
63
+ /** Adds or updates the (d, s) day for a job (costly OR-ed), prunes days older than 45 and entries unseen for 45 days. Locked; null when the lock timed out. */
64
+ export function notePoolDay(repoKey, m, day, goodRun, env, now = new Date()) {
65
+ if (!offerJob(m.job) || !DATE.test(day.d))
66
+ return null;
67
+ const path = poolPath(repoKey, env);
68
+ const from = windowStart(now);
69
+ const done = withLock(path, () => {
70
+ const raw = readJsonSafe(path);
71
+ const keep = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
72
+ const pool = parsePool(raw);
73
+ const e = pool.jobs[m.job] ?? { words: [], days: [], lastGoodRun: null, lastSeen: day.d, shownAtInit: false };
74
+ for (const w of m.words)
75
+ if (e.words.length < MAX_WORDS && !e.words.includes(w))
76
+ e.words.push(w);
77
+ const same = e.days.find((x) => x.d === day.d && x.s === day.s);
78
+ if (same)
79
+ same.costly = same.costly || day.costly;
80
+ else
81
+ e.days.push({ d: day.d, s: day.s, costly: day.costly });
82
+ e.days.sort((a, b) => (a.d < b.d ? -1 : a.d > b.d ? 1 : 0));
83
+ if (goodRun)
84
+ e.lastGoodRun = goodRun;
85
+ if (day.d > e.lastSeen)
86
+ e.lastSeen = day.d;
87
+ pool.jobs[m.job] = e;
88
+ for (const [job, entry] of Object.entries(pool.jobs)) {
89
+ entry.days = entry.days.filter((x) => x.d >= from);
90
+ if (!entry.days.length || entry.lastSeen < from)
91
+ delete pool.jobs[job];
92
+ }
93
+ writePrivate(path, JSON.stringify({ ...keep, v: 1, jobs: pool.jobs }));
94
+ return pool.jobs[m.job] ?? null;
95
+ });
96
+ return done.ok ? done.value : null;
97
+ }
98
+ /** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
99
+ export function repeatedEnough(e, extraDay, now = new Date()) {
100
+ const from = windowStart(now);
101
+ const today = localDate(now);
102
+ const days = e.days.filter((x) => x.d >= from && x.d <= today);
103
+ const sessionDays = new Set(days.map((x) => `${x.d}|${x.s}`)).size;
104
+ const costlyDays = new Set(days.filter((x) => x.costly).map((x) => `${x.d}|${x.s}`)).size;
105
+ const dates = new Set(days.map((x) => x.d)).size;
106
+ const need = extraDay ? 4 : 3;
107
+ return { ok: sessionDays >= need && costlyDays >= 2, sessionDays, dates, costlyDays, need };
108
+ }
109
+ /** The governor from the settings cache (4.13 step 7): 3 or more answers lately, fewer than 1 in 3 a yes. */
110
+ function governorOn(env) {
111
+ const nine = readSettings(env).lastNine;
112
+ return nine.length >= 3 && nine.filter((a) => a === 'yes').length * 3 < nine.length;
113
+ }
114
+ /** Every pool.json under `dir`, as repo keys (the folders between `repos/` and the file). */
115
+ function poolKeys(root, dir, depth, out) {
116
+ if (depth > 6)
117
+ return;
118
+ let names;
119
+ try {
120
+ names = readdirSync(dir);
121
+ }
122
+ catch {
123
+ return;
124
+ }
125
+ for (const name of names) {
126
+ const p = join(dir, name);
127
+ if (name === 'pool.json')
128
+ out.push(relative(root, dir).split(sep).join('/'));
129
+ else if (!name.startsWith('.')) {
130
+ try {
131
+ if (statSync(p).isDirectory())
132
+ poolKeys(root, p, depth + 1, out);
133
+ }
134
+ catch { /* gone */ }
135
+ }
136
+ }
137
+ }
138
+ /** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
139
+ export function watching(env, now = new Date()) {
140
+ const root = trailPath(env, 'repos');
141
+ const keys = [];
142
+ poolKeys(root, root, 0, keys);
143
+ const extra = keys.length ? governorOn(env) : false;
144
+ const out = [];
145
+ for (const repoKey of keys.filter(Boolean)) {
146
+ for (const [job, e] of Object.entries(readPool(repoKey, env).jobs)) {
147
+ const v = repeatedEnough(e, extra, now);
148
+ if (v.sessionDays > 0)
149
+ out.push({ repoKey, job, sessionDays: v.sessionDays, costlyDays: v.costlyDays, need: v.need });
150
+ }
151
+ }
152
+ return out;
153
+ }
154
+ //# sourceMappingURL=pool.js.map