@nanonets/graft 0.23.1 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. package/README.md +4 -4
  2. package/dist/ai/crux.d.ts +31 -3
  3. package/dist/ai/crux.d.ts.map +1 -1
  4. package/dist/ai/crux.js +88 -10
  5. package/dist/ai/crux.js.map +1 -1
  6. package/dist/ai/llm/openai.d.ts +101 -0
  7. package/dist/ai/llm/openai.d.ts.map +1 -1
  8. package/dist/ai/llm/openai.js +396 -6
  9. package/dist/ai/llm/openai.js.map +1 -1
  10. package/dist/ai/llm/recover-tool.d.ts +2 -0
  11. package/dist/ai/llm/recover-tool.d.ts.map +1 -1
  12. package/dist/ai/llm/recover-tool.js +1 -1
  13. package/dist/ai/llm/recover-tool.js.map +1 -1
  14. package/dist/ai/synthesize.d.ts.map +1 -1
  15. package/dist/ai/synthesize.js +100 -1
  16. package/dist/ai/synthesize.js.map +1 -1
  17. package/dist/ask/ask.d.ts +8 -0
  18. package/dist/ask/ask.d.ts.map +1 -1
  19. package/dist/ask/ask.js +33 -12
  20. package/dist/ask/ask.js.map +1 -1
  21. package/dist/claude/format.js +1 -1
  22. package/dist/claude/format.js.map +1 -1
  23. package/dist/claude/hook-io.d.ts +44 -0
  24. package/dist/claude/hook-io.d.ts.map +1 -0
  25. package/dist/claude/hook-io.js +144 -0
  26. package/dist/claude/hook-io.js.map +1 -0
  27. package/dist/claude/hooks.d.ts +0 -18
  28. package/dist/claude/hooks.d.ts.map +1 -1
  29. package/dist/claude/hooks.js +24 -77
  30. package/dist/claude/hooks.js.map +1 -1
  31. package/dist/claude/init.js +3 -3
  32. package/dist/claude/init.js.map +1 -1
  33. package/dist/claude/note-signals.d.ts +28 -0
  34. package/dist/claude/note-signals.d.ts.map +1 -0
  35. package/dist/claude/note-signals.js +325 -0
  36. package/dist/claude/note-signals.js.map +1 -0
  37. package/dist/claude/shim-template.d.ts.map +1 -1
  38. package/dist/claude/shim-template.js +10 -4
  39. package/dist/claude/shim-template.js.map +1 -1
  40. package/dist/claude/skill-template.d.ts.map +1 -1
  41. package/dist/claude/skill-template.js +49 -18
  42. package/dist/claude/skill-template.js.map +1 -1
  43. package/dist/claude/skills-hook-util.d.ts +25 -0
  44. package/dist/claude/skills-hook-util.d.ts.map +1 -0
  45. package/dist/claude/skills-hook-util.js +71 -0
  46. package/dist/claude/skills-hook-util.js.map +1 -0
  47. package/dist/claude/state.d.ts +4 -3
  48. package/dist/claude/state.d.ts.map +1 -1
  49. package/dist/claude/state.js.map +1 -1
  50. package/dist/claude/sync-run.js +1 -1
  51. package/dist/claude/sync-run.js.map +1 -1
  52. package/dist/cli-picker.d.ts +36 -5
  53. package/dist/cli-picker.d.ts.map +1 -1
  54. package/dist/cli-picker.js +60 -13
  55. package/dist/cli-picker.js.map +1 -1
  56. package/dist/cli.d.ts +2 -0
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +406 -64
  59. package/dist/cli.js.map +1 -1
  60. package/dist/cloud/lookup-activity.d.ts +16 -0
  61. package/dist/cloud/lookup-activity.d.ts.map +1 -0
  62. package/dist/cloud/lookup-activity.js +56 -0
  63. package/dist/cloud/lookup-activity.js.map +1 -0
  64. package/dist/cloud/nudge.d.ts.map +1 -1
  65. package/dist/cloud/nudge.js +3 -0
  66. package/dist/cloud/nudge.js.map +1 -1
  67. package/dist/cloud/onboarding.d.ts +237 -0
  68. package/dist/cloud/onboarding.d.ts.map +1 -0
  69. package/dist/cloud/onboarding.js +536 -0
  70. package/dist/cloud/onboarding.js.map +1 -0
  71. package/dist/cloud/pair.d.ts +76 -0
  72. package/dist/cloud/pair.d.ts.map +1 -0
  73. package/dist/cloud/pair.js +249 -0
  74. package/dist/cloud/pair.js.map +1 -0
  75. package/dist/cloud/workspace-sync.d.ts +10 -2
  76. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  77. package/dist/cloud/workspace-sync.js +119 -7
  78. package/dist/cloud/workspace-sync.js.map +1 -1
  79. package/dist/cloud/workspace.d.ts +22 -1
  80. package/dist/cloud/workspace.d.ts.map +1 -1
  81. package/dist/cloud/workspace.js +16 -1
  82. package/dist/cloud/workspace.js.map +1 -1
  83. package/dist/context/batches.d.ts +29 -0
  84. package/dist/context/batches.d.ts.map +1 -0
  85. package/dist/context/batches.js +130 -0
  86. package/dist/context/batches.js.map +1 -0
  87. package/dist/context/build.d.ts +7 -2
  88. package/dist/context/build.d.ts.map +1 -1
  89. package/dist/context/build.js +84 -50
  90. package/dist/context/build.js.map +1 -1
  91. package/dist/context/node-file.d.ts.map +1 -1
  92. package/dist/context/node-file.js +41 -4
  93. package/dist/context/node-file.js.map +1 -1
  94. package/dist/engine.d.ts +2 -0
  95. package/dist/engine.d.ts.map +1 -1
  96. package/dist/engine.js +1 -0
  97. package/dist/engine.js.map +1 -1
  98. package/dist/graph/cards.d.ts.map +1 -1
  99. package/dist/graph/cards.js +9 -4
  100. package/dist/graph/cards.js.map +1 -1
  101. package/dist/graph/enrich.d.ts.map +1 -1
  102. package/dist/graph/enrich.js +8 -3
  103. package/dist/graph/enrich.js.map +1 -1
  104. package/dist/graph/generic.d.ts.map +1 -1
  105. package/dist/graph/generic.js +207 -6
  106. package/dist/graph/generic.js.map +1 -1
  107. package/dist/graph/lsp/client.d.ts +18 -0
  108. package/dist/graph/lsp/client.d.ts.map +1 -1
  109. package/dist/graph/lsp/client.js +40 -2
  110. package/dist/graph/lsp/client.js.map +1 -1
  111. package/dist/graph/lsp/enrich.d.ts.map +1 -1
  112. package/dist/graph/lsp/enrich.js +9 -1
  113. package/dist/graph/lsp/enrich.js.map +1 -1
  114. package/dist/graph/lsp/registry.d.ts +7 -0
  115. package/dist/graph/lsp/registry.d.ts.map +1 -1
  116. package/dist/graph/lsp/registry.js +27 -2
  117. package/dist/graph/lsp/registry.js.map +1 -1
  118. package/dist/graph/native.d.ts +2 -0
  119. package/dist/graph/native.d.ts.map +1 -1
  120. package/dist/graph/native.js +29 -4
  121. package/dist/graph/native.js.map +1 -1
  122. package/dist/graph/queries/gleam.scm +51 -0
  123. package/dist/graph/resolve.d.ts.map +1 -1
  124. package/dist/graph/resolve.js +65 -3
  125. package/dist/graph/resolve.js.map +1 -1
  126. package/dist/graph/workspace-cli.d.ts +2 -0
  127. package/dist/graph/workspace-cli.d.ts.map +1 -1
  128. package/dist/graph/workspace-cli.js +1 -1
  129. package/dist/graph/workspace-cli.js.map +1 -1
  130. package/dist/hosts/claude-global.d.ts +14 -0
  131. package/dist/hosts/claude-global.d.ts.map +1 -1
  132. package/dist/hosts/claude-global.js +38 -3
  133. package/dist/hosts/claude-global.js.map +1 -1
  134. package/dist/init/install-record.d.ts +21 -0
  135. package/dist/init/install-record.d.ts.map +1 -0
  136. package/dist/init/install-record.js +144 -0
  137. package/dist/init/install-record.js.map +1 -0
  138. package/dist/init/plain-file.d.ts +11 -0
  139. package/dist/init/plain-file.d.ts.map +1 -0
  140. package/dist/init/plain-file.js +80 -0
  141. package/dist/init/plain-file.js.map +1 -0
  142. package/dist/mcp/brains.d.ts +72 -0
  143. package/dist/mcp/brains.d.ts.map +1 -0
  144. package/dist/mcp/brains.js +220 -0
  145. package/dist/mcp/brains.js.map +1 -0
  146. package/dist/mcp/server.d.ts +3 -1
  147. package/dist/mcp/server.d.ts.map +1 -1
  148. package/dist/mcp/server.js +40 -5
  149. package/dist/mcp/server.js.map +1 -1
  150. package/dist/mcp/tools.d.ts.map +1 -1
  151. package/dist/mcp/tools.js +7 -2
  152. package/dist/mcp/tools.js.map +1 -1
  153. package/dist/notes/branches.d.ts +7 -1
  154. package/dist/notes/branches.d.ts.map +1 -1
  155. package/dist/notes/branches.js +31 -3
  156. package/dist/notes/branches.js.map +1 -1
  157. package/dist/notes/cold-start.d.ts +42 -3
  158. package/dist/notes/cold-start.d.ts.map +1 -1
  159. package/dist/notes/cold-start.js +144 -24
  160. package/dist/notes/cold-start.js.map +1 -1
  161. package/dist/notes/credit.d.ts +37 -0
  162. package/dist/notes/credit.d.ts.map +1 -0
  163. package/dist/notes/credit.js +78 -0
  164. package/dist/notes/credit.js.map +1 -0
  165. package/dist/notes/every-repo.d.ts +18 -0
  166. package/dist/notes/every-repo.d.ts.map +1 -0
  167. package/dist/notes/every-repo.js +86 -0
  168. package/dist/notes/every-repo.js.map +1 -0
  169. package/dist/notes/find-notes.d.ts +17 -0
  170. package/dist/notes/find-notes.d.ts.map +1 -0
  171. package/dist/notes/find-notes.js +48 -0
  172. package/dist/notes/find-notes.js.map +1 -0
  173. package/dist/notes/flatten.d.ts +31 -0
  174. package/dist/notes/flatten.d.ts.map +1 -0
  175. package/dist/notes/flatten.js +73 -0
  176. package/dist/notes/flatten.js.map +1 -0
  177. package/dist/notes/git-facts.d.ts +2 -0
  178. package/dist/notes/git-facts.d.ts.map +1 -1
  179. package/dist/notes/git-facts.js +6 -0
  180. package/dist/notes/git-facts.js.map +1 -1
  181. package/dist/notes/guardrails.d.ts +8 -0
  182. package/dist/notes/guardrails.d.ts.map +1 -0
  183. package/dist/notes/guardrails.js +38 -0
  184. package/dist/notes/guardrails.js.map +1 -0
  185. package/dist/notes/home.d.ts +24 -6
  186. package/dist/notes/home.d.ts.map +1 -1
  187. package/dist/notes/home.js +82 -15
  188. package/dist/notes/home.js.map +1 -1
  189. package/dist/notes/learning-fields.d.ts +102 -0
  190. package/dist/notes/learning-fields.d.ts.map +1 -0
  191. package/dist/notes/learning-fields.js +214 -0
  192. package/dist/notes/learning-fields.js.map +1 -0
  193. package/dist/notes/lesson-index.d.ts +13 -0
  194. package/dist/notes/lesson-index.d.ts.map +1 -0
  195. package/dist/notes/lesson-index.js +135 -0
  196. package/dist/notes/lesson-index.js.map +1 -0
  197. package/dist/notes/linked-learnings.d.ts +8 -0
  198. package/dist/notes/linked-learnings.d.ts.map +1 -0
  199. package/dist/notes/linked-learnings.js +113 -0
  200. package/dist/notes/linked-learnings.js.map +1 -0
  201. package/dist/notes/memory-notes.d.ts +71 -0
  202. package/dist/notes/memory-notes.d.ts.map +1 -0
  203. package/dist/notes/memory-notes.js +239 -0
  204. package/dist/notes/memory-notes.js.map +1 -0
  205. package/dist/notes/note-gate.d.ts +42 -0
  206. package/dist/notes/note-gate.d.ts.map +1 -0
  207. package/dist/notes/note-gate.js +181 -0
  208. package/dist/notes/note-gate.js.map +1 -0
  209. package/dist/notes/notes.d.ts +29 -85
  210. package/dist/notes/notes.d.ts.map +1 -1
  211. package/dist/notes/notes.js +69 -254
  212. package/dist/notes/notes.js.map +1 -1
  213. package/dist/notes/pr-reviews.d.ts +35 -7
  214. package/dist/notes/pr-reviews.d.ts.map +1 -1
  215. package/dist/notes/pr-reviews.js +156 -46
  216. package/dist/notes/pr-reviews.js.map +1 -1
  217. package/dist/notes/replace.d.ts +14 -0
  218. package/dist/notes/replace.d.ts.map +1 -0
  219. package/dist/notes/replace.js +38 -0
  220. package/dist/notes/replace.js.map +1 -0
  221. package/dist/notes/repo-notes-dir.d.ts +2 -0
  222. package/dist/notes/repo-notes-dir.d.ts.map +1 -0
  223. package/dist/notes/repo-notes-dir.js +16 -0
  224. package/dist/notes/repo-notes-dir.js.map +1 -0
  225. package/dist/notes/secrets.d.ts +28 -0
  226. package/dist/notes/secrets.d.ts.map +1 -0
  227. package/dist/notes/secrets.js +362 -0
  228. package/dist/notes/secrets.js.map +1 -0
  229. package/dist/notes/targets.d.ts +37 -0
  230. package/dist/notes/targets.d.ts.map +1 -0
  231. package/dist/notes/targets.js +108 -0
  232. package/dist/notes/targets.js.map +1 -0
  233. package/dist/notes/team-check.d.ts +22 -0
  234. package/dist/notes/team-check.d.ts.map +1 -0
  235. package/dist/notes/team-check.js +130 -0
  236. package/dist/notes/team-check.js.map +1 -0
  237. package/dist/notes/trail-home.d.ts +3 -0
  238. package/dist/notes/trail-home.d.ts.map +1 -0
  239. package/dist/notes/trail-home.js +12 -0
  240. package/dist/notes/trail-home.js.map +1 -0
  241. package/dist/skills/anchors-cli.d.ts +33 -0
  242. package/dist/skills/anchors-cli.d.ts.map +1 -0
  243. package/dist/skills/anchors-cli.js +274 -0
  244. package/dist/skills/anchors-cli.js.map +1 -0
  245. package/dist/skills/anchors-git.d.ts +29 -0
  246. package/dist/skills/anchors-git.d.ts.map +1 -0
  247. package/dist/skills/anchors-git.js +241 -0
  248. package/dist/skills/anchors-git.js.map +1 -0
  249. package/dist/skills/anchors-wide.d.ts +25 -0
  250. package/dist/skills/anchors-wide.d.ts.map +1 -0
  251. package/dist/skills/anchors-wide.js +481 -0
  252. package/dist/skills/anchors-wide.js.map +1 -0
  253. package/dist/skills/anchors.d.ts +32 -0
  254. package/dist/skills/anchors.d.ts.map +1 -0
  255. package/dist/skills/anchors.js +485 -0
  256. package/dist/skills/anchors.js.map +1 -0
  257. package/dist/skills/answers-prompt.d.ts +13 -0
  258. package/dist/skills/answers-prompt.d.ts.map +1 -0
  259. package/dist/skills/answers-prompt.js +83 -0
  260. package/dist/skills/answers-prompt.js.map +1 -0
  261. package/dist/skills/check-result.d.ts +26 -0
  262. package/dist/skills/check-result.d.ts.map +1 -0
  263. package/dist/skills/check-result.js +46 -0
  264. package/dist/skills/check-result.js.map +1 -0
  265. package/dist/skills/codex-sandbox.d.ts +6 -0
  266. package/dist/skills/codex-sandbox.d.ts.map +1 -0
  267. package/dist/skills/codex-sandbox.js +55 -0
  268. package/dist/skills/codex-sandbox.js.map +1 -0
  269. package/dist/skills/compile-split.d.ts +57 -0
  270. package/dist/skills/compile-split.d.ts.map +1 -0
  271. package/dist/skills/compile-split.js +532 -0
  272. package/dist/skills/compile-split.js.map +1 -0
  273. package/dist/skills/compile-version.d.ts +37 -0
  274. package/dist/skills/compile-version.d.ts.map +1 -0
  275. package/dist/skills/compile-version.js +56 -0
  276. package/dist/skills/compile-version.js.map +1 -0
  277. package/dist/skills/compile-waits.d.ts +12 -0
  278. package/dist/skills/compile-waits.d.ts.map +1 -0
  279. package/dist/skills/compile-waits.js +52 -0
  280. package/dist/skills/compile-waits.js.map +1 -0
  281. package/dist/skills/compile-words.d.ts +82 -0
  282. package/dist/skills/compile-words.d.ts.map +1 -0
  283. package/dist/skills/compile-words.js +385 -0
  284. package/dist/skills/compile-words.js.map +1 -0
  285. package/dist/skills/compile.d.ts +35 -0
  286. package/dist/skills/compile.d.ts.map +1 -0
  287. package/dist/skills/compile.js +488 -0
  288. package/dist/skills/compile.js.map +1 -0
  289. package/dist/skills/credit-facts.d.ts +8 -0
  290. package/dist/skills/credit-facts.d.ts.map +1 -0
  291. package/dist/skills/credit-facts.js +32 -0
  292. package/dist/skills/credit-facts.js.map +1 -0
  293. package/dist/skills/directive-words.d.ts +11 -0
  294. package/dist/skills/directive-words.d.ts.map +1 -0
  295. package/dist/skills/directive-words.js +33 -0
  296. package/dist/skills/directive-words.js.map +1 -0
  297. package/dist/skills/fidelity.d.ts +42 -0
  298. package/dist/skills/fidelity.d.ts.map +1 -0
  299. package/dist/skills/fidelity.js +138 -0
  300. package/dist/skills/fidelity.js.map +1 -0
  301. package/dist/skills/forget-notice.d.ts +44 -0
  302. package/dist/skills/forget-notice.d.ts.map +1 -0
  303. package/dist/skills/forget-notice.js +131 -0
  304. package/dist/skills/forget-notice.js.map +1 -0
  305. package/dist/skills/found-skill.d.ts +35 -0
  306. package/dist/skills/found-skill.d.ts.map +1 -0
  307. package/dist/skills/found-skill.js +66 -0
  308. package/dist/skills/found-skill.js.map +1 -0
  309. package/dist/skills/front-version.d.ts +12 -0
  310. package/dist/skills/front-version.d.ts.map +1 -0
  311. package/dist/skills/front-version.js +87 -0
  312. package/dist/skills/front-version.js.map +1 -0
  313. package/dist/skills/host-facts.d.ts +51 -0
  314. package/dist/skills/host-facts.d.ts.map +1 -0
  315. package/dist/skills/host-facts.js +134 -0
  316. package/dist/skills/host-facts.js.map +1 -0
  317. package/dist/skills/ledger.d.ts +43 -0
  318. package/dist/skills/ledger.d.ts.map +1 -0
  319. package/dist/skills/ledger.js +336 -0
  320. package/dist/skills/ledger.js.map +1 -0
  321. package/dist/skills/lessons.d.ts +60 -0
  322. package/dist/skills/lessons.d.ts.map +1 -0
  323. package/dist/skills/lessons.js +396 -0
  324. package/dist/skills/lessons.js.map +1 -0
  325. package/dist/skills/never-save.d.ts +5 -0
  326. package/dist/skills/never-save.d.ts.map +1 -0
  327. package/dist/skills/never-save.js +158 -0
  328. package/dist/skills/never-save.js.map +1 -0
  329. package/dist/skills/offer-answers.d.ts +20 -0
  330. package/dist/skills/offer-answers.d.ts.map +1 -0
  331. package/dist/skills/offer-answers.js +51 -0
  332. package/dist/skills/offer-answers.js.map +1 -0
  333. package/dist/skills/own-folder.d.ts +9 -0
  334. package/dist/skills/own-folder.d.ts.map +1 -0
  335. package/dist/skills/own-folder.js +36 -0
  336. package/dist/skills/own-folder.js.map +1 -0
  337. package/dist/skills/params.d.ts +39 -0
  338. package/dist/skills/params.d.ts.map +1 -0
  339. package/dist/skills/params.js +275 -0
  340. package/dist/skills/params.js.map +1 -0
  341. package/dist/skills/person.d.ts +34 -0
  342. package/dist/skills/person.d.ts.map +1 -0
  343. package/dist/skills/person.js +102 -0
  344. package/dist/skills/person.js.map +1 -0
  345. package/dist/skills/probe-clean.d.ts +9 -0
  346. package/dist/skills/probe-clean.d.ts.map +1 -0
  347. package/dist/skills/probe-clean.js +48 -0
  348. package/dist/skills/probe-clean.js.map +1 -0
  349. package/dist/skills/probes.d.ts +26 -0
  350. package/dist/skills/probes.d.ts.map +1 -0
  351. package/dist/skills/probes.js +225 -0
  352. package/dist/skills/probes.js.map +1 -0
  353. package/dist/skills/ran-less.d.ts +5 -0
  354. package/dist/skills/ran-less.d.ts.map +1 -0
  355. package/dist/skills/ran-less.js +51 -0
  356. package/dist/skills/ran-less.js.map +1 -0
  357. package/dist/skills/recall.d.ts +119 -0
  358. package/dist/skills/recall.d.ts.map +1 -0
  359. package/dist/skills/recall.js +370 -0
  360. package/dist/skills/recall.js.map +1 -0
  361. package/dist/skills/receipts.d.ts +44 -0
  362. package/dist/skills/receipts.d.ts.map +1 -0
  363. package/dist/skills/receipts.js +223 -0
  364. package/dist/skills/receipts.js.map +1 -0
  365. package/dist/skills/risk-delta.d.ts +32 -0
  366. package/dist/skills/risk-delta.d.ts.map +1 -0
  367. package/dist/skills/risk-delta.js +56 -0
  368. package/dist/skills/risk-delta.js.map +1 -0
  369. package/dist/skills/risk.d.ts +73 -0
  370. package/dist/skills/risk.d.ts.map +1 -0
  371. package/dist/skills/risk.js +396 -0
  372. package/dist/skills/risk.js.map +1 -0
  373. package/dist/skills/run-checkout.d.ts +4 -0
  374. package/dist/skills/run-checkout.d.ts.map +1 -0
  375. package/dist/skills/run-checkout.js +37 -0
  376. package/dist/skills/run-checkout.js.map +1 -0
  377. package/dist/skills/runblock.d.ts +45 -0
  378. package/dist/skills/runblock.d.ts.map +1 -0
  379. package/dist/skills/runblock.js +222 -0
  380. package/dist/skills/runblock.js.map +1 -0
  381. package/dist/skills/save-parse.d.ts +42 -0
  382. package/dist/skills/save-parse.d.ts.map +1 -0
  383. package/dist/skills/save-parse.js +172 -0
  384. package/dist/skills/save-parse.js.map +1 -0
  385. package/dist/skills/save-store.d.ts +12 -0
  386. package/dist/skills/save-store.d.ts.map +1 -0
  387. package/dist/skills/save-store.js +22 -0
  388. package/dist/skills/save-store.js.map +1 -0
  389. package/dist/skills/settings.d.ts +38 -0
  390. package/dist/skills/settings.d.ts.map +1 -0
  391. package/dist/skills/settings.js +133 -0
  392. package/dist/skills/settings.js.map +1 -0
  393. package/dist/skills/skill-diff.d.ts +40 -0
  394. package/dist/skills/skill-diff.d.ts.map +1 -0
  395. package/dist/skills/skill-diff.js +191 -0
  396. package/dist/skills/skill-diff.js.map +1 -0
  397. package/dist/skills/skill-file.d.ts +24 -0
  398. package/dist/skills/skill-file.d.ts.map +1 -0
  399. package/dist/skills/skill-file.js +97 -0
  400. package/dist/skills/skill-file.js.map +1 -0
  401. package/dist/skills/skill-rebuild.d.ts +27 -0
  402. package/dist/skills/skill-rebuild.d.ts.map +1 -0
  403. package/dist/skills/skill-rebuild.js +85 -0
  404. package/dist/skills/skill-rebuild.js.map +1 -0
  405. package/dist/skills/skillmd.d.ts +17 -0
  406. package/dist/skills/skillmd.d.ts.map +1 -0
  407. package/dist/skills/skillmd.js +219 -0
  408. package/dist/skills/skillmd.js.map +1 -0
  409. package/dist/skills/skills.d.ts +2 -0
  410. package/dist/skills/skills.d.ts.map +1 -1
  411. package/dist/skills/skills.js +1 -1
  412. package/dist/skills/skills.js.map +1 -1
  413. package/dist/skills/staleness.d.ts +27 -0
  414. package/dist/skills/staleness.d.ts.map +1 -0
  415. package/dist/skills/staleness.js +178 -0
  416. package/dist/skills/staleness.js.map +1 -0
  417. package/dist/skills/state.d.ts +36 -0
  418. package/dist/skills/state.d.ts.map +1 -0
  419. package/dist/skills/state.js +259 -0
  420. package/dist/skills/state.js.map +1 -0
  421. package/dist/skills/store-fs.d.ts +77 -0
  422. package/dist/skills/store-fs.d.ts.map +1 -0
  423. package/dist/skills/store-fs.js +194 -0
  424. package/dist/skills/store-fs.js.map +1 -0
  425. package/dist/skills/store-held.d.ts +44 -0
  426. package/dist/skills/store-held.d.ts.map +1 -0
  427. package/dist/skills/store-held.js +147 -0
  428. package/dist/skills/store-held.js.map +1 -0
  429. package/dist/skills/store.d.ts +73 -0
  430. package/dist/skills/store.d.ts.map +1 -0
  431. package/dist/skills/store.js +279 -0
  432. package/dist/skills/store.js.map +1 -0
  433. package/dist/skills/types.d.ts +422 -0
  434. package/dist/skills/types.d.ts.map +1 -0
  435. package/dist/skills/types.js +2 -0
  436. package/dist/skills/types.js.map +1 -0
  437. package/dist/skills/validate.d.ts +11 -0
  438. package/dist/skills/validate.d.ts.map +1 -0
  439. package/dist/skills/validate.js +112 -0
  440. package/dist/skills/validate.js.map +1 -0
  441. package/dist/skills/versions-fs.d.ts +45 -0
  442. package/dist/skills/versions-fs.d.ts.map +1 -0
  443. package/dist/skills/versions-fs.js +234 -0
  444. package/dist/skills/versions-fs.js.map +1 -0
  445. package/dist/skills/versions.d.ts +56 -0
  446. package/dist/skills/versions.d.ts.map +1 -0
  447. package/dist/skills/versions.js +351 -0
  448. package/dist/skills/versions.js.map +1 -0
  449. package/dist/telemetry/contract.d.ts.map +1 -1
  450. package/dist/telemetry/contract.js +8 -6
  451. package/dist/telemetry/contract.js.map +1 -1
  452. package/dist/telemetry/notice.d.ts.map +1 -1
  453. package/dist/telemetry/notice.js +3 -1
  454. package/dist/telemetry/notice.js.map +1 -1
  455. package/dist/trace/check-reads.d.ts +36 -0
  456. package/dist/trace/check-reads.d.ts.map +1 -0
  457. package/dist/trace/check-reads.js +57 -0
  458. package/dist/trace/check-reads.js.map +1 -0
  459. package/dist/trace/checks.d.ts +63 -0
  460. package/dist/trace/checks.d.ts.map +1 -0
  461. package/dist/trace/checks.js +487 -0
  462. package/dist/trace/checks.js.map +1 -0
  463. package/dist/trace/claude.d.ts +124 -0
  464. package/dist/trace/claude.d.ts.map +1 -0
  465. package/dist/trace/claude.js +303 -0
  466. package/dist/trace/claude.js.map +1 -0
  467. package/dist/trace/codex-exec.d.ts +22 -0
  468. package/dist/trace/codex-exec.d.ts.map +1 -0
  469. package/dist/trace/codex-exec.js +129 -0
  470. package/dist/trace/codex-exec.js.map +1 -0
  471. package/dist/trace/codex-meta.d.ts +23 -0
  472. package/dist/trace/codex-meta.d.ts.map +1 -0
  473. package/dist/trace/codex-meta.js +112 -0
  474. package/dist/trace/codex-meta.js.map +1 -0
  475. package/dist/trace/codex.d.ts +33 -0
  476. package/dist/trace/codex.d.ts.map +1 -0
  477. package/dist/trace/codex.js +485 -0
  478. package/dist/trace/codex.js.map +1 -0
  479. package/dist/trace/cursor.d.ts +16 -0
  480. package/dist/trace/cursor.d.ts.map +1 -0
  481. package/dist/trace/cursor.js +133 -0
  482. package/dist/trace/cursor.js.map +1 -0
  483. package/dist/trace/dialect.d.ts +43 -0
  484. package/dist/trace/dialect.d.ts.map +1 -0
  485. package/dist/trace/dialect.js +95 -0
  486. package/dist/trace/dialect.js.map +1 -0
  487. package/dist/trace/epochs.d.ts +10 -0
  488. package/dist/trace/epochs.d.ts.map +1 -0
  489. package/dist/trace/epochs.js +16 -0
  490. package/dist/trace/epochs.js.map +1 -0
  491. package/dist/trace/failure.d.ts +15 -0
  492. package/dist/trace/failure.d.ts.map +1 -0
  493. package/dist/trace/failure.js +69 -0
  494. package/dist/trace/failure.js.map +1 -0
  495. package/dist/trace/gate-file.d.ts +71 -0
  496. package/dist/trace/gate-file.d.ts.map +1 -0
  497. package/dist/trace/gate-file.js +329 -0
  498. package/dist/trace/gate-file.js.map +1 -0
  499. package/dist/trace/guard-fast.d.ts +22 -0
  500. package/dist/trace/guard-fast.d.ts.map +1 -0
  501. package/dist/trace/guard-fast.js +213 -0
  502. package/dist/trace/guard-fast.js.map +1 -0
  503. package/dist/trace/host.d.ts +40 -0
  504. package/dist/trace/host.d.ts.map +1 -0
  505. package/dist/trace/host.js +84 -0
  506. package/dist/trace/host.js.map +1 -0
  507. package/dist/trace/housekeeping.d.ts +5 -0
  508. package/dist/trace/housekeeping.d.ts.map +1 -0
  509. package/dist/trace/housekeeping.js +93 -0
  510. package/dist/trace/housekeeping.js.map +1 -0
  511. package/dist/trace/jobs.d.ts +52 -0
  512. package/dist/trace/jobs.d.ts.map +1 -0
  513. package/dist/trace/jobs.js +182 -0
  514. package/dist/trace/jobs.js.map +1 -0
  515. package/dist/trace/known-repo.d.ts +3 -0
  516. package/dist/trace/known-repo.d.ts.map +1 -0
  517. package/dist/trace/known-repo.js +55 -0
  518. package/dist/trace/known-repo.js.map +1 -0
  519. package/dist/trace/pool.d.ts +40 -0
  520. package/dist/trace/pool.d.ts.map +1 -0
  521. package/dist/trace/pool.js +154 -0
  522. package/dist/trace/pool.js.map +1 -0
  523. package/dist/trace/redact.d.ts +8 -0
  524. package/dist/trace/redact.d.ts.map +1 -0
  525. package/dist/trace/redact.js +63 -0
  526. package/dist/trace/redact.js.map +1 -0
  527. package/dist/trace/repairs.d.ts +27 -0
  528. package/dist/trace/repairs.d.ts.map +1 -0
  529. package/dist/trace/repairs.js +303 -0
  530. package/dist/trace/repairs.js.map +1 -0
  531. package/dist/trace/run-calls.d.ts +82 -0
  532. package/dist/trace/run-calls.d.ts.map +1 -0
  533. package/dist/trace/run-calls.js +331 -0
  534. package/dist/trace/run-calls.js.map +1 -0
  535. package/dist/trace/run-join.d.ts +20 -0
  536. package/dist/trace/run-join.d.ts.map +1 -0
  537. package/dist/trace/run-join.js +99 -0
  538. package/dist/trace/run-join.js.map +1 -0
  539. package/dist/trace/run-sheets.d.ts +26 -0
  540. package/dist/trace/run-sheets.d.ts.map +1 -0
  541. package/dist/trace/run-sheets.js +145 -0
  542. package/dist/trace/run-sheets.js.map +1 -0
  543. package/dist/trace/run-turns.d.ts +24 -0
  544. package/dist/trace/run-turns.d.ts.map +1 -0
  545. package/dist/trace/run-turns.js +67 -0
  546. package/dist/trace/run-turns.js.map +1 -0
  547. package/dist/trace/run-verdict.d.ts +24 -0
  548. package/dist/trace/run-verdict.d.ts.map +1 -0
  549. package/dist/trace/run-verdict.js +176 -0
  550. package/dist/trace/run-verdict.js.map +1 -0
  551. package/dist/trace/runs.d.ts +54 -0
  552. package/dist/trace/runs.d.ts.map +1 -0
  553. package/dist/trace/runs.js +501 -0
  554. package/dist/trace/runs.js.map +1 -0
  555. package/dist/trace/seen-cache.d.ts +9 -0
  556. package/dist/trace/seen-cache.d.ts.map +1 -0
  557. package/dist/trace/seen-cache.js +46 -0
  558. package/dist/trace/seen-cache.js.map +1 -0
  559. package/dist/trace/shell-scan.d.ts +52 -0
  560. package/dist/trace/shell-scan.d.ts.map +1 -0
  561. package/dist/trace/shell-scan.js +318 -0
  562. package/dist/trace/shell-scan.js.map +1 -0
  563. package/dist/trace/shell-words.d.ts +91 -0
  564. package/dist/trace/shell-words.d.ts.map +1 -0
  565. package/dist/trace/shell-words.js +558 -0
  566. package/dist/trace/shell-words.js.map +1 -0
  567. package/dist/trace/shell.d.ts +91 -0
  568. package/dist/trace/shell.d.ts.map +1 -0
  569. package/dist/trace/shell.js +435 -0
  570. package/dist/trace/shell.js.map +1 -0
  571. package/dist/trace/skill-session.d.ts +64 -0
  572. package/dist/trace/skill-session.d.ts.map +1 -0
  573. package/dist/trace/skill-session.js +232 -0
  574. package/dist/trace/skill-session.js.map +1 -0
  575. package/dist/trace/state.d.ts +27 -0
  576. package/dist/trace/state.d.ts.map +1 -0
  577. package/dist/trace/state.js +98 -0
  578. package/dist/trace/state.js.map +1 -0
  579. package/dist/trace/tamper-code.d.ts +9 -0
  580. package/dist/trace/tamper-code.d.ts.map +1 -0
  581. package/dist/trace/tamper-code.js +174 -0
  582. package/dist/trace/tamper-code.js.map +1 -0
  583. package/dist/trace/tamper-git.d.ts +12 -0
  584. package/dist/trace/tamper-git.d.ts.map +1 -0
  585. package/dist/trace/tamper-git.js +77 -0
  586. package/dist/trace/tamper-git.js.map +1 -0
  587. package/dist/trace/tamper.d.ts +12 -0
  588. package/dist/trace/tamper.d.ts.map +1 -0
  589. package/dist/trace/tamper.js +405 -0
  590. package/dist/trace/tamper.js.map +1 -0
  591. package/dist/trace/typed.d.ts +30 -0
  592. package/dist/trace/typed.d.ts.map +1 -0
  593. package/dist/trace/typed.js +132 -0
  594. package/dist/trace/typed.js.map +1 -0
  595. package/dist/trace/types.d.ts +477 -0
  596. package/dist/trace/types.d.ts.map +1 -0
  597. package/dist/trace/types.js +12 -0
  598. package/dist/trace/types.js.map +1 -0
  599. package/dist/trace/wall-state.d.ts +86 -0
  600. package/dist/trace/wall-state.d.ts.map +1 -0
  601. package/dist/trace/wall-state.js +279 -0
  602. package/dist/trace/wall-state.js.map +1 -0
  603. package/dist/trace/walls-glob.d.ts +11 -0
  604. package/dist/trace/walls-glob.d.ts.map +1 -0
  605. package/dist/trace/walls-glob.js +264 -0
  606. package/dist/trace/walls-glob.js.map +1 -0
  607. package/dist/trace/walls-quoted.d.ts +25 -0
  608. package/dist/trace/walls-quoted.d.ts.map +1 -0
  609. package/dist/trace/walls-quoted.js +81 -0
  610. package/dist/trace/walls-quoted.js.map +1 -0
  611. package/dist/trace/walls.d.ts +40 -0
  612. package/dist/trace/walls.d.ts.map +1 -0
  613. package/dist/trace/walls.js +318 -0
  614. package/dist/trace/walls.js.map +1 -0
  615. package/dist/upkeep.d.ts +1 -1
  616. package/dist/upkeep.d.ts.map +1 -1
  617. package/dist/upkeep.js +4 -1
  618. package/dist/upkeep.js.map +1 -1
  619. package/dist/util/actions-folder.d.ts +2 -0
  620. package/dist/util/actions-folder.d.ts.map +1 -0
  621. package/dist/util/actions-folder.js +9 -0
  622. package/dist/util/actions-folder.js.map +1 -0
  623. package/dist/util/front-matter.d.ts +31 -4
  624. package/dist/util/front-matter.d.ts.map +1 -1
  625. package/dist/util/front-matter.js +95 -3
  626. package/dist/util/front-matter.js.map +1 -1
  627. package/dist/util/private-file.d.ts +14 -0
  628. package/dist/util/private-file.d.ts.map +1 -0
  629. package/dist/util/private-file.js +82 -0
  630. package/dist/util/private-file.js.map +1 -0
  631. package/dist/util/private-fs.d.ts +25 -0
  632. package/dist/util/private-fs.d.ts.map +1 -0
  633. package/dist/util/private-fs.js +253 -0
  634. package/dist/util/private-fs.js.map +1 -0
  635. package/dist/util/state.d.ts.map +1 -1
  636. package/dist/util/state.js +3 -0
  637. package/dist/util/state.js.map +1 -1
  638. package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
  639. package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
  640. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
  641. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
  642. package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
  643. package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
  644. package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
  645. package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
  646. package/dist/viewer/app.js +2 -2
  647. package/package.json +10 -7
  648. package/scripts/run-tests.mjs +14 -2
  649. package/scripts/stamp-telemetry-key.mjs +8 -5
  650. package/scripts/vendor-grammars.mjs +35 -0
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Lessons (design 1.3, 2.3, 4.14 steps 2 and 5, 4.16, spec 7 and 13): one
3
+ * line the person kept on a skill after correcting it, or about a wall a
4
+ * fix got past. A lesson on a skill rides at the end of the skill's run
5
+ * block; a wall lesson (no skill) is a learning of kind `lesson` that only
6
+ * `lastTimeText` reads (R47), every repo for a machine wall and this repo's
7
+ * personal folder for git-https-auth (R49).
8
+ *
9
+ * The correction phrase is deterministic: the person's own clause, a few
10
+ * fixed forms, nothing a model wrote. Lesson text is one flattened line of at
11
+ * most 200 characters, with a leading `[trail]` or `[graft]` gone, when it is
12
+ * written and again when it is read (a lesson file can be edited by hand).
13
+ *
14
+ * Files 0600 in 0700 folders, every path under `trailPath(env)` (0 rule 11),
15
+ * never written through a link.
16
+ */
17
+ import { randomBytes, createHash } from 'node:crypto';
18
+ import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
19
+ import { basename, join, relative, sep } from 'node:path';
20
+ import { flatLine } from '../notes/flatten.js';
21
+ import { matter } from '../util/front-matter.js';
22
+ import { EVERY_REPO, liveLessons, newLearningId, readLearningFields, WALL_CLASSES } from '../notes/learning-fields.js';
23
+ import { renderNote } from '../notes/notes.js';
24
+ import { everyRepoDir, writeEveryRepo } from '../notes/every-repo.js';
25
+ import { repoNotesDir } from '../notes/repo-notes-dir.js';
26
+ import { lessonNotesIn } from '../notes/lesson-index.js';
27
+ import { trailPath, writePrivate } from '../util/private-fs.js';
28
+ import { privateDir, safeName, skillsDir } from './store-fs.js';
29
+ import { ownFolder } from './own-folder.js';
30
+ import { gatedKind } from './risk.js';
31
+ import { neverSave } from './never-save.js';
32
+ import { askText } from '../trace/jobs.js';
33
+ export const LESSON_MAX = 200;
34
+ const MAX_FILE = 4 * 1024;
35
+ const MAX_FILES = 50;
36
+ const NEWEST = 3;
37
+ const LESSON_ID = /^ls-[0-9a-f]{6}$/;
38
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
39
+ const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
40
+ /** Walls about the machine, not one repo (spec 2, R49): their lessons hold in every repo. */
41
+ const REPO_WALLS = new Set(['git-https-auth']);
42
+ /** The words a lesson reaches the agent and the person in (J07, 4.14, 4.15). Information, tied to the skill (D88). */
43
+ export const LESSON_COPY = {
44
+ line: 'Lesson (the person, {date}): {text}',
45
+ offerFirst: 'You corrected {skill}: {said}.',
46
+ offerSecond: 'Add a lesson to it, just for you: "{lesson}"? (yes / no)',
47
+ saved: "✓ lesson added to {skill}, just for you · it rides at the end of the skill's steps · undo: trail forget {id}",
48
+ savedWall: '✓ lesson kept, just for you {where} · Trail shows it when "{fixed}" comes back · undo: trail forget {id}',
49
+ };
50
+ const fill = (t, v) => t.replace(/\{(\w+)\}/g, (m, k) => v[k] ?? m);
51
+ /* ----------------------------------------------------------- the phrase */
52
+ /**
53
+ * Words a correction often starts with before its clause ("no, it didn't ..."). Not 'also': that is a form. A `no`
54
+ * that starts "no need to", "no reason to" ... is the clause's own negation, never an interjection: dropping it
55
+ * would turn "no need to run the tests" into the lesson "run the tests" (review).
56
+ */
57
+ const LEAD = /^(?:(?:no(?!\s+(?:need|reason|point|use|more|longer|way|one|matter|problem|worries|thanks|rush|idea)\b)|nope|oh|hey|wait|actually|but|and|so|ok|okay|hmm|um|well|please|sorry)\b[\s,.!:;-]*)+/i;
58
+ /** A tag question at the clause's end (", right", ", did it"): not part of the lesson. */
59
+ const TAG = /,\s*(?:right|ok(?:ay)?|yeah|yes|no|eh|huh|(?:did|didn'?t|does|doesn'?t|is|isn'?t|was|wasn'?t)\s+(?:it|you))\s*$/i;
60
+ /** Every line break flatLine knows: the person's clause ends at the first (what follows can be a pasted log). */
61
+ const BREAK = /\r\n|[\n\r\u000b\u000c\u0085\u2028\u2029]/;
62
+ /** A comma before a new subject ends the clause ("don't publish locally, it breaks CI"). */
63
+ const NEW_SUBJECT = /,\s*(?:(?:and|but|so|then)\s+)?(?:i|you|we|it|they|he|she|that|this|there|which)\b/i;
64
+ const QUESTION = /^(?:did|does|can|could|would|will|is|are|was|were|why|what|how|where|when|who|which|shall)\b|^(?:do|have|has)\s+(?:you|we|i|they|it)\b/i;
65
+ const MODAL = /^(?:also|need to|needs to|have to|has to|should|must)(?:\s+|$)/i;
66
+ const CLAUSE_MAX = 80;
67
+ const FORMS = [
68
+ { re: /^(?:it|you)\s+(?:didn'?t|did not|forgot to|never)\s+(.+)$/i, make: (m) => ({ lesson: `${m[1]} too`, kind: 'lesson' }) },
69
+ {
70
+ re: /^(?:you\s+)?(?:also|need to|have to|should|must)\s+(.+)$/i,
71
+ make: (m) => {
72
+ let rest = m[1];
73
+ while (MODAL.test(rest))
74
+ rest = rest.replace(MODAL, '');
75
+ return rest ? { lesson: rest, kind: 'lesson' } : null;
76
+ },
77
+ },
78
+ { re: /^(?:don'?t forget to|do not forget to|remember to|make sure to)\s+(.+)$/i, make: (m) => ({ lesson: m[1], kind: 'lesson' }) },
79
+ { re: /^(?:don'?t|do not|never)\s+(.+)$/i, make: (m) => ({ lesson: `never ${m[1]}`, kind: 'guardrail' }) },
80
+ {
81
+ re: /\bask (?:me )?first\b/i,
82
+ make: (m) => {
83
+ const rest = m.input.replace(/\bask (?:me )?first\b/i, ' ').replace(/^\s*(?:(?:always|please)\s+)*/i, '').replace(/\s+/g, ' ').trim()
84
+ .replace(/^before\s+/i, '').replace(/[\s,.;:!]+$/, '');
85
+ return rest ? { lesson: `ask first before ${rest}`, kind: 'guardrail' } : null;
86
+ },
87
+ },
88
+ ];
89
+ /** The person's clause: leading interjections gone, cut at `.`, `;`, `!`, `?`, a comma before a new subject, or 80 chars. Null for a question. */
90
+ function clauseOf(typed) {
91
+ // The first line with words: a paste after it is not the clause (review). Quoted ('>') lines and fenced blocks are
92
+ // what the person quoted, not their words (askText, b4 review).
93
+ const first = askText(typed.slice(0, 8000)).replace(/[\u2018\u2019]/g, "'").split(BREAK).find((l) => l.trim()) ?? '';
94
+ let t = flatLine(first, 2000).replace(LEAD, '').trim();
95
+ const end = /[.;!?]/.exec(t);
96
+ if (end) {
97
+ if (end[0] === '?')
98
+ return null;
99
+ t = t.slice(0, end.index);
100
+ }
101
+ const sub = NEW_SUBJECT.exec(t);
102
+ if (sub)
103
+ t = t.slice(0, sub.index);
104
+ if (t.length > CLAUSE_MAX) {
105
+ const cut = t.slice(0, CLAUSE_MAX + 1);
106
+ const sp = cut.lastIndexOf(' ');
107
+ t = sp > 0 ? cut.slice(0, sp) : t.slice(0, CLAUSE_MAX);
108
+ }
109
+ t = t.replace(TAG, '').replace(/[\s,:-]+$/, '').trim();
110
+ if (!t || QUESTION.test(t))
111
+ return null;
112
+ return t;
113
+ }
114
+ /** The correction forms of 4.14 step 2, first match. Null when none matches. */
115
+ export function correctionPhrase(typed) {
116
+ if (typeof typed !== 'string')
117
+ return null;
118
+ const said = clauseOf(typed);
119
+ if (!said)
120
+ return null;
121
+ for (const f of FORMS) {
122
+ const m = f.re.exec(said);
123
+ if (!m)
124
+ continue;
125
+ const made = f.make(m);
126
+ if (!made)
127
+ return null;
128
+ const lesson = made.lesson.replace(/\s+/g, ' ').trim();
129
+ // The person's clause and the lesson made from it are both held to lessonRefused ("no need to ask first").
130
+ return lesson && !lessonRefused(said) && !lessonRefused(lesson) ? { said, lesson, kind: made.kind } : null;
131
+ }
132
+ return null;
133
+ }
134
+ /* ------------------------------------------------------------- the text */
135
+ const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
136
+ /** A value of 2+ chars back to `{name}`, longest first, never inside a longer number or word. */
137
+ function putParamsBack(cmd, params) {
138
+ let out = cmd;
139
+ const pairs = Object.entries(params).filter(([, v]) => typeof v === 'string' && v.length >= 2).sort((a, b) => b[1].length - a[1].length);
140
+ // At a word's start, or right after a lone `v` ("v1.4.3").
141
+ const start = '(?:(?<![0-9A-Za-z_.])|(?<=(?:^|[^0-9A-Za-z_.])v))';
142
+ for (const [name, v] of pairs)
143
+ out = out.replace(new RegExp(`${start}${escapeRe(v)}(?![0-9A-Za-z_])`, 'g'), `{${name}}`);
144
+ return out;
145
+ }
146
+ /** `{lesson}: {fix command}` (params put back), or `{lesson}` alone; one line, at most 200, no leading marker. A cut command is never kept. */
147
+ export function lessonText(phrase, fixCmd, params) {
148
+ const lesson = flatLine(phrase.lesson, LESSON_MAX);
149
+ if (fixCmd) {
150
+ const fix = flatLine(putParamsBack(String(fixCmd), params ?? {}), 4000);
151
+ const both = flatLine(`${lesson}: ${fix}`, 4000);
152
+ if (fix && both.length <= LESSON_MAX)
153
+ return both;
154
+ }
155
+ return lesson;
156
+ }
157
+ export function lessonSha(text) {
158
+ return createHash('sha256').update(String(text ?? '')).digest('hex');
159
+ }
160
+ export function newLessonId() {
161
+ return `ls-${randomBytes(3).toString('hex')}`;
162
+ }
163
+ /* ------------------------------------------------------------ the files */
164
+ const GUARDRAIL_START = /^(?:never|don'?t|do not|ask first)\b/i;
165
+ const kindOf = (text, said) => (said === 'guardrail' || GUARDRAIL_START.test(text) ? 'guardrail' : 'lesson');
166
+ /** "never ask first", "don't wait for my yes": a never / don't that has the agent not ask. */
167
+ const NO_ASK = /^(?:never|don'?t|do not)\s+(?:(?!without\b)\w+\s+){0,2}?(?:ask\w*|confirm\w*|prompt\w*|wait\s+for|check\s+with)\b/i;
168
+ /** "skip the confirmation", "stop asking", "run it without asking", "not ask for approval". */
169
+ const SKIP_ASK = /\b(skip\w*|bypass\w*|stop|without|no need to|not|avoid\w*)\s+(?:\w+\s+){0,2}?(?:ask\w*|confirm\w*|prompt\w*|approv\w*|permission|(?:my|a|the|their)\s+yes)\b/gi;
170
+ /**
171
+ * Talk of asking the person: ask me / first / before / for my yes, confirm with, check with me, approval, my yes,
172
+ * wait for me. Not a wall's own words ("the HTTPS push asking for a username"): that is a program asking, not the
173
+ * person being asked.
174
+ */
175
+ const ASK_TALK = new RegExp([
176
+ String.raw `\bask(?:s|ed|ing)?\b(?=\s*(?:$|[,.;:!?]|(?:me|us|them|the person|first|before|again)\b|for\s+(?:my|a|an|the|their|your|any)\s+(?:yes|ok|okay|go-ahead|approval|permission|confirmation|sign-off)\b))`,
177
+ String.raw `\bconfirm(?:s|ed|ing)?\b(?=\s*(?:$|[,.;:!?]|(?:with|first|before)\b))`,
178
+ String.raw `\bcheck(?:s|ed|ing)?\s+with\s+(?:me|us|them|the person)\b`,
179
+ String.raw `\b(?:approval|permission|confirmation|sign-off|go-ahead)\b`,
180
+ String.raw `\b(?:my|a|the|their|your)\s+(?:yes|ok|okay)\b`,
181
+ String.raw `\bwait(?:s|ed|ing)?\s+for\s+(?:me|my|a|the|their|your)\b`,
182
+ ].join('|'), 'i');
183
+ /** What a lesson may say before its ask: "you should", "please", "so". */
184
+ const ASK_LEAD = /^(?:(?:please|so|just|you|we)\s+)*(?:(?:should|must|need to|needs to|have to|has to|also)\s+)*/i;
185
+ const WHO = String.raw `(?:me|us|them|the person)`;
186
+ /** The forms that add asking (D111): "ask first before X", "always ask before X", "never X without asking". */
187
+ const ADDS_ASK = [
188
+ new RegExp(String.raw `^(?:always\s+)?ask\s+(?:${WHO}\s+)?(?:first\s+)?before\s+(.+)$`, 'i'),
189
+ new RegExp(String.raw `^always\s+(?:ask|check\s+with\s+${WHO}|confirm\s+with\s+${WHO})(?:\s+${WHO})?(?:\s+first)?$`, 'i'),
190
+ new RegExp(String.raw `^(?:never|don'?t|do not)\s+(.+?)\s+(?:without|before|until)\s+(?:asking(?:\s+${WHO})?|you\s+ask(?:\s+${WHO})?|i\s+(?:say\s+yes|confirm|approve)|(?:my|a|an)\s+(?:yes|ok|okay|approval|go-ahead)|confirming(?:\s+with\s+${WHO})?|confirmation|approval|permission|checking\s+with\s+${WHO})(?:\s+first)?$`, 'i'),
191
+ ];
192
+ /** A negation inside what the ask is for ("ask first before you don't need to") turns the ask around. */
193
+ const ASK_NEG = /\b(?:not|no|never|needn'?t|without)\b|n'?t\b/i;
194
+ /** D111: the text talks about asking the person, and is not one of the forms that add asking. */
195
+ function asksWithoutAdding(t) {
196
+ if (!ASK_TALK.test(t))
197
+ return false;
198
+ const core = t.replace(ASK_LEAD, '').replace(/[\s.!]+$/, '');
199
+ return !ADDS_ASK.some((re) => {
200
+ const m = re.exec(core);
201
+ // What the ask is for, up to the fix command (`{lesson}: {fix}`), whose flags (`--no-sign`) are no negation.
202
+ return m !== null && !(m[1] !== undefined && ASK_NEG.test(m[1].split(': ')[0]));
203
+ });
204
+ }
205
+ /**
206
+ * Why a lesson's text can't reach the agent, or null (D88, D101, 4.14 step 3): it tells the agent not to ask or
207
+ * confirm (Trail never says that; Claude Code asks before a step that can't be undone), it talks about asking
208
+ * without adding asking (D111: "you don't need to ask first" must never come back as an ask turned around), a
209
+ * command the risk rules never keep, or, unless it is a guardrail that forbids it ("never npm publish from a
210
+ * laptop"), a gated command the block would show with no ask. The same rule for a new lesson's phrase and for a
211
+ * lesson file read back.
212
+ */
213
+ export function lessonRefused(text) {
214
+ const t = flatLine(text, 4000);
215
+ const guard = GUARDRAIL_START.test(t);
216
+ if (NO_ASK.test(t))
217
+ return 'skips the ask';
218
+ // "never publish without asking" asks: a never / don't before `without` is the person's own double negative.
219
+ for (const m of t.matchAll(SKIP_ASK))
220
+ if (!(guard && /^without$/i.test(m[1])))
221
+ return 'skips the ask';
222
+ if (asksWithoutAdding(t))
223
+ return 'talks about asking without adding it';
224
+ const never = neverSave(t);
225
+ if (never)
226
+ return never;
227
+ if (!guard && gatedKind(t))
228
+ return 'runs a step that cannot be undone';
229
+ return null;
230
+ }
231
+ const isWall = (v) => WALL_CLASSES.includes(v);
232
+ const one = (v) => (typeof v === 'string' ? v : v instanceof Date ? v.toISOString().slice(0, 10) : '');
233
+ /** The first free `<date>[-n].md` style name in `dir` (lstat: a link counts as taken). */
234
+ function freeName(dir, stem, numbered) {
235
+ for (let n = 1; n < 1000; n++) {
236
+ const name = numbered ? `${stem}-${n}.md` : n === 1 ? `${stem}.md` : `${stem}-${n}.md`;
237
+ let taken = true;
238
+ try {
239
+ lstatSync(join(dir, name));
240
+ }
241
+ catch {
242
+ taken = false;
243
+ }
244
+ if (!taken)
245
+ return name;
246
+ }
247
+ throw new Error('trail: too many lessons on one day');
248
+ }
249
+ /** Throws when `dir` or a folder between the Trail home and it is a link: a planted link would carry the lesson out (b4 review). */
250
+ function noLinkTo(dir, env) {
251
+ const home = trailPath(env);
252
+ const rel = relative(home, dir);
253
+ if (!rel || rel.startsWith('..'))
254
+ return ownFolder(dir);
255
+ let at = home;
256
+ for (const part of rel.split(sep))
257
+ ownFolder((at = join(at, part)));
258
+ }
259
+ function wallLearning(l, text, repoKey, env) {
260
+ const wall = l.wall;
261
+ const input = { title: flatLine(text, 80), body: text, author: '', date: l.at, kind: 'lesson', src: l.src, wall };
262
+ if (!REPO_WALLS.has(wall)) {
263
+ // D114 (1): the every-repo folder follows the every-repo writer's rule (a link into a Trail checkout is refused there).
264
+ const dir = everyRepoDir(env);
265
+ const name = existsSync(dir) ? freeName(dir, `lesson-${wall}-${l.at}`, false) : `lesson-${wall}-${l.at}.md`;
266
+ return writeEveryRepo(input, name, env);
267
+ }
268
+ const dir = repoNotesDir(repoKey, env);
269
+ noLinkTo(dir, env);
270
+ privateDir(dir);
271
+ const name = freeName(dir, `${l.at}-lesson-${wall}`, false);
272
+ const note = {
273
+ title: input.title, author: '', date: l.at, touches: [], body: text,
274
+ ...readLearningFields({ ...input, id: newLearningId(name), scope: 'personal', applies: repoKey, status: 'active' }, name),
275
+ };
276
+ writePrivate(join(dir, name), renderNote(note));
277
+ return join(dir, name);
278
+ }
279
+ /**
280
+ * skills/<name>/lessons/<date>-<n>.md for a skill (never written through a link); for a wall-only lesson a learning
281
+ * of kind lesson (every-repo for a machine wall, the repo's personal folder for git-https-auth, R49). Returns the path.
282
+ */
283
+ export function writeLesson(l, repoKey, env) {
284
+ const text = flatLine(l.text, LESSON_MAX);
285
+ if (!text)
286
+ throw new Error('trail: a lesson needs its text');
287
+ if (!DATE.test(String(l.at)))
288
+ throw new Error('trail: a lesson needs its date');
289
+ if (l.skill === null || l.skill === undefined) {
290
+ if (!isWall(l.wall))
291
+ throw new Error('trail: a lesson needs a skill or a wall');
292
+ return wallLearning({ ...l, src: l.src === 'correction' ? 'correction' : 'repair' }, text, repoKey, env);
293
+ }
294
+ if (!safeName(l.skill))
295
+ throw new Error(`trail: not a skill name: ${flatLine(l.skill, 60)}`);
296
+ ownFolder(skillsDir(env));
297
+ const dir = join(skillsDir(env), l.skill);
298
+ let st;
299
+ try {
300
+ st = lstatSync(dir);
301
+ }
302
+ catch {
303
+ throw new Error(`trail: no skill called ${l.skill}`);
304
+ }
305
+ if (st.isSymbolicLink())
306
+ throw new Error(`trail: ${dir} is a link; Trail won't write a lesson through it.`);
307
+ if (!st.isDirectory())
308
+ throw new Error(`trail: no skill called ${l.skill}`);
309
+ const lessons = join(dir, 'lessons');
310
+ ownFolder(lessons);
311
+ privateDir(lessons);
312
+ const name = freeName(lessons, l.at, true);
313
+ const id = LESSON_ID.test(l.id) ? l.id : newLessonId();
314
+ const front = ['---', `id: ${JSON.stringify(id)}`, `kind: ${JSON.stringify(kindOf(text, l.kind))}`, `skill: ${JSON.stringify(l.skill)}`,
315
+ `src: ${JSON.stringify(l.src === 'repair' ? 'repair' : 'correction')}`, `at: ${JSON.stringify(l.at)}`];
316
+ if (isWall(l.wall))
317
+ front.push(`wall: ${JSON.stringify(l.wall)}`);
318
+ writePrivate(join(lessons, name), `${[...front, '---', text].join('\n')}\n`);
319
+ return join(lessons, name);
320
+ }
321
+ /** One lesson file, or null: a regular file (not a link) of at most 4 KB, with front matter, a date and text. The kind is the text's (spec 13). */
322
+ function readLessonFile(path, skill) {
323
+ try {
324
+ const st = lstatSync(path);
325
+ if (!st.isFile() || st.size > MAX_FILE)
326
+ return null;
327
+ const fm = matter(readFileSync(path, 'utf8'), { scalars: ['id', 'kind', 'skill', 'src', 'at', 'wall'] });
328
+ if (fm.refused)
329
+ return null;
330
+ const d = fm.data;
331
+ const text = flatLine(String(fm.content ?? ''), LESSON_MAX);
332
+ const at = DATE.test(one(d.at)) ? one(d.at) : /^(\d{4}-\d{2}-\d{2})-\d+\.md$/.exec(basename(path))?.[1] ?? '';
333
+ if (!text || !at)
334
+ return null;
335
+ const id = LESSON_ID.test(one(d.id)) ? one(d.id) : `ls-${createHash('sha256').update(basename(path)).digest('hex').slice(0, 6)}`;
336
+ return { id, skill, at, text, kind: kindOf(text), src: d.src === 'repair' ? 'repair' : 'correction', wall: isWall(d.wall) ? d.wall : null };
337
+ }
338
+ catch {
339
+ return null;
340
+ }
341
+ }
342
+ /** `2026-11-03-10.md` after `2026-11-03-2.md`: by name with its numbers as numbers. */
343
+ const byName = (a, b) => a.localeCompare(b, 'en', { numeric: true });
344
+ /** The lessons in `<skillDir>/lessons/` (never through a link), oldest first; the newest 50 files read. */
345
+ export function readLessons(skillDir) {
346
+ let names;
347
+ try {
348
+ if (!lstatSync(join(skillDir, 'lessons')).isDirectory())
349
+ return [];
350
+ names = readdirSync(join(skillDir, 'lessons')).filter((n) => n.endsWith('.md') && !n.startsWith('.')).sort(byName).slice(-MAX_FILES);
351
+ }
352
+ catch {
353
+ return [];
354
+ }
355
+ const skill = basename(skillDir);
356
+ return names.map((n) => readLessonFile(join(skillDir, 'lessons', n), skill)).filter((l) => l !== null)
357
+ .sort((a, b) => a.at.localeCompare(b.at));
358
+ }
359
+ /**
360
+ * The live lessons kept for a wall class here: every-repo ones, then this repo's (oldest first). For lastTimeText
361
+ * (4.10). D117 (4): read through the mtime-keyed lesson index; `write` (Stop, session start) keeps what changed.
362
+ */
363
+ export function wallLessons(cls, repoKey, env, opts = {}) {
364
+ const dirs = [everyRepoDir(env)];
365
+ try {
366
+ dirs.push(repoNotesDir(repoKey, env));
367
+ }
368
+ catch { /* no repo key */ }
369
+ const [everyNotes = [], mineNotes = []] = lessonNotesIn(dirs, env, opts);
370
+ const mine = mineNotes.filter((n) => !n.applies || n.applies.toLowerCase() === repoKey.toLowerCase());
371
+ const every = everyNotes.filter((n) => !n.applies || n.applies === EVERY_REPO);
372
+ return liveLessons([...every, ...mine]).filter((n) => n.wall === cls).flatMap((n) => {
373
+ const text = flatLine(n.body, LESSON_MAX);
374
+ // A hand edit is held to the run block's rule (lessonRefused): the agent reads this text too.
375
+ return text && !lessonRefused(text) ? [{ id: n.id, skill: null, at: n.date, text, kind: kindOf(text), src: n.src === 'correction' ? 'correction' : 'repair', wall: cls }] : [];
376
+ }).sort((a, b) => a.at.localeCompare(b.at));
377
+ }
378
+ /* ------------------------------------------------------------ the lines */
379
+ /** 'Nov 3' for a local date. */
380
+ function dayOf(d) {
381
+ const m = DATE.exec(d) ? d.split('-').map(Number) : null;
382
+ return m ? `${MONTHS[m[1] - 1] ?? 'Jan'} ${m[2]}` : 'an earlier day';
383
+ }
384
+ /** A guardrail-kind lesson (never trimmed from a block): so marked, or its text starts with never / don't / ask first. */
385
+ export const isGuardrailLesson = (l) => kindOf(flatLine(l.text, LESSON_MAX), l.kind) === 'guardrail';
386
+ /** Guardrail-kind lessons first (never trimmed), then up to 3 newest lessons, oldest of them first (4.16, J07). */
387
+ /** One lesson's line (`Lesson (the person, Nov 3): ...`). */
388
+ export const lessonLine = (l) => fill(LESSON_COPY.line, { date: dayOf(l.at), text: flatLine(l.text, LESSON_MAX) });
389
+ export function lessonLines(lessons) {
390
+ const line = lessonLine;
391
+ const byDate = [...lessons].sort((a, b) => a.at.localeCompare(b.at));
392
+ const guard = byDate.filter(isGuardrailLesson);
393
+ const rest = byDate.filter((l) => !guard.includes(l)).slice(-NEWEST);
394
+ return [...guard, ...rest].map(line).filter((l) => !/: $/.test(l));
395
+ }
396
+ //# sourceMappingURL=lessons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/skills/lessons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACvH,OAAO,EAAa,UAAU,EAAa,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAiB3C,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC;AAC1B,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACpG,6FAA6F;AAC7F,MAAM,UAAU,GAAG,IAAI,GAAG,CAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAE1D,sHAAsH;AACtH,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,IAAI,EAAE,qCAAqC;IAC3C,UAAU,EAAE,gCAAgC;IAC5C,WAAW,EAAE,0DAA0D;IACvE,KAAK,EAAE,8GAA8G;IACrH,SAAS,EAAE,0GAA0G;CACtH,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAyB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5G,4EAA4E;AAE5E;;;;GAIG;AACH,MAAM,IAAI,GAAG,gMAAgM,CAAC;AAC9M,0FAA0F;AAC1F,MAAM,GAAG,GAAG,kHAAkH,CAAC;AAC/H,iHAAiH;AACjH,MAAM,KAAK,GAAG,2CAA2C,CAAC;AAC1D,4FAA4F;AAC5F,MAAM,WAAW,GAAG,qFAAqF,CAAC;AAC1G,MAAM,QAAQ,GAAG,yIAAyI,CAAC;AAC3J,MAAM,KAAK,GAAG,iEAAiE,CAAC;AAChF,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,KAAK,GAAiH;IAC1H,EAAE,EAAE,EAAE,4DAA4D,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC9H;QACE,EAAE,EAAE,2DAA2D;QAC/D,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;YACV,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,CAAC;KACF;IACD,EAAE,EAAE,EAAE,0EAA0E,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;IACpI,EAAE,EAAE,EAAE,mCAAmC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE;IAC1G;QACE,EAAE,EAAE,wBAAwB;QAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;iBAClI,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,CAAC;KACF;CACF,CAAC;AAEF,kJAAkJ;AAClJ,SAAS,QAAQ,CAAC,KAAa;IAC7B,mHAAmH;IACnH,gEAAgE;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACrH,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,GAAG;QAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IACD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,2GAA2G;QAC3G,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAE5E,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAEzE,iGAAiG;AACjG,SAAS,aAAa,CAAC,GAAW,EAAE,MAA8B;IAChE,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzI,2DAA2D;IAC3D,MAAM,KAAK,GAAG,mDAAmD,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;IACzH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+IAA+I;AAC/I,MAAM,UAAU,UAAU,CAAC,MAA0B,EAAE,MAAqB,EAAE,MAA8B;IAC1G,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,4EAA4E;AAE5E,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAChE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,IAAc,EAAkB,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE/I,8FAA8F;AAC9F,MAAM,MAAM,GAAG,oHAAoH,CAAC;AACpI,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,gKAAgK,CAAC;AAElL;;;;GAIG;AACH,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAA,sMAAsM;IAChN,MAAM,CAAC,GAAG,CAAA,uEAAuE;IACjF,MAAM,CAAC,GAAG,CAAA,2DAA2D;IACrE,MAAM,CAAC,GAAG,CAAA,4DAA4D;IACtE,MAAM,CAAC,GAAG,CAAA,+CAA+C;IACzD,MAAM,CAAC,GAAG,CAAA,0DAA0D;CACrE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAClB,0EAA0E;AAC1E,MAAM,QAAQ,GAAG,iGAAiG,CAAC;AACnH,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA,2BAA2B,CAAC;AAClD,+GAA+G;AAC/G,MAAM,QAAQ,GAAG;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,2BAA2B,GAAG,kCAAkC,EAAE,GAAG,CAAC;IAC3F,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,mCAAmC,GAAG,qBAAqB,GAAG,UAAU,GAAG,kBAAkB,EAAE,GAAG,CAAC;IACxH,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,gFAAgF,GAAG,qBAAqB,GAAG,+GAA+G,GAAG,yDAAyD,GAAG,iBAAiB,EAAE,GAAG,CAAC;CACtU,CAAC;AACF,yGAAyG;AACzG,MAAM,OAAO,GAAG,+CAA+C,CAAC;AAEhE,iGAAiG;AACjG,SAAS,iBAAiB,CAAC,CAAS;IAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,6GAA6G;QAC7G,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,eAAe,CAAC;IAC3C,6GAA6G;IAC7G,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,IAAI,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;IACvG,IAAI,iBAAiB,CAAC,CAAC,CAAC;QAAE,OAAO,sCAAsC,CAAC;IACxE,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,MAAM,GAAG,CAAC,CAAU,EAAkB,EAAE,CAAE,YAAmC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAChG,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEhH,0FAA0F;AAC1F,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAY,EAAE,QAAiB;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACvF,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,KAAK,GAAG,KAAK,CAAC;QAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACxD,CAAC;AAED,oIAAoI;AACpI,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAuB;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,IAAY,EAAE,OAAe,EAAE,GAAuB;IACrF,MAAM,IAAI,GAAG,CAAC,CAAC,IAAK,CAAC;IACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC3H,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,wHAAwH;QACxH,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;QAC5G,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnB,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAuB;QAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI;QACnE,GAAG,kBAAkB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC;KAC1H,CAAC;IACF,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,OAAe,EAAE,GAAuB;IAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChF,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChF,OAAO,YAAY,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7F,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;IAC5F,IAAI,EAAE,CAAC,cAAc,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,oDAAoD,CAAC,CAAC;IAC5G,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;QACrI,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,mJAAmJ;AACnJ,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpD,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACzG,IAAI,EAAE,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,IAA+B,CAAC;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9G,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9I,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAErF,2GAA2G;AAC3G,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,CAAC;QACnE,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IACvI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SAChH,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAc,EAAE,OAAe,EAAE,GAAuB,EAAE,OAA4B,EAAE;IAClH,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,MAAM,CAAC,UAAU,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACtG,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;IAC/E,OAAO,WAAW,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1C,8FAA8F;QAC9F,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,YAAqB,CAAC,CAAC,CAAC,QAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,4EAA4E;AAE5E,gCAAgC;AAChC,SAAS,KAAK,CAAC,CAAS;IACtB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACxE,CAAC;AAED,0HAA0H;AAC1H,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC;AAE7G,mHAAmH;AACnH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;AAE5H,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Reason a command can never be in a skill (4.11), or null. */
2
+ export declare function neverSave(cmd: string): string | null;
3
+ /** 4.10 backstop: a password written out after a flag that takes one. The fold names most secrets; these it can't tell from a word. */
4
+ export declare function literalPassword(cmd: string): boolean;
5
+ //# sourceMappingURL=never-save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"never-save.d.ts","sourceRoot":"","sources":["../../src/skills/never-save.ts"],"names":[],"mappings":"AA2HA,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWpD;AAaD,uIAAuI;AACvI,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGpD"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Never save (design 4.11, spec 10): a command a skill may never hold, so a
3
+ * run with one gives no skill at all (sudo, a download piped into a shell,
4
+ * `rm -rf` on a variable or a home path, a force push to a shared branch, a
5
+ * credential file, destructive SQL off this machine, anything that messages
6
+ * people, Trail itself), and the 4.10 password backstop. Split from risk.ts,
7
+ * whose gated list and agent guard the PreToolUse fast path loads; this file
8
+ * is for the save side only.
9
+ */
10
+ import { isTrailCommand } from '../trace/shell.js';
11
+ import { argsAfter, pushes, unknownDst, word, written } from './risk.js';
12
+ const LOCAL_HOSTS = /^(?:localhost|127\.0\.0\.1|::1|\[::1\])$/i;
13
+ const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
14
+ /** Hosts a database command names: `-h x`, `--host=x`, `host=x`, `scheme://user@x:port`. */
15
+ function namedHosts(cmd) {
16
+ const hosts = [];
17
+ for (const m of cmd.matchAll(/(?:^|\s)(?:-h|--host)(?:=|\s+)['"]?([^\s'"/;]+)/g))
18
+ hosts.push(m[1]);
19
+ for (const m of cmd.matchAll(/\bhost=['"]?([^\s'";]+)/gi))
20
+ hosts.push(m[1]);
21
+ for (const m of cmd.matchAll(/\b[a-z][a-z0-9+.-]*:\/\/(?:[^\s/@'"]*@)?(\[[^\]]+\]|[^\s/:'"?]+)/gi))
22
+ hosts.push(m[1]);
23
+ return hosts;
24
+ }
25
+ /** A target `rm -r` or `find -delete` must never get: a variable, a {param}, home, an absolute path, the whole folder. */
26
+ const wildTarget = (t) => t !== '{}' && (/^[$~/]|^\.\.(?:\/|$)/.test(t) || /\$|`|\{[A-Za-z_]\w*\}/.test(t) || /^(?:\.\/?|(?:\.\/)?\*)$/.test(t));
27
+ function rmWild(text) {
28
+ const rms = [...text.matchAll(word('rm'))];
29
+ for (const [i, m] of rms.entries()) {
30
+ let recursive = false;
31
+ let opts = true;
32
+ const targets = [];
33
+ for (const w of argsAfter(text, m.index + m[0].length, rms[i + 1]?.index)) {
34
+ if (opts && w === '--')
35
+ opts = false;
36
+ else if (opts && /^-[a-zA-Z]+$/.test(w))
37
+ recursive ||= /[rR]/.test(w);
38
+ else if (opts && /^--[\w-]+$/.test(w))
39
+ recursive ||= w === '--recursive';
40
+ else
41
+ targets.push(w);
42
+ }
43
+ if (!recursive)
44
+ continue;
45
+ // `xargs rm -rf`: the targets come from elsewhere.
46
+ if (!targets.length ? /\bxargs\b[^;&|\n]*$/.test(text.slice(0, m.index)) : targets.some(wildTarget))
47
+ return true;
48
+ }
49
+ const finds = [...text.matchAll(word('find'))];
50
+ for (const [i, m] of finds.entries()) {
51
+ const w = argsAfter(text, m.index + m[0].length, finds[i + 1]?.index);
52
+ const roots = w.slice(0, Math.max(0, w.findIndex((x) => /^[-(!]/.test(x))));
53
+ const deletes = w.includes('-delete') || w.some((x, i) => /^-(?:exec|execdir|ok|okdir)$/.test(x) && /(?:^|\/)rm$/.test(w[i + 1] ?? ''));
54
+ // `find . -name x -exec rm {} +` is fine; a root the skill can't know is not.
55
+ if (deletes && roots.some((t) => /^[$~/{]/.test(t) || /\$|`/.test(t)))
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ const SHARED = new Set(['main', 'master', 'prod', 'production', 'beta', 'dev', 'develop', 'staging', 'trunk']);
61
+ const forcePushShared = (c) => pushes(c).some((p) => p.force && p.dsts.some((d) => SHARED.has(d.toLowerCase()) || unknownDst(d)));
62
+ const SUDO = /(?:^|[^\w./-])(?:[\w./-]*\/)?(?:sudo|doas|pkexec)(?![\w-])/i;
63
+ const SHELL_WORD = String.raw `(?:sudo\s+(?:-\S+\s+)*)?(?:env\s+(?:\S+=\S*\s+)*)?(?:[\w./-]*\/)?`;
64
+ const DOWNLOAD = [
65
+ new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:ba|z|da|k|fi)?sh\b`, 'i'),
66
+ new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:python[\d.]*|node|perl|ruby|php)(?:\s+-)?\s*(?=$|[;&|)\n])`, 'i'),
67
+ /(?:\b(?:ba|z|da|k)?sh|\bsource|(?:^|[\s;&|(])\.)\s+<\(\s*(?:curl|wget)\b/i,
68
+ /\b(?:(?:ba|z|da|k)?sh\s+-\w*c|eval)\s+["']?(?:\$\(|`)\s*(?:curl|wget)\b/i,
69
+ ];
70
+ /** `curl -o x.sh URL && sh x.sh`, `wget URL -O s.sh; chmod +x s.sh; ./s.sh`: a download saved to a file, then run. */
71
+ function downloadThenRun(text) {
72
+ for (const m of text.matchAll(/\b(curl|wget)\b([^;&|\n]*)/gi)) {
73
+ const [, tool, args] = m;
74
+ const files = new Set();
75
+ const named = /(?:\s-[a-zA-Z]*o\s*|\s--output[= ]\s*|\s-O\s*(?=[^\s-])|\s--output-document[= ]\s*)['"]?([^\s'";&|]+)/.exec(args)?.[1];
76
+ if (named && named !== '-' && named !== '/dev/null')
77
+ files.add(named);
78
+ // `wget URL` and `curl -O URL` save under the link's own name.
79
+ const remote = /^wget$/i.test(tool) ? !/\s-[a-zA-Z]*O\b|--output-document/.test(args) : /\s-[a-zA-Z]*O\b|--remote-name\b/.test(args);
80
+ if (remote)
81
+ for (const u of args.matchAll(/https?:\/\/\S*\/([^\s/'"?#]+)/g))
82
+ files.add(u[1]);
83
+ const after = text.slice(m.index + m[0].length);
84
+ for (const f of files) {
85
+ const e = escapeRe(f.replace(/^\.\//, '').split('/').pop());
86
+ // Run as a program, or handed to a shell, `source`, `.` or `chmod +x`: at the start of a command.
87
+ const run = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+)?['"]?(?:\.?\.?\/[^\s'"]*\/|\.\/)?${e}['"]?(?=\s|$|[;&|)])`);
88
+ const plainName = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+['"]?${e}['"]?(?=\s|$|[;&|)])`);
89
+ if (plainName.test(after) || (run.test(after) && new RegExp(String.raw `(?:^|[\s;&|(])\.{0,2}\/(?:[^\s'"]*\/)?${e}(?=\s|$|[;&|)'"])`).test(after)))
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ const CREDENTIAL = /(?:\.npmrc|\.netrc|\.aws\/(?:credentials|sso\/cache|cli\/cache)|(?<![\w.])\.ssh\/|\.git-credentials|\.docker\/config\.json|gh\/hosts\.yml|com\.vercel\.cli\/auth\.json|\.config\/gcloud|Library\/Keychains|\.kube\/config|\.pypirc|\.gem\/credentials|\.cargo\/credentials|\.pgpass|\.my\.cnf|credentials\.tfrc\.json|\.terraformrc|\.config\/hub\b|\.azure\/|\.password-store|\.vault-token)/i;
96
+ /**
97
+ * Commands that store a credential they were handed where every later command picks it up. Logging in at
98
+ * the browser (`npm login`, `gh auth login`) needs the person there, holds no secret in the step, and is how
99
+ * a release gets past an expired token: not on this list, but gated (D93, `login`), so it is never run unasked.
100
+ */
101
+ const CREDENTIAL_WRITE = /\bnpm\s+config\s+set\s+\S*_(?:auth|password)|\b(?:docker|podman|helm\s+registry)\s+login\b[^;&|\n]*\s(?:-p|--password(?:-stdin)?)\b|\baws\s+configure\s+set\b|\bgit\s+credential\s+(?:approve|store)\b|\bgit\s+config\b[^;&|\n]*\bcredential\.helper\b|\bsecurity\s+add-(?:generic|internet)-password\b/i;
102
+ /** Commands that print a stored credential. */
103
+ const CREDENTIAL_READ = /\bgh\s+auth\s+token\b|\bgit\s+credential\s+fill\b|\bsecurity\s+(?:find|delete)-(?:generic|internet)-password\b|\bsecurity\s+dump-keychain\b|\bop\s+(?:read|item\s+get)\b|\bgcloud\s+auth\s+print-(?:access|identity)-token\b|\bheroku\s+auth:token\b|\bpass\s+show\b|\bvault\s+(?:read|kv\s+get)\b/i;
104
+ const DESTRUCTIVE_SQL = /\b(?:drop\s+(?:table|database|schema|view|materialized\s+view|index|owned|role|user|function|type|sequence|extension)|truncate(?!\s+-)|delete\s+from|alter\s+table\b[^;]*?\bdrop)\b|\bdropdb\b|\bflush(?:all|db)\b|\bdropDatabase\s*\(|\.drop(?:Collection)?\s*\(\s*\)|\bdeleteMany\s*\(\s*\{\s*\}\s*\)|\bsupabase\s+db\s+reset\b[^;&|\n]*--(?:linked|db-url)|\bprisma\s+(?:migrate\s+reset|db\s+push\b[^;&|\n]*--(?:force-reset|accept-data-loss))|\brails\s+db:(?:drop|reset)\b/i;
105
+ const MESSAGES = /\b(?:sendmail|mail\s+-s|mailx|mutt|msmtp|swaks|twilio)\b|\bgit\s+send-email\b|hooks\.slack\.com|\bslack\s+chat\b|graph\.facebook\.com|discord(?:app)?\.com\/api\/webhooks|api\.telegram\.org\/bot|api\.(?:sendgrid\.com|mailgun\.net|postmarkapp\.com|resend\.com)|\bgh\s+(?:issue\s+(?:create|comment)|pr\s+(?:comment|review))\b/i;
106
+ /** `gh api` that writes: a POST/PATCH/PUT, or fields (`-f`, `-F`, `--input`) without `-X GET`. */
107
+ function ghApiWrite(c) {
108
+ if (!/\bgh\s+api\b/i.test(c))
109
+ return false;
110
+ if (/\bgh\s+api\s+graphql\b/i.test(c))
111
+ return /\bmutation\b[\s\S]*?\b(?:add|create|submit|update)\w*(?:Comment|Review|Issue|Discussion)\w*\b/i.test(c);
112
+ const method = /(?:-X|--method)[\s=]+([A-Z]+)/i.exec(c)?.[1]?.toUpperCase();
113
+ const writes = method ? method !== 'GET' : /(?:^|\s)(?:-f|-F|--field|--raw-field|--input)(?=[\s=])/.test(c);
114
+ return writes && /\/(?:comments|reviews|issues|messages|replies)\b/i.test(c);
115
+ }
116
+ /** Trail run by a wrapper `isTrailCommand` doesn't open: `eval "trail …"`, `xargs trail`, `find -exec trail`. */
117
+ const TRAIL_VIA = /(?:\beval|\bxargs(?:\s+-\S+(?:\s+[^\s-]\S*)?)*|(?<!\S)-(?:exec|execdir|ok|okdir))\s+["']?(?:trail|graft|trail-code)\b/i;
118
+ const NEVER = [
119
+ ['runs sudo', (c) => SUDO.test(c)],
120
+ ['pipes a download into a shell', (c) => DOWNLOAD.some((re) => re.test(c)) || downloadThenRun(c)],
121
+ ['runs rm -rf on a variable or a home path', rmWild],
122
+ ['force-pushes a shared branch', forcePushShared],
123
+ ['touches a credential file', (c) => CREDENTIAL.test(c) || CREDENTIAL_WRITE.test(c) || CREDENTIAL_READ.test(c)],
124
+ ['runs destructive SQL off this machine', (c) => DESTRUCTIVE_SQL.test(c)
125
+ && (namedHosts(c).some((h) => !LOCAL_HOSTS.test(h)) || !/(?:^|[;&|(]\s*)docker\s+exec\b/i.test(c))],
126
+ ['messages people or submits to an outside service', (c) => MESSAGES.test(c) || ghApiWrite(c)],
127
+ ['runs Trail itself', (c) => isTrailCommand(c) || TRAIL_VIA.test(c)],
128
+ ];
129
+ /** Reason a command can never be in a skill (4.11), or null. */
130
+ export function neverSave(cmd) {
131
+ const c = String(cmd ?? '');
132
+ for (const [why, hit] of NEVER) {
133
+ if (!hit(c))
134
+ continue;
135
+ if (why === 'touches a credential file') {
136
+ const writes = CREDENTIAL_WRITE.test(c) || />>?\s*\S*(?:\.npmrc|\.netrc|credentials|\.ssh\/|config\.json|hosts\.yml|auth\.json|\.kube\/config|\.pypirc|\.pgpass)|\b(?:cp|mv|tee|ln)\b|security\s+add-/i.test(c);
137
+ return writes ? 'writes a credential file' : 'reads a credential file';
138
+ }
139
+ return why;
140
+ }
141
+ return null;
142
+ }
143
+ const PASSWORD_AT = [
144
+ /\b(?:mysql|mysqldump|mysqladmin|mariadb|mariadb-dump)\b[^;&|\n]*?\s-p(?=\S)(\S+)/i,
145
+ /\b(?:mysql|mysqldump|mysqladmin|mariadb)\b[^;&|\n]*?\s--password=(\S+)/i,
146
+ /\b(?:docker|podman|nerdctl|buildah|skopeo|oras)\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
147
+ /\bhelm\s+registry\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
148
+ /\bsshpass\s+-p\s*(\S+)/i,
149
+ /\bredis-cli\b[^;&|\n]*?\s(?:-a|--pass)\s+(\S+)/i,
150
+ /\b(?:echo|printf)\s+(?:-n\s+)?(\S+)\s*\|[^;&\n]*--password-stdin\b/i,
151
+ /\b(?:PGPASSWORD|MYSQL_PWD|REDISCLI_AUTH|SSHPASS)=(\S+)/,
152
+ ];
153
+ /** 4.10 backstop: a password written out after a flag that takes one. The fold names most secrets; these it can't tell from a word. */
154
+ export function literalPassword(cmd) {
155
+ const c = String(cmd ?? '');
156
+ return PASSWORD_AT.some((re) => { const v = re.exec(c)?.[1]; return v !== undefined && written(v); });
157
+ }
158
+ //# sourceMappingURL=never-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"never-save.js","sourceRoot":"","sources":["../../src/skills/never-save.ts"],"names":[],"mappings":"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"}